From 36067532467ec58c87ac9c140e555e1866431981 Mon Sep 17 00:00:00 2001 From: gaogaotiantian Date: Mon, 27 Mar 2023 13:37:22 -0700 Subject: [PATCH 001/349] gh-103023: Add SyntaxError check in pdb's `display` command (#103024) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Łukasz Langa --- Lib/pdb.py | 31 +++++++++++-------- Lib/test/test_pdb.py | 6 ++++ ...-03-25-02-08-05.gh-issue-103023.Qfn7Hl.rst | 2 ++ 3 files changed, 26 insertions(+), 13 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-03-25-02-08-05.gh-issue-103023.Qfn7Hl.rst diff --git a/Lib/pdb.py b/Lib/pdb.py index 3543f53282db15..d402de1192f9e2 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -399,7 +399,7 @@ def preloop(self): displaying = self.displaying.get(self.curframe) if displaying: for expr, oldvalue in displaying.items(): - newvalue = self._getval_except(expr) + newvalue, _ = self._getval_except(expr) # check for identity first; this prevents custom __eq__ to # be called at every loop, and also prevents instances whose # fields are changed to be displayed @@ -1246,13 +1246,12 @@ def _getval(self, arg): def _getval_except(self, arg, frame=None): try: if frame is None: - return eval(arg, self.curframe.f_globals, self.curframe_locals) + return eval(arg, self.curframe.f_globals, self.curframe_locals), None else: - return eval(arg, frame.f_globals, frame.f_locals) - except: - exc_info = sys.exc_info()[:2] - err = traceback.format_exception_only(*exc_info)[-1].strip() - return _rstr('** raised %s **' % err) + return eval(arg, frame.f_globals, frame.f_locals), None + except BaseException as exc: + err = traceback.format_exception_only(exc)[-1].strip() + return _rstr('** raised %s **' % err), exc def _error_exc(self): exc_info = sys.exc_info()[:2] @@ -1437,13 +1436,19 @@ def do_display(self, arg): Without expression, list all display expressions for the current frame. """ if not arg: - self.message('Currently displaying:') - for item in self.displaying.get(self.curframe, {}).items(): - self.message('%s: %r' % item) + if self.displaying: + self.message('Currently displaying:') + for item in self.displaying.get(self.curframe, {}).items(): + self.message('%s: %r' % item) + else: + self.message('No expression is being displayed') else: - val = self._getval_except(arg) - self.displaying.setdefault(self.curframe, {})[arg] = val - self.message('display %s: %r' % (arg, val)) + val, exc = self._getval_except(arg) + if isinstance(exc, SyntaxError): + self.message('Unable to display %s: %r' % (arg, val)) + else: + self.displaying.setdefault(self.curframe, {})[arg] = val + self.message('display %s: %r' % (arg, val)) complete_display = _complete_expression diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index e96dc7fa1cf6e7..ae9c5d73e2daa7 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -586,6 +586,8 @@ def test_pdb_display_command(): ... a = 4 >>> with PdbTestInput([ # doctest: +ELLIPSIS + ... 'display +', + ... 'display', ... 'display a', ... 'n', ... 'display', @@ -600,6 +602,10 @@ def test_pdb_display_command(): ... test_function() > (4)test_function() -> a = 1 + (Pdb) display + + Unable to display +: ** raised SyntaxError: invalid syntax ** + (Pdb) display + No expression is being displayed (Pdb) display a display a: 0 (Pdb) n diff --git a/Misc/NEWS.d/next/Library/2023-03-25-02-08-05.gh-issue-103023.Qfn7Hl.rst b/Misc/NEWS.d/next/Library/2023-03-25-02-08-05.gh-issue-103023.Qfn7Hl.rst new file mode 100644 index 00000000000000..e7958f6f002055 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-03-25-02-08-05.gh-issue-103023.Qfn7Hl.rst @@ -0,0 +1,2 @@ +It's no longer possible to register expressions to display in +:class:`~pdb.Pdb` that raise :exc:`SyntaxError`. Patch by Tian Gao. From 34eb6f727632d9a1a6998f90c9421e420c785643 Mon Sep 17 00:00:00 2001 From: gaogaotiantian Date: Mon, 27 Mar 2023 15:22:06 -0700 Subject: [PATCH 002/349] gh-103046: Display current line correctly for `dis.disco()` with CACHE entries (#103047) --- Lib/dis.py | 7 ++++- Lib/test/test_dis.py | 29 +++++++++++++++++++ ...-03-26-20-54-57.gh-issue-103046.xBlA2l.rst | 1 + 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2023-03-26-20-54-57.gh-issue-103046.xBlA2l.rst diff --git a/Lib/dis.py b/Lib/dis.py index c3d152b4de0469..b39b2835330135 100644 --- a/Lib/dis.py +++ b/Lib/dis.py @@ -581,7 +581,12 @@ def _disassemble_bytes(code, lasti=-1, varname_from_oparg=None, instr.offset > 0) if new_source_line: print(file=file) - is_current_instr = instr.offset == lasti + if show_caches: + is_current_instr = instr.offset == lasti + else: + # Each CACHE takes 2 bytes + is_current_instr = instr.offset <= lasti \ + <= instr.offset + 2 * _inline_cache_entries[_deoptop(instr.opcode)] print(instr._disassemble(lineno_width, is_current_instr, offset_width), file=file) if exception_entries: diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index ed66b362b08080..7cad8d1bfe13ae 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -1198,6 +1198,35 @@ def test_show_caches(self): self.assertEqual(caches.count(""), empty_caches) self.assertEqual(len(caches), total_caches) + @cpython_only + def test_show_currinstr_with_cache(self): + """ + Make sure that with lasti pointing to CACHE, it still shows the current + line correctly + """ + def f(): + print(a) + # The code above should generate a LOAD_GLOBAL which has CACHE instr after + # However, this might change in the future. So we explicitly try to find + # a CACHE entry in the instructions. If we can't do that, fail the test + + for inst in dis.get_instructions(f, show_caches=True): + if inst.opname == "CACHE": + op_offset = inst.offset - 2 + cache_offset = inst.offset + break + else: + self.fail("Can't find a CACHE entry in the function provided to do the test") + + assem_op = self.get_disassembly(f.__code__, lasti=op_offset, wrapper=False) + assem_cache = self.get_disassembly(f.__code__, lasti=cache_offset, wrapper=False) + + # Make sure --> exists and points to the correct offset + self.assertRegex(assem_op, fr"-->\s+{op_offset}") + # Make sure when lasti points to cache, it shows the same disassembly + self.assertEqual(assem_op, assem_cache) + + class DisWithFileTests(DisTests): # Run the tests again, using the file arg instead of print diff --git a/Misc/NEWS.d/next/Library/2023-03-26-20-54-57.gh-issue-103046.xBlA2l.rst b/Misc/NEWS.d/next/Library/2023-03-26-20-54-57.gh-issue-103046.xBlA2l.rst new file mode 100644 index 00000000000000..f9bd0a10056ef1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-03-26-20-54-57.gh-issue-103046.xBlA2l.rst @@ -0,0 +1 @@ +Display current line label correctly in :mod:`dis` when ``show_caches`` is False and ``lasti`` points to a CACHE entry. From 89e67ada6958cfd8d4eec221848f81b2619de099 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Mon, 27 Mar 2023 16:53:05 -0600 Subject: [PATCH 003/349] gh-100227: Revert gh-102925 "gh-100227: Make the Global Interned Dict Safe for Isolated Interpreters" (gh-103063) This reverts commit 87be8d9. This approach to keeping the interned strings safe is turning out to be too complex for my taste (due to obmalloc isolation). For now I'm going with the simpler solution, making the dict per-interpreter. We can revisit that later if we want a sharing solution. --- Include/internal/pycore_global_objects.h | 4 - Include/internal/pycore_pystate.h | 5 - Include/internal/pycore_runtime_init.h | 3 - Include/internal/pycore_unicodeobject.h | 1 - Objects/unicodeobject.c | 13 +- Python/pylifecycle.c | 4 - Python/pystate.c | 204 +++-------------------- 7 files changed, 30 insertions(+), 204 deletions(-) diff --git a/Include/internal/pycore_global_objects.h b/Include/internal/pycore_global_objects.h index 858321d67df481..9957da1fc5f22a 100644 --- a/Include/internal/pycore_global_objects.h +++ b/Include/internal/pycore_global_objects.h @@ -28,10 +28,6 @@ extern "C" { struct _Py_cached_objects { PyObject *interned_strings; - /* A thread state tied to the main interpreter, - used exclusively for when a global object (e.g. interned strings) - is resized (i.e. deallocated + allocated) from an arbitrary thread. */ - PyThreadState main_tstate; }; #define _Py_GLOBAL_OBJECT(NAME) \ diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index f159b516e66b18..7046ec8d9adaaf 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -127,11 +127,6 @@ PyAPI_FUNC(void) _PyThreadState_Init( PyThreadState *tstate); PyAPI_FUNC(void) _PyThreadState_DeleteExcept(PyThreadState *tstate); -extern void _PyThreadState_InitDetached(PyThreadState *, PyInterpreterState *); -extern void _PyThreadState_ClearDetached(PyThreadState *); - -extern PyObject * _Py_AddToGlobalDict(PyObject *, PyObject *, PyObject *); - static inline void _PyThreadState_UpdateTracingState(PyThreadState *tstate) diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h index fd358b2da6ccff..7cfa7c0c02494a 100644 --- a/Include/internal/pycore_runtime_init.h +++ b/Include/internal/pycore_runtime_init.h @@ -59,9 +59,6 @@ extern PyTypeObject _PyExc_MemoryError; .types = { \ .next_version_tag = 1, \ }, \ - .cached_objects = { \ - .main_tstate = _PyThreadState_INIT, \ - }, \ .static_objects = { \ .singletons = { \ .small_ints = _Py_small_ints_INIT, \ diff --git a/Include/internal/pycore_unicodeobject.h b/Include/internal/pycore_unicodeobject.h index ed4feb603d6f38..19faceebf1d8ee 100644 --- a/Include/internal/pycore_unicodeobject.h +++ b/Include/internal/pycore_unicodeobject.h @@ -34,7 +34,6 @@ struct _Py_unicode_runtime_ids { struct _Py_unicode_runtime_state { struct _Py_unicode_runtime_ids ids; - /* The interned dict is at _PyRuntime.cached_objects.interned_strings. */ }; /* fs_codec.encoding is initialized to NULL. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 891a65576ee29b..b9fb53147b9b51 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -14609,11 +14609,16 @@ PyUnicode_InternInPlace(PyObject **p) } PyObject *interned = get_interned_dict(); - PyObject *t = _Py_AddToGlobalDict(interned, s, s); + assert(interned != NULL); + + PyObject *t = PyDict_SetDefault(interned, s, s); + if (t == NULL) { + PyErr_Clear(); + return; + } + if (t != s) { - if (t != NULL) { - Py_SETREF(*p, Py_NewRef(t)); - } + Py_SETREF(*p, Py_NewRef(t)); return; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 5d7f8621833040..8110d94ba17526 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -636,8 +636,6 @@ pycore_create_interpreter(_PyRuntimeState *runtime, return status; } - _PyThreadState_InitDetached(&runtime->cached_objects.main_tstate, interp); - *tstate_p = tstate; return _PyStatus_OK(); } @@ -1934,8 +1932,6 @@ Py_FinalizeEx(void) // XXX Do this sooner during finalization. // XXX Ensure finalizer errors are handled properly. - _PyThreadState_ClearDetached(&runtime->cached_objects.main_tstate); - finalize_interp_clear(tstate); finalize_interp_delete(tstate->interp); diff --git a/Python/pystate.c b/Python/pystate.c index 394b12d24065f2..b17efdbefd124c 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -565,124 +565,6 @@ _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime) #endif -//--------------- -// global objects -//--------------- - -/* The global objects thread state is meant to be used in a very limited - way and should not be used to actually run any Python code. */ - -static PyThreadState * -bind_global_objects_state(_PyRuntimeState *runtime) -{ - PyThreadState *main_tstate = &runtime->cached_objects.main_tstate; - - bind_tstate(main_tstate); - /* Unlike _PyThreadState_Bind(), we do not modify gilstate TSS. */ - - return main_tstate; -} - -static void -unbind_global_objects_state(_PyRuntimeState *runtime) -{ - PyThreadState *main_tstate = &runtime->cached_objects.main_tstate; - assert(tstate_is_alive(main_tstate)); - assert(!main_tstate->_status.active); - assert(gilstate_tss_get(runtime) != main_tstate); - - unbind_tstate(main_tstate); - - /* This thread state may be bound/unbound repeatedly, - so we must erase evidence that it was ever bound (or unbound). */ - main_tstate->_status.bound = 0; - main_tstate->_status.unbound = 0; - - /* We must fully unlink the thread state from any OS thread, - to allow it to be bound more than once. */ - main_tstate->thread_id = 0; -#ifdef PY_HAVE_THREAD_NATIVE_ID - main_tstate->native_thread_id = 0; -#endif -} - -static inline void -acquire_global_objects_lock(_PyRuntimeState *runtime) -{ - /* For now we can rely on the GIL, so we don't actually - acquire a global lock here. */ - assert(current_fast_get(runtime) != NULL); -} - -static inline void -release_global_objects_lock(_PyRuntimeState *runtime) -{ - /* For now we can rely on the GIL, so we don't actually - release a global lock here. */ - assert(current_fast_get(runtime) != NULL); -} - -PyObject * -_Py_AddToGlobalDict(PyObject *dict, PyObject *key, PyObject *value) -{ - assert(dict != NULL); - assert(PyDict_CheckExact(dict)); - - /* All global objects are stored in _PyRuntime - and owned by the main interpreter. */ - _PyRuntimeState *runtime = &_PyRuntime; - PyThreadState *curts = current_fast_get(runtime); - PyInterpreterState *interp = curts->interp; - assert(interp != NULL); // The GIL must be held. - - /* Due to interpreter isolation we must hold a global lock, - starting at this point and ending before we return. - Note that the operations in this function are very fucused - and we should not expect any reentrancy. */ - acquire_global_objects_lock(runtime); - - /* Swap to the main interpreter, if necessary. */ - PyThreadState *oldts = NULL; - if (!_Py_IsMainInterpreter(interp)) { - PyThreadState *main_tstate = bind_global_objects_state(runtime); - - oldts = _PyThreadState_Swap(runtime, main_tstate); - assert(oldts != NULL); - assert(!_Py_IsMainInterpreter(oldts->interp)); - - /* The limitations of the global objects thread state apply - from this point to the point we swap back to oldts. */ - } - - /* This might trigger a resize, which is why we must "acquire" - the global object state. Also note that PyDict_SetDefault() - must be compatible with our reentrancy and global objects state - constraints. */ - PyObject *actual = PyDict_SetDefault(dict, key, value); - if (actual == NULL) { - /* Raising an exception from one interpreter in another - is problematic, so we clear it and let the caller deal - with the returned NULL. */ - assert(PyErr_ExceptionMatches(PyExc_MemoryError)); - PyErr_Clear(); - } - - /* Swap back, it it wasn't in the main interpreter already. */ - if (oldts != NULL) { - // The returned tstate should be _PyRuntime.cached_objects.main_tstate. - _PyThreadState_Swap(runtime, oldts); - - unbind_global_objects_state(runtime); - } - - release_global_objects_lock(runtime); - - // XXX Immortalize the key and value. - - return actual; -} - - /*************************************/ /* the per-interpreter runtime state */ /*************************************/ @@ -1335,7 +1217,8 @@ free_threadstate(PyThreadState *tstate) static void init_threadstate(PyThreadState *tstate, - PyInterpreterState *interp, uint64_t id) + PyInterpreterState *interp, uint64_t id, + PyThreadState *next) { if (tstate->_status.initialized) { Py_FatalError("thread state already initialized"); @@ -1344,13 +1227,18 @@ init_threadstate(PyThreadState *tstate, assert(interp != NULL); tstate->interp = interp; - // next/prev are set in add_threadstate(). - assert(tstate->next == NULL); - assert(tstate->prev == NULL); - assert(id > 0); tstate->id = id; + assert(interp->threads.head == tstate); + assert((next != NULL && id != 1) || (next == NULL && id == 1)); + if (next != NULL) { + assert(next->prev == NULL || next->prev == tstate); + next->prev = tstate; + } + tstate->next = next; + assert(tstate->prev == NULL); + // thread_id and native_thread_id are set in bind_tstate(). tstate->py_recursion_limit = interp->ceval.recursion_limit, @@ -1371,22 +1259,6 @@ init_threadstate(PyThreadState *tstate, tstate->_status.initialized = 1; } -static void -add_threadstate(PyInterpreterState *interp, PyThreadState *tstate, - PyThreadState *next) -{ - assert(interp->threads.head != tstate); - assert((next != NULL && tstate->id != 1) || - (next == NULL && tstate->id == 1)); - if (next != NULL) { - assert(next->prev == NULL || next->prev == tstate); - next->prev = tstate; - } - tstate->next = next; - assert(tstate->prev == NULL); - interp->threads.head = tstate; -} - static PyThreadState * new_threadstate(PyInterpreterState *interp) { @@ -1426,9 +1298,9 @@ new_threadstate(PyInterpreterState *interp) &initial._main_interpreter._initial_thread, sizeof(*tstate)); } + interp->threads.head = tstate; - init_threadstate(tstate, interp, id); - add_threadstate(interp, tstate, old_head); + init_threadstate(tstate, interp, id, old_head); HEAD_UNLOCK(runtime); if (!used_newtstate) { @@ -1475,33 +1347,6 @@ _PyThreadState_Init(PyThreadState *tstate) Py_FatalError("_PyThreadState_Init() is for internal use only"); } -void -_PyThreadState_InitDetached(PyThreadState *tstate, PyInterpreterState *interp) -{ - _PyRuntimeState *runtime = interp->runtime; - - HEAD_LOCK(runtime); - interp->threads.next_unique_id += 1; - uint64_t id = interp->threads.next_unique_id; - HEAD_UNLOCK(runtime); - - init_threadstate(tstate, interp, id); - // We do not call add_threadstate(). -} - - -static void -clear_datastack(PyThreadState *tstate) -{ - _PyStackChunk *chunk = tstate->datastack_chunk; - tstate->datastack_chunk = NULL; - while (chunk != NULL) { - _PyStackChunk *prev = chunk->previous; - _PyObject_VirtualFree(chunk, chunk->size); - chunk = prev; - } -} - void PyThreadState_Clear(PyThreadState *tstate) { @@ -1576,6 +1421,7 @@ PyThreadState_Clear(PyThreadState *tstate) // XXX Do it as early in the function as possible. } + /* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */ static void tstate_delete_common(PyThreadState *tstate) @@ -1608,25 +1454,17 @@ tstate_delete_common(PyThreadState *tstate) unbind_tstate(tstate); // XXX Move to PyThreadState_Clear()? - clear_datastack(tstate); + _PyStackChunk *chunk = tstate->datastack_chunk; + tstate->datastack_chunk = NULL; + while (chunk != NULL) { + _PyStackChunk *prev = chunk->previous; + _PyObject_VirtualFree(chunk, chunk->size); + chunk = prev; + } tstate->_status.finalized = 1; } -void -_PyThreadState_ClearDetached(PyThreadState *tstate) -{ - assert(!tstate->_status.bound); - assert(!tstate->_status.bound_gilstate); - assert(tstate->datastack_chunk == NULL); - assert(tstate->thread_id == 0); - assert(tstate->native_thread_id == 0); - assert(tstate->next == NULL); - assert(tstate->prev == NULL); - - PyThreadState_Clear(tstate); - clear_datastack(tstate); -} static void zapthreads(PyInterpreterState *interp) From 56d055a0d81a809e4ff8e1d56756a3bf32317efb Mon Sep 17 00:00:00 2001 From: Oleg Iarygin Date: Tue, 28 Mar 2023 03:21:07 +0400 Subject: [PATCH 004/349] gh-74468: [tarfile] Fix incorrect name attribute of ExFileObject (GH-102424) Co-authored-by: Simeon Visser --- Lib/tarfile.py | 6 +++--- Lib/test/test_tarfile.py | 7 +++++++ .../Library/2023-03-04-20-58-29.gh-issue-74468.Ac5Ew_.rst | 3 +++ 3 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-03-04-20-58-29.gh-issue-74468.Ac5Ew_.rst diff --git a/Lib/tarfile.py b/Lib/tarfile.py index d686435d90ad1b..b733195c9c5636 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -601,12 +601,12 @@ class _FileInFile(object): object. """ - def __init__(self, fileobj, offset, size, blockinfo=None): + def __init__(self, fileobj, offset, size, name, blockinfo=None): self.fileobj = fileobj self.offset = offset self.size = size self.position = 0 - self.name = getattr(fileobj, "name", None) + self.name = name self.closed = False if blockinfo is None: @@ -703,7 +703,7 @@ class ExFileObject(io.BufferedReader): def __init__(self, tarfile, tarinfo): fileobj = _FileInFile(tarfile.fileobj, tarinfo.offset_data, - tarinfo.size, tarinfo.sparse) + tarinfo.size, tarinfo.name, tarinfo.sparse) super().__init__(fileobj) #class ExFileObject diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 75b60e9a50e78a..39f6f499c818ef 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -479,6 +479,13 @@ def test_length_zero_header(self): with tarfile.open(support.findfile('recursion.tar')) as tar: pass + def test_extractfile_name(self): + # gh-74468: TarFile.name must name a file, not a parent archive. + file = self.tar.getmember('ustar/regtype') + with self.tar.extractfile(file) as fobj: + self.assertEqual(fobj.name, 'ustar/regtype') + + class MiscReadTestBase(CommonReadTest): def requires_name_attribute(self): pass diff --git a/Misc/NEWS.d/next/Library/2023-03-04-20-58-29.gh-issue-74468.Ac5Ew_.rst b/Misc/NEWS.d/next/Library/2023-03-04-20-58-29.gh-issue-74468.Ac5Ew_.rst new file mode 100644 index 00000000000000..8fad551f3a4ece --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-03-04-20-58-29.gh-issue-74468.Ac5Ew_.rst @@ -0,0 +1,3 @@ +Attribute name of the extracted :mod:`tarfile` file object now holds +filename of itself rather than of the archive it is contained in. +Patch by Oleg Iarygin. From b838d80085b0162cc2ae7b4db5d2a9d9c6a28366 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Mon, 27 Mar 2023 16:25:19 -0700 Subject: [PATCH 005/349] gh-103056: [Enum] ensure final _generate_next_value_ is a staticmethod (GH-103062) --- Lib/enum.py | 5 +++++ Lib/test/test_enum.py | 17 +++++++++++++++++ ...23-03-27-15-01-16.gh-issue-103056.-Efh5Q.rst | 1 + 3 files changed, 23 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2023-03-27-15-01-16.gh-issue-103056.-Efh5Q.rst diff --git a/Lib/enum.py b/Lib/enum.py index ba927662a43b13..2624a084dc6300 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -518,8 +518,13 @@ def __new__(metacls, cls, bases, classdict, *, boundary=None, _simple=False, **k # # adjust the sunders _order_ = classdict.pop('_order_', None) + _gnv = classdict.get('_generate_next_value_') + if _gnv is not None and type(_gnv) is not staticmethod: + _gnv = staticmethod(_gnv) # convert to normal dict classdict = dict(classdict.items()) + if _gnv is not None: + classdict['_generate_next_value_'] = _gnv # # data type of member and the controlling Enum class member_type, first_enum = metacls._get_mixins_(cls, bases) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index bb163c46481a42..58c80e7d228b5d 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -270,6 +270,17 @@ class NewSubEnum(NewBaseEnum): first = auto() self.NewSubEnum = NewSubEnum # + class LazyGNV(self.enum_type): + def _generate_next_value_(name, start, last, values): + pass + self.LazyGNV = LazyGNV + # + class BusyGNV(self.enum_type): + @staticmethod + def _generate_next_value_(name, start, last, values): + pass + self.BusyGNV = BusyGNV + # self.is_flag = False self.names = ['first', 'second', 'third'] if issubclass(MainEnum, StrEnum): @@ -466,6 +477,12 @@ def test_enum_in_enum_out(self): Main = self.MainEnum self.assertIs(Main(Main.first), Main.first) + def test_gnv_is_static(self): + lazy = self.LazyGNV + busy = self.BusyGNV + self.assertTrue(type(lazy.__dict__['_generate_next_value_']) is staticmethod) + self.assertTrue(type(busy.__dict__['_generate_next_value_']) is staticmethod) + def test_hash(self): MainEnum = self.MainEnum mapping = {} diff --git a/Misc/NEWS.d/next/Library/2023-03-27-15-01-16.gh-issue-103056.-Efh5Q.rst b/Misc/NEWS.d/next/Library/2023-03-27-15-01-16.gh-issue-103056.-Efh5Q.rst new file mode 100644 index 00000000000000..c892d8376503f8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-03-27-15-01-16.gh-issue-103056.-Efh5Q.rst @@ -0,0 +1 @@ +Ensure final ``_generate_next_value_`` is a ``staticmethod``. From f4ed2c6ae5915329e49b9f94033ef182400e29fa Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Mon, 27 Mar 2023 16:26:16 -0700 Subject: [PATCH 006/349] gh-102558: [Enum] better handling of non-Enum EnumType classes (GH-103060) --- Lib/enum.py | 12 +++++------- Lib/test/test_enum.py | 1 - 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Lib/enum.py b/Lib/enum.py index 2624a084dc6300..8c77117ce6acb4 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -928,7 +928,7 @@ def _convert_(cls, name, module, filter, source=None, *, boundary=None, as_globa def _check_for_existing_members_(mcls, class_name, bases): for chain in bases: for base in chain.__mro__: - if issubclass(base, Enum) and base._member_names_: + if isinstance(base, EnumType) and base._member_names_: raise TypeError( " cannot extend %r" % (class_name, base) @@ -947,7 +947,7 @@ def _get_mixins_(mcls, class_name, bases): # ensure final parent class is an Enum derivative, find any concrete # data type, and check that Enum has no members first_enum = bases[-1] - if not issubclass(first_enum, Enum): + if not isinstance(first_enum, EnumType): raise TypeError("new enumerations should be created as " "`EnumName([mixin_type, ...] [data_type,] enum_type)`") member_type = mcls._find_data_type_(class_name, bases) or object @@ -959,7 +959,7 @@ def _find_data_repr_(mcls, class_name, bases): for base in chain.__mro__: if base is object: continue - elif issubclass(base, Enum): + elif isinstance(base, EnumType): # if we hit an Enum, use it's _value_repr_ return base._value_repr_ elif '__repr__' in base.__dict__: @@ -985,12 +985,12 @@ def _find_data_type_(mcls, class_name, bases): base_chain.add(base) if base is object: continue - elif issubclass(base, Enum): + elif isinstance(base, EnumType): if base._member_type_ is not object: data_types.add(base._member_type_) break elif '__new__' in base.__dict__ or '__init__' in base.__dict__: - if issubclass(base, Enum): + if isinstance(base, EnumType): continue data_types.add(candidate or base) break @@ -1191,8 +1191,6 @@ def _missing_(cls, value): return None def __repr__(self): - if not isinstance(self, Enum): - return repr(self) v_repr = self.__class__._value_repr_ or repr return "<%s.%s: %s>" % (self.__class__.__name__, self._name_, v_repr(self._value_)) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 58c80e7d228b5d..bea19542705dc4 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -1386,7 +1386,6 @@ def repr(self): class Huh(MyStr, MyInt, Enum): One = 1 - def test_pickle_enum(self): if isinstance(Stooges, Exception): raise Stooges From 7703def37e4fa7d25c3d23756de8f527daa4e165 Mon Sep 17 00:00:00 2001 From: Chenxi Mao Date: Tue, 28 Mar 2023 16:52:22 +0800 Subject: [PATCH 007/349] GH-102711: Fix warnings found by clang (#102712) There are some warnings if build python via clang: Parser/pegen.c:812:31: warning: a function declaration without a prototype is deprecated in all versions of C [-Wstrict-prototypes] _PyPegen_clear_memo_statistics() ^ void Parser/pegen.c:820:29: warning: a function declaration without a prototype is deprecated in all versions of C [-Wstrict-prototypes] _PyPegen_get_memo_statistics() ^ void Fix it to make clang happy. Signed-off-by: Chenxi Mao --- .../next/Build/2023-03-15-02-03-39.gh-issue-102711.zTkjts.rst | 1 + Parser/pegen.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2023-03-15-02-03-39.gh-issue-102711.zTkjts.rst diff --git a/Misc/NEWS.d/next/Build/2023-03-15-02-03-39.gh-issue-102711.zTkjts.rst b/Misc/NEWS.d/next/Build/2023-03-15-02-03-39.gh-issue-102711.zTkjts.rst new file mode 100644 index 00000000000000..51184396877721 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2023-03-15-02-03-39.gh-issue-102711.zTkjts.rst @@ -0,0 +1 @@ +Fix ``-Wstrict-prototypes`` compiler warnings. diff --git a/Parser/pegen.c b/Parser/pegen.c index 94dd9de8a431c1..b79ae4cb1fb370 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -250,7 +250,7 @@ _PyPegen_fill_token(Parser *p) #define memo_statistics _PyRuntime.parser.memo_statistics void -_PyPegen_clear_memo_statistics() +_PyPegen_clear_memo_statistics(void) { for (int i = 0; i < NSTATISTICS; i++) { memo_statistics[i] = 0; @@ -258,7 +258,7 @@ _PyPegen_clear_memo_statistics() } PyObject * -_PyPegen_get_memo_statistics() +_PyPegen_get_memo_statistics(void) { PyObject *ret = PyList_New(NSTATISTICS); if (ret == NULL) { From ba65a065cf07a7a9f53be61057a090f7311a5ad7 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Tue, 28 Mar 2023 12:52:28 -0600 Subject: [PATCH 008/349] gh-100227: Move the Dict of Interned Strings to PyInterpreterState (gh-102339) We can revisit the options for keeping it global later, if desired. For now the approach seems quite complex, so we've gone with the simpler isolation solution in the meantime. https://github.com/python/cpython/issues/100227 --- Include/internal/pycore_global_objects.h | 9 +- Include/internal/pycore_runtime.h | 1 - Include/internal/pycore_unicodeobject.h | 1 + .../internal/pycore_unicodeobject_generated.h | 1332 ++++++++--------- Objects/unicodeobject.c | 98 +- Tools/build/generate_global_objects.py | 4 +- 6 files changed, 727 insertions(+), 718 deletions(-) diff --git a/Include/internal/pycore_global_objects.h b/Include/internal/pycore_global_objects.h index 9957da1fc5f22a..64d9384df9c5c5 100644 --- a/Include/internal/pycore_global_objects.h +++ b/Include/internal/pycore_global_objects.h @@ -23,13 +23,6 @@ extern "C" { // Only immutable objects should be considered runtime-global. // All others must be per-interpreter. -#define _Py_CACHED_OBJECT(NAME) \ - _PyRuntime.cached_objects.NAME - -struct _Py_cached_objects { - PyObject *interned_strings; -}; - #define _Py_GLOBAL_OBJECT(NAME) \ _PyRuntime.static_objects.NAME #define _Py_SINGLETON(NAME) \ @@ -65,6 +58,8 @@ struct _Py_static_objects { (interp)->cached_objects.NAME struct _Py_interp_cached_objects { + PyObject *interned_strings; + /* AST */ PyObject *str_replace_inf; diff --git a/Include/internal/pycore_runtime.h b/Include/internal/pycore_runtime.h index de757dfa93bc26..8877b282bc38de 100644 --- a/Include/internal/pycore_runtime.h +++ b/Include/internal/pycore_runtime.h @@ -163,7 +163,6 @@ typedef struct pyruntimestate { } types; /* All the objects that are shared by the runtime's interpreters. */ - struct _Py_cached_objects cached_objects; struct _Py_static_objects static_objects; /* The following fields are here to avoid allocation during init. diff --git a/Include/internal/pycore_unicodeobject.h b/Include/internal/pycore_unicodeobject.h index 19faceebf1d8ee..ff97b9a623d210 100644 --- a/Include/internal/pycore_unicodeobject.h +++ b/Include/internal/pycore_unicodeobject.h @@ -59,6 +59,7 @@ struct _Py_unicode_state { struct _Py_unicode_ids ids; }; +extern void _PyUnicode_InternInPlace(PyInterpreterState *interp, PyObject **p); extern void _PyUnicode_ClearInterned(PyInterpreterState *interp); diff --git a/Include/internal/pycore_unicodeobject_generated.h b/Include/internal/pycore_unicodeobject_generated.h index 0a8865942e6d5b..7114a5416f2515 100644 --- a/Include/internal/pycore_unicodeobject_generated.h +++ b/Include/internal/pycore_unicodeobject_generated.h @@ -10,2003 +10,2003 @@ extern "C" { /* The following is auto-generated by Tools/build/generate_global_objects.py. */ static inline void -_PyUnicode_InitStaticStrings(void) { +_PyUnicode_InitStaticStrings(PyInterpreterState *interp) { PyObject *string; string = &_Py_ID(CANCELLED); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(FINISHED); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(False); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(JSONDecodeError); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(PENDING); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(Py_Repr); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(TextIOWrapper); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(True); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(WarningMessage); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_WindowsConsoleIO); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__IOBase_closed); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__abc_tpflags__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__abs__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__abstractmethods__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__add__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__aenter__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__aexit__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__aiter__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__all__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__and__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__anext__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__annotations__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__args__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__asyncio_running_event_loop__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__await__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__bases__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__bool__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__build_class__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__builtins__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__bytes__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__call__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__cantrace__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__class__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__class_getitem__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__classcell__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__complex__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__contains__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__copy__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__ctypes_from_outparam__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__del__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__delattr__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__delete__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__delitem__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__dict__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__dictoffset__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__dir__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__divmod__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__doc__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__enter__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__eq__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__exit__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__file__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__float__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__floordiv__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__format__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__fspath__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__ge__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__get__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__getattr__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__getattribute__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__getinitargs__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__getitem__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__getnewargs__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__getnewargs_ex__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__getstate__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__gt__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__hash__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__iadd__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__iand__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__ifloordiv__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__ilshift__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__imatmul__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__imod__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__import__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__imul__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__index__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__init__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__init_subclass__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__instancecheck__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__int__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__invert__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__ior__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__ipow__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__irshift__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__isabstractmethod__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__isub__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__iter__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__itruediv__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__ixor__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__le__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__len__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__length_hint__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__lltrace__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__loader__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__lshift__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__lt__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__main__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__matmul__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__missing__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__mod__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__module__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__mro_entries__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__mul__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__name__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__ne__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__neg__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__new__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__newobj__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__newobj_ex__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__next__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__notes__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__or__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__orig_class__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__origin__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__package__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__parameters__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__path__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__pos__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__pow__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__prepare__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__qualname__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__radd__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__rand__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__rdivmod__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__reduce__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__reduce_ex__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__repr__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__reversed__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__rfloordiv__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__rlshift__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__rmatmul__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__rmod__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__rmul__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__ror__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__round__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__rpow__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__rrshift__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__rshift__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__rsub__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__rtruediv__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__rxor__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__set__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__set_name__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__setattr__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__setitem__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__setstate__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__sizeof__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__slotnames__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__slots__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__spec__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__str__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__sub__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__subclasscheck__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__subclasshook__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__truediv__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__trunc__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__typing_is_unpacked_typevartuple__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__typing_prepare_subst__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__typing_subst__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__typing_unpacked_tuple_args__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__warningregistry__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__weaklistoffset__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__weakref__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(__xor__); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_abc_impl); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_abstract_); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_active); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_annotation); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_anonymous_); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_argtypes_); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_as_parameter_); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_asyncio_future_blocking); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_blksize); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_bootstrap); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_check_retval_); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_dealloc_warn); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_feature_version); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_fields_); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_finalizing); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_find_and_load); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_fix_up_module); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_flags_); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_get_sourcefile); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_handle_fromlist); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_initializing); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_io); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_is_text_encoding); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_length_); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_limbo); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_lock_unlock_module); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_loop); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_needs_com_addref_); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_pack_); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_restype_); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_showwarnmsg); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_shutdown); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_slotnames); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_strptime_datetime); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_swappedbytes_); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_type_); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_uninitialized_submodules); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_warn_unawaited_coroutine); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(_xoptions); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(a); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(abs_tol); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(access); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(add); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(add_done_callback); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(after_in_child); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(after_in_parent); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(aggregate_class); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(append); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(argdefs); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(arguments); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(argv); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(as_integer_ratio); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(ast); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(attribute); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(authorizer_callback); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(autocommit); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(b); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(backtick); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(base); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(before); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(big); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(binary_form); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(block); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(buffer); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(buffer_callback); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(buffer_size); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(buffering); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(buffers); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(bufsize); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(builtins); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(byteorder); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(bytes); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(bytes_per_sep); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(c); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(c_call); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(c_exception); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(c_return); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(cached_statements); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(cadata); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(cafile); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(call); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(call_exception_handler); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(call_soon); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(cancel); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(capath); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(category); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(cb_type); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(certfile); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(check_same_thread); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(clear); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(close); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(closed); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(closefd); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(closure); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_argcount); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_cellvars); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_code); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_consts); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_exceptiontable); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_filename); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_firstlineno); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_flags); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_freevars); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_kwonlyargcount); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_linetable); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_name); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_names); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_nlocals); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_posonlyargcount); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_qualname); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_stacksize); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(co_varnames); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(code); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(command); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(comment_factory); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(consts); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(context); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(cookie); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(copy); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(copyreg); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(coro); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(count); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(cwd); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(d); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(data); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(database); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(decode); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(decoder); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(default); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(defaultaction); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(delete); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(depth); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(detect_types); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(deterministic); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(device); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(dict); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(dictcomp); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(difference_update); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(digest); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(digest_size); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(digestmod); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(dir_fd); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(discard); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(dispatch_table); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(displayhook); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(dklen); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(doc); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(dont_inherit); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(dst); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(dst_dir_fd); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(duration); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(e); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(effective_ids); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(element_factory); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(encode); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(encoding); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(end); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(end_lineno); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(end_offset); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(endpos); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(env); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(errors); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(event); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(eventmask); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(exc_type); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(exc_value); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(excepthook); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(exception); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(exp); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(extend); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(facility); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(factory); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(false); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(family); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(fanout); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(fd); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(fd2); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(fdel); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(fget); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(file); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(file_actions); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(filename); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(fileno); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(filepath); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(fillvalue); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(filters); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(final); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(find_class); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(fix_imports); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(flags); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(flush); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(follow_symlinks); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(format); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(frequency); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(from_param); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(fromlist); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(fromtimestamp); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(fromutc); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(fset); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(func); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(future); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(generation); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(genexpr); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(get); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(get_debug); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(get_event_loop); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(get_loop); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(get_source); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(getattr); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(getstate); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(gid); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(globals); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(groupindex); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(groups); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(handle); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(hash_name); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(header); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(headers); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(hi); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(hook); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(id); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(ident); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(ignore); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(imag); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(importlib); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(in_fd); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(incoming); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(indexgroup); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(inf); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(inheritable); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(initial); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(initial_bytes); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(initial_value); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(initval); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(inner_size); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(input); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(insert_comments); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(insert_pis); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(instructions); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(intern); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(intersection); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(isatty); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(isinstance); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(isoformat); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(isolation_level); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(istext); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(item); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(items); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(iter); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(iterable); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(iterations); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(join); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(jump); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(keepends); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(key); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(keyfile); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(keys); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(kind); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(kw); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(kw1); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(kw2); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(lambda); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(last); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(last_exc); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(last_node); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(last_traceback); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(last_type); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(last_value); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(latin1); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(leaf_size); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(len); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(length); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(level); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(limit); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(line); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(line_buffering); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(lineno); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(listcomp); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(little); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(lo); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(locale); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(locals); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(logoption); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(loop); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(mapping); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(match); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(max_length); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(maxdigits); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(maxevents); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(maxmem); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(maxsplit); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(maxvalue); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(memLevel); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(memlimit); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(message); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(metaclass); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(method); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(mod); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(mode); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(module); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(module_globals); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(modules); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(mro); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(msg); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(mycmp); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(n); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(n_arg); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(n_fields); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(n_sequence_fields); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(n_unnamed_fields); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(name); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(name_from); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(namespace_separator); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(namespaces); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(narg); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(ndigits); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(new_limit); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(newline); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(newlines); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(next); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(node_depth); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(node_offset); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(ns); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(nstype); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(nt); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(null); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(number); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(obj); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(object); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(offset); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(offset_dst); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(offset_src); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(on_type_read); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(onceregistry); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(only_keys); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(oparg); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(opcode); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(open); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(opener); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(operation); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(optimize); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(options); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(order); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(out_fd); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(outgoing); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(overlapped); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(owner); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(p); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(pages); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(parent); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(password); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(path); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(pattern); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(peek); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(persistent_id); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(persistent_load); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(person); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(pi_factory); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(pid); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(policy); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(pos); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(pos1); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(pos2); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(posix); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(print_file_and_line); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(priority); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(progress); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(progress_handler); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(proto); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(protocol); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(ps1); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(ps2); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(query); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(quotetabs); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(r); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(raw); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(read); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(read1); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(readable); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(readall); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(readinto); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(readinto1); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(readline); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(readonly); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(real); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(reducer_override); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(registry); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(rel_tol); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(reload); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(repl); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(replace); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(reserved); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(reset); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(resetids); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(return); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(reverse); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(reversed); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(s); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(salt); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(sched_priority); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(scheduler); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(seek); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(seekable); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(selectors); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(self); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(send); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(sep); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(sequence); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(server_hostname); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(server_side); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(session); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(setcomp); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(setpgroup); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(setsid); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(setsigdef); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(setsigmask); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(setstate); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(shape); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(show_cmd); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(signed); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(size); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(sizehint); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(skip_file_prefixes); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(sleep); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(sock); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(sort); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(sound); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(source); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(source_traceback); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(src); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(src_dir_fd); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(stacklevel); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(start); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(statement); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(status); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(stderr); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(stdin); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(stdout); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(step); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(store_name); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(strategy); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(strftime); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(strict); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(strict_mode); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(string); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(sub_key); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(symmetric_difference_update); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(tabsize); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(tag); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(target); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(target_is_directory); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(task); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(tb_frame); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(tb_lasti); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(tb_lineno); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(tb_next); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(tell); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(template); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(term); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(text); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(threading); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(throw); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(timeout); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(times); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(timetuple); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(top); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(trace_callback); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(traceback); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(trailers); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(translate); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(true); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(truncate); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(twice); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(txt); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(type); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(tz); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(tzname); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(uid); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(unlink); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(unraisablehook); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(uri); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(usedforsecurity); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(value); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(values); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(version); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(volume); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(warnings); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(warnoptions); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(wbits); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(week); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(weekday); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(which); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(who); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(withdata); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(writable); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(write); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(write_through); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(x); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(year); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(zdict); assert(_PyUnicode_CheckConsistency(string, 1)); - PyUnicode_InternInPlace(&string); + _PyUnicode_InternInPlace(interp, &string); } /* End auto-generated code */ #ifdef __cplusplus diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index b9fb53147b9b51..85e5ae735709fd 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -231,14 +231,32 @@ static inline PyObject* unicode_new_empty(void) Another way to look at this is that to say that the actual reference count of a string is: s->ob_refcnt + (s->state ? 2 : 0) */ -static inline PyObject *get_interned_dict(void) +static inline PyObject *get_interned_dict(PyInterpreterState *interp) { - return _Py_CACHED_OBJECT(interned_strings); + return _Py_INTERP_CACHED_OBJECT(interp, interned_strings); } -static inline void set_interned_dict(PyObject *dict) +static int +init_interned_dict(PyInterpreterState *interp) +{ + assert(get_interned_dict(interp) == NULL); + PyObject *interned = interned = PyDict_New(); + if (interned == NULL) { + return -1; + } + _Py_INTERP_CACHED_OBJECT(interp, interned_strings) = interned; + return 0; +} + +static void +clear_interned_dict(PyInterpreterState *interp) { - _Py_CACHED_OBJECT(interned_strings) = dict; + PyObject *interned = get_interned_dict(interp); + if (interned != NULL) { + PyDict_Clear(interned); + Py_DECREF(interned); + _Py_INTERP_CACHED_OBJECT(interp, interned_strings) = NULL; + } } #define _Py_RETURN_UNICODE_EMPTY() \ @@ -1520,12 +1538,12 @@ find_maxchar_surrogates(const wchar_t *begin, const wchar_t *end, static void unicode_dealloc(PyObject *unicode) { + PyInterpreterState *interp = _PyInterpreterState_GET(); #ifdef Py_DEBUG if (!unicode_is_finalizing() && unicode_is_singleton(unicode)) { _Py_FatalRefcountError("deallocating an Unicode singleton"); } #endif - PyObject *interned = get_interned_dict(); if (PyUnicode_CHECK_INTERNED(unicode)) { /* Revive the dead object temporarily. PyDict_DelItem() removes two references (key and value) which were ignored by @@ -1534,6 +1552,8 @@ unicode_dealloc(PyObject *unicode) PyDict_DelItem(). */ assert(Py_REFCNT(unicode) == 0); Py_SET_REFCNT(unicode, 3); + PyObject *interned = get_interned_dict(interp); + assert(interned != NULL); if (PyDict_DelItem(interned, unicode) != 0) { _PyErr_WriteUnraisableMsg("deletion of interned string failed", NULL); @@ -14529,34 +14549,29 @@ _PyUnicode_InitState(PyInterpreterState *interp) PyStatus _PyUnicode_InitGlobalObjects(PyInterpreterState *interp) { - if (!_Py_IsMainInterpreter(interp)) { - return _PyStatus_OK(); - } - // Initialize the global interned dict - PyObject *interned = PyDict_New(); - if (interned == NULL) { + if (init_interned_dict(interp)) { PyErr_Clear(); return _PyStatus_ERR("failed to create interned dict"); } - set_interned_dict(interned); - - /* Intern statically allocated string identifiers and deepfreeze strings. - * This must be done before any module initialization so that statically - * allocated string identifiers are used instead of heap allocated strings. - * Deepfreeze uses the interned identifiers if present to save space - * else generates them and they are interned to speed up dict lookups. - */ - _PyUnicode_InitStaticStrings(); + if (_Py_IsMainInterpreter(interp)) { + /* Intern statically allocated string identifiers and deepfreeze strings. + * This must be done before any module initialization so that statically + * allocated string identifiers are used instead of heap allocated strings. + * Deepfreeze uses the interned identifiers if present to save space + * else generates them and they are interned to speed up dict lookups. + */ + _PyUnicode_InitStaticStrings(interp); #ifdef Py_DEBUG - assert(_PyUnicode_CheckConsistency(&_Py_STR(empty), 1)); + assert(_PyUnicode_CheckConsistency(&_Py_STR(empty), 1)); - for (int i = 0; i < 256; i++) { - assert(_PyUnicode_CheckConsistency(LATIN1(i), 1)); - } + for (int i = 0; i < 256; i++) { + assert(_PyUnicode_CheckConsistency(LATIN1(i), 1)); + } #endif + } return _PyStatus_OK(); } @@ -14586,7 +14601,7 @@ _PyUnicode_InitTypes(PyInterpreterState *interp) void -PyUnicode_InternInPlace(PyObject **p) +_PyUnicode_InternInPlace(PyInterpreterState *interp, PyObject **p) { PyObject *s = *p; #ifdef Py_DEBUG @@ -14608,7 +14623,7 @@ PyUnicode_InternInPlace(PyObject **p) return; } - PyObject *interned = get_interned_dict(); + PyObject *interned = get_interned_dict(interp); assert(interned != NULL); PyObject *t = PyDict_SetDefault(interned, s, s); @@ -14629,6 +14644,13 @@ PyUnicode_InternInPlace(PyObject **p) _PyUnicode_STATE(s).interned = 1; } +void +PyUnicode_InternInPlace(PyObject **p) +{ + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyUnicode_InternInPlace(interp, p); +} + // Function kept for the stable ABI. PyAPI_FUNC(void) PyUnicode_InternImmortal(PyObject **); void @@ -14653,12 +14675,7 @@ PyUnicode_InternFromString(const char *cp) void _PyUnicode_ClearInterned(PyInterpreterState *interp) { - if (!_Py_IsMainInterpreter(interp)) { - // interned dict is shared by all interpreters - return; - } - - PyObject *interned = get_interned_dict(); + PyObject *interned = get_interned_dict(interp); if (interned == NULL) { return; } @@ -14693,9 +14710,7 @@ _PyUnicode_ClearInterned(PyInterpreterState *interp) total_length); #endif - PyDict_Clear(interned); - Py_DECREF(interned); - set_interned_dict(NULL); + clear_interned_dict(interp); } @@ -15108,7 +15123,7 @@ _PyUnicode_EnableLegacyWindowsFSEncoding(void) static inline int unicode_is_finalizing(void) { - return (get_interned_dict() == NULL); + return (get_interned_dict(_PyInterpreterState_Main()) == NULL); } #endif @@ -15131,14 +15146,13 @@ _PyUnicode_Fini(PyInterpreterState *interp) { struct _Py_unicode_state *state = &interp->unicode; - if (_Py_IsMainInterpreter(interp)) { - // _PyUnicode_ClearInterned() must be called before _PyUnicode_Fini() - assert(get_interned_dict() == NULL); - // bpo-47182: force a unicodedata CAPI capsule re-import on - // subsequent initialization of main interpreter. - } + // _PyUnicode_ClearInterned() must be called before _PyUnicode_Fini() + assert(get_interned_dict(interp) == NULL); _PyUnicode_FiniEncodings(&state->fs_codec); + + // bpo-47182: force a unicodedata CAPI capsule re-import on + // subsequent initialization of interpreter. interp->unicode.ucnhash_capi = NULL; unicode_clear_identifiers(state); diff --git a/Tools/build/generate_global_objects.py b/Tools/build/generate_global_objects.py index 1f53f02d41ef39..c27817702bf97d 100644 --- a/Tools/build/generate_global_objects.py +++ b/Tools/build/generate_global_objects.py @@ -354,14 +354,14 @@ def generate_static_strings_initializer(identifiers, strings): printer.write(before) printer.write(START) printer.write("static inline void") - with printer.block("_PyUnicode_InitStaticStrings(void)"): + with printer.block("_PyUnicode_InitStaticStrings(PyInterpreterState *interp)"): printer.write(f'PyObject *string;') for i in sorted(identifiers): # This use of _Py_ID() is ignored by iter_global_strings() # since iter_files() ignores .h files. printer.write(f'string = &_Py_ID({i});') printer.write(f'assert(_PyUnicode_CheckConsistency(string, 1));') - printer.write(f'PyUnicode_InternInPlace(&string);') + printer.write(f'_PyUnicode_InternInPlace(interp, &string);') # XXX What about "strings"? printer.write(END) printer.write(after) From 24ba507b1dd70cf468a1beadea6ca6336fe1d40f Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Wed, 29 Mar 2023 00:47:13 +0100 Subject: [PATCH 009/349] gh-103097: Add workaround for Windows ARM64 compiler bug (GH-103098) See https://developercommunity.visualstudio.com/t/Regression-in-MSVC-1433-1434-ARM64-co/10224361 for details of the issue. It only applies to version 14.34. --- PCbuild/pyproject.props | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index 92c7849d3bcf75..36c4c269d05da9 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -21,6 +21,13 @@ false + + <_VCToolsVersion>$([System.Version]::Parse(`$(VCToolsVersion)`).Major).$([System.Version]::Parse(`$(VCToolsVersion)`).Minor) + + + true + + <_DebugPreprocessorDefinition>NDEBUG; <_DebugPreprocessorDefinition Condition="$(Configuration) == 'Debug'">_DEBUG; @@ -50,6 +57,7 @@ /utf-8 %(AdditionalOptions) -Wno-deprecated-non-prototype -Wno-unused-label -Wno-pointer-sign -Wno-incompatible-pointer-types-discards-qualifiers -Wno-unused-function %(AdditionalOptions) -flto %(AdditionalOptions) + -d2pattern-opt-disable:-932189325 %(AdditionalOptions) OnlyExplicitInline @@ -79,6 +87,7 @@ PGUpdate advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;%(AdditionalDependencies) /OPT:REF,NOICF %(AdditionalOptions) + -d2:-pattern-opt-disable:-932189325 %(AdditionalOptions) true From 60bdc16b459cf8f7b359c7f87d8ae6c5928147a4 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Wed, 29 Mar 2023 06:04:26 +0300 Subject: [PATCH 010/349] gh-103054: typing: Improve `Callable` type substitution tests (#103055) Co-authored-by: Alex Waygood Co-authored-by: Eclips4 <80244920+Eclips4@users.noreply.github.com> --- Lib/test/test_typing.py | 42 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index f448b0ee60a92a..23bf2b5e183a18 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -2049,6 +2049,48 @@ def test_concatenate(self): Callable[Concatenate[int, str, P2], int]) self.assertEqual(C[...], Callable[Concatenate[int, ...], int]) + def test_nested_paramspec(self): + # Since Callable has some special treatment, we want to be sure + # that substituion works correctly, see gh-103054 + Callable = self.Callable + P = ParamSpec('P') + P2 = ParamSpec('P2') + T = TypeVar('T') + T2 = TypeVar('T2') + Ts = TypeVarTuple('Ts') + class My(Generic[P, T]): + pass + + self.assertEqual(My.__parameters__, (P, T)) + + C1 = My[[int, T2], Callable[P2, T2]] + self.assertEqual(C1.__args__, ((int, T2), Callable[P2, T2])) + self.assertEqual(C1.__parameters__, (T2, P2)) + self.assertEqual(C1[str, [list[int], bytes]], + My[[int, str], Callable[[list[int], bytes], str]]) + + C2 = My[[Callable[[T2], int], list[T2]], str] + self.assertEqual(C2.__args__, ((Callable[[T2], int], list[T2]), str)) + self.assertEqual(C2.__parameters__, (T2,)) + self.assertEqual(C2[list[str]], + My[[Callable[[list[str]], int], list[list[str]]], str]) + + C3 = My[[Callable[P2, T2], T2], T2] + self.assertEqual(C3.__args__, ((Callable[P2, T2], T2), T2)) + self.assertEqual(C3.__parameters__, (P2, T2)) + self.assertEqual(C3[[], int], + My[[Callable[[], int], int], int]) + self.assertEqual(C3[[str, bool], int], + My[[Callable[[str, bool], int], int], int]) + self.assertEqual(C3[[str, bool], T][int], + My[[Callable[[str, bool], int], int], int]) + + C4 = My[[Callable[[int, *Ts, str], T2], T2], T2] + self.assertEqual(C4.__args__, ((Callable[[int, *Ts, str], T2], T2), T2)) + self.assertEqual(C4.__parameters__, (Ts, T2)) + self.assertEqual(C4[bool, bytes, float], + My[[Callable[[int, bool, bytes, str], float], float], float]) + def test_errors(self): Callable = self.Callable alias = Callable[[int, str], float] From d835b3f05de7e2d800138e5969eeb9656b0ed860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?= Date: Wed, 29 Mar 2023 10:52:53 +0200 Subject: [PATCH 011/349] gh-102582: Fix invalid JSON in Doc/howto/logging-cookbook.rst (GH-102635) --- Doc/howto/logging-cookbook.rst | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst index 1a0afb6940dab9..6ef252d709e735 100644 --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -340,10 +340,12 @@ adding a ``filters`` section parallel to ``formatters`` and ``handlers``: .. code-block:: json - "filters": { - "warnings_and_below": { - "()" : "__main__.filter_maker", - "level": "WARNING" + { + "filters": { + "warnings_and_below": { + "()" : "__main__.filter_maker", + "level": "WARNING" + } } } @@ -351,12 +353,14 @@ and changing the section on the ``stdout`` handler to add it: .. code-block:: json - "stdout": { - "class": "logging.StreamHandler", - "level": "INFO", - "formatter": "simple", - "stream": "ext://sys.stdout", - "filters": ["warnings_and_below"] + { + "stdout": { + "class": "logging.StreamHandler", + "level": "INFO", + "formatter": "simple", + "stream": "ext://sys.stdout", + "filters": ["warnings_and_below"] + } } A filter is just a function, so we can define the ``filter_maker`` (a factory From e375bff03736f809fbc234010c087ef9d7e0d384 Mon Sep 17 00:00:00 2001 From: gaogaotiantian Date: Wed, 29 Mar 2023 03:09:12 -0700 Subject: [PATCH 012/349] gh-103068: Check condition expression of breakpoints for pdb (#103069) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Łukasz Langa Co-authored-by: Artem Mukhin --- Lib/pdb.py | 38 +++++++++++++------ Lib/test/test_pdb.py | 18 ++++++++- ...-03-28-05-14-59.gh-issue-103068.YQTmrA.rst | 2 + 3 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-03-28-05-14-59.gh-issue-103068.YQTmrA.rst diff --git a/Lib/pdb.py b/Lib/pdb.py index d402de1192f9e2..3a06cd00ad2bf1 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -377,8 +377,7 @@ def user_exception(self, frame, exc_info): # stop when the debuggee is returning from such generators. prefix = 'Internal ' if (not exc_traceback and exc_type is StopIteration) else '' - self.message('%s%s' % (prefix, - traceback.format_exception_only(exc_type, exc_value)[-1].strip())) + self.message('%s%s' % (prefix, self._format_exc(exc_value))) self.interaction(frame, exc_traceback) # General interaction function @@ -399,7 +398,7 @@ def preloop(self): displaying = self.displaying.get(self.curframe) if displaying: for expr, oldvalue in displaying.items(): - newvalue, _ = self._getval_except(expr) + newvalue = self._getval_except(expr) # check for identity first; this prevents custom __eq__ to # be called at every loop, and also prevents instances whose # fields are changed to be displayed @@ -702,6 +701,9 @@ def do_break(self, arg, temporary = 0): if comma > 0: # parse stuff after comma: "condition" cond = arg[comma+1:].lstrip() + if err := self._compile_error_message(cond): + self.error('Invalid condition %s: %r' % (cond, err)) + return arg = arg[:comma].rstrip() # parse stuff before comma: [filename:]lineno | function colon = arg.rfind(':') @@ -887,6 +889,9 @@ def do_condition(self, arg): args = arg.split(' ', 1) try: cond = args[1] + if err := self._compile_error_message(cond): + self.error('Invalid condition %s: %r' % (cond, err)) + return except IndexError: cond = None try: @@ -1246,16 +1251,15 @@ def _getval(self, arg): def _getval_except(self, arg, frame=None): try: if frame is None: - return eval(arg, self.curframe.f_globals, self.curframe_locals), None + return eval(arg, self.curframe.f_globals, self.curframe_locals) else: - return eval(arg, frame.f_globals, frame.f_locals), None + return eval(arg, frame.f_globals, frame.f_locals) except BaseException as exc: - err = traceback.format_exception_only(exc)[-1].strip() - return _rstr('** raised %s **' % err), exc + return _rstr('** raised %s **' % self._format_exc(exc)) def _error_exc(self): - exc_info = sys.exc_info()[:2] - self.error(traceback.format_exception_only(*exc_info)[-1].strip()) + exc = sys.exc_info()[1] + self.error(self._format_exc(exc)) def _msg_val_func(self, arg, func): try: @@ -1443,10 +1447,10 @@ def do_display(self, arg): else: self.message('No expression is being displayed') else: - val, exc = self._getval_except(arg) - if isinstance(exc, SyntaxError): - self.message('Unable to display %s: %r' % (arg, val)) + if err := self._compile_error_message(arg): + self.error('Unable to display %s: %r' % (arg, err)) else: + val = self._getval_except(arg) self.displaying.setdefault(self.curframe, {})[arg] = val self.message('display %s: %r' % (arg, val)) @@ -1647,6 +1651,16 @@ def _run(self, target: Union[_ModuleTarget, _ScriptTarget]): self.run(target.code) + def _format_exc(self, exc: BaseException): + return traceback.format_exception_only(exc)[-1].strip() + + def _compile_error_message(self, expr): + """Return the error message as string if compiling `expr` fails.""" + try: + compile(expr, "", "eval") + except SyntaxError as exc: + return _rstr(self._format_exc(exc)) + return "" # Collect all command help into docstring, if not run with -OO diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index ae9c5d73e2daa7..de2bab46495729 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -240,9 +240,11 @@ def test_pdb_breakpoint_commands(): >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE ... 'break 3', + ... 'break 4, +', ... 'disable 1', ... 'ignore 1 10', ... 'condition 1 1 < 2', + ... 'condition 1 1 <', ... 'break 4', ... 'break 4', ... 'break', @@ -264,6 +266,8 @@ def test_pdb_breakpoint_commands(): ... 'commands 10', # out of range ... 'commands a', # display help ... 'commands 4', # already deleted + ... 'break 6, undefined', # condition causing `NameError` during evaluation + ... 'continue', # will stop, ignoring runtime error ... 'continue', ... ]): ... test_function() @@ -271,12 +275,16 @@ def test_pdb_breakpoint_commands(): -> print(1) (Pdb) break 3 Breakpoint 1 at :3 + (Pdb) break 4, + + *** Invalid condition +: SyntaxError: invalid syntax (Pdb) disable 1 Disabled breakpoint 1 at :3 (Pdb) ignore 1 10 Will ignore next 10 crossings of breakpoint 1. (Pdb) condition 1 1 < 2 New condition set for breakpoint 1. + (Pdb) condition 1 1 < + *** Invalid condition 1 <: SyntaxError: invalid syntax (Pdb) break 4 Breakpoint 2 at :4 (Pdb) break 4 @@ -331,8 +339,13 @@ def test_pdb_breakpoint_commands(): end (Pdb) commands 4 *** cannot set commands: Breakpoint 4 already deleted + (Pdb) break 6, undefined + Breakpoint 5 at :6 (Pdb) continue 3 + > (6)test_function() + -> print(4) + (Pdb) continue 4 """ @@ -597,13 +610,14 @@ def test_pdb_display_command(): ... 'undisplay', ... 'display a < 1', ... 'n', + ... 'display undefined', ... 'continue', ... ]): ... test_function() > (4)test_function() -> a = 1 (Pdb) display + - Unable to display +: ** raised SyntaxError: invalid syntax ** + *** Unable to display +: SyntaxError: invalid syntax (Pdb) display No expression is being displayed (Pdb) display a @@ -627,6 +641,8 @@ def test_pdb_display_command(): (Pdb) n > (7)test_function() -> a = 4 + (Pdb) display undefined + display undefined: ** raised NameError: name 'undefined' is not defined ** (Pdb) continue """ diff --git a/Misc/NEWS.d/next/Library/2023-03-28-05-14-59.gh-issue-103068.YQTmrA.rst b/Misc/NEWS.d/next/Library/2023-03-28-05-14-59.gh-issue-103068.YQTmrA.rst new file mode 100644 index 00000000000000..71c142c30f4eff --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-03-28-05-14-59.gh-issue-103068.YQTmrA.rst @@ -0,0 +1,2 @@ +It's no longer possible to register conditional breakpoints in +:class:`~pdb.Pdb` that raise :exc:`SyntaxError`. Patch by Tian Gao. From d052a383f1a0c599c176a12c73a761ca00436d8b Mon Sep 17 00:00:00 2001 From: Bernhard Wagner Date: Wed, 29 Mar 2023 21:21:56 +0200 Subject: [PATCH 013/349] gh-103112: Add http.client.HTTPResponse.read docstring and fix pydoc output (#103113) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Terry Jan Reedy Co-authored-by: Éric --- Lib/http/client.py | 1 + .../Documentation/2023-03-29-14-51-39.gh-issue-103112.XgGSEO.rst | 1 + 2 files changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Documentation/2023-03-29-14-51-39.gh-issue-103112.XgGSEO.rst diff --git a/Lib/http/client.py b/Lib/http/client.py index 15c5cf634cf508..bd55e7d239af0c 100644 --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -448,6 +448,7 @@ def isclosed(self): return self.fp is None def read(self, amt=None): + """Read and return the response body, or up to the next amt bytes.""" if self.fp is None: return b"" diff --git a/Misc/NEWS.d/next/Documentation/2023-03-29-14-51-39.gh-issue-103112.XgGSEO.rst b/Misc/NEWS.d/next/Documentation/2023-03-29-14-51-39.gh-issue-103112.XgGSEO.rst new file mode 100644 index 00000000000000..babc8150966117 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2023-03-29-14-51-39.gh-issue-103112.XgGSEO.rst @@ -0,0 +1 @@ +Add docstring to :meth:`http.client.HTTPResponse.read` to fix ``pydoc`` output. From 0b1d9c44f1f091a499856d81542eeafda25011e1 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Wed, 29 Mar 2023 13:28:08 -0700 Subject: [PATCH 014/349] GH-102973: add a dev container (GH-102975) On content update, builds `python` and the docs. Also adds a Dockerfile that should include everything but autoconf 2.69 that's necessary to build CPython and the entire stdlib on Fedora. Co-authored-by: Ronald Oussoren Co-authored-by: Dusty Phillips --- .devcontainer/Dockerfile | 24 ++++++ .devcontainer/devcontainer.json | 75 +++++++++++++++++++ ...-03-23-20-58-56.gh-issue-102973.EaJUrw.rst | 2 + Tools/wasm/Setup.local.example | 1 + 4 files changed, 102 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json create mode 100644 Misc/NEWS.d/next/Build/2023-03-23-20-58-56.gh-issue-102973.EaJUrw.rst diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 00000000000000..ce8967337b02f9 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,24 @@ +FROM docker.io/library/fedora:37 + +ENV CC=clang + +ENV WASI_SDK_VERSION=19 +ENV WASI_SDK_PATH=/opt/wasi-sdk + +ENV WASMTIME_HOME=/opt/wasmtime +ENV WASMTIME_VERSION=7.0.0 +ENV WASMTIME_CPU_ARCH=x86_64 + +RUN dnf -y --nodocs install git clang xz python3-blurb dnf-plugins-core && \ + dnf -y --nodocs builddep python3 && \ + dnf -y clean all + +RUN mkdir ${WASI_SDK_PATH} && \ + curl --location https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_SDK_VERSION}/wasi-sdk-${WASI_SDK_VERSION}.0-linux.tar.gz | \ + tar --strip-components 1 --directory ${WASI_SDK_PATH} --extract --gunzip + +RUN mkdir --parents ${WASMTIME_HOME} && \ + curl --location "https://github.com/bytecodealliance/wasmtime/releases/download/v${WASMTIME_VERSION}/wasmtime-v${WASMTIME_VERSION}-${WASMTIME_CPU_ARCH}-linux.tar.xz" | \ + xz --decompress | \ + tar --strip-components 1 --directory ${WASMTIME_HOME} -x && \ + ln -s ${WASMTIME_HOME}/wasmtime /usr/local/bin diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000000000..e3fb4c6c88f497 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,75 @@ +{ + "build": { + "dockerfile": "Dockerfile" + }, + "onCreateCommand": [ + // Install common tooling. + "dnf", + "install", + "-y", + "which", + "zsh", + "fish" + ], + "updateContentCommand": { + // Using the shell for `nproc` usage. + "python": "./configure --config-cache --with-pydebug && make -s -j `nproc`", + "docs": [ + "make", + "--directory", + "Doc", + "venv", + "html" + ] + }, + "customizations": { + "vscode": { + "extensions": [ + // Highlighting for Parser/Python.asdl. + "brettcannon.zephyr-asdl", + // Highlighting for configure.ac. + "maelvalais.autoconf", + // C auto-complete. + "ms-vscode.cpptools", + // To view built docs. + "ms-vscode.live-server" + // https://github.com/microsoft/vscode-python/issues/18073 + // "ms-python.python" + ], + "settings": { + "C_Cpp.default.cStandard": "c11", + "C_Cpp.default.defines": [ + "Py_BUILD_CORE" + ], + // https://github.com/microsoft/vscode-cpptools/issues/10732 + "C_Cpp.errorSquiggles": "disabled", + "editor.insertSpaces": true, + "editor.rulers": [ + 80 + ], + "editor.tabSize": 4, + "editor.trimAutoWhitespace": true, + "files.associations": { + "*.h": "c" + }, + "files.encoding": "utf8", + "files.eol": "\n", + "files.insertFinalNewline": true, + "files.trimTrailingWhitespace": true, + "python.analysis.diagnosticSeverityOverrides": { + // Complains about shadowing the stdlib w/ the stdlib. + "reportShadowedImports": "none", + // Doesn't like _frozen_importlib. + "reportMissingImports": "none" + }, + "python.analysis.extraPaths": [ + "Lib" + ], + "python.defaultInterpreterPath": "./python", + "[restructuredtext]": { + "editor.tabSize": 3 + } + } + } + } +} diff --git a/Misc/NEWS.d/next/Build/2023-03-23-20-58-56.gh-issue-102973.EaJUrw.rst b/Misc/NEWS.d/next/Build/2023-03-23-20-58-56.gh-issue-102973.EaJUrw.rst new file mode 100644 index 00000000000000..38b02391266ffb --- /dev/null +++ b/Misc/NEWS.d/next/Build/2023-03-23-20-58-56.gh-issue-102973.EaJUrw.rst @@ -0,0 +1,2 @@ +Add a dev container (along with accompanying Dockerfile) for development +purposes. diff --git a/Tools/wasm/Setup.local.example b/Tools/wasm/Setup.local.example index ad58c31a2efe31..cfb9f7fc8755f8 100644 --- a/Tools/wasm/Setup.local.example +++ b/Tools/wasm/Setup.local.example @@ -5,6 +5,7 @@ audioop _bz2 _crypt _decimal +nis _pickle pyexpat _elementtree _sha3 _blake2 From e647dbaded898e5399d01d06771c1b42b5631be8 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Wed, 29 Mar 2023 16:08:40 -0600 Subject: [PATCH 015/349] gh-90110: Bring the whitelists up to date. (gh-103114) https://github.com/python/cpython/issues/90110 --- Tools/c-analyzer/cpython/globals-to-fix.tsv | 2 -- Tools/c-analyzer/cpython/ignored.tsv | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Tools/c-analyzer/cpython/globals-to-fix.tsv b/Tools/c-analyzer/cpython/globals-to-fix.tsv index 57b8542fb46482..e0e45265209fff 100644 --- a/Tools/c-analyzer/cpython/globals-to-fix.tsv +++ b/Tools/c-analyzer/cpython/globals-to-fix.tsv @@ -457,7 +457,6 @@ Modules/_decimal/_decimal.c - extended_context_template - Modules/_decimal/_decimal.c - round_map - Modules/_decimal/_decimal.c - Rational - Modules/_decimal/_decimal.c - SignalTuple - -Modules/arraymodule.c array_array___reduce_ex___impl array_reconstructor - ## state Modules/_asynciomodule.c - fi_freelist - @@ -539,7 +538,6 @@ Modules/_tkinter.c - command_mutex - Modules/_tkinter.c - HeadFHCD - Modules/_tkinter.c - stdin_ready - Modules/_tkinter.c - event_tstate - -Modules/_xxinterpchannelsmodule.c - _globals - Modules/readline.c - completer_word_break_characters - Modules/readline.c - _history_length - Modules/readline.c - should_auto_add_history - diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index 9203c1888149fb..a8ba88efc732fb 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -156,6 +156,9 @@ Modules/faulthandler.c faulthandler_dump_traceback reentrant - Python/pylifecycle.c _Py_FatalErrorFormat reentrant - Python/pylifecycle.c fatal_error reentrant - +# explicitly protected, internal-only +Modules/_xxinterpchannelsmodule.c - _globals - + ################################## ## not significant From 121057aa3600c4d4d392539aeb79e1b09fd5659d Mon Sep 17 00:00:00 2001 From: Brandt Bucher Date: Wed, 29 Mar 2023 15:53:30 -0700 Subject: [PATCH 016/349] GH-89987: Shrink the BINARY_SUBSCR caches (GH-103022) --- Include/cpython/object.h | 11 + Include/internal/pycore_code.h | 2 - Include/internal/pycore_opcode.h | 2 +- Lib/importlib/_bootstrap_external.py | 4 +- Lib/opcode.py | 2 - Lib/test/test_dis.py | 2 +- Lib/test/test_sys.py | 2 +- ...3-03-24-02-50-33.gh-issue-89987.oraTzh.rst | 2 + Objects/typeobject.c | 10 + Programs/test_frozenmain.h | 57 ++- Python/bytecodes.c | 20 +- Python/generated_cases.c.h | 382 +++++++++--------- Python/opcode_metadata.h | 10 +- Python/specialize.c | 16 +- 14 files changed, 272 insertions(+), 250 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-24-02-50-33.gh-issue-89987.oraTzh.rst diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 859ffb91e223dc..98cc51cd7fee49 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -234,7 +234,18 @@ struct _typeobject { * It should should be treated as an opaque blob * by code other than the specializer and interpreter. */ struct _specialization_cache { + // In order to avoid bloating the bytecode with lots of inline caches, the + // members of this structure have a somewhat unique contract. They are set + // by the specialization machinery, and are invalidated by PyType_Modified. + // The rules for using them are as follows: + // - If getitem is non-NULL, then it is the same Python function that + // PyType_Lookup(cls, "__getitem__") would return. + // - If getitem is NULL, then getitem_version is meaningless. + // - If getitem->func_version == getitem_version, then getitem can be called + // with two positional arguments and no keyword arguments, and has neither + // *args nor **kwargs (as required by BINARY_SUBSCR_GETITEM): PyObject *getitem; + uint32_t getitem_version; }; /* The *real* layout of a type object when allocated on the heap */ diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 3359dfd8a499e0..7f3148a38ff13e 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -47,8 +47,6 @@ typedef struct { typedef struct { uint16_t counter; - uint16_t type_version[2]; - uint16_t func_version; } _PyBinarySubscrCache; #define INLINE_CACHE_ENTRIES_BINARY_SUBSCR CACHE_ENTRIES(_PyBinarySubscrCache) diff --git a/Include/internal/pycore_opcode.h b/Include/internal/pycore_opcode.h index 4a0b27a13ae96c..22914da07994f8 100644 --- a/Include/internal/pycore_opcode.h +++ b/Include/internal/pycore_opcode.h @@ -41,7 +41,7 @@ static const uint32_t _PyOpcode_Jump[9] = { }; const uint8_t _PyOpcode_Caches[256] = { - [BINARY_SUBSCR] = 4, + [BINARY_SUBSCR] = 1, [STORE_SUBSCR] = 1, [UNPACK_SEQUENCE] = 1, [FOR_ITER] = 1, diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 28e55fdc8b7d10..9c4c5f907744cd 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -435,7 +435,9 @@ def _write_atomic(path, data, mode=0o666): # Python 3.12a6 3519 (Modify SEND instruction) # Python 3.12a6 3520 (Remove PREP_RERAISE_STAR, add CALL_INTRINSIC_2) # Python 3.12a7 3521 (Shrink the LOAD_GLOBAL caches) +# Python 3.12a7 3522 (Removed JUMP_IF_FALSE_OR_POP/JUMP_IF_TRUE_OR_POP) # Python 3.12a7 3523 (Convert COMPARE_AND_BRANCH back to COMPARE_OP) +# Python 3.12a7 3524 (Shrink the BINARY_SUBSCR caches) # Python 3.13 will start with 3550 @@ -452,7 +454,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3523).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3524).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c diff --git a/Lib/opcode.py b/Lib/opcode.py index 60670f571fdc4d..16a61dff47b5b3 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -392,8 +392,6 @@ def pseudo_op(name, op, real_ops): }, "BINARY_SUBSCR": { "counter": 1, - "type_version": 2, - "func_version": 1, }, "FOR_ITER": { "counter": 1, diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 7cad8d1bfe13ae..7e501045662f4c 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -1108,7 +1108,7 @@ def test_binary_specialize(self): 1 2 LOAD_NAME 0 (a) 4 LOAD_CONST 0 (0) 6 %s - 16 RETURN_VALUE + 10 RETURN_VALUE """ co_list = compile('a[0]', "", "eval") self.code_quicken(lambda: exec(co_list, {}, {'a': [0]})) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index fb578c5ae6e5d5..d7456d6d9480b2 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -1556,7 +1556,7 @@ def delx(self): del self.__x '10P' # PySequenceMethods '2P' # PyBufferProcs '6P' - '1P' # Specializer cache + '1PI' # Specializer cache ) class newstyleclass(object): pass # Separate block for PyDictKeysObject with 8 keys and 5 entries diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-24-02-50-33.gh-issue-89987.oraTzh.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-24-02-50-33.gh-issue-89987.oraTzh.rst new file mode 100644 index 00000000000000..507f68b0c5affe --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-03-24-02-50-33.gh-issue-89987.oraTzh.rst @@ -0,0 +1,2 @@ +Reduce the number of inline :opcode:`CACHE` entries for +:opcode:`BINARY_SUBSCR`. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 69e84743f13aac..24541bddbbc33f 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -510,6 +510,11 @@ PyType_Modified(PyTypeObject *type) type->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; type->tp_version_tag = 0; /* 0 is not a valid version tag */ + if (PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE)) { + // This field *must* be invalidated if the type is modified (see the + // comment on struct _specialization_cache): + ((PyHeapTypeObject *)type)->_spec_cache.getitem = NULL; + } } static void @@ -563,6 +568,11 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { clear: type->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; type->tp_version_tag = 0; /* 0 is not a valid version tag */ + if (PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE)) { + // This field *must* be invalidated if the type is modified (see the + // comment on struct _specialization_cache): + ((PyHeapTypeObject *)type)->_spec_cache.getitem = NULL; + } } static int diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h index 8e5055bd7bceb1..c33bb18f4da8b3 100644 --- a/Programs/test_frozenmain.h +++ b/Programs/test_frozenmain.h @@ -1,39 +1,38 @@ // Auto-generated by Programs/freeze_test_frozenmain.py unsigned char M_test_frozenmain[] = { 227,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0, - 0,0,0,0,0,243,182,0,0,0,151,0,100,0,100,1, + 0,0,0,0,0,243,170,0,0,0,151,0,100,0,100,1, 108,0,90,0,100,0,100,1,108,1,90,1,2,0,101,2, 100,2,171,1,0,0,0,0,0,0,0,0,1,0,2,0, 101,2,100,3,101,0,106,6,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,171,2,0,0,0,0, 0,0,0,0,1,0,2,0,101,1,106,8,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,0, - 0,0,0,0,0,0,0,0,100,4,25,0,0,0,0,0, - 0,0,0,0,90,5,100,5,68,0,93,23,0,0,90,6, - 2,0,101,2,100,6,101,6,155,0,100,7,101,5,101,6, - 25,0,0,0,0,0,0,0,0,0,155,0,157,4,171,1, - 0,0,0,0,0,0,0,0,1,0,140,25,4,0,121,1, - 41,8,233,0,0,0,0,78,122,18,70,114,111,122,101,110, - 32,72,101,108,108,111,32,87,111,114,108,100,122,8,115,121, - 115,46,97,114,103,118,218,6,99,111,110,102,105,103,41,5, - 218,12,112,114,111,103,114,97,109,95,110,97,109,101,218,10, - 101,120,101,99,117,116,97,98,108,101,218,15,117,115,101,95, - 101,110,118,105,114,111,110,109,101,110,116,218,17,99,111,110, - 102,105,103,117,114,101,95,99,95,115,116,100,105,111,218,14, - 98,117,102,102,101,114,101,100,95,115,116,100,105,111,122,7, - 99,111,110,102,105,103,32,122,2,58,32,41,7,218,3,115, - 121,115,218,17,95,116,101,115,116,105,110,116,101,114,110,97, - 108,99,97,112,105,218,5,112,114,105,110,116,218,4,97,114, - 103,118,218,11,103,101,116,95,99,111,110,102,105,103,115,114, - 3,0,0,0,218,3,107,101,121,169,0,243,0,0,0,0, - 250,18,116,101,115,116,95,102,114,111,122,101,110,109,97,105, - 110,46,112,121,250,8,60,109,111,100,117,108,101,62,114,18, - 0,0,0,1,0,0,0,115,100,0,0,0,240,3,1,1, - 1,243,8,0,1,11,219,0,24,225,0,5,208,6,26,213, - 0,27,217,0,5,128,106,144,35,151,40,145,40,213,0,27, - 216,9,38,208,9,26,215,9,38,209,9,38,212,9,40,168, - 24,212,9,50,128,6,240,2,6,12,2,242,0,7,1,42, - 128,67,241,14,0,5,10,208,10,40,144,67,209,10,40,152, - 54,160,35,156,59,209,10,40,214,4,41,241,15,7,1,42, - 114,16,0,0,0, + 0,0,0,0,0,0,0,0,100,4,25,0,0,0,90,5, + 100,5,68,0,93,20,0,0,90,6,2,0,101,2,100,6, + 101,6,155,0,100,7,101,5,101,6,25,0,0,0,155,0, + 157,4,171,1,0,0,0,0,0,0,0,0,1,0,140,22, + 4,0,121,1,41,8,233,0,0,0,0,78,122,18,70,114, + 111,122,101,110,32,72,101,108,108,111,32,87,111,114,108,100, + 122,8,115,121,115,46,97,114,103,118,218,6,99,111,110,102, + 105,103,41,5,218,12,112,114,111,103,114,97,109,95,110,97, + 109,101,218,10,101,120,101,99,117,116,97,98,108,101,218,15, + 117,115,101,95,101,110,118,105,114,111,110,109,101,110,116,218, + 17,99,111,110,102,105,103,117,114,101,95,99,95,115,116,100, + 105,111,218,14,98,117,102,102,101,114,101,100,95,115,116,100, + 105,111,122,7,99,111,110,102,105,103,32,122,2,58,32,41, + 7,218,3,115,121,115,218,17,95,116,101,115,116,105,110,116, + 101,114,110,97,108,99,97,112,105,218,5,112,114,105,110,116, + 218,4,97,114,103,118,218,11,103,101,116,95,99,111,110,102, + 105,103,115,114,3,0,0,0,218,3,107,101,121,169,0,243, + 0,0,0,0,250,18,116,101,115,116,95,102,114,111,122,101, + 110,109,97,105,110,46,112,121,250,8,60,109,111,100,117,108, + 101,62,114,18,0,0,0,1,0,0,0,115,100,0,0,0, + 240,3,1,1,1,243,8,0,1,11,219,0,24,225,0,5, + 208,6,26,213,0,27,217,0,5,128,106,144,35,151,40,145, + 40,213,0,27,216,9,38,208,9,26,215,9,38,209,9,38, + 212,9,40,168,24,209,9,50,128,6,240,2,6,12,2,242, + 0,7,1,42,128,67,241,14,0,5,10,208,10,40,144,67, + 209,10,40,152,54,160,35,153,59,209,10,40,214,4,41,241, + 15,7,1,42,114,16,0,0,0, }; diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 2fe85dfeedf47f..484f6e6b1a1c9b 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -292,7 +292,7 @@ dummy_func( BINARY_SUBSCR_TUPLE_INT, }; - inst(BINARY_SUBSCR, (unused/4, container, sub -- res)) { + inst(BINARY_SUBSCR, (unused/1, container, sub -- res)) { #if ENABLE_SPECIALIZATION _PyBinarySubscrCache *cache = (_PyBinarySubscrCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -339,7 +339,7 @@ dummy_func( ERROR_IF(err, error); } - inst(BINARY_SUBSCR_LIST_INT, (unused/4, list, sub -- res)) { + inst(BINARY_SUBSCR_LIST_INT, (unused/1, list, sub -- res)) { assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR); DEOPT_IF(!PyList_CheckExact(list), BINARY_SUBSCR); @@ -356,7 +356,7 @@ dummy_func( Py_DECREF(list); } - inst(BINARY_SUBSCR_TUPLE_INT, (unused/4, tuple, sub -- res)) { + inst(BINARY_SUBSCR_TUPLE_INT, (unused/1, tuple, sub -- res)) { assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR); DEOPT_IF(!PyTuple_CheckExact(tuple), BINARY_SUBSCR); @@ -373,7 +373,7 @@ dummy_func( Py_DECREF(tuple); } - inst(BINARY_SUBSCR_DICT, (unused/4, dict, sub -- res)) { + inst(BINARY_SUBSCR_DICT, (unused/1, dict, sub -- res)) { assert(cframe.use_tracing == 0); DEOPT_IF(!PyDict_CheckExact(dict), BINARY_SUBSCR); STAT_INC(BINARY_SUBSCR, hit); @@ -389,14 +389,16 @@ dummy_func( DECREF_INPUTS(); } - inst(BINARY_SUBSCR_GETITEM, (unused/1, type_version/2, func_version/1, container, sub -- unused)) { + inst(BINARY_SUBSCR_GETITEM, (unused/1, container, sub -- unused)) { PyTypeObject *tp = Py_TYPE(container); - DEOPT_IF(tp->tp_version_tag != type_version, BINARY_SUBSCR); - assert(tp->tp_flags & Py_TPFLAGS_HEAPTYPE); - PyObject *cached = ((PyHeapTypeObject *)tp)->_spec_cache.getitem; + DEOPT_IF(!PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE), BINARY_SUBSCR); + PyHeapTypeObject *ht = (PyHeapTypeObject *)tp; + PyObject *cached = ht->_spec_cache.getitem; + DEOPT_IF(cached == NULL, BINARY_SUBSCR); assert(PyFunction_Check(cached)); PyFunctionObject *getitem = (PyFunctionObject *)cached; - DEOPT_IF(getitem->func_version != func_version, BINARY_SUBSCR); + uint32_t cached_version = ht->_spec_cache.getitem_version; + DEOPT_IF(getitem->func_version != cached_version, BINARY_SUBSCR); PyCodeObject *code = (PyCodeObject *)getitem->func_code; assert(code->co_argcount == 2); DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize), BINARY_SUBSCR); diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index d793c1e23bc48e..d9c66343430fad 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -461,7 +461,7 @@ TARGET(BINARY_SUBSCR) { PREDICTED(BINARY_SUBSCR); - static_assert(INLINE_CACHE_ENTRIES_BINARY_SUBSCR == 4, "incorrect cache size"); + static_assert(INLINE_CACHE_ENTRIES_BINARY_SUBSCR == 1, "incorrect cache size"); PyObject *sub = stack_pointer[-1]; PyObject *container = stack_pointer[-2]; PyObject *res; @@ -486,7 +486,7 @@ #line 487 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 1; DISPATCH(); } @@ -559,7 +559,7 @@ #line 560 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 1; DISPATCH(); } @@ -585,7 +585,7 @@ #line 586 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 1; DISPATCH(); } @@ -614,23 +614,23 @@ Py_DECREF(sub); STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 1; DISPATCH(); } TARGET(BINARY_SUBSCR_GETITEM) { PyObject *sub = stack_pointer[-1]; PyObject *container = stack_pointer[-2]; - uint32_t type_version = read_u32(&next_instr[1].cache); - uint16_t func_version = read_u16(&next_instr[3].cache); #line 393 "Python/bytecodes.c" PyTypeObject *tp = Py_TYPE(container); - DEOPT_IF(tp->tp_version_tag != type_version, BINARY_SUBSCR); - assert(tp->tp_flags & Py_TPFLAGS_HEAPTYPE); - PyObject *cached = ((PyHeapTypeObject *)tp)->_spec_cache.getitem; + DEOPT_IF(!PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE), BINARY_SUBSCR); + PyHeapTypeObject *ht = (PyHeapTypeObject *)tp; + PyObject *cached = ht->_spec_cache.getitem; + DEOPT_IF(cached == NULL, BINARY_SUBSCR); assert(PyFunction_Check(cached)); PyFunctionObject *getitem = (PyFunctionObject *)cached; - DEOPT_IF(getitem->func_version != func_version, BINARY_SUBSCR); + uint32_t cached_version = ht->_spec_cache.getitem_version; + DEOPT_IF(getitem->func_version != cached_version, BINARY_SUBSCR); PyCodeObject *code = (PyCodeObject *)getitem->func_code; assert(code->co_argcount == 2); DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize), BINARY_SUBSCR); @@ -648,7 +648,7 @@ TARGET(LIST_APPEND) { PyObject *v = stack_pointer[-1]; PyObject *list = stack_pointer[-(2 + (oparg-1))]; - #line 414 "Python/bytecodes.c" + #line 416 "Python/bytecodes.c" if (_PyList_AppendTakeRef((PyListObject *)list, v) < 0) goto pop_1_error; #line 654 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -659,11 +659,11 @@ TARGET(SET_ADD) { PyObject *v = stack_pointer[-1]; PyObject *set = stack_pointer[-(2 + (oparg-1))]; - #line 419 "Python/bytecodes.c" + #line 421 "Python/bytecodes.c" int err = PySet_Add(set, v); #line 665 "Python/generated_cases.c.h" Py_DECREF(v); - #line 421 "Python/bytecodes.c" + #line 423 "Python/bytecodes.c" if (err) goto pop_1_error; #line 669 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -678,7 +678,7 @@ PyObject *container = stack_pointer[-2]; PyObject *v = stack_pointer[-3]; uint16_t counter = read_u16(&next_instr[0].cache); - #line 432 "Python/bytecodes.c" + #line 434 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION if (ADAPTIVE_COUNTER_IS_ZERO(counter)) { assert(cframe.use_tracing == 0); @@ -698,7 +698,7 @@ Py_DECREF(v); Py_DECREF(container); Py_DECREF(sub); - #line 448 "Python/bytecodes.c" + #line 450 "Python/bytecodes.c" if (err) goto pop_3_error; #line 704 "Python/generated_cases.c.h" STACK_SHRINK(3); @@ -710,7 +710,7 @@ PyObject *sub = stack_pointer[-1]; PyObject *list = stack_pointer[-2]; PyObject *value = stack_pointer[-3]; - #line 452 "Python/bytecodes.c" + #line 454 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(sub), STORE_SUBSCR); DEOPT_IF(!PyList_CheckExact(list), STORE_SUBSCR); @@ -738,7 +738,7 @@ PyObject *sub = stack_pointer[-1]; PyObject *dict = stack_pointer[-2]; PyObject *value = stack_pointer[-3]; - #line 472 "Python/bytecodes.c" + #line 474 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyDict_CheckExact(dict), STORE_SUBSCR); STAT_INC(STORE_SUBSCR, hit); @@ -754,13 +754,13 @@ TARGET(DELETE_SUBSCR) { PyObject *sub = stack_pointer[-1]; PyObject *container = stack_pointer[-2]; - #line 481 "Python/bytecodes.c" + #line 483 "Python/bytecodes.c" /* del container[sub] */ int err = PyObject_DelItem(container, sub); #line 761 "Python/generated_cases.c.h" Py_DECREF(container); Py_DECREF(sub); - #line 484 "Python/bytecodes.c" + #line 486 "Python/bytecodes.c" if (err) goto pop_2_error; #line 766 "Python/generated_cases.c.h" STACK_SHRINK(2); @@ -770,12 +770,12 @@ TARGET(CALL_INTRINSIC_1) { PyObject *value = stack_pointer[-1]; PyObject *res; - #line 488 "Python/bytecodes.c" + #line 490 "Python/bytecodes.c" assert(oparg <= MAX_INTRINSIC_1); res = _PyIntrinsics_UnaryFunctions[oparg](tstate, value); #line 777 "Python/generated_cases.c.h" Py_DECREF(value); - #line 491 "Python/bytecodes.c" + #line 493 "Python/bytecodes.c" if (res == NULL) goto pop_1_error; #line 781 "Python/generated_cases.c.h" stack_pointer[-1] = res; @@ -786,13 +786,13 @@ PyObject *value1 = stack_pointer[-1]; PyObject *value2 = stack_pointer[-2]; PyObject *res; - #line 495 "Python/bytecodes.c" + #line 497 "Python/bytecodes.c" assert(oparg <= MAX_INTRINSIC_2); res = _PyIntrinsics_BinaryFunctions[oparg](tstate, value2, value1); #line 793 "Python/generated_cases.c.h" Py_DECREF(value2); Py_DECREF(value1); - #line 498 "Python/bytecodes.c" + #line 500 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; #line 798 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -802,7 +802,7 @@ TARGET(RAISE_VARARGS) { PyObject **args = (stack_pointer - oparg); - #line 502 "Python/bytecodes.c" + #line 504 "Python/bytecodes.c" PyObject *cause = NULL, *exc = NULL; switch (oparg) { case 2: @@ -825,7 +825,7 @@ TARGET(INTERPRETER_EXIT) { PyObject *retval = stack_pointer[-1]; - #line 522 "Python/bytecodes.c" + #line 524 "Python/bytecodes.c" assert(frame == &entry_frame); assert(_PyFrame_IsIncomplete(frame)); STACK_SHRINK(1); // Since we're not going to DISPATCH() @@ -842,7 +842,7 @@ TARGET(RETURN_VALUE) { PyObject *retval = stack_pointer[-1]; - #line 536 "Python/bytecodes.c" + #line 538 "Python/bytecodes.c" STACK_SHRINK(1); assert(EMPTY()); _PyFrame_SetStackPointer(frame, stack_pointer); @@ -860,7 +860,7 @@ } TARGET(RETURN_CONST) { - #line 552 "Python/bytecodes.c" + #line 554 "Python/bytecodes.c" PyObject *retval = GETITEM(frame->f_code->co_consts, oparg); Py_INCREF(retval); assert(EMPTY()); @@ -881,7 +881,7 @@ TARGET(GET_AITER) { PyObject *obj = stack_pointer[-1]; PyObject *iter; - #line 569 "Python/bytecodes.c" + #line 571 "Python/bytecodes.c" unaryfunc getter = NULL; PyTypeObject *type = Py_TYPE(obj); @@ -896,14 +896,14 @@ type->tp_name); #line 898 "Python/generated_cases.c.h" Py_DECREF(obj); - #line 582 "Python/bytecodes.c" + #line 584 "Python/bytecodes.c" if (true) goto pop_1_error; } iter = (*getter)(obj); #line 905 "Python/generated_cases.c.h" Py_DECREF(obj); - #line 587 "Python/bytecodes.c" + #line 589 "Python/bytecodes.c" if (iter == NULL) goto pop_1_error; if (Py_TYPE(iter)->tp_as_async == NULL || @@ -924,7 +924,7 @@ TARGET(GET_ANEXT) { PyObject *aiter = stack_pointer[-1]; PyObject *awaitable; - #line 602 "Python/bytecodes.c" + #line 604 "Python/bytecodes.c" unaryfunc getter = NULL; PyObject *next_iter = NULL; PyTypeObject *type = Py_TYPE(aiter); @@ -979,7 +979,7 @@ PREDICTED(GET_AWAITABLE); PyObject *iterable = stack_pointer[-1]; PyObject *iter; - #line 649 "Python/bytecodes.c" + #line 651 "Python/bytecodes.c" iter = _PyCoro_GetAwaitableIter(iterable); if (iter == NULL) { @@ -988,7 +988,7 @@ #line 990 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 656 "Python/bytecodes.c" + #line 658 "Python/bytecodes.c" if (iter != NULL && PyCoro_CheckExact(iter)) { PyObject *yf = _PyGen_yf((PyGenObject*)iter); @@ -1017,7 +1017,7 @@ PyObject *v = stack_pointer[-1]; PyObject *receiver = stack_pointer[-2]; PyObject *retval; - #line 682 "Python/bytecodes.c" + #line 684 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PySendCache *cache = (_PySendCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -1062,7 +1062,7 @@ TARGET(SEND_GEN) { PyObject *v = stack_pointer[-1]; PyObject *receiver = stack_pointer[-2]; - #line 720 "Python/bytecodes.c" + #line 722 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyGenObject *gen = (PyGenObject *)receiver; DEOPT_IF(Py_TYPE(gen) != &PyGen_Type && @@ -1083,7 +1083,7 @@ TARGET(YIELD_VALUE) { PyObject *retval = stack_pointer[-1]; - #line 738 "Python/bytecodes.c" + #line 740 "Python/bytecodes.c" // NOTE: It's important that YIELD_VALUE never raises an exception! // The compiler treats any exception raised here as a failed close() // or throw() call. @@ -1107,7 +1107,7 @@ TARGET(POP_EXCEPT) { PyObject *exc_value = stack_pointer[-1]; - #line 759 "Python/bytecodes.c" + #line 761 "Python/bytecodes.c" _PyErr_StackItem *exc_info = tstate->exc_info; Py_XSETREF(exc_info->exc_value, exc_value); #line 1114 "Python/generated_cases.c.h" @@ -1118,7 +1118,7 @@ TARGET(RERAISE) { PyObject *exc = stack_pointer[-1]; PyObject **values = (stack_pointer - (1 + oparg)); - #line 764 "Python/bytecodes.c" + #line 766 "Python/bytecodes.c" assert(oparg >= 0 && oparg <= 2); if (oparg) { PyObject *lasti = values[0]; @@ -1142,13 +1142,13 @@ TARGET(END_ASYNC_FOR) { PyObject *exc = stack_pointer[-1]; PyObject *awaitable = stack_pointer[-2]; - #line 784 "Python/bytecodes.c" + #line 786 "Python/bytecodes.c" assert(exc && PyExceptionInstance_Check(exc)); if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) { #line 1149 "Python/generated_cases.c.h" Py_DECREF(awaitable); Py_DECREF(exc); - #line 787 "Python/bytecodes.c" + #line 789 "Python/bytecodes.c" } else { Py_INCREF(exc); @@ -1166,7 +1166,7 @@ PyObject *sub_iter = stack_pointer[-3]; PyObject *none; PyObject *value; - #line 796 "Python/bytecodes.c" + #line 798 "Python/bytecodes.c" assert(throwflag); assert(exc_value && PyExceptionInstance_Check(exc_value)); if (PyErr_GivenExceptionMatches(exc_value, PyExc_StopIteration)) { @@ -1175,7 +1175,7 @@ Py_DECREF(sub_iter); Py_DECREF(last_sent_val); Py_DECREF(exc_value); - #line 801 "Python/bytecodes.c" + #line 803 "Python/bytecodes.c" none = Py_NewRef(Py_None); } else { @@ -1191,7 +1191,7 @@ TARGET(LOAD_ASSERTION_ERROR) { PyObject *value; - #line 810 "Python/bytecodes.c" + #line 812 "Python/bytecodes.c" value = Py_NewRef(PyExc_AssertionError); #line 1197 "Python/generated_cases.c.h" STACK_GROW(1); @@ -1201,7 +1201,7 @@ TARGET(LOAD_BUILD_CLASS) { PyObject *bc; - #line 814 "Python/bytecodes.c" + #line 816 "Python/bytecodes.c" if (PyDict_CheckExact(BUILTINS())) { bc = _PyDict_GetItemWithError(BUILTINS(), &_Py_ID(__build_class__)); @@ -1231,7 +1231,7 @@ TARGET(STORE_NAME) { PyObject *v = stack_pointer[-1]; - #line 838 "Python/bytecodes.c" + #line 840 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); PyObject *ns = LOCALS(); int err; @@ -1240,7 +1240,7 @@ "no locals found when storing %R", name); #line 1242 "Python/generated_cases.c.h" Py_DECREF(v); - #line 845 "Python/bytecodes.c" + #line 847 "Python/bytecodes.c" if (true) goto pop_1_error; } if (PyDict_CheckExact(ns)) @@ -1249,7 +1249,7 @@ err = PyObject_SetItem(ns, name, v); #line 1251 "Python/generated_cases.c.h" Py_DECREF(v); - #line 852 "Python/bytecodes.c" + #line 854 "Python/bytecodes.c" if (err) goto pop_1_error; #line 1255 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -1257,7 +1257,7 @@ } TARGET(DELETE_NAME) { - #line 856 "Python/bytecodes.c" + #line 858 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); PyObject *ns = LOCALS(); int err; @@ -1282,7 +1282,7 @@ PREDICTED(UNPACK_SEQUENCE); static_assert(INLINE_CACHE_ENTRIES_UNPACK_SEQUENCE == 1, "incorrect cache size"); PyObject *seq = stack_pointer[-1]; - #line 882 "Python/bytecodes.c" + #line 884 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyUnpackSequenceCache *cache = (_PyUnpackSequenceCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -1298,7 +1298,7 @@ int res = unpack_iterable(tstate, seq, oparg, -1, top); #line 1300 "Python/generated_cases.c.h" Py_DECREF(seq); - #line 896 "Python/bytecodes.c" + #line 898 "Python/bytecodes.c" if (res == 0) goto pop_1_error; #line 1304 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -1310,7 +1310,7 @@ TARGET(UNPACK_SEQUENCE_TWO_TUPLE) { PyObject *seq = stack_pointer[-1]; PyObject **values = stack_pointer - (1); - #line 900 "Python/bytecodes.c" + #line 902 "Python/bytecodes.c" DEOPT_IF(!PyTuple_CheckExact(seq), UNPACK_SEQUENCE); DEOPT_IF(PyTuple_GET_SIZE(seq) != 2, UNPACK_SEQUENCE); assert(oparg == 2); @@ -1328,7 +1328,7 @@ TARGET(UNPACK_SEQUENCE_TUPLE) { PyObject *seq = stack_pointer[-1]; PyObject **values = stack_pointer - (1); - #line 910 "Python/bytecodes.c" + #line 912 "Python/bytecodes.c" DEOPT_IF(!PyTuple_CheckExact(seq), UNPACK_SEQUENCE); DEOPT_IF(PyTuple_GET_SIZE(seq) != oparg, UNPACK_SEQUENCE); STAT_INC(UNPACK_SEQUENCE, hit); @@ -1347,7 +1347,7 @@ TARGET(UNPACK_SEQUENCE_LIST) { PyObject *seq = stack_pointer[-1]; PyObject **values = stack_pointer - (1); - #line 921 "Python/bytecodes.c" + #line 923 "Python/bytecodes.c" DEOPT_IF(!PyList_CheckExact(seq), UNPACK_SEQUENCE); DEOPT_IF(PyList_GET_SIZE(seq) != oparg, UNPACK_SEQUENCE); STAT_INC(UNPACK_SEQUENCE, hit); @@ -1365,13 +1365,13 @@ TARGET(UNPACK_EX) { PyObject *seq = stack_pointer[-1]; - #line 932 "Python/bytecodes.c" + #line 934 "Python/bytecodes.c" int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8); PyObject **top = stack_pointer + totalargs - 1; int res = unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8, top); #line 1373 "Python/generated_cases.c.h" Py_DECREF(seq); - #line 936 "Python/bytecodes.c" + #line 938 "Python/bytecodes.c" if (res == 0) goto pop_1_error; #line 1377 "Python/generated_cases.c.h" STACK_GROW((oparg & 0xFF) + (oparg >> 8)); @@ -1384,7 +1384,7 @@ PyObject *owner = stack_pointer[-1]; PyObject *v = stack_pointer[-2]; uint16_t counter = read_u16(&next_instr[0].cache); - #line 947 "Python/bytecodes.c" + #line 949 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION if (ADAPTIVE_COUNTER_IS_ZERO(counter)) { assert(cframe.use_tracing == 0); @@ -1404,7 +1404,7 @@ #line 1405 "Python/generated_cases.c.h" Py_DECREF(v); Py_DECREF(owner); - #line 964 "Python/bytecodes.c" + #line 966 "Python/bytecodes.c" if (err) goto pop_2_error; #line 1410 "Python/generated_cases.c.h" STACK_SHRINK(2); @@ -1414,12 +1414,12 @@ TARGET(DELETE_ATTR) { PyObject *owner = stack_pointer[-1]; - #line 968 "Python/bytecodes.c" + #line 970 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); int err = PyObject_SetAttr(owner, name, (PyObject *)NULL); #line 1421 "Python/generated_cases.c.h" Py_DECREF(owner); - #line 971 "Python/bytecodes.c" + #line 973 "Python/bytecodes.c" if (err) goto pop_1_error; #line 1425 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -1428,12 +1428,12 @@ TARGET(STORE_GLOBAL) { PyObject *v = stack_pointer[-1]; - #line 975 "Python/bytecodes.c" + #line 977 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); int err = PyDict_SetItem(GLOBALS(), name, v); #line 1435 "Python/generated_cases.c.h" Py_DECREF(v); - #line 978 "Python/bytecodes.c" + #line 980 "Python/bytecodes.c" if (err) goto pop_1_error; #line 1439 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -1441,7 +1441,7 @@ } TARGET(DELETE_GLOBAL) { - #line 982 "Python/bytecodes.c" + #line 984 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); int err; err = PyDict_DelItem(GLOBALS(), name); @@ -1459,7 +1459,7 @@ TARGET(LOAD_NAME) { PyObject *v; - #line 996 "Python/bytecodes.c" + #line 998 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); PyObject *locals = LOCALS(); if (locals == NULL) { @@ -1529,7 +1529,7 @@ static_assert(INLINE_CACHE_ENTRIES_LOAD_GLOBAL == 4, "incorrect cache size"); PyObject *null = NULL; PyObject *v; - #line 1063 "Python/bytecodes.c" + #line 1065 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyLoadGlobalCache *cache = (_PyLoadGlobalCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -1596,7 +1596,7 @@ PyObject *res; uint16_t index = read_u16(&next_instr[1].cache); uint16_t version = read_u16(&next_instr[2].cache); - #line 1118 "Python/bytecodes.c" + #line 1120 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyDict_CheckExact(GLOBALS()), LOAD_GLOBAL); PyDictObject *dict = (PyDictObject *)GLOBALS(); @@ -1623,7 +1623,7 @@ uint16_t index = read_u16(&next_instr[1].cache); uint16_t mod_version = read_u16(&next_instr[2].cache); uint16_t bltn_version = read_u16(&next_instr[3].cache); - #line 1132 "Python/bytecodes.c" + #line 1134 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyDict_CheckExact(GLOBALS()), LOAD_GLOBAL); DEOPT_IF(!PyDict_CheckExact(BUILTINS()), LOAD_GLOBAL); @@ -1648,7 +1648,7 @@ } TARGET(DELETE_FAST) { - #line 1149 "Python/bytecodes.c" + #line 1151 "Python/bytecodes.c" PyObject *v = GETLOCAL(oparg); if (v == NULL) goto unbound_local_error; SETLOCAL(oparg, NULL); @@ -1657,7 +1657,7 @@ } TARGET(MAKE_CELL) { - #line 1155 "Python/bytecodes.c" + #line 1157 "Python/bytecodes.c" // "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); @@ -1671,7 +1671,7 @@ } TARGET(DELETE_DEREF) { - #line 1166 "Python/bytecodes.c" + #line 1168 "Python/bytecodes.c" PyObject *cell = GETLOCAL(oparg); PyObject *oldobj = PyCell_GET(cell); // Can't use ERROR_IF here. @@ -1688,7 +1688,7 @@ TARGET(LOAD_CLASSDEREF) { PyObject *value; - #line 1179 "Python/bytecodes.c" + #line 1181 "Python/bytecodes.c" PyObject *name, *locals = LOCALS(); assert(locals); assert(oparg >= 0 && oparg < frame->f_code->co_nlocalsplus); @@ -1728,7 +1728,7 @@ TARGET(LOAD_DEREF) { PyObject *value; - #line 1213 "Python/bytecodes.c" + #line 1215 "Python/bytecodes.c" PyObject *cell = GETLOCAL(oparg); value = PyCell_GET(cell); if (value == NULL) { @@ -1744,7 +1744,7 @@ TARGET(STORE_DEREF) { PyObject *v = stack_pointer[-1]; - #line 1223 "Python/bytecodes.c" + #line 1225 "Python/bytecodes.c" PyObject *cell = GETLOCAL(oparg); PyObject *oldobj = PyCell_GET(cell); PyCell_SET(cell, v); @@ -1755,7 +1755,7 @@ } TARGET(COPY_FREE_VARS) { - #line 1230 "Python/bytecodes.c" + #line 1232 "Python/bytecodes.c" /* Copy closure variables to free variables */ PyCodeObject *co = frame->f_code; assert(PyFunction_Check(frame->f_funcobj)); @@ -1773,13 +1773,13 @@ TARGET(BUILD_STRING) { PyObject **pieces = (stack_pointer - oparg); PyObject *str; - #line 1243 "Python/bytecodes.c" + #line 1245 "Python/bytecodes.c" str = _PyUnicode_JoinArray(&_Py_STR(empty), pieces, oparg); #line 1779 "Python/generated_cases.c.h" for (int _i = oparg; --_i >= 0;) { Py_DECREF(pieces[_i]); } - #line 1245 "Python/bytecodes.c" + #line 1247 "Python/bytecodes.c" if (str == NULL) { STACK_SHRINK(oparg); goto error; } #line 1785 "Python/generated_cases.c.h" STACK_SHRINK(oparg); @@ -1791,7 +1791,7 @@ TARGET(BUILD_TUPLE) { PyObject **values = (stack_pointer - oparg); PyObject *tup; - #line 1249 "Python/bytecodes.c" + #line 1251 "Python/bytecodes.c" tup = _PyTuple_FromArraySteal(values, oparg); if (tup == NULL) { STACK_SHRINK(oparg); goto error; } #line 1798 "Python/generated_cases.c.h" @@ -1804,7 +1804,7 @@ TARGET(BUILD_LIST) { PyObject **values = (stack_pointer - oparg); PyObject *list; - #line 1254 "Python/bytecodes.c" + #line 1256 "Python/bytecodes.c" list = _PyList_FromArraySteal(values, oparg); if (list == NULL) { STACK_SHRINK(oparg); goto error; } #line 1811 "Python/generated_cases.c.h" @@ -1817,7 +1817,7 @@ TARGET(LIST_EXTEND) { PyObject *iterable = stack_pointer[-1]; PyObject *list = stack_pointer[-(2 + (oparg-1))]; - #line 1259 "Python/bytecodes.c" + #line 1261 "Python/bytecodes.c" PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable); if (none_val == NULL) { if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) && @@ -1830,7 +1830,7 @@ } #line 1832 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 1270 "Python/bytecodes.c" + #line 1272 "Python/bytecodes.c" if (true) goto pop_1_error; } Py_DECREF(none_val); @@ -1843,11 +1843,11 @@ TARGET(SET_UPDATE) { PyObject *iterable = stack_pointer[-1]; PyObject *set = stack_pointer[-(2 + (oparg-1))]; - #line 1277 "Python/bytecodes.c" + #line 1279 "Python/bytecodes.c" int err = _PySet_Update(set, iterable); #line 1849 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 1279 "Python/bytecodes.c" + #line 1281 "Python/bytecodes.c" if (err < 0) goto pop_1_error; #line 1853 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -1857,7 +1857,7 @@ TARGET(BUILD_SET) { PyObject **values = (stack_pointer - oparg); PyObject *set; - #line 1283 "Python/bytecodes.c" + #line 1285 "Python/bytecodes.c" set = PySet_New(NULL); if (set == NULL) goto error; @@ -1882,7 +1882,7 @@ TARGET(BUILD_MAP) { PyObject **values = (stack_pointer - oparg*2); PyObject *map; - #line 1300 "Python/bytecodes.c" + #line 1302 "Python/bytecodes.c" map = _PyDict_FromItems( values, 2, values+1, 2, @@ -1894,7 +1894,7 @@ for (int _i = oparg*2; --_i >= 0;) { Py_DECREF(values[_i]); } - #line 1308 "Python/bytecodes.c" + #line 1310 "Python/bytecodes.c" if (map == NULL) { STACK_SHRINK(oparg*2); goto error; } #line 1900 "Python/generated_cases.c.h" STACK_SHRINK(oparg*2); @@ -1904,7 +1904,7 @@ } TARGET(SETUP_ANNOTATIONS) { - #line 1312 "Python/bytecodes.c" + #line 1314 "Python/bytecodes.c" int err; PyObject *ann_dict; if (LOCALS() == NULL) { @@ -1952,7 +1952,7 @@ PyObject *keys = stack_pointer[-1]; PyObject **values = (stack_pointer - (1 + oparg)); PyObject *map; - #line 1354 "Python/bytecodes.c" + #line 1356 "Python/bytecodes.c" if (!PyTuple_CheckExact(keys) || PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) { _PyErr_SetString(tstate, PyExc_SystemError, @@ -1967,7 +1967,7 @@ Py_DECREF(values[_i]); } Py_DECREF(keys); - #line 1364 "Python/bytecodes.c" + #line 1366 "Python/bytecodes.c" if (map == NULL) { STACK_SHRINK(oparg); goto pop_1_error; } #line 1973 "Python/generated_cases.c.h" STACK_SHRINK(oparg); @@ -1977,7 +1977,7 @@ TARGET(DICT_UPDATE) { PyObject *update = stack_pointer[-1]; - #line 1368 "Python/bytecodes.c" + #line 1370 "Python/bytecodes.c" PyObject *dict = PEEK(oparg + 1); // update is still on the stack if (PyDict_Update(dict, update) < 0) { if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { @@ -1987,7 +1987,7 @@ } #line 1989 "Python/generated_cases.c.h" Py_DECREF(update); - #line 1376 "Python/bytecodes.c" + #line 1378 "Python/bytecodes.c" if (true) goto pop_1_error; } #line 1994 "Python/generated_cases.c.h" @@ -1998,14 +1998,14 @@ TARGET(DICT_MERGE) { PyObject *update = stack_pointer[-1]; - #line 1382 "Python/bytecodes.c" + #line 1384 "Python/bytecodes.c" PyObject *dict = PEEK(oparg + 1); // update is still on the stack if (_PyDict_MergeEx(dict, update, 2) < 0) { format_kwargs_error(tstate, PEEK(3 + oparg), update); #line 2007 "Python/generated_cases.c.h" Py_DECREF(update); - #line 1387 "Python/bytecodes.c" + #line 1389 "Python/bytecodes.c" if (true) goto pop_1_error; } #line 2012 "Python/generated_cases.c.h" @@ -2018,7 +2018,7 @@ TARGET(MAP_ADD) { PyObject *value = stack_pointer[-1]; PyObject *key = stack_pointer[-2]; - #line 1394 "Python/bytecodes.c" + #line 1396 "Python/bytecodes.c" PyObject *dict = PEEK(oparg + 2); // key, value are still on the stack assert(PyDict_CheckExact(dict)); /* dict[key] = value */ @@ -2036,7 +2036,7 @@ PyObject *owner = stack_pointer[-1]; PyObject *res2 = NULL; PyObject *res; - #line 1417 "Python/bytecodes.c" + #line 1419 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyAttrCache *cache = (_PyAttrCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -2073,7 +2073,7 @@ */ #line 2075 "Python/generated_cases.c.h" Py_DECREF(owner); - #line 1452 "Python/bytecodes.c" + #line 1454 "Python/bytecodes.c" if (meth == NULL) goto pop_1_error; res2 = NULL; res = meth; @@ -2084,7 +2084,7 @@ res = PyObject_GetAttr(owner, name); #line 2086 "Python/generated_cases.c.h" Py_DECREF(owner); - #line 1461 "Python/bytecodes.c" + #line 1463 "Python/bytecodes.c" if (res == NULL) goto pop_1_error; } #line 2091 "Python/generated_cases.c.h" @@ -2101,7 +2101,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1466 "Python/bytecodes.c" + #line 1468 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); @@ -2130,7 +2130,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1483 "Python/bytecodes.c" + #line 1485 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyModule_CheckExact(owner), LOAD_ATTR); PyDictObject *dict = (PyDictObject *)((PyModuleObject *)owner)->md_dict; @@ -2159,7 +2159,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1500 "Python/bytecodes.c" + #line 1502 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); @@ -2202,7 +2202,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1531 "Python/bytecodes.c" + #line 1533 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); @@ -2228,7 +2228,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 1545 "Python/bytecodes.c" + #line 1547 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyType_Check(cls), LOAD_ATTR); @@ -2255,7 +2255,7 @@ uint32_t type_version = read_u32(&next_instr[1].cache); uint32_t func_version = read_u32(&next_instr[3].cache); PyObject *fget = read_obj(&next_instr[5].cache); - #line 1561 "Python/bytecodes.c" + #line 1563 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(tstate->interp->eval_frame, LOAD_ATTR); @@ -2287,7 +2287,7 @@ uint32_t type_version = read_u32(&next_instr[1].cache); uint32_t func_version = read_u32(&next_instr[3].cache); PyObject *getattribute = read_obj(&next_instr[5].cache); - #line 1587 "Python/bytecodes.c" + #line 1589 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(tstate->interp->eval_frame, LOAD_ATTR); PyTypeObject *cls = Py_TYPE(owner); @@ -2321,7 +2321,7 @@ PyObject *value = stack_pointer[-2]; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1615 "Python/bytecodes.c" + #line 1617 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); @@ -2351,7 +2351,7 @@ PyObject *value = stack_pointer[-2]; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t hint = read_u16(&next_instr[3].cache); - #line 1636 "Python/bytecodes.c" + #line 1638 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); @@ -2402,7 +2402,7 @@ PyObject *value = stack_pointer[-2]; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1678 "Python/bytecodes.c" + #line 1680 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); @@ -2425,7 +2425,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 1698 "Python/bytecodes.c" + #line 1700 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyCompareOpCache *cache = (_PyCompareOpCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -2442,7 +2442,7 @@ #line 2443 "Python/generated_cases.c.h" Py_DECREF(left); Py_DECREF(right); - #line 1712 "Python/bytecodes.c" + #line 1714 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; #line 2448 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -2455,7 +2455,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 1716 "Python/bytecodes.c" + #line 1718 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyFloat_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyFloat_CheckExact(right), COMPARE_OP); @@ -2479,7 +2479,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 1732 "Python/bytecodes.c" + #line 1734 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyLong_CheckExact(right), COMPARE_OP); @@ -2507,7 +2507,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 1752 "Python/bytecodes.c" + #line 1754 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyUnicode_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyUnicode_CheckExact(right), COMPARE_OP); @@ -2532,12 +2532,12 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *b; - #line 1768 "Python/bytecodes.c" + #line 1770 "Python/bytecodes.c" int res = Py_Is(left, right) ^ oparg; #line 2538 "Python/generated_cases.c.h" Py_DECREF(left); Py_DECREF(right); - #line 1770 "Python/bytecodes.c" + #line 1772 "Python/bytecodes.c" b = Py_NewRef(res ? Py_True : Py_False); #line 2543 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -2549,12 +2549,12 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *b; - #line 1774 "Python/bytecodes.c" + #line 1776 "Python/bytecodes.c" int res = PySequence_Contains(right, left); #line 2555 "Python/generated_cases.c.h" Py_DECREF(left); Py_DECREF(right); - #line 1776 "Python/bytecodes.c" + #line 1778 "Python/bytecodes.c" if (res < 0) goto pop_2_error; b = Py_NewRef((res^oparg) ? Py_True : Py_False); #line 2561 "Python/generated_cases.c.h" @@ -2568,12 +2568,12 @@ PyObject *exc_value = stack_pointer[-2]; PyObject *rest; PyObject *match; - #line 1781 "Python/bytecodes.c" + #line 1783 "Python/bytecodes.c" if (check_except_star_type_valid(tstate, match_type) < 0) { #line 2574 "Python/generated_cases.c.h" Py_DECREF(exc_value); Py_DECREF(match_type); - #line 1783 "Python/bytecodes.c" + #line 1785 "Python/bytecodes.c" if (true) goto pop_2_error; } @@ -2584,7 +2584,7 @@ #line 2585 "Python/generated_cases.c.h" Py_DECREF(exc_value); Py_DECREF(match_type); - #line 1791 "Python/bytecodes.c" + #line 1793 "Python/bytecodes.c" if (res < 0) goto pop_2_error; assert((match == NULL) == (rest == NULL)); @@ -2603,19 +2603,19 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *b; - #line 1802 "Python/bytecodes.c" + #line 1804 "Python/bytecodes.c" assert(PyExceptionInstance_Check(left)); if (check_except_type_valid(tstate, right) < 0) { #line 2610 "Python/generated_cases.c.h" Py_DECREF(right); - #line 1805 "Python/bytecodes.c" + #line 1807 "Python/bytecodes.c" if (true) goto pop_1_error; } int res = PyErr_GivenExceptionMatches(left, right); #line 2617 "Python/generated_cases.c.h" Py_DECREF(right); - #line 1810 "Python/bytecodes.c" + #line 1812 "Python/bytecodes.c" b = Py_NewRef(res ? Py_True : Py_False); #line 2621 "Python/generated_cases.c.h" stack_pointer[-1] = b; @@ -2626,13 +2626,13 @@ PyObject *fromlist = stack_pointer[-1]; PyObject *level = stack_pointer[-2]; PyObject *res; - #line 1814 "Python/bytecodes.c" + #line 1816 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); res = import_name(tstate, frame, name, fromlist, level); #line 2633 "Python/generated_cases.c.h" Py_DECREF(level); Py_DECREF(fromlist); - #line 1817 "Python/bytecodes.c" + #line 1819 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; #line 2638 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -2643,7 +2643,7 @@ TARGET(IMPORT_FROM) { PyObject *from = stack_pointer[-1]; PyObject *res; - #line 1821 "Python/bytecodes.c" + #line 1823 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); res = import_from(tstate, from, name); if (res == NULL) goto error; @@ -2654,7 +2654,7 @@ } TARGET(JUMP_FORWARD) { - #line 1827 "Python/bytecodes.c" + #line 1829 "Python/bytecodes.c" JUMPBY(oparg); #line 2660 "Python/generated_cases.c.h" DISPATCH(); @@ -2662,7 +2662,7 @@ TARGET(JUMP_BACKWARD) { PREDICTED(JUMP_BACKWARD); - #line 1831 "Python/bytecodes.c" + #line 1833 "Python/bytecodes.c" assert(oparg < INSTR_OFFSET()); JUMPBY(-oparg); #line 2669 "Python/generated_cases.c.h" @@ -2673,7 +2673,7 @@ TARGET(POP_JUMP_IF_FALSE) { PREDICTED(POP_JUMP_IF_FALSE); PyObject *cond = stack_pointer[-1]; - #line 1837 "Python/bytecodes.c" + #line 1839 "Python/bytecodes.c" if (Py_IsTrue(cond)) { _Py_DECREF_NO_DEALLOC(cond); } @@ -2685,7 +2685,7 @@ int err = PyObject_IsTrue(cond); #line 2687 "Python/generated_cases.c.h" Py_DECREF(cond); - #line 1847 "Python/bytecodes.c" + #line 1849 "Python/bytecodes.c" if (err == 0) { JUMPBY(oparg); } @@ -2700,7 +2700,7 @@ TARGET(POP_JUMP_IF_TRUE) { PyObject *cond = stack_pointer[-1]; - #line 1857 "Python/bytecodes.c" + #line 1859 "Python/bytecodes.c" if (Py_IsFalse(cond)) { _Py_DECREF_NO_DEALLOC(cond); } @@ -2712,7 +2712,7 @@ int err = PyObject_IsTrue(cond); #line 2714 "Python/generated_cases.c.h" Py_DECREF(cond); - #line 1867 "Python/bytecodes.c" + #line 1869 "Python/bytecodes.c" if (err > 0) { JUMPBY(oparg); } @@ -2727,11 +2727,11 @@ TARGET(POP_JUMP_IF_NOT_NONE) { PyObject *value = stack_pointer[-1]; - #line 1877 "Python/bytecodes.c" + #line 1879 "Python/bytecodes.c" if (!Py_IsNone(value)) { #line 2733 "Python/generated_cases.c.h" Py_DECREF(value); - #line 1879 "Python/bytecodes.c" + #line 1881 "Python/bytecodes.c" JUMPBY(oparg); } else { @@ -2744,7 +2744,7 @@ TARGET(POP_JUMP_IF_NONE) { PyObject *value = stack_pointer[-1]; - #line 1887 "Python/bytecodes.c" + #line 1889 "Python/bytecodes.c" if (Py_IsNone(value)) { _Py_DECREF_NO_DEALLOC(value); JUMPBY(oparg); @@ -2752,7 +2752,7 @@ else { #line 2754 "Python/generated_cases.c.h" Py_DECREF(value); - #line 1893 "Python/bytecodes.c" + #line 1895 "Python/bytecodes.c" } #line 2758 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -2760,7 +2760,7 @@ } TARGET(JUMP_BACKWARD_NO_INTERRUPT) { - #line 1897 "Python/bytecodes.c" + #line 1899 "Python/bytecodes.c" /* This bytecode is used in the `yield from` or `await` loop. * If there is an interrupt, we want it handled in the innermost * generator or coroutine, so we deliberately do not check it here. @@ -2774,7 +2774,7 @@ TARGET(GET_LEN) { PyObject *obj = stack_pointer[-1]; PyObject *len_o; - #line 1906 "Python/bytecodes.c" + #line 1908 "Python/bytecodes.c" // PUSH(len(TOS)) Py_ssize_t len_i = PyObject_Length(obj); if (len_i < 0) goto error; @@ -2791,7 +2791,7 @@ PyObject *type = stack_pointer[-2]; PyObject *subject = stack_pointer[-3]; PyObject *attrs; - #line 1914 "Python/bytecodes.c" + #line 1916 "Python/bytecodes.c" // Pop TOS and TOS1. Set TOS to a tuple of attributes on success, or // None on failure. assert(PyTuple_CheckExact(names)); @@ -2800,7 +2800,7 @@ Py_DECREF(subject); Py_DECREF(type); Py_DECREF(names); - #line 1919 "Python/bytecodes.c" + #line 1921 "Python/bytecodes.c" if (attrs) { assert(PyTuple_CheckExact(attrs)); // Success! } @@ -2817,7 +2817,7 @@ TARGET(MATCH_MAPPING) { PyObject *subject = stack_pointer[-1]; PyObject *res; - #line 1929 "Python/bytecodes.c" + #line 1931 "Python/bytecodes.c" int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING; res = Py_NewRef(match ? Py_True : Py_False); #line 2824 "Python/generated_cases.c.h" @@ -2830,7 +2830,7 @@ TARGET(MATCH_SEQUENCE) { PyObject *subject = stack_pointer[-1]; PyObject *res; - #line 1935 "Python/bytecodes.c" + #line 1937 "Python/bytecodes.c" int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE; res = Py_NewRef(match ? Py_True : Py_False); #line 2837 "Python/generated_cases.c.h" @@ -2844,7 +2844,7 @@ PyObject *keys = stack_pointer[-1]; PyObject *subject = stack_pointer[-2]; PyObject *values_or_none; - #line 1941 "Python/bytecodes.c" + #line 1943 "Python/bytecodes.c" // On successful match, PUSH(values). Otherwise, PUSH(None). values_or_none = match_keys(tstate, subject, keys); if (values_or_none == NULL) goto error; @@ -2857,12 +2857,12 @@ TARGET(GET_ITER) { PyObject *iterable = stack_pointer[-1]; PyObject *iter; - #line 1947 "Python/bytecodes.c" + #line 1949 "Python/bytecodes.c" /* before: [obj]; after [getiter(obj)] */ iter = PyObject_GetIter(iterable); #line 2864 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 1950 "Python/bytecodes.c" + #line 1952 "Python/bytecodes.c" if (iter == NULL) goto pop_1_error; #line 2868 "Python/generated_cases.c.h" stack_pointer[-1] = iter; @@ -2872,7 +2872,7 @@ TARGET(GET_YIELD_FROM_ITER) { PyObject *iterable = stack_pointer[-1]; PyObject *iter; - #line 1954 "Python/bytecodes.c" + #line 1956 "Python/bytecodes.c" /* before: [obj]; after [getiter(obj)] */ if (PyCoro_CheckExact(iterable)) { /* `iterable` is a coroutine */ @@ -2897,7 +2897,7 @@ } #line 2899 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 1977 "Python/bytecodes.c" + #line 1979 "Python/bytecodes.c" } #line 2903 "Python/generated_cases.c.h" stack_pointer[-1] = iter; @@ -2910,7 +2910,7 @@ static_assert(INLINE_CACHE_ENTRIES_FOR_ITER == 1, "incorrect cache size"); PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 1996 "Python/bytecodes.c" + #line 1998 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyForIterCache *cache = (_PyForIterCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -2953,7 +2953,7 @@ TARGET(FOR_ITER_LIST) { PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2031 "Python/bytecodes.c" + #line 2033 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(Py_TYPE(iter) != &PyListIter_Type, FOR_ITER); _PyListIterObject *it = (_PyListIterObject *)iter; @@ -2984,7 +2984,7 @@ TARGET(FOR_ITER_TUPLE) { PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2054 "Python/bytecodes.c" + #line 2056 "Python/bytecodes.c" assert(cframe.use_tracing == 0); _PyTupleIterObject *it = (_PyTupleIterObject *)iter; DEOPT_IF(Py_TYPE(it) != &PyTupleIter_Type, FOR_ITER); @@ -3015,7 +3015,7 @@ TARGET(FOR_ITER_RANGE) { PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2077 "Python/bytecodes.c" + #line 2079 "Python/bytecodes.c" assert(cframe.use_tracing == 0); _PyRangeIterObject *r = (_PyRangeIterObject *)iter; DEOPT_IF(Py_TYPE(r) != &PyRangeIter_Type, FOR_ITER); @@ -3043,7 +3043,7 @@ TARGET(FOR_ITER_GEN) { PyObject *iter = stack_pointer[-1]; - #line 2098 "Python/bytecodes.c" + #line 2100 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyGenObject *gen = (PyGenObject *)iter; DEOPT_IF(Py_TYPE(gen) != &PyGen_Type, FOR_ITER); @@ -3065,7 +3065,7 @@ PyObject *mgr = stack_pointer[-1]; PyObject *exit; PyObject *res; - #line 2115 "Python/bytecodes.c" + #line 2117 "Python/bytecodes.c" PyObject *enter = _PyObject_LookupSpecial(mgr, &_Py_ID(__aenter__)); if (enter == NULL) { if (!_PyErr_Occurred(tstate)) { @@ -3090,7 +3090,7 @@ } #line 3092 "Python/generated_cases.c.h" Py_DECREF(mgr); - #line 2138 "Python/bytecodes.c" + #line 2140 "Python/bytecodes.c" res = _PyObject_CallNoArgs(enter); Py_DECREF(enter); if (res == NULL) { @@ -3109,7 +3109,7 @@ PyObject *mgr = stack_pointer[-1]; PyObject *exit; PyObject *res; - #line 2148 "Python/bytecodes.c" + #line 2150 "Python/bytecodes.c" /* pop the context manager, push its __exit__ and the * value returned from calling its __enter__ */ @@ -3137,7 +3137,7 @@ } #line 3139 "Python/generated_cases.c.h" Py_DECREF(mgr); - #line 2174 "Python/bytecodes.c" + #line 2176 "Python/bytecodes.c" res = _PyObject_CallNoArgs(enter); Py_DECREF(enter); if (res == NULL) { @@ -3156,7 +3156,7 @@ PyObject *lasti = stack_pointer[-3]; PyObject *exit_func = stack_pointer[-4]; PyObject *res; - #line 2183 "Python/bytecodes.c" + #line 2185 "Python/bytecodes.c" /* At the top of the stack are 4 values: - val: TOP = exc_info() - unused: SECOND = previous exception @@ -3186,7 +3186,7 @@ TARGET(PUSH_EXC_INFO) { PyObject *new_exc = stack_pointer[-1]; PyObject *prev_exc; - #line 2206 "Python/bytecodes.c" + #line 2208 "Python/bytecodes.c" _PyErr_StackItem *exc_info = tstate->exc_info; if (exc_info->exc_value != NULL) { prev_exc = exc_info->exc_value; @@ -3210,7 +3210,7 @@ uint32_t type_version = read_u32(&next_instr[1].cache); uint32_t keys_version = read_u32(&next_instr[3].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 2218 "Python/bytecodes.c" + #line 2220 "Python/bytecodes.c" /* Cached method object */ assert(cframe.use_tracing == 0); PyTypeObject *self_cls = Py_TYPE(self); @@ -3242,7 +3242,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 2238 "Python/bytecodes.c" + #line 2240 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyTypeObject *self_cls = Py_TYPE(self); DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR); @@ -3267,7 +3267,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 2251 "Python/bytecodes.c" + #line 2253 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyTypeObject *self_cls = Py_TYPE(self); DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR); @@ -3291,7 +3291,7 @@ } TARGET(KW_NAMES) { - #line 2268 "Python/bytecodes.c" + #line 2270 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg < PyTuple_GET_SIZE(frame->f_code->co_consts)); kwnames = GETITEM(frame->f_code->co_consts, oparg); @@ -3306,7 +3306,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2304 "Python/bytecodes.c" + #line 2306 "Python/bytecodes.c" int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -3390,7 +3390,7 @@ TARGET(CALL_BOUND_METHOD_EXACT_ARGS) { PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; - #line 2382 "Python/bytecodes.c" + #line 2384 "Python/bytecodes.c" DEOPT_IF(method != NULL, CALL); DEOPT_IF(Py_TYPE(callable) != &PyMethod_Type, CALL); STAT_INC(CALL, hit); @@ -3409,7 +3409,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; uint32_t func_version = read_u32(&next_instr[1].cache); - #line 2394 "Python/bytecodes.c" + #line 2396 "Python/bytecodes.c" assert(kwnames == NULL); DEOPT_IF(tstate->interp->eval_frame, CALL); int is_meth = method != NULL; @@ -3443,7 +3443,7 @@ PyObject *method = stack_pointer[-(2 + oparg)]; uint32_t func_version = read_u32(&next_instr[1].cache); uint16_t min_args = read_u16(&next_instr[3].cache); - #line 2421 "Python/bytecodes.c" + #line 2423 "Python/bytecodes.c" assert(kwnames == NULL); DEOPT_IF(tstate->interp->eval_frame, CALL); int is_meth = method != NULL; @@ -3481,7 +3481,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2453 "Python/bytecodes.c" + #line 2455 "Python/bytecodes.c" assert(kwnames == NULL); assert(cframe.use_tracing == 0); assert(oparg == 1); @@ -3505,7 +3505,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2466 "Python/bytecodes.c" + #line 2468 "Python/bytecodes.c" assert(kwnames == NULL); assert(cframe.use_tracing == 0); assert(oparg == 1); @@ -3531,7 +3531,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2481 "Python/bytecodes.c" + #line 2483 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); @@ -3556,7 +3556,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2495 "Python/bytecodes.c" + #line 2497 "Python/bytecodes.c" int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -3592,7 +3592,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2520 "Python/bytecodes.c" + #line 2522 "Python/bytecodes.c" assert(cframe.use_tracing == 0); /* Builtin METH_O functions */ assert(kwnames == NULL); @@ -3635,7 +3635,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2552 "Python/bytecodes.c" + #line 2554 "Python/bytecodes.c" assert(cframe.use_tracing == 0); /* Builtin METH_FASTCALL functions, without keywords */ assert(kwnames == NULL); @@ -3682,7 +3682,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2588 "Python/bytecodes.c" + #line 2590 "Python/bytecodes.c" assert(cframe.use_tracing == 0); /* Builtin METH_FASTCALL | METH_KEYWORDS functions */ int is_meth = method != NULL; @@ -3729,7 +3729,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2624 "Python/bytecodes.c" + #line 2626 "Python/bytecodes.c" assert(cframe.use_tracing == 0); assert(kwnames == NULL); /* len(o) */ @@ -3768,7 +3768,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2652 "Python/bytecodes.c" + #line 2654 "Python/bytecodes.c" assert(cframe.use_tracing == 0); assert(kwnames == NULL); /* isinstance(o, o2) */ @@ -3808,7 +3808,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *self = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; - #line 2683 "Python/bytecodes.c" + #line 2685 "Python/bytecodes.c" assert(cframe.use_tracing == 0); assert(kwnames == NULL); assert(oparg == 1); @@ -3834,7 +3834,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2704 "Python/bytecodes.c" + #line 2706 "Python/bytecodes.c" assert(kwnames == NULL); int is_meth = method != NULL; int total_args = oparg; @@ -3878,7 +3878,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2738 "Python/bytecodes.c" + #line 2740 "Python/bytecodes.c" int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -3920,7 +3920,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2770 "Python/bytecodes.c" + #line 2772 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 0 || oparg == 1); int is_meth = method != NULL; @@ -3962,7 +3962,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2802 "Python/bytecodes.c" + #line 2804 "Python/bytecodes.c" assert(kwnames == NULL); int is_meth = method != NULL; int total_args = oparg; @@ -4005,7 +4005,7 @@ PyObject *callargs = stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))]; PyObject *func = stack_pointer[-(2 + ((oparg & 1) ? 1 : 0))]; PyObject *result; - #line 2833 "Python/bytecodes.c" + #line 2835 "Python/bytecodes.c" if (oparg & 1) { // DICT_MERGE is called before this opcode if there are kwargs. // It converts all dict subtypes in kwargs into regular dicts. @@ -4028,7 +4028,7 @@ Py_DECREF(func); Py_DECREF(callargs); Py_XDECREF(kwargs); - #line 2852 "Python/bytecodes.c" + #line 2854 "Python/bytecodes.c" assert(PEEK(3 + (oparg & 1)) == NULL); if (result == NULL) { STACK_SHRINK(((oparg & 1) ? 1 : 0)); goto pop_3_error; } @@ -4047,7 +4047,7 @@ PyObject *kwdefaults = (oparg & 0x02) ? stack_pointer[-(1 + ((oparg & 0x08) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0))] : NULL; PyObject *defaults = (oparg & 0x01) ? stack_pointer[-(1 + ((oparg & 0x08) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0) + ((oparg & 0x01) ? 1 : 0))] : NULL; PyObject *func; - #line 2863 "Python/bytecodes.c" + #line 2865 "Python/bytecodes.c" PyFunctionObject *func_obj = (PyFunctionObject *) PyFunction_New(codeobj, GLOBALS()); @@ -4083,7 +4083,7 @@ } TARGET(RETURN_GENERATOR) { - #line 2894 "Python/bytecodes.c" + #line 2896 "Python/bytecodes.c" assert(PyFunction_Check(frame->f_funcobj)); PyFunctionObject *func = (PyFunctionObject *)frame->f_funcobj; PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func); @@ -4112,13 +4112,13 @@ PyObject *stop = stack_pointer[-(1 + ((oparg == 3) ? 1 : 0))]; PyObject *start = stack_pointer[-(2 + ((oparg == 3) ? 1 : 0))]; PyObject *slice; - #line 2917 "Python/bytecodes.c" + #line 2919 "Python/bytecodes.c" slice = PySlice_New(start, stop, step); #line 4118 "Python/generated_cases.c.h" Py_DECREF(start); Py_DECREF(stop); Py_XDECREF(step); - #line 2919 "Python/bytecodes.c" + #line 2921 "Python/bytecodes.c" if (slice == NULL) { STACK_SHRINK(((oparg == 3) ? 1 : 0)); goto pop_2_error; } #line 4124 "Python/generated_cases.c.h" STACK_SHRINK(((oparg == 3) ? 1 : 0)); @@ -4131,7 +4131,7 @@ PyObject *fmt_spec = ((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? stack_pointer[-((((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0))] : NULL; PyObject *value = stack_pointer[-(1 + (((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0))]; PyObject *result; - #line 2923 "Python/bytecodes.c" + #line 2925 "Python/bytecodes.c" /* Handles f-string value formatting. */ PyObject *(*conv_fn)(PyObject *); int which_conversion = oparg & FVC_MASK; @@ -4175,7 +4175,7 @@ TARGET(COPY) { PyObject *bottom = stack_pointer[-(1 + (oparg-1))]; PyObject *top; - #line 2960 "Python/bytecodes.c" + #line 2962 "Python/bytecodes.c" assert(oparg > 0); top = Py_NewRef(bottom); #line 4182 "Python/generated_cases.c.h" @@ -4190,7 +4190,7 @@ PyObject *rhs = stack_pointer[-1]; PyObject *lhs = stack_pointer[-2]; PyObject *res; - #line 2965 "Python/bytecodes.c" + #line 2967 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyBinaryOpCache *cache = (_PyBinaryOpCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -4209,7 +4209,7 @@ #line 4210 "Python/generated_cases.c.h" Py_DECREF(lhs); Py_DECREF(rhs); - #line 2981 "Python/bytecodes.c" + #line 2983 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; #line 4215 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -4221,7 +4221,7 @@ TARGET(SWAP) { PyObject *top = stack_pointer[-1]; PyObject *bottom = stack_pointer[-(2 + (oparg-2))]; - #line 2986 "Python/bytecodes.c" + #line 2988 "Python/bytecodes.c" assert(oparg >= 2); #line 4227 "Python/generated_cases.c.h" stack_pointer[-1] = bottom; @@ -4230,7 +4230,7 @@ } TARGET(EXTENDED_ARG) { - #line 2990 "Python/bytecodes.c" + #line 2992 "Python/bytecodes.c" assert(oparg); assert(cframe.use_tracing == 0); opcode = next_instr->op.code; @@ -4241,7 +4241,7 @@ } TARGET(CACHE) { - #line 2999 "Python/bytecodes.c" + #line 3001 "Python/bytecodes.c" Py_UNREACHABLE(); #line 4247 "Python/generated_cases.c.h" } diff --git a/Python/opcode_metadata.h b/Python/opcode_metadata.h index 347a84dad46351..08032519f383ce 100644 --- a/Python/opcode_metadata.h +++ b/Python/opcode_metadata.h @@ -731,13 +731,13 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[256] = { [BINARY_OP_INPLACE_ADD_UNICODE] = { true, INSTR_FMT_IX }, [BINARY_OP_ADD_FLOAT] = { true, INSTR_FMT_IXC }, [BINARY_OP_ADD_INT] = { true, INSTR_FMT_IXC }, - [BINARY_SUBSCR] = { true, INSTR_FMT_IXC000 }, + [BINARY_SUBSCR] = { true, INSTR_FMT_IXC }, [BINARY_SLICE] = { true, INSTR_FMT_IX }, [STORE_SLICE] = { true, INSTR_FMT_IX }, - [BINARY_SUBSCR_LIST_INT] = { true, INSTR_FMT_IXC000 }, - [BINARY_SUBSCR_TUPLE_INT] = { true, INSTR_FMT_IXC000 }, - [BINARY_SUBSCR_DICT] = { true, INSTR_FMT_IXC000 }, - [BINARY_SUBSCR_GETITEM] = { true, INSTR_FMT_IXC000 }, + [BINARY_SUBSCR_LIST_INT] = { true, INSTR_FMT_IXC }, + [BINARY_SUBSCR_TUPLE_INT] = { true, INSTR_FMT_IXC }, + [BINARY_SUBSCR_DICT] = { true, INSTR_FMT_IXC }, + [BINARY_SUBSCR_GETITEM] = { true, INSTR_FMT_IXC }, [LIST_APPEND] = { true, INSTR_FMT_IB }, [SET_ADD] = { true, INSTR_FMT_IB }, [STORE_SUBSCR] = { true, INSTR_FMT_IXC }, diff --git a/Python/specialize.c b/Python/specialize.c index dd5b22dd2346c5..9187438d519b26 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -1330,16 +1330,16 @@ _Py_Specialize_BinarySubscr( SPECIALIZATION_FAIL(BINARY_SUBSCR, SPEC_FAIL_WRONG_NUMBER_ARGUMENTS); goto fail; } - assert(cls->tp_version_tag != 0); - write_u32(cache->type_version, cls->tp_version_tag); - int version = _PyFunction_GetVersionForCurrentState(func); - if (version == 0 || version != (uint16_t)version) { - SPECIALIZATION_FAIL(BINARY_SUBSCR, version == 0 ? - SPEC_FAIL_OUT_OF_VERSIONS : SPEC_FAIL_OUT_OF_RANGE); + uint32_t version = _PyFunction_GetVersionForCurrentState(func); + if (version == 0) { + SPECIALIZATION_FAIL(BINARY_SUBSCR, SPEC_FAIL_OUT_OF_VERSIONS); goto fail; } - cache->func_version = version; - ((PyHeapTypeObject *)container_type)->_spec_cache.getitem = descriptor; + PyHeapTypeObject *ht = (PyHeapTypeObject *)container_type; + // This pointer is invalidated by PyType_Modified (see the comment on + // struct _specialization_cache): + ht->_spec_cache.getitem = descriptor; + ht->_spec_cache.getitem_version = version; instr->op.code = BINARY_SUBSCR_GETITEM; goto success; } From dcd6f226d6596b25b6f4004058a67acabe012120 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Wed, 29 Mar 2023 17:15:43 -0600 Subject: [PATCH 017/349] gh-100227: Make the Global PyModuleDef Cache Safe for Isolated Interpreters (gh-103084) Sharing mutable (or non-immortal) objects between interpreters is generally not safe. We can work around that but not easily. There are two restrictions that are critical for objects that break interpreter isolation. The first is that the object's state be guarded by a global lock. For now the GIL meets this requirement, but a granular global lock is needed once we have a per-interpreter GIL. The second restriction is that the object (and, for a container, its items) be deallocated/resized only when the interpreter in which it was allocated is the current one. This is because every interpreter has (or will have, see gh-101660) its own object allocator. Deallocating an object with a different allocator can cause crashes. The dict for the cache of module defs is completely internal, which simplifies what we have to do to meet those requirements. To do so, we do the following: * add a mechanism for re-using a temporary thread state tied to the main interpreter in an arbitrary thread * add _PyRuntime.imports.extensions.main_tstate` * add _PyThreadState_InitDetached() and _PyThreadState_ClearDetached() (pystate.c) * add _PyThreadState_BindDetached() and _PyThreadState_UnbindDetached() (pystate.c) * make sure the cache dict (_PyRuntime.imports.extensions.dict) and its items are all owned by the main interpreter) * add a placeholder using for a granular global lock Note that the cache is only used for legacy extension modules and not for multi-phase init modules. https://github.com/python/cpython/issues/100227 --- Include/internal/pycore_import.h | 20 ++- Include/internal/pycore_pystate.h | 5 + Include/internal/pycore_runtime_init.h | 5 + Python/import.c | 175 ++++++++++++++++++++----- Python/pystate.c | 128 ++++++++++++++---- 5 files changed, 274 insertions(+), 59 deletions(-) diff --git a/Include/internal/pycore_import.h b/Include/internal/pycore_import.h index 69ed6273b7e609..7a78a91aa617e6 100644 --- a/Include/internal/pycore_import.h +++ b/Include/internal/pycore_import.h @@ -14,13 +14,19 @@ struct _import_runtime_state { which is just about every time an extension module is imported. See PyInterpreterState.modules_by_index for more info. */ Py_ssize_t last_module_index; - /* A dict mapping (filename, name) to PyModuleDef for modules. - Only legacy (single-phase init) extension modules are added - and only if they support multiple initialization (m_size >- 0) - or are imported in the main interpreter. - This is initialized lazily in _PyImport_FixupExtensionObject(). - Modules are added there and looked up in _imp.find_extension(). */ - PyObject *extensions; + struct { + /* A thread state tied to the main interpreter, + used exclusively for when the extensions dict is access/modified + from an arbitrary thread. */ + PyThreadState main_tstate; + /* A dict mapping (filename, name) to PyModuleDef for modules. + Only legacy (single-phase init) extension modules are added + and only if they support multiple initialization (m_size >- 0) + or are imported in the main interpreter. + This is initialized lazily in _PyImport_FixupExtensionObject(). + Modules are added there and looked up in _imp.find_extension(). */ + PyObject *dict; + } extensions; /* Package context -- the full module name for package imports */ const char * pkgcontext; }; diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 7046ec8d9adaaf..b5408622d9d4b2 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -127,6 +127,11 @@ PyAPI_FUNC(void) _PyThreadState_Init( PyThreadState *tstate); PyAPI_FUNC(void) _PyThreadState_DeleteExcept(PyThreadState *tstate); +extern void _PyThreadState_InitDetached(PyThreadState *, PyInterpreterState *); +extern void _PyThreadState_ClearDetached(PyThreadState *); +extern void _PyThreadState_BindDetached(PyThreadState *); +extern void _PyThreadState_UnbindDetached(PyThreadState *); + static inline void _PyThreadState_UpdateTracingState(PyThreadState *tstate) diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h index 7cfa7c0c02494a..5b09a45e41cd84 100644 --- a/Include/internal/pycore_runtime_init.h +++ b/Include/internal/pycore_runtime_init.h @@ -41,6 +41,11 @@ extern PyTypeObject _PyExc_MemoryError; in accordance with the specification. */ \ .autoTSSkey = Py_tss_NEEDS_INIT, \ .parser = _parser_runtime_state_INIT, \ + .imports = { \ + .extensions = { \ + .main_tstate = _PyThreadState_INIT, \ + }, \ + }, \ .ceval = { \ .perf = _PyEval_RUNTIME_PERF_INIT, \ }, \ diff --git a/Python/import.c b/Python/import.c index c68bd1f7db420d..a45b3bfaacb252 100644 --- a/Python/import.c +++ b/Python/import.c @@ -862,6 +862,18 @@ Generally, when multiple interpreters are involved, some of the above gets even messier. */ +static inline void +extensions_lock_acquire(void) +{ + // XXX For now the GIL is sufficient. +} + +static inline void +extensions_lock_release(void) +{ + // XXX For now the GIL is sufficient. +} + /* Magic for extension modules (built-in as well as dynamically loaded). To prevent initializing an extension module more than once, we keep a static dictionary 'extensions' keyed by the tuple @@ -878,71 +890,170 @@ gets even messier. dictionary, to avoid loading shared libraries twice. */ +static void +_extensions_cache_init(void) +{ + /* The runtime (i.e. main interpreter) must be initializing, + so we don't need to worry about the lock. */ + _PyThreadState_InitDetached(&EXTENSIONS.main_tstate, + _PyInterpreterState_Main()); +} + static PyModuleDef * _extensions_cache_get(PyObject *filename, PyObject *name) { - PyObject *extensions = EXTENSIONS; - if (extensions == NULL) { - return NULL; - } + PyModuleDef *def = NULL; + extensions_lock_acquire(); + PyObject *key = PyTuple_Pack(2, filename, name); if (key == NULL) { - return NULL; + goto finally; + } + + PyObject *extensions = EXTENSIONS.dict; + if (extensions == NULL) { + goto finally; } - PyModuleDef *def = (PyModuleDef *)PyDict_GetItemWithError(extensions, key); - Py_DECREF(key); + def = (PyModuleDef *)PyDict_GetItemWithError(extensions, key); + +finally: + Py_XDECREF(key); + extensions_lock_release(); return def; } static int _extensions_cache_set(PyObject *filename, PyObject *name, PyModuleDef *def) { - PyObject *extensions = EXTENSIONS; + int res = -1; + PyThreadState *oldts = NULL; + extensions_lock_acquire(); + + /* Swap to the main interpreter, if necessary. This matters if + the dict hasn't been created yet or if the item isn't in the + dict yet. In both cases we must ensure the relevant objects + are created using the main interpreter. */ + PyThreadState *main_tstate = &EXTENSIONS.main_tstate; + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (!_Py_IsMainInterpreter(interp)) { + _PyThreadState_BindDetached(main_tstate); + oldts = _PyThreadState_Swap(interp->runtime, main_tstate); + assert(!_Py_IsMainInterpreter(oldts->interp)); + + /* Make sure the name and filename objects are owned + by the main interpreter. */ + name = PyUnicode_InternFromString(PyUnicode_AsUTF8(name)); + assert(name != NULL); + filename = PyUnicode_InternFromString(PyUnicode_AsUTF8(filename)); + assert(filename != NULL); + } + + PyObject *key = PyTuple_Pack(2, filename, name); + if (key == NULL) { + goto finally; + } + + PyObject *extensions = EXTENSIONS.dict; if (extensions == NULL) { extensions = PyDict_New(); if (extensions == NULL) { - return -1; + goto finally; } - EXTENSIONS = extensions; + EXTENSIONS.dict = extensions; } - PyObject *key = PyTuple_Pack(2, filename, name); - if (key == NULL) { - return -1; + + PyModuleDef *actual = (PyModuleDef *)PyDict_GetItemWithError(extensions, key); + if (PyErr_Occurred()) { + goto finally; + } + else if (actual != NULL) { + /* We expect it to be static, so it must be the same pointer. */ + assert(def == actual); + res = 0; + goto finally; } - int res = PyDict_SetItem(extensions, key, (PyObject *)def); - Py_DECREF(key); + + /* This might trigger a resize, which is why we must switch + to the main interpreter. */ + res = PyDict_SetItem(extensions, key, (PyObject *)def); if (res < 0) { - return -1; + res = -1; + goto finally; } - return 0; + res = 0; + +finally: + if (oldts != NULL) { + _PyThreadState_Swap(interp->runtime, oldts); + _PyThreadState_UnbindDetached(main_tstate); + Py_DECREF(name); + Py_DECREF(filename); + } + Py_XDECREF(key); + extensions_lock_release(); + return res; } static int _extensions_cache_delete(PyObject *filename, PyObject *name) { - PyObject *extensions = EXTENSIONS; - if (extensions == NULL) { - return 0; - } + int res = -1; + PyThreadState *oldts = NULL; + extensions_lock_acquire(); + PyObject *key = PyTuple_Pack(2, filename, name); if (key == NULL) { - return -1; + goto finally; + } + + PyObject *extensions = EXTENSIONS.dict; + if (extensions == NULL) { + res = 0; + goto finally; } + + PyModuleDef *actual = (PyModuleDef *)PyDict_GetItemWithError(extensions, key); + if (PyErr_Occurred()) { + goto finally; + } + else if (actual == NULL) { + /* It was already removed or never added. */ + res = 0; + goto finally; + } + + /* Swap to the main interpreter, if necessary. */ + PyThreadState *main_tstate = &EXTENSIONS.main_tstate; + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (!_Py_IsMainInterpreter(interp)) { + _PyThreadState_BindDetached(main_tstate); + oldts = _PyThreadState_Swap(interp->runtime, main_tstate); + assert(!_Py_IsMainInterpreter(oldts->interp)); + } + if (PyDict_DelItem(extensions, key) < 0) { - if (!PyErr_ExceptionMatches(PyExc_KeyError)) { - Py_DECREF(key); - return -1; - } - PyErr_Clear(); + goto finally; } - Py_DECREF(key); - return 0; + res = 0; + +finally: + if (oldts != NULL) { + _PyThreadState_Swap(interp->runtime, oldts); + _PyThreadState_UnbindDetached(main_tstate); + } + Py_XDECREF(key); + extensions_lock_release(); + return res; } static void _extensions_cache_clear_all(void) { - Py_CLEAR(EXTENSIONS); + /* The runtime (i.e. main interpreter) must be finalizing, + so we don't need to worry about the lock. */ + // XXX assert(_Py_IsMainInterpreter(_PyInterpreterState_GET())); + Py_CLEAR(EXTENSIONS.dict); + _PyThreadState_ClearDetached(&EXTENSIONS.main_tstate); } @@ -2941,6 +3052,10 @@ _PyImport_Fini2(void) PyStatus _PyImport_InitCore(PyThreadState *tstate, PyObject *sysmod, int importlib) { + if (_Py_IsMainInterpreter(tstate->interp)) { + _extensions_cache_init(); + } + // XXX Initialize here: interp->modules and interp->import_func. // XXX Initialize here: sys.modules and sys.meta_path. diff --git a/Python/pystate.c b/Python/pystate.c index b17efdbefd124c..1e59a8c5f89717 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1217,8 +1217,7 @@ free_threadstate(PyThreadState *tstate) static void init_threadstate(PyThreadState *tstate, - PyInterpreterState *interp, uint64_t id, - PyThreadState *next) + PyInterpreterState *interp, uint64_t id) { if (tstate->_status.initialized) { Py_FatalError("thread state already initialized"); @@ -1227,18 +1226,13 @@ init_threadstate(PyThreadState *tstate, assert(interp != NULL); tstate->interp = interp; + // next/prev are set in add_threadstate(). + assert(tstate->next == NULL); + assert(tstate->prev == NULL); + assert(id > 0); tstate->id = id; - assert(interp->threads.head == tstate); - assert((next != NULL && id != 1) || (next == NULL && id == 1)); - if (next != NULL) { - assert(next->prev == NULL || next->prev == tstate); - next->prev = tstate; - } - tstate->next = next; - assert(tstate->prev == NULL); - // thread_id and native_thread_id are set in bind_tstate(). tstate->py_recursion_limit = interp->ceval.recursion_limit, @@ -1259,6 +1253,22 @@ init_threadstate(PyThreadState *tstate, tstate->_status.initialized = 1; } +static void +add_threadstate(PyInterpreterState *interp, PyThreadState *tstate, + PyThreadState *next) +{ + assert(interp->threads.head != tstate); + assert((next != NULL && tstate->id != 1) || + (next == NULL && tstate->id == 1)); + if (next != NULL) { + assert(next->prev == NULL || next->prev == tstate); + next->prev = tstate; + } + tstate->next = next; + assert(tstate->prev == NULL); + interp->threads.head = tstate; +} + static PyThreadState * new_threadstate(PyInterpreterState *interp) { @@ -1298,9 +1308,9 @@ new_threadstate(PyInterpreterState *interp) &initial._main_interpreter._initial_thread, sizeof(*tstate)); } - interp->threads.head = tstate; - init_threadstate(tstate, interp, id, old_head); + init_threadstate(tstate, interp, id); + add_threadstate(interp, tstate, old_head); HEAD_UNLOCK(runtime); if (!used_newtstate) { @@ -1347,6 +1357,19 @@ _PyThreadState_Init(PyThreadState *tstate) Py_FatalError("_PyThreadState_Init() is for internal use only"); } + +static void +clear_datastack(PyThreadState *tstate) +{ + _PyStackChunk *chunk = tstate->datastack_chunk; + tstate->datastack_chunk = NULL; + while (chunk != NULL) { + _PyStackChunk *prev = chunk->previous; + _PyObject_VirtualFree(chunk, chunk->size); + chunk = prev; + } +} + void PyThreadState_Clear(PyThreadState *tstate) { @@ -1421,7 +1444,6 @@ PyThreadState_Clear(PyThreadState *tstate) // XXX Do it as early in the function as possible. } - /* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */ static void tstate_delete_common(PyThreadState *tstate) @@ -1454,18 +1476,11 @@ tstate_delete_common(PyThreadState *tstate) unbind_tstate(tstate); // XXX Move to PyThreadState_Clear()? - _PyStackChunk *chunk = tstate->datastack_chunk; - tstate->datastack_chunk = NULL; - while (chunk != NULL) { - _PyStackChunk *prev = chunk->previous; - _PyObject_VirtualFree(chunk, chunk->size); - chunk = prev; - } + clear_datastack(tstate); tstate->_status.finalized = 1; } - static void zapthreads(PyInterpreterState *interp) { @@ -1552,6 +1567,75 @@ _PyThreadState_DeleteExcept(PyThreadState *tstate) } +//------------------------- +// "detached" thread states +//------------------------- + +void +_PyThreadState_InitDetached(PyThreadState *tstate, PyInterpreterState *interp) +{ + _PyRuntimeState *runtime = interp->runtime; + + HEAD_LOCK(runtime); + interp->threads.next_unique_id += 1; + uint64_t id = interp->threads.next_unique_id; + HEAD_UNLOCK(runtime); + + init_threadstate(tstate, interp, id); + // We do not call add_threadstate(). +} + +void +_PyThreadState_ClearDetached(PyThreadState *tstate) +{ + assert(!tstate->_status.bound); + assert(!tstate->_status.bound_gilstate); + assert(tstate->datastack_chunk == NULL); + assert(tstate->thread_id == 0); + assert(tstate->native_thread_id == 0); + assert(tstate->next == NULL); + assert(tstate->prev == NULL); + + PyThreadState_Clear(tstate); + clear_datastack(tstate); +} + +void +_PyThreadState_BindDetached(PyThreadState *tstate) +{ + assert(!_Py_IsMainInterpreter( + current_fast_get(tstate->interp->runtime)->interp)); + assert(_Py_IsMainInterpreter(tstate->interp)); + bind_tstate(tstate); + /* Unlike _PyThreadState_Bind(), we do not modify gilstate TSS. */ +} + +void +_PyThreadState_UnbindDetached(PyThreadState *tstate) +{ + assert(!_Py_IsMainInterpreter( + current_fast_get(tstate->interp->runtime)->interp)); + assert(_Py_IsMainInterpreter(tstate->interp)); + assert(tstate_is_alive(tstate)); + assert(!tstate->_status.active); + assert(gilstate_tss_get(tstate->interp->runtime) != tstate); + + unbind_tstate(tstate); + + /* This thread state may be bound/unbound repeatedly, + so we must erase evidence that it was ever bound (or unbound). */ + tstate->_status.bound = 0; + tstate->_status.unbound = 0; + + /* We must fully unlink the thread state from any OS thread, + to allow it to be bound more than once. */ + tstate->thread_id = 0; +#ifdef PY_HAVE_THREAD_NATIVE_ID + tstate->native_thread_id = 0; +#endif +} + + //---------- // accessors //---------- From fda95aa19447fe444ac2670afbf98ec42aca0c6f Mon Sep 17 00:00:00 2001 From: Shantanu <12621235+hauntsaninja@users.noreply.github.com> Date: Thu, 30 Mar 2023 01:32:09 -0700 Subject: [PATCH 018/349] gh-103099: Link mypy docs from typing.rst (#103100) --- Doc/library/typing.rst | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 08ffa0310f0f23..384458d3aa6618 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -41,10 +41,17 @@ For a summary of deprecated features and a deprecation timeline, please see .. seealso:: + For a quick overview of type hints, refer to + `this cheat sheet `_. + + The "Type System Reference" section of https://mypy.readthedocs.io/ -- since + the Python typing system is standardised via PEPs, this reference should + broadly apply to most Python type checkers, although some parts may still be + specific to mypy. + The documentation at https://typing.readthedocs.io/ serves as useful reference for type system features, useful typing related tools and typing best practices. - .. _relevant-peps: Relevant PEPs From 21e9de3bf0ecf32cd61296009518bfb9fdfcd04f Mon Sep 17 00:00:00 2001 From: "Jeong, YunWon" <69878+youknowone@users.noreply.github.com> Date: Fri, 31 Mar 2023 01:23:43 +0900 Subject: [PATCH 019/349] gh-103085: Fix python locale.getencoding not to emit deprecation warning (gh-103086) --- Lib/locale.py | 4 +++- .../Library/2023-03-28-15-12-53.gh-issue-103085.DqNehf.rst | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2023-03-28-15-12-53.gh-issue-103085.DqNehf.rst diff --git a/Lib/locale.py b/Lib/locale.py index c2c7a04b280708..4127d917465936 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -545,7 +545,9 @@ def getdefaultlocale(envvars=('LC_ALL', 'LC_CTYPE', 'LANG', 'LANGUAGE')): "Use setlocale(), getencoding() and getlocale() instead", DeprecationWarning, stacklevel=2 ) + return _getdefaultlocale(envvars) +def _getdefaultlocale(envvars=('LC_ALL', 'LC_CTYPE', 'LANG', 'LANGUAGE')): try: # check if it's supported by the _locale module import _locale @@ -639,7 +641,7 @@ def getencoding(): # On Android langinfo.h and CODESET are missing, and UTF-8 is # always used in mbstowcs() and wcstombs(). return 'utf-8' - encoding = getdefaultlocale()[1] + encoding = _getdefaultlocale()[1] if encoding is None: # LANG not set, default to UTF-8 encoding = 'utf-8' diff --git a/Misc/NEWS.d/next/Library/2023-03-28-15-12-53.gh-issue-103085.DqNehf.rst b/Misc/NEWS.d/next/Library/2023-03-28-15-12-53.gh-issue-103085.DqNehf.rst new file mode 100644 index 00000000000000..fa07fa5226c06a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-03-28-15-12-53.gh-issue-103085.DqNehf.rst @@ -0,0 +1 @@ +Pure python :func:`locale.getencoding()` will not warn deprecation. From f192a558f538489ad1be30aa145e71d942798d1c Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Thu, 30 Mar 2023 21:03:50 +0300 Subject: [PATCH 020/349] gh-101100: Fix Sphinx warning in gc.rst and refactor docs clean list (#103116) Co-authored-by: C.A.M. Gerlach --- .github/workflows/doc.yml | 3 +-- Doc/library/gc.rst | 2 +- Doc/tools/clean-files.txt | 10 ++++++++++ Doc/tools/touch-clean-files.py | 20 ++++++++++++++++++++ 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 Doc/tools/clean-files.txt create mode 100644 Doc/tools/touch-clean-files.py diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 29387d30d5a22f..314a7da647ff70 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -72,8 +72,7 @@ jobs: - name: 'Build known-good files in nit-picky mode' run: | # Mark files that must pass nit-picky - touch Doc/whatsnew/3.12.rst - touch Doc/library/sqlite3.rst + python Doc/tools/touch-clean-files.py # Build docs with the '-n' (nit-picky) option, convert warnings to errors (-W) make -C Doc/ PYTHON=../python SPHINXOPTS="-q -n -W --keep-going" html 2>&1 diff --git a/Doc/library/gc.rst b/Doc/library/gc.rst index 69a1a8313b7593..832ebaf497f37a 100644 --- a/Doc/library/gc.rst +++ b/Doc/library/gc.rst @@ -251,7 +251,7 @@ values but should not rebind them): are printed. .. versionchanged:: 3.4 - Following :pep:`442`, objects with a :meth:`__del__` method don't end + Following :pep:`442`, objects with a :meth:`~object.__del__` method don't end up in :attr:`gc.garbage` anymore. .. data:: callbacks diff --git a/Doc/tools/clean-files.txt b/Doc/tools/clean-files.txt new file mode 100644 index 00000000000000..a6197998f504fa --- /dev/null +++ b/Doc/tools/clean-files.txt @@ -0,0 +1,10 @@ +# These files must pass Sphinx nit-picky mode, as tested on the CI +# via touch-clean-files.py in doc.yml. +# Add blank lines between files and keep them sorted lexicographically +# to help avoid merge conflicts. + +Doc/library/gc.rst + +Doc/library/sqlite3.rst + +Doc/whatsnew/3.12.rst diff --git a/Doc/tools/touch-clean-files.py b/Doc/tools/touch-clean-files.py new file mode 100644 index 00000000000000..07f3e509a09fb5 --- /dev/null +++ b/Doc/tools/touch-clean-files.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 +""" +Touch files that must pass Sphinx nit-picky mode +so they are rebuilt and we can catch regressions. +""" + +from pathlib import Path + +# Input file has blank line between entries to reduce merge conflicts +with Path("Doc/tools/clean-files.txt").open() as clean_files: + CLEAN = [ + Path(filename.strip()) + for filename in clean_files + if filename.strip() and not filename.startswith("#") + ] + +print("Touching:") +for filename in CLEAN: + print(filename) + filename.touch() From ecc5441505cd7cb54f3d38409c732e2e9f102137 Mon Sep 17 00:00:00 2001 From: Brian Haley Date: Thu, 30 Mar 2023 14:40:58 -0400 Subject: [PATCH 021/349] Add IPv6 into to the docstring for socket.getsockname (#102961) Signed-off-by: Brian Haley --- Modules/socketmodule.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 6a6f8cf7392e1c..c2b8283d84e5f8 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -3538,7 +3538,8 @@ PyDoc_STRVAR(getsockname_doc, \n\ Return the address of the local endpoint. The format depends on the\n\ address family. For IPv4 sockets, the address info is a pair\n\ -(hostaddr, port)."); +(hostaddr, port). For IPv6 sockets, the address info is a 4-tuple\n\ +(hostaddr, port, flowinfo, scope_id)."); #endif From 01a49d17454b9072a0c46b550573ea430048684a Mon Sep 17 00:00:00 2001 From: Missoupro <80458944+Missoupro@users.noreply.github.com> Date: Thu, 30 Mar 2023 21:49:07 +0100 Subject: [PATCH 022/349] gh-102110: Add all tools description missed (GH-102625) Added missing descriptions of some tools. Automerge-Triggered-By: GH:hugovk --- Tools/README | 25 ++++++++++++++++++++++++- Tools/scripts/README | 10 ++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/Tools/README b/Tools/README index 04612b8013db92..e51624f453c5bb 100644 --- a/Tools/README +++ b/Tools/README @@ -1,10 +1,21 @@ This directory contains a number of Python programs that are useful while building or extending Python. +build Automatically generated directory by the build system + contain build artifacts and intermediate files. + buildbot Batchfiles for running on Windows buildbot workers. +c-analyzer Tools to check no new global variables have been added. + +cases_generator Tooling to generate interpreters. + ccbench A Python threads-based concurrency benchmark. (*) +clinic A preprocessor for CPython C files in order to automate + the boilerplate involved with writing argument parsing + code for "builtins". + freeze Create a stand-alone executable from a Python program. gdb Python code to be run inside gdb, to make it easier to @@ -15,11 +26,16 @@ i18n Tools for internationalization. pygettext.py and msgfmt.py generates a binary message catalog from a catalog in text format. +importbench A set of micro-benchmarks for various import scenarios. + iobench Benchmark for the new Python I/O system. (*) msi Support for packaging Python as an MSI package on Windows. -parser Un-parsing tool to generate code from an AST. +nuget Files for the NuGet package manager for .NET. + +patchcheck Tools for checking and applying patches to the Python source code + and verifying the integrity of patch files. peg_generator PEG-based parser generator (pegen) used for new parser. @@ -28,9 +44,14 @@ scripts A number of useful single-file programs, e.g. tabnanny.py tabs and spaces, and 2to3, which converts Python 2 code to Python 3 code. +ssl Scripts to generate ssl_data.h from OpenSSL sources, and run + tests against multiple installations of OpenSSL and LibreSSL. + stringbench A suite of micro-benchmarks for various operations on strings (both 8-bit and unicode). (*) +tz A script to dump timezone from /usr/share/zoneinfo. + unicode Tools for generating unicodedata and codecs from unicode.org and other mapping files (by Fredrik Lundh, Marc-Andre Lemburg and Martin von Loewis). @@ -38,6 +59,8 @@ unicode Tools for generating unicodedata and codecs from unicode.org unittestgui A Tkinter based GUI test runner for unittest, with test discovery. +wasm Config and helpers to facilitate cross compilation of CPython + to WebAssembly (WASM). (*) A generic benchmark suite is maintained separately at https://github.com/python/performance diff --git a/Tools/scripts/README b/Tools/scripts/README index b9522681595901..9dbb89a8dae633 100644 --- a/Tools/scripts/README +++ b/Tools/scripts/README @@ -2,9 +2,15 @@ This directory contains a collection of executable Python scripts that are useful while building, extending or managing Python. 2to3 Main script for running the 2to3 conversion tool +checkpip.py Checks the version of the projects bundled in ensurepip + are the latest available combinerefs.py A helper for analyzing PYTHONDUMPREFS output +divmod_threshold.py Determine threshold for switching from longobject.c + divmod to _pylong.int_divmod() idle3 Main program to start IDLE -parse_html5_entities.py Utility for parsing HTML5 entity definitions pydoc3 Python documentation browser run_tests.py Run the test suite with more sensible default options -stable_abi.py Stable ABI checks and file generators. +summarize_stats.py Summarize specialization stats for all files in the + default stats folders +var_access_benchmark.py Show relative speeds of local, nonlocal, global, + and built-in access From c1e71ce56fdb3eab62ad3190d09130f800e54610 Mon Sep 17 00:00:00 2001 From: gaogaotiantian Date: Thu, 30 Mar 2023 15:51:36 -0700 Subject: [PATCH 023/349] Minor docs improvements fix for `codeop` (#103123) --- Doc/library/codeop.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Doc/library/codeop.rst b/Doc/library/codeop.rst index c66b9d3ec0a26d..90df499f8207b7 100644 --- a/Doc/library/codeop.rst +++ b/Doc/library/codeop.rst @@ -19,10 +19,10 @@ module instead. There are two parts to this job: -#. Being able to tell if a line of input completes a Python statement: in +#. Being able to tell if a line of input completes a Python statement: in short, telling whether to print '``>>>``' or '``...``' next. -#. Remembering which future statements the user has entered, so subsequent +#. Remembering which future statements the user has entered, so subsequent input can be compiled with these in effect. The :mod:`codeop` module provides a way of doing each of these things, and a way @@ -33,9 +33,9 @@ To do just the former: .. function:: compile_command(source, filename="", symbol="single") Tries to compile *source*, which should be a string of Python code and return a - code object if *source* is valid Python code. In that case, the filename + code object if *source* is valid Python code. In that case, the filename attribute of the code object will be *filename*, which defaults to - ``''``. Returns ``None`` if *source* is *not* valid Python code, but is a + ``''``. Returns ``None`` if *source* is *not* valid Python code, but is a prefix of valid Python code. If there is a problem with *source*, an exception will be raised. @@ -43,9 +43,9 @@ To do just the former: :exc:`OverflowError` or :exc:`ValueError` if there is an invalid literal. The *symbol* argument determines whether *source* is compiled as a statement - (``'single'``, the default), as a sequence of statements (``'exec'``) or + (``'single'``, the default), as a sequence of :term:`statement` (``'exec'``) or as an :term:`expression` (``'eval'``). Any other value will - cause :exc:`ValueError` to be raised. + cause :exc:`ValueError` to be raised. .. note:: @@ -69,5 +69,5 @@ To do just the former: Instances of this class have :meth:`__call__` methods identical in signature to :func:`compile_command`; the difference is that if the instance compiles program - text containing a ``__future__`` statement, the instance 'remembers' and + text containing a :mod:`__future__` statement, the instance 'remembers' and compiles all subsequent program texts with the statement in force. From 44bd3fe570da9115bec67694404b8da26716a1d7 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Fri, 31 Mar 2023 11:23:02 +0100 Subject: [PATCH 024/349] gh-102799: use exception instance instead of sys.exc_info() (#102885) --- Lib/logging/__init__.py | 4 ++-- Lib/pickle.py | 2 +- Lib/site.py | 4 ++-- Lib/test/inspect_fodder.py | 10 +++++----- Lib/test/test_inspect.py | 2 +- Lib/test/test_with.py | 6 +++--- Lib/tkinter/filedialog.py | 5 ++--- 7 files changed, 16 insertions(+), 17 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 9241d73d0fd03c..056380fb2287af 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -173,8 +173,8 @@ def currentframe(): """Return the frame object for the caller's stack frame.""" try: raise Exception - except Exception: - return sys.exc_info()[2].tb_frame.f_back + except Exception as exc: + return exc.__traceback__.tb_frame.f_back # # _srcfile is used when walking the stack to check when we've got the first diff --git a/Lib/pickle.py b/Lib/pickle.py index 15fa5f6e579932..fe86f80f51d3b9 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -1481,7 +1481,7 @@ def _instantiate(self, klass, args): value = klass(*args) except TypeError as err: raise TypeError("in constructor for %s: %s" % - (klass.__name__, str(err)), sys.exc_info()[2]) + (klass.__name__, str(err)), err.__traceback__) else: value = klass.__new__(klass) self.append(value) diff --git a/Lib/site.py b/Lib/site.py index 7faf1c6f6af223..5c1ff31f4e0f9e 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -190,11 +190,11 @@ def addpackage(sitedir, name, known_paths): if not dircase in known_paths and os.path.exists(dir): sys.path.append(dir) known_paths.add(dircase) - except Exception: + except Exception as exc: print("Error processing line {:d} of {}:\n".format(n+1, fullname), file=sys.stderr) import traceback - for record in traceback.format_exception(*sys.exc_info()): + for record in traceback.format_exception(exc): for line in record.splitlines(): print(' '+line, file=sys.stderr) print("\nRemainder of file ignored", file=sys.stderr) diff --git a/Lib/test/inspect_fodder.py b/Lib/test/inspect_fodder.py index e1287a315901cf..567dfbab804867 100644 --- a/Lib/test/inspect_fodder.py +++ b/Lib/test/inspect_fodder.py @@ -1,7 +1,7 @@ # line 1 'A module docstring.' -import sys, inspect +import inspect # line 5 # line 7 @@ -41,8 +41,8 @@ def abuse(self, a, b, c): def argue(self, a, b, c): try: spam(a, b, c) - except: - self.ex = sys.exc_info() + except BaseException as e: + self.ex = e self.tr = inspect.trace() @property @@ -78,8 +78,8 @@ async def lobbest(grenade): currentframe = inspect.currentframe() try: raise Exception() -except: - tb = sys.exc_info()[2] +except BaseException as e: + tb = e.__traceback__ class Callable: def __call__(self, *args): diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 803b259d961f54..3a3646f1861e80 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -430,7 +430,7 @@ def __init__(self, *args, **kwargs): git.abuse(7, 8, 9) def test_abuse_done(self): - self.istest(inspect.istraceback, 'git.ex[2]') + self.istest(inspect.istraceback, 'git.ex.__traceback__') self.istest(inspect.isframe, 'mod.fr') def test_stack(self): diff --git a/Lib/test/test_with.py b/Lib/test/test_with.py index 07522bda6a5583..d81902327a7e0a 100644 --- a/Lib/test/test_with.py +++ b/Lib/test/test_with.py @@ -79,11 +79,11 @@ def __exit__(self, *exc_info): try: if mgr.__exit__(*ex): ex = (None, None, None) - except: - ex = sys.exc_info() + except BaseException as e: + ex = (type(e), e, e.__traceback__) self.entered = None if ex is not exc_info: - raise ex[0](ex[1]).with_traceback(ex[2]) + raise ex class MockNested(Nested): diff --git a/Lib/tkinter/filedialog.py b/Lib/tkinter/filedialog.py index 600d0bd49fe2cf..e2eff98e601c07 100644 --- a/Lib/tkinter/filedialog.py +++ b/Lib/tkinter/filedialog.py @@ -461,7 +461,6 @@ def test(): # Start off with UTF-8 enc = "utf-8" - import sys # See whether CODESET is defined try: @@ -477,9 +476,9 @@ def test(): try: fp=open(openfilename,"r") fp.close() - except: + except BaseException as exc: print("Could not open File: ") - print(sys.exc_info()[1]) + print(exc) print("open", openfilename.encode(enc)) From 20c0f196ff63546a6a0460a46c92de12b975bc1a Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Fri, 31 Mar 2023 13:48:46 +0300 Subject: [PATCH 025/349] gh-101100: Expand list of clean docs (GH-103135) Follow on from https://github.com/python/cpython/pull/103116. Expand list of clean docs files from 3 to 181. These files have no Sphinx warnings, and their presence in this list means that any new warnings introduced will fail the build. The list was created by subtracting the list of files with warnings from a list of all files. I tested with all of those, but found that `touch`ing two clean files (https://github.com/python/cpython/blob/main/Doc/includes/wasm-notavail.rst and https://github.com/python/cpython/blob/main/Doc/whatsnew/changelog.rst) caused a cascade effect and resulted in a number of dirty files being rebuilt too, and failing the build. So those two have been omitted. Automerge-Triggered-By: GH:hugovk --- Doc/tools/clean-files.txt | 356 +++++++++++++++++++++++++++++++++ Doc/tools/touch-clean-files.py | 1 + 2 files changed, 357 insertions(+) diff --git a/Doc/tools/clean-files.txt b/Doc/tools/clean-files.txt index a6197998f504fa..baef7c2f89588b 100644 --- a/Doc/tools/clean-files.txt +++ b/Doc/tools/clean-files.txt @@ -3,8 +3,364 @@ # Add blank lines between files and keep them sorted lexicographically # to help avoid merge conflicts. +Doc/about.rst + +Doc/bugs.rst + +Doc/c-api/abstract.rst + +Doc/c-api/bytearray.rst + +Doc/c-api/concrete.rst + +Doc/c-api/contextvars.rst + +Doc/c-api/coro.rst + +Doc/c-api/frame.rst + +Doc/c-api/function.rst + +Doc/c-api/gen.rst + +Doc/c-api/index.rst + +Doc/c-api/iter.rst + +Doc/c-api/list.rst + +Doc/c-api/method.rst + +Doc/c-api/number.rst + +Doc/c-api/objbuffer.rst + +Doc/c-api/objimpl.rst + +Doc/c-api/reflection.rst + +Doc/c-api/slice.rst + +Doc/c-api/utilities.rst + +Doc/contents.rst + +Doc/copyright.rst + +Doc/distributing/index.rst + +Doc/extending/building.rst + +Doc/extending/index.rst + +Doc/extending/windows.rst + +Doc/faq/general.rst + +Doc/faq/index.rst + +Doc/faq/installed.rst + +Doc/faq/windows.rst + +Doc/howto/annotations.rst + +Doc/howto/clinic.rst + +Doc/howto/cporting.rst + +Doc/howto/index.rst + +Doc/howto/ipaddress.rst + +Doc/howto/perf_profiling.rst + +Doc/howto/pyporting.rst + +Doc/howto/sockets.rst + +Doc/installing/index.rst + +Doc/library/__main__.rst + +Doc/library/allos.rst + +Doc/library/archiving.rst + +Doc/library/array.rst + +Doc/library/asyncio-api-index.rst + +Doc/library/asyncio-exceptions.rst + +Doc/library/asyncio-llapi-index.rst + +Doc/library/asyncio-platforms.rst + +Doc/library/asyncio-protocol.rst + +Doc/library/asyncio-queue.rst + +Doc/library/asyncio-runner.rst + +Doc/library/asyncio-sync.rst + +Doc/library/asyncio.rst + +Doc/library/atexit.rst + +Doc/library/audit_events.rst + +Doc/library/base64.rst + +Doc/library/binary.rst + +Doc/library/binascii.rst + +Doc/library/builtins.rst + +Doc/library/cgitb.rst + +Doc/library/colorsys.rst + +Doc/library/concurrency.rst + +Doc/library/contextvars.rst + +Doc/library/copyreg.rst + +Doc/library/crypt.rst + +Doc/library/crypto.rst + +Doc/library/curses.panel.rst + +Doc/library/custominterp.rst + +Doc/library/datatypes.rst + +Doc/library/debug.rst + +Doc/library/development.rst + +Doc/library/dialog.rst + +Doc/library/distribution.rst + +Doc/library/email.contentmanager.rst + +Doc/library/email.examples.rst + +Doc/library/email.header.rst + +Doc/library/email.iterators.rst + +Doc/library/email.rst + +Doc/library/email.utils.rst + +Doc/library/ensurepip.rst + +Doc/library/errno.rst + +Doc/library/fileformats.rst + +Doc/library/filesys.rst + +Doc/library/fnmatch.rst + +Doc/library/frameworks.rst + +Doc/library/functional.rst + Doc/library/gc.rst +Doc/library/glob.rst + +Doc/library/grp.rst + +Doc/library/heapq.rst + +Doc/library/hmac.rst + +Doc/library/html.entities.rst + +Doc/library/html.parser.rst + +Doc/library/html.rst + +Doc/library/http.rst + +Doc/library/i18n.rst + +Doc/library/imaplib.rst + +Doc/library/imghdr.rst + +Doc/library/importlib.metadata.rst + +Doc/library/index.rst + +Doc/library/internet.rst + +Doc/library/intro.rst + +Doc/library/ipaddress.rst + +Doc/library/ipc.rst + +Doc/library/itertools.rst + +Doc/library/keyword.rst + +Doc/library/language.rst + +Doc/library/linecache.rst + +Doc/library/mailcap.rst + +Doc/library/markup.rst + +Doc/library/marshal.rst + +Doc/library/math.rst + +Doc/library/mimetypes.rst + +Doc/library/mm.rst + +Doc/library/modulefinder.rst + +Doc/library/modules.rst + +Doc/library/netdata.rst + +Doc/library/nis.rst + +Doc/library/numeric.rst + +Doc/library/pathlib.rst + +Doc/library/pdb.rst + +Doc/library/persistence.rst + +Doc/library/pipes.rst + +Doc/library/pwd.rst + +Doc/library/python.rst + +Doc/library/queue.rst + +Doc/library/quopri.rst + +Doc/library/runpy.rst + +Doc/library/secrets.rst + +Doc/library/security_warnings.rst + +Doc/library/shlex.rst + +Doc/library/sndhdr.rst + +Doc/library/spwd.rst + Doc/library/sqlite3.rst +Doc/library/statistics.rst + +Doc/library/stringprep.rst + +Doc/library/superseded.rst + +Doc/library/symtable.rst + +Doc/library/tabnanny.rst + +Doc/library/text.rst + +Doc/library/timeit.rst + +Doc/library/tk.rst + +Doc/library/tkinter.colorchooser.rst + +Doc/library/tkinter.dnd.rst + +Doc/library/tkinter.font.rst + +Doc/library/tkinter.messagebox.rst + +#Doc/library/token.rst + +Doc/library/tokenize.rst + +Doc/library/tomllib.rst + +Doc/library/trace.rst + +Doc/library/tracemalloc.rst + +Doc/library/types.rst + +Doc/library/typing.rst + +Doc/library/unicodedata.rst + +Doc/library/unix.rst + +Doc/library/urllib.robotparser.rst + +Doc/library/urllib.rst + +Doc/library/uu.rst + +Doc/library/venv.rst + +Doc/library/warnings.rst + +Doc/library/windows.rst + +Doc/library/zipapp.rst + +Doc/library/zipfile.rst + +Doc/library/zipimport.rst + +Doc/library/zoneinfo.rst + +Doc/reference/executionmodel.rst + +Doc/reference/grammar.rst + +Doc/reference/index.rst + +Doc/reference/introduction.rst + +Doc/reference/toplevel_components.rst + +Doc/tutorial/appetite.rst + +Doc/tutorial/floatingpoint.rst + +Doc/tutorial/index.rst + +Doc/tutorial/interpreter.rst + +Doc/tutorial/stdlib.rst + +Doc/tutorial/venv.rst + +Doc/tutorial/whatnow.rst + +Doc/using/editors.rst + +Doc/using/index.rst + +Doc/using/mac.rst + Doc/whatsnew/3.12.rst + +Doc/whatsnew/index.rst diff --git a/Doc/tools/touch-clean-files.py b/Doc/tools/touch-clean-files.py index 07f3e509a09fb5..9f55e9446ba793 100644 --- a/Doc/tools/touch-clean-files.py +++ b/Doc/tools/touch-clean-files.py @@ -18,3 +18,4 @@ for filename in CLEAN: print(filename) filename.touch() +print(f"Touched {len(CLEAN)} files") From f6405a46627e1f74c279f712c8776a165b0ba9fd Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Fri, 31 Mar 2023 14:40:38 +0200 Subject: [PATCH 026/349] Quote literal tokens in standard format specifier grammar (GH-102902) Reported by Damian Dureck: https://mail.python.org/archives/list/docs@python.org/thread/UZTWBJIXC3MBKTHXVTIBPGDPKBNWZ5LN/ --- Doc/library/string.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/string.rst b/Doc/library/string.rst index 3b96813e683864..5ada827328188d 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -310,7 +310,7 @@ non-empty format specification typically modifies the result. The general form of a *standard format specifier* is: .. productionlist:: format-spec - format_spec: [[`fill`]`align`][`sign`][z][#][0][`width`][`grouping_option`][.`precision`][`type`] + format_spec: [[`fill`]`align`][`sign`]["z"]["#"]["0"][`width`][`grouping_option`]["." `precision`][`type`] fill: align: "<" | ">" | "=" | "^" sign: "+" | "-" | " " From 048d6243d45b9381dd4fcaad28ae9c5d443b8b4b Mon Sep 17 00:00:00 2001 From: Furkan Onder Date: Fri, 31 Mar 2023 16:54:17 +0300 Subject: [PATCH 027/349] GH-84783: Mention Author for GH-101264 (make slices hashable) (#103146) Will Bradshaw contributed original patch on bpo-40603. --------- Co-authored-by: Terry Jan Reedy --- Doc/whatsnew/3.12.rst | 2 +- Misc/NEWS.d/3.12.0a6.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index e5bcfdecd9a487..00a51ab3c137c5 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -190,7 +190,7 @@ Other Language Changes (Contributed by Nikita Sobolev in :gh:`100581`.) * :class:`slice` objects are now hashable, allowing them to be used as dict keys and - set items. (Contributed by Furkan Onder in :gh:`101264`.) + set items. (Contributed by Will Bradshaw and Furkan Onder in :gh:`101264`.) New Modules =========== diff --git a/Misc/NEWS.d/3.12.0a6.rst b/Misc/NEWS.d/3.12.0a6.rst index 2bcb4c8c854d4e..f6beb5b7ec3dbc 100644 --- a/Misc/NEWS.d/3.12.0a6.rst +++ b/Misc/NEWS.d/3.12.0a6.rst @@ -189,7 +189,7 @@ not just glibc. This fixes support for musl. .. nonce: _P5sMa .. section: Core and Builtins -Make the slice object hashable. +Make the slice object hashable. Patch by Will Bradshaw and Furkan Onder. .. From b0422e140df8fdc83c51cc64a3ed5426188de7f1 Mon Sep 17 00:00:00 2001 From: James De Bias <81095953+DBJim@users.noreply.github.com> Date: Sat, 1 Apr 2023 02:02:47 +1100 Subject: [PATCH 028/349] gh-102871: Remove obsolete browsers from webbrowser (#102872) --- Doc/library/webbrowser.rst | 17 ++-- Doc/whatsnew/3.12.rst | 4 + Lib/test/test_webbrowser.py | 31 +------ Lib/webbrowser.py | 91 +++---------------- ...-03-21-15-17-07.gh-issue-102871.U9mchn.rst | 3 + 5 files changed, 29 insertions(+), 117 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-03-21-15-17-07.gh-issue-102871.U9mchn.rst diff --git a/Doc/library/webbrowser.rst b/Doc/library/webbrowser.rst index 734b6321e5a7e7..61db8042093627 100644 --- a/Doc/library/webbrowser.rst +++ b/Doc/library/webbrowser.rst @@ -115,13 +115,7 @@ for the controller classes, all defined in this module. +------------------------+-----------------------------------------+-------+ | ``'firefox'`` | :class:`Mozilla('mozilla')` | | +------------------------+-----------------------------------------+-------+ -| ``'netscape'`` | :class:`Mozilla('netscape')` | | -+------------------------+-----------------------------------------+-------+ -| ``'galeon'`` | :class:`Galeon('galeon')` | | -+------------------------+-----------------------------------------+-------+ -| ``'epiphany'`` | :class:`Galeon('epiphany')` | | -+------------------------+-----------------------------------------+-------+ -| ``'skipstone'`` | :class:`BackgroundBrowser('skipstone')` | | +| ``'epiphany'`` | :class:`Epiphany('epiphany')` | | +------------------------+-----------------------------------------+-------+ | ``'kfmclient'`` | :class:`Konqueror()` | \(1) | +------------------------+-----------------------------------------+-------+ @@ -129,12 +123,8 @@ for the controller classes, all defined in this module. +------------------------+-----------------------------------------+-------+ | ``'kfm'`` | :class:`Konqueror()` | \(1) | +------------------------+-----------------------------------------+-------+ -| ``'mosaic'`` | :class:`BackgroundBrowser('mosaic')` | | -+------------------------+-----------------------------------------+-------+ | ``'opera'`` | :class:`Opera()` | | +------------------------+-----------------------------------------+-------+ -| ``'grail'`` | :class:`Grail()` | | -+------------------------+-----------------------------------------+-------+ | ``'links'`` | :class:`GenericBrowser('links')` | | +------------------------+-----------------------------------------+-------+ | ``'elinks'`` | :class:`Elinks('elinks')` | | @@ -176,6 +166,11 @@ Notes: .. versionadded:: 3.3 Support for Chrome/Chromium has been added. +.. versionchanged:: 3.12 + Support for several obsolete browsers has been removed. + Removed browsers include Grail, Mosaic, Netscape, Galeon, + Skipstone, Iceape, and Firefox versions 35 and below. + .. deprecated-removed:: 3.11 3.13 :class:`MacOSX` is deprecated, use :class:`MacOSXOSAScript` instead. diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 00a51ab3c137c5..bd9be531fdd7d1 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -777,6 +777,10 @@ Removed *context* parameter instead. (Contributed by Victor Stinner in :gh:`94172`.) +* Remove support for obsolete browsers from :mod:`webbrowser`. + Removed browsers include: Grail, Mosaic, Netscape, Galeon, Skipstone, + Iceape, Firebird, and Firefox versions 35 and below (:gh:`102871`). + Porting to Python 3.12 ====================== diff --git a/Lib/test/test_webbrowser.py b/Lib/test/test_webbrowser.py index 9d608d63a01ed3..147a113c7fd730 100644 --- a/Lib/test/test_webbrowser.py +++ b/Lib/test/test_webbrowser.py @@ -11,7 +11,7 @@ if not support.has_subprocess_support: raise unittest.SkipTest("test webserver requires subprocess") -URL = 'http://www.example.com' +URL = 'https://www.example.com' CMD_NAME = 'test' @@ -120,34 +120,9 @@ def test_open_new_tab(self): arguments=['-new-tab', URL]) -class NetscapeCommandTest(CommandTestMixin, unittest.TestCase): +class EpiphanyCommandTest(CommandTestMixin, unittest.TestCase): - browser_class = webbrowser.Netscape - - def test_open(self): - self._test('open', - options=['-raise', '-remote'], - arguments=['openURL({})'.format(URL)]) - - def test_open_with_autoraise_false(self): - self._test('open', kw=dict(autoraise=False), - options=['-noraise', '-remote'], - arguments=['openURL({})'.format(URL)]) - - def test_open_new(self): - self._test('open_new', - options=['-raise', '-remote'], - arguments=['openURL({},new-window)'.format(URL)]) - - def test_open_new_tab(self): - self._test('open_new_tab', - options=['-raise', '-remote'], - arguments=['openURL({},new-tab)'.format(URL)]) - - -class GaleonCommandTest(CommandTestMixin, unittest.TestCase): - - browser_class = webbrowser.Galeon + browser_class = webbrowser.Epiphany def test_open(self): self._test('open', diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py index 4336597e68f625..d98c5997d2f44f 100755 --- a/Lib/webbrowser.py +++ b/Lib/webbrowser.py @@ -292,19 +292,8 @@ class Mozilla(UnixBrowser): background = True -class Netscape(UnixBrowser): - """Launcher class for Netscape browser.""" - - raise_opts = ["-noraise", "-raise"] - remote_args = ['-remote', 'openURL(%s%action)'] - remote_action = "" - remote_action_newwin = ",new-window" - remote_action_newtab = ",new-tab" - background = True - - -class Galeon(UnixBrowser): - """Launcher class for Galeon/Epiphany browsers.""" +class Epiphany(UnixBrowser): + """Launcher class for Epiphany browser.""" raise_opts = ["-noraise", ""] remote_args = ['%action', '%s'] @@ -402,44 +391,6 @@ def open(self, url, new=0, autoraise=True): return (p.poll() is None) -class Grail(BaseBrowser): - # There should be a way to maintain a connection to Grail, but the - # Grail remote control protocol doesn't really allow that at this - # point. It probably never will! - def _find_grail_rc(self): - import glob - import pwd - import socket - import tempfile - tempdir = os.path.join(tempfile.gettempdir(), - ".grail-unix") - user = pwd.getpwuid(os.getuid())[0] - filename = os.path.join(glob.escape(tempdir), glob.escape(user) + "-*") - maybes = glob.glob(filename) - if not maybes: - return None - s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - for fn in maybes: - # need to PING each one until we find one that's live - try: - s.connect(fn) - except OSError: - # no good; attempt to clean it out, but don't fail: - try: - os.unlink(fn) - except OSError: - pass - else: - return s - - def _remote(self, action): - s = self._find_grail_rc() - if not s: - return 0 - s.send(action) - s.close() - return 1 - def open(self, url, new=0, autoraise=True): sys.audit("webbrowser.open", url) if new: @@ -475,35 +426,25 @@ def register_X_browsers(): if "KDE_FULL_SESSION" in os.environ and shutil.which("kfmclient"): register("kfmclient", Konqueror, Konqueror("kfmclient")) + # Common symbolic link for the default X11 browser if shutil.which("x-www-browser"): register("x-www-browser", None, BackgroundBrowser("x-www-browser")) # The Mozilla browsers - for browser in ("firefox", "iceweasel", "iceape", "seamonkey"): + for browser in ("firefox", "iceweasel", "seamonkey", "mozilla-firefox", + "mozilla"): if shutil.which(browser): register(browser, None, Mozilla(browser)) - # The Netscape and old Mozilla browsers - for browser in ("mozilla-firefox", - "mozilla-firebird", "firebird", - "mozilla", "netscape"): - if shutil.which(browser): - register(browser, None, Netscape(browser)) - # Konqueror/kfm, the KDE browser. if shutil.which("kfm"): register("kfm", Konqueror, Konqueror("kfm")) elif shutil.which("konqueror"): register("konqueror", Konqueror, Konqueror("konqueror")) - # Gnome's Galeon and Epiphany - for browser in ("galeon", "epiphany"): - if shutil.which(browser): - register(browser, None, Galeon(browser)) - - # Skipstone, another Gtk/Mozilla based browser - if shutil.which("skipstone"): - register("skipstone", None, BackgroundBrowser("skipstone")) + # Gnome's Epiphany + if shutil.which("epiphany"): + register("epiphany", None, Epiphany("epiphany")) # Google Chrome/Chromium browsers for browser in ("google-chrome", "chrome", "chromium", "chromium-browser"): @@ -514,13 +455,6 @@ def register_X_browsers(): if shutil.which("opera"): register("opera", None, Opera("opera")) - # Next, Mosaic -- old but still in use. - if shutil.which("mosaic"): - register("mosaic", None, BackgroundBrowser("mosaic")) - - # Grail, the Python browser. Does anybody still use it? - if shutil.which("grail"): - register("grail", Grail, None) def register_standard_browsers(): global _tryorder @@ -549,7 +483,7 @@ def register_standard_browsers(): # location in 32-bit Windows edge32 = os.path.join(os.environ.get("PROGRAMFILES", "C:\\Program Files"), "Microsoft\\Edge\\Application\\msedge.exe") - for browser in ("firefox", "firebird", "seamonkey", "mozilla", + for browser in ("firefox", "seamonkey", "mozilla", "chrome", "opera", edge64, edge32): if shutil.which(browser): register(browser, None, BackgroundBrowser(browser)) @@ -570,14 +504,15 @@ def register_standard_browsers(): # Also try console browsers if os.environ.get("TERM"): + # Common symbolic link for the default text-based browser if shutil.which("www-browser"): register("www-browser", None, GenericBrowser("www-browser")) - # The Links/elinks browsers + # The Links/elinks browsers if shutil.which("links"): register("links", None, GenericBrowser("links")) if shutil.which("elinks"): register("elinks", None, Elinks("elinks")) - # The Lynx browser , + # The Lynx browser , if shutil.which("lynx"): register("lynx", None, GenericBrowser("lynx")) # The w3m browser @@ -727,7 +662,7 @@ def main(): for o, a in opts: if o == '-n': new_win = 1 elif o == '-t': new_win = 2 - elif o == '-h' or o == '--help': + elif o == '-h' or o == '--help': print(usage, file=sys.stderr) sys.exit() if len(args) != 1: diff --git a/Misc/NEWS.d/next/Library/2023-03-21-15-17-07.gh-issue-102871.U9mchn.rst b/Misc/NEWS.d/next/Library/2023-03-21-15-17-07.gh-issue-102871.U9mchn.rst new file mode 100644 index 00000000000000..3ef0e74d21ca00 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-03-21-15-17-07.gh-issue-102871.U9mchn.rst @@ -0,0 +1,3 @@ +Remove support for obsolete browsers from :mod:`webbrowser`. +Removed browsers include Grail, Mosaic, Netscape, Galeon, Skipstone, +Iceape, Firebird, and Firefox versions 35 and below. From 80163e17d3f826067c5d95198db7696287beb416 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Fri, 31 Mar 2023 18:17:59 +0100 Subject: [PATCH 029/349] gh-87092: move CFG related code from compile.c to flowgraph.c (#103021) --- Include/internal/pycore_compile.h | 10 + Include/internal/pycore_flowgraph.h | 117 + Include/internal/pycore_opcode.h | 8 +- Include/internal/pycore_opcode_utils.h | 95 + Makefile.pre.in | 3 + PCbuild/_freeze_module.vcxproj | 1 + PCbuild/_freeze_module.vcxproj.filters | 3 + PCbuild/pythoncore.vcxproj | 2 + PCbuild/pythoncore.vcxproj.filters | 3 + Python/compile.c | 2659 ++--------------------- Python/flowgraph.c | 2160 ++++++++++++++++++ Python/opcode_metadata.h | 6 +- Tools/build/generate_opcode_h.py | 4 +- Tools/cases_generator/generate_cases.py | 4 +- 14 files changed, 2580 insertions(+), 2495 deletions(-) create mode 100644 Include/internal/pycore_flowgraph.h create mode 100644 Include/internal/pycore_opcode_utils.h create mode 100644 Python/flowgraph.c diff --git a/Include/internal/pycore_compile.h b/Include/internal/pycore_compile.h index 511f0689c93822..6a1e02c0b895d7 100644 --- a/Include/internal/pycore_compile.h +++ b/Include/internal/pycore_compile.h @@ -33,6 +33,16 @@ extern int _PyAST_Optimize( struct _arena *arena, _PyASTOptimizeState *state); +/* Utility for a number of growing arrays used in the compiler */ +int _PyCompile_EnsureArrayLargeEnough( + int idx, + void **array, + int *alloc, + int default_alloc, + size_t item_size); + +int _PyCompile_ConstCacheMergeOne(PyObject *const_cache, PyObject **obj); + /* Access compiler internals for unit testing */ PyAPI_FUNC(PyObject*) _PyCompile_CodeGen( diff --git a/Include/internal/pycore_flowgraph.h b/Include/internal/pycore_flowgraph.h new file mode 100644 index 00000000000000..7c0b8fe980c3c7 --- /dev/null +++ b/Include/internal/pycore_flowgraph.h @@ -0,0 +1,117 @@ +#ifndef Py_INTERNAL_CFG_H +#define Py_INTERNAL_CFG_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_opcode_utils.h" + +static const _PyCompilerSrcLocation NO_LOCATION = {-1, -1, -1, -1}; + +typedef struct { + int i_opcode; + int i_oparg; + _PyCompilerSrcLocation i_loc; + struct _PyCfgBasicblock_ *i_target; /* target block (if jump instruction) */ + struct _PyCfgBasicblock_ *i_except; /* target block when exception is raised */ +} _PyCfgInstruction; + +typedef struct { + int id; +} _PyCfgJumpTargetLabel; + + +typedef struct { + struct _PyCfgBasicblock_ *handlers[CO_MAXBLOCKS+1]; + int depth; +} _PyCfgExceptStack; + +typedef struct _PyCfgBasicblock_ { + /* Each basicblock in a compilation unit is linked via b_list in the + reverse order that the block are allocated. b_list points to the next + block, not to be confused with b_next, which is next by control flow. */ + struct _PyCfgBasicblock_ *b_list; + /* The label of this block if it is a jump target, -1 otherwise */ + _PyCfgJumpTargetLabel b_label; + /* Exception stack at start of block, used by assembler to create the exception handling table */ + _PyCfgExceptStack *b_exceptstack; + /* pointer to an array of instructions, initially NULL */ + _PyCfgInstruction *b_instr; + /* If b_next is non-NULL, it is a pointer to the next + block reached by normal control flow. */ + struct _PyCfgBasicblock_ *b_next; + /* number of instructions used */ + int b_iused; + /* length of instruction array (b_instr) */ + int b_ialloc; + /* Used by add_checks_for_loads_of_unknown_variables */ + uint64_t b_unsafe_locals_mask; + /* Number of predecessors that a block has. */ + int b_predecessors; + /* depth of stack upon entry of block, computed by stackdepth() */ + int b_startdepth; + /* instruction offset for block, computed by assemble_jump_offsets() */ + int b_offset; + /* Basic block is an exception handler that preserves lasti */ + unsigned b_preserve_lasti : 1; + /* Used by compiler passes to mark whether they have visited a basic block. */ + unsigned b_visited : 1; + /* b_except_handler is used by the cold-detection algorithm to mark exception targets */ + unsigned b_except_handler : 1; + /* b_cold is true if this block is not perf critical (like an exception handler) */ + unsigned b_cold : 1; + /* b_warm is used by the cold-detection algorithm to mark blocks which are definitely not cold */ + unsigned b_warm : 1; +} _PyCfgBasicblock; + +int _PyBasicblock_InsertInstruction(_PyCfgBasicblock *block, int pos, _PyCfgInstruction *instr); + +typedef struct cfg_builder_ { + /* The entryblock, at which control flow begins. All blocks of the + CFG are reachable through the b_next links */ + _PyCfgBasicblock *g_entryblock; + /* Pointer to the most recently allocated block. By following + b_list links, you can reach all allocated blocks. */ + _PyCfgBasicblock *g_block_list; + /* pointer to the block currently being constructed */ + _PyCfgBasicblock *g_curblock; + /* label for the next instruction to be placed */ + _PyCfgJumpTargetLabel g_current_label; +} _PyCfgBuilder; + +int _PyCfgBuilder_UseLabel(_PyCfgBuilder *g, _PyCfgJumpTargetLabel lbl); +int _PyCfgBuilder_Addop(_PyCfgBuilder *g, int opcode, int oparg, _PyCompilerSrcLocation loc); + +int _PyCfgBuilder_Init(_PyCfgBuilder *g); +void _PyCfgBuilder_Fini(_PyCfgBuilder *g); + +_PyCfgInstruction* _PyCfg_BasicblockLastInstr(const _PyCfgBasicblock *b); +int _PyCfg_OptimizeCodeUnit(_PyCfgBuilder *g, PyObject *consts, PyObject *const_cache, + int code_flags, int nlocals, int nparams); +int _PyCfg_Stackdepth(_PyCfgBasicblock *entryblock, int code_flags); +void _PyCfg_ConvertExceptionHandlersToNops(_PyCfgBasicblock *entryblock); +int _PyCfg_ResolveLineNumbers(_PyCfgBuilder *g, int firstlineno); +int _PyCfg_ResolveJumps(_PyCfgBuilder *g); +int _PyCfg_InstrSize(_PyCfgInstruction *instruction); + + +static inline int +basicblock_nofallthrough(const _PyCfgBasicblock *b) { + _PyCfgInstruction *last = _PyCfg_BasicblockLastInstr(b); + return (last && + (IS_SCOPE_EXIT_OPCODE(last->i_opcode) || + IS_UNCONDITIONAL_JUMP_OPCODE(last->i_opcode))); +} + +#define BB_NO_FALLTHROUGH(B) (basicblock_nofallthrough(B)) +#define BB_HAS_FALLTHROUGH(B) (!basicblock_nofallthrough(B)) + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_CFG_H */ diff --git a/Include/internal/pycore_opcode.h b/Include/internal/pycore_opcode.h index 22914da07994f8..58f7da51aebd5e 100644 --- a/Include/internal/pycore_opcode.h +++ b/Include/internal/pycore_opcode.h @@ -12,12 +12,16 @@ extern "C" { #include "opcode.h" +extern const uint32_t _PyOpcode_RelativeJump[9]; + +extern const uint32_t _PyOpcode_Jump[9]; + extern const uint8_t _PyOpcode_Caches[256]; extern const uint8_t _PyOpcode_Deopt[256]; #ifdef NEED_OPCODE_TABLES -static const uint32_t _PyOpcode_RelativeJump[9] = { +const uint32_t _PyOpcode_RelativeJump[9] = { 0U, 0U, 536870912U, @@ -28,7 +32,7 @@ static const uint32_t _PyOpcode_RelativeJump[9] = { 0U, 48U, }; -static const uint32_t _PyOpcode_Jump[9] = { +const uint32_t _PyOpcode_Jump[9] = { 0U, 0U, 536870912U, diff --git a/Include/internal/pycore_opcode_utils.h b/Include/internal/pycore_opcode_utils.h new file mode 100644 index 00000000000000..96bb4d743bf29f --- /dev/null +++ b/Include/internal/pycore_opcode_utils.h @@ -0,0 +1,95 @@ +#ifndef Py_INTERNAL_OPCODE_UTILS_H +#define Py_INTERNAL_OPCODE_UTILS_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_opcode.h" // _PyOpcode_RelativeJump + + +#define MAX_REAL_OPCODE 254 + +#define IS_WITHIN_OPCODE_RANGE(opcode) \ + (((opcode) >= 0 && (opcode) <= MAX_REAL_OPCODE) || \ + IS_PSEUDO_OPCODE(opcode)) + +#define IS_JUMP_OPCODE(opcode) \ + is_bit_set_in_table(_PyOpcode_Jump, opcode) + +#define IS_BLOCK_PUSH_OPCODE(opcode) \ + ((opcode) == SETUP_FINALLY || \ + (opcode) == SETUP_WITH || \ + (opcode) == SETUP_CLEANUP) + +#define HAS_TARGET(opcode) \ + (IS_JUMP_OPCODE(opcode) || IS_BLOCK_PUSH_OPCODE(opcode)) + +/* opcodes that must be last in the basicblock */ +#define IS_TERMINATOR_OPCODE(opcode) \ + (IS_JUMP_OPCODE(opcode) || IS_SCOPE_EXIT_OPCODE(opcode)) + +/* opcodes which are not emitted in codegen stage, only by the assembler */ +#define IS_ASSEMBLER_OPCODE(opcode) \ + ((opcode) == JUMP_FORWARD || \ + (opcode) == JUMP_BACKWARD || \ + (opcode) == JUMP_BACKWARD_NO_INTERRUPT) + +#define IS_BACKWARDS_JUMP_OPCODE(opcode) \ + ((opcode) == JUMP_BACKWARD || \ + (opcode) == JUMP_BACKWARD_NO_INTERRUPT) + +#define IS_UNCONDITIONAL_JUMP_OPCODE(opcode) \ + ((opcode) == JUMP || \ + (opcode) == JUMP_NO_INTERRUPT || \ + (opcode) == JUMP_FORWARD || \ + (opcode) == JUMP_BACKWARD || \ + (opcode) == JUMP_BACKWARD_NO_INTERRUPT) + +#define IS_SCOPE_EXIT_OPCODE(opcode) \ + ((opcode) == RETURN_VALUE || \ + (opcode) == RETURN_CONST || \ + (opcode) == RAISE_VARARGS || \ + (opcode) == RERAISE) + +#define IS_SUPERINSTRUCTION_OPCODE(opcode) \ + ((opcode) == LOAD_FAST__LOAD_FAST || \ + (opcode) == LOAD_FAST__LOAD_CONST || \ + (opcode) == LOAD_CONST__LOAD_FAST || \ + (opcode) == STORE_FAST__LOAD_FAST || \ + (opcode) == STORE_FAST__STORE_FAST) + + +#define LOG_BITS_PER_INT 5 +#define MASK_LOW_LOG_BITS 31 + +static inline int +is_bit_set_in_table(const uint32_t *table, int bitindex) { + /* Is the relevant bit set in the relevant word? */ + /* 512 bits fit into 9 32-bits words. + * Word is indexed by (bitindex>>ln(size of int in bits)). + * Bit within word is the low bits of bitindex. + */ + if (bitindex >= 0 && bitindex < 512) { + uint32_t word = table[bitindex >> LOG_BITS_PER_INT]; + return (word >> (bitindex & MASK_LOW_LOG_BITS)) & 1; + } + else { + return 0; + } +} + +#undef LOG_BITS_PER_INT +#undef MASK_LOW_LOG_BITS + +#define IS_RELATIVE_JUMP(opcode) (is_bit_set_in_table(_PyOpcode_RelativeJump, opcode)) + + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_OPCODE_UTILS_H */ diff --git a/Makefile.pre.in b/Makefile.pre.in index 74e4171b010d0f..b97daaf6f445cc 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -374,6 +374,7 @@ PYTHON_OBJS= \ Python/ast_unparse.o \ Python/bltinmodule.o \ Python/ceval.o \ + Python/flowgraph.o \ Python/codecs.o \ Python/compile.o \ Python/context.o \ @@ -1702,6 +1703,8 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_object_state.h \ $(srcdir)/Include/internal/pycore_obmalloc.h \ $(srcdir)/Include/internal/pycore_obmalloc_init.h \ + $(srcdir)/Include/internal/pycore_opcode.h \ + $(srcdir)/Include/internal/pycore_opcode_utils.h \ $(srcdir)/Include/internal/pycore_pathconfig.h \ $(srcdir)/Include/internal/pycore_pyarena.h \ $(srcdir)/Include/internal/pycore_pyerrors.h \ diff --git a/PCbuild/_freeze_module.vcxproj b/PCbuild/_freeze_module.vcxproj index 4f39756019e692..28eced6d4b2862 100644 --- a/PCbuild/_freeze_module.vcxproj +++ b/PCbuild/_freeze_module.vcxproj @@ -183,6 +183,7 @@ + diff --git a/PCbuild/_freeze_module.vcxproj.filters b/PCbuild/_freeze_module.vcxproj.filters index 7d7c4587b9a3f3..e4faa89bb831d9 100644 --- a/PCbuild/_freeze_module.vcxproj.filters +++ b/PCbuild/_freeze_module.vcxproj.filters @@ -76,6 +76,9 @@ Source Files + + Source Files + Source Files diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index c754b2165745ff..8fab600334160d 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -205,6 +205,7 @@ + @@ -504,6 +505,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 90ed0602821bff..6c5d8dd89f5bc7 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -1106,6 +1106,9 @@ Python + + Python + Python diff --git a/Python/compile.c b/Python/compile.c index 192deaa4b35f4d..fed9ae7066e4f0 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -23,23 +23,21 @@ #include -// Need _PyOpcode_RelativeJump of pycore_opcode.h -#define NEED_OPCODE_TABLES - #include "Python.h" #include "pycore_ast.h" // _PyAST_GetDocString() +#define NEED_OPCODE_TABLES +#include "pycore_opcode_utils.h" +#undef NEED_OPCODE_TABLES +#include "pycore_flowgraph.h" #include "pycore_code.h" // _PyCode_New() #include "pycore_compile.h" #include "pycore_intrinsics.h" #include "pycore_long.h" // _PyLong_GetZero() -#include "pycore_opcode.h" // _PyOpcode_Caches #include "pycore_pymem.h" // _PyMem_IsPtrFreed() #include "pycore_symtable.h" // PySTEntryObject, _PyFuture_FromAST() #include "opcode_metadata.h" // _PyOpcode_opcode_metadata, _PyOpcode_num_popped/pushed - -#define DEFAULT_BLOCK_SIZE 16 #define DEFAULT_CODE_SIZE 128 #define DEFAULT_LNOTAB_SIZE 16 #define DEFAULT_CNOTAB_SIZE 32 @@ -83,68 +81,17 @@ */ #define MAX_ALLOWED_STACK_USE (STACK_USE_GUIDELINE * 100) - -#define MAX_REAL_OPCODE 254 - -#define IS_WITHIN_OPCODE_RANGE(opcode) \ - (((opcode) >= 0 && (opcode) <= MAX_REAL_OPCODE) || \ - IS_PSEUDO_OPCODE(opcode)) - -#define IS_JUMP_OPCODE(opcode) \ - is_bit_set_in_table(_PyOpcode_Jump, opcode) - -#define IS_BLOCK_PUSH_OPCODE(opcode) \ - ((opcode) == SETUP_FINALLY || \ - (opcode) == SETUP_WITH || \ - (opcode) == SETUP_CLEANUP) - -#define HAS_TARGET(opcode) \ - (IS_JUMP_OPCODE(opcode) || IS_BLOCK_PUSH_OPCODE(opcode)) - -/* opcodes that must be last in the basicblock */ -#define IS_TERMINATOR_OPCODE(opcode) \ - (IS_JUMP_OPCODE(opcode) || IS_SCOPE_EXIT_OPCODE(opcode)) - -/* opcodes which are not emitted in codegen stage, only by the assembler */ -#define IS_ASSEMBLER_OPCODE(opcode) \ - ((opcode) == JUMP_FORWARD || \ - (opcode) == JUMP_BACKWARD || \ - (opcode) == JUMP_BACKWARD_NO_INTERRUPT) - -#define IS_BACKWARDS_JUMP_OPCODE(opcode) \ - ((opcode) == JUMP_BACKWARD || \ - (opcode) == JUMP_BACKWARD_NO_INTERRUPT) - -#define IS_UNCONDITIONAL_JUMP_OPCODE(opcode) \ - ((opcode) == JUMP || \ - (opcode) == JUMP_NO_INTERRUPT || \ - (opcode) == JUMP_FORWARD || \ - (opcode) == JUMP_BACKWARD || \ - (opcode) == JUMP_BACKWARD_NO_INTERRUPT) - -#define IS_SCOPE_EXIT_OPCODE(opcode) \ - ((opcode) == RETURN_VALUE || \ - (opcode) == RETURN_CONST || \ - (opcode) == RAISE_VARARGS || \ - (opcode) == RERAISE) - -#define IS_SUPERINSTRUCTION_OPCODE(opcode) \ - ((opcode) == LOAD_FAST__LOAD_FAST || \ - (opcode) == LOAD_FAST__LOAD_CONST || \ - (opcode) == LOAD_CONST__LOAD_FAST || \ - (opcode) == STORE_FAST__LOAD_FAST || \ - (opcode) == STORE_FAST__STORE_FAST) - #define IS_TOP_LEVEL_AWAIT(C) ( \ ((C)->c_flags.cf_flags & PyCF_ALLOW_TOP_LEVEL_AWAIT) \ && ((C)->u->u_ste->ste_type == ModuleBlock)) typedef _PyCompilerSrcLocation location; +typedef _PyCfgInstruction cfg_instr; +typedef _PyCfgBasicblock basicblock; +typedef _PyCfgBuilder cfg_builder; #define LOCATION(LNO, END_LNO, COL, END_COL) \ - ((const location){(LNO), (END_LNO), (COL), (END_COL)}) - -static location NO_LOCATION = {-1, -1, -1, -1}; + ((const _PyCompilerSrcLocation){(LNO), (END_LNO), (COL), (END_COL)}) /* Return true if loc1 starts after loc2 ends. */ static inline bool @@ -165,11 +112,9 @@ same_location(location a, location b) #define LOC(x) SRC_LOCATION_FROM_AST(x) -typedef struct jump_target_label_ { - int id; -} jump_target_label; +typedef _PyCfgJumpTargetLabel jump_target_label; -static struct jump_target_label_ NO_LABEL = {-1}; +static jump_target_label NO_LABEL = {-1}; #define SAME_LABEL(L1, L2) ((L1).id == (L2).id) #define IS_LABEL(L) (!SAME_LABEL((L), (NO_LABEL))) @@ -183,88 +128,9 @@ static struct jump_target_label_ NO_LABEL = {-1}; #define USE_LABEL(C, LBL) \ RETURN_IF_ERROR(instr_sequence_use_label(INSTR_SEQUENCE(C), (LBL).id)) -struct cfg_instr { - int i_opcode; - int i_oparg; - location i_loc; - struct basicblock_ *i_target; /* target block (if jump instruction) */ - struct basicblock_ *i_except; /* target block when exception is raised */ -}; - -/* One arg*/ -#define INSTR_SET_OP1(I, OP, ARG) \ - do { \ - assert(HAS_ARG(OP)); \ - struct cfg_instr *_instr__ptr_ = (I); \ - _instr__ptr_->i_opcode = (OP); \ - _instr__ptr_->i_oparg = (ARG); \ - } while (0); - -/* No args*/ -#define INSTR_SET_OP0(I, OP) \ - do { \ - assert(!HAS_ARG(OP)); \ - struct cfg_instr *_instr__ptr_ = (I); \ - _instr__ptr_->i_opcode = (OP); \ - _instr__ptr_->i_oparg = 0; \ - } while (0); - -typedef struct exceptstack { - struct basicblock_ *handlers[CO_MAXBLOCKS+1]; - int depth; -} ExceptStack; - -#define LOG_BITS_PER_INT 5 -#define MASK_LOW_LOG_BITS 31 - -static inline int -is_bit_set_in_table(const uint32_t *table, int bitindex) { - /* Is the relevant bit set in the relevant word? */ - /* 512 bits fit into 9 32-bits words. - * Word is indexed by (bitindex>>ln(size of int in bits)). - * Bit within word is the low bits of bitindex. - */ - if (bitindex >= 0 && bitindex < 512) { - uint32_t word = table[bitindex >> LOG_BITS_PER_INT]; - return (word >> (bitindex & MASK_LOW_LOG_BITS)) & 1; - } - else { - return 0; - } -} - -static inline int -is_relative_jump(struct cfg_instr *i) -{ - return is_bit_set_in_table(_PyOpcode_RelativeJump, i->i_opcode); -} - -static inline int -is_block_push(struct cfg_instr *i) -{ - return IS_BLOCK_PUSH_OPCODE(i->i_opcode); -} - -static inline int -is_jump(struct cfg_instr *i) -{ - return IS_JUMP_OPCODE(i->i_opcode); -} - -static int -instr_size(struct cfg_instr *instruction) -{ - int opcode = instruction->i_opcode; - assert(!IS_PSEUDO_OPCODE(opcode)); - int oparg = instruction->i_oparg; - assert(HAS_ARG(opcode) || oparg == 0); - int extended_args = (0xFFFFFF < oparg) + (0xFFFF < oparg) + (0xFF < oparg); - int caches = _PyOpcode_Caches[opcode]; - return extended_args + 1 + caches; -} static void -write_instr(_Py_CODEUNIT *codestr, struct cfg_instr *instruction, int ilen) +write_instr(_Py_CODEUNIT *codestr, cfg_instr *instruction, int ilen) { int opcode = instruction->i_opcode; assert(!IS_PSEUDO_OPCODE(opcode)); @@ -302,71 +168,6 @@ write_instr(_Py_CODEUNIT *codestr, struct cfg_instr *instruction, int ilen) } } -typedef struct basicblock_ { - /* Each basicblock in a compilation unit is linked via b_list in the - reverse order that the block are allocated. b_list points to the next - block, not to be confused with b_next, which is next by control flow. */ - struct basicblock_ *b_list; - /* The label of this block if it is a jump target, -1 otherwise */ - jump_target_label b_label; - /* Exception stack at start of block, used by assembler to create the exception handling table */ - ExceptStack *b_exceptstack; - /* pointer to an array of instructions, initially NULL */ - struct cfg_instr *b_instr; - /* If b_next is non-NULL, it is a pointer to the next - block reached by normal control flow. */ - struct basicblock_ *b_next; - /* number of instructions used */ - int b_iused; - /* length of instruction array (b_instr) */ - int b_ialloc; - /* Used by add_checks_for_loads_of_unknown_variables */ - uint64_t b_unsafe_locals_mask; - /* Number of predecessors that a block has. */ - int b_predecessors; - /* depth of stack upon entry of block, computed by stackdepth() */ - int b_startdepth; - /* instruction offset for block, computed by assemble_jump_offsets() */ - int b_offset; - /* Basic block is an exception handler that preserves lasti */ - unsigned b_preserve_lasti : 1; - /* Used by compiler passes to mark whether they have visited a basic block. */ - unsigned b_visited : 1; - /* b_except_handler is used by the cold-detection algorithm to mark exception targets */ - unsigned b_except_handler : 1; - /* b_cold is true if this block is not perf critical (like an exception handler) */ - unsigned b_cold : 1; - /* b_warm is used by the cold-detection algorithm to mark blocks which are definitely not cold */ - unsigned b_warm : 1; -} basicblock; - - -static struct cfg_instr * -basicblock_last_instr(const basicblock *b) { - assert(b->b_iused >= 0); - if (b->b_iused > 0) { - assert(b->b_instr != NULL); - return &b->b_instr[b->b_iused - 1]; - } - return NULL; -} - -static inline int -basicblock_exits_scope(const basicblock *b) { - struct cfg_instr *last = basicblock_last_instr(b); - return last && IS_SCOPE_EXIT_OPCODE(last->i_opcode); -} - -static inline int -basicblock_nofallthrough(const basicblock *b) { - struct cfg_instr *last = basicblock_last_instr(b); - return (last && - (IS_SCOPE_EXIT_OPCODE(last->i_opcode) || - IS_UNCONDITIONAL_JUMP_OPCODE(last->i_opcode))); -} - -#define BB_NO_FALLTHROUGH(B) (basicblock_nofallthrough(B)) -#define BB_HAS_FALLTHROUGH(B) (!basicblock_nofallthrough(B)) /* fblockinfo tracks the current frame block. @@ -397,26 +198,12 @@ enum { COMPILER_SCOPE_COMPREHENSION, }; -typedef struct cfg_builder_ { - /* The entryblock, at which control flow begins. All blocks of the - CFG are reachable through the b_next links */ - basicblock *g_entryblock; - /* Pointer to the most recently allocated block. By following - b_list links, you can reach all allocated blocks. */ - basicblock *g_block_list; - /* pointer to the block currently being constructed */ - basicblock *g_curblock; - /* label for the next instruction to be placed */ - jump_target_label g_current_label; -} cfg_builder; - typedef struct { int i_opcode; int i_oparg; location i_loc; } instruction; - typedef struct instr_sequence_ { instruction *s_instrs; int s_allocated; @@ -440,10 +227,11 @@ typedef struct instr_sequence_ { * item_size: size of each item * */ -static int -ensure_array_large_enough(int idx, void **arr_, int *alloc, int default_alloc, size_t item_size) +int +_PyCompile_EnsureArrayLargeEnough(int idx, void **array, int *alloc, + int default_alloc, size_t item_size) { - void *arr = *arr_; + void *arr = *array; if (arr == NULL) { int new_alloc = default_alloc; if (idx >= new_alloc) { @@ -480,7 +268,7 @@ ensure_array_large_enough(int idx, void **arr_, int *alloc, int default_alloc, s memset((char *)arr + oldsize, 0, newsize - oldsize); } - *arr_ = arr; + *array = arr; return SUCCESS; } @@ -489,11 +277,11 @@ instr_sequence_next_inst(instr_sequence *seq) { assert(seq->s_instrs != NULL || seq->s_used == 0); RETURN_IF_ERROR( - ensure_array_large_enough(seq->s_used + 1, - (void**)&seq->s_instrs, - &seq->s_allocated, - INITIAL_INSTR_SEQUENCE_SIZE, - sizeof(instruction))); + _PyCompile_EnsureArrayLargeEnough(seq->s_used + 1, + (void**)&seq->s_instrs, + &seq->s_allocated, + INITIAL_INSTR_SEQUENCE_SIZE, + sizeof(instruction))); assert(seq->s_used < seq->s_allocated); return seq->s_used++; } @@ -509,11 +297,11 @@ static int instr_sequence_use_label(instr_sequence *seq, int lbl) { int old_size = seq->s_labelmap_size; RETURN_IF_ERROR( - ensure_array_large_enough(lbl, - (void**)&seq->s_labelmap, - &seq->s_labelmap_size, - INITIAL_INSTR_SEQUENCE_LABELS_MAP_SIZE, - sizeof(int))); + _PyCompile_EnsureArrayLargeEnough(lbl, + (void**)&seq->s_labelmap, + &seq->s_labelmap_size, + INITIAL_INSTR_SEQUENCE_LABELS_MAP_SIZE, + sizeof(int))); for(int i = old_size; i < seq->s_labelmap_size; i++) { seq->s_labelmap[i] = -111; /* something weird, for debugging */ @@ -572,29 +360,11 @@ instr_sequence_fini(instr_sequence *seq) { seq->s_instrs = NULL; } -static int basicblock_addop(basicblock *b, int opcode, int oparg, location loc); -static int cfg_builder_maybe_start_new_block(cfg_builder *g); - -static int -cfg_builder_use_label(cfg_builder *g, jump_target_label lbl) -{ - g->g_current_label = lbl; - return cfg_builder_maybe_start_new_block(g); -} - -static int -cfg_builder_addop(cfg_builder *g, int opcode, int oparg, location loc) -{ - RETURN_IF_ERROR(cfg_builder_maybe_start_new_block(g)); - return basicblock_addop(g->g_curblock, opcode, oparg, loc); -} - -static int cfg_builder_init(cfg_builder *g); static int instr_sequence_to_cfg(instr_sequence *seq, cfg_builder *g) { memset(g, 0, sizeof(cfg_builder)); - RETURN_IF_ERROR(cfg_builder_init(g)); + RETURN_IF_ERROR(_PyCfgBuilder_Init(g)); /* There can be more than one label for the same offset. The * offset2lbl maping selects one of them which we use consistently. @@ -621,7 +391,7 @@ instr_sequence_to_cfg(instr_sequence *seq, cfg_builder *g) { if (lbl >= 0) { assert (lbl < seq->s_labelmap_size); jump_target_label lbl_ = {lbl}; - if (cfg_builder_use_label(g, lbl_) < 0) { + if (_PyCfgBuilder_UseLabel(g, lbl_) < 0) { goto error; } } @@ -635,7 +405,7 @@ instr_sequence_to_cfg(instr_sequence *seq, cfg_builder *g) { assert(lbl >= 0 && lbl < seq->s_labelmap_size); oparg = lbl; } - if (cfg_builder_addop(g, opcode, oparg, instr->i_loc) < 0) { + if (_PyCfgBuilder_Addop(g, opcode, oparg, instr->i_loc) < 0) { goto error; } } @@ -746,8 +516,6 @@ typedef struct { Py_ssize_t on_top; } pattern_context; -static int basicblock_next_instr(basicblock *); - static int codegen_addop_i(instr_sequence *seq, int opcode, Py_ssize_t oparg, location loc); static void compiler_free(struct compiler *); @@ -798,8 +566,6 @@ static int compiler_match(struct compiler *, stmt_ty); static int compiler_pattern_subpattern(struct compiler *, pattern_ty, pattern_context *); -static int remove_redundant_nops(basicblock *bb); - static PyCodeObject *assemble(struct compiler *, int addNone); #define CAPSULE_NAME "compile.c compiler unit" @@ -979,57 +745,6 @@ dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset) return dest; } -#ifndef NDEBUG -static bool -cfg_builder_check(cfg_builder *g) -{ - assert(g->g_entryblock->b_iused > 0); - for (basicblock *block = g->g_block_list; block != NULL; block = block->b_list) { - assert(!_PyMem_IsPtrFreed(block)); - if (block->b_instr != NULL) { - assert(block->b_ialloc > 0); - assert(block->b_iused >= 0); - assert(block->b_ialloc >= block->b_iused); - } - else { - assert (block->b_iused == 0); - assert (block->b_ialloc == 0); - } - } - return true; -} -#endif - -static basicblock *cfg_builder_new_block(cfg_builder *g); - -static int -cfg_builder_init(cfg_builder *g) -{ - g->g_block_list = NULL; - basicblock *block = cfg_builder_new_block(g); - if (block == NULL) { - return ERROR; - } - g->g_curblock = g->g_entryblock = block; - g->g_current_label = NO_LABEL; - return SUCCESS; -} - -static void -cfg_builder_fini(cfg_builder* g) -{ - assert(cfg_builder_check(g)); - basicblock *b = g->g_block_list; - while (b != NULL) { - if (b->b_instr) { - PyObject_Free((void *)b->b_instr); - } - basicblock *next = b->b_list; - PyObject_Free((void *)b); - b = next; - } -} - static void compiler_unit_free(struct compiler_unit *u) { @@ -1119,85 +834,6 @@ compiler_set_qualname(struct compiler *c) return SUCCESS; } -/* Allocate a new block and return a pointer to it. - Returns NULL on error. -*/ -static basicblock * -cfg_builder_new_block(cfg_builder *g) -{ - basicblock *b = (basicblock *)PyObject_Calloc(1, sizeof(basicblock)); - if (b == NULL) { - PyErr_NoMemory(); - return NULL; - } - /* Extend the singly linked list of blocks with new block. */ - b->b_list = g->g_block_list; - g->g_block_list = b; - b->b_label = NO_LABEL; - return b; -} - -static basicblock * -cfg_builder_use_next_block(cfg_builder *g, basicblock *block) -{ - assert(block != NULL); - g->g_curblock->b_next = block; - g->g_curblock = block; - return block; -} - -static inline int -basicblock_append_instructions(basicblock *target, basicblock *source) -{ - for (int i = 0; i < source->b_iused; i++) { - int n = basicblock_next_instr(target); - if (n < 0) { - return ERROR; - } - target->b_instr[n] = source->b_instr[i]; - } - return SUCCESS; -} - -static basicblock * -copy_basicblock(cfg_builder *g, basicblock *block) -{ - /* Cannot copy a block if it has a fallthrough, since - * a block can only have one fallthrough predecessor. - */ - assert(BB_NO_FALLTHROUGH(block)); - basicblock *result = cfg_builder_new_block(g); - if (result == NULL) { - return NULL; - } - if (basicblock_append_instructions(result, block) < 0) { - return NULL; - } - return result; -} - -/* Returns the offset of the next instruction in the current block's - b_instr array. Resizes the b_instr as necessary. - Returns -1 on failure. -*/ - -static int -basicblock_next_instr(basicblock *b) -{ - assert(b != NULL); - - RETURN_IF_ERROR( - ensure_array_large_enough( - b->b_iused + 1, - (void**)&b->b_instr, - &b->b_ialloc, - DEFAULT_BLOCK_SIZE, - sizeof(struct cfg_instr))); - - return b->b_iused++; -} - - /* Return the stack effect of opcode with argument oparg. Some opcodes have different stack effect when jump to the target and @@ -1290,62 +926,6 @@ PyCompile_OpcodeStackEffect(int opcode, int oparg) return stack_effect(opcode, oparg, -1); } -static int -basicblock_addop(basicblock *b, int opcode, int oparg, location loc) -{ - assert(IS_WITHIN_OPCODE_RANGE(opcode)); - assert(!IS_ASSEMBLER_OPCODE(opcode)); - assert(HAS_ARG(opcode) || HAS_TARGET(opcode) || oparg == 0); - assert(0 <= oparg && oparg < (1 << 30)); - - int off = basicblock_next_instr(b); - if (off < 0) { - return ERROR; - } - struct cfg_instr *i = &b->b_instr[off]; - i->i_opcode = opcode; - i->i_oparg = oparg; - i->i_target = NULL; - i->i_loc = loc; - - return SUCCESS; -} - -static bool -cfg_builder_current_block_is_terminated(cfg_builder *g) -{ - struct cfg_instr *last = basicblock_last_instr(g->g_curblock); - if (last && IS_TERMINATOR_OPCODE(last->i_opcode)) { - return true; - } - if (IS_LABEL(g->g_current_label)) { - if (last || IS_LABEL(g->g_curblock->b_label)) { - return true; - } - else { - /* current block is empty, label it */ - g->g_curblock->b_label = g->g_current_label; - g->g_current_label = NO_LABEL; - } - } - return false; -} - -static int -cfg_builder_maybe_start_new_block(cfg_builder *g) -{ - if (cfg_builder_current_block_is_terminated(g)) { - basicblock *b = cfg_builder_new_block(g); - if (b == NULL) { - return ERROR; - } - b->b_label = g->g_current_label; - g->g_current_label = NO_LABEL; - cfg_builder_use_next_block(g, b); - } - return SUCCESS; -} - static int codegen_addop_noarg(instr_sequence *seq, int opcode, location loc) { @@ -2520,16 +2100,6 @@ compiler_check_debug_args(struct compiler *c, arguments_ty args) return SUCCESS; } -static inline int -insert_instruction(basicblock *block, int pos, struct cfg_instr *instr) { - RETURN_IF_ERROR(basicblock_next_instr(block)); - for (int i = block->b_iused - 1; i > pos; i--) { - block->b_instr[i] = block->b_instr[i-1]; - } - block->b_instr[pos] = *instr; - return SUCCESS; -} - static int wrap_in_stopiteration_handler(struct compiler *c) { @@ -7037,101 +6607,6 @@ struct assembler { int a_location_off; /* offset of last written location info frame */ }; -static basicblock** -make_cfg_traversal_stack(basicblock *entryblock) { - int nblocks = 0; - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - b->b_visited = 0; - nblocks++; - } - basicblock **stack = (basicblock **)PyMem_Malloc(sizeof(basicblock *) * nblocks); - if (!stack) { - PyErr_NoMemory(); - } - return stack; -} - -Py_LOCAL_INLINE(void) -stackdepth_push(basicblock ***sp, basicblock *b, int depth) -{ - assert(b->b_startdepth < 0 || b->b_startdepth == depth); - if (b->b_startdepth < depth && b->b_startdepth < 100) { - assert(b->b_startdepth < 0); - b->b_startdepth = depth; - *(*sp)++ = b; - } -} - -/* Find the flow path that needs the largest stack. We assume that - * cycles in the flow graph have no net effect on the stack depth. - */ -static int -stackdepth(basicblock *entryblock, int code_flags) -{ - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - b->b_startdepth = INT_MIN; - } - basicblock **stack = make_cfg_traversal_stack(entryblock); - if (!stack) { - return ERROR; - } - - int maxdepth = 0; - basicblock **sp = stack; - if (code_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) { - stackdepth_push(&sp, entryblock, 1); - } else { - stackdepth_push(&sp, entryblock, 0); - } - - while (sp != stack) { - basicblock *b = *--sp; - int depth = b->b_startdepth; - assert(depth >= 0); - basicblock *next = b->b_next; - for (int i = 0; i < b->b_iused; i++) { - struct cfg_instr *instr = &b->b_instr[i]; - int effect = stack_effect(instr->i_opcode, instr->i_oparg, 0); - if (effect == PY_INVALID_STACK_EFFECT) { - PyErr_Format(PyExc_SystemError, - "compiler stack_effect(opcode=%d, arg=%i) failed", - instr->i_opcode, instr->i_oparg); - return ERROR; - } - int new_depth = depth + effect; - assert(new_depth >= 0); /* invalid code or bug in stackdepth() */ - if (new_depth > maxdepth) { - maxdepth = new_depth; - } - if (HAS_TARGET(instr->i_opcode)) { - effect = stack_effect(instr->i_opcode, instr->i_oparg, 1); - assert(effect != PY_INVALID_STACK_EFFECT); - int target_depth = depth + effect; - assert(target_depth >= 0); /* invalid code or bug in stackdepth() */ - if (target_depth > maxdepth) { - maxdepth = target_depth; - } - stackdepth_push(&sp, instr->i_target, target_depth); - } - depth = new_depth; - assert(!IS_ASSEMBLER_OPCODE(instr->i_opcode)); - if (IS_UNCONDITIONAL_JUMP_OPCODE(instr->i_opcode) || - IS_SCOPE_EXIT_OPCODE(instr->i_opcode)) - { - /* remaining code is dead */ - next = NULL; - break; - } - } - if (next != NULL) { - assert(BB_HAS_FALLTHROUGH(b)); - stackdepth_push(&sp, next, depth); - } - } - PyMem_Free(stack); - return maxdepth; -} - static int assemble_init(struct assembler *a, int firstlineno) { @@ -7168,389 +6643,47 @@ assemble_free(struct assembler *a) Py_XDECREF(a->a_except_table); } -static int -blocksize(basicblock *b) -{ - int size = 0; - for (int i = 0; i < b->b_iused; i++) { - size += instr_size(&b->b_instr[i]); - } - return size; -} - -static basicblock * -push_except_block(ExceptStack *stack, struct cfg_instr *setup) { - assert(is_block_push(setup)); - int opcode = setup->i_opcode; - basicblock * target = setup->i_target; - if (opcode == SETUP_WITH || opcode == SETUP_CLEANUP) { - target->b_preserve_lasti = 1; - } - stack->handlers[++stack->depth] = target; - return target; -} - -static basicblock * -pop_except_block(ExceptStack *stack) { - assert(stack->depth > 0); - return stack->handlers[--stack->depth]; +static inline void +write_except_byte(struct assembler *a, int byte) { + unsigned char *p = (unsigned char *) PyBytes_AS_STRING(a->a_except_table); + p[a->a_except_table_off++] = byte; } -static basicblock * -except_stack_top(ExceptStack *stack) { - return stack->handlers[stack->depth]; -} +#define CONTINUATION_BIT 64 -static ExceptStack * -make_except_stack(void) { - ExceptStack *new = PyMem_Malloc(sizeof(ExceptStack)); - if (new == NULL) { - PyErr_NoMemory(); - return NULL; +static void +assemble_emit_exception_table_item(struct assembler *a, int value, int msb) +{ + assert ((msb | 128) == 128); + assert(value >= 0 && value < (1 << 30)); + if (value >= 1 << 24) { + write_except_byte(a, (value >> 24) | CONTINUATION_BIT | msb); + msb = 0; } - new->depth = 0; - new->handlers[0] = NULL; - return new; -} - -static ExceptStack * -copy_except_stack(ExceptStack *stack) { - ExceptStack *copy = PyMem_Malloc(sizeof(ExceptStack)); - if (copy == NULL) { - PyErr_NoMemory(); - return NULL; + if (value >= 1 << 18) { + write_except_byte(a, ((value >> 18)&0x3f) | CONTINUATION_BIT | msb); + msb = 0; + } + if (value >= 1 << 12) { + write_except_byte(a, ((value >> 12)&0x3f) | CONTINUATION_BIT | msb); + msb = 0; } - memcpy(copy, stack, sizeof(ExceptStack)); - return copy; + if (value >= 1 << 6) { + write_except_byte(a, ((value >> 6)&0x3f) | CONTINUATION_BIT | msb); + msb = 0; + } + write_except_byte(a, (value&0x3f) | msb); } +/* See Objects/exception_handling_notes.txt for details of layout */ +#define MAX_SIZE_OF_ENTRY 20 + static int -label_exception_targets(basicblock *entryblock) { - basicblock **todo_stack = make_cfg_traversal_stack(entryblock); - if (todo_stack == NULL) { - return ERROR; - } - ExceptStack *except_stack = make_except_stack(); - if (except_stack == NULL) { - PyMem_Free(todo_stack); - PyErr_NoMemory(); - return ERROR; - } - except_stack->depth = 0; - todo_stack[0] = entryblock; - entryblock->b_visited = 1; - entryblock->b_exceptstack = except_stack; - basicblock **todo = &todo_stack[1]; - basicblock *handler = NULL; - while (todo > todo_stack) { - todo--; - basicblock *b = todo[0]; - assert(b->b_visited == 1); - except_stack = b->b_exceptstack; - assert(except_stack != NULL); - b->b_exceptstack = NULL; - handler = except_stack_top(except_stack); - for (int i = 0; i < b->b_iused; i++) { - struct cfg_instr *instr = &b->b_instr[i]; - if (is_block_push(instr)) { - if (!instr->i_target->b_visited) { - ExceptStack *copy = copy_except_stack(except_stack); - if (copy == NULL) { - goto error; - } - instr->i_target->b_exceptstack = copy; - todo[0] = instr->i_target; - instr->i_target->b_visited = 1; - todo++; - } - handler = push_except_block(except_stack, instr); - } - else if (instr->i_opcode == POP_BLOCK) { - handler = pop_except_block(except_stack); - } - else if (is_jump(instr)) { - instr->i_except = handler; - assert(i == b->b_iused -1); - if (!instr->i_target->b_visited) { - if (BB_HAS_FALLTHROUGH(b)) { - ExceptStack *copy = copy_except_stack(except_stack); - if (copy == NULL) { - goto error; - } - instr->i_target->b_exceptstack = copy; - } - else { - instr->i_target->b_exceptstack = except_stack; - except_stack = NULL; - } - todo[0] = instr->i_target; - instr->i_target->b_visited = 1; - todo++; - } - } - else { - if (instr->i_opcode == YIELD_VALUE) { - instr->i_oparg = except_stack->depth; - } - instr->i_except = handler; - } - } - if (BB_HAS_FALLTHROUGH(b) && !b->b_next->b_visited) { - assert(except_stack != NULL); - b->b_next->b_exceptstack = except_stack; - todo[0] = b->b_next; - b->b_next->b_visited = 1; - todo++; - } - else if (except_stack != NULL) { - PyMem_Free(except_stack); - } - } -#ifdef Py_DEBUG - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - assert(b->b_exceptstack == NULL); - } -#endif - PyMem_Free(todo_stack); - return SUCCESS; -error: - PyMem_Free(todo_stack); - PyMem_Free(except_stack); - return ERROR; -} - - -static int -mark_except_handlers(basicblock *entryblock) { -#ifndef NDEBUG - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - assert(!b->b_except_handler); - } -#endif - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - for (int i=0; i < b->b_iused; i++) { - struct cfg_instr *instr = &b->b_instr[i]; - if (is_block_push(instr)) { - instr->i_target->b_except_handler = 1; - } - } - } - return SUCCESS; -} - -static int -mark_warm(basicblock *entryblock) { - basicblock **stack = make_cfg_traversal_stack(entryblock); - if (stack == NULL) { - return ERROR; - } - basicblock **sp = stack; - - *sp++ = entryblock; - entryblock->b_visited = 1; - while (sp > stack) { - basicblock *b = *(--sp); - assert(!b->b_except_handler); - b->b_warm = 1; - basicblock *next = b->b_next; - if (next && BB_HAS_FALLTHROUGH(b) && !next->b_visited) { - *sp++ = next; - next->b_visited = 1; - } - for (int i=0; i < b->b_iused; i++) { - struct cfg_instr *instr = &b->b_instr[i]; - if (is_jump(instr) && !instr->i_target->b_visited) { - *sp++ = instr->i_target; - instr->i_target->b_visited = 1; - } - } - } - PyMem_Free(stack); - return SUCCESS; -} - -static int -mark_cold(basicblock *entryblock) { - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - assert(!b->b_cold && !b->b_warm); - } - if (mark_warm(entryblock) < 0) { - return ERROR; - } - - basicblock **stack = make_cfg_traversal_stack(entryblock); - if (stack == NULL) { - return ERROR; - } - - basicblock **sp = stack; - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - if (b->b_except_handler) { - assert(!b->b_warm); - *sp++ = b; - b->b_visited = 1; - } - } - - while (sp > stack) { - basicblock *b = *(--sp); - b->b_cold = 1; - basicblock *next = b->b_next; - if (next && BB_HAS_FALLTHROUGH(b)) { - if (!next->b_warm && !next->b_visited) { - *sp++ = next; - next->b_visited = 1; - } - } - for (int i = 0; i < b->b_iused; i++) { - struct cfg_instr *instr = &b->b_instr[i]; - if (is_jump(instr)) { - assert(i == b->b_iused - 1); - basicblock *target = b->b_instr[i].i_target; - if (!target->b_warm && !target->b_visited) { - *sp++ = target; - target->b_visited = 1; - } - } - } - } - PyMem_Free(stack); - return SUCCESS; -} - -static int -remove_redundant_jumps(cfg_builder *g); - -static int -push_cold_blocks_to_end(cfg_builder *g, int code_flags) { - basicblock *entryblock = g->g_entryblock; - if (entryblock->b_next == NULL) { - /* single basicblock, no need to reorder */ - return SUCCESS; - } - RETURN_IF_ERROR(mark_cold(entryblock)); - - /* If we have a cold block with fallthrough to a warm block, add */ - /* an explicit jump instead of fallthrough */ - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - if (b->b_cold && BB_HAS_FALLTHROUGH(b) && b->b_next && b->b_next->b_warm) { - basicblock *explicit_jump = cfg_builder_new_block(g); - if (explicit_jump == NULL) { - return ERROR; - } - basicblock_addop(explicit_jump, JUMP, b->b_next->b_label.id, NO_LOCATION); - explicit_jump->b_cold = 1; - explicit_jump->b_next = b->b_next; - b->b_next = explicit_jump; - - /* set target */ - struct cfg_instr *last = basicblock_last_instr(explicit_jump); - last->i_target = explicit_jump->b_next; - } - } - - assert(!entryblock->b_cold); /* First block can't be cold */ - basicblock *cold_blocks = NULL; - basicblock *cold_blocks_tail = NULL; - - basicblock *b = entryblock; - while(b->b_next) { - assert(!b->b_cold); - while (b->b_next && !b->b_next->b_cold) { - b = b->b_next; - } - if (b->b_next == NULL) { - /* no more cold blocks */ - break; - } - - /* b->b_next is the beginning of a cold streak */ - assert(!b->b_cold && b->b_next->b_cold); - - basicblock *b_end = b->b_next; - while (b_end->b_next && b_end->b_next->b_cold) { - b_end = b_end->b_next; - } - - /* b_end is the end of the cold streak */ - assert(b_end && b_end->b_cold); - assert(b_end->b_next == NULL || !b_end->b_next->b_cold); - - if (cold_blocks == NULL) { - cold_blocks = b->b_next; - } - else { - cold_blocks_tail->b_next = b->b_next; - } - cold_blocks_tail = b_end; - b->b_next = b_end->b_next; - b_end->b_next = NULL; - } - assert(b != NULL && b->b_next == NULL); - b->b_next = cold_blocks; - - if (cold_blocks != NULL) { - RETURN_IF_ERROR(remove_redundant_jumps(g)); - } - return SUCCESS; -} - -static void -convert_exception_handlers_to_nops(basicblock *entryblock) { - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - for (int i = 0; i < b->b_iused; i++) { - struct cfg_instr *instr = &b->b_instr[i]; - if (is_block_push(instr) || instr->i_opcode == POP_BLOCK) { - INSTR_SET_OP0(instr, NOP); - } - } - } - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - remove_redundant_nops(b); - } -} - -static inline void -write_except_byte(struct assembler *a, int byte) { - unsigned char *p = (unsigned char *) PyBytes_AS_STRING(a->a_except_table); - p[a->a_except_table_off++] = byte; -} - -#define CONTINUATION_BIT 64 - -static void -assemble_emit_exception_table_item(struct assembler *a, int value, int msb) -{ - assert ((msb | 128) == 128); - assert(value >= 0 && value < (1 << 30)); - if (value >= 1 << 24) { - write_except_byte(a, (value >> 24) | CONTINUATION_BIT | msb); - msb = 0; - } - if (value >= 1 << 18) { - write_except_byte(a, ((value >> 18)&0x3f) | CONTINUATION_BIT | msb); - msb = 0; - } - if (value >= 1 << 12) { - write_except_byte(a, ((value >> 12)&0x3f) | CONTINUATION_BIT | msb); - msb = 0; - } - if (value >= 1 << 6) { - write_except_byte(a, ((value >> 6)&0x3f) | CONTINUATION_BIT | msb); - msb = 0; - } - write_except_byte(a, (value&0x3f) | msb); -} - -/* See Objects/exception_handling_notes.txt for details of layout */ -#define MAX_SIZE_OF_ENTRY 20 - -static int -assemble_emit_exception_table_entry(struct assembler *a, int start, int end, basicblock *handler) -{ - Py_ssize_t len = PyBytes_GET_SIZE(a->a_except_table); - if (a->a_except_table_off + MAX_SIZE_OF_ENTRY >= len) { - RETURN_IF_ERROR(_PyBytes_Resize(&a->a_except_table, len * 2)); +assemble_emit_exception_table_entry(struct assembler *a, int start, int end, basicblock *handler) +{ + Py_ssize_t len = PyBytes_GET_SIZE(a->a_except_table); + if (a->a_except_table_off + MAX_SIZE_OF_ENTRY >= len) { + RETURN_IF_ERROR(_PyBytes_Resize(&a->a_except_table, len * 2)); } int size = end-start; assert(end > start); @@ -7578,7 +6711,7 @@ assemble_exception_table(struct assembler *a, basicblock *entryblock) for (b = entryblock; b != NULL; b = b->b_next) { ioffset = b->b_offset; for (int i = 0; i < b->b_iused; i++) { - struct cfg_instr *instr = &b->b_instr[i]; + cfg_instr *instr = &b->b_instr[i]; if (instr->i_except != handler) { if (handler != NULL) { RETURN_IF_ERROR( @@ -7587,7 +6720,7 @@ assemble_exception_table(struct assembler *a, basicblock *entryblock) start = ioffset; handler = instr->i_except; } - ioffset += instr_size(instr); + ioffset += _PyCfg_InstrSize(instr); } } if (handler != NULL) { @@ -7755,7 +6888,7 @@ assemble_location_info(struct assembler *a, basicblock *entryblock, int firstlin loc = b->b_instr[j].i_loc; size = 0; } - size += instr_size(&b->b_instr[j]); + size += _PyCfg_InstrSize(&b->b_instr[j]); } } RETURN_IF_ERROR(assemble_emit_location(a, loc, size)); @@ -7768,12 +6901,12 @@ assemble_location_info(struct assembler *a, basicblock *entryblock, int firstlin */ static int -assemble_emit_instr(struct assembler *a, struct cfg_instr *i) +assemble_emit_instr(struct assembler *a, cfg_instr *i) { Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode); _Py_CODEUNIT *code; - int size = instr_size(i); + int size = _PyCfg_InstrSize(i); if (a->a_offset + size >= len / (int)sizeof(_Py_CODEUNIT)) { if (len > PY_SSIZE_T_MAX / 2) { return ERROR; @@ -7786,8 +6919,6 @@ assemble_emit_instr(struct assembler *a, struct cfg_instr *i) return SUCCESS; } -static int merge_const_one(PyObject *const_cache, PyObject **obj); - static int assemble_emit(struct assembler *a, basicblock *entryblock, int first_lineno, PyObject *const_cache) @@ -7805,391 +6936,95 @@ assemble_emit(struct assembler *a, basicblock *entryblock, int first_lineno, RETURN_IF_ERROR(assemble_exception_table(a, entryblock)); RETURN_IF_ERROR(_PyBytes_Resize(&a->a_except_table, a->a_except_table_off)); - RETURN_IF_ERROR(merge_const_one(const_cache, &a->a_except_table)); + RETURN_IF_ERROR(_PyCompile_ConstCacheMergeOne(const_cache, &a->a_except_table)); RETURN_IF_ERROR(_PyBytes_Resize(&a->a_linetable, a->a_location_off)); - RETURN_IF_ERROR(merge_const_one(const_cache, &a->a_linetable)); + RETURN_IF_ERROR(_PyCompile_ConstCacheMergeOne(const_cache, &a->a_linetable)); RETURN_IF_ERROR(_PyBytes_Resize(&a->a_bytecode, a->a_offset * sizeof(_Py_CODEUNIT))); - RETURN_IF_ERROR(merge_const_one(const_cache, &a->a_bytecode)); + RETURN_IF_ERROR(_PyCompile_ConstCacheMergeOne(const_cache, &a->a_bytecode)); return SUCCESS; } -static int -normalize_jumps_in_block(cfg_builder *g, basicblock *b) { - struct cfg_instr *last = basicblock_last_instr(b); - if (last == NULL || !is_jump(last)) { - return SUCCESS; - } - assert(!IS_ASSEMBLER_OPCODE(last->i_opcode)); - bool is_forward = last->i_target->b_visited == 0; - switch(last->i_opcode) { - case JUMP: - last->i_opcode = is_forward ? JUMP_FORWARD : JUMP_BACKWARD; - return SUCCESS; - case JUMP_NO_INTERRUPT: - last->i_opcode = is_forward ? - JUMP_FORWARD : JUMP_BACKWARD_NO_INTERRUPT; - return SUCCESS; - } - int reversed_opcode = 0; - switch(last->i_opcode) { - case POP_JUMP_IF_NOT_NONE: - reversed_opcode = POP_JUMP_IF_NONE; - break; - case POP_JUMP_IF_NONE: - reversed_opcode = POP_JUMP_IF_NOT_NONE; - break; - case POP_JUMP_IF_FALSE: - reversed_opcode = POP_JUMP_IF_TRUE; - break; - case POP_JUMP_IF_TRUE: - reversed_opcode = POP_JUMP_IF_FALSE; - break; - } - if (is_forward) { - return SUCCESS; +static PyObject * +dict_keys_inorder(PyObject *dict, Py_ssize_t offset) +{ + PyObject *tuple, *k, *v; + Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict); + + tuple = PyTuple_New(size); + if (tuple == NULL) + return NULL; + while (PyDict_Next(dict, &pos, &k, &v)) { + i = PyLong_AS_LONG(v); + assert((i - offset) < size); + assert((i - offset) >= 0); + PyTuple_SET_ITEM(tuple, i - offset, Py_NewRef(k)); } + return tuple; +} - /* transform 'conditional jump T' to - * 'reversed_jump b_next' followed by 'jump_backwards T' - */ +static PyObject * +consts_dict_keys_inorder(PyObject *dict) +{ + PyObject *consts, *k, *v; + Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict); - basicblock *target = last->i_target; - basicblock *backwards_jump = cfg_builder_new_block(g); - if (backwards_jump == NULL) { - return ERROR; + consts = PyList_New(size); /* PyCode_Optimize() requires a list */ + if (consts == NULL) + return NULL; + while (PyDict_Next(dict, &pos, &k, &v)) { + i = PyLong_AS_LONG(v); + /* The keys of the dictionary can be tuples wrapping a constant. + * (see dict_add_o and _PyCode_ConstantKey). In that case + * the object we want is always second. */ + if (PyTuple_CheckExact(k)) { + k = PyTuple_GET_ITEM(k, 1); + } + assert(i < size); + assert(i >= 0); + PyList_SET_ITEM(consts, i, Py_NewRef(k)); } - basicblock_addop(backwards_jump, JUMP, target->b_label.id, NO_LOCATION); - backwards_jump->b_instr[0].i_target = target; - last->i_opcode = reversed_opcode; - last->i_target = b->b_next; - - backwards_jump->b_cold = b->b_cold; - backwards_jump->b_next = b->b_next; - b->b_next = backwards_jump; - return SUCCESS; + return consts; } static int -normalize_jumps(cfg_builder *g) +compute_code_flags(struct compiler *c) { - basicblock *entryblock = g->g_entryblock; - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - b->b_visited = 0; - } - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - b->b_visited = 1; - RETURN_IF_ERROR(normalize_jumps_in_block(g, b)); + PySTEntryObject *ste = c->u->u_ste; + int flags = 0; + if (ste->ste_type == FunctionBlock) { + flags |= CO_NEWLOCALS | CO_OPTIMIZED; + if (ste->ste_nested) + flags |= CO_NESTED; + if (ste->ste_generator && !ste->ste_coroutine) + flags |= CO_GENERATOR; + if (!ste->ste_generator && ste->ste_coroutine) + flags |= CO_COROUTINE; + if (ste->ste_generator && ste->ste_coroutine) + flags |= CO_ASYNC_GENERATOR; + if (ste->ste_varargs) + flags |= CO_VARARGS; + if (ste->ste_varkeywords) + flags |= CO_VARKEYWORDS; } - return SUCCESS; -} - -static void -assemble_jump_offsets(basicblock *entryblock) -{ - int bsize, totsize, extended_arg_recompile; - - /* Compute the size of each block and fixup jump args. - Replace block pointer with position in bytecode. */ - do { - totsize = 0; - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - bsize = blocksize(b); - b->b_offset = totsize; - totsize += bsize; - } - extended_arg_recompile = 0; - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - bsize = b->b_offset; - for (int i = 0; i < b->b_iused; i++) { - struct cfg_instr *instr = &b->b_instr[i]; - int isize = instr_size(instr); - /* Relative jumps are computed relative to - the instruction pointer after fetching - the jump instruction. - */ - bsize += isize; - if (is_jump(instr)) { - instr->i_oparg = instr->i_target->b_offset; - if (is_relative_jump(instr)) { - if (instr->i_oparg < bsize) { - assert(IS_BACKWARDS_JUMP_OPCODE(instr->i_opcode)); - instr->i_oparg = bsize - instr->i_oparg; - } - else { - assert(!IS_BACKWARDS_JUMP_OPCODE(instr->i_opcode)); - instr->i_oparg -= bsize; - } - } - else { - assert(!IS_BACKWARDS_JUMP_OPCODE(instr->i_opcode)); - } - if (instr_size(instr) != isize) { - extended_arg_recompile = 1; - } - } - } - } - /* XXX: This is an awful hack that could hurt performance, but - on the bright side it should work until we come up - with a better solution. + /* (Only) inherit compilerflags in PyCF_MASK */ + flags |= (c->c_flags.cf_flags & PyCF_MASK); - The issue is that in the first loop blocksize() is called - which calls instr_size() which requires i_oparg be set - appropriately. There is a bootstrap problem because - i_oparg is calculated in the second loop above. + if ((IS_TOP_LEVEL_AWAIT(c)) && + ste->ste_coroutine && + !ste->ste_generator) { + flags |= CO_COROUTINE; + } - So we loop until we stop seeing new EXTENDED_ARGs. - The only EXTENDED_ARGs that could be popping up are - ones in jump instructions. So this should converge - fairly quickly. - */ - } while (extended_arg_recompile); + return flags; } - -// helper functions for add_checks_for_loads_of_unknown_variables -static inline void -maybe_push(basicblock *b, uint64_t unsafe_mask, basicblock ***sp) -{ - // Push b if the unsafe mask is giving us any new information. - // To avoid overflowing the stack, only allow each block once. - // Use b->b_visited=1 to mean that b is currently on the stack. - uint64_t both = b->b_unsafe_locals_mask | unsafe_mask; - if (b->b_unsafe_locals_mask != both) { - b->b_unsafe_locals_mask = both; - // More work left to do. - if (!b->b_visited) { - // not on the stack, so push it. - *(*sp)++ = b; - b->b_visited = 1; - } - } -} - -static void -scan_block_for_locals(basicblock *b, basicblock ***sp) -{ - // bit i is set if local i is potentially uninitialized - uint64_t unsafe_mask = b->b_unsafe_locals_mask; - for (int i = 0; i < b->b_iused; i++) { - struct cfg_instr *instr = &b->b_instr[i]; - assert(instr->i_opcode != EXTENDED_ARG); - assert(!IS_SUPERINSTRUCTION_OPCODE(instr->i_opcode)); - if (instr->i_except != NULL) { - maybe_push(instr->i_except, unsafe_mask, sp); - } - if (instr->i_oparg >= 64) { - continue; - } - assert(instr->i_oparg >= 0); - uint64_t bit = (uint64_t)1 << instr->i_oparg; - switch (instr->i_opcode) { - case DELETE_FAST: - unsafe_mask |= bit; - break; - case STORE_FAST: - unsafe_mask &= ~bit; - break; - case LOAD_FAST_CHECK: - // If this doesn't raise, then the local is defined. - unsafe_mask &= ~bit; - break; - case LOAD_FAST: - if (unsafe_mask & bit) { - instr->i_opcode = LOAD_FAST_CHECK; - } - unsafe_mask &= ~bit; - break; - } - } - if (b->b_next && BB_HAS_FALLTHROUGH(b)) { - maybe_push(b->b_next, unsafe_mask, sp); - } - struct cfg_instr *last = basicblock_last_instr(b); - if (last && is_jump(last)) { - assert(last->i_target != NULL); - maybe_push(last->i_target, unsafe_mask, sp); - } -} - -static int -fast_scan_many_locals(basicblock *entryblock, int nlocals) -{ - assert(nlocals > 64); - Py_ssize_t *states = PyMem_Calloc(nlocals - 64, sizeof(Py_ssize_t)); - if (states == NULL) { - PyErr_NoMemory(); - return ERROR; - } - Py_ssize_t blocknum = 0; - // state[i - 64] == blocknum if local i is guaranteed to - // be initialized, i.e., if it has had a previous LOAD_FAST or - // STORE_FAST within that basicblock (not followed by DELETE_FAST). - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - blocknum++; - for (int i = 0; i < b->b_iused; i++) { - struct cfg_instr *instr = &b->b_instr[i]; - assert(instr->i_opcode != EXTENDED_ARG); - assert(!IS_SUPERINSTRUCTION_OPCODE(instr->i_opcode)); - int arg = instr->i_oparg; - if (arg < 64) { - continue; - } - assert(arg >= 0); - switch (instr->i_opcode) { - case DELETE_FAST: - states[arg - 64] = blocknum - 1; - break; - case STORE_FAST: - states[arg - 64] = blocknum; - break; - case LOAD_FAST: - if (states[arg - 64] != blocknum) { - instr->i_opcode = LOAD_FAST_CHECK; - } - states[arg - 64] = blocknum; - break; - case LOAD_FAST_CHECK: - Py_UNREACHABLE(); - } - } - } - PyMem_Free(states); - return SUCCESS; -} - -static int -add_checks_for_loads_of_uninitialized_variables(basicblock *entryblock, - int nlocals, - int nparams) -{ - if (nlocals == 0) { - return SUCCESS; - } - if (nlocals > 64) { - // To avoid O(nlocals**2) compilation, locals beyond the first - // 64 are only analyzed one basicblock at a time: initialization - // info is not passed between basicblocks. - if (fast_scan_many_locals(entryblock, nlocals) < 0) { - return ERROR; - } - nlocals = 64; - } - basicblock **stack = make_cfg_traversal_stack(entryblock); - if (stack == NULL) { - return ERROR; - } - basicblock **sp = stack; - - // First origin of being uninitialized: - // The non-parameter locals in the entry block. - uint64_t start_mask = 0; - for (int i = nparams; i < nlocals; i++) { - start_mask |= (uint64_t)1 << i; - } - maybe_push(entryblock, start_mask, &sp); - - // Second origin of being uninitialized: - // There could be DELETE_FAST somewhere, so - // be sure to scan each basicblock at least once. - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - scan_block_for_locals(b, &sp); - } - - // Now propagate the uncertainty from the origins we found: Use - // LOAD_FAST_CHECK for any LOAD_FAST where the local could be undefined. - while (sp > stack) { - basicblock *b = *--sp; - // mark as no longer on stack - b->b_visited = 0; - scan_block_for_locals(b, &sp); - } - PyMem_Free(stack); - return SUCCESS; -} - -static PyObject * -dict_keys_inorder(PyObject *dict, Py_ssize_t offset) -{ - PyObject *tuple, *k, *v; - Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict); - - tuple = PyTuple_New(size); - if (tuple == NULL) - return NULL; - while (PyDict_Next(dict, &pos, &k, &v)) { - i = PyLong_AS_LONG(v); - assert((i - offset) < size); - assert((i - offset) >= 0); - PyTuple_SET_ITEM(tuple, i - offset, Py_NewRef(k)); - } - return tuple; -} - -static PyObject * -consts_dict_keys_inorder(PyObject *dict) -{ - PyObject *consts, *k, *v; - Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict); - - consts = PyList_New(size); /* PyCode_Optimize() requires a list */ - if (consts == NULL) - return NULL; - while (PyDict_Next(dict, &pos, &k, &v)) { - i = PyLong_AS_LONG(v); - /* The keys of the dictionary can be tuples wrapping a constant. - * (see dict_add_o and _PyCode_ConstantKey). In that case - * the object we want is always second. */ - if (PyTuple_CheckExact(k)) { - k = PyTuple_GET_ITEM(k, 1); - } - assert(i < size); - assert(i >= 0); - PyList_SET_ITEM(consts, i, Py_NewRef(k)); - } - return consts; -} - -static int -compute_code_flags(struct compiler *c) -{ - PySTEntryObject *ste = c->u->u_ste; - int flags = 0; - if (ste->ste_type == FunctionBlock) { - flags |= CO_NEWLOCALS | CO_OPTIMIZED; - if (ste->ste_nested) - flags |= CO_NESTED; - if (ste->ste_generator && !ste->ste_coroutine) - flags |= CO_GENERATOR; - if (!ste->ste_generator && ste->ste_coroutine) - flags |= CO_COROUTINE; - if (ste->ste_generator && ste->ste_coroutine) - flags |= CO_ASYNC_GENERATOR; - if (ste->ste_varargs) - flags |= CO_VARARGS; - if (ste->ste_varkeywords) - flags |= CO_VARKEYWORDS; - } - - /* (Only) inherit compilerflags in PyCF_MASK */ - flags |= (c->c_flags.cf_flags & PyCF_MASK); - - if ((IS_TOP_LEVEL_AWAIT(c)) && - ste->ste_coroutine && - !ste->ste_generator) { - flags |= CO_COROUTINE; - } - - return flags; -} - -// Merge *obj* with constant cache. -// Unlike merge_consts_recursive(), this function doesn't work recursively. -static int -merge_const_one(PyObject *const_cache, PyObject **obj) +// Merge *obj* with constant cache. +// Unlike merge_consts_recursive(), this function doesn't work recursively. +int +_PyCompile_ConstCacheMergeOne(PyObject *const_cache, PyObject **obj) { assert(PyDict_CheckExact(const_cache)); PyObject *key = _PyCode_ConstantKey(*obj); @@ -8279,7 +7114,7 @@ makecode(struct compiler_unit *u, struct assembler *a, PyObject *const_cache, if (!names) { goto error; } - if (merge_const_one(const_cache, &names) < 0) { + if (_PyCompile_ConstCacheMergeOne(const_cache, &names) < 0) { goto error; } @@ -8287,7 +7122,7 @@ makecode(struct compiler_unit *u, struct assembler *a, PyObject *const_cache, if (consts == NULL) { goto error; } - if (merge_const_one(const_cache, &consts) < 0) { + if (_PyCompile_ConstCacheMergeOne(const_cache, &consts) < 0) { goto error; } @@ -8338,7 +7173,7 @@ makecode(struct compiler_unit *u, struct assembler *a, PyObject *const_cache, goto error; } - if (merge_const_one(const_cache, &localsplusnames) < 0) { + if (_PyCompile_ConstCacheMergeOne(const_cache, &localsplusnames) < 0) { goto error; } con.localsplusnames = localsplusnames; @@ -8357,64 +7192,6 @@ makecode(struct compiler_unit *u, struct assembler *a, PyObject *const_cache, } -/* For debugging purposes only */ -#if 0 -static void -dump_instr(struct cfg_instr *i) -{ - const char *jrel = (is_relative_jump(i)) ? "jrel " : ""; - const char *jabs = (is_jump(i) && !is_relative_jump(i))? "jabs " : ""; - - char arg[128]; - - *arg = '\0'; - if (HAS_ARG(i->i_opcode)) { - sprintf(arg, "arg: %d ", i->i_oparg); - } - if (HAS_TARGET(i->i_opcode)) { - sprintf(arg, "target: %p [%d] ", i->i_target, i->i_oparg); - } - fprintf(stderr, "line: %d, opcode: %d %s%s%s\n", - i->i_loc.lineno, i->i_opcode, arg, jabs, jrel); -} - -static inline int -basicblock_returns(const basicblock *b) { - struct cfg_instr *last = basicblock_last_instr(b); - return last && (last->i_opcode == RETURN_VALUE || last->i_opcode == RETURN_CONST); -} - -static void -dump_basicblock(const basicblock *b) -{ - const char *b_return = basicblock_returns(b) ? "return " : ""; - fprintf(stderr, "%d: [EH=%d CLD=%d WRM=%d NO_FT=%d %p] used: %d, depth: %d, offset: %d %s\n", - b->b_label.id, b->b_except_handler, b->b_cold, b->b_warm, BB_NO_FALLTHROUGH(b), b, b->b_iused, - b->b_startdepth, b->b_offset, b_return); - if (b->b_instr) { - int i; - for (i = 0; i < b->b_iused; i++) { - fprintf(stderr, " [%02d] ", i); - dump_instr(b->b_instr + i); - } - } -} -#endif - - -static int -translate_jump_labels_to_targets(basicblock *entryblock); - -static int -optimize_cfg(cfg_builder *g, PyObject *consts, PyObject *const_cache); - -static int -remove_unused_consts(basicblock *entryblock, PyObject *consts); - -/* Duplicates exit BBs, so that line numbers can be propagated to them */ -static int -duplicate_exits_without_lineno(cfg_builder *g); - static int * build_cellfixedoffsets(struct compiler_unit *u) { @@ -8456,20 +7233,20 @@ insert_prefix_instructions(struct compiler_unit *u, basicblock *entryblock, /* Add the generator prefix instructions. */ if (code_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) { - struct cfg_instr make_gen = { + cfg_instr make_gen = { .i_opcode = RETURN_GENERATOR, .i_oparg = 0, .i_loc = LOCATION(u->u_firstlineno, u->u_firstlineno, -1, -1), .i_target = NULL, }; - RETURN_IF_ERROR(insert_instruction(entryblock, 0, &make_gen)); - struct cfg_instr pop_top = { + RETURN_IF_ERROR(_PyBasicblock_InsertInstruction(entryblock, 0, &make_gen)); + cfg_instr pop_top = { .i_opcode = POP_TOP, .i_oparg = 0, .i_loc = NO_LOCATION, .i_target = NULL, }; - RETURN_IF_ERROR(insert_instruction(entryblock, 1, &pop_top)); + RETURN_IF_ERROR(_PyBasicblock_InsertInstruction(entryblock, 1, &pop_top)); } /* Set up cells for any variable that escapes, to be put in a closure. */ @@ -8492,60 +7269,32 @@ insert_prefix_instructions(struct compiler_unit *u, basicblock *entryblock, if (oldindex == -1) { continue; } - struct cfg_instr make_cell = { + cfg_instr make_cell = { .i_opcode = MAKE_CELL, // This will get fixed in offset_derefs(). .i_oparg = oldindex, .i_loc = NO_LOCATION, .i_target = NULL, }; - RETURN_IF_ERROR(insert_instruction(entryblock, ncellsused, &make_cell)); + RETURN_IF_ERROR(_PyBasicblock_InsertInstruction(entryblock, ncellsused, &make_cell)); ncellsused += 1; } PyMem_RawFree(sorted); } if (nfreevars) { - struct cfg_instr copy_frees = { + cfg_instr copy_frees = { .i_opcode = COPY_FREE_VARS, .i_oparg = nfreevars, .i_loc = NO_LOCATION, .i_target = NULL, }; - RETURN_IF_ERROR(insert_instruction(entryblock, 0, ©_frees)); + RETURN_IF_ERROR(_PyBasicblock_InsertInstruction(entryblock, 0, ©_frees)); } return SUCCESS; } -/* Make sure that all returns have a line number, even if early passes - * have failed to propagate a correct line number. - * The resulting line number may not be correct according to PEP 626, - * but should be "good enough", and no worse than in older versions. */ -static void -guarantee_lineno_for_exits(basicblock *entryblock, int firstlineno) { - int lineno = firstlineno; - assert(lineno > 0); - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - struct cfg_instr *last = basicblock_last_instr(b); - if (last == NULL) { - continue; - } - if (last->i_loc.lineno < 0) { - if (last->i_opcode == RETURN_VALUE) { - for (int i = 0; i < b->b_iused; i++) { - assert(b->b_instr[i].i_loc.lineno < 0); - - b->b_instr[i].i_loc.lineno = lineno; - } - } - } - else { - lineno = last->i_loc.lineno; - } - } -} - static int fix_cell_offsets(struct compiler_unit *u, basicblock *entryblock, int *fixedmap) { @@ -8569,7 +7318,7 @@ fix_cell_offsets(struct compiler_unit *u, basicblock *entryblock, int *fixedmap) // Then update offsets, either relative to locals or by cell2arg. for (basicblock *b = entryblock; b != NULL; b = b->b_next) { for (int i = 0; i < b->b_iused; i++) { - struct cfg_instr *inst = &b->b_instr[i]; + cfg_instr *inst = &b->b_instr[i]; // This is called before extended args are generated. assert(inst->i_opcode != EXTENDED_ARG); int oldoffset = inst->i_oparg; @@ -8592,100 +7341,6 @@ fix_cell_offsets(struct compiler_unit *u, basicblock *entryblock, int *fixedmap) } -#ifndef NDEBUG - -static bool -no_redundant_nops(cfg_builder *g) { - for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { - if (remove_redundant_nops(b) != 0) { - return false; - } - } - return true; -} - -static bool -no_redundant_jumps(cfg_builder *g) { - for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { - struct cfg_instr *last = basicblock_last_instr(b); - if (last != NULL) { - if (IS_UNCONDITIONAL_JUMP_OPCODE(last->i_opcode)) { - assert(last->i_target != b->b_next); - if (last->i_target == b->b_next) { - return false; - } - } - } - } - return true; -} - -static bool -opcode_metadata_is_sane(cfg_builder *g) { - bool result = true; - for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { - for (int i = 0; i < b->b_iused; i++) { - struct cfg_instr *instr = &b->b_instr[i]; - int opcode = instr->i_opcode; - int oparg = instr->i_oparg; - assert(opcode <= MAX_REAL_OPCODE); - for (int jump = 0; jump <= 1; jump++) { - int popped = _PyOpcode_num_popped(opcode, oparg, jump ? true : false); - int pushed = _PyOpcode_num_pushed(opcode, oparg, jump ? true : false); - assert((pushed < 0) == (popped < 0)); - if (pushed >= 0) { - assert(_PyOpcode_opcode_metadata[opcode].valid_entry); - int effect = stack_effect(opcode, instr->i_oparg, jump); - if (effect != pushed - popped) { - fprintf(stderr, - "op=%d arg=%d jump=%d: stack_effect (%d) != pushed (%d) - popped (%d)\n", - opcode, oparg, jump, effect, pushed, popped); - result = false; - } - } - } - } - } - return result; -} - -static bool -no_empty_basic_blocks(cfg_builder *g) { - for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { - if (b->b_iused == 0) { - return false; - } - } - return true; -} -#endif - -static int -remove_redundant_jumps(cfg_builder *g) { - /* If a non-empty block ends with a jump instruction, check if the next - * non-empty block reached through normal flow control is the target - * of that jump. If it is, then the jump instruction is redundant and - * can be deleted. - */ - assert(no_empty_basic_blocks(g)); - for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { - struct cfg_instr *last = basicblock_last_instr(b); - assert(last != NULL); - assert(!IS_ASSEMBLER_OPCODE(last->i_opcode)); - if (IS_UNCONDITIONAL_JUMP_OPCODE(last->i_opcode)) { - if (last->i_target == NULL) { - PyErr_SetString(PyExc_SystemError, "jump with NULL target"); - return ERROR; - } - if (last->i_target == b->b_next) { - assert(b->b_next->b_iused); - INSTR_SET_OP0(last, NOP); - } - } - } - return SUCCESS; -} - static int prepare_localsplus(struct compiler_unit* u, cfg_builder *g, int code_flags) { @@ -8734,47 +7389,6 @@ add_return_at_end(struct compiler *c, int addNone) return SUCCESS; } -static void propagate_line_numbers(basicblock *entryblock); - -static int -resolve_line_numbers(struct compiler_unit *u, cfg_builder *g) -{ - /* Set firstlineno if it wasn't explicitly set. */ - if (!u->u_firstlineno) { - if (g->g_entryblock->b_instr && g->g_entryblock->b_instr->i_loc.lineno) { - u->u_firstlineno = g->g_entryblock->b_instr->i_loc.lineno; - } - else { - u->u_firstlineno = 1; - } - } - RETURN_IF_ERROR(duplicate_exits_without_lineno(g)); - propagate_line_numbers(g->g_entryblock); - guarantee_lineno_for_exits(g->g_entryblock, u->u_firstlineno); - return SUCCESS; -} - -static int -optimize_code_unit(cfg_builder *g, PyObject *consts, PyObject *const_cache, - int code_flags, int nlocals, int nparams) -{ - assert(cfg_builder_check(g)); - /** Preprocessing **/ - /* Map labels to targets and mark exception handlers */ - RETURN_IF_ERROR(translate_jump_labels_to_targets(g->g_entryblock)); - RETURN_IF_ERROR(mark_except_handlers(g->g_entryblock)); - RETURN_IF_ERROR(label_exception_targets(g->g_entryblock)); - - /** Optimization **/ - RETURN_IF_ERROR(optimize_cfg(g, consts, const_cache)); - RETURN_IF_ERROR(remove_unused_consts(g->g_entryblock, consts)); - RETURN_IF_ERROR( - add_checks_for_loads_of_uninitialized_variables( - g->g_entryblock, nlocals, nparams)); - - RETURN_IF_ERROR(push_cold_blocks_to_end(g, code_flags)); - return SUCCESS; -} static PyCodeObject * assemble_code_unit(struct compiler_unit *u, PyObject *const_cache, @@ -8791,13 +7405,21 @@ assemble_code_unit(struct compiler_unit *u, PyObject *const_cache, } int nparams = (int)PyList_GET_SIZE(u->u_ste->ste_varnames); int nlocals = (int)PyDict_GET_SIZE(u->u_varnames); - if (optimize_code_unit(&g, consts, const_cache, code_flags, nlocals, nparams) < 0) { + if (_PyCfg_OptimizeCodeUnit(&g, consts, const_cache, code_flags, nlocals, nparams) < 0) { goto error; } /** Assembly **/ - - if (resolve_line_numbers(u, &g) < 0) { + /* Set firstlineno if it wasn't explicitly set. */ + if (!u->u_firstlineno) { + if (g.g_entryblock->b_instr && g.g_entryblock->b_instr->i_loc.lineno) { + u->u_firstlineno = g.g_entryblock->b_instr->i_loc.lineno; + } + else { + u->u_firstlineno = 1; + } + } + if (_PyCfg_ResolveLineNumbers(&g, u->u_firstlineno) < 0) { goto error; } @@ -8806,23 +7428,21 @@ assemble_code_unit(struct compiler_unit *u, PyObject *const_cache, goto error; } - int maxdepth = stackdepth(g.g_entryblock, code_flags); + int maxdepth = _PyCfg_Stackdepth(g.g_entryblock, code_flags); if (maxdepth < 0) { goto error; } /* TO DO -- For 3.12, make sure that `maxdepth <= MAX_ALLOWED_STACK_USE` */ - convert_exception_handlers_to_nops(g.g_entryblock); + _PyCfg_ConvertExceptionHandlersToNops(g.g_entryblock); /* Order of basic blocks must have been determined by now */ - if (normalize_jumps(&g) < 0) { + + if (_PyCfg_ResolveJumps(&g) < 0) { goto error; } - assert(no_redundant_jumps(&g)); - assert(opcode_metadata_is_sane(&g)); /* Can't modify the bytecode after computing jump offsets. */ - assemble_jump_offsets(g.g_entryblock); struct assembler a; int res = assemble_emit(&a, g.g_entryblock, u->u_firstlineno, const_cache); @@ -8834,7 +7454,7 @@ assemble_code_unit(struct compiler_unit *u, PyObject *const_cache, error: Py_XDECREF(consts); - cfg_builder_fini(&g); + _PyCfgBuilder_Fini(&g); return co; } @@ -8857,941 +7477,6 @@ assemble(struct compiler *c, int addNone) return assemble_code_unit(u, const_cache, code_flags, filename); } -static PyObject* -get_const_value(int opcode, int oparg, PyObject *co_consts) -{ - PyObject *constant = NULL; - assert(HAS_CONST(opcode)); - if (opcode == LOAD_CONST) { - constant = PyList_GET_ITEM(co_consts, oparg); - } - - if (constant == NULL) { - PyErr_SetString(PyExc_SystemError, - "Internal error: failed to get value of a constant"); - return NULL; - } - return Py_NewRef(constant); -} - -/* Replace LOAD_CONST c1, LOAD_CONST c2 ... LOAD_CONST cn, BUILD_TUPLE n - with LOAD_CONST (c1, c2, ... cn). - The consts table must still be in list form so that the - new constant (c1, c2, ... cn) can be appended. - Called with codestr pointing to the first LOAD_CONST. -*/ -static int -fold_tuple_on_constants(PyObject *const_cache, - struct cfg_instr *inst, - int n, PyObject *consts) -{ - /* Pre-conditions */ - assert(PyDict_CheckExact(const_cache)); - assert(PyList_CheckExact(consts)); - assert(inst[n].i_opcode == BUILD_TUPLE); - assert(inst[n].i_oparg == n); - - for (int i = 0; i < n; i++) { - if (!HAS_CONST(inst[i].i_opcode)) { - return SUCCESS; - } - } - - /* Buildup new tuple of constants */ - PyObject *newconst = PyTuple_New(n); - if (newconst == NULL) { - return ERROR; - } - for (int i = 0; i < n; i++) { - int op = inst[i].i_opcode; - int arg = inst[i].i_oparg; - PyObject *constant = get_const_value(op, arg, consts); - if (constant == NULL) { - return ERROR; - } - PyTuple_SET_ITEM(newconst, i, constant); - } - if (merge_const_one(const_cache, &newconst) < 0) { - Py_DECREF(newconst); - return ERROR; - } - - Py_ssize_t index; - for (index = 0; index < PyList_GET_SIZE(consts); index++) { - if (PyList_GET_ITEM(consts, index) == newconst) { - break; - } - } - if (index == PyList_GET_SIZE(consts)) { - if ((size_t)index >= (size_t)INT_MAX - 1) { - Py_DECREF(newconst); - PyErr_SetString(PyExc_OverflowError, "too many constants"); - return ERROR; - } - if (PyList_Append(consts, newconst)) { - Py_DECREF(newconst); - return ERROR; - } - } - Py_DECREF(newconst); - for (int i = 0; i < n; i++) { - INSTR_SET_OP0(&inst[i], NOP); - } - INSTR_SET_OP1(&inst[n], LOAD_CONST, (int)index); - return SUCCESS; -} - -#define VISITED (-1) - -// Replace an arbitrary run of SWAPs and NOPs with an optimal one that has the -// same effect. -static int -swaptimize(basicblock *block, int *ix) -{ - // NOTE: "./python -m test test_patma" serves as a good, quick stress test - // for this function. Make sure to blow away cached *.pyc files first! - assert(*ix < block->b_iused); - struct cfg_instr *instructions = &block->b_instr[*ix]; - // Find the length of the current sequence of SWAPs and NOPs, and record the - // maximum depth of the stack manipulations: - assert(instructions[0].i_opcode == SWAP); - int depth = instructions[0].i_oparg; - int len = 0; - int more = false; - int limit = block->b_iused - *ix; - while (++len < limit) { - int opcode = instructions[len].i_opcode; - if (opcode == SWAP) { - depth = Py_MAX(depth, instructions[len].i_oparg); - more = true; - } - else if (opcode != NOP) { - break; - } - } - // It's already optimal if there's only one SWAP: - if (!more) { - return SUCCESS; - } - // Create an array with elements {0, 1, 2, ..., depth - 1}: - int *stack = PyMem_Malloc(depth * sizeof(int)); - if (stack == NULL) { - PyErr_NoMemory(); - return ERROR; - } - for (int i = 0; i < depth; i++) { - stack[i] = i; - } - // Simulate the combined effect of these instructions by "running" them on - // our "stack": - for (int i = 0; i < len; i++) { - if (instructions[i].i_opcode == SWAP) { - int oparg = instructions[i].i_oparg; - int top = stack[0]; - // SWAPs are 1-indexed: - stack[0] = stack[oparg - 1]; - stack[oparg - 1] = top; - } - } - // Now we can begin! Our approach here is based on a solution to a closely - // related problem (https://cs.stackexchange.com/a/13938). It's easiest to - // think of this algorithm as determining the steps needed to efficiently - // "un-shuffle" our stack. By performing the moves in *reverse* order, - // though, we can efficiently *shuffle* it! For this reason, we will be - // replacing instructions starting from the *end* of the run. Since the - // solution is optimal, we don't need to worry about running out of space: - int current = len - 1; - for (int i = 0; i < depth; i++) { - // Skip items that have already been visited, or just happen to be in - // the correct location: - if (stack[i] == VISITED || stack[i] == i) { - continue; - } - // Okay, we've found an item that hasn't been visited. It forms a cycle - // with other items; traversing the cycle and swapping each item with - // the next will put them all in the correct place. The weird - // loop-and-a-half is necessary to insert 0 into every cycle, since we - // can only swap from that position: - int j = i; - while (true) { - // Skip the actual swap if our item is zero, since swapping the top - // item with itself is pointless: - if (j) { - assert(0 <= current); - // SWAPs are 1-indexed: - instructions[current].i_opcode = SWAP; - instructions[current--].i_oparg = j + 1; - } - if (stack[j] == VISITED) { - // Completed the cycle: - assert(j == i); - break; - } - int next_j = stack[j]; - stack[j] = VISITED; - j = next_j; - } - } - // NOP out any unused instructions: - while (0 <= current) { - INSTR_SET_OP0(&instructions[current--], NOP); - } - PyMem_Free(stack); - *ix += len - 1; - return SUCCESS; -} - -// This list is pretty small, since it's only okay to reorder opcodes that: -// - can't affect control flow (like jumping or raising exceptions) -// - can't invoke arbitrary code (besides finalizers) -// - only touch the TOS (and pop it when finished) -#define SWAPPABLE(opcode) \ - ((opcode) == STORE_FAST || (opcode) == POP_TOP) - -static int -next_swappable_instruction(basicblock *block, int i, int lineno) -{ - while (++i < block->b_iused) { - struct cfg_instr *instruction = &block->b_instr[i]; - if (0 <= lineno && instruction->i_loc.lineno != lineno) { - // Optimizing across this instruction could cause user-visible - // changes in the names bound between line tracing events! - return -1; - } - if (instruction->i_opcode == NOP) { - continue; - } - if (SWAPPABLE(instruction->i_opcode)) { - return i; - } - return -1; - } - return -1; -} - -// Attempt to apply SWAPs statically by swapping *instructions* rather than -// stack items. For example, we can replace SWAP(2), POP_TOP, STORE_FAST(42) -// with the more efficient NOP, STORE_FAST(42), POP_TOP. -static void -apply_static_swaps(basicblock *block, int i) -{ - // SWAPs are to our left, and potential swaperands are to our right: - for (; 0 <= i; i--) { - assert(i < block->b_iused); - struct cfg_instr *swap = &block->b_instr[i]; - if (swap->i_opcode != SWAP) { - if (swap->i_opcode == NOP || SWAPPABLE(swap->i_opcode)) { - // Nope, but we know how to handle these. Keep looking: - continue; - } - // We can't reason about what this instruction does. Bail: - return; - } - int j = next_swappable_instruction(block, i, -1); - if (j < 0) { - return; - } - int k = j; - int lineno = block->b_instr[j].i_loc.lineno; - for (int count = swap->i_oparg - 1; 0 < count; count--) { - k = next_swappable_instruction(block, k, lineno); - if (k < 0) { - return; - } - } - // Success! - INSTR_SET_OP0(swap, NOP); - struct cfg_instr temp = block->b_instr[j]; - block->b_instr[j] = block->b_instr[k]; - block->b_instr[k] = temp; - } -} - -// Attempt to eliminate jumps to jumps by updating inst to jump to -// target->i_target using the provided opcode. Return whether or not the -// optimization was successful. -static bool -jump_thread(struct cfg_instr *inst, struct cfg_instr *target, int opcode) -{ - assert(is_jump(inst)); - assert(is_jump(target)); - // bpo-45773: If inst->i_target == target->i_target, then nothing actually - // changes (and we fall into an infinite loop): - if ((inst->i_loc.lineno == target->i_loc.lineno || target->i_loc.lineno == -1) && - inst->i_target != target->i_target) - { - inst->i_target = target->i_target; - inst->i_opcode = opcode; - return true; - } - return false; -} - -/* Maximum size of basic block that should be copied in optimizer */ -#define MAX_COPY_SIZE 4 - -/* Optimization */ -static int -optimize_basic_block(PyObject *const_cache, basicblock *bb, PyObject *consts) -{ - assert(PyDict_CheckExact(const_cache)); - assert(PyList_CheckExact(consts)); - struct cfg_instr nop; - INSTR_SET_OP0(&nop, NOP); - struct cfg_instr *target = &nop; - int opcode = 0; - int oparg = 0; - int nextop = 0; - for (int i = 0; i < bb->b_iused; i++) { - struct cfg_instr *inst = &bb->b_instr[i]; - bool is_copy_of_load_const = (opcode == LOAD_CONST && - inst->i_opcode == COPY && - inst->i_oparg == 1); - if (! is_copy_of_load_const) { - opcode = inst->i_opcode; - oparg = inst->i_oparg; - if (HAS_TARGET(opcode)) { - assert(inst->i_target->b_iused > 0); - target = &inst->i_target->b_instr[0]; - assert(!IS_ASSEMBLER_OPCODE(target->i_opcode)); - } - else { - target = &nop; - } - } - nextop = i+1 < bb->b_iused ? bb->b_instr[i+1].i_opcode : 0; - assert(!IS_ASSEMBLER_OPCODE(opcode)); - switch (opcode) { - /* Remove LOAD_CONST const; conditional jump */ - case LOAD_CONST: - { - PyObject* cnt; - int is_true; - int jump_if_true; - switch(nextop) { - case POP_JUMP_IF_FALSE: - case POP_JUMP_IF_TRUE: - cnt = get_const_value(opcode, oparg, consts); - if (cnt == NULL) { - goto error; - } - is_true = PyObject_IsTrue(cnt); - Py_DECREF(cnt); - if (is_true == -1) { - goto error; - } - INSTR_SET_OP0(inst, NOP); - jump_if_true = nextop == POP_JUMP_IF_TRUE; - if (is_true == jump_if_true) { - bb->b_instr[i+1].i_opcode = JUMP; - } - else { - INSTR_SET_OP0(&bb->b_instr[i + 1], NOP); - } - break; - case IS_OP: - cnt = get_const_value(opcode, oparg, consts); - if (cnt == NULL) { - goto error; - } - int jump_op = i+2 < bb->b_iused ? bb->b_instr[i+2].i_opcode : 0; - if (Py_IsNone(cnt) && (jump_op == POP_JUMP_IF_FALSE || jump_op == POP_JUMP_IF_TRUE)) { - unsigned char nextarg = bb->b_instr[i+1].i_oparg; - INSTR_SET_OP0(inst, NOP); - INSTR_SET_OP0(&bb->b_instr[i + 1], NOP); - bb->b_instr[i+2].i_opcode = nextarg ^ (jump_op == POP_JUMP_IF_FALSE) ? - POP_JUMP_IF_NOT_NONE : POP_JUMP_IF_NONE; - } - Py_DECREF(cnt); - break; - case RETURN_VALUE: - INSTR_SET_OP0(inst, NOP); - INSTR_SET_OP1(&bb->b_instr[++i], RETURN_CONST, oparg); - break; - } - break; - } - - /* Try to fold tuples of constants. - Skip over BUILD_TUPLE(1) UNPACK_SEQUENCE(1). - Replace BUILD_TUPLE(2) UNPACK_SEQUENCE(2) with SWAP(2). - Replace BUILD_TUPLE(3) UNPACK_SEQUENCE(3) with SWAP(3). */ - case BUILD_TUPLE: - if (nextop == UNPACK_SEQUENCE && oparg == bb->b_instr[i+1].i_oparg) { - switch(oparg) { - case 1: - INSTR_SET_OP0(inst, NOP); - INSTR_SET_OP0(&bb->b_instr[i + 1], NOP); - continue; - case 2: - case 3: - INSTR_SET_OP0(inst, NOP); - bb->b_instr[i+1].i_opcode = SWAP; - continue; - } - } - if (i >= oparg) { - if (fold_tuple_on_constants(const_cache, inst-oparg, oparg, consts)) { - goto error; - } - } - break; - case POP_JUMP_IF_NOT_NONE: - case POP_JUMP_IF_NONE: - switch (target->i_opcode) { - case JUMP: - i -= jump_thread(inst, target, inst->i_opcode); - } - break; - case POP_JUMP_IF_FALSE: - switch (target->i_opcode) { - case JUMP: - i -= jump_thread(inst, target, POP_JUMP_IF_FALSE); - } - break; - case POP_JUMP_IF_TRUE: - switch (target->i_opcode) { - case JUMP: - i -= jump_thread(inst, target, POP_JUMP_IF_TRUE); - } - break; - case JUMP: - switch (target->i_opcode) { - case JUMP: - i -= jump_thread(inst, target, JUMP); - } - break; - case FOR_ITER: - if (target->i_opcode == JUMP) { - /* This will not work now because the jump (at target) could - * be forward or backward and FOR_ITER only jumps forward. We - * can re-enable this if ever we implement a backward version - * of FOR_ITER. - */ - /* - i -= jump_thread(inst, target, FOR_ITER); - */ - } - break; - case SWAP: - if (oparg == 1) { - INSTR_SET_OP0(inst, NOP); - break; - } - if (swaptimize(bb, &i) < 0) { - goto error; - } - apply_static_swaps(bb, i); - break; - case KW_NAMES: - break; - case PUSH_NULL: - if (nextop == LOAD_GLOBAL && (inst[1].i_opcode & 1) == 0) { - INSTR_SET_OP0(inst, NOP); - inst[1].i_oparg |= 1; - } - break; - default: - /* All HAS_CONST opcodes should be handled with LOAD_CONST */ - assert (!HAS_CONST(inst->i_opcode)); - } - } - return SUCCESS; -error: - return ERROR; -} - -/* If this block ends with an unconditional jump to a small exit block, then - * remove the jump and extend this block with the target. - * Returns 1 if extended, 0 if no change, and -1 on error. - */ -static int -inline_small_exit_blocks(basicblock *bb) { - struct cfg_instr *last = basicblock_last_instr(bb); - if (last == NULL) { - return 0; - } - if (!IS_UNCONDITIONAL_JUMP_OPCODE(last->i_opcode)) { - return 0; - } - basicblock *target = last->i_target; - if (basicblock_exits_scope(target) && target->b_iused <= MAX_COPY_SIZE) { - INSTR_SET_OP0(last, NOP); - RETURN_IF_ERROR(basicblock_append_instructions(bb, target)); - return 1; - } - return 0; -} - - -static int -remove_redundant_nops_and_pairs(basicblock *entryblock) -{ - bool done = false; - - while (! done) { - done = true; - struct cfg_instr *prev_instr = NULL; - struct cfg_instr *instr = NULL; - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - remove_redundant_nops(b); - if (IS_LABEL(b->b_label)) { - /* this block is a jump target, forget instr */ - instr = NULL; - } - for (int i = 0; i < b->b_iused; i++) { - prev_instr = instr; - instr = &b->b_instr[i]; - int prev_opcode = prev_instr ? prev_instr->i_opcode : 0; - int prev_oparg = prev_instr ? prev_instr->i_oparg : 0; - int opcode = instr->i_opcode; - bool is_redundant_pair = false; - if (opcode == POP_TOP) { - if (prev_opcode == LOAD_CONST) { - is_redundant_pair = true; - } - else if (prev_opcode == COPY && prev_oparg == 1) { - is_redundant_pair = true; - } - } - if (is_redundant_pair) { - INSTR_SET_OP0(prev_instr, NOP); - INSTR_SET_OP0(instr, NOP); - done = false; - } - } - if ((instr && is_jump(instr)) || !BB_HAS_FALLTHROUGH(b)) { - instr = NULL; - } - } - } - return SUCCESS; -} - - -static int -remove_redundant_nops(basicblock *bb) { - /* Remove NOPs when legal to do so. */ - int dest = 0; - int prev_lineno = -1; - for (int src = 0; src < bb->b_iused; src++) { - int lineno = bb->b_instr[src].i_loc.lineno; - if (bb->b_instr[src].i_opcode == NOP) { - /* Eliminate no-op if it doesn't have a line number */ - if (lineno < 0) { - continue; - } - /* or, if the previous instruction had the same line number. */ - if (prev_lineno == lineno) { - continue; - } - /* or, if the next instruction has same line number or no line number */ - if (src < bb->b_iused - 1) { - int next_lineno = bb->b_instr[src+1].i_loc.lineno; - if (next_lineno == lineno) { - continue; - } - if (next_lineno < 0) { - bb->b_instr[src+1].i_loc = bb->b_instr[src].i_loc; - continue; - } - } - else { - basicblock* next = bb->b_next; - while (next && next->b_iused == 0) { - next = next->b_next; - } - /* or if last instruction in BB and next BB has same line number */ - if (next) { - if (lineno == next->b_instr[0].i_loc.lineno) { - continue; - } - } - } - - } - if (dest != src) { - bb->b_instr[dest] = bb->b_instr[src]; - } - dest++; - prev_lineno = lineno; - } - assert(dest <= bb->b_iused); - int num_removed = bb->b_iused - dest; - bb->b_iused = dest; - return num_removed; -} - -static int -check_cfg(cfg_builder *g) { - for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { - /* Raise SystemError if jump or exit is not last instruction in the block. */ - for (int i = 0; i < b->b_iused; i++) { - int opcode = b->b_instr[i].i_opcode; - assert(!IS_ASSEMBLER_OPCODE(opcode)); - if (IS_TERMINATOR_OPCODE(opcode)) { - if (i != b->b_iused - 1) { - PyErr_SetString(PyExc_SystemError, "malformed control flow graph."); - return ERROR; - } - } - } - } - return SUCCESS; -} - -static int -mark_reachable(basicblock *entryblock) { - basicblock **stack = make_cfg_traversal_stack(entryblock); - if (stack == NULL) { - return ERROR; - } - basicblock **sp = stack; - entryblock->b_predecessors = 1; - *sp++ = entryblock; - while (sp > stack) { - basicblock *b = *(--sp); - b->b_visited = 1; - if (b->b_next && BB_HAS_FALLTHROUGH(b)) { - if (!b->b_next->b_visited) { - assert(b->b_next->b_predecessors == 0); - *sp++ = b->b_next; - } - b->b_next->b_predecessors++; - } - for (int i = 0; i < b->b_iused; i++) { - basicblock *target; - struct cfg_instr *instr = &b->b_instr[i]; - if (is_jump(instr) || is_block_push(instr)) { - target = instr->i_target; - if (!target->b_visited) { - assert(target->b_predecessors == 0 || target == b->b_next); - *sp++ = target; - } - target->b_predecessors++; - } - } - } - PyMem_Free(stack); - return SUCCESS; -} - -static void -eliminate_empty_basic_blocks(cfg_builder *g) { - /* Eliminate empty blocks */ - for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { - basicblock *next = b->b_next; - while (next && next->b_iused == 0) { - next = next->b_next; - } - b->b_next = next; - } - while(g->g_entryblock && g->g_entryblock->b_iused == 0) { - g->g_entryblock = g->g_entryblock->b_next; - } - for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { - assert(b->b_iused > 0); - for (int i = 0; i < b->b_iused; i++) { - struct cfg_instr *instr = &b->b_instr[i]; - if (HAS_TARGET(instr->i_opcode)) { - basicblock *target = instr->i_target; - while (target->b_iused == 0) { - target = target->b_next; - } - instr->i_target = target; - assert(instr->i_target && instr->i_target->b_iused > 0); - } - } - } -} - - -/* If an instruction has no line number, but it's predecessor in the BB does, - * then copy the line number. If a successor block has no line number, and only - * one predecessor, then inherit the line number. - * This ensures that all exit blocks (with one predecessor) receive a line number. - * Also reduces the size of the line number table, - * but has no impact on the generated line number events. - */ -static void -propagate_line_numbers(basicblock *entryblock) { - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - struct cfg_instr *last = basicblock_last_instr(b); - if (last == NULL) { - continue; - } - - location prev_location = NO_LOCATION; - for (int i = 0; i < b->b_iused; i++) { - if (b->b_instr[i].i_loc.lineno < 0) { - b->b_instr[i].i_loc = prev_location; - } - else { - prev_location = b->b_instr[i].i_loc; - } - } - if (BB_HAS_FALLTHROUGH(b) && b->b_next->b_predecessors == 1) { - assert(b->b_next->b_iused); - if (b->b_next->b_instr[0].i_loc.lineno < 0) { - b->b_next->b_instr[0].i_loc = prev_location; - } - } - if (is_jump(last)) { - basicblock *target = last->i_target; - if (target->b_predecessors == 1) { - if (target->b_instr[0].i_loc.lineno < 0) { - target->b_instr[0].i_loc = prev_location; - } - } - } - } -} - - -/* Calculate the actual jump target from the target_label */ -static int -translate_jump_labels_to_targets(basicblock *entryblock) -{ - int max_label = -1; - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - if (b->b_label.id > max_label) { - max_label = b->b_label.id; - } - } - size_t mapsize = sizeof(basicblock *) * (max_label + 1); - basicblock **label2block = (basicblock **)PyMem_Malloc(mapsize); - if (!label2block) { - PyErr_NoMemory(); - return ERROR; - } - memset(label2block, 0, mapsize); - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - if (b->b_label.id >= 0) { - label2block[b->b_label.id] = b; - } - } - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - for (int i = 0; i < b->b_iused; i++) { - struct cfg_instr *instr = &b->b_instr[i]; - assert(instr->i_target == NULL); - if (HAS_TARGET(instr->i_opcode)) { - int lbl = instr->i_oparg; - assert(lbl >= 0 && lbl <= max_label); - instr->i_target = label2block[lbl]; - assert(instr->i_target != NULL); - assert(instr->i_target->b_label.id == lbl); - } - } - } - PyMem_Free(label2block); - return SUCCESS; -} - -/* Perform optimizations on a control flow graph. - The consts object should still be in list form to allow new constants - to be appended. - - Code trasnformations that reduce code size initially fill the gaps with - NOPs. Later those NOPs are removed. -*/ - -static int -optimize_cfg(cfg_builder *g, PyObject *consts, PyObject *const_cache) -{ - assert(PyDict_CheckExact(const_cache)); - RETURN_IF_ERROR(check_cfg(g)); - eliminate_empty_basic_blocks(g); - for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { - RETURN_IF_ERROR(inline_small_exit_blocks(b)); - } - assert(no_empty_basic_blocks(g)); - for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { - RETURN_IF_ERROR(optimize_basic_block(const_cache, b, consts)); - assert(b->b_predecessors == 0); - } - RETURN_IF_ERROR(remove_redundant_nops_and_pairs(g->g_entryblock)); - for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { - RETURN_IF_ERROR(inline_small_exit_blocks(b)); - } - RETURN_IF_ERROR(mark_reachable(g->g_entryblock)); - - /* Delete unreachable instructions */ - for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { - if (b->b_predecessors == 0) { - b->b_iused = 0; - } - } - for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { - remove_redundant_nops(b); - } - eliminate_empty_basic_blocks(g); - assert(no_redundant_nops(g)); - RETURN_IF_ERROR(remove_redundant_jumps(g)); - return SUCCESS; -} - - -static int -remove_unused_consts(basicblock *entryblock, PyObject *consts) -{ - assert(PyList_CheckExact(consts)); - Py_ssize_t nconsts = PyList_GET_SIZE(consts); - if (nconsts == 0) { - return SUCCESS; /* nothing to do */ - } - - Py_ssize_t *index_map = NULL; - Py_ssize_t *reverse_index_map = NULL; - int err = ERROR; - - index_map = PyMem_Malloc(nconsts * sizeof(Py_ssize_t)); - if (index_map == NULL) { - goto end; - } - for (Py_ssize_t i = 1; i < nconsts; i++) { - index_map[i] = -1; - } - // The first constant may be docstring; keep it always. - index_map[0] = 0; - - /* mark used consts */ - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - for (int i = 0; i < b->b_iused; i++) { - if (HAS_CONST(b->b_instr[i].i_opcode)) { - int index = b->b_instr[i].i_oparg; - index_map[index] = index; - } - } - } - /* now index_map[i] == i if consts[i] is used, -1 otherwise */ - - /* condense consts */ - Py_ssize_t n_used_consts = 0; - for (int i = 0; i < nconsts; i++) { - if (index_map[i] != -1) { - assert(index_map[i] == i); - index_map[n_used_consts++] = index_map[i]; - } - } - if (n_used_consts == nconsts) { - /* nothing to do */ - err = SUCCESS; - goto end; - } - - /* move all used consts to the beginning of the consts list */ - assert(n_used_consts < nconsts); - for (Py_ssize_t i = 0; i < n_used_consts; i++) { - Py_ssize_t old_index = index_map[i]; - assert(i <= old_index && old_index < nconsts); - if (i != old_index) { - PyObject *value = PyList_GET_ITEM(consts, index_map[i]); - assert(value != NULL); - PyList_SetItem(consts, i, Py_NewRef(value)); - } - } - - /* truncate the consts list at its new size */ - if (PyList_SetSlice(consts, n_used_consts, nconsts, NULL) < 0) { - goto end; - } - - /* adjust const indices in the bytecode */ - reverse_index_map = PyMem_Malloc(nconsts * sizeof(Py_ssize_t)); - if (reverse_index_map == NULL) { - goto end; - } - for (Py_ssize_t i = 0; i < nconsts; i++) { - reverse_index_map[i] = -1; - } - for (Py_ssize_t i = 0; i < n_used_consts; i++) { - assert(index_map[i] != -1); - assert(reverse_index_map[index_map[i]] == -1); - reverse_index_map[index_map[i]] = i; - } - - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - for (int i = 0; i < b->b_iused; i++) { - if (HAS_CONST(b->b_instr[i].i_opcode)) { - int index = b->b_instr[i].i_oparg; - assert(reverse_index_map[index] >= 0); - assert(reverse_index_map[index] < n_used_consts); - b->b_instr[i].i_oparg = (int)reverse_index_map[index]; - } - } - } - - err = SUCCESS; -end: - PyMem_Free(index_map); - PyMem_Free(reverse_index_map); - return err; -} - -static inline bool -is_exit_without_lineno(basicblock *b) { - if (!basicblock_exits_scope(b)) { - return false; - } - for (int i = 0; i < b->b_iused; i++) { - if (b->b_instr[i].i_loc.lineno >= 0) { - return false; - } - } - return true; -} - -/* PEP 626 mandates that the f_lineno of a frame is correct - * after a frame terminates. It would be prohibitively expensive - * to continuously update the f_lineno field at runtime, - * so we make sure that all exiting instruction (raises and returns) - * have a valid line number, allowing us to compute f_lineno lazily. - * We can do this by duplicating the exit blocks without line number - * so that none have more than one predecessor. We can then safely - * copy the line number from the sole predecessor block. - */ -static int -duplicate_exits_without_lineno(cfg_builder *g) -{ - assert(no_empty_basic_blocks(g)); - /* Copy all exit blocks without line number that are targets of a jump. - */ - basicblock *entryblock = g->g_entryblock; - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - struct cfg_instr *last = basicblock_last_instr(b); - assert(last != NULL); - if (is_jump(last)) { - basicblock *target = last->i_target; - if (is_exit_without_lineno(target) && target->b_predecessors > 1) { - basicblock *new_target = copy_basicblock(g, target); - if (new_target == NULL) { - return ERROR; - } - new_target->b_instr[0].i_loc = last->i_loc; - last->i_target = new_target; - target->b_predecessors--; - new_target->b_predecessors = 1; - new_target->b_next = target->b_next; - target->b_next = new_target; - } - } - } - - /* Any remaining reachable exit blocks without line number can only be reached by - * fall through, and thus can only have a single predecessor */ - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - if (BB_HAS_FALLTHROUGH(b) && b->b_next && b->b_iused > 0) { - if (is_exit_without_lineno(b->b_next)) { - struct cfg_instr *last = basicblock_last_instr(b); - assert(last != NULL); - b->b_next->b_instr[0].i_loc = last->i_loc; - } - } - } - return SUCCESS; -} - - /* Access to compiler optimizations for unit tests. * * _PyCompile_CodeGen takes and AST, applies code-gen and @@ -9842,7 +7527,7 @@ instructions_to_cfg(PyObject *instructions, cfg_builder *g) for (int i = 0; i < num_insts; i++) { if (is_target[i]) { jump_target_label lbl = {i}; - RETURN_IF_ERROR(cfg_builder_use_label(g, lbl)); + RETURN_IF_ERROR(_PyCfgBuilder_UseLabel(g, lbl)); } PyObject *item = PyList_GET_ITEM(instructions, i); if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 6) { @@ -9880,11 +7565,11 @@ instructions_to_cfg(PyObject *instructions, cfg_builder *g) if (PyErr_Occurred()) { goto error; } - RETURN_IF_ERROR(cfg_builder_addop(g, opcode, oparg, loc)); + RETURN_IF_ERROR(_PyCfgBuilder_Addop(g, opcode, oparg, loc)); } - struct cfg_instr *last = basicblock_last_instr(g->g_curblock); + cfg_instr *last = _PyCfg_BasicblockLastInstr(g->g_curblock); if (last && !IS_TERMINATOR_OPCODE(last->i_opcode)) { - RETURN_IF_ERROR(cfg_builder_addop(g, RETURN_VALUE, 0, NO_LOCATION)); + RETURN_IF_ERROR(_PyCfgBuilder_Addop(g, RETURN_VALUE, 0, NO_LOCATION)); } PyMem_Free(is_target); return SUCCESS; @@ -9939,7 +7624,7 @@ cfg_to_instructions(cfg_builder *g) } for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { for (int i = 0; i < b->b_iused; i++) { - struct cfg_instr *instr = &b->b_instr[i]; + cfg_instr *instr = &b->b_instr[i]; location loc = instr->i_loc; int arg = HAS_TARGET(instr->i_opcode) ? instr->i_target->b_label.id : instr->i_oparg; @@ -10018,26 +7703,26 @@ _PyCompile_OptimizeCfg(PyObject *instructions, PyObject *consts) cfg_builder g; memset(&g, 0, sizeof(cfg_builder)); - if (cfg_builder_init(&g) < 0) { + if (_PyCfgBuilder_Init(&g) < 0) { goto error; } if (instructions_to_cfg(instructions, &g) < 0) { goto error; } int code_flags = 0, nlocals = 0, nparams = 0; - if (optimize_code_unit(&g, consts, const_cache, code_flags, nlocals, nparams) < 0) { + if (_PyCfg_OptimizeCodeUnit(&g, consts, const_cache, code_flags, nlocals, nparams) < 0) { goto error; } res = cfg_to_instructions(&g); error: Py_DECREF(const_cache); - cfg_builder_fini(&g); + _PyCfgBuilder_Fini(&g); return res; } /* Retained for API compatibility. - * Optimization is now done in optimize_cfg */ + * Optimization is now done in _PyCfg_OptimizeCodeUnit */ PyObject * PyCode_Optimize(PyObject *code, PyObject* Py_UNUSED(consts), diff --git a/Python/flowgraph.c b/Python/flowgraph.c new file mode 100644 index 00000000000000..cecddbd39c94b3 --- /dev/null +++ b/Python/flowgraph.c @@ -0,0 +1,2160 @@ + +#include + +#include "Python.h" +#include "pycore_flowgraph.h" +#include "pycore_compile.h" +#include "pycore_pymem.h" // _PyMem_IsPtrFreed() + +#include "pycore_opcode_utils.h" +#define NEED_OPCODE_METADATA +#include "opcode_metadata.h" // _PyOpcode_opcode_metadata, _PyOpcode_num_popped/pushed +#undef NEED_OPCODE_METADATA + + +#undef SUCCESS +#undef ERROR +#define SUCCESS 0 +#define ERROR -1 + +#define RETURN_IF_ERROR(X) \ + if ((X) == -1) { \ + return ERROR; \ + } + +#define DEFAULT_BLOCK_SIZE 16 + +typedef _PyCompilerSrcLocation location; +typedef _PyCfgJumpTargetLabel jump_target_label; +typedef _PyCfgBasicblock basicblock; +typedef _PyCfgBuilder cfg_builder; +typedef _PyCfgInstruction cfg_instr; + +static const jump_target_label NO_LABEL = {-1}; + +#define SAME_LABEL(L1, L2) ((L1).id == (L2).id) +#define IS_LABEL(L) (!SAME_LABEL((L), (NO_LABEL))) + + +static inline int +is_block_push(cfg_instr *i) +{ + return IS_BLOCK_PUSH_OPCODE(i->i_opcode); +} + +static inline int +is_relative_jump(cfg_instr *i) +{ + return IS_RELATIVE_JUMP(i->i_opcode); +} + +static inline int +is_jump(cfg_instr *i) +{ + return IS_JUMP_OPCODE(i->i_opcode); +} + +/* One arg*/ +#define INSTR_SET_OP1(I, OP, ARG) \ + do { \ + assert(HAS_ARG(OP)); \ + _PyCfgInstruction *_instr__ptr_ = (I); \ + _instr__ptr_->i_opcode = (OP); \ + _instr__ptr_->i_oparg = (ARG); \ + } while (0); + +/* No args*/ +#define INSTR_SET_OP0(I, OP) \ + do { \ + assert(!HAS_ARG(OP)); \ + _PyCfgInstruction *_instr__ptr_ = (I); \ + _instr__ptr_->i_opcode = (OP); \ + _instr__ptr_->i_oparg = 0; \ + } while (0); + +/***** Blocks *****/ + +/* Returns the offset of the next instruction in the current block's + b_instr array. Resizes the b_instr as necessary. + Returns -1 on failure. +*/ +static int +basicblock_next_instr(basicblock *b) +{ + assert(b != NULL); + RETURN_IF_ERROR( + _PyCompile_EnsureArrayLargeEnough( + b->b_iused + 1, + (void**)&b->b_instr, + &b->b_ialloc, + DEFAULT_BLOCK_SIZE, + sizeof(cfg_instr))); + return b->b_iused++; +} + +/* Allocate a new block and return a pointer to it. + Returns NULL on error. +*/ + +static basicblock * +cfg_builder_new_block(cfg_builder *g) +{ + basicblock *b = (basicblock *)PyObject_Calloc(1, sizeof(basicblock)); + if (b == NULL) { + PyErr_NoMemory(); + return NULL; + } + /* Extend the singly linked list of blocks with new block. */ + b->b_list = g->g_block_list; + g->g_block_list = b; + b->b_label = NO_LABEL; + return b; +} + +static int +basicblock_addop(basicblock *b, int opcode, int oparg, location loc) +{ + assert(IS_WITHIN_OPCODE_RANGE(opcode)); + assert(!IS_ASSEMBLER_OPCODE(opcode)); + assert(HAS_ARG(opcode) || HAS_TARGET(opcode) || oparg == 0); + assert(0 <= oparg && oparg < (1 << 30)); + + int off = basicblock_next_instr(b); + if (off < 0) { + return ERROR; + } + cfg_instr *i = &b->b_instr[off]; + i->i_opcode = opcode; + i->i_oparg = oparg; + i->i_target = NULL; + i->i_loc = loc; + + return SUCCESS; +} + +static inline int +basicblock_append_instructions(basicblock *target, basicblock *source) +{ + for (int i = 0; i < source->b_iused; i++) { + int n = basicblock_next_instr(target); + if (n < 0) { + return ERROR; + } + target->b_instr[n] = source->b_instr[i]; + } + return SUCCESS; +} + +static basicblock * +copy_basicblock(cfg_builder *g, basicblock *block) +{ + /* Cannot copy a block if it has a fallthrough, since + * a block can only have one fallthrough predecessor. + */ + assert(BB_NO_FALLTHROUGH(block)); + basicblock *result = cfg_builder_new_block(g); + if (result == NULL) { + return NULL; + } + if (basicblock_append_instructions(result, block) < 0) { + return NULL; + } + return result; +} + +int +_PyBasicblock_InsertInstruction(basicblock *block, int pos, cfg_instr *instr) { + RETURN_IF_ERROR(basicblock_next_instr(block)); + for (int i = block->b_iused - 1; i > pos; i--) { + block->b_instr[i] = block->b_instr[i-1]; + } + block->b_instr[pos] = *instr; + return SUCCESS; +} + +int +_PyCfg_InstrSize(cfg_instr *instruction) +{ + int opcode = instruction->i_opcode; + assert(!IS_PSEUDO_OPCODE(opcode)); + int oparg = instruction->i_oparg; + assert(HAS_ARG(opcode) || oparg == 0); + int extended_args = (0xFFFFFF < oparg) + (0xFFFF < oparg) + (0xFF < oparg); + int caches = _PyOpcode_Caches[opcode]; + return extended_args + 1 + caches; +} + +static int +blocksize(basicblock *b) +{ + int size = 0; + for (int i = 0; i < b->b_iused; i++) { + size += _PyCfg_InstrSize(&b->b_instr[i]); + } + return size; +} + +/* For debugging purposes only */ +#if 0 +static void +dump_instr(cfg_instr *i) +{ + const char *jrel = (is_relative_jump(i)) ? "jrel " : ""; + const char *jabs = (is_jump(i) && !is_relative_jump(i))? "jabs " : ""; + + char arg[128]; + + *arg = '\0'; + if (HAS_ARG(i->i_opcode)) { + sprintf(arg, "arg: %d ", i->i_oparg); + } + if (HAS_TARGET(i->i_opcode)) { + sprintf(arg, "target: %p [%d] ", i->i_target, i->i_oparg); + } + fprintf(stderr, "line: %d, opcode: %d %s%s%s\n", + i->i_loc.lineno, i->i_opcode, arg, jabs, jrel); +} + +static inline int +basicblock_returns(const basicblock *b) { + cfg_instr *last = _PyCfg_BasicblockLastInstr(b); + return last && (last->i_opcode == RETURN_VALUE || last->i_opcode == RETURN_CONST); +} + +static void +dump_basicblock(const basicblock *b) +{ + const char *b_return = basicblock_returns(b) ? "return " : ""; + fprintf(stderr, "%d: [EH=%d CLD=%d WRM=%d NO_FT=%d %p] used: %d, depth: %d, offset: %d %s\n", + b->b_label.id, b->b_except_handler, b->b_cold, b->b_warm, BB_NO_FALLTHROUGH(b), b, b->b_iused, + b->b_startdepth, b->b_offset, b_return); + if (b->b_instr) { + int i; + for (i = 0; i < b->b_iused; i++) { + fprintf(stderr, " [%02d] ", i); + dump_instr(b->b_instr + i); + } + } +} +#endif + + +/***** CFG construction and modification *****/ + +static basicblock * +cfg_builder_use_next_block(cfg_builder *g, basicblock *block) +{ + assert(block != NULL); + g->g_curblock->b_next = block; + g->g_curblock = block; + return block; +} + +cfg_instr * +_PyCfg_BasicblockLastInstr(const basicblock *b) { + assert(b->b_iused >= 0); + if (b->b_iused > 0) { + assert(b->b_instr != NULL); + return &b->b_instr[b->b_iused - 1]; + } + return NULL; +} + +static inline int +basicblock_exits_scope(const basicblock *b) { + cfg_instr *last = _PyCfg_BasicblockLastInstr(b); + return last && IS_SCOPE_EXIT_OPCODE(last->i_opcode); +} + +static bool +cfg_builder_current_block_is_terminated(cfg_builder *g) +{ + cfg_instr *last = _PyCfg_BasicblockLastInstr(g->g_curblock); + if (last && IS_TERMINATOR_OPCODE(last->i_opcode)) { + return true; + } + if (IS_LABEL(g->g_current_label)) { + if (last || IS_LABEL(g->g_curblock->b_label)) { + return true; + } + else { + /* current block is empty, label it */ + g->g_curblock->b_label = g->g_current_label; + g->g_current_label = NO_LABEL; + } + } + return false; +} + +static int +cfg_builder_maybe_start_new_block(cfg_builder *g) +{ + if (cfg_builder_current_block_is_terminated(g)) { + basicblock *b = cfg_builder_new_block(g); + if (b == NULL) { + return ERROR; + } + b->b_label = g->g_current_label; + g->g_current_label = NO_LABEL; + cfg_builder_use_next_block(g, b); + } + return SUCCESS; +} + +#ifndef NDEBUG +static bool +cfg_builder_check(cfg_builder *g) +{ + assert(g->g_entryblock->b_iused > 0); + for (basicblock *block = g->g_block_list; block != NULL; block = block->b_list) { + assert(!_PyMem_IsPtrFreed(block)); + if (block->b_instr != NULL) { + assert(block->b_ialloc > 0); + assert(block->b_iused >= 0); + assert(block->b_ialloc >= block->b_iused); + } + else { + assert (block->b_iused == 0); + assert (block->b_ialloc == 0); + } + } + return true; +} +#endif + +int +_PyCfgBuilder_Init(cfg_builder *g) +{ + g->g_block_list = NULL; + basicblock *block = cfg_builder_new_block(g); + if (block == NULL) { + return ERROR; + } + g->g_curblock = g->g_entryblock = block; + g->g_current_label = NO_LABEL; + return SUCCESS; +} + +void +_PyCfgBuilder_Fini(cfg_builder* g) +{ + assert(cfg_builder_check(g)); + basicblock *b = g->g_block_list; + while (b != NULL) { + if (b->b_instr) { + PyObject_Free((void *)b->b_instr); + } + basicblock *next = b->b_list; + PyObject_Free((void *)b); + b = next; + } +} + +int +_PyCfgBuilder_UseLabel(cfg_builder *g, jump_target_label lbl) +{ + g->g_current_label = lbl; + return cfg_builder_maybe_start_new_block(g); +} + +int +_PyCfgBuilder_Addop(cfg_builder *g, int opcode, int oparg, location loc) +{ + RETURN_IF_ERROR(cfg_builder_maybe_start_new_block(g)); + return basicblock_addop(g->g_curblock, opcode, oparg, loc); +} + + +/***** debugging helpers *****/ + +#ifndef NDEBUG +static int remove_redundant_nops(basicblock *bb); + +static bool +no_redundant_nops(cfg_builder *g) { + for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { + if (remove_redundant_nops(b) != 0) { + return false; + } + } + return true; +} + +static bool +no_empty_basic_blocks(cfg_builder *g) { + for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { + if (b->b_iused == 0) { + return false; + } + } + return true; +} + +static bool +no_redundant_jumps(cfg_builder *g) { + for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { + cfg_instr *last = _PyCfg_BasicblockLastInstr(b); + if (last != NULL) { + if (IS_UNCONDITIONAL_JUMP_OPCODE(last->i_opcode)) { + assert(last->i_target != b->b_next); + if (last->i_target == b->b_next) { + return false; + } + } + } + } + return true; +} + +#endif + +/***** CFG preprocessing (jump targets and exceptions) *****/ + +static int +normalize_jumps_in_block(cfg_builder *g, basicblock *b) { + cfg_instr *last = _PyCfg_BasicblockLastInstr(b); + if (last == NULL || !is_jump(last)) { + return SUCCESS; + } + assert(!IS_ASSEMBLER_OPCODE(last->i_opcode)); + bool is_forward = last->i_target->b_visited == 0; + switch(last->i_opcode) { + case JUMP: + last->i_opcode = is_forward ? JUMP_FORWARD : JUMP_BACKWARD; + return SUCCESS; + case JUMP_NO_INTERRUPT: + last->i_opcode = is_forward ? + JUMP_FORWARD : JUMP_BACKWARD_NO_INTERRUPT; + return SUCCESS; + } + int reversed_opcode = 0; + switch(last->i_opcode) { + case POP_JUMP_IF_NOT_NONE: + reversed_opcode = POP_JUMP_IF_NONE; + break; + case POP_JUMP_IF_NONE: + reversed_opcode = POP_JUMP_IF_NOT_NONE; + break; + case POP_JUMP_IF_FALSE: + reversed_opcode = POP_JUMP_IF_TRUE; + break; + case POP_JUMP_IF_TRUE: + reversed_opcode = POP_JUMP_IF_FALSE; + break; + } + if (is_forward) { + return SUCCESS; + } + /* transform 'conditional jump T' to + * 'reversed_jump b_next' followed by 'jump_backwards T' + */ + + basicblock *target = last->i_target; + basicblock *backwards_jump = cfg_builder_new_block(g); + if (backwards_jump == NULL) { + return ERROR; + } + basicblock_addop(backwards_jump, JUMP, target->b_label.id, NO_LOCATION); + backwards_jump->b_instr[0].i_target = target; + last->i_opcode = reversed_opcode; + last->i_target = b->b_next; + + backwards_jump->b_cold = b->b_cold; + backwards_jump->b_next = b->b_next; + b->b_next = backwards_jump; + return SUCCESS; +} + + +static int +normalize_jumps(_PyCfgBuilder *g) +{ + basicblock *entryblock = g->g_entryblock; + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + b->b_visited = 0; + } + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + b->b_visited = 1; + RETURN_IF_ERROR(normalize_jumps_in_block(g, b)); + } + return SUCCESS; +} + +static void +resolve_jump_offsets(basicblock *entryblock) +{ + int bsize, totsize, extended_arg_recompile; + + /* Compute the size of each block and fixup jump args. + Replace block pointer with position in bytecode. */ + do { + totsize = 0; + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + bsize = blocksize(b); + b->b_offset = totsize; + totsize += bsize; + } + extended_arg_recompile = 0; + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + bsize = b->b_offset; + for (int i = 0; i < b->b_iused; i++) { + cfg_instr *instr = &b->b_instr[i]; + int isize = _PyCfg_InstrSize(instr); + /* Relative jumps are computed relative to + the instruction pointer after fetching + the jump instruction. + */ + bsize += isize; + if (is_jump(instr)) { + instr->i_oparg = instr->i_target->b_offset; + if (is_relative_jump(instr)) { + if (instr->i_oparg < bsize) { + assert(IS_BACKWARDS_JUMP_OPCODE(instr->i_opcode)); + instr->i_oparg = bsize - instr->i_oparg; + } + else { + assert(!IS_BACKWARDS_JUMP_OPCODE(instr->i_opcode)); + instr->i_oparg -= bsize; + } + } + else { + assert(!IS_BACKWARDS_JUMP_OPCODE(instr->i_opcode)); + } + if (_PyCfg_InstrSize(instr) != isize) { + extended_arg_recompile = 1; + } + } + } + } + + /* XXX: This is an awful hack that could hurt performance, but + on the bright side it should work until we come up + with a better solution. + + The issue is that in the first loop blocksize() is called + which calls _PyCfg_InstrSize() which requires i_oparg be set + appropriately. There is a bootstrap problem because + i_oparg is calculated in the second loop above. + + So we loop until we stop seeing new EXTENDED_ARGs. + The only EXTENDED_ARGs that could be popping up are + ones in jump instructions. So this should converge + fairly quickly. + */ + } while (extended_arg_recompile); +} + +int +_PyCfg_ResolveJumps(_PyCfgBuilder *g) +{ + RETURN_IF_ERROR(normalize_jumps(g)); + assert(no_redundant_jumps(g)); + resolve_jump_offsets(g->g_entryblock); + return SUCCESS; +} + +static int +check_cfg(cfg_builder *g) { + for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { + /* Raise SystemError if jump or exit is not last instruction in the block. */ + for (int i = 0; i < b->b_iused; i++) { + int opcode = b->b_instr[i].i_opcode; + assert(!IS_ASSEMBLER_OPCODE(opcode)); + if (IS_TERMINATOR_OPCODE(opcode)) { + if (i != b->b_iused - 1) { + PyErr_SetString(PyExc_SystemError, "malformed control flow graph."); + return ERROR; + } + } + } + } + return SUCCESS; +} + +/* Calculate the actual jump target from the target_label */ +static int +translate_jump_labels_to_targets(basicblock *entryblock) +{ + int max_label = -1; + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + if (b->b_label.id > max_label) { + max_label = b->b_label.id; + } + } + size_t mapsize = sizeof(basicblock *) * (max_label + 1); + basicblock **label2block = (basicblock **)PyMem_Malloc(mapsize); + if (!label2block) { + PyErr_NoMemory(); + return ERROR; + } + memset(label2block, 0, mapsize); + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + if (b->b_label.id >= 0) { + label2block[b->b_label.id] = b; + } + } + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + for (int i = 0; i < b->b_iused; i++) { + cfg_instr *instr = &b->b_instr[i]; + assert(instr->i_target == NULL); + if (HAS_TARGET(instr->i_opcode)) { + int lbl = instr->i_oparg; + assert(lbl >= 0 && lbl <= max_label); + instr->i_target = label2block[lbl]; + assert(instr->i_target != NULL); + assert(instr->i_target->b_label.id == lbl); + } + } + } + PyMem_Free(label2block); + return SUCCESS; +} + + +static int +mark_except_handlers(basicblock *entryblock) { +#ifndef NDEBUG + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + assert(!b->b_except_handler); + } +#endif + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + for (int i=0; i < b->b_iused; i++) { + cfg_instr *instr = &b->b_instr[i]; + if (is_block_push(instr)) { + instr->i_target->b_except_handler = 1; + } + } + } + return SUCCESS; +} + + +typedef _PyCfgExceptStack ExceptStack; + +static basicblock * +push_except_block(ExceptStack *stack, cfg_instr *setup) { + assert(is_block_push(setup)); + int opcode = setup->i_opcode; + basicblock * target = setup->i_target; + if (opcode == SETUP_WITH || opcode == SETUP_CLEANUP) { + target->b_preserve_lasti = 1; + } + stack->handlers[++stack->depth] = target; + return target; +} + +static basicblock * +pop_except_block(ExceptStack *stack) { + assert(stack->depth > 0); + return stack->handlers[--stack->depth]; +} + +static basicblock * +except_stack_top(ExceptStack *stack) { + return stack->handlers[stack->depth]; +} + +static ExceptStack * +make_except_stack(void) { + ExceptStack *new = PyMem_Malloc(sizeof(ExceptStack)); + if (new == NULL) { + PyErr_NoMemory(); + return NULL; + } + new->depth = 0; + new->handlers[0] = NULL; + return new; +} + +static ExceptStack * +copy_except_stack(ExceptStack *stack) { + ExceptStack *copy = PyMem_Malloc(sizeof(ExceptStack)); + if (copy == NULL) { + PyErr_NoMemory(); + return NULL; + } + memcpy(copy, stack, sizeof(ExceptStack)); + return copy; +} + +static basicblock** +make_cfg_traversal_stack(basicblock *entryblock) { + int nblocks = 0; + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + b->b_visited = 0; + nblocks++; + } + basicblock **stack = (basicblock **)PyMem_Malloc(sizeof(basicblock *) * nblocks); + if (!stack) { + PyErr_NoMemory(); + } + return stack; +} + +Py_LOCAL_INLINE(void) +stackdepth_push(basicblock ***sp, basicblock *b, int depth) +{ + assert(b->b_startdepth < 0 || b->b_startdepth == depth); + if (b->b_startdepth < depth && b->b_startdepth < 100) { + assert(b->b_startdepth < 0); + b->b_startdepth = depth; + *(*sp)++ = b; + } +} + +/* Find the flow path that needs the largest stack. We assume that + * cycles in the flow graph have no net effect on the stack depth. + */ +int +_PyCfg_Stackdepth(basicblock *entryblock, int code_flags) +{ + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + b->b_startdepth = INT_MIN; + } + basicblock **stack = make_cfg_traversal_stack(entryblock); + if (!stack) { + return ERROR; + } + + int maxdepth = 0; + basicblock **sp = stack; + if (code_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) { + stackdepth_push(&sp, entryblock, 1); + } else { + stackdepth_push(&sp, entryblock, 0); + } + + while (sp != stack) { + basicblock *b = *--sp; + int depth = b->b_startdepth; + assert(depth >= 0); + basicblock *next = b->b_next; + for (int i = 0; i < b->b_iused; i++) { + cfg_instr *instr = &b->b_instr[i]; + int effect = PyCompile_OpcodeStackEffectWithJump(instr->i_opcode, instr->i_oparg, 0); + if (effect == PY_INVALID_STACK_EFFECT) { + PyErr_Format(PyExc_SystemError, + "compiler PyCompile_OpcodeStackEffectWithJump(opcode=%d, arg=%i) failed", + instr->i_opcode, instr->i_oparg); + return ERROR; + } + int new_depth = depth + effect; + assert(new_depth >= 0); /* invalid code or bug in stackdepth() */ + if (new_depth > maxdepth) { + maxdepth = new_depth; + } + if (HAS_TARGET(instr->i_opcode)) { + effect = PyCompile_OpcodeStackEffectWithJump(instr->i_opcode, instr->i_oparg, 1); + assert(effect != PY_INVALID_STACK_EFFECT); + int target_depth = depth + effect; + assert(target_depth >= 0); /* invalid code or bug in stackdepth() */ + if (target_depth > maxdepth) { + maxdepth = target_depth; + } + stackdepth_push(&sp, instr->i_target, target_depth); + } + depth = new_depth; + assert(!IS_ASSEMBLER_OPCODE(instr->i_opcode)); + if (IS_UNCONDITIONAL_JUMP_OPCODE(instr->i_opcode) || + IS_SCOPE_EXIT_OPCODE(instr->i_opcode)) + { + /* remaining code is dead */ + next = NULL; + break; + } + } + if (next != NULL) { + assert(BB_HAS_FALLTHROUGH(b)); + stackdepth_push(&sp, next, depth); + } + } + PyMem_Free(stack); + return maxdepth; +} + +static int +label_exception_targets(basicblock *entryblock) { + basicblock **todo_stack = make_cfg_traversal_stack(entryblock); + if (todo_stack == NULL) { + return ERROR; + } + ExceptStack *except_stack = make_except_stack(); + if (except_stack == NULL) { + PyMem_Free(todo_stack); + PyErr_NoMemory(); + return ERROR; + } + except_stack->depth = 0; + todo_stack[0] = entryblock; + entryblock->b_visited = 1; + entryblock->b_exceptstack = except_stack; + basicblock **todo = &todo_stack[1]; + basicblock *handler = NULL; + while (todo > todo_stack) { + todo--; + basicblock *b = todo[0]; + assert(b->b_visited == 1); + except_stack = b->b_exceptstack; + assert(except_stack != NULL); + b->b_exceptstack = NULL; + handler = except_stack_top(except_stack); + for (int i = 0; i < b->b_iused; i++) { + cfg_instr *instr = &b->b_instr[i]; + if (is_block_push(instr)) { + if (!instr->i_target->b_visited) { + ExceptStack *copy = copy_except_stack(except_stack); + if (copy == NULL) { + goto error; + } + instr->i_target->b_exceptstack = copy; + todo[0] = instr->i_target; + instr->i_target->b_visited = 1; + todo++; + } + handler = push_except_block(except_stack, instr); + } + else if (instr->i_opcode == POP_BLOCK) { + handler = pop_except_block(except_stack); + } + else if (is_jump(instr)) { + instr->i_except = handler; + assert(i == b->b_iused -1); + if (!instr->i_target->b_visited) { + if (BB_HAS_FALLTHROUGH(b)) { + ExceptStack *copy = copy_except_stack(except_stack); + if (copy == NULL) { + goto error; + } + instr->i_target->b_exceptstack = copy; + } + else { + instr->i_target->b_exceptstack = except_stack; + except_stack = NULL; + } + todo[0] = instr->i_target; + instr->i_target->b_visited = 1; + todo++; + } + } + else { + if (instr->i_opcode == YIELD_VALUE) { + instr->i_oparg = except_stack->depth; + } + instr->i_except = handler; + } + } + if (BB_HAS_FALLTHROUGH(b) && !b->b_next->b_visited) { + assert(except_stack != NULL); + b->b_next->b_exceptstack = except_stack; + todo[0] = b->b_next; + b->b_next->b_visited = 1; + todo++; + } + else if (except_stack != NULL) { + PyMem_Free(except_stack); + } + } +#ifdef Py_DEBUG + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + assert(b->b_exceptstack == NULL); + } +#endif + PyMem_Free(todo_stack); + return SUCCESS; +error: + PyMem_Free(todo_stack); + PyMem_Free(except_stack); + return ERROR; +} + +/***** CFG optimizations *****/ + +static int +mark_reachable(basicblock *entryblock) { + basicblock **stack = make_cfg_traversal_stack(entryblock); + if (stack == NULL) { + return ERROR; + } + basicblock **sp = stack; + entryblock->b_predecessors = 1; + *sp++ = entryblock; + while (sp > stack) { + basicblock *b = *(--sp); + b->b_visited = 1; + if (b->b_next && BB_HAS_FALLTHROUGH(b)) { + if (!b->b_next->b_visited) { + assert(b->b_next->b_predecessors == 0); + *sp++ = b->b_next; + } + b->b_next->b_predecessors++; + } + for (int i = 0; i < b->b_iused; i++) { + basicblock *target; + cfg_instr *instr = &b->b_instr[i]; + if (is_jump(instr) || is_block_push(instr)) { + target = instr->i_target; + if (!target->b_visited) { + assert(target->b_predecessors == 0 || target == b->b_next); + *sp++ = target; + } + target->b_predecessors++; + } + } + } + PyMem_Free(stack); + return SUCCESS; +} + +static void +eliminate_empty_basic_blocks(cfg_builder *g) { + /* Eliminate empty blocks */ + for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { + basicblock *next = b->b_next; + while (next && next->b_iused == 0) { + next = next->b_next; + } + b->b_next = next; + } + while(g->g_entryblock && g->g_entryblock->b_iused == 0) { + g->g_entryblock = g->g_entryblock->b_next; + } + for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { + assert(b->b_iused > 0); + for (int i = 0; i < b->b_iused; i++) { + cfg_instr *instr = &b->b_instr[i]; + if (HAS_TARGET(instr->i_opcode)) { + basicblock *target = instr->i_target; + while (target->b_iused == 0) { + target = target->b_next; + } + instr->i_target = target; + assert(instr->i_target && instr->i_target->b_iused > 0); + } + } + } +} + +static int +remove_redundant_nops(basicblock *bb) { + /* Remove NOPs when legal to do so. */ + int dest = 0; + int prev_lineno = -1; + for (int src = 0; src < bb->b_iused; src++) { + int lineno = bb->b_instr[src].i_loc.lineno; + if (bb->b_instr[src].i_opcode == NOP) { + /* Eliminate no-op if it doesn't have a line number */ + if (lineno < 0) { + continue; + } + /* or, if the previous instruction had the same line number. */ + if (prev_lineno == lineno) { + continue; + } + /* or, if the next instruction has same line number or no line number */ + if (src < bb->b_iused - 1) { + int next_lineno = bb->b_instr[src+1].i_loc.lineno; + if (next_lineno == lineno) { + continue; + } + if (next_lineno < 0) { + bb->b_instr[src+1].i_loc = bb->b_instr[src].i_loc; + continue; + } + } + else { + basicblock* next = bb->b_next; + while (next && next->b_iused == 0) { + next = next->b_next; + } + /* or if last instruction in BB and next BB has same line number */ + if (next) { + if (lineno == next->b_instr[0].i_loc.lineno) { + continue; + } + } + } + + } + if (dest != src) { + bb->b_instr[dest] = bb->b_instr[src]; + } + dest++; + prev_lineno = lineno; + } + assert(dest <= bb->b_iused); + int num_removed = bb->b_iused - dest; + bb->b_iused = dest; + return num_removed; +} + +static int +remove_redundant_nops_and_pairs(basicblock *entryblock) +{ + bool done = false; + + while (! done) { + done = true; + cfg_instr *prev_instr = NULL; + cfg_instr *instr = NULL; + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + remove_redundant_nops(b); + if (IS_LABEL(b->b_label)) { + /* this block is a jump target, forget instr */ + instr = NULL; + } + for (int i = 0; i < b->b_iused; i++) { + prev_instr = instr; + instr = &b->b_instr[i]; + int prev_opcode = prev_instr ? prev_instr->i_opcode : 0; + int prev_oparg = prev_instr ? prev_instr->i_oparg : 0; + int opcode = instr->i_opcode; + bool is_redundant_pair = false; + if (opcode == POP_TOP) { + if (prev_opcode == LOAD_CONST) { + is_redundant_pair = true; + } + else if (prev_opcode == COPY && prev_oparg == 1) { + is_redundant_pair = true; + } + } + if (is_redundant_pair) { + INSTR_SET_OP0(prev_instr, NOP); + INSTR_SET_OP0(instr, NOP); + done = false; + } + } + if ((instr && is_jump(instr)) || !BB_HAS_FALLTHROUGH(b)) { + instr = NULL; + } + } + } + return SUCCESS; +} + +static int +remove_redundant_jumps(cfg_builder *g) { + /* If a non-empty block ends with a jump instruction, check if the next + * non-empty block reached through normal flow control is the target + * of that jump. If it is, then the jump instruction is redundant and + * can be deleted. + */ + assert(no_empty_basic_blocks(g)); + for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { + cfg_instr *last = _PyCfg_BasicblockLastInstr(b); + assert(last != NULL); + assert(!IS_ASSEMBLER_OPCODE(last->i_opcode)); + if (IS_UNCONDITIONAL_JUMP_OPCODE(last->i_opcode)) { + if (last->i_target == NULL) { + PyErr_SetString(PyExc_SystemError, "jump with NULL target"); + return ERROR; + } + if (last->i_target == b->b_next) { + assert(b->b_next->b_iused); + INSTR_SET_OP0(last, NOP); + } + } + } + return SUCCESS; +} + +/* Maximum size of basic block that should be copied in optimizer */ +#define MAX_COPY_SIZE 4 + +/* If this block ends with an unconditional jump to a small exit block, then + * remove the jump and extend this block with the target. + * Returns 1 if extended, 0 if no change, and -1 on error. + */ +static int +inline_small_exit_blocks(basicblock *bb) { + cfg_instr *last = _PyCfg_BasicblockLastInstr(bb); + if (last == NULL) { + return 0; + } + if (!IS_UNCONDITIONAL_JUMP_OPCODE(last->i_opcode)) { + return 0; + } + basicblock *target = last->i_target; + if (basicblock_exits_scope(target) && target->b_iused <= MAX_COPY_SIZE) { + INSTR_SET_OP0(last, NOP); + RETURN_IF_ERROR(basicblock_append_instructions(bb, target)); + return 1; + } + return 0; +} + +// Attempt to eliminate jumps to jumps by updating inst to jump to +// target->i_target using the provided opcode. Return whether or not the +// optimization was successful. +static bool +jump_thread(cfg_instr *inst, cfg_instr *target, int opcode) +{ + assert(is_jump(inst)); + assert(is_jump(target)); + // bpo-45773: If inst->i_target == target->i_target, then nothing actually + // changes (and we fall into an infinite loop): + if ((inst->i_loc.lineno == target->i_loc.lineno || target->i_loc.lineno == -1) && + inst->i_target != target->i_target) + { + inst->i_target = target->i_target; + inst->i_opcode = opcode; + return true; + } + return false; +} + +static PyObject* +get_const_value(int opcode, int oparg, PyObject *co_consts) +{ + PyObject *constant = NULL; + assert(HAS_CONST(opcode)); + if (opcode == LOAD_CONST) { + constant = PyList_GET_ITEM(co_consts, oparg); + } + + if (constant == NULL) { + PyErr_SetString(PyExc_SystemError, + "Internal error: failed to get value of a constant"); + return NULL; + } + return Py_NewRef(constant); +} + +/* Replace LOAD_CONST c1, LOAD_CONST c2 ... LOAD_CONST cn, BUILD_TUPLE n + with LOAD_CONST (c1, c2, ... cn). + The consts table must still be in list form so that the + new constant (c1, c2, ... cn) can be appended. + Called with codestr pointing to the first LOAD_CONST. +*/ +static int +fold_tuple_on_constants(PyObject *const_cache, + cfg_instr *inst, + int n, PyObject *consts) +{ + /* Pre-conditions */ + assert(PyDict_CheckExact(const_cache)); + assert(PyList_CheckExact(consts)); + assert(inst[n].i_opcode == BUILD_TUPLE); + assert(inst[n].i_oparg == n); + + for (int i = 0; i < n; i++) { + if (!HAS_CONST(inst[i].i_opcode)) { + return SUCCESS; + } + } + + /* Buildup new tuple of constants */ + PyObject *newconst = PyTuple_New(n); + if (newconst == NULL) { + return ERROR; + } + for (int i = 0; i < n; i++) { + int op = inst[i].i_opcode; + int arg = inst[i].i_oparg; + PyObject *constant = get_const_value(op, arg, consts); + if (constant == NULL) { + return ERROR; + } + PyTuple_SET_ITEM(newconst, i, constant); + } + if (_PyCompile_ConstCacheMergeOne(const_cache, &newconst) < 0) { + Py_DECREF(newconst); + return ERROR; + } + + Py_ssize_t index; + for (index = 0; index < PyList_GET_SIZE(consts); index++) { + if (PyList_GET_ITEM(consts, index) == newconst) { + break; + } + } + if (index == PyList_GET_SIZE(consts)) { + if ((size_t)index >= (size_t)INT_MAX - 1) { + Py_DECREF(newconst); + PyErr_SetString(PyExc_OverflowError, "too many constants"); + return ERROR; + } + if (PyList_Append(consts, newconst)) { + Py_DECREF(newconst); + return ERROR; + } + } + Py_DECREF(newconst); + for (int i = 0; i < n; i++) { + INSTR_SET_OP0(&inst[i], NOP); + } + INSTR_SET_OP1(&inst[n], LOAD_CONST, (int)index); + return SUCCESS; +} + +#define VISITED (-1) + +// Replace an arbitrary run of SWAPs and NOPs with an optimal one that has the +// same effect. +static int +swaptimize(basicblock *block, int *ix) +{ + // NOTE: "./python -m test test_patma" serves as a good, quick stress test + // for this function. Make sure to blow away cached *.pyc files first! + assert(*ix < block->b_iused); + cfg_instr *instructions = &block->b_instr[*ix]; + // Find the length of the current sequence of SWAPs and NOPs, and record the + // maximum depth of the stack manipulations: + assert(instructions[0].i_opcode == SWAP); + int depth = instructions[0].i_oparg; + int len = 0; + int more = false; + int limit = block->b_iused - *ix; + while (++len < limit) { + int opcode = instructions[len].i_opcode; + if (opcode == SWAP) { + depth = Py_MAX(depth, instructions[len].i_oparg); + more = true; + } + else if (opcode != NOP) { + break; + } + } + // It's already optimal if there's only one SWAP: + if (!more) { + return SUCCESS; + } + // Create an array with elements {0, 1, 2, ..., depth - 1}: + int *stack = PyMem_Malloc(depth * sizeof(int)); + if (stack == NULL) { + PyErr_NoMemory(); + return ERROR; + } + for (int i = 0; i < depth; i++) { + stack[i] = i; + } + // Simulate the combined effect of these instructions by "running" them on + // our "stack": + for (int i = 0; i < len; i++) { + if (instructions[i].i_opcode == SWAP) { + int oparg = instructions[i].i_oparg; + int top = stack[0]; + // SWAPs are 1-indexed: + stack[0] = stack[oparg - 1]; + stack[oparg - 1] = top; + } + } + // Now we can begin! Our approach here is based on a solution to a closely + // related problem (https://cs.stackexchange.com/a/13938). It's easiest to + // think of this algorithm as determining the steps needed to efficiently + // "un-shuffle" our stack. By performing the moves in *reverse* order, + // though, we can efficiently *shuffle* it! For this reason, we will be + // replacing instructions starting from the *end* of the run. Since the + // solution is optimal, we don't need to worry about running out of space: + int current = len - 1; + for (int i = 0; i < depth; i++) { + // Skip items that have already been visited, or just happen to be in + // the correct location: + if (stack[i] == VISITED || stack[i] == i) { + continue; + } + // Okay, we've found an item that hasn't been visited. It forms a cycle + // with other items; traversing the cycle and swapping each item with + // the next will put them all in the correct place. The weird + // loop-and-a-half is necessary to insert 0 into every cycle, since we + // can only swap from that position: + int j = i; + while (true) { + // Skip the actual swap if our item is zero, since swapping the top + // item with itself is pointless: + if (j) { + assert(0 <= current); + // SWAPs are 1-indexed: + instructions[current].i_opcode = SWAP; + instructions[current--].i_oparg = j + 1; + } + if (stack[j] == VISITED) { + // Completed the cycle: + assert(j == i); + break; + } + int next_j = stack[j]; + stack[j] = VISITED; + j = next_j; + } + } + // NOP out any unused instructions: + while (0 <= current) { + INSTR_SET_OP0(&instructions[current--], NOP); + } + PyMem_Free(stack); + *ix += len - 1; + return SUCCESS; +} + + +// This list is pretty small, since it's only okay to reorder opcodes that: +// - can't affect control flow (like jumping or raising exceptions) +// - can't invoke arbitrary code (besides finalizers) +// - only touch the TOS (and pop it when finished) +#define SWAPPABLE(opcode) \ + ((opcode) == STORE_FAST || (opcode) == POP_TOP) + +static int +next_swappable_instruction(basicblock *block, int i, int lineno) +{ + while (++i < block->b_iused) { + cfg_instr *instruction = &block->b_instr[i]; + if (0 <= lineno && instruction->i_loc.lineno != lineno) { + // Optimizing across this instruction could cause user-visible + // changes in the names bound between line tracing events! + return -1; + } + if (instruction->i_opcode == NOP) { + continue; + } + if (SWAPPABLE(instruction->i_opcode)) { + return i; + } + return -1; + } + return -1; +} + +// Attempt to apply SWAPs statically by swapping *instructions* rather than +// stack items. For example, we can replace SWAP(2), POP_TOP, STORE_FAST(42) +// with the more efficient NOP, STORE_FAST(42), POP_TOP. +static void +apply_static_swaps(basicblock *block, int i) +{ + // SWAPs are to our left, and potential swaperands are to our right: + for (; 0 <= i; i--) { + assert(i < block->b_iused); + cfg_instr *swap = &block->b_instr[i]; + if (swap->i_opcode != SWAP) { + if (swap->i_opcode == NOP || SWAPPABLE(swap->i_opcode)) { + // Nope, but we know how to handle these. Keep looking: + continue; + } + // We can't reason about what this instruction does. Bail: + return; + } + int j = next_swappable_instruction(block, i, -1); + if (j < 0) { + return; + } + int k = j; + int lineno = block->b_instr[j].i_loc.lineno; + for (int count = swap->i_oparg - 1; 0 < count; count--) { + k = next_swappable_instruction(block, k, lineno); + if (k < 0) { + return; + } + } + // Success! + INSTR_SET_OP0(swap, NOP); + cfg_instr temp = block->b_instr[j]; + block->b_instr[j] = block->b_instr[k]; + block->b_instr[k] = temp; + } +} + +static int +optimize_basic_block(PyObject *const_cache, basicblock *bb, PyObject *consts) +{ + assert(PyDict_CheckExact(const_cache)); + assert(PyList_CheckExact(consts)); + cfg_instr nop; + INSTR_SET_OP0(&nop, NOP); + cfg_instr *target = &nop; + int opcode = 0; + int oparg = 0; + int nextop = 0; + for (int i = 0; i < bb->b_iused; i++) { + cfg_instr *inst = &bb->b_instr[i]; + bool is_copy_of_load_const = (opcode == LOAD_CONST && + inst->i_opcode == COPY && + inst->i_oparg == 1); + if (! is_copy_of_load_const) { + opcode = inst->i_opcode; + oparg = inst->i_oparg; + if (HAS_TARGET(opcode)) { + assert(inst->i_target->b_iused > 0); + target = &inst->i_target->b_instr[0]; + assert(!IS_ASSEMBLER_OPCODE(target->i_opcode)); + } + else { + target = &nop; + } + } + nextop = i+1 < bb->b_iused ? bb->b_instr[i+1].i_opcode : 0; + assert(!IS_ASSEMBLER_OPCODE(opcode)); + switch (opcode) { + /* Remove LOAD_CONST const; conditional jump */ + case LOAD_CONST: + { + PyObject* cnt; + int is_true; + int jump_if_true; + switch(nextop) { + case POP_JUMP_IF_FALSE: + case POP_JUMP_IF_TRUE: + cnt = get_const_value(opcode, oparg, consts); + if (cnt == NULL) { + goto error; + } + is_true = PyObject_IsTrue(cnt); + Py_DECREF(cnt); + if (is_true == -1) { + goto error; + } + INSTR_SET_OP0(inst, NOP); + jump_if_true = nextop == POP_JUMP_IF_TRUE; + if (is_true == jump_if_true) { + bb->b_instr[i+1].i_opcode = JUMP; + } + else { + INSTR_SET_OP0(&bb->b_instr[i + 1], NOP); + } + break; + case IS_OP: + cnt = get_const_value(opcode, oparg, consts); + if (cnt == NULL) { + goto error; + } + int jump_op = i+2 < bb->b_iused ? bb->b_instr[i+2].i_opcode : 0; + if (Py_IsNone(cnt) && (jump_op == POP_JUMP_IF_FALSE || jump_op == POP_JUMP_IF_TRUE)) { + unsigned char nextarg = bb->b_instr[i+1].i_oparg; + INSTR_SET_OP0(inst, NOP); + INSTR_SET_OP0(&bb->b_instr[i + 1], NOP); + bb->b_instr[i+2].i_opcode = nextarg ^ (jump_op == POP_JUMP_IF_FALSE) ? + POP_JUMP_IF_NOT_NONE : POP_JUMP_IF_NONE; + } + Py_DECREF(cnt); + break; + case RETURN_VALUE: + INSTR_SET_OP0(inst, NOP); + INSTR_SET_OP1(&bb->b_instr[++i], RETURN_CONST, oparg); + break; + } + break; + } + /* Try to fold tuples of constants. + Skip over BUILD_TUPLE(1) UNPACK_SEQUENCE(1). + Replace BUILD_TUPLE(2) UNPACK_SEQUENCE(2) with SWAP(2). + Replace BUILD_TUPLE(3) UNPACK_SEQUENCE(3) with SWAP(3). */ + case BUILD_TUPLE: + if (nextop == UNPACK_SEQUENCE && oparg == bb->b_instr[i+1].i_oparg) { + switch(oparg) { + case 1: + INSTR_SET_OP0(inst, NOP); + INSTR_SET_OP0(&bb->b_instr[i + 1], NOP); + continue; + case 2: + case 3: + INSTR_SET_OP0(inst, NOP); + bb->b_instr[i+1].i_opcode = SWAP; + continue; + } + } + if (i >= oparg) { + if (fold_tuple_on_constants(const_cache, inst-oparg, oparg, consts)) { + goto error; + } + } + break; + case POP_JUMP_IF_NOT_NONE: + case POP_JUMP_IF_NONE: + switch (target->i_opcode) { + case JUMP: + i -= jump_thread(inst, target, inst->i_opcode); + } + break; + case POP_JUMP_IF_FALSE: + switch (target->i_opcode) { + case JUMP: + i -= jump_thread(inst, target, POP_JUMP_IF_FALSE); + } + break; + case POP_JUMP_IF_TRUE: + switch (target->i_opcode) { + case JUMP: + i -= jump_thread(inst, target, POP_JUMP_IF_TRUE); + } + break; + case JUMP: + switch (target->i_opcode) { + case JUMP: + i -= jump_thread(inst, target, JUMP); + } + break; + case FOR_ITER: + if (target->i_opcode == JUMP) { + /* This will not work now because the jump (at target) could + * be forward or backward and FOR_ITER only jumps forward. We + * can re-enable this if ever we implement a backward version + * of FOR_ITER. + */ + /* + i -= jump_thread(inst, target, FOR_ITER); + */ + } + break; + case SWAP: + if (oparg == 1) { + INSTR_SET_OP0(inst, NOP); + break; + } + if (swaptimize(bb, &i) < 0) { + goto error; + } + apply_static_swaps(bb, i); + break; + case KW_NAMES: + break; + case PUSH_NULL: + if (nextop == LOAD_GLOBAL && (inst[1].i_opcode & 1) == 0) { + INSTR_SET_OP0(inst, NOP); + inst[1].i_oparg |= 1; + } + break; + default: + /* All HAS_CONST opcodes should be handled with LOAD_CONST */ + assert (!HAS_CONST(inst->i_opcode)); + } + } + return SUCCESS; +error: + return ERROR; +} + + +/* Perform optimizations on a control flow graph. + The consts object should still be in list form to allow new constants + to be appended. + + Code trasnformations that reduce code size initially fill the gaps with + NOPs. Later those NOPs are removed. +*/ +static int +optimize_cfg(cfg_builder *g, PyObject *consts, PyObject *const_cache) +{ + assert(PyDict_CheckExact(const_cache)); + RETURN_IF_ERROR(check_cfg(g)); + eliminate_empty_basic_blocks(g); + for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { + RETURN_IF_ERROR(inline_small_exit_blocks(b)); + } + assert(no_empty_basic_blocks(g)); + for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { + RETURN_IF_ERROR(optimize_basic_block(const_cache, b, consts)); + assert(b->b_predecessors == 0); + } + RETURN_IF_ERROR(remove_redundant_nops_and_pairs(g->g_entryblock)); + for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { + RETURN_IF_ERROR(inline_small_exit_blocks(b)); + } + RETURN_IF_ERROR(mark_reachable(g->g_entryblock)); + + /* Delete unreachable instructions */ + for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { + if (b->b_predecessors == 0) { + b->b_iused = 0; + } + } + for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { + remove_redundant_nops(b); + } + eliminate_empty_basic_blocks(g); + assert(no_redundant_nops(g)); + RETURN_IF_ERROR(remove_redundant_jumps(g)); + return SUCCESS; +} + +// helper functions for add_checks_for_loads_of_unknown_variables +static inline void +maybe_push(basicblock *b, uint64_t unsafe_mask, basicblock ***sp) +{ + // Push b if the unsafe mask is giving us any new information. + // To avoid overflowing the stack, only allow each block once. + // Use b->b_visited=1 to mean that b is currently on the stack. + uint64_t both = b->b_unsafe_locals_mask | unsafe_mask; + if (b->b_unsafe_locals_mask != both) { + b->b_unsafe_locals_mask = both; + // More work left to do. + if (!b->b_visited) { + // not on the stack, so push it. + *(*sp)++ = b; + b->b_visited = 1; + } + } +} + +static void +scan_block_for_locals(basicblock *b, basicblock ***sp) +{ + // bit i is set if local i is potentially uninitialized + uint64_t unsafe_mask = b->b_unsafe_locals_mask; + for (int i = 0; i < b->b_iused; i++) { + cfg_instr *instr = &b->b_instr[i]; + assert(instr->i_opcode != EXTENDED_ARG); + assert(!IS_SUPERINSTRUCTION_OPCODE(instr->i_opcode)); + if (instr->i_except != NULL) { + maybe_push(instr->i_except, unsafe_mask, sp); + } + if (instr->i_oparg >= 64) { + continue; + } + assert(instr->i_oparg >= 0); + uint64_t bit = (uint64_t)1 << instr->i_oparg; + switch (instr->i_opcode) { + case DELETE_FAST: + unsafe_mask |= bit; + break; + case STORE_FAST: + unsafe_mask &= ~bit; + break; + case LOAD_FAST_CHECK: + // If this doesn't raise, then the local is defined. + unsafe_mask &= ~bit; + break; + case LOAD_FAST: + if (unsafe_mask & bit) { + instr->i_opcode = LOAD_FAST_CHECK; + } + unsafe_mask &= ~bit; + break; + } + } + if (b->b_next && BB_HAS_FALLTHROUGH(b)) { + maybe_push(b->b_next, unsafe_mask, sp); + } + cfg_instr *last = _PyCfg_BasicblockLastInstr(b); + if (last && is_jump(last)) { + assert(last->i_target != NULL); + maybe_push(last->i_target, unsafe_mask, sp); + } +} + +static int +fast_scan_many_locals(basicblock *entryblock, int nlocals) +{ + assert(nlocals > 64); + Py_ssize_t *states = PyMem_Calloc(nlocals - 64, sizeof(Py_ssize_t)); + if (states == NULL) { + PyErr_NoMemory(); + return ERROR; + } + Py_ssize_t blocknum = 0; + // state[i - 64] == blocknum if local i is guaranteed to + // be initialized, i.e., if it has had a previous LOAD_FAST or + // STORE_FAST within that basicblock (not followed by DELETE_FAST). + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + blocknum++; + for (int i = 0; i < b->b_iused; i++) { + cfg_instr *instr = &b->b_instr[i]; + assert(instr->i_opcode != EXTENDED_ARG); + assert(!IS_SUPERINSTRUCTION_OPCODE(instr->i_opcode)); + int arg = instr->i_oparg; + if (arg < 64) { + continue; + } + assert(arg >= 0); + switch (instr->i_opcode) { + case DELETE_FAST: + states[arg - 64] = blocknum - 1; + break; + case STORE_FAST: + states[arg - 64] = blocknum; + break; + case LOAD_FAST: + if (states[arg - 64] != blocknum) { + instr->i_opcode = LOAD_FAST_CHECK; + } + states[arg - 64] = blocknum; + break; + Py_UNREACHABLE(); + } + } + } + PyMem_Free(states); + return SUCCESS; +} + +static int +remove_unused_consts(basicblock *entryblock, PyObject *consts) +{ + assert(PyList_CheckExact(consts)); + Py_ssize_t nconsts = PyList_GET_SIZE(consts); + if (nconsts == 0) { + return SUCCESS; /* nothing to do */ + } + + Py_ssize_t *index_map = NULL; + Py_ssize_t *reverse_index_map = NULL; + int err = ERROR; + + index_map = PyMem_Malloc(nconsts * sizeof(Py_ssize_t)); + if (index_map == NULL) { + goto end; + } + for (Py_ssize_t i = 1; i < nconsts; i++) { + index_map[i] = -1; + } + // The first constant may be docstring; keep it always. + index_map[0] = 0; + + /* mark used consts */ + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + for (int i = 0; i < b->b_iused; i++) { + if (HAS_CONST(b->b_instr[i].i_opcode)) { + int index = b->b_instr[i].i_oparg; + index_map[index] = index; + } + } + } + /* now index_map[i] == i if consts[i] is used, -1 otherwise */ + /* condense consts */ + Py_ssize_t n_used_consts = 0; + for (int i = 0; i < nconsts; i++) { + if (index_map[i] != -1) { + assert(index_map[i] == i); + index_map[n_used_consts++] = index_map[i]; + } + } + if (n_used_consts == nconsts) { + /* nothing to do */ + err = SUCCESS; + goto end; + } + + /* move all used consts to the beginning of the consts list */ + assert(n_used_consts < nconsts); + for (Py_ssize_t i = 0; i < n_used_consts; i++) { + Py_ssize_t old_index = index_map[i]; + assert(i <= old_index && old_index < nconsts); + if (i != old_index) { + PyObject *value = PyList_GET_ITEM(consts, index_map[i]); + assert(value != NULL); + PyList_SetItem(consts, i, Py_NewRef(value)); + } + } + + /* truncate the consts list at its new size */ + if (PyList_SetSlice(consts, n_used_consts, nconsts, NULL) < 0) { + goto end; + } + /* adjust const indices in the bytecode */ + reverse_index_map = PyMem_Malloc(nconsts * sizeof(Py_ssize_t)); + if (reverse_index_map == NULL) { + goto end; + } + for (Py_ssize_t i = 0; i < nconsts; i++) { + reverse_index_map[i] = -1; + } + for (Py_ssize_t i = 0; i < n_used_consts; i++) { + assert(index_map[i] != -1); + assert(reverse_index_map[index_map[i]] == -1); + reverse_index_map[index_map[i]] = i; + } + + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + for (int i = 0; i < b->b_iused; i++) { + if (HAS_CONST(b->b_instr[i].i_opcode)) { + int index = b->b_instr[i].i_oparg; + assert(reverse_index_map[index] >= 0); + assert(reverse_index_map[index] < n_used_consts); + b->b_instr[i].i_oparg = (int)reverse_index_map[index]; + } + } + } + + err = SUCCESS; +end: + PyMem_Free(index_map); + PyMem_Free(reverse_index_map); + return err; +} + + + +static int +add_checks_for_loads_of_uninitialized_variables(basicblock *entryblock, + int nlocals, + int nparams) +{ + if (nlocals == 0) { + return SUCCESS; + } + if (nlocals > 64) { + // To avoid O(nlocals**2) compilation, locals beyond the first + // 64 are only analyzed one basicblock at a time: initialization + // info is not passed between basicblocks. + if (fast_scan_many_locals(entryblock, nlocals) < 0) { + return ERROR; + } + nlocals = 64; + } + basicblock **stack = make_cfg_traversal_stack(entryblock); + if (stack == NULL) { + return ERROR; + } + basicblock **sp = stack; + + // First origin of being uninitialized: + // The non-parameter locals in the entry block. + uint64_t start_mask = 0; + for (int i = nparams; i < nlocals; i++) { + start_mask |= (uint64_t)1 << i; + } + maybe_push(entryblock, start_mask, &sp); + + // Second origin of being uninitialized: + // There could be DELETE_FAST somewhere, so + // be sure to scan each basicblock at least once. + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + scan_block_for_locals(b, &sp); + } + // Now propagate the uncertainty from the origins we found: Use + // LOAD_FAST_CHECK for any LOAD_FAST where the local could be undefined. + while (sp > stack) { + basicblock *b = *--sp; + // mark as no longer on stack + b->b_visited = 0; + scan_block_for_locals(b, &sp); + } + PyMem_Free(stack); + return SUCCESS; +} + + +static int +mark_warm(basicblock *entryblock) { + basicblock **stack = make_cfg_traversal_stack(entryblock); + if (stack == NULL) { + return ERROR; + } + basicblock **sp = stack; + + *sp++ = entryblock; + entryblock->b_visited = 1; + while (sp > stack) { + basicblock *b = *(--sp); + assert(!b->b_except_handler); + b->b_warm = 1; + basicblock *next = b->b_next; + if (next && BB_HAS_FALLTHROUGH(b) && !next->b_visited) { + *sp++ = next; + next->b_visited = 1; + } + for (int i=0; i < b->b_iused; i++) { + cfg_instr *instr = &b->b_instr[i]; + if (is_jump(instr) && !instr->i_target->b_visited) { + *sp++ = instr->i_target; + instr->i_target->b_visited = 1; + } + } + } + PyMem_Free(stack); + return SUCCESS; +} + +static int +mark_cold(basicblock *entryblock) { + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + assert(!b->b_cold && !b->b_warm); + } + if (mark_warm(entryblock) < 0) { + return ERROR; + } + + basicblock **stack = make_cfg_traversal_stack(entryblock); + if (stack == NULL) { + return ERROR; + } + + basicblock **sp = stack; + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + if (b->b_except_handler) { + assert(!b->b_warm); + *sp++ = b; + b->b_visited = 1; + } + } + + while (sp > stack) { + basicblock *b = *(--sp); + b->b_cold = 1; + basicblock *next = b->b_next; + if (next && BB_HAS_FALLTHROUGH(b)) { + if (!next->b_warm && !next->b_visited) { + *sp++ = next; + next->b_visited = 1; + } + } + for (int i = 0; i < b->b_iused; i++) { + cfg_instr *instr = &b->b_instr[i]; + if (is_jump(instr)) { + assert(i == b->b_iused - 1); + basicblock *target = b->b_instr[i].i_target; + if (!target->b_warm && !target->b_visited) { + *sp++ = target; + target->b_visited = 1; + } + } + } + } + PyMem_Free(stack); + return SUCCESS; +} + + +static int +push_cold_blocks_to_end(cfg_builder *g, int code_flags) { + basicblock *entryblock = g->g_entryblock; + if (entryblock->b_next == NULL) { + /* single basicblock, no need to reorder */ + return SUCCESS; + } + RETURN_IF_ERROR(mark_cold(entryblock)); + + /* If we have a cold block with fallthrough to a warm block, add */ + /* an explicit jump instead of fallthrough */ + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + if (b->b_cold && BB_HAS_FALLTHROUGH(b) && b->b_next && b->b_next->b_warm) { + basicblock *explicit_jump = cfg_builder_new_block(g); + if (explicit_jump == NULL) { + return ERROR; + } + basicblock_addop(explicit_jump, JUMP, b->b_next->b_label.id, NO_LOCATION); + explicit_jump->b_cold = 1; + explicit_jump->b_next = b->b_next; + b->b_next = explicit_jump; + + /* set target */ + cfg_instr *last = _PyCfg_BasicblockLastInstr(explicit_jump); + last->i_target = explicit_jump->b_next; + } + } + + assert(!entryblock->b_cold); /* First block can't be cold */ + basicblock *cold_blocks = NULL; + basicblock *cold_blocks_tail = NULL; + + basicblock *b = entryblock; + while(b->b_next) { + assert(!b->b_cold); + while (b->b_next && !b->b_next->b_cold) { + b = b->b_next; + } + if (b->b_next == NULL) { + /* no more cold blocks */ + break; + } + + /* b->b_next is the beginning of a cold streak */ + assert(!b->b_cold && b->b_next->b_cold); + + basicblock *b_end = b->b_next; + while (b_end->b_next && b_end->b_next->b_cold) { + b_end = b_end->b_next; + } + + /* b_end is the end of the cold streak */ + assert(b_end && b_end->b_cold); + assert(b_end->b_next == NULL || !b_end->b_next->b_cold); + + if (cold_blocks == NULL) { + cold_blocks = b->b_next; + } + else { + cold_blocks_tail->b_next = b->b_next; + } + cold_blocks_tail = b_end; + b->b_next = b_end->b_next; + b_end->b_next = NULL; + } + assert(b != NULL && b->b_next == NULL); + b->b_next = cold_blocks; + + if (cold_blocks != NULL) { + RETURN_IF_ERROR(remove_redundant_jumps(g)); + } + return SUCCESS; +} + +int +_PyCfg_OptimizeCodeUnit(cfg_builder *g, PyObject *consts, PyObject *const_cache, + int code_flags, int nlocals, int nparams) +{ + assert(cfg_builder_check(g)); + /** Preprocessing **/ + /* Map labels to targets and mark exception handlers */ + RETURN_IF_ERROR(translate_jump_labels_to_targets(g->g_entryblock)); + RETURN_IF_ERROR(mark_except_handlers(g->g_entryblock)); + RETURN_IF_ERROR(label_exception_targets(g->g_entryblock)); + + /** Optimization **/ + RETURN_IF_ERROR(optimize_cfg(g, consts, const_cache)); + RETURN_IF_ERROR(remove_unused_consts(g->g_entryblock, consts)); + RETURN_IF_ERROR( + add_checks_for_loads_of_uninitialized_variables( + g->g_entryblock, nlocals, nparams)); + + RETURN_IF_ERROR(push_cold_blocks_to_end(g, code_flags)); + return SUCCESS; +} + +void +_PyCfg_ConvertExceptionHandlersToNops(basicblock *entryblock) +{ + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + for (int i = 0; i < b->b_iused; i++) { + cfg_instr *instr = &b->b_instr[i]; + if (is_block_push(instr) || instr->i_opcode == POP_BLOCK) { + INSTR_SET_OP0(instr, NOP); + } + } + } + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + remove_redundant_nops(b); + } +} + +static inline bool +is_exit_without_lineno(basicblock *b) { + if (!basicblock_exits_scope(b)) { + return false; + } + for (int i = 0; i < b->b_iused; i++) { + if (b->b_instr[i].i_loc.lineno >= 0) { + return false; + } + } + return true; +} + +/* PEP 626 mandates that the f_lineno of a frame is correct + * after a frame terminates. It would be prohibitively expensive + * to continuously update the f_lineno field at runtime, + * so we make sure that all exiting instruction (raises and returns) + * have a valid line number, allowing us to compute f_lineno lazily. + * We can do this by duplicating the exit blocks without line number + * so that none have more than one predecessor. We can then safely + * copy the line number from the sole predecessor block. + */ +static int +duplicate_exits_without_lineno(cfg_builder *g) +{ + assert(no_empty_basic_blocks(g)); + /* Copy all exit blocks without line number that are targets of a jump. + */ + basicblock *entryblock = g->g_entryblock; + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + cfg_instr *last = _PyCfg_BasicblockLastInstr(b); + assert(last != NULL); + if (is_jump(last)) { + basicblock *target = last->i_target; + if (is_exit_without_lineno(target) && target->b_predecessors > 1) { + basicblock *new_target = copy_basicblock(g, target); + if (new_target == NULL) { + return ERROR; + } + new_target->b_instr[0].i_loc = last->i_loc; + last->i_target = new_target; + target->b_predecessors--; + new_target->b_predecessors = 1; + new_target->b_next = target->b_next; + target->b_next = new_target; + } + } + } + + /* Any remaining reachable exit blocks without line number can only be reached by + * fall through, and thus can only have a single predecessor */ + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + if (BB_HAS_FALLTHROUGH(b) && b->b_next && b->b_iused > 0) { + if (is_exit_without_lineno(b->b_next)) { + cfg_instr *last = _PyCfg_BasicblockLastInstr(b); + assert(last != NULL); + b->b_next->b_instr[0].i_loc = last->i_loc; + } + } + } + return SUCCESS; +} + + +/* If an instruction has no line number, but it's predecessor in the BB does, + * then copy the line number. If a successor block has no line number, and only + * one predecessor, then inherit the line number. + * This ensures that all exit blocks (with one predecessor) receive a line number. + * Also reduces the size of the line number table, + * but has no impact on the generated line number events. + */ +static void +propagate_line_numbers(basicblock *entryblock) { + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + cfg_instr *last = _PyCfg_BasicblockLastInstr(b); + if (last == NULL) { + continue; + } + + location prev_location = NO_LOCATION; + for (int i = 0; i < b->b_iused; i++) { + if (b->b_instr[i].i_loc.lineno < 0) { + b->b_instr[i].i_loc = prev_location; + } + else { + prev_location = b->b_instr[i].i_loc; + } + } + if (BB_HAS_FALLTHROUGH(b) && b->b_next->b_predecessors == 1) { + assert(b->b_next->b_iused); + if (b->b_next->b_instr[0].i_loc.lineno < 0) { + b->b_next->b_instr[0].i_loc = prev_location; + } + } + if (is_jump(last)) { + basicblock *target = last->i_target; + if (target->b_predecessors == 1) { + if (target->b_instr[0].i_loc.lineno < 0) { + target->b_instr[0].i_loc = prev_location; + } + } + } + } +} + +/* Make sure that all returns have a line number, even if early passes + * have failed to propagate a correct line number. + * The resulting line number may not be correct according to PEP 626, + * but should be "good enough", and no worse than in older versions. */ +static void +guarantee_lineno_for_exits(basicblock *entryblock, int firstlineno) { + int lineno = firstlineno; + assert(lineno > 0); + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + cfg_instr *last = _PyCfg_BasicblockLastInstr(b); + if (last == NULL) { + continue; + } + if (last->i_loc.lineno < 0) { + if (last->i_opcode == RETURN_VALUE) { + for (int i = 0; i < b->b_iused; i++) { + assert(b->b_instr[i].i_loc.lineno < 0); + + b->b_instr[i].i_loc.lineno = lineno; + } + } + } + else { + lineno = last->i_loc.lineno; + } + } +} + +int +_PyCfg_ResolveLineNumbers(cfg_builder *g, int firstlineno) +{ + RETURN_IF_ERROR(duplicate_exits_without_lineno(g)); + propagate_line_numbers(g->g_entryblock); + guarantee_lineno_for_exits(g->g_entryblock, firstlineno); + return SUCCESS; +} + diff --git a/Python/opcode_metadata.h b/Python/opcode_metadata.h index 08032519f383ce..5c984eb4ae12e3 100644 --- a/Python/opcode_metadata.h +++ b/Python/opcode_metadata.h @@ -3,7 +3,7 @@ // Python/bytecodes.c // Do not edit! -#ifndef NEED_OPCODE_TABLES +#ifndef NEED_OPCODE_METADATA extern int _PyOpcode_num_popped(int opcode, int oparg, bool jump); #else int @@ -349,7 +349,7 @@ _PyOpcode_num_popped(int opcode, int oparg, bool jump) { } #endif -#ifndef NEED_OPCODE_TABLES +#ifndef NEED_OPCODE_METADATA extern int _PyOpcode_num_pushed(int opcode, int oparg, bool jump); #else int @@ -701,7 +701,7 @@ struct opcode_metadata { enum InstructionFormat instr_format; }; -#ifndef NEED_OPCODE_TABLES +#ifndef NEED_OPCODE_METADATA extern const struct opcode_metadata _PyOpcode_opcode_metadata[256]; #else const struct opcode_metadata _PyOpcode_opcode_metadata[256] = { diff --git a/Tools/build/generate_opcode_h.py b/Tools/build/generate_opcode_h.py index 9b2112f7f5f31d..614b17df740929 100644 --- a/Tools/build/generate_opcode_h.py +++ b/Tools/build/generate_opcode_h.py @@ -60,7 +60,7 @@ def write_int_array_from_ops(name, ops, out): bits = 0 for op in ops: bits |= 1<>= 32 @@ -130,6 +130,8 @@ def main(opcode_py, outfile='Include/opcode.h', internaloutfile='Include/interna for name, op in specialized_opmap.items(): fobj.write(DEFINE.format(name, op)) + iobj.write("\nextern const uint32_t _PyOpcode_RelativeJump[9];\n") + iobj.write("\nextern const uint32_t _PyOpcode_Jump[9];\n") iobj.write("\nextern const uint8_t _PyOpcode_Caches[256];\n") iobj.write("\nextern const uint8_t _PyOpcode_Deopt[256];\n") iobj.write("\n#ifdef NEED_OPCODE_TABLES\n") diff --git a/Tools/cases_generator/generate_cases.py b/Tools/cases_generator/generate_cases.py index a0bba65545d4f8..62ddeac0265ad8 100644 --- a/Tools/cases_generator/generate_cases.py +++ b/Tools/cases_generator/generate_cases.py @@ -930,7 +930,7 @@ def write_function( direction: str, data: list[tuple[AnyInstruction, str]] ) -> None: self.out.emit("") - self.out.emit("#ifndef NEED_OPCODE_TABLES") + self.out.emit("#ifndef NEED_OPCODE_METADATA") self.out.emit(f"extern int _PyOpcode_num_{direction}(int opcode, int oparg, bool jump);") self.out.emit("#else") self.out.emit("int") @@ -999,7 +999,7 @@ def write_metadata(self) -> None: self.out.emit("") # Write metadata array declaration - self.out.emit("#ifndef NEED_OPCODE_TABLES") + self.out.emit("#ifndef NEED_OPCODE_METADATA") self.out.emit("extern const struct opcode_metadata _PyOpcode_opcode_metadata[256];") self.out.emit("#else") self.out.emit("const struct opcode_metadata _PyOpcode_opcode_metadata[256] = {") From 9048d73f7a5c58be21988250c381f866586687a0 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Fri, 31 Mar 2023 18:37:24 +0100 Subject: [PATCH 030/349] gh-74690: typing: Don't unnecessarily call `_get_protocol_attrs` twice in `_ProtocolMeta.__instancecheck__` (#103141) Speed up `isinstance()` calls against runtime-checkable protocols --- Lib/typing.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/Lib/typing.py b/Lib/typing.py index 157a563bbecea8..3d086dc1cb90bb 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1931,9 +1931,9 @@ def _get_protocol_attrs(cls): return attrs -def _is_callable_members_only(cls): +def _is_callable_members_only(cls, protocol_attrs): # PEP 544 prohibits using issubclass() with protocols that have non-method members. - return all(callable(getattr(cls, attr, None)) for attr in _get_protocol_attrs(cls)) + return all(callable(getattr(cls, attr, None)) for attr in protocol_attrs) def _no_init_or_replace_init(self, *args, **kwargs): @@ -2000,24 +2000,32 @@ class _ProtocolMeta(ABCMeta): def __instancecheck__(cls, instance): # We need this method for situations where attributes are # assigned in __init__. + is_protocol_cls = getattr(cls, "_is_protocol", False) if ( - getattr(cls, '_is_protocol', False) and + is_protocol_cls and not getattr(cls, '_is_runtime_protocol', False) and not _allow_reckless_class_checks(depth=2) ): raise TypeError("Instance and class checks can only be used with" " @runtime_checkable protocols") - if ((not getattr(cls, '_is_protocol', False) or - _is_callable_members_only(cls)) and - issubclass(instance.__class__, cls)): + if not is_protocol_cls and issubclass(instance.__class__, cls): return True - if cls._is_protocol: + + protocol_attrs = _get_protocol_attrs(cls) + + if ( + _is_callable_members_only(cls, protocol_attrs) + and issubclass(instance.__class__, cls) + ): + return True + + if is_protocol_cls: if all(hasattr(instance, attr) and # All *methods* can be blocked by setting them to None. (not callable(getattr(cls, attr, None)) or getattr(instance, attr) is not None) - for attr in _get_protocol_attrs(cls)): + for attr in protocol_attrs): return True return super().__instancecheck__(instance) @@ -2074,7 +2082,10 @@ def _proto_hook(other): return NotImplemented raise TypeError("Instance and class checks can only be used with" " @runtime_checkable protocols") - if not _is_callable_members_only(cls): + + protocol_attrs = _get_protocol_attrs(cls) + + if not _is_callable_members_only(cls, protocol_attrs): if _allow_reckless_class_checks(): return NotImplemented raise TypeError("Protocols with non-method members" @@ -2084,7 +2095,7 @@ def _proto_hook(other): raise TypeError('issubclass() arg 1 must be a class') # Second, perform the actual structural compatibility check. - for attr in _get_protocol_attrs(cls): + for attr in protocol_attrs: for base in other.__mro__: # Check if the members appears in the class dictionary... if attr in base.__dict__: From dde028480e57bffa83fb084b15ec22490c42ef93 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Fri, 31 Mar 2023 12:09:10 -0600 Subject: [PATCH 031/349] gh-100227: Fix Cleanup of the Extensions Cache (gh-103150) Decref the key in the right interpreter in _extensions_cache_set(). This is a follow-up to gh-103084. I found the bug while working on gh-101660. --- Python/import.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/import.c b/Python/import.c index a45b3bfaacb252..24249ae4a6ade1 100644 --- a/Python/import.c +++ b/Python/import.c @@ -983,13 +983,13 @@ _extensions_cache_set(PyObject *filename, PyObject *name, PyModuleDef *def) res = 0; finally: + Py_XDECREF(key); if (oldts != NULL) { _PyThreadState_Swap(interp->runtime, oldts); _PyThreadState_UnbindDetached(main_tstate); Py_DECREF(name); Py_DECREF(filename); } - Py_XDECREF(key); extensions_lock_release(); return res; } From dfc4c95762f417e84dcb21dbbe6399ab7b7cef19 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Fri, 31 Mar 2023 12:18:33 -0600 Subject: [PATCH 032/349] gh-101659: Clean Up the General Import Tests for Subinterpreters (gh-103151) This involves 3 changes: some general cleanup, checks to match the kind of module, and switch from testing against sys to _imp. This is a precursor to gh-103150, though the changes are meant to stand on their own. --- Lib/test/test_import/__init__.py | 150 ++++++++++++++++++++++--------- 1 file changed, 106 insertions(+), 44 deletions(-) diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 96815b3f758a5b..3ef07203c46c7e 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -4,6 +4,9 @@ import glob import importlib.util from importlib._bootstrap_external import _get_sourcefile +from importlib.machinery import ( + BuiltinImporter, ExtensionFileLoader, FrozenImporter, SourceFileLoader, +) import marshal import os import py_compile @@ -44,6 +47,49 @@ sys.dont_write_bytecode, "test meaningful only when writing bytecode") + +def _require_loader(module, loader, skip): + if isinstance(module, str): + module = __import__(module) + + MODULE_KINDS = { + BuiltinImporter: 'built-in', + ExtensionFileLoader: 'extension', + FrozenImporter: 'frozen', + SourceFileLoader: 'pure Python', + } + + expected = loader + assert isinstance(expected, type), expected + expected = MODULE_KINDS[expected] + + actual = module.__spec__.loader + if not isinstance(actual, type): + actual = type(actual) + actual = MODULE_KINDS[actual] + + if actual != expected: + err = f'expected module to be {expected}, got {module.__spec__}' + if skip: + raise unittest.SkipTest(err) + raise Exception(err) + return module + +def require_builtin(module, *, skip=False): + module = _require_loader(module, BuiltinImporter, skip) + assert module.__spec__.origin == 'built-in', module.__spec__ + +def require_extension(module, *, skip=False): + _require_loader(module, ExtensionFileLoader, skip) + +def require_frozen(module, *, skip=True): + module = _require_loader(module, FrozenImporter, skip) + assert module.__spec__.origin == 'frozen', module.__spec__ + +def require_pure_python(module, *, skip=False): + _require_loader(module, SourceFileLoader, skip) + + def remove_files(name): for f in (name + ".py", name + ".pyc", @@ -1437,10 +1483,10 @@ def import_script(self, name, fd, check_override=None): os.write({fd}, text.encode('utf-8')) ''') - def run_shared(self, name, *, - check_singlephase_setting=False, - check_singlephase_override=None, - ): + def run_here(self, name, *, + check_singlephase_setting=False, + check_singlephase_override=None, + ): """ Try importing the named module in a subinterpreter. @@ -1470,27 +1516,35 @@ def run_shared(self, name, *, self.assertEqual(ret, 0) return os.read(r, 100) - def check_compatible_shared(self, name, *, strict=False): + def check_compatible_here(self, name, *, strict=False): # Verify that the named module may be imported in a subinterpreter. - # (See run_shared() for more info.) - out = self.run_shared(name, check_singlephase_setting=strict) + # (See run_here() for more info.) + out = self.run_here(name, + check_singlephase_setting=strict, + ) self.assertEqual(out, b'okay') - def check_incompatible_shared(self, name): - # Differences from check_compatible_shared(): + def check_incompatible_here(self, name): + # Differences from check_compatible_here(): # * verify that import fails # * "strict" is always True - out = self.run_shared(name, check_singlephase_setting=True) + out = self.run_here(name, + check_singlephase_setting=True, + ) self.assertEqual( out.decode('utf-8'), f'ImportError: module {name} does not support loading in subinterpreters', ) - def check_compatible_isolated(self, name, *, strict=False): - # Differences from check_compatible_shared(): + def check_compatible_fresh(self, name, *, strict=False): + # Differences from check_compatible_here(): # * subinterpreter in a new process # * module has never been imported before in that process # * this tests importing the module for the first time + kwargs = dict( + **self.RUN_KWARGS, + check_multi_interp_extensions=strict, + ) _, out, err = script_helper.assert_python_ok('-c', textwrap.dedent(f''' import _testcapi, sys assert ( @@ -1499,25 +1553,27 @@ def check_compatible_isolated(self, name, *, strict=False): ), repr({name!r}) ret = _testcapi.run_in_subinterp_with_config( {self.import_script(name, "sys.stdout.fileno()")!r}, - **{self.RUN_KWARGS}, - check_multi_interp_extensions={strict}, + **{kwargs}, ) assert ret == 0, ret ''')) self.assertEqual(err, b'') self.assertEqual(out, b'okay') - def check_incompatible_isolated(self, name): - # Differences from check_compatible_isolated(): + def check_incompatible_fresh(self, name): + # Differences from check_compatible_fresh(): # * verify that import fails # * "strict" is always True + kwargs = dict( + **self.RUN_KWARGS, + check_multi_interp_extensions=True, + ) _, out, err = script_helper.assert_python_ok('-c', textwrap.dedent(f''' import _testcapi, sys assert {name!r} not in sys.modules, {name!r} ret = _testcapi.run_in_subinterp_with_config( {self.import_script(name, "sys.stdout.fileno()")!r}, - **{self.RUN_KWARGS}, - check_multi_interp_extensions=True, + **{kwargs}, ) assert ret == 0, ret ''')) @@ -1528,59 +1584,65 @@ def check_incompatible_isolated(self, name): ) def test_builtin_compat(self): - module = 'sys' + # For now we avoid using sys or builtins + # since they still don't implement multi-phase init. + module = '_imp' + require_builtin(module) with self.subTest(f'{module}: not strict'): - self.check_compatible_shared(module, strict=False) - with self.subTest(f'{module}: strict, shared'): - self.check_compatible_shared(module, strict=True) + self.check_compatible_here(module, strict=False) + with self.subTest(f'{module}: strict, not fresh'): + self.check_compatible_here(module, strict=True) @cpython_only def test_frozen_compat(self): module = '_frozen_importlib' + require_frozen(module, skip=True) if __import__(module).__spec__.origin != 'frozen': raise unittest.SkipTest(f'{module} is unexpectedly not frozen') with self.subTest(f'{module}: not strict'): - self.check_compatible_shared(module, strict=False) - with self.subTest(f'{module}: strict, shared'): - self.check_compatible_shared(module, strict=True) + self.check_compatible_here(module, strict=False) + with self.subTest(f'{module}: strict, not fresh'): + self.check_compatible_here(module, strict=True) @unittest.skipIf(_testsinglephase is None, "test requires _testsinglephase module") def test_single_init_extension_compat(self): module = '_testsinglephase' + require_extension(module) with self.subTest(f'{module}: not strict'): - self.check_compatible_shared(module, strict=False) - with self.subTest(f'{module}: strict, shared'): - self.check_incompatible_shared(module) - with self.subTest(f'{module}: strict, isolated'): - self.check_incompatible_isolated(module) + self.check_compatible_here(module, strict=False) + with self.subTest(f'{module}: strict, not fresh'): + self.check_incompatible_here(module) + with self.subTest(f'{module}: strict, fresh'): + self.check_incompatible_fresh(module) @unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module") def test_multi_init_extension_compat(self): module = '_testmultiphase' + require_extension(module) with self.subTest(f'{module}: not strict'): - self.check_compatible_shared(module, strict=False) - with self.subTest(f'{module}: strict, shared'): - self.check_compatible_shared(module, strict=True) - with self.subTest(f'{module}: strict, isolated'): - self.check_compatible_isolated(module, strict=True) + self.check_compatible_here(module, strict=False) + with self.subTest(f'{module}: strict, not fresh'): + self.check_compatible_here(module, strict=True) + with self.subTest(f'{module}: strict, fresh'): + self.check_compatible_fresh(module, strict=True) def test_python_compat(self): module = 'threading' - if __import__(module).__spec__.origin == 'frozen': - raise unittest.SkipTest(f'{module} is unexpectedly frozen') + require_pure_python(module) with self.subTest(f'{module}: not strict'): - self.check_compatible_shared(module, strict=False) - with self.subTest(f'{module}: strict, shared'): - self.check_compatible_shared(module, strict=True) - with self.subTest(f'{module}: strict, isolated'): - self.check_compatible_isolated(module, strict=True) + self.check_compatible_here(module, strict=False) + with self.subTest(f'{module}: strict, not fresh'): + self.check_compatible_here(module, strict=True) + with self.subTest(f'{module}: strict, fresh'): + self.check_compatible_fresh(module, strict=True) @unittest.skipIf(_testsinglephase is None, "test requires _testsinglephase module") def test_singlephase_check_with_setting_and_override(self): module = '_testsinglephase' + require_extension(module) def check_compatible(setting, override): - out = self.run_shared( + out = self.run_here( module, check_singlephase_setting=setting, check_singlephase_override=override, @@ -1588,7 +1650,7 @@ def check_compatible(setting, override): self.assertEqual(out, b'okay') def check_incompatible(setting, override): - out = self.run_shared( + out = self.run_here( module, check_singlephase_setting=setting, check_singlephase_override=override, From 2a4d8c0a9e88f45047da640ce5a92b304d2d39b1 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Fri, 31 Mar 2023 13:52:31 -0700 Subject: [PATCH 033/349] gh-102549: [Enum] fail enum creation when data type raises in __init__ (GH-103149) --- Lib/enum.py | 25 ++++++++----------- Lib/test/test_enum.py | 20 +++++++++++++++ ...-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst | 1 + 3 files changed, 32 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst diff --git a/Lib/enum.py b/Lib/enum.py index 8c77117ce6acb4..4e231e7e8ea779 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -266,23 +266,20 @@ def __set_name__(self, enum_class, member_name): args = (args, ) # wrap it one more time if not enum_class._use_args_: enum_member = enum_class._new_member_(enum_class) - if not hasattr(enum_member, '_value_'): + else: + enum_member = enum_class._new_member_(enum_class, *args) + if not hasattr(enum_member, '_value_'): + if enum_class._member_type_ is object: + enum_member._value_ = value + else: try: enum_member._value_ = enum_class._member_type_(*args) except Exception as exc: - enum_member._value_ = value - else: - enum_member = enum_class._new_member_(enum_class, *args) - if not hasattr(enum_member, '_value_'): - if enum_class._member_type_ is object: - enum_member._value_ = value - else: - try: - enum_member._value_ = enum_class._member_type_(*args) - except Exception as exc: - raise TypeError( - '_value_ not set in __new__, unable to create it' - ) from None + new_exc = TypeError( + '_value_ not set in __new__, unable to create it' + ) + new_exc.__cause__ = exc + raise new_exc value = enum_member._value_ enum_member._name_ = member_name enum_member.__objclass__ = enum_class diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index bea19542705dc4..ee5280601be184 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2916,6 +2916,26 @@ def __new__(cls, c): self.assertEqual(FlagFromChar.a, 158456325028528675187087900672) self.assertEqual(FlagFromChar.a|1, 158456325028528675187087900673) + def test_init_exception(self): + class Base: + def __init__(self, x): + raise ValueError("I don't like", x) + with self.assertRaises(TypeError): + class MyEnum(Base, enum.Enum): + A = 'a' + def __init__(self, y): + self.y = y + with self.assertRaises(ValueError): + class MyEnum(Base, enum.Enum): + A = 'a' + def __init__(self, y): + self.y = y + def __new__(cls, value): + member = Base.__new__(cls) + member._value_ = Base(value) + return member + + class TestOrder(unittest.TestCase): "test usage of the `_order_` attribute" diff --git a/Misc/NEWS.d/next/Library/2023-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst b/Misc/NEWS.d/next/Library/2023-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst new file mode 100644 index 00000000000000..e4def038175b87 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst @@ -0,0 +1 @@ +Don't ignore exceptions in member type creation. From 361a3eaf1b6bf3360e34388cc909307ddd20737b Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Fri, 31 Mar 2023 21:54:50 +0100 Subject: [PATCH 034/349] gh-74690: Micro-optimise `typing._get_protocol_attrs` (#103152) Improve performance of `isinstance()` checks against runtime-checkable protocols --- Lib/typing.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Lib/typing.py b/Lib/typing.py index 3d086dc1cb90bb..a88542cfbaecd5 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1903,15 +1903,19 @@ class _TypingEllipsis: """Internal placeholder for ... (ellipsis).""" -_TYPING_INTERNALS = ['__parameters__', '__orig_bases__', '__orig_class__', - '_is_protocol', '_is_runtime_protocol'] +_TYPING_INTERNALS = frozenset({ + '__parameters__', '__orig_bases__', '__orig_class__', + '_is_protocol', '_is_runtime_protocol' +}) -_SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__', - '__init__', '__module__', '__new__', '__slots__', - '__subclasshook__', '__weakref__', '__class_getitem__'] +_SPECIAL_NAMES = frozenset({ + '__abstractmethods__', '__annotations__', '__dict__', '__doc__', + '__init__', '__module__', '__new__', '__slots__', + '__subclasshook__', '__weakref__', '__class_getitem__' +}) # These special attributes will be not collected as protocol members. -EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker'] +EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS | _SPECIAL_NAMES | {'_MutableMapping__marker'} def _get_protocol_attrs(cls): @@ -1922,10 +1926,10 @@ def _get_protocol_attrs(cls): """ attrs = set() for base in cls.__mro__[:-1]: # without object - if base.__name__ in ('Protocol', 'Generic'): + if base.__name__ in {'Protocol', 'Generic'}: continue annotations = getattr(base, '__annotations__', {}) - for attr in list(base.__dict__.keys()) + list(annotations.keys()): + for attr in (*base.__dict__, *annotations): if not attr.startswith('_abc_') and attr not in EXCLUDED_ATTRIBUTES: attrs.add(attr) return attrs From d97aef8ebfbbb275384b17f06945e583fb3189ea Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 31 Mar 2023 14:23:55 -0700 Subject: [PATCH 035/349] Add missing variables to `bytecodes.c` (GH-103153) The code works without this change, but it does cause C tooling to complain less about undeclared variables. --- Python/bytecodes.c | 48 +++- Python/generated_cases.c.h | 446 ++++++++++++++++++------------------- 2 files changed, 270 insertions(+), 224 deletions(-) diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 484f6e6b1a1c9b..825fa705a4cd38 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -74,10 +74,56 @@ dummy_func( PyObject **stack_pointer, PyObject *kwnames, int throwflag, - binaryfunc binary_ops[] + binaryfunc binary_ops[], + PyObject *args[] ) { + // Dummy labels. + pop_1_error: + // Dummy locals. + PyObject *annotations; + PyObject *attrs; + PyObject *bottom; + PyObject *callable; + PyObject *callargs; + PyObject *closure; + PyObject *codeobj; + PyObject *cond; + PyObject *defaults; + PyObject *descr; _PyInterpreterFrame entry_frame; + PyObject *exc; + PyObject *exit; + PyObject *fget; + PyObject *fmt_spec; + PyObject *func; + uint32_t func_version; + PyObject *getattribute; + PyObject *kwargs; + PyObject *kwdefaults; + PyObject *len_o; + PyObject *match; + PyObject *match_type; + PyObject *method; + PyObject *mgr; + Py_ssize_t min_args; + PyObject *names; + PyObject *new_exc; + PyObject *next; + PyObject *none; + PyObject *null; + PyObject *prev_exc; + PyObject *receiver; + PyObject *rest; + int result; + PyObject *self; + PyObject *seq; + PyObject *slice; + PyObject *step; + PyObject *subject; + PyObject *top; + PyObject *type; + int values_or_none; switch (opcode) { diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index d9c66343430fad..6bb37d69cc0740 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -8,7 +8,7 @@ } TARGET(RESUME) { - #line 89 "Python/bytecodes.c" + #line 135 "Python/bytecodes.c" assert(tstate->cframe == &cframe); assert(frame == cframe.current_frame); if (_Py_atomic_load_relaxed_int32(eval_breaker) && oparg < 2) { @@ -20,7 +20,7 @@ TARGET(LOAD_CLOSURE) { PyObject *value; - #line 97 "Python/bytecodes.c" + #line 143 "Python/bytecodes.c" /* We keep LOAD_CLOSURE so that the bytecode stays more readable. */ value = GETLOCAL(oparg); if (value == NULL) goto unbound_local_error; @@ -33,7 +33,7 @@ TARGET(LOAD_FAST_CHECK) { PyObject *value; - #line 104 "Python/bytecodes.c" + #line 150 "Python/bytecodes.c" value = GETLOCAL(oparg); if (value == NULL) goto unbound_local_error; Py_INCREF(value); @@ -45,7 +45,7 @@ TARGET(LOAD_FAST) { PyObject *value; - #line 110 "Python/bytecodes.c" + #line 156 "Python/bytecodes.c" value = GETLOCAL(oparg); assert(value != NULL); Py_INCREF(value); @@ -58,7 +58,7 @@ TARGET(LOAD_CONST) { PREDICTED(LOAD_CONST); PyObject *value; - #line 116 "Python/bytecodes.c" + #line 162 "Python/bytecodes.c" value = GETITEM(frame->f_code->co_consts, oparg); Py_INCREF(value); #line 65 "Python/generated_cases.c.h" @@ -69,7 +69,7 @@ TARGET(STORE_FAST) { PyObject *value = stack_pointer[-1]; - #line 121 "Python/bytecodes.c" + #line 167 "Python/bytecodes.c" SETLOCAL(oparg, value); #line 75 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -81,7 +81,7 @@ PyObject *_tmp_2; { PyObject *value; - #line 110 "Python/bytecodes.c" + #line 156 "Python/bytecodes.c" value = GETLOCAL(oparg); assert(value != NULL); Py_INCREF(value); @@ -91,7 +91,7 @@ oparg = (next_instr++)->op.arg; { PyObject *value; - #line 110 "Python/bytecodes.c" + #line 156 "Python/bytecodes.c" value = GETLOCAL(oparg); assert(value != NULL); Py_INCREF(value); @@ -109,7 +109,7 @@ PyObject *_tmp_2; { PyObject *value; - #line 110 "Python/bytecodes.c" + #line 156 "Python/bytecodes.c" value = GETLOCAL(oparg); assert(value != NULL); Py_INCREF(value); @@ -119,7 +119,7 @@ oparg = (next_instr++)->op.arg; { PyObject *value; - #line 116 "Python/bytecodes.c" + #line 162 "Python/bytecodes.c" value = GETITEM(frame->f_code->co_consts, oparg); Py_INCREF(value); #line 126 "Python/generated_cases.c.h" @@ -135,14 +135,14 @@ PyObject *_tmp_1 = stack_pointer[-1]; { PyObject *value = _tmp_1; - #line 121 "Python/bytecodes.c" + #line 167 "Python/bytecodes.c" SETLOCAL(oparg, value); #line 141 "Python/generated_cases.c.h" } oparg = (next_instr++)->op.arg; { PyObject *value; - #line 110 "Python/bytecodes.c" + #line 156 "Python/bytecodes.c" value = GETLOCAL(oparg); assert(value != NULL); Py_INCREF(value); @@ -158,14 +158,14 @@ PyObject *_tmp_2 = stack_pointer[-2]; { PyObject *value = _tmp_1; - #line 121 "Python/bytecodes.c" + #line 167 "Python/bytecodes.c" SETLOCAL(oparg, value); #line 164 "Python/generated_cases.c.h" } oparg = (next_instr++)->op.arg; { PyObject *value = _tmp_2; - #line 121 "Python/bytecodes.c" + #line 167 "Python/bytecodes.c" SETLOCAL(oparg, value); #line 171 "Python/generated_cases.c.h" } @@ -178,7 +178,7 @@ PyObject *_tmp_2; { PyObject *value; - #line 116 "Python/bytecodes.c" + #line 162 "Python/bytecodes.c" value = GETITEM(frame->f_code->co_consts, oparg); Py_INCREF(value); #line 185 "Python/generated_cases.c.h" @@ -187,7 +187,7 @@ oparg = (next_instr++)->op.arg; { PyObject *value; - #line 110 "Python/bytecodes.c" + #line 156 "Python/bytecodes.c" value = GETLOCAL(oparg); assert(value != NULL); Py_INCREF(value); @@ -202,7 +202,7 @@ TARGET(POP_TOP) { PyObject *value = stack_pointer[-1]; - #line 131 "Python/bytecodes.c" + #line 177 "Python/bytecodes.c" #line 207 "Python/generated_cases.c.h" Py_DECREF(value); STACK_SHRINK(1); @@ -211,7 +211,7 @@ TARGET(PUSH_NULL) { PyObject *res; - #line 135 "Python/bytecodes.c" + #line 181 "Python/bytecodes.c" res = NULL; #line 217 "Python/generated_cases.c.h" STACK_GROW(1); @@ -224,13 +224,13 @@ PyObject *_tmp_2 = stack_pointer[-2]; { PyObject *value = _tmp_1; - #line 131 "Python/bytecodes.c" + #line 177 "Python/bytecodes.c" #line 229 "Python/generated_cases.c.h" Py_DECREF(value); } { PyObject *value = _tmp_2; - #line 131 "Python/bytecodes.c" + #line 177 "Python/bytecodes.c" #line 235 "Python/generated_cases.c.h" Py_DECREF(value); } @@ -241,11 +241,11 @@ TARGET(UNARY_NEGATIVE) { PyObject *value = stack_pointer[-1]; PyObject *res; - #line 141 "Python/bytecodes.c" + #line 187 "Python/bytecodes.c" res = PyNumber_Negative(value); #line 247 "Python/generated_cases.c.h" Py_DECREF(value); - #line 143 "Python/bytecodes.c" + #line 189 "Python/bytecodes.c" if (res == NULL) goto pop_1_error; #line 251 "Python/generated_cases.c.h" stack_pointer[-1] = res; @@ -255,11 +255,11 @@ TARGET(UNARY_NOT) { PyObject *value = stack_pointer[-1]; PyObject *res; - #line 147 "Python/bytecodes.c" + #line 193 "Python/bytecodes.c" int err = PyObject_IsTrue(value); #line 261 "Python/generated_cases.c.h" Py_DECREF(value); - #line 149 "Python/bytecodes.c" + #line 195 "Python/bytecodes.c" if (err < 0) goto pop_1_error; if (err == 0) { res = Py_True; @@ -276,11 +276,11 @@ TARGET(UNARY_INVERT) { PyObject *value = stack_pointer[-1]; PyObject *res; - #line 160 "Python/bytecodes.c" + #line 206 "Python/bytecodes.c" res = PyNumber_Invert(value); #line 282 "Python/generated_cases.c.h" Py_DECREF(value); - #line 162 "Python/bytecodes.c" + #line 208 "Python/bytecodes.c" if (res == NULL) goto pop_1_error; #line 286 "Python/generated_cases.c.h" stack_pointer[-1] = res; @@ -291,7 +291,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *prod; - #line 179 "Python/bytecodes.c" + #line 225 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(left), BINARY_OP); DEOPT_IF(!PyLong_CheckExact(right), BINARY_OP); @@ -311,7 +311,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *prod; - #line 190 "Python/bytecodes.c" + #line 236 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyFloat_CheckExact(left), BINARY_OP); DEOPT_IF(!PyFloat_CheckExact(right), BINARY_OP); @@ -330,7 +330,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *sub; - #line 200 "Python/bytecodes.c" + #line 246 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(left), BINARY_OP); DEOPT_IF(!PyLong_CheckExact(right), BINARY_OP); @@ -350,7 +350,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *sub; - #line 211 "Python/bytecodes.c" + #line 257 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyFloat_CheckExact(left), BINARY_OP); DEOPT_IF(!PyFloat_CheckExact(right), BINARY_OP); @@ -368,7 +368,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 220 "Python/bytecodes.c" + #line 266 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyUnicode_CheckExact(left), BINARY_OP); DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP); @@ -387,7 +387,7 @@ TARGET(BINARY_OP_INPLACE_ADD_UNICODE) { PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; - #line 237 "Python/bytecodes.c" + #line 283 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyUnicode_CheckExact(left), BINARY_OP); DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP); @@ -424,7 +424,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *sum; - #line 267 "Python/bytecodes.c" + #line 313 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyFloat_CheckExact(left), BINARY_OP); DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP); @@ -443,7 +443,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *sum; - #line 277 "Python/bytecodes.c" + #line 323 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(left), BINARY_OP); DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP); @@ -465,7 +465,7 @@ PyObject *sub = stack_pointer[-1]; PyObject *container = stack_pointer[-2]; PyObject *res; - #line 296 "Python/bytecodes.c" + #line 342 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyBinarySubscrCache *cache = (_PyBinarySubscrCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -481,7 +481,7 @@ #line 482 "Python/generated_cases.c.h" Py_DECREF(container); Py_DECREF(sub); - #line 309 "Python/bytecodes.c" + #line 355 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; #line 487 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -495,7 +495,7 @@ PyObject *start = stack_pointer[-2]; PyObject *container = stack_pointer[-3]; PyObject *res; - #line 313 "Python/bytecodes.c" + #line 359 "Python/bytecodes.c" PyObject *slice = _PyBuildSlice_ConsumeRefs(start, stop); // Can't use ERROR_IF() here, because we haven't // DECREF'ed container yet, and we still own slice. @@ -519,7 +519,7 @@ PyObject *start = stack_pointer[-2]; PyObject *container = stack_pointer[-3]; PyObject *v = stack_pointer[-4]; - #line 328 "Python/bytecodes.c" + #line 374 "Python/bytecodes.c" PyObject *slice = _PyBuildSlice_ConsumeRefs(start, stop); int err; if (slice == NULL) { @@ -541,7 +541,7 @@ PyObject *sub = stack_pointer[-1]; PyObject *list = stack_pointer[-2]; PyObject *res; - #line 343 "Python/bytecodes.c" + #line 389 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR); DEOPT_IF(!PyList_CheckExact(list), BINARY_SUBSCR); @@ -567,7 +567,7 @@ PyObject *sub = stack_pointer[-1]; PyObject *tuple = stack_pointer[-2]; PyObject *res; - #line 360 "Python/bytecodes.c" + #line 406 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR); DEOPT_IF(!PyTuple_CheckExact(tuple), BINARY_SUBSCR); @@ -593,7 +593,7 @@ PyObject *sub = stack_pointer[-1]; PyObject *dict = stack_pointer[-2]; PyObject *res; - #line 377 "Python/bytecodes.c" + #line 423 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyDict_CheckExact(dict), BINARY_SUBSCR); STAT_INC(BINARY_SUBSCR, hit); @@ -605,7 +605,7 @@ #line 606 "Python/generated_cases.c.h" Py_DECREF(dict); Py_DECREF(sub); - #line 386 "Python/bytecodes.c" + #line 432 "Python/bytecodes.c" if (true) goto pop_2_error; } Py_INCREF(res); // Do this before DECREF'ing dict, sub @@ -621,7 +621,7 @@ TARGET(BINARY_SUBSCR_GETITEM) { PyObject *sub = stack_pointer[-1]; PyObject *container = stack_pointer[-2]; - #line 393 "Python/bytecodes.c" + #line 439 "Python/bytecodes.c" PyTypeObject *tp = Py_TYPE(container); DEOPT_IF(!PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE), BINARY_SUBSCR); PyHeapTypeObject *ht = (PyHeapTypeObject *)tp; @@ -648,7 +648,7 @@ TARGET(LIST_APPEND) { PyObject *v = stack_pointer[-1]; PyObject *list = stack_pointer[-(2 + (oparg-1))]; - #line 416 "Python/bytecodes.c" + #line 462 "Python/bytecodes.c" if (_PyList_AppendTakeRef((PyListObject *)list, v) < 0) goto pop_1_error; #line 654 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -659,11 +659,11 @@ TARGET(SET_ADD) { PyObject *v = stack_pointer[-1]; PyObject *set = stack_pointer[-(2 + (oparg-1))]; - #line 421 "Python/bytecodes.c" + #line 467 "Python/bytecodes.c" int err = PySet_Add(set, v); #line 665 "Python/generated_cases.c.h" Py_DECREF(v); - #line 423 "Python/bytecodes.c" + #line 469 "Python/bytecodes.c" if (err) goto pop_1_error; #line 669 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -678,7 +678,7 @@ PyObject *container = stack_pointer[-2]; PyObject *v = stack_pointer[-3]; uint16_t counter = read_u16(&next_instr[0].cache); - #line 434 "Python/bytecodes.c" + #line 480 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION if (ADAPTIVE_COUNTER_IS_ZERO(counter)) { assert(cframe.use_tracing == 0); @@ -698,7 +698,7 @@ Py_DECREF(v); Py_DECREF(container); Py_DECREF(sub); - #line 450 "Python/bytecodes.c" + #line 496 "Python/bytecodes.c" if (err) goto pop_3_error; #line 704 "Python/generated_cases.c.h" STACK_SHRINK(3); @@ -710,7 +710,7 @@ PyObject *sub = stack_pointer[-1]; PyObject *list = stack_pointer[-2]; PyObject *value = stack_pointer[-3]; - #line 454 "Python/bytecodes.c" + #line 500 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(sub), STORE_SUBSCR); DEOPT_IF(!PyList_CheckExact(list), STORE_SUBSCR); @@ -738,7 +738,7 @@ PyObject *sub = stack_pointer[-1]; PyObject *dict = stack_pointer[-2]; PyObject *value = stack_pointer[-3]; - #line 474 "Python/bytecodes.c" + #line 520 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyDict_CheckExact(dict), STORE_SUBSCR); STAT_INC(STORE_SUBSCR, hit); @@ -754,13 +754,13 @@ TARGET(DELETE_SUBSCR) { PyObject *sub = stack_pointer[-1]; PyObject *container = stack_pointer[-2]; - #line 483 "Python/bytecodes.c" + #line 529 "Python/bytecodes.c" /* del container[sub] */ int err = PyObject_DelItem(container, sub); #line 761 "Python/generated_cases.c.h" Py_DECREF(container); Py_DECREF(sub); - #line 486 "Python/bytecodes.c" + #line 532 "Python/bytecodes.c" if (err) goto pop_2_error; #line 766 "Python/generated_cases.c.h" STACK_SHRINK(2); @@ -770,12 +770,12 @@ TARGET(CALL_INTRINSIC_1) { PyObject *value = stack_pointer[-1]; PyObject *res; - #line 490 "Python/bytecodes.c" + #line 536 "Python/bytecodes.c" assert(oparg <= MAX_INTRINSIC_1); res = _PyIntrinsics_UnaryFunctions[oparg](tstate, value); #line 777 "Python/generated_cases.c.h" Py_DECREF(value); - #line 493 "Python/bytecodes.c" + #line 539 "Python/bytecodes.c" if (res == NULL) goto pop_1_error; #line 781 "Python/generated_cases.c.h" stack_pointer[-1] = res; @@ -786,13 +786,13 @@ PyObject *value1 = stack_pointer[-1]; PyObject *value2 = stack_pointer[-2]; PyObject *res; - #line 497 "Python/bytecodes.c" + #line 543 "Python/bytecodes.c" assert(oparg <= MAX_INTRINSIC_2); res = _PyIntrinsics_BinaryFunctions[oparg](tstate, value2, value1); #line 793 "Python/generated_cases.c.h" Py_DECREF(value2); Py_DECREF(value1); - #line 500 "Python/bytecodes.c" + #line 546 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; #line 798 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -802,7 +802,7 @@ TARGET(RAISE_VARARGS) { PyObject **args = (stack_pointer - oparg); - #line 504 "Python/bytecodes.c" + #line 550 "Python/bytecodes.c" PyObject *cause = NULL, *exc = NULL; switch (oparg) { case 2: @@ -825,7 +825,7 @@ TARGET(INTERPRETER_EXIT) { PyObject *retval = stack_pointer[-1]; - #line 524 "Python/bytecodes.c" + #line 570 "Python/bytecodes.c" assert(frame == &entry_frame); assert(_PyFrame_IsIncomplete(frame)); STACK_SHRINK(1); // Since we're not going to DISPATCH() @@ -842,7 +842,7 @@ TARGET(RETURN_VALUE) { PyObject *retval = stack_pointer[-1]; - #line 538 "Python/bytecodes.c" + #line 584 "Python/bytecodes.c" STACK_SHRINK(1); assert(EMPTY()); _PyFrame_SetStackPointer(frame, stack_pointer); @@ -860,7 +860,7 @@ } TARGET(RETURN_CONST) { - #line 554 "Python/bytecodes.c" + #line 600 "Python/bytecodes.c" PyObject *retval = GETITEM(frame->f_code->co_consts, oparg); Py_INCREF(retval); assert(EMPTY()); @@ -881,7 +881,7 @@ TARGET(GET_AITER) { PyObject *obj = stack_pointer[-1]; PyObject *iter; - #line 571 "Python/bytecodes.c" + #line 617 "Python/bytecodes.c" unaryfunc getter = NULL; PyTypeObject *type = Py_TYPE(obj); @@ -896,14 +896,14 @@ type->tp_name); #line 898 "Python/generated_cases.c.h" Py_DECREF(obj); - #line 584 "Python/bytecodes.c" + #line 630 "Python/bytecodes.c" if (true) goto pop_1_error; } iter = (*getter)(obj); #line 905 "Python/generated_cases.c.h" Py_DECREF(obj); - #line 589 "Python/bytecodes.c" + #line 635 "Python/bytecodes.c" if (iter == NULL) goto pop_1_error; if (Py_TYPE(iter)->tp_as_async == NULL || @@ -924,7 +924,7 @@ TARGET(GET_ANEXT) { PyObject *aiter = stack_pointer[-1]; PyObject *awaitable; - #line 604 "Python/bytecodes.c" + #line 650 "Python/bytecodes.c" unaryfunc getter = NULL; PyObject *next_iter = NULL; PyTypeObject *type = Py_TYPE(aiter); @@ -979,7 +979,7 @@ PREDICTED(GET_AWAITABLE); PyObject *iterable = stack_pointer[-1]; PyObject *iter; - #line 651 "Python/bytecodes.c" + #line 697 "Python/bytecodes.c" iter = _PyCoro_GetAwaitableIter(iterable); if (iter == NULL) { @@ -988,7 +988,7 @@ #line 990 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 658 "Python/bytecodes.c" + #line 704 "Python/bytecodes.c" if (iter != NULL && PyCoro_CheckExact(iter)) { PyObject *yf = _PyGen_yf((PyGenObject*)iter); @@ -1017,7 +1017,7 @@ PyObject *v = stack_pointer[-1]; PyObject *receiver = stack_pointer[-2]; PyObject *retval; - #line 684 "Python/bytecodes.c" + #line 730 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PySendCache *cache = (_PySendCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -1062,7 +1062,7 @@ TARGET(SEND_GEN) { PyObject *v = stack_pointer[-1]; PyObject *receiver = stack_pointer[-2]; - #line 722 "Python/bytecodes.c" + #line 768 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyGenObject *gen = (PyGenObject *)receiver; DEOPT_IF(Py_TYPE(gen) != &PyGen_Type && @@ -1083,7 +1083,7 @@ TARGET(YIELD_VALUE) { PyObject *retval = stack_pointer[-1]; - #line 740 "Python/bytecodes.c" + #line 786 "Python/bytecodes.c" // NOTE: It's important that YIELD_VALUE never raises an exception! // The compiler treats any exception raised here as a failed close() // or throw() call. @@ -1107,7 +1107,7 @@ TARGET(POP_EXCEPT) { PyObject *exc_value = stack_pointer[-1]; - #line 761 "Python/bytecodes.c" + #line 807 "Python/bytecodes.c" _PyErr_StackItem *exc_info = tstate->exc_info; Py_XSETREF(exc_info->exc_value, exc_value); #line 1114 "Python/generated_cases.c.h" @@ -1118,7 +1118,7 @@ TARGET(RERAISE) { PyObject *exc = stack_pointer[-1]; PyObject **values = (stack_pointer - (1 + oparg)); - #line 766 "Python/bytecodes.c" + #line 812 "Python/bytecodes.c" assert(oparg >= 0 && oparg <= 2); if (oparg) { PyObject *lasti = values[0]; @@ -1142,13 +1142,13 @@ TARGET(END_ASYNC_FOR) { PyObject *exc = stack_pointer[-1]; PyObject *awaitable = stack_pointer[-2]; - #line 786 "Python/bytecodes.c" + #line 832 "Python/bytecodes.c" assert(exc && PyExceptionInstance_Check(exc)); if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) { #line 1149 "Python/generated_cases.c.h" Py_DECREF(awaitable); Py_DECREF(exc); - #line 789 "Python/bytecodes.c" + #line 835 "Python/bytecodes.c" } else { Py_INCREF(exc); @@ -1166,7 +1166,7 @@ PyObject *sub_iter = stack_pointer[-3]; PyObject *none; PyObject *value; - #line 798 "Python/bytecodes.c" + #line 844 "Python/bytecodes.c" assert(throwflag); assert(exc_value && PyExceptionInstance_Check(exc_value)); if (PyErr_GivenExceptionMatches(exc_value, PyExc_StopIteration)) { @@ -1175,7 +1175,7 @@ Py_DECREF(sub_iter); Py_DECREF(last_sent_val); Py_DECREF(exc_value); - #line 803 "Python/bytecodes.c" + #line 849 "Python/bytecodes.c" none = Py_NewRef(Py_None); } else { @@ -1191,7 +1191,7 @@ TARGET(LOAD_ASSERTION_ERROR) { PyObject *value; - #line 812 "Python/bytecodes.c" + #line 858 "Python/bytecodes.c" value = Py_NewRef(PyExc_AssertionError); #line 1197 "Python/generated_cases.c.h" STACK_GROW(1); @@ -1201,7 +1201,7 @@ TARGET(LOAD_BUILD_CLASS) { PyObject *bc; - #line 816 "Python/bytecodes.c" + #line 862 "Python/bytecodes.c" if (PyDict_CheckExact(BUILTINS())) { bc = _PyDict_GetItemWithError(BUILTINS(), &_Py_ID(__build_class__)); @@ -1231,7 +1231,7 @@ TARGET(STORE_NAME) { PyObject *v = stack_pointer[-1]; - #line 840 "Python/bytecodes.c" + #line 886 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); PyObject *ns = LOCALS(); int err; @@ -1240,7 +1240,7 @@ "no locals found when storing %R", name); #line 1242 "Python/generated_cases.c.h" Py_DECREF(v); - #line 847 "Python/bytecodes.c" + #line 893 "Python/bytecodes.c" if (true) goto pop_1_error; } if (PyDict_CheckExact(ns)) @@ -1249,7 +1249,7 @@ err = PyObject_SetItem(ns, name, v); #line 1251 "Python/generated_cases.c.h" Py_DECREF(v); - #line 854 "Python/bytecodes.c" + #line 900 "Python/bytecodes.c" if (err) goto pop_1_error; #line 1255 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -1257,7 +1257,7 @@ } TARGET(DELETE_NAME) { - #line 858 "Python/bytecodes.c" + #line 904 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); PyObject *ns = LOCALS(); int err; @@ -1282,7 +1282,7 @@ PREDICTED(UNPACK_SEQUENCE); static_assert(INLINE_CACHE_ENTRIES_UNPACK_SEQUENCE == 1, "incorrect cache size"); PyObject *seq = stack_pointer[-1]; - #line 884 "Python/bytecodes.c" + #line 930 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyUnpackSequenceCache *cache = (_PyUnpackSequenceCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -1298,7 +1298,7 @@ int res = unpack_iterable(tstate, seq, oparg, -1, top); #line 1300 "Python/generated_cases.c.h" Py_DECREF(seq); - #line 898 "Python/bytecodes.c" + #line 944 "Python/bytecodes.c" if (res == 0) goto pop_1_error; #line 1304 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -1310,7 +1310,7 @@ TARGET(UNPACK_SEQUENCE_TWO_TUPLE) { PyObject *seq = stack_pointer[-1]; PyObject **values = stack_pointer - (1); - #line 902 "Python/bytecodes.c" + #line 948 "Python/bytecodes.c" DEOPT_IF(!PyTuple_CheckExact(seq), UNPACK_SEQUENCE); DEOPT_IF(PyTuple_GET_SIZE(seq) != 2, UNPACK_SEQUENCE); assert(oparg == 2); @@ -1328,7 +1328,7 @@ TARGET(UNPACK_SEQUENCE_TUPLE) { PyObject *seq = stack_pointer[-1]; PyObject **values = stack_pointer - (1); - #line 912 "Python/bytecodes.c" + #line 958 "Python/bytecodes.c" DEOPT_IF(!PyTuple_CheckExact(seq), UNPACK_SEQUENCE); DEOPT_IF(PyTuple_GET_SIZE(seq) != oparg, UNPACK_SEQUENCE); STAT_INC(UNPACK_SEQUENCE, hit); @@ -1347,7 +1347,7 @@ TARGET(UNPACK_SEQUENCE_LIST) { PyObject *seq = stack_pointer[-1]; PyObject **values = stack_pointer - (1); - #line 923 "Python/bytecodes.c" + #line 969 "Python/bytecodes.c" DEOPT_IF(!PyList_CheckExact(seq), UNPACK_SEQUENCE); DEOPT_IF(PyList_GET_SIZE(seq) != oparg, UNPACK_SEQUENCE); STAT_INC(UNPACK_SEQUENCE, hit); @@ -1365,13 +1365,13 @@ TARGET(UNPACK_EX) { PyObject *seq = stack_pointer[-1]; - #line 934 "Python/bytecodes.c" + #line 980 "Python/bytecodes.c" int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8); PyObject **top = stack_pointer + totalargs - 1; int res = unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8, top); #line 1373 "Python/generated_cases.c.h" Py_DECREF(seq); - #line 938 "Python/bytecodes.c" + #line 984 "Python/bytecodes.c" if (res == 0) goto pop_1_error; #line 1377 "Python/generated_cases.c.h" STACK_GROW((oparg & 0xFF) + (oparg >> 8)); @@ -1384,7 +1384,7 @@ PyObject *owner = stack_pointer[-1]; PyObject *v = stack_pointer[-2]; uint16_t counter = read_u16(&next_instr[0].cache); - #line 949 "Python/bytecodes.c" + #line 995 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION if (ADAPTIVE_COUNTER_IS_ZERO(counter)) { assert(cframe.use_tracing == 0); @@ -1404,7 +1404,7 @@ #line 1405 "Python/generated_cases.c.h" Py_DECREF(v); Py_DECREF(owner); - #line 966 "Python/bytecodes.c" + #line 1012 "Python/bytecodes.c" if (err) goto pop_2_error; #line 1410 "Python/generated_cases.c.h" STACK_SHRINK(2); @@ -1414,12 +1414,12 @@ TARGET(DELETE_ATTR) { PyObject *owner = stack_pointer[-1]; - #line 970 "Python/bytecodes.c" + #line 1016 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); int err = PyObject_SetAttr(owner, name, (PyObject *)NULL); #line 1421 "Python/generated_cases.c.h" Py_DECREF(owner); - #line 973 "Python/bytecodes.c" + #line 1019 "Python/bytecodes.c" if (err) goto pop_1_error; #line 1425 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -1428,12 +1428,12 @@ TARGET(STORE_GLOBAL) { PyObject *v = stack_pointer[-1]; - #line 977 "Python/bytecodes.c" + #line 1023 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); int err = PyDict_SetItem(GLOBALS(), name, v); #line 1435 "Python/generated_cases.c.h" Py_DECREF(v); - #line 980 "Python/bytecodes.c" + #line 1026 "Python/bytecodes.c" if (err) goto pop_1_error; #line 1439 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -1441,7 +1441,7 @@ } TARGET(DELETE_GLOBAL) { - #line 984 "Python/bytecodes.c" + #line 1030 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); int err; err = PyDict_DelItem(GLOBALS(), name); @@ -1459,7 +1459,7 @@ TARGET(LOAD_NAME) { PyObject *v; - #line 998 "Python/bytecodes.c" + #line 1044 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); PyObject *locals = LOCALS(); if (locals == NULL) { @@ -1529,7 +1529,7 @@ static_assert(INLINE_CACHE_ENTRIES_LOAD_GLOBAL == 4, "incorrect cache size"); PyObject *null = NULL; PyObject *v; - #line 1065 "Python/bytecodes.c" + #line 1111 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyLoadGlobalCache *cache = (_PyLoadGlobalCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -1596,7 +1596,7 @@ PyObject *res; uint16_t index = read_u16(&next_instr[1].cache); uint16_t version = read_u16(&next_instr[2].cache); - #line 1120 "Python/bytecodes.c" + #line 1166 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyDict_CheckExact(GLOBALS()), LOAD_GLOBAL); PyDictObject *dict = (PyDictObject *)GLOBALS(); @@ -1623,7 +1623,7 @@ uint16_t index = read_u16(&next_instr[1].cache); uint16_t mod_version = read_u16(&next_instr[2].cache); uint16_t bltn_version = read_u16(&next_instr[3].cache); - #line 1134 "Python/bytecodes.c" + #line 1180 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyDict_CheckExact(GLOBALS()), LOAD_GLOBAL); DEOPT_IF(!PyDict_CheckExact(BUILTINS()), LOAD_GLOBAL); @@ -1648,7 +1648,7 @@ } TARGET(DELETE_FAST) { - #line 1151 "Python/bytecodes.c" + #line 1197 "Python/bytecodes.c" PyObject *v = GETLOCAL(oparg); if (v == NULL) goto unbound_local_error; SETLOCAL(oparg, NULL); @@ -1657,7 +1657,7 @@ } TARGET(MAKE_CELL) { - #line 1157 "Python/bytecodes.c" + #line 1203 "Python/bytecodes.c" // "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); @@ -1671,7 +1671,7 @@ } TARGET(DELETE_DEREF) { - #line 1168 "Python/bytecodes.c" + #line 1214 "Python/bytecodes.c" PyObject *cell = GETLOCAL(oparg); PyObject *oldobj = PyCell_GET(cell); // Can't use ERROR_IF here. @@ -1688,7 +1688,7 @@ TARGET(LOAD_CLASSDEREF) { PyObject *value; - #line 1181 "Python/bytecodes.c" + #line 1227 "Python/bytecodes.c" PyObject *name, *locals = LOCALS(); assert(locals); assert(oparg >= 0 && oparg < frame->f_code->co_nlocalsplus); @@ -1728,7 +1728,7 @@ TARGET(LOAD_DEREF) { PyObject *value; - #line 1215 "Python/bytecodes.c" + #line 1261 "Python/bytecodes.c" PyObject *cell = GETLOCAL(oparg); value = PyCell_GET(cell); if (value == NULL) { @@ -1744,7 +1744,7 @@ TARGET(STORE_DEREF) { PyObject *v = stack_pointer[-1]; - #line 1225 "Python/bytecodes.c" + #line 1271 "Python/bytecodes.c" PyObject *cell = GETLOCAL(oparg); PyObject *oldobj = PyCell_GET(cell); PyCell_SET(cell, v); @@ -1755,7 +1755,7 @@ } TARGET(COPY_FREE_VARS) { - #line 1232 "Python/bytecodes.c" + #line 1278 "Python/bytecodes.c" /* Copy closure variables to free variables */ PyCodeObject *co = frame->f_code; assert(PyFunction_Check(frame->f_funcobj)); @@ -1773,13 +1773,13 @@ TARGET(BUILD_STRING) { PyObject **pieces = (stack_pointer - oparg); PyObject *str; - #line 1245 "Python/bytecodes.c" + #line 1291 "Python/bytecodes.c" str = _PyUnicode_JoinArray(&_Py_STR(empty), pieces, oparg); #line 1779 "Python/generated_cases.c.h" for (int _i = oparg; --_i >= 0;) { Py_DECREF(pieces[_i]); } - #line 1247 "Python/bytecodes.c" + #line 1293 "Python/bytecodes.c" if (str == NULL) { STACK_SHRINK(oparg); goto error; } #line 1785 "Python/generated_cases.c.h" STACK_SHRINK(oparg); @@ -1791,7 +1791,7 @@ TARGET(BUILD_TUPLE) { PyObject **values = (stack_pointer - oparg); PyObject *tup; - #line 1251 "Python/bytecodes.c" + #line 1297 "Python/bytecodes.c" tup = _PyTuple_FromArraySteal(values, oparg); if (tup == NULL) { STACK_SHRINK(oparg); goto error; } #line 1798 "Python/generated_cases.c.h" @@ -1804,7 +1804,7 @@ TARGET(BUILD_LIST) { PyObject **values = (stack_pointer - oparg); PyObject *list; - #line 1256 "Python/bytecodes.c" + #line 1302 "Python/bytecodes.c" list = _PyList_FromArraySteal(values, oparg); if (list == NULL) { STACK_SHRINK(oparg); goto error; } #line 1811 "Python/generated_cases.c.h" @@ -1817,7 +1817,7 @@ TARGET(LIST_EXTEND) { PyObject *iterable = stack_pointer[-1]; PyObject *list = stack_pointer[-(2 + (oparg-1))]; - #line 1261 "Python/bytecodes.c" + #line 1307 "Python/bytecodes.c" PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable); if (none_val == NULL) { if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) && @@ -1830,7 +1830,7 @@ } #line 1832 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 1272 "Python/bytecodes.c" + #line 1318 "Python/bytecodes.c" if (true) goto pop_1_error; } Py_DECREF(none_val); @@ -1843,11 +1843,11 @@ TARGET(SET_UPDATE) { PyObject *iterable = stack_pointer[-1]; PyObject *set = stack_pointer[-(2 + (oparg-1))]; - #line 1279 "Python/bytecodes.c" + #line 1325 "Python/bytecodes.c" int err = _PySet_Update(set, iterable); #line 1849 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 1281 "Python/bytecodes.c" + #line 1327 "Python/bytecodes.c" if (err < 0) goto pop_1_error; #line 1853 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -1857,7 +1857,7 @@ TARGET(BUILD_SET) { PyObject **values = (stack_pointer - oparg); PyObject *set; - #line 1285 "Python/bytecodes.c" + #line 1331 "Python/bytecodes.c" set = PySet_New(NULL); if (set == NULL) goto error; @@ -1882,7 +1882,7 @@ TARGET(BUILD_MAP) { PyObject **values = (stack_pointer - oparg*2); PyObject *map; - #line 1302 "Python/bytecodes.c" + #line 1348 "Python/bytecodes.c" map = _PyDict_FromItems( values, 2, values+1, 2, @@ -1894,7 +1894,7 @@ for (int _i = oparg*2; --_i >= 0;) { Py_DECREF(values[_i]); } - #line 1310 "Python/bytecodes.c" + #line 1356 "Python/bytecodes.c" if (map == NULL) { STACK_SHRINK(oparg*2); goto error; } #line 1900 "Python/generated_cases.c.h" STACK_SHRINK(oparg*2); @@ -1904,7 +1904,7 @@ } TARGET(SETUP_ANNOTATIONS) { - #line 1314 "Python/bytecodes.c" + #line 1360 "Python/bytecodes.c" int err; PyObject *ann_dict; if (LOCALS() == NULL) { @@ -1952,7 +1952,7 @@ PyObject *keys = stack_pointer[-1]; PyObject **values = (stack_pointer - (1 + oparg)); PyObject *map; - #line 1356 "Python/bytecodes.c" + #line 1402 "Python/bytecodes.c" if (!PyTuple_CheckExact(keys) || PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) { _PyErr_SetString(tstate, PyExc_SystemError, @@ -1967,7 +1967,7 @@ Py_DECREF(values[_i]); } Py_DECREF(keys); - #line 1366 "Python/bytecodes.c" + #line 1412 "Python/bytecodes.c" if (map == NULL) { STACK_SHRINK(oparg); goto pop_1_error; } #line 1973 "Python/generated_cases.c.h" STACK_SHRINK(oparg); @@ -1977,7 +1977,7 @@ TARGET(DICT_UPDATE) { PyObject *update = stack_pointer[-1]; - #line 1370 "Python/bytecodes.c" + #line 1416 "Python/bytecodes.c" PyObject *dict = PEEK(oparg + 1); // update is still on the stack if (PyDict_Update(dict, update) < 0) { if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { @@ -1987,7 +1987,7 @@ } #line 1989 "Python/generated_cases.c.h" Py_DECREF(update); - #line 1378 "Python/bytecodes.c" + #line 1424 "Python/bytecodes.c" if (true) goto pop_1_error; } #line 1994 "Python/generated_cases.c.h" @@ -1998,14 +1998,14 @@ TARGET(DICT_MERGE) { PyObject *update = stack_pointer[-1]; - #line 1384 "Python/bytecodes.c" + #line 1430 "Python/bytecodes.c" PyObject *dict = PEEK(oparg + 1); // update is still on the stack if (_PyDict_MergeEx(dict, update, 2) < 0) { format_kwargs_error(tstate, PEEK(3 + oparg), update); #line 2007 "Python/generated_cases.c.h" Py_DECREF(update); - #line 1389 "Python/bytecodes.c" + #line 1435 "Python/bytecodes.c" if (true) goto pop_1_error; } #line 2012 "Python/generated_cases.c.h" @@ -2018,7 +2018,7 @@ TARGET(MAP_ADD) { PyObject *value = stack_pointer[-1]; PyObject *key = stack_pointer[-2]; - #line 1396 "Python/bytecodes.c" + #line 1442 "Python/bytecodes.c" PyObject *dict = PEEK(oparg + 2); // key, value are still on the stack assert(PyDict_CheckExact(dict)); /* dict[key] = value */ @@ -2036,7 +2036,7 @@ PyObject *owner = stack_pointer[-1]; PyObject *res2 = NULL; PyObject *res; - #line 1419 "Python/bytecodes.c" + #line 1465 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyAttrCache *cache = (_PyAttrCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -2073,7 +2073,7 @@ */ #line 2075 "Python/generated_cases.c.h" Py_DECREF(owner); - #line 1454 "Python/bytecodes.c" + #line 1500 "Python/bytecodes.c" if (meth == NULL) goto pop_1_error; res2 = NULL; res = meth; @@ -2084,7 +2084,7 @@ res = PyObject_GetAttr(owner, name); #line 2086 "Python/generated_cases.c.h" Py_DECREF(owner); - #line 1463 "Python/bytecodes.c" + #line 1509 "Python/bytecodes.c" if (res == NULL) goto pop_1_error; } #line 2091 "Python/generated_cases.c.h" @@ -2101,7 +2101,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1468 "Python/bytecodes.c" + #line 1514 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); @@ -2130,7 +2130,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1485 "Python/bytecodes.c" + #line 1531 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyModule_CheckExact(owner), LOAD_ATTR); PyDictObject *dict = (PyDictObject *)((PyModuleObject *)owner)->md_dict; @@ -2159,7 +2159,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1502 "Python/bytecodes.c" + #line 1548 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); @@ -2202,7 +2202,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1533 "Python/bytecodes.c" + #line 1579 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); @@ -2228,7 +2228,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 1547 "Python/bytecodes.c" + #line 1593 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyType_Check(cls), LOAD_ATTR); @@ -2255,7 +2255,7 @@ uint32_t type_version = read_u32(&next_instr[1].cache); uint32_t func_version = read_u32(&next_instr[3].cache); PyObject *fget = read_obj(&next_instr[5].cache); - #line 1563 "Python/bytecodes.c" + #line 1609 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(tstate->interp->eval_frame, LOAD_ATTR); @@ -2287,7 +2287,7 @@ uint32_t type_version = read_u32(&next_instr[1].cache); uint32_t func_version = read_u32(&next_instr[3].cache); PyObject *getattribute = read_obj(&next_instr[5].cache); - #line 1589 "Python/bytecodes.c" + #line 1635 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(tstate->interp->eval_frame, LOAD_ATTR); PyTypeObject *cls = Py_TYPE(owner); @@ -2321,7 +2321,7 @@ PyObject *value = stack_pointer[-2]; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1617 "Python/bytecodes.c" + #line 1663 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); @@ -2351,7 +2351,7 @@ PyObject *value = stack_pointer[-2]; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t hint = read_u16(&next_instr[3].cache); - #line 1638 "Python/bytecodes.c" + #line 1684 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); @@ -2402,7 +2402,7 @@ PyObject *value = stack_pointer[-2]; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1680 "Python/bytecodes.c" + #line 1726 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); @@ -2425,7 +2425,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 1700 "Python/bytecodes.c" + #line 1746 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyCompareOpCache *cache = (_PyCompareOpCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -2442,7 +2442,7 @@ #line 2443 "Python/generated_cases.c.h" Py_DECREF(left); Py_DECREF(right); - #line 1714 "Python/bytecodes.c" + #line 1760 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; #line 2448 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -2455,7 +2455,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 1718 "Python/bytecodes.c" + #line 1764 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyFloat_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyFloat_CheckExact(right), COMPARE_OP); @@ -2479,7 +2479,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 1734 "Python/bytecodes.c" + #line 1780 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyLong_CheckExact(right), COMPARE_OP); @@ -2507,7 +2507,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 1754 "Python/bytecodes.c" + #line 1800 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(!PyUnicode_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyUnicode_CheckExact(right), COMPARE_OP); @@ -2532,12 +2532,12 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *b; - #line 1770 "Python/bytecodes.c" + #line 1816 "Python/bytecodes.c" int res = Py_Is(left, right) ^ oparg; #line 2538 "Python/generated_cases.c.h" Py_DECREF(left); Py_DECREF(right); - #line 1772 "Python/bytecodes.c" + #line 1818 "Python/bytecodes.c" b = Py_NewRef(res ? Py_True : Py_False); #line 2543 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -2549,12 +2549,12 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *b; - #line 1776 "Python/bytecodes.c" + #line 1822 "Python/bytecodes.c" int res = PySequence_Contains(right, left); #line 2555 "Python/generated_cases.c.h" Py_DECREF(left); Py_DECREF(right); - #line 1778 "Python/bytecodes.c" + #line 1824 "Python/bytecodes.c" if (res < 0) goto pop_2_error; b = Py_NewRef((res^oparg) ? Py_True : Py_False); #line 2561 "Python/generated_cases.c.h" @@ -2568,12 +2568,12 @@ PyObject *exc_value = stack_pointer[-2]; PyObject *rest; PyObject *match; - #line 1783 "Python/bytecodes.c" + #line 1829 "Python/bytecodes.c" if (check_except_star_type_valid(tstate, match_type) < 0) { #line 2574 "Python/generated_cases.c.h" Py_DECREF(exc_value); Py_DECREF(match_type); - #line 1785 "Python/bytecodes.c" + #line 1831 "Python/bytecodes.c" if (true) goto pop_2_error; } @@ -2584,7 +2584,7 @@ #line 2585 "Python/generated_cases.c.h" Py_DECREF(exc_value); Py_DECREF(match_type); - #line 1793 "Python/bytecodes.c" + #line 1839 "Python/bytecodes.c" if (res < 0) goto pop_2_error; assert((match == NULL) == (rest == NULL)); @@ -2603,19 +2603,19 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *b; - #line 1804 "Python/bytecodes.c" + #line 1850 "Python/bytecodes.c" assert(PyExceptionInstance_Check(left)); if (check_except_type_valid(tstate, right) < 0) { #line 2610 "Python/generated_cases.c.h" Py_DECREF(right); - #line 1807 "Python/bytecodes.c" + #line 1853 "Python/bytecodes.c" if (true) goto pop_1_error; } int res = PyErr_GivenExceptionMatches(left, right); #line 2617 "Python/generated_cases.c.h" Py_DECREF(right); - #line 1812 "Python/bytecodes.c" + #line 1858 "Python/bytecodes.c" b = Py_NewRef(res ? Py_True : Py_False); #line 2621 "Python/generated_cases.c.h" stack_pointer[-1] = b; @@ -2626,13 +2626,13 @@ PyObject *fromlist = stack_pointer[-1]; PyObject *level = stack_pointer[-2]; PyObject *res; - #line 1816 "Python/bytecodes.c" + #line 1862 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); res = import_name(tstate, frame, name, fromlist, level); #line 2633 "Python/generated_cases.c.h" Py_DECREF(level); Py_DECREF(fromlist); - #line 1819 "Python/bytecodes.c" + #line 1865 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; #line 2638 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -2643,7 +2643,7 @@ TARGET(IMPORT_FROM) { PyObject *from = stack_pointer[-1]; PyObject *res; - #line 1823 "Python/bytecodes.c" + #line 1869 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); res = import_from(tstate, from, name); if (res == NULL) goto error; @@ -2654,7 +2654,7 @@ } TARGET(JUMP_FORWARD) { - #line 1829 "Python/bytecodes.c" + #line 1875 "Python/bytecodes.c" JUMPBY(oparg); #line 2660 "Python/generated_cases.c.h" DISPATCH(); @@ -2662,7 +2662,7 @@ TARGET(JUMP_BACKWARD) { PREDICTED(JUMP_BACKWARD); - #line 1833 "Python/bytecodes.c" + #line 1879 "Python/bytecodes.c" assert(oparg < INSTR_OFFSET()); JUMPBY(-oparg); #line 2669 "Python/generated_cases.c.h" @@ -2673,7 +2673,7 @@ TARGET(POP_JUMP_IF_FALSE) { PREDICTED(POP_JUMP_IF_FALSE); PyObject *cond = stack_pointer[-1]; - #line 1839 "Python/bytecodes.c" + #line 1885 "Python/bytecodes.c" if (Py_IsTrue(cond)) { _Py_DECREF_NO_DEALLOC(cond); } @@ -2685,7 +2685,7 @@ int err = PyObject_IsTrue(cond); #line 2687 "Python/generated_cases.c.h" Py_DECREF(cond); - #line 1849 "Python/bytecodes.c" + #line 1895 "Python/bytecodes.c" if (err == 0) { JUMPBY(oparg); } @@ -2700,7 +2700,7 @@ TARGET(POP_JUMP_IF_TRUE) { PyObject *cond = stack_pointer[-1]; - #line 1859 "Python/bytecodes.c" + #line 1905 "Python/bytecodes.c" if (Py_IsFalse(cond)) { _Py_DECREF_NO_DEALLOC(cond); } @@ -2712,7 +2712,7 @@ int err = PyObject_IsTrue(cond); #line 2714 "Python/generated_cases.c.h" Py_DECREF(cond); - #line 1869 "Python/bytecodes.c" + #line 1915 "Python/bytecodes.c" if (err > 0) { JUMPBY(oparg); } @@ -2727,11 +2727,11 @@ TARGET(POP_JUMP_IF_NOT_NONE) { PyObject *value = stack_pointer[-1]; - #line 1879 "Python/bytecodes.c" + #line 1925 "Python/bytecodes.c" if (!Py_IsNone(value)) { #line 2733 "Python/generated_cases.c.h" Py_DECREF(value); - #line 1881 "Python/bytecodes.c" + #line 1927 "Python/bytecodes.c" JUMPBY(oparg); } else { @@ -2744,7 +2744,7 @@ TARGET(POP_JUMP_IF_NONE) { PyObject *value = stack_pointer[-1]; - #line 1889 "Python/bytecodes.c" + #line 1935 "Python/bytecodes.c" if (Py_IsNone(value)) { _Py_DECREF_NO_DEALLOC(value); JUMPBY(oparg); @@ -2752,7 +2752,7 @@ else { #line 2754 "Python/generated_cases.c.h" Py_DECREF(value); - #line 1895 "Python/bytecodes.c" + #line 1941 "Python/bytecodes.c" } #line 2758 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -2760,7 +2760,7 @@ } TARGET(JUMP_BACKWARD_NO_INTERRUPT) { - #line 1899 "Python/bytecodes.c" + #line 1945 "Python/bytecodes.c" /* This bytecode is used in the `yield from` or `await` loop. * If there is an interrupt, we want it handled in the innermost * generator or coroutine, so we deliberately do not check it here. @@ -2774,7 +2774,7 @@ TARGET(GET_LEN) { PyObject *obj = stack_pointer[-1]; PyObject *len_o; - #line 1908 "Python/bytecodes.c" + #line 1954 "Python/bytecodes.c" // PUSH(len(TOS)) Py_ssize_t len_i = PyObject_Length(obj); if (len_i < 0) goto error; @@ -2791,7 +2791,7 @@ PyObject *type = stack_pointer[-2]; PyObject *subject = stack_pointer[-3]; PyObject *attrs; - #line 1916 "Python/bytecodes.c" + #line 1962 "Python/bytecodes.c" // Pop TOS and TOS1. Set TOS to a tuple of attributes on success, or // None on failure. assert(PyTuple_CheckExact(names)); @@ -2800,7 +2800,7 @@ Py_DECREF(subject); Py_DECREF(type); Py_DECREF(names); - #line 1921 "Python/bytecodes.c" + #line 1967 "Python/bytecodes.c" if (attrs) { assert(PyTuple_CheckExact(attrs)); // Success! } @@ -2817,7 +2817,7 @@ TARGET(MATCH_MAPPING) { PyObject *subject = stack_pointer[-1]; PyObject *res; - #line 1931 "Python/bytecodes.c" + #line 1977 "Python/bytecodes.c" int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING; res = Py_NewRef(match ? Py_True : Py_False); #line 2824 "Python/generated_cases.c.h" @@ -2830,7 +2830,7 @@ TARGET(MATCH_SEQUENCE) { PyObject *subject = stack_pointer[-1]; PyObject *res; - #line 1937 "Python/bytecodes.c" + #line 1983 "Python/bytecodes.c" int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE; res = Py_NewRef(match ? Py_True : Py_False); #line 2837 "Python/generated_cases.c.h" @@ -2844,7 +2844,7 @@ PyObject *keys = stack_pointer[-1]; PyObject *subject = stack_pointer[-2]; PyObject *values_or_none; - #line 1943 "Python/bytecodes.c" + #line 1989 "Python/bytecodes.c" // On successful match, PUSH(values). Otherwise, PUSH(None). values_or_none = match_keys(tstate, subject, keys); if (values_or_none == NULL) goto error; @@ -2857,12 +2857,12 @@ TARGET(GET_ITER) { PyObject *iterable = stack_pointer[-1]; PyObject *iter; - #line 1949 "Python/bytecodes.c" + #line 1995 "Python/bytecodes.c" /* before: [obj]; after [getiter(obj)] */ iter = PyObject_GetIter(iterable); #line 2864 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 1952 "Python/bytecodes.c" + #line 1998 "Python/bytecodes.c" if (iter == NULL) goto pop_1_error; #line 2868 "Python/generated_cases.c.h" stack_pointer[-1] = iter; @@ -2872,7 +2872,7 @@ TARGET(GET_YIELD_FROM_ITER) { PyObject *iterable = stack_pointer[-1]; PyObject *iter; - #line 1956 "Python/bytecodes.c" + #line 2002 "Python/bytecodes.c" /* before: [obj]; after [getiter(obj)] */ if (PyCoro_CheckExact(iterable)) { /* `iterable` is a coroutine */ @@ -2897,7 +2897,7 @@ } #line 2899 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 1979 "Python/bytecodes.c" + #line 2025 "Python/bytecodes.c" } #line 2903 "Python/generated_cases.c.h" stack_pointer[-1] = iter; @@ -2910,7 +2910,7 @@ static_assert(INLINE_CACHE_ENTRIES_FOR_ITER == 1, "incorrect cache size"); PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 1998 "Python/bytecodes.c" + #line 2044 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyForIterCache *cache = (_PyForIterCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -2953,7 +2953,7 @@ TARGET(FOR_ITER_LIST) { PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2033 "Python/bytecodes.c" + #line 2079 "Python/bytecodes.c" assert(cframe.use_tracing == 0); DEOPT_IF(Py_TYPE(iter) != &PyListIter_Type, FOR_ITER); _PyListIterObject *it = (_PyListIterObject *)iter; @@ -2984,7 +2984,7 @@ TARGET(FOR_ITER_TUPLE) { PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2056 "Python/bytecodes.c" + #line 2102 "Python/bytecodes.c" assert(cframe.use_tracing == 0); _PyTupleIterObject *it = (_PyTupleIterObject *)iter; DEOPT_IF(Py_TYPE(it) != &PyTupleIter_Type, FOR_ITER); @@ -3015,7 +3015,7 @@ TARGET(FOR_ITER_RANGE) { PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2079 "Python/bytecodes.c" + #line 2125 "Python/bytecodes.c" assert(cframe.use_tracing == 0); _PyRangeIterObject *r = (_PyRangeIterObject *)iter; DEOPT_IF(Py_TYPE(r) != &PyRangeIter_Type, FOR_ITER); @@ -3043,7 +3043,7 @@ TARGET(FOR_ITER_GEN) { PyObject *iter = stack_pointer[-1]; - #line 2100 "Python/bytecodes.c" + #line 2146 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyGenObject *gen = (PyGenObject *)iter; DEOPT_IF(Py_TYPE(gen) != &PyGen_Type, FOR_ITER); @@ -3065,7 +3065,7 @@ PyObject *mgr = stack_pointer[-1]; PyObject *exit; PyObject *res; - #line 2117 "Python/bytecodes.c" + #line 2163 "Python/bytecodes.c" PyObject *enter = _PyObject_LookupSpecial(mgr, &_Py_ID(__aenter__)); if (enter == NULL) { if (!_PyErr_Occurred(tstate)) { @@ -3090,7 +3090,7 @@ } #line 3092 "Python/generated_cases.c.h" Py_DECREF(mgr); - #line 2140 "Python/bytecodes.c" + #line 2186 "Python/bytecodes.c" res = _PyObject_CallNoArgs(enter); Py_DECREF(enter); if (res == NULL) { @@ -3109,7 +3109,7 @@ PyObject *mgr = stack_pointer[-1]; PyObject *exit; PyObject *res; - #line 2150 "Python/bytecodes.c" + #line 2196 "Python/bytecodes.c" /* pop the context manager, push its __exit__ and the * value returned from calling its __enter__ */ @@ -3137,7 +3137,7 @@ } #line 3139 "Python/generated_cases.c.h" Py_DECREF(mgr); - #line 2176 "Python/bytecodes.c" + #line 2222 "Python/bytecodes.c" res = _PyObject_CallNoArgs(enter); Py_DECREF(enter); if (res == NULL) { @@ -3156,7 +3156,7 @@ PyObject *lasti = stack_pointer[-3]; PyObject *exit_func = stack_pointer[-4]; PyObject *res; - #line 2185 "Python/bytecodes.c" + #line 2231 "Python/bytecodes.c" /* At the top of the stack are 4 values: - val: TOP = exc_info() - unused: SECOND = previous exception @@ -3186,7 +3186,7 @@ TARGET(PUSH_EXC_INFO) { PyObject *new_exc = stack_pointer[-1]; PyObject *prev_exc; - #line 2208 "Python/bytecodes.c" + #line 2254 "Python/bytecodes.c" _PyErr_StackItem *exc_info = tstate->exc_info; if (exc_info->exc_value != NULL) { prev_exc = exc_info->exc_value; @@ -3210,7 +3210,7 @@ uint32_t type_version = read_u32(&next_instr[1].cache); uint32_t keys_version = read_u32(&next_instr[3].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 2220 "Python/bytecodes.c" + #line 2266 "Python/bytecodes.c" /* Cached method object */ assert(cframe.use_tracing == 0); PyTypeObject *self_cls = Py_TYPE(self); @@ -3242,7 +3242,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 2240 "Python/bytecodes.c" + #line 2286 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyTypeObject *self_cls = Py_TYPE(self); DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR); @@ -3267,7 +3267,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 2253 "Python/bytecodes.c" + #line 2299 "Python/bytecodes.c" assert(cframe.use_tracing == 0); PyTypeObject *self_cls = Py_TYPE(self); DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR); @@ -3291,7 +3291,7 @@ } TARGET(KW_NAMES) { - #line 2270 "Python/bytecodes.c" + #line 2316 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg < PyTuple_GET_SIZE(frame->f_code->co_consts)); kwnames = GETITEM(frame->f_code->co_consts, oparg); @@ -3306,7 +3306,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2306 "Python/bytecodes.c" + #line 2352 "Python/bytecodes.c" int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -3390,7 +3390,7 @@ TARGET(CALL_BOUND_METHOD_EXACT_ARGS) { PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; - #line 2384 "Python/bytecodes.c" + #line 2430 "Python/bytecodes.c" DEOPT_IF(method != NULL, CALL); DEOPT_IF(Py_TYPE(callable) != &PyMethod_Type, CALL); STAT_INC(CALL, hit); @@ -3409,7 +3409,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; uint32_t func_version = read_u32(&next_instr[1].cache); - #line 2396 "Python/bytecodes.c" + #line 2442 "Python/bytecodes.c" assert(kwnames == NULL); DEOPT_IF(tstate->interp->eval_frame, CALL); int is_meth = method != NULL; @@ -3443,7 +3443,7 @@ PyObject *method = stack_pointer[-(2 + oparg)]; uint32_t func_version = read_u32(&next_instr[1].cache); uint16_t min_args = read_u16(&next_instr[3].cache); - #line 2423 "Python/bytecodes.c" + #line 2469 "Python/bytecodes.c" assert(kwnames == NULL); DEOPT_IF(tstate->interp->eval_frame, CALL); int is_meth = method != NULL; @@ -3481,7 +3481,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2455 "Python/bytecodes.c" + #line 2501 "Python/bytecodes.c" assert(kwnames == NULL); assert(cframe.use_tracing == 0); assert(oparg == 1); @@ -3505,7 +3505,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2468 "Python/bytecodes.c" + #line 2514 "Python/bytecodes.c" assert(kwnames == NULL); assert(cframe.use_tracing == 0); assert(oparg == 1); @@ -3531,7 +3531,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2483 "Python/bytecodes.c" + #line 2529 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); @@ -3556,7 +3556,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2497 "Python/bytecodes.c" + #line 2543 "Python/bytecodes.c" int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -3592,7 +3592,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2522 "Python/bytecodes.c" + #line 2568 "Python/bytecodes.c" assert(cframe.use_tracing == 0); /* Builtin METH_O functions */ assert(kwnames == NULL); @@ -3635,7 +3635,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2554 "Python/bytecodes.c" + #line 2600 "Python/bytecodes.c" assert(cframe.use_tracing == 0); /* Builtin METH_FASTCALL functions, without keywords */ assert(kwnames == NULL); @@ -3682,7 +3682,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2590 "Python/bytecodes.c" + #line 2636 "Python/bytecodes.c" assert(cframe.use_tracing == 0); /* Builtin METH_FASTCALL | METH_KEYWORDS functions */ int is_meth = method != NULL; @@ -3729,7 +3729,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2626 "Python/bytecodes.c" + #line 2672 "Python/bytecodes.c" assert(cframe.use_tracing == 0); assert(kwnames == NULL); /* len(o) */ @@ -3768,7 +3768,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2654 "Python/bytecodes.c" + #line 2700 "Python/bytecodes.c" assert(cframe.use_tracing == 0); assert(kwnames == NULL); /* isinstance(o, o2) */ @@ -3808,7 +3808,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *self = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; - #line 2685 "Python/bytecodes.c" + #line 2731 "Python/bytecodes.c" assert(cframe.use_tracing == 0); assert(kwnames == NULL); assert(oparg == 1); @@ -3834,7 +3834,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2706 "Python/bytecodes.c" + #line 2752 "Python/bytecodes.c" assert(kwnames == NULL); int is_meth = method != NULL; int total_args = oparg; @@ -3878,7 +3878,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2740 "Python/bytecodes.c" + #line 2786 "Python/bytecodes.c" int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -3920,7 +3920,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2772 "Python/bytecodes.c" + #line 2818 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 0 || oparg == 1); int is_meth = method != NULL; @@ -3962,7 +3962,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2804 "Python/bytecodes.c" + #line 2850 "Python/bytecodes.c" assert(kwnames == NULL); int is_meth = method != NULL; int total_args = oparg; @@ -4005,7 +4005,7 @@ PyObject *callargs = stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))]; PyObject *func = stack_pointer[-(2 + ((oparg & 1) ? 1 : 0))]; PyObject *result; - #line 2835 "Python/bytecodes.c" + #line 2881 "Python/bytecodes.c" if (oparg & 1) { // DICT_MERGE is called before this opcode if there are kwargs. // It converts all dict subtypes in kwargs into regular dicts. @@ -4028,7 +4028,7 @@ Py_DECREF(func); Py_DECREF(callargs); Py_XDECREF(kwargs); - #line 2854 "Python/bytecodes.c" + #line 2900 "Python/bytecodes.c" assert(PEEK(3 + (oparg & 1)) == NULL); if (result == NULL) { STACK_SHRINK(((oparg & 1) ? 1 : 0)); goto pop_3_error; } @@ -4047,7 +4047,7 @@ PyObject *kwdefaults = (oparg & 0x02) ? stack_pointer[-(1 + ((oparg & 0x08) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0))] : NULL; PyObject *defaults = (oparg & 0x01) ? stack_pointer[-(1 + ((oparg & 0x08) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0) + ((oparg & 0x01) ? 1 : 0))] : NULL; PyObject *func; - #line 2865 "Python/bytecodes.c" + #line 2911 "Python/bytecodes.c" PyFunctionObject *func_obj = (PyFunctionObject *) PyFunction_New(codeobj, GLOBALS()); @@ -4083,7 +4083,7 @@ } TARGET(RETURN_GENERATOR) { - #line 2896 "Python/bytecodes.c" + #line 2942 "Python/bytecodes.c" assert(PyFunction_Check(frame->f_funcobj)); PyFunctionObject *func = (PyFunctionObject *)frame->f_funcobj; PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func); @@ -4112,13 +4112,13 @@ PyObject *stop = stack_pointer[-(1 + ((oparg == 3) ? 1 : 0))]; PyObject *start = stack_pointer[-(2 + ((oparg == 3) ? 1 : 0))]; PyObject *slice; - #line 2919 "Python/bytecodes.c" + #line 2965 "Python/bytecodes.c" slice = PySlice_New(start, stop, step); #line 4118 "Python/generated_cases.c.h" Py_DECREF(start); Py_DECREF(stop); Py_XDECREF(step); - #line 2921 "Python/bytecodes.c" + #line 2967 "Python/bytecodes.c" if (slice == NULL) { STACK_SHRINK(((oparg == 3) ? 1 : 0)); goto pop_2_error; } #line 4124 "Python/generated_cases.c.h" STACK_SHRINK(((oparg == 3) ? 1 : 0)); @@ -4131,7 +4131,7 @@ PyObject *fmt_spec = ((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? stack_pointer[-((((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0))] : NULL; PyObject *value = stack_pointer[-(1 + (((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0))]; PyObject *result; - #line 2925 "Python/bytecodes.c" + #line 2971 "Python/bytecodes.c" /* Handles f-string value formatting. */ PyObject *(*conv_fn)(PyObject *); int which_conversion = oparg & FVC_MASK; @@ -4175,7 +4175,7 @@ TARGET(COPY) { PyObject *bottom = stack_pointer[-(1 + (oparg-1))]; PyObject *top; - #line 2962 "Python/bytecodes.c" + #line 3008 "Python/bytecodes.c" assert(oparg > 0); top = Py_NewRef(bottom); #line 4182 "Python/generated_cases.c.h" @@ -4190,7 +4190,7 @@ PyObject *rhs = stack_pointer[-1]; PyObject *lhs = stack_pointer[-2]; PyObject *res; - #line 2967 "Python/bytecodes.c" + #line 3013 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyBinaryOpCache *cache = (_PyBinaryOpCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -4209,7 +4209,7 @@ #line 4210 "Python/generated_cases.c.h" Py_DECREF(lhs); Py_DECREF(rhs); - #line 2983 "Python/bytecodes.c" + #line 3029 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; #line 4215 "Python/generated_cases.c.h" STACK_SHRINK(1); @@ -4221,7 +4221,7 @@ TARGET(SWAP) { PyObject *top = stack_pointer[-1]; PyObject *bottom = stack_pointer[-(2 + (oparg-2))]; - #line 2988 "Python/bytecodes.c" + #line 3034 "Python/bytecodes.c" assert(oparg >= 2); #line 4227 "Python/generated_cases.c.h" stack_pointer[-1] = bottom; @@ -4230,7 +4230,7 @@ } TARGET(EXTENDED_ARG) { - #line 2992 "Python/bytecodes.c" + #line 3038 "Python/bytecodes.c" assert(oparg); assert(cframe.use_tracing == 0); opcode = next_instr->op.code; @@ -4241,7 +4241,7 @@ } TARGET(CACHE) { - #line 3001 "Python/bytecodes.c" + #line 3047 "Python/bytecodes.c" Py_UNREACHABLE(); #line 4247 "Python/generated_cases.c.h" } From 848bdbe166b71ab2ac2c0c1d88432fb995d1444c Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Sat, 1 Apr 2023 06:01:48 +0100 Subject: [PATCH 036/349] gh-102192: use PyErr_SetHandledException instead of the legacy PyErr_SetExcInfo (#103157) --- Python/bytecodes.c | 2 +- Python/generated_cases.c.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 825fa705a4cd38..617b6f311e2f77 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -1842,7 +1842,7 @@ dummy_func( ERROR_IF(match == NULL, error); if (!Py_IsNone(match)) { - PyErr_SetExcInfo(NULL, Py_NewRef(match), NULL); + PyErr_SetHandledException(match); } } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 6bb37d69cc0740..7df585be0bef50 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -2591,7 +2591,7 @@ if (match == NULL) goto pop_2_error; if (!Py_IsNone(match)) { - PyErr_SetExcInfo(NULL, Py_NewRef(match), NULL); + PyErr_SetHandledException(match); } #line 2597 "Python/generated_cases.c.h" stack_pointer[-1] = match; From 06249ec89fffdab25f7088c86fcbbfdcebcc3ebd Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Sat, 1 Apr 2023 21:30:23 +0100 Subject: [PATCH 037/349] gh-102192: deprecate _PyErr_ChainExceptions (#102935) --- Doc/whatsnew/3.12.rst | 6 ++++++ Include/cpython/pyerrors.h | 2 +- .../2023-03-31-12-22-25.gh-issue-102192.gYxJP_.rst | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-31-12-22-25.gh-issue-102192.gYxJP_.rst diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index bd9be531fdd7d1..8ab96134596cbf 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -975,6 +975,10 @@ New Features This is less error prone and a bit more efficient. (Contributed by Mark Shannon in :gh:`101578`.) +* Add ``_PyErr_ChainExceptions1``, which takes an exception instance, + to replace the legacy-API ``_PyErr_ChainExceptions``, which is now + deprecated. (Contributed by Mark Shannon in :gh:`101578`.) + * Add :c:func:`PyException_GetArgs` and :c:func:`PyException_SetArgs` as convenience functions for retrieving and modifying the :attr:`~BaseException.args` passed to the exception's constructor. @@ -1125,6 +1129,8 @@ Deprecated * :c:func:`!PyErr_Display` is deprecated. Use :c:func:`PyErr_DisplayException` instead. (Contributed by Irit Katriel in :gh:`102755`). +* ``_PyErr_ChainExceptions`` is deprecated. Use ``_PyErr_ChainExceptions1`` + instead. (Contributed by Irit Katriel in :gh:`102192`.) Removed ------- diff --git a/Include/cpython/pyerrors.h b/Include/cpython/pyerrors.h index 65bdc942f5067a..758804ade2baa7 100644 --- a/Include/cpython/pyerrors.h +++ b/Include/cpython/pyerrors.h @@ -98,7 +98,7 @@ PyAPI_FUNC(void) _PyErr_GetExcInfo(PyThreadState *, PyObject **, PyObject **, Py /* Context manipulation (PEP 3134) */ -PyAPI_FUNC(void) _PyErr_ChainExceptions(PyObject *, PyObject *, PyObject *); +Py_DEPRECATED(3.12) PyAPI_FUNC(void) _PyErr_ChainExceptions(PyObject *, PyObject *, PyObject *); PyAPI_FUNC(void) _PyErr_ChainExceptions1(PyObject *); /* Like PyErr_Format(), but saves current exception as __context__ and diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-31-12-22-25.gh-issue-102192.gYxJP_.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-31-12-22-25.gh-issue-102192.gYxJP_.rst new file mode 100644 index 00000000000000..10dd72b1abc422 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-03-31-12-22-25.gh-issue-102192.gYxJP_.rst @@ -0,0 +1,2 @@ +Deprecated ``_PyErr_ChainExceptions`` in favour of +``_PyErr_ChainExceptions1``. From d828b35785eeb590b8ca92684038f33177989e46 Mon Sep 17 00:00:00 2001 From: "Partha P. Mukherjee" Date: Sun, 2 Apr 2023 01:05:50 -0400 Subject: [PATCH 038/349] GH-102456: Fix docstring and getopt options for base64 (gh-102457) --- Lib/base64.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/base64.py b/Lib/base64.py index 95dc7b0086051b..e233647ee76639 100755 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -558,12 +558,12 @@ def decodebytes(s): def main(): """Small main program""" import sys, getopt - usage = f"""usage: {sys.argv[0]} [-h|-d|-e|-u|-t] [file|-] + usage = f"""usage: {sys.argv[0]} [-h|-d|-e|-u] [file|-] -h: print this help message and exit -d, -u: decode -e: encode (default)""" try: - opts, args = getopt.getopt(sys.argv[1:], 'hdeut') + opts, args = getopt.getopt(sys.argv[1:], 'hdeu') except getopt.error as msg: sys.stdout = sys.stderr print(msg) From 6d59c9e32ebb6d8468c7eb26e7cf3efd458c7a73 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Sun, 2 Apr 2023 14:22:19 +0100 Subject: [PATCH 039/349] gh-102433: Use `inspect.getattr_static` in `typing._ProtocolMeta.__instancecheck__` (#103034) --- Doc/library/typing.rst | 9 ++ Doc/whatsnew/3.12.rst | 11 +++ Lib/test/test_typing.py | 93 ++++++++++++++++++- Lib/typing.py | 26 +++++- ...-03-25-16-57-18.gh-issue-102433.L-7x2Q.rst | 10 ++ 5 files changed, 142 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-03-25-16-57-18.gh-issue-102433.L-7x2Q.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 384458d3aa6618..8728ca7b6b358c 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1598,6 +1598,15 @@ These are not used in annotations. They are building blocks for creating generic import threading assert isinstance(threading.Thread(name='Bob'), Named) + .. versionchanged:: 3.12 + The internal implementation of :func:`isinstance` checks against + runtime-checkable protocols now uses :func:`inspect.getattr_static` + to look up attributes (previously, :func:`hasattr` was used). + As a result, some objects which used to be considered instances + of a runtime-checkable protocol may no longer be considered instances + of that protocol on Python 3.12+, and vice versa. + Most users are unlikely to be affected by this change. + .. note:: :func:`!runtime_checkable` will check only the presence of the required diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 8ab96134596cbf..93543cb0790fba 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -391,6 +391,17 @@ typing same name on a base class, as per :pep:`698`. (Contributed by Steven Troxler in :gh:`101564`.) +* :func:`isinstance` checks against + :func:`runtime-checkable protocols ` now use + :func:`inspect.getattr_static` rather than :func:`hasattr` to lookup whether + attributes exist. This means that descriptors and :meth:`~object.__getattr__` + methods are no longer unexpectedly evaluated during ``isinstance()`` checks + against runtime-checkable protocols. However, it may also mean that some + objects which used to be considered instances of a runtime-checkable protocol + may no longer be considered instances of that protocol on Python 3.12+, and + vice versa. Most users are unlikely to be affected by this change. + (Contributed by Alex Waygood in :gh:`102433`.) + sys --- diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 23bf2b5e183a18..7d2e6a6a9f6287 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -2637,7 +2637,15 @@ def attr(self): ... class PG1(Protocol[T]): attr: T - for protocol_class in P, P1, PG, PG1: + @runtime_checkable + class MethodP(Protocol): + def attr(self): ... + + @runtime_checkable + class MethodPG(Protocol[T]): + def attr(self) -> T: ... + + for protocol_class in P, P1, PG, PG1, MethodP, MethodPG: for klass in C, D, E, F: with self.subTest( klass=klass.__name__, @@ -2662,7 +2670,12 @@ def attr(self): ... class BadPG1(Protocol[T]): attr: T - for obj in PG[T], PG[C], PG1[T], PG1[C], BadP, BadP1, BadPG, BadPG1: + cases = ( + PG[T], PG[C], PG1[T], PG1[C], MethodPG[T], + MethodPG[C], BadP, BadP1, BadPG, BadPG1 + ) + + for obj in cases: for klass in C, D, E, F, Empty: with self.subTest(klass=klass.__name__, obj=obj): with self.assertRaises(TypeError): @@ -2685,6 +2698,82 @@ def __dir__(self): self.assertIsInstance(CustomDirWithX(), HasX) self.assertNotIsInstance(CustomDirWithoutX(), HasX) + def test_protocols_isinstance_attribute_access_with_side_effects(self): + class C: + @property + def attr(self): + raise AttributeError('no') + + class CustomDescriptor: + def __get__(self, obj, objtype=None): + raise RuntimeError("NO") + + class D: + attr = CustomDescriptor() + + # Check that properties set on superclasses + # are still found by the isinstance() logic + class E(C): ... + class F(D): ... + + class WhyWouldYouDoThis: + def __getattr__(self, name): + raise RuntimeError("wut") + + T = TypeVar('T') + + @runtime_checkable + class P(Protocol): + @property + def attr(self): ... + + @runtime_checkable + class P1(Protocol): + attr: int + + @runtime_checkable + class PG(Protocol[T]): + @property + def attr(self): ... + + @runtime_checkable + class PG1(Protocol[T]): + attr: T + + @runtime_checkable + class MethodP(Protocol): + def attr(self): ... + + @runtime_checkable + class MethodPG(Protocol[T]): + def attr(self) -> T: ... + + for protocol_class in P, P1, PG, PG1, MethodP, MethodPG: + for klass in C, D, E, F: + with self.subTest( + klass=klass.__name__, + protocol_class=protocol_class.__name__ + ): + self.assertIsInstance(klass(), protocol_class) + + with self.subTest( + klass="WhyWouldYouDoThis", + protocol_class=protocol_class.__name__ + ): + self.assertNotIsInstance(WhyWouldYouDoThis(), protocol_class) + + def test_protocols_isinstance___slots__(self): + # As per the consensus in https://github.com/python/typing/issues/1367, + # this is desirable behaviour + @runtime_checkable + class HasX(Protocol): + x: int + + class HasNothingButSlots: + __slots__ = ("x",) + + self.assertIsInstance(HasNothingButSlots(), HasX) + def test_protocols_isinstance_py36(self): class APoint: def __init__(self, x, y, label): diff --git a/Lib/typing.py b/Lib/typing.py index a88542cfbaecd5..442d684d14c928 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1998,6 +1998,17 @@ def _allow_reckless_class_checks(depth=3): } +@functools.cache +def _lazy_load_getattr_static(): + # Import getattr_static lazily so as not to slow down the import of typing.py + # Cache the result so we don't slow down _ProtocolMeta.__instancecheck__ unnecessarily + from inspect import getattr_static + return getattr_static + + +_cleanups.append(_lazy_load_getattr_static.cache_clear) + + class _ProtocolMeta(ABCMeta): # This metaclass is really unfortunate and exists only because of # the lack of __instancehook__. @@ -2025,12 +2036,17 @@ def __instancecheck__(cls, instance): return True if is_protocol_cls: - if all(hasattr(instance, attr) and - # All *methods* can be blocked by setting them to None. - (not callable(getattr(cls, attr, None)) or - getattr(instance, attr) is not None) - for attr in protocol_attrs): + getattr_static = _lazy_load_getattr_static() + for attr in protocol_attrs: + try: + val = getattr_static(instance, attr) + except AttributeError: + break + if callable(getattr(cls, attr, None)) and val is None: + break + else: return True + return super().__instancecheck__(instance) diff --git a/Misc/NEWS.d/next/Library/2023-03-25-16-57-18.gh-issue-102433.L-7x2Q.rst b/Misc/NEWS.d/next/Library/2023-03-25-16-57-18.gh-issue-102433.L-7x2Q.rst new file mode 100644 index 00000000000000..a4de4b4448f391 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-03-25-16-57-18.gh-issue-102433.L-7x2Q.rst @@ -0,0 +1,10 @@ +:func:`isinstance` checks against :func:`runtime-checkable protocols +` now use :func:`inspect.getattr_static` rather +than :func:`hasattr` to lookup whether attributes exist. This means that +descriptors and :meth:`~object.__getattr__` methods are no longer +unexpectedly evaluated during ``isinstance()`` checks against +runtime-checkable protocols. However, it may also mean that some objects +which used to be considered instances of a runtime-checkable protocol may no +longer be considered instances of that protocol on Python 3.12+, and vice +versa. Most users are unlikely to be affected by this change. Patch by Alex +Waygood. From a0305c5fdfdef7a362d0262c54399c4a6013d1ea Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Mon, 3 Apr 2023 00:25:46 +0900 Subject: [PATCH 040/349] fix typo in _ssl.c (GH-103192) seperated -> separated Automerge-Triggered-By: GH:AlexWaygood --- Modules/_ssl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 3fbb37332f67d3..e0351a89e6a1e9 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -2006,7 +2006,7 @@ _ssl__SSLSocket_shared_ciphers_impl(PySSLSocket *self) /* Rather than use SSL_get_shared_ciphers, we use an equivalent algorithm because: - 1) It returns a colon seperated list of strings, in an undefined + 1) It returns a colon separated list of strings, in an undefined order, that we would have to post process back into tuples. 2) It will return a truncated string with no indication that it has done so, if the buffer is too small. From 6883007a86bdf0d7cf4560b949fd5e577dab1013 Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Mon, 3 Apr 2023 00:12:51 +0200 Subject: [PATCH 041/349] bpo-4080: unittest durations (#12271) --- Doc/library/unittest.rst | 42 ++++++++++-- Doc/whatsnew/3.12.rst | 21 ++++++ Lib/test/test_unittest/support.py | 16 +++++ Lib/test/test_unittest/test_break.py | 7 +- Lib/test/test_unittest/test_program.py | 9 ++- Lib/test/test_unittest/test_result.py | 18 +---- Lib/test/test_unittest/test_runner.py | 67 ++++++++++++++++++- Lib/unittest/case.py | 12 ++++ Lib/unittest/main.py | 12 +++- Lib/unittest/result.py | 7 ++ Lib/unittest/runner.py | 42 +++++++++++- ...2-11-24-13-23-07.gh-issue-48330.6uAX9F.rst | 8 +++ 12 files changed, 227 insertions(+), 34 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2022-11-24-13-23-07.gh-issue-48330.6uAX9F.rst diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 1577149e976474..d1a977fd7da6a5 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -244,6 +244,10 @@ Command-line options Show local variables in tracebacks. +.. cmdoption:: --durations N + + Show the N slowest test cases (N=0 for all). + .. versionadded:: 3.2 The command-line options ``-b``, ``-c`` and ``-f`` were added. @@ -253,10 +257,12 @@ Command-line options .. versionadded:: 3.7 The command-line option ``-k``. +.. versionadded:: 3.12 + The command-line option ``--durations``. + The command line can also be used for test discovery, for running all of the tests in a project or just a subset. - .. _unittest-test-discovery: Test Discovery @@ -2009,6 +2015,13 @@ Loading and running tests A list containing :class:`TestCase` instances that were marked as expected failures, but succeeded. + .. attribute:: collectedDurations + + A list containing 2-tuples of :class:`TestCase` instances and floats + representing the elapsed time of each test which was run. + + .. versionadded:: 3.12 + .. attribute:: shouldStop Set to ``True`` when the execution of tests should stop by :meth:`stop`. @@ -2160,14 +2173,27 @@ Loading and running tests .. versionadded:: 3.4 + .. method:: addDuration(test, elapsed) + + Called when the test case finishes. *elapsed* is the time represented in + seconds, and it includes the execution of cleanup functions. + + .. versionadded:: 3.12 -.. class:: TextTestResult(stream, descriptions, verbosity) +.. class:: TextTestResult(stream, descriptions, verbosity, *, durations=None) A concrete implementation of :class:`TestResult` used by the - :class:`TextTestRunner`. + :class:`TextTestRunner`. Subclasses should accept ``**kwargs`` to ensure + compatibility as the interface changes. .. versionadded:: 3.2 + .. versionadded:: 3.12 + Added *durations* keyword argument. + + .. versionchanged:: 3.12 + Subclasses should accept ``**kwargs`` to ensure compatibility as the + interface changes. .. data:: defaultTestLoader @@ -2177,7 +2203,8 @@ Loading and running tests .. class:: TextTestRunner(stream=None, descriptions=True, verbosity=1, failfast=False, \ - buffer=False, resultclass=None, warnings=None, *, tb_locals=False) + buffer=False, resultclass=None, warnings=None, *, \ + tb_locals=False, durations=None) A basic test runner implementation that outputs results to a stream. If *stream* is ``None``, the default, :data:`sys.stderr` is used as the output stream. This class @@ -2195,14 +2222,17 @@ Loading and running tests *warnings* to ``None``. .. versionchanged:: 3.2 - Added the ``warnings`` argument. + Added the *warnings* parameter. .. versionchanged:: 3.2 The default stream is set to :data:`sys.stderr` at instantiation time rather than import time. .. versionchanged:: 3.5 - Added the tb_locals parameter. + Added the *tb_locals* parameter. + + .. versionchanged:: 3.12 + Added the *durations* parameter. .. method:: _makeResult() diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 93543cb0790fba..3df3ef711a90e5 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -371,6 +371,27 @@ unicodedata * The Unicode database has been updated to version 15.0.0. (Contributed by Benjamin Peterson in :gh:`96734`). +unittest +-------- + +Added ``--durations`` command line option, showing the N slowest test cases:: + + python3 -m unittest --durations=3 lib.tests.test_threading + ..... + Slowest test durations + ---------------------------------------------------------------------- + 1.210s test_timeout (Lib.test.test_threading.BarrierTests) + 1.003s test_default_timeout (Lib.test.test_threading.BarrierTests) + 0.518s test_timeout (Lib.test.test_threading.EventTests) + + (0.000 durations hidden. Use -v to show these durations.) + ---------------------------------------------------------------------- + Ran 158 tests in 9.869s + + OK (skipped=3) + +(Contributed by Giampaolo Rodola in :issue:`4080`) + uuid ---- diff --git a/Lib/test/test_unittest/support.py b/Lib/test/test_unittest/support.py index 529265304f2882..8c97bf5c7297fe 100644 --- a/Lib/test/test_unittest/support.py +++ b/Lib/test/test_unittest/support.py @@ -136,3 +136,19 @@ def addSuccess(self, test): def wasSuccessful(self): return True + + +class BufferedWriter: + def __init__(self): + self.result = '' + self.buffer = '' + + def write(self, arg): + self.buffer += arg + + def flush(self): + self.result += self.buffer + self.buffer = '' + + def getvalue(self): + return self.result diff --git a/Lib/test/test_unittest/test_break.py b/Lib/test/test_unittest/test_break.py index 33cbdd2661c17e..1da98af3e74d49 100644 --- a/Lib/test/test_unittest/test_break.py +++ b/Lib/test/test_unittest/test_break.py @@ -236,6 +236,7 @@ def __init__(self, catchbreak): self.testRunner = FakeRunner self.test = test self.result = None + self.durations = None p = Program(False) p.runTests() @@ -244,7 +245,8 @@ def __init__(self, catchbreak): 'verbosity': verbosity, 'failfast': failfast, 'tb_locals': False, - 'warnings': None})]) + 'warnings': None, + 'durations': None})]) self.assertEqual(FakeRunner.runArgs, [test]) self.assertEqual(p.result, result) @@ -259,7 +261,8 @@ def __init__(self, catchbreak): 'verbosity': verbosity, 'failfast': failfast, 'tb_locals': False, - 'warnings': None})]) + 'warnings': None, + 'durations': None})]) self.assertEqual(FakeRunner.runArgs, [test]) self.assertEqual(p.result, result) diff --git a/Lib/test/test_unittest/test_program.py b/Lib/test/test_unittest/test_program.py index 3645bcf4b43562..f138f6836514e0 100644 --- a/Lib/test/test_unittest/test_program.py +++ b/Lib/test/test_unittest/test_program.py @@ -284,6 +284,7 @@ def testRunTestsRunnerClass(self): program.failfast = 'failfast' program.buffer = 'buffer' program.warnings = 'warnings' + program.durations = '5' program.runTests() @@ -291,7 +292,8 @@ def testRunTestsRunnerClass(self): 'failfast': 'failfast', 'buffer': 'buffer', 'tb_locals': False, - 'warnings': 'warnings'}) + 'warnings': 'warnings', + 'durations': '5'}) self.assertEqual(FakeRunner.test, 'test') self.assertIs(program.result, RESULT) @@ -320,7 +322,8 @@ def test_locals(self): 'failfast': False, 'tb_locals': True, 'verbosity': 1, - 'warnings': None}) + 'warnings': None, + 'durations': None}) def testRunTestsOldRunnerClass(self): program = self.program @@ -333,6 +336,7 @@ def testRunTestsOldRunnerClass(self): program.failfast = 'failfast' program.buffer = 'buffer' program.test = 'test' + program.durations = '0' program.runTests() @@ -356,6 +360,7 @@ def fakeInstallHandler(): program = self.program program.catchbreak = True + program.durations = None program.testRunner = FakeRunner diff --git a/Lib/test/test_unittest/test_result.py b/Lib/test/test_unittest/test_result.py index efd9c902350506..37d0fe12409ea4 100644 --- a/Lib/test/test_unittest/test_result.py +++ b/Lib/test/test_unittest/test_result.py @@ -6,7 +6,9 @@ import traceback import unittest +from unittest import mock from unittest.util import strclass +from test.test_unittest.support import BufferedWriter class MockTraceback(object): @@ -33,22 +35,6 @@ def bad_cleanup2(): raise ValueError('bad cleanup2') -class BufferedWriter: - def __init__(self): - self.result = '' - self.buffer = '' - - def write(self, arg): - self.buffer += arg - - def flush(self): - self.result += self.buffer - self.buffer = '' - - def getvalue(self): - return self.result - - class Test_TestResult(unittest.TestCase): # Note: there are not separate tests for TestResult.wasSuccessful(), # TestResult.errors, TestResult.failures, TestResult.testsRun or diff --git a/Lib/test/test_unittest/test_runner.py b/Lib/test/test_unittest/test_runner.py index df584b7620d092..1ce42a106c5883 100644 --- a/Lib/test/test_unittest/test_runner.py +++ b/Lib/test/test_unittest/test_runner.py @@ -8,8 +8,11 @@ import unittest from unittest.case import _Outcome -from test.test_unittest.support import (LoggingResult, - ResultWithNoStartTestRunStopTestRun) +from test.test_unittest.support import ( + BufferedWriter, + LoggingResult, + ResultWithNoStartTestRunStopTestRun, +) def resultFactory(*_): @@ -1176,6 +1179,7 @@ def test_init(self): self.assertTrue(runner.descriptions) self.assertEqual(runner.resultclass, unittest.TextTestResult) self.assertFalse(runner.tb_locals) + self.assertIsNone(runner.durations) def test_multiple_inheritance(self): class AResult(unittest.TestResult): @@ -1362,6 +1366,65 @@ def testSpecifiedStreamUsed(self): runner = unittest.TextTestRunner(f) self.assertTrue(runner.stream.stream is f) + def test_durations(self): + def run(test, expect_durations): + stream = BufferedWriter() + runner = unittest.TextTestRunner(stream=stream, durations=5, verbosity=2) + result = runner.run(test) + self.assertEqual(result.durations, 5) + stream.flush() + text = stream.getvalue() + regex = r"\n\d+.\d\d\ds" + if expect_durations: + self.assertEqual(len(result.collectedDurations), 1) + self.assertIn('Slowest test durations', text) + self.assertRegex(text, regex) + else: + self.assertEqual(len(result.collectedDurations), 0) + self.assertNotIn('Slowest test durations', text) + self.assertNotRegex(text, regex) + + # success + class Foo(unittest.TestCase): + def test_1(self): + pass + + run(Foo('test_1'), True) + + # failure + class Foo(unittest.TestCase): + def test_1(self): + self.assertEqual(0, 1) + + run(Foo('test_1'), True) + + # error + class Foo(unittest.TestCase): + def test_1(self): + 1 / 0 + + run(Foo('test_1'), True) + + + # error in setUp and tearDown + class Foo(unittest.TestCase): + def setUp(self): + 1 / 0 + tearDown = setUp + def test_1(self): + pass + + run(Foo('test_1'), True) + + # skip (expect no durations) + class Foo(unittest.TestCase): + @unittest.skip("reason") + def test_1(self): + pass + + run(Foo('test_1'), False) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 5167c5f843f085..018f22e7ce0c73 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -9,6 +9,7 @@ import collections import contextlib import traceback +import time import types from . import result @@ -572,6 +573,15 @@ def _addUnexpectedSuccess(self, result): else: addUnexpectedSuccess(self) + def _addDuration(self, result, elapsed): + try: + addDuration = result.addDuration + except AttributeError: + warnings.warn("TestResult has no addDuration method", + RuntimeWarning) + else: + addDuration(self, elapsed) + def _callSetUp(self): self.setUp() @@ -612,6 +622,7 @@ def run(self, result=None): getattr(testMethod, "__unittest_expecting_failure__", False) ) outcome = _Outcome(result) + start_time = time.perf_counter() try: self._outcome = outcome @@ -625,6 +636,7 @@ def run(self, result=None): with outcome.testPartExecutor(self): self._callTearDown() self.doCleanups() + self._addDuration(result, (time.perf_counter() - start_time)) if outcome.success: if expecting_failure: diff --git a/Lib/unittest/main.py b/Lib/unittest/main.py index 046fbd3a45dcf8..0792750ffd9e0d 100644 --- a/Lib/unittest/main.py +++ b/Lib/unittest/main.py @@ -66,7 +66,8 @@ class TestProgram(object): def __init__(self, module='__main__', defaultTest=None, argv=None, testRunner=None, testLoader=loader.defaultTestLoader, exit=True, verbosity=1, failfast=None, catchbreak=None, - buffer=None, warnings=None, *, tb_locals=False): + buffer=None, warnings=None, *, tb_locals=False, + durations=None): if isinstance(module, str): self.module = __import__(module) for part in module.split('.')[1:]: @@ -82,6 +83,7 @@ def __init__(self, module='__main__', defaultTest=None, argv=None, self.verbosity = verbosity self.buffer = buffer self.tb_locals = tb_locals + self.durations = durations if warnings is None and not sys.warnoptions: # even if DeprecationWarnings are ignored by default # print them anyway unless other warnings settings are @@ -178,6 +180,9 @@ def _getParentArgParser(self): parser.add_argument('--locals', dest='tb_locals', action='store_true', help='Show local variables in tracebacks') + parser.add_argument('--durations', dest='durations', type=int, + default=None, metavar="N", + help='Show the N slowest test cases (N=0 for all)') if self.failfast is None: parser.add_argument('-f', '--failfast', dest='failfast', action='store_true', @@ -258,9 +263,10 @@ def runTests(self): failfast=self.failfast, buffer=self.buffer, warnings=self.warnings, - tb_locals=self.tb_locals) + tb_locals=self.tb_locals, + durations=self.durations) except TypeError: - # didn't accept the tb_locals argument + # didn't accept the tb_locals or durations argument testRunner = self.testRunner(verbosity=self.verbosity, failfast=self.failfast, buffer=self.buffer, diff --git a/Lib/unittest/result.py b/Lib/unittest/result.py index 5ca4c23238b419..fa9bea47c88829 100644 --- a/Lib/unittest/result.py +++ b/Lib/unittest/result.py @@ -43,6 +43,7 @@ def __init__(self, stream=None, descriptions=None, verbosity=None): self.skipped = [] self.expectedFailures = [] self.unexpectedSuccesses = [] + self.collectedDurations = [] self.shouldStop = False self.buffer = False self.tb_locals = False @@ -157,6 +158,12 @@ def addUnexpectedSuccess(self, test): """Called when a test was expected to fail, but succeed.""" self.unexpectedSuccesses.append(test) + def addDuration(self, test, elapsed): + """Called when a test finished to run, regardless of its outcome.""" + # support for a TextTestRunner using an old TestResult class + if hasattr(self, "collectedDurations"): + self.collectedDurations.append((test, elapsed)) + def wasSuccessful(self): """Tells whether or not this result was a success.""" # The hasattr check is for test_result's OldResult test. That diff --git a/Lib/unittest/runner.py b/Lib/unittest/runner.py index 6678adb6a7d813..a51c5c562df09d 100644 --- a/Lib/unittest/runner.py +++ b/Lib/unittest/runner.py @@ -35,13 +35,16 @@ class TextTestResult(result.TestResult): separator1 = '=' * 70 separator2 = '-' * 70 - def __init__(self, stream, descriptions, verbosity): + def __init__(self, stream, descriptions, verbosity, *, durations=None): + """Construct a TextTestResult. Subclasses should accept **kwargs + to ensure compatibility as the interface changes.""" super(TextTestResult, self).__init__(stream, descriptions, verbosity) self.stream = stream self.showAll = verbosity > 1 self.dots = verbosity == 1 self.descriptions = descriptions self._newline = True + self.durations = durations def getDescription(self, test): doc_first_line = test.shortDescription() @@ -168,7 +171,7 @@ class TextTestRunner(object): def __init__(self, stream=None, descriptions=True, verbosity=1, failfast=False, buffer=False, resultclass=None, warnings=None, - *, tb_locals=False): + *, tb_locals=False, durations=None): """Construct a TextTestRunner. Subclasses should accept **kwargs to ensure compatibility as the @@ -182,12 +185,41 @@ def __init__(self, stream=None, descriptions=True, verbosity=1, self.failfast = failfast self.buffer = buffer self.tb_locals = tb_locals + self.durations = durations self.warnings = warnings if resultclass is not None: self.resultclass = resultclass def _makeResult(self): - return self.resultclass(self.stream, self.descriptions, self.verbosity) + try: + return self.resultclass(self.stream, self.descriptions, + self.verbosity, durations=self.durations) + except TypeError: + # didn't accept the durations argument + return self.resultclass(self.stream, self.descriptions, + self.verbosity) + + def _printDurations(self, result): + if not result.collectedDurations: + return + ls = sorted(result.collectedDurations, key=lambda x: x[1], + reverse=True) + if self.durations > 0: + ls = ls[:self.durations] + self.stream.writeln("Slowest test durations") + if hasattr(result, 'separator2'): + self.stream.writeln(result.separator2) + hidden = False + for test, elapsed in ls: + if self.verbosity < 2 and elapsed < 0.001: + hidden = True + continue + self.stream.writeln("%-10s %s" % ("%.3fs" % elapsed, test)) + if hidden: + self.stream.writeln("\n(durations < 0.001s were hidden; " + "use -v to show these durations)") + else: + self.stream.writeln("") def run(self, test): "Run the given test case or test suite." @@ -213,8 +245,12 @@ def run(self, test): stopTime = time.perf_counter() timeTaken = stopTime - startTime result.printErrors() + if self.durations is not None: + self._printDurations(result) + if hasattr(result, 'separator2'): self.stream.writeln(result.separator2) + run = result.testsRun self.stream.writeln("Ran %d test%s in %.3fs" % (run, run != 1 and "s" or "", timeTaken)) diff --git a/Misc/NEWS.d/next/Library/2022-11-24-13-23-07.gh-issue-48330.6uAX9F.rst b/Misc/NEWS.d/next/Library/2022-11-24-13-23-07.gh-issue-48330.6uAX9F.rst new file mode 100644 index 00000000000000..5b63a0a6b96dfa --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-11-24-13-23-07.gh-issue-48330.6uAX9F.rst @@ -0,0 +1,8 @@ +Added ``--durations`` command line option, showing the N slowest test cases. +:class:`unittest.TextTestRunner` and :class:`unittest.TextTestResult` +constructors accept a new *durations* keyword argument. Subclasses should take +this into account or accept ``**kwargs``. Added +:meth:`unittest.TestResult.addDuration` method and +:attr:`unittest.TestResult.collectedDurations` attribute. + +(Contributed by Giampaolo Rodola) From 32937d6aa414ec7db5c63ef277f21db1880b3af4 Mon Sep 17 00:00:00 2001 From: Charlie Zhao Date: Mon, 3 Apr 2023 06:18:25 +0800 Subject: [PATCH 042/349] gh-103109: Document ignore_warnings() test support helper (#103110) Co-authored-by: C.A.M. Gerlach --- Doc/library/test.rst | 15 +++++++++++++++ Lib/test/support/warnings_helper.py | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Doc/library/test.rst b/Doc/library/test.rst index c60b4da75d1acb..20f633b8f569be 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -1691,6 +1691,21 @@ The :mod:`test.support.warnings_helper` module provides support for warnings tes .. versionadded:: 3.10 +.. function:: ignore_warnings(*, category) + + Suppress warnings that are instances of *category*, + which must be :exc:`Warning` or a subclass. + Roughly equivalent to :func:`warnings.catch_warnings` + with :meth:`warnings.simplefilter('ignore', category=category) `. + For example:: + + @warning_helper.ignore_warnings(category=DeprecationWarning) + def test_suppress_warning(): + # do something + + .. versionadded:: 3.8 + + .. function:: check_no_resource_warning(testcase) Context manager to check that no :exc:`ResourceWarning` was raised. You diff --git a/Lib/test/support/warnings_helper.py b/Lib/test/support/warnings_helper.py index 28e96f88b24441..c1bf0562300678 100644 --- a/Lib/test/support/warnings_helper.py +++ b/Lib/test/support/warnings_helper.py @@ -44,7 +44,7 @@ def check_syntax_warning(testcase, statement, errtext='', def ignore_warnings(*, category): - """Decorator to suppress deprecation warnings. + """Decorator to suppress warnings. Use of context managers to hide warnings make diffs more noisy and tools like 'git blame' less useful. From 55decb72c4d2e4ea00ed13da5dd0fd22cecb9083 Mon Sep 17 00:00:00 2001 From: Nouran Ali Date: Mon, 3 Apr 2023 00:44:16 +0200 Subject: [PATCH 043/349] gh-102994: Profile docs has typo in example (#103074) --- Doc/library/profile.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst index c2189e02656c7a..723f927135a0f4 100644 --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -82,7 +82,7 @@ the following:: The first line indicates that 214 calls were monitored. Of those calls, 207 were :dfn:`primitive`, meaning that the call was not induced via recursion. The -next line: ``Ordered by: cumulative name``, indicates that the text string in the +next line: ``Ordered by: cumulative time``, indicates that the text string in the far right column was used to sort the output. The column headings include: ncalls From 385b5d6e091da454c3e0d3f7271acf3af26d8532 Mon Sep 17 00:00:00 2001 From: Shantanu <12621235+hauntsaninja@users.noreply.github.com> Date: Sun, 2 Apr 2023 15:47:31 -0700 Subject: [PATCH 044/349] gh-102038: Skip a sometimes unnecessary stat in site.py (#102039) --- Lib/site.py | 21 +++++++++++-------- ...-02-19-01-49-46.gh-issue-102038.n3if3D.rst | 1 + 2 files changed, 13 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-02-19-01-49-46.gh-issue-102038.n3if3D.rst diff --git a/Lib/site.py b/Lib/site.py index 5c1ff31f4e0f9e..672fa7b000ad02 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -492,20 +492,23 @@ def venv(known_paths): executable = sys._base_executable = os.environ['__PYVENV_LAUNCHER__'] else: executable = sys.executable - exe_dir, _ = os.path.split(os.path.abspath(executable)) + exe_dir = os.path.dirname(os.path.abspath(executable)) site_prefix = os.path.dirname(exe_dir) sys._home = None conf_basename = 'pyvenv.cfg' - candidate_confs = [ - conffile for conffile in ( - os.path.join(exe_dir, conf_basename), - os.path.join(site_prefix, conf_basename) + candidate_conf = next( + ( + conffile for conffile in ( + os.path.join(exe_dir, conf_basename), + os.path.join(site_prefix, conf_basename) ) - if os.path.isfile(conffile) - ] + if os.path.isfile(conffile) + ), + None + ) - if candidate_confs: - virtual_conf = candidate_confs[0] + if candidate_conf: + virtual_conf = candidate_conf system_site = "true" # Issue 25185: Use UTF-8, as that's what the venv module uses when # writing the file. diff --git a/Misc/NEWS.d/next/Library/2023-02-19-01-49-46.gh-issue-102038.n3if3D.rst b/Misc/NEWS.d/next/Library/2023-02-19-01-49-46.gh-issue-102038.n3if3D.rst new file mode 100644 index 00000000000000..40df20cb596049 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-02-19-01-49-46.gh-issue-102038.n3if3D.rst @@ -0,0 +1 @@ +Skip a ``stat`` in :mod:`site` if we have already found a ``pyvenv.cfg`` From e6f7d35be7fb65d8624e9411251554c9dee0c931 Mon Sep 17 00:00:00 2001 From: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> Date: Mon, 3 Apr 2023 18:14:32 +0530 Subject: [PATCH 045/349] GH-103182: use vectorcall in `_asyncio` instead of variadic calling APIs (#103175) --- Modules/_asynciomodule.c | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 13d98eedf32f0e..2476dca6f58ebf 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -355,33 +355,26 @@ call_soon(asyncio_state *state, PyObject *loop, PyObject *func, PyObject *arg, PyObject *ctx) { PyObject *handle; - PyObject *stack[3]; - Py_ssize_t nargs; if (ctx == NULL) { - handle = PyObject_CallMethodObjArgs( - loop, &_Py_ID(call_soon), func, arg, NULL); + PyObject *stack[] = {loop, func, arg}; + size_t nargsf = 3 | PY_VECTORCALL_ARGUMENTS_OFFSET; + handle = PyObject_VectorcallMethod(&_Py_ID(call_soon), stack, nargsf, NULL); } else { - /* Use FASTCALL to pass a keyword-only argument to call_soon */ - - PyObject *callable = PyObject_GetAttr(loop, &_Py_ID(call_soon)); - if (callable == NULL) { - return -1; - } - /* All refs in 'stack' are borrowed. */ - nargs = 1; - stack[0] = func; + PyObject *stack[4]; + size_t nargs = 2; + stack[0] = loop; + stack[1] = func; if (arg != NULL) { - stack[1] = arg; + stack[2] = arg; nargs++; } stack[nargs] = (PyObject *)ctx; - EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, callable); - handle = PyObject_Vectorcall(callable, stack, nargs, - state->context_kwname); - Py_DECREF(callable); + size_t nargsf = nargs | PY_VECTORCALL_ARGUMENTS_OFFSET; + handle = PyObject_VectorcallMethod(&_Py_ID(call_soon), stack, nargsf, + state->context_kwname); } if (handle == NULL) { @@ -2359,8 +2352,9 @@ _asyncio_Task_get_stack_impl(TaskObj *self, PyTypeObject *cls, /*[clinic end generated code: output=6774dfc10d3857fa input=8e01c9b2618ae953]*/ { asyncio_state *state = get_asyncio_state_by_cls(cls); - return PyObject_CallFunctionObjArgs( - state->asyncio_task_get_stack_func, self, limit, NULL); + PyObject *stack[] = {(PyObject *)self, limit}; + return PyObject_Vectorcall(state->asyncio_task_get_stack_func, + stack, 2, NULL); } /*[clinic input] @@ -2387,8 +2381,9 @@ _asyncio_Task_print_stack_impl(TaskObj *self, PyTypeObject *cls, /*[clinic end generated code: output=b38affe9289ec826 input=150b35ba2d3a7dee]*/ { asyncio_state *state = get_asyncio_state_by_cls(cls); - return PyObject_CallFunctionObjArgs( - state->asyncio_task_print_stack_func, self, limit, file, NULL); + PyObject *stack[] = {(PyObject *)self, limit, file}; + return PyObject_Vectorcall(state->asyncio_task_print_stack_func, + stack, 3, NULL); } /*[clinic input] From 2a721258a199e9bcdcee2069719ad9c8f8c0d030 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Mon, 3 Apr 2023 18:35:04 +0300 Subject: [PATCH 046/349] gh-101865: Deprecate `co_lnotab` from code objects as per PEP 626 (#101866) Co-authored-by: Oleg Iarygin --- Doc/reference/datamodel.rst | 3 ++- Doc/whatsnew/3.12.rst | 6 ++++++ Lib/test/test_code.py | 7 +++++++ .../2023-02-21-17-22-06.gh-issue-101865.fwrTOA.rst | 2 ++ Objects/codeobject.c | 5 +++++ 5 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-02-21-17-22-06.gh-issue-101865.fwrTOA.rst diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 1865d09fcaa127..a09d5529c8c6f9 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -991,7 +991,8 @@ Internal types the filename from which the code was compiled; :attr:`co_firstlineno` is the first line number of the function; :attr:`co_lnotab` is a string encoding the mapping from bytecode offsets to line numbers (for details - see the source code of the interpreter); :attr:`co_stacksize` is the + see the source code of the interpreter, is deprecated since 3.12 + and may be removed in 3.14); :attr:`co_stacksize` is the required stack size; :attr:`co_flags` is an integer encoding a number of flags for the interpreter. diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 3df3ef711a90e5..88b99828f0beeb 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -622,6 +622,12 @@ Pending Removal in Python 3.14 functions that have been deprecated since Python 2 but only gained a proper :exc:`DeprecationWarning` in 3.12. Remove them in 3.14. +* Accessing ``co_lnotab`` was deprecated in :pep:`626` since 3.10 + and was planned to be removed in 3.12 + but it only got a proper :exc:`DeprecationWarning` in 3.12. + May be removed in 3.14. + (Contributed by Nikita Sobolev in :gh:`101866`.) + * The *onerror* argument of :func:`shutil.rmtree` is deprecated in 3.12, and will be removed in 3.14. diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 0cd1fb3f9728e5..7543c9ab342119 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -338,6 +338,13 @@ def func(): new_code = code = func.__code__.replace(co_linetable=b'') self.assertEqual(list(new_code.co_lines()), []) + def test_co_lnotab_is_deprecated(self): # TODO: remove in 3.14 + def func(): + pass + + with self.assertWarns(DeprecationWarning): + func.__code__.co_lnotab + def test_invalid_bytecode(self): def foo(): pass diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-02-21-17-22-06.gh-issue-101865.fwrTOA.rst b/Misc/NEWS.d/next/Core and Builtins/2023-02-21-17-22-06.gh-issue-101865.fwrTOA.rst new file mode 100644 index 00000000000000..876cc223a0e727 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-02-21-17-22-06.gh-issue-101865.fwrTOA.rst @@ -0,0 +1,2 @@ +Deprecate ``co_lnotab`` in code objects, schedule it for removal in Python +3.14 diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 65b1d258fb76af..755d0b85e7cf30 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -1921,6 +1921,11 @@ static PyMemberDef code_memberlist[] = { static PyObject * code_getlnotab(PyCodeObject *code, void *closure) { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "co_lnotab is deprecated, use co_lines instead.", + 1) < 0) { + return NULL; + } return decode_linetable(code); } From 11c302055a2aab5373c2829d1a8610a64e72ab24 Mon Sep 17 00:00:00 2001 From: Barney Gale Date: Mon, 3 Apr 2023 19:57:11 +0100 Subject: [PATCH 047/349] GH-76846, GH-85281: Call `__new__()` and `__init__()` on pathlib subclasses (GH-102789) Fix an issue where `__new__()` and `__init__()` were not called on subclasses of `pathlib.PurePath` and `Path` in some circumstances. Paths are now normalized on-demand. This speeds up path construction, `p.joinpath(q)`, and `p / q`. Co-authored-by: Steve Dower --- Lib/pathlib.py | 145 ++++++++++-------- Lib/test/test_pathlib.py | 27 +++- ...3-03-17-19-14-26.gh-issue-76846.KEamjK.rst | 3 + 3 files changed, 107 insertions(+), 68 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-03-17-19-14-26.gh-issue-76846.KEamjK.rst diff --git a/Lib/pathlib.py b/Lib/pathlib.py index a126bf2fe5570a..490f89f39d26d1 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -16,7 +16,6 @@ import warnings from _collections_abc import Sequence from errno import ENOENT, ENOTDIR, EBADF, ELOOP -from operator import attrgetter from stat import S_ISDIR, S_ISLNK, S_ISREG, S_ISSOCK, S_ISBLK, S_ISCHR, S_ISFIFO from urllib.parse import quote_from_bytes as urlquote_from_bytes @@ -216,8 +215,8 @@ class _PathParents(Sequence): def __init__(self, path): # We don't store the instance to avoid reference cycles self._pathcls = type(path) - self._drv = path._drv - self._root = path._root + self._drv = path.drive + self._root = path.root self._parts = path._parts def __len__(self): @@ -251,12 +250,12 @@ class PurePath(object): directly, regardless of your system. """ __slots__ = ( - '_drv', '_root', '_parts', + '_raw_path', '_drv', '_root', '_parts_cached', '_str', '_hash', '_parts_tuple', '_parts_normcase_cached', ) _flavour = os.path - def __new__(cls, *args): + def __new__(cls, *args, **kwargs): """Construct a PurePath from one or several strings and or existing PurePath objects. The strings and path objects are combined so as to yield a canonicalized path, which is incorporated into the @@ -264,23 +263,20 @@ def __new__(cls, *args): """ if cls is PurePath: cls = PureWindowsPath if os.name == 'nt' else PurePosixPath - return cls._from_parts(args) + return object.__new__(cls) def __reduce__(self): # Using the parts tuple helps share interned path parts # when pickling related paths. - return (self.__class__, tuple(self._parts)) + return (self.__class__, self.parts) - @classmethod - def _parse_parts(cls, parts): - if not parts: - return '', '', [] - elif len(parts) == 1: - path = os.fspath(parts[0]) + def __init__(self, *args): + if not args: + path = '' + elif len(args) == 1: + path = os.fspath(args[0]) else: - path = cls._flavour.join(*parts) - sep = cls._flavour.sep - altsep = cls._flavour.altsep + path = self._flavour.join(*args) if isinstance(path, str): # Force-cast str subclasses to str (issue #21127) path = str(path) @@ -289,6 +285,14 @@ def _parse_parts(cls, parts): "argument should be a str or an os.PathLike " "object where __fspath__ returns a str, " f"not {type(path).__name__!r}") + self._raw_path = path + + @classmethod + def _parse_path(cls, path): + if not path: + return '', '', [] + sep = cls._flavour.sep + altsep = cls._flavour.altsep if altsep: path = path.replace(altsep, sep) drv, root, rel = cls._flavour.splitroot(path) @@ -299,21 +303,20 @@ def _parse_parts(cls, parts): parsed = [sys.intern(x) for x in unfiltered_parsed if x and x != '.'] return drv, root, parsed - @classmethod - def _from_parts(cls, args): - self = object.__new__(cls) - drv, root, parts = self._parse_parts(args) + def _load_parts(self): + drv, root, parts = self._parse_path(self._raw_path) self._drv = drv self._root = root - self._parts = parts - return self + self._parts_cached = parts @classmethod def _from_parsed_parts(cls, drv, root, parts): - self = object.__new__(cls) + path = cls._format_parsed_parts(drv, root, parts) + self = cls(path) + self._str = path or '.' self._drv = drv self._root = root - self._parts = parts + self._parts_cached = parts return self @classmethod @@ -330,7 +333,7 @@ def __str__(self): try: return self._str except AttributeError: - self._str = self._format_parsed_parts(self._drv, self._root, + self._str = self._format_parsed_parts(self.drive, self.root, self._parts) or '.' return self._str @@ -356,7 +359,7 @@ def as_uri(self): if not self.is_absolute(): raise ValueError("relative path can't be expressed as a file URI") - drive = self._drv + drive = self.drive if len(drive) == 2 and drive[1] == ':': # It's a path on a local drive => 'file:///c:/a/b' prefix = 'file:///' + drive @@ -412,23 +415,43 @@ def __ge__(self, other): return NotImplemented return self._parts_normcase >= other._parts_normcase - drive = property(attrgetter('_drv'), - doc="""The drive prefix (letter or UNC path), if any.""") + @property + def drive(self): + """The drive prefix (letter or UNC path), if any.""" + try: + return self._drv + except AttributeError: + self._load_parts() + return self._drv + + @property + def root(self): + """The root of the path, if any.""" + try: + return self._root + except AttributeError: + self._load_parts() + return self._root - root = property(attrgetter('_root'), - doc="""The root of the path, if any.""") + @property + def _parts(self): + try: + return self._parts_cached + except AttributeError: + self._load_parts() + return self._parts_cached @property def anchor(self): """The concatenation of the drive and root, or ''.""" - anchor = self._drv + self._root + anchor = self.drive + self.root return anchor @property def name(self): """The final path component, if any.""" parts = self._parts - if len(parts) == (1 if (self._drv or self._root) else 0): + if len(parts) == (1 if (self.drive or self.root) else 0): return '' return parts[-1] @@ -477,7 +500,7 @@ def with_name(self, name): drv, root, tail = f.splitroot(name) if drv or root or not tail or f.sep in tail or (f.altsep and f.altsep in tail): raise ValueError("Invalid name %r" % (name)) - return self._from_parsed_parts(self._drv, self._root, + return self._from_parsed_parts(self.drive, self.root, self._parts[:-1] + [name]) def with_stem(self, stem): @@ -502,7 +525,7 @@ def with_suffix(self, suffix): name = name + suffix else: name = name[:-len(old_suffix)] + suffix - return self._from_parsed_parts(self._drv, self._root, + return self._from_parsed_parts(self.drive, self.root, self._parts[:-1] + [name]) def relative_to(self, other, /, *_deprecated, walk_up=False): @@ -561,22 +584,7 @@ def joinpath(self, *args): paths) or a totally different path (if one of the arguments is anchored). """ - drv1, root1, parts1 = self._drv, self._root, self._parts - drv2, root2, parts2 = self._parse_parts(args) - if root2: - if not drv2 and drv1: - return self._from_parsed_parts(drv1, root2, [drv1 + root2] + parts2[1:]) - else: - return self._from_parsed_parts(drv2, root2, parts2) - elif drv2: - if drv2 == drv1 or self._flavour.normcase(drv2) == self._flavour.normcase(drv1): - # Same drive => second path is relative to the first. - return self._from_parsed_parts(drv1, root1, parts1 + parts2[1:]) - else: - return self._from_parsed_parts(drv2, root2, parts2) - else: - # Second path is non-anchored (common case). - return self._from_parsed_parts(drv1, root1, parts1 + parts2) + return self.__class__(self._raw_path, *args) def __truediv__(self, key): try: @@ -586,15 +594,15 @@ def __truediv__(self, key): def __rtruediv__(self, key): try: - return self._from_parts([key] + self._parts) + return type(self)(key, self._raw_path) except TypeError: return NotImplemented @property def parent(self): """The logical parent of the path.""" - drv = self._drv - root = self._root + drv = self.drive + root = self.root parts = self._parts if len(parts) == 1 and (drv or root): return self @@ -610,7 +618,7 @@ def is_absolute(self): a drive).""" # ntpath.isabs() is defective - see GH-44626 . if self._flavour is ntpath: - return bool(self._drv and self._root) + return bool(self.drive and self.root) return self._flavour.isabs(self) def is_reserved(self): @@ -634,7 +642,7 @@ def match(self, path_pattern): Return True if this path matches the given pattern. """ path_pattern = self._flavour.normcase(path_pattern) - drv, root, pat_parts = self._parse_parts((path_pattern,)) + drv, root, pat_parts = self._parse_path(path_pattern) if not pat_parts: raise ValueError("empty pattern") parts = self._parts_normcase @@ -687,20 +695,23 @@ class Path(PurePath): """ __slots__ = () - def __new__(cls, *args, **kwargs): + def __init__(self, *args, **kwargs): if kwargs: msg = ("support for supplying keyword arguments to pathlib.PurePath " "is deprecated and scheduled for removal in Python {remove}") warnings._deprecated("pathlib.PurePath(**kwargs)", msg, remove=(3, 14)) + super().__init__(*args) + + def __new__(cls, *args, **kwargs): if cls is Path: cls = WindowsPath if os.name == 'nt' else PosixPath - return cls._from_parts(args) + return object.__new__(cls) def _make_child_relpath(self, part): # This is an optimization used for dir walking. `part` must be # a single part relative to this path. parts = self._parts + [part] - return self._from_parsed_parts(self._drv, self._root, parts) + return self._from_parsed_parts(self.drive, self.root, parts) def __enter__(self): # In previous versions of pathlib, __exit__() marked this path as @@ -770,7 +781,7 @@ def glob(self, pattern): sys.audit("pathlib.Path.glob", self, pattern) if not pattern: raise ValueError("Unacceptable pattern: {!r}".format(pattern)) - drv, root, pattern_parts = self._parse_parts((pattern,)) + drv, root, pattern_parts = self._parse_path(pattern) if drv or root: raise NotImplementedError("Non-relative patterns are unsupported") if pattern[-1] in (self._flavour.sep, self._flavour.altsep): @@ -785,7 +796,7 @@ def rglob(self, pattern): this subtree. """ sys.audit("pathlib.Path.rglob", self, pattern) - drv, root, pattern_parts = self._parse_parts((pattern,)) + drv, root, pattern_parts = self._parse_path(pattern) if drv or root: raise NotImplementedError("Non-relative patterns are unsupported") if pattern and pattern[-1] in (self._flavour.sep, self._flavour.altsep): @@ -802,12 +813,12 @@ def absolute(self): """ if self.is_absolute(): return self - elif self._drv: + elif self.drive: # There is a CWD on each drive-letter drive. - cwd = self._flavour.abspath(self._drv) + cwd = self._flavour.abspath(self.drive) else: cwd = os.getcwd() - return self._from_parts([cwd] + self._parts) + return type(self)(cwd, self._raw_path) def resolve(self, strict=False): """ @@ -825,7 +836,7 @@ def check_eloop(e): except OSError as e: check_eloop(e) raise - p = self._from_parts((s,)) + p = type(self)(s) # In non-strict mode, realpath() doesn't raise on symlink loops. # Ensure we get an exception by calling stat() @@ -915,7 +926,7 @@ def readlink(self): """ if not hasattr(os, "readlink"): raise NotImplementedError("os.readlink() not available on this system") - return self._from_parts((os.readlink(self),)) + return type(self)(os.readlink(self)) def touch(self, mode=0o666, exist_ok=True): """ @@ -1184,12 +1195,12 @@ def expanduser(self): """ Return a new path with expanded ~ and ~user constructs (as returned by os.path.expanduser) """ - if (not (self._drv or self._root) and + if (not (self.drive or self.root) and self._parts and self._parts[0][:1] == '~'): homedir = self._flavour.expanduser(self._parts[0]) if homedir[:1] == "~": raise RuntimeError("Could not determine home directory.") - drv, root, parts = self._parse_parts((homedir,)) + drv, root, parts = self._parse_path(homedir) return self._from_parsed_parts(drv, root, parts + self._parts[1:]) return self diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 3041630da67899..8b6e012b730d75 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -27,7 +27,9 @@ class _BaseFlavourTest(object): def _check_parse_parts(self, arg, expected): - f = self.cls._parse_parts + def f(parts): + path = self.cls(*parts)._raw_path + return self.cls._parse_path(path) sep = self.flavour.sep altsep = self.flavour.altsep actual = f([x.replace('/', sep) for x in arg]) @@ -136,6 +138,14 @@ def test_parse_parts(self): # Tests for the pure classes. # +class _BasePurePathSubclass(object): + init_called = False + + def __init__(self, *args): + super().__init__(*args) + self.init_called = True + + class _BasePurePathTest(object): # Keys are canonical paths, values are list of tuples of arguments @@ -221,6 +231,21 @@ def test_str_subclass_common(self): self._check_str_subclass('a/b.txt') self._check_str_subclass('/a/b.txt') + def test_init_called_common(self): + class P(_BasePurePathSubclass, self.cls): + pass + p = P('foo', 'bar') + self.assertTrue((p / 'foo').init_called) + self.assertTrue(('foo' / p).init_called) + self.assertTrue(p.joinpath('foo').init_called) + self.assertTrue(p.with_name('foo').init_called) + self.assertTrue(p.with_stem('foo').init_called) + self.assertTrue(p.with_suffix('.foo').init_called) + self.assertTrue(p.relative_to('foo').init_called) + self.assertTrue(p.parent.init_called) + for parent in p.parents: + self.assertTrue(parent.init_called) + def test_join_common(self): P = self.cls p = P('a/b') diff --git a/Misc/NEWS.d/next/Library/2023-03-17-19-14-26.gh-issue-76846.KEamjK.rst b/Misc/NEWS.d/next/Library/2023-03-17-19-14-26.gh-issue-76846.KEamjK.rst new file mode 100644 index 00000000000000..9fba11f074ee1c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-03-17-19-14-26.gh-issue-76846.KEamjK.rst @@ -0,0 +1,3 @@ +Fix issue where ``__new__()`` and ``__init__()`` methods of +:class:`pathlib.PurePath` and :class:`~pathlib.Path` subclasses were not +called in some circumstances. From 24facd60f6e5458cc783e429fe63d6a80d476f84 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 3 Apr 2023 21:59:47 +0300 Subject: [PATCH 048/349] gh-101100: Use list of 'dirty' docs, with warnings, instead of a clean list (#103191) Co-authored-by: Alex Waygood --- Doc/tools/.nitignore | 304 +++++++++++++++++++++++++++ Doc/tools/clean-files.txt | 366 --------------------------------- Doc/tools/touch-clean-files.py | 33 ++- 3 files changed, 332 insertions(+), 371 deletions(-) create mode 100644 Doc/tools/.nitignore delete mode 100644 Doc/tools/clean-files.txt diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore new file mode 100644 index 00000000000000..f6fe8df97810ff --- /dev/null +++ b/Doc/tools/.nitignore @@ -0,0 +1,304 @@ +# All RST files under Doc/ -- except these -- must pass Sphinx nit-picky mode, +# as tested on the CI via touch-clean-files.py in doc.yml. +# Add blank lines between files and keep them sorted lexicographically +# to help avoid merge conflicts. + +Doc/c-api/allocation.rst +Doc/c-api/apiabiversion.rst +Doc/c-api/arg.rst +Doc/c-api/bool.rst +Doc/c-api/buffer.rst +Doc/c-api/bytes.rst +Doc/c-api/call.rst +Doc/c-api/capsule.rst +Doc/c-api/cell.rst +Doc/c-api/code.rst +Doc/c-api/codec.rst +Doc/c-api/complex.rst +Doc/c-api/conversion.rst +Doc/c-api/datetime.rst +Doc/c-api/descriptor.rst +Doc/c-api/dict.rst +Doc/c-api/exceptions.rst +Doc/c-api/file.rst +Doc/c-api/float.rst +Doc/c-api/gcsupport.rst +Doc/c-api/import.rst +Doc/c-api/init.rst +Doc/c-api/init_config.rst +Doc/c-api/intro.rst +Doc/c-api/iterator.rst +Doc/c-api/long.rst +Doc/c-api/mapping.rst +Doc/c-api/marshal.rst +Doc/c-api/memory.rst +Doc/c-api/memoryview.rst +Doc/c-api/module.rst +Doc/c-api/none.rst +Doc/c-api/object.rst +Doc/c-api/refcounting.rst +Doc/c-api/sequence.rst +Doc/c-api/set.rst +Doc/c-api/stable.rst +Doc/c-api/structures.rst +Doc/c-api/sys.rst +Doc/c-api/tuple.rst +Doc/c-api/type.rst +Doc/c-api/typehints.rst +Doc/c-api/typeobj.rst +Doc/c-api/unicode.rst +Doc/c-api/veryhigh.rst +Doc/c-api/weakref.rst +Doc/extending/embedding.rst +Doc/extending/extending.rst +Doc/extending/newtypes.rst +Doc/extending/newtypes_tutorial.rst +Doc/faq/design.rst +Doc/faq/extending.rst +Doc/faq/gui.rst +Doc/faq/library.rst +Doc/faq/programming.rst +Doc/glossary.rst +Doc/howto/argparse.rst +Doc/howto/curses.rst +Doc/howto/descriptor.rst +Doc/howto/enum.rst +Doc/howto/functional.rst +Doc/howto/instrumentation.rst +Doc/howto/isolating-extensions.rst +Doc/howto/logging-cookbook.rst +Doc/howto/logging.rst +Doc/howto/regex.rst +Doc/howto/sorting.rst +Doc/howto/unicode.rst +Doc/howto/urllib2.rst +Doc/install/index.rst +Doc/library/2to3.rst +Doc/library/__future__.rst +Doc/library/_thread.rst +Doc/library/abc.rst +Doc/library/aifc.rst +Doc/library/argparse.rst +Doc/library/ast.rst +Doc/library/asyncio-dev.rst +Doc/library/asyncio-eventloop.rst +Doc/library/asyncio-extending.rst +Doc/library/asyncio-future.rst +Doc/library/asyncio-policy.rst +Doc/library/asyncio-stream.rst +Doc/library/asyncio-subprocess.rst +Doc/library/asyncio-task.rst +Doc/library/audioop.rst +Doc/library/bdb.rst +Doc/library/bisect.rst +Doc/library/bz2.rst +Doc/library/calendar.rst +Doc/library/cgi.rst +Doc/library/chunk.rst +Doc/library/cmath.rst +Doc/library/cmd.rst +Doc/library/code.rst +Doc/library/codecs.rst +Doc/library/codeop.rst +Doc/library/collections.abc.rst +Doc/library/collections.rst +Doc/library/compileall.rst +Doc/library/concurrent.futures.rst +Doc/library/concurrent.rst +Doc/library/configparser.rst +Doc/library/constants.rst +Doc/library/contextlib.rst +Doc/library/copy.rst +Doc/library/csv.rst +Doc/library/ctypes.rst +Doc/library/curses.ascii.rst +Doc/library/curses.rst +Doc/library/dataclasses.rst +Doc/library/datetime.rst +Doc/library/dbm.rst +Doc/library/decimal.rst +Doc/library/devmode.rst +Doc/library/difflib.rst +Doc/library/dis.rst +Doc/library/doctest.rst +Doc/library/email.charset.rst +Doc/library/email.compat32-message.rst +Doc/library/email.encoders.rst +Doc/library/email.errors.rst +Doc/library/email.generator.rst +Doc/library/email.headerregistry.rst +Doc/library/email.message.rst +Doc/library/email.mime.rst +Doc/library/email.parser.rst +Doc/library/email.policy.rst +Doc/library/enum.rst +Doc/library/exceptions.rst +Doc/library/faulthandler.rst +Doc/library/fcntl.rst +Doc/library/filecmp.rst +Doc/library/fileinput.rst +Doc/library/fractions.rst +Doc/library/ftplib.rst +Doc/library/functions.rst +Doc/library/functools.rst +Doc/library/getopt.rst +Doc/library/getpass.rst +Doc/library/gettext.rst +Doc/library/graphlib.rst +Doc/library/gzip.rst +Doc/library/hashlib.rst +Doc/library/http.client.rst +Doc/library/http.cookiejar.rst +Doc/library/http.cookies.rst +Doc/library/http.server.rst +Doc/library/idle.rst +Doc/library/imp.rst +Doc/library/importlib.resources.abc.rst +Doc/library/importlib.resources.rst +Doc/library/importlib.rst +Doc/library/inspect.rst +Doc/library/io.rst +Doc/library/json.rst +Doc/library/locale.rst +Doc/library/logging.config.rst +Doc/library/logging.handlers.rst +Doc/library/logging.rst +Doc/library/lzma.rst +Doc/library/mailbox.rst +Doc/library/mmap.rst +Doc/library/msilib.rst +Doc/library/msvcrt.rst +Doc/library/multiprocessing.rst +Doc/library/multiprocessing.shared_memory.rst +Doc/library/netrc.rst +Doc/library/nntplib.rst +Doc/library/numbers.rst +Doc/library/operator.rst +Doc/library/optparse.rst +Doc/library/os.path.rst +Doc/library/os.rst +Doc/library/ossaudiodev.rst +Doc/library/pickle.rst +Doc/library/pickletools.rst +Doc/library/pkgutil.rst +Doc/library/platform.rst +Doc/library/plistlib.rst +Doc/library/poplib.rst +Doc/library/posix.rst +Doc/library/pprint.rst +Doc/library/profile.rst +Doc/library/pty.rst +Doc/library/py_compile.rst +Doc/library/pyclbr.rst +Doc/library/pydoc.rst +Doc/library/pyexpat.rst +Doc/library/random.rst +Doc/library/re.rst +Doc/library/readline.rst +Doc/library/reprlib.rst +Doc/library/resource.rst +Doc/library/rlcompleter.rst +Doc/library/sched.rst +Doc/library/select.rst +Doc/library/selectors.rst +Doc/library/shelve.rst +Doc/library/shutil.rst +Doc/library/signal.rst +Doc/library/site.rst +Doc/library/smtplib.rst +Doc/library/socket.rst +Doc/library/socketserver.rst +Doc/library/ssl.rst +Doc/library/stat.rst +Doc/library/stdtypes.rst +Doc/library/string.rst +Doc/library/struct.rst +Doc/library/subprocess.rst +Doc/library/sunau.rst +Doc/library/sys.rst +Doc/library/sys_path_init.rst +Doc/library/sysconfig.rst +Doc/library/syslog.rst +Doc/library/tarfile.rst +Doc/library/telnetlib.rst +Doc/library/tempfile.rst +Doc/library/termios.rst +Doc/library/test.rst +Doc/library/textwrap.rst +Doc/library/threading.rst +Doc/library/time.rst +Doc/library/tkinter.rst +Doc/library/tkinter.scrolledtext.rst +Doc/library/tkinter.tix.rst +Doc/library/tkinter.ttk.rst +Doc/library/traceback.rst +Doc/library/tty.rst +Doc/library/turtle.rst +Doc/library/unittest.mock-examples.rst +Doc/library/unittest.mock.rst +Doc/library/unittest.rst +Doc/library/urllib.error.rst +Doc/library/urllib.parse.rst +Doc/library/urllib.request.rst +Doc/library/uuid.rst +Doc/library/wave.rst +Doc/library/weakref.rst +Doc/library/webbrowser.rst +Doc/library/winreg.rst +Doc/library/winsound.rst +Doc/library/wsgiref.rst +Doc/library/xdrlib.rst +Doc/library/xml.dom.minidom.rst +Doc/library/xml.dom.pulldom.rst +Doc/library/xml.dom.rst +Doc/library/xml.etree.elementtree.rst +Doc/library/xml.rst +Doc/library/xml.sax.handler.rst +Doc/library/xml.sax.reader.rst +Doc/library/xml.sax.rst +Doc/library/xml.sax.utils.rst +Doc/library/xmlrpc.client.rst +Doc/library/xmlrpc.rst +Doc/library/xmlrpc.server.rst +Doc/library/zlib.rst +Doc/license.rst +Doc/reference/compound_stmts.rst +Doc/reference/datamodel.rst +Doc/reference/expressions.rst +Doc/reference/import.rst +Doc/reference/lexical_analysis.rst +Doc/reference/simple_stmts.rst +Doc/tutorial/appendix.rst +Doc/tutorial/classes.rst +Doc/tutorial/controlflow.rst +Doc/tutorial/datastructures.rst +Doc/tutorial/errors.rst +Doc/tutorial/inputoutput.rst +Doc/tutorial/interactive.rst +Doc/tutorial/introduction.rst +Doc/tutorial/modules.rst +Doc/tutorial/stdlib2.rst +Doc/using/cmdline.rst +Doc/using/configure.rst +Doc/using/unix.rst +Doc/using/windows.rst +Doc/whatsnew/2.0.rst +Doc/whatsnew/2.1.rst +Doc/whatsnew/2.2.rst +Doc/whatsnew/2.3.rst +Doc/whatsnew/2.4.rst +Doc/whatsnew/2.5.rst +Doc/whatsnew/2.6.rst +Doc/whatsnew/2.7.rst +Doc/whatsnew/3.0.rst +Doc/whatsnew/3.1.rst +Doc/whatsnew/3.2.rst +Doc/whatsnew/3.3.rst +Doc/whatsnew/3.4.rst +Doc/whatsnew/3.5.rst +Doc/whatsnew/3.6.rst +Doc/whatsnew/3.7.rst +Doc/whatsnew/3.8.rst +Doc/whatsnew/3.9.rst +Doc/whatsnew/3.10.rst +Doc/whatsnew/3.11.rst diff --git a/Doc/tools/clean-files.txt b/Doc/tools/clean-files.txt deleted file mode 100644 index baef7c2f89588b..00000000000000 --- a/Doc/tools/clean-files.txt +++ /dev/null @@ -1,366 +0,0 @@ -# These files must pass Sphinx nit-picky mode, as tested on the CI -# via touch-clean-files.py in doc.yml. -# Add blank lines between files and keep them sorted lexicographically -# to help avoid merge conflicts. - -Doc/about.rst - -Doc/bugs.rst - -Doc/c-api/abstract.rst - -Doc/c-api/bytearray.rst - -Doc/c-api/concrete.rst - -Doc/c-api/contextvars.rst - -Doc/c-api/coro.rst - -Doc/c-api/frame.rst - -Doc/c-api/function.rst - -Doc/c-api/gen.rst - -Doc/c-api/index.rst - -Doc/c-api/iter.rst - -Doc/c-api/list.rst - -Doc/c-api/method.rst - -Doc/c-api/number.rst - -Doc/c-api/objbuffer.rst - -Doc/c-api/objimpl.rst - -Doc/c-api/reflection.rst - -Doc/c-api/slice.rst - -Doc/c-api/utilities.rst - -Doc/contents.rst - -Doc/copyright.rst - -Doc/distributing/index.rst - -Doc/extending/building.rst - -Doc/extending/index.rst - -Doc/extending/windows.rst - -Doc/faq/general.rst - -Doc/faq/index.rst - -Doc/faq/installed.rst - -Doc/faq/windows.rst - -Doc/howto/annotations.rst - -Doc/howto/clinic.rst - -Doc/howto/cporting.rst - -Doc/howto/index.rst - -Doc/howto/ipaddress.rst - -Doc/howto/perf_profiling.rst - -Doc/howto/pyporting.rst - -Doc/howto/sockets.rst - -Doc/installing/index.rst - -Doc/library/__main__.rst - -Doc/library/allos.rst - -Doc/library/archiving.rst - -Doc/library/array.rst - -Doc/library/asyncio-api-index.rst - -Doc/library/asyncio-exceptions.rst - -Doc/library/asyncio-llapi-index.rst - -Doc/library/asyncio-platforms.rst - -Doc/library/asyncio-protocol.rst - -Doc/library/asyncio-queue.rst - -Doc/library/asyncio-runner.rst - -Doc/library/asyncio-sync.rst - -Doc/library/asyncio.rst - -Doc/library/atexit.rst - -Doc/library/audit_events.rst - -Doc/library/base64.rst - -Doc/library/binary.rst - -Doc/library/binascii.rst - -Doc/library/builtins.rst - -Doc/library/cgitb.rst - -Doc/library/colorsys.rst - -Doc/library/concurrency.rst - -Doc/library/contextvars.rst - -Doc/library/copyreg.rst - -Doc/library/crypt.rst - -Doc/library/crypto.rst - -Doc/library/curses.panel.rst - -Doc/library/custominterp.rst - -Doc/library/datatypes.rst - -Doc/library/debug.rst - -Doc/library/development.rst - -Doc/library/dialog.rst - -Doc/library/distribution.rst - -Doc/library/email.contentmanager.rst - -Doc/library/email.examples.rst - -Doc/library/email.header.rst - -Doc/library/email.iterators.rst - -Doc/library/email.rst - -Doc/library/email.utils.rst - -Doc/library/ensurepip.rst - -Doc/library/errno.rst - -Doc/library/fileformats.rst - -Doc/library/filesys.rst - -Doc/library/fnmatch.rst - -Doc/library/frameworks.rst - -Doc/library/functional.rst - -Doc/library/gc.rst - -Doc/library/glob.rst - -Doc/library/grp.rst - -Doc/library/heapq.rst - -Doc/library/hmac.rst - -Doc/library/html.entities.rst - -Doc/library/html.parser.rst - -Doc/library/html.rst - -Doc/library/http.rst - -Doc/library/i18n.rst - -Doc/library/imaplib.rst - -Doc/library/imghdr.rst - -Doc/library/importlib.metadata.rst - -Doc/library/index.rst - -Doc/library/internet.rst - -Doc/library/intro.rst - -Doc/library/ipaddress.rst - -Doc/library/ipc.rst - -Doc/library/itertools.rst - -Doc/library/keyword.rst - -Doc/library/language.rst - -Doc/library/linecache.rst - -Doc/library/mailcap.rst - -Doc/library/markup.rst - -Doc/library/marshal.rst - -Doc/library/math.rst - -Doc/library/mimetypes.rst - -Doc/library/mm.rst - -Doc/library/modulefinder.rst - -Doc/library/modules.rst - -Doc/library/netdata.rst - -Doc/library/nis.rst - -Doc/library/numeric.rst - -Doc/library/pathlib.rst - -Doc/library/pdb.rst - -Doc/library/persistence.rst - -Doc/library/pipes.rst - -Doc/library/pwd.rst - -Doc/library/python.rst - -Doc/library/queue.rst - -Doc/library/quopri.rst - -Doc/library/runpy.rst - -Doc/library/secrets.rst - -Doc/library/security_warnings.rst - -Doc/library/shlex.rst - -Doc/library/sndhdr.rst - -Doc/library/spwd.rst - -Doc/library/sqlite3.rst - -Doc/library/statistics.rst - -Doc/library/stringprep.rst - -Doc/library/superseded.rst - -Doc/library/symtable.rst - -Doc/library/tabnanny.rst - -Doc/library/text.rst - -Doc/library/timeit.rst - -Doc/library/tk.rst - -Doc/library/tkinter.colorchooser.rst - -Doc/library/tkinter.dnd.rst - -Doc/library/tkinter.font.rst - -Doc/library/tkinter.messagebox.rst - -#Doc/library/token.rst - -Doc/library/tokenize.rst - -Doc/library/tomllib.rst - -Doc/library/trace.rst - -Doc/library/tracemalloc.rst - -Doc/library/types.rst - -Doc/library/typing.rst - -Doc/library/unicodedata.rst - -Doc/library/unix.rst - -Doc/library/urllib.robotparser.rst - -Doc/library/urllib.rst - -Doc/library/uu.rst - -Doc/library/venv.rst - -Doc/library/warnings.rst - -Doc/library/windows.rst - -Doc/library/zipapp.rst - -Doc/library/zipfile.rst - -Doc/library/zipimport.rst - -Doc/library/zoneinfo.rst - -Doc/reference/executionmodel.rst - -Doc/reference/grammar.rst - -Doc/reference/index.rst - -Doc/reference/introduction.rst - -Doc/reference/toplevel_components.rst - -Doc/tutorial/appetite.rst - -Doc/tutorial/floatingpoint.rst - -Doc/tutorial/index.rst - -Doc/tutorial/interpreter.rst - -Doc/tutorial/stdlib.rst - -Doc/tutorial/venv.rst - -Doc/tutorial/whatnow.rst - -Doc/using/editors.rst - -Doc/using/index.rst - -Doc/using/mac.rst - -Doc/whatsnew/3.12.rst - -Doc/whatsnew/index.rst diff --git a/Doc/tools/touch-clean-files.py b/Doc/tools/touch-clean-files.py index 9f55e9446ba793..19bc1be31deb26 100644 --- a/Doc/tools/touch-clean-files.py +++ b/Doc/tools/touch-clean-files.py @@ -6,16 +6,39 @@ from pathlib import Path -# Input file has blank line between entries to reduce merge conflicts -with Path("Doc/tools/clean-files.txt").open() as clean_files: - CLEAN = [ +wrong_directory_msg = "Must run this script from the repo root" +assert Path("Doc").exists() and Path("Doc").is_dir(), wrong_directory_msg + +# Exclude these whether they're dirty or clean, +# because they trigger a rebuild of dirty files. +EXCLUDE_FILES = { + Path("Doc/whatsnew/changelog.rst"), +} + +# Subdirectories of Doc/ to exclude. +EXCLUDE_SUBDIRS = { + ".env", + ".venv", + "env", + "includes", + "venv", +} + +ALL_RST = { + rst for rst in Path("Doc/").rglob("*.rst") if rst.parts[1] not in EXCLUDE_SUBDIRS +} + +with Path("Doc/tools/.nitignore").open() as clean_files: + DIRTY = { Path(filename.strip()) for filename in clean_files if filename.strip() and not filename.startswith("#") - ] + } + +CLEAN = ALL_RST - DIRTY - EXCLUDE_FILES print("Touching:") -for filename in CLEAN: +for filename in sorted(CLEAN): print(filename) filename.touch() print(f"Touched {len(CLEAN)} files") From d3a7732dd54c27ae523bef73efbb0c580ce2fbc0 Mon Sep 17 00:00:00 2001 From: Sadra Barikbin Date: Tue, 4 Apr 2023 01:21:43 +0330 Subject: [PATCH 049/349] gh-103215: Remove redundant if stmt from `enum.EnumType._find_data_type_` (GH-103222) --- Lib/enum.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/Lib/enum.py b/Lib/enum.py index 4e231e7e8ea779..b8ea7af9e74775 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -987,8 +987,6 @@ def _find_data_type_(mcls, class_name, bases): data_types.add(base._member_type_) break elif '__new__' in base.__dict__ or '__init__' in base.__dict__: - if isinstance(base, EnumType): - continue data_types.add(candidate or base) break else: From 5ffc1e5a21de9a30566095386236db44695d184a Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Mon, 3 Apr 2023 14:57:42 -0700 Subject: [PATCH 050/349] gh-98298, gh-74730: [Enum] update docs (GH-103163) fix FlagBoundary statements add warning about reloading modules and enum identity --- Doc/howto/enum.rst | 5 +++++ Doc/library/enum.rst | 51 ++++++++++++++++++++++---------------------- Lib/enum.py | 8 +++---- 3 files changed, 34 insertions(+), 30 deletions(-) diff --git a/Doc/howto/enum.rst b/Doc/howto/enum.rst index 4525acb04503b3..fc8ea55069a9ec 100644 --- a/Doc/howto/enum.rst +++ b/Doc/howto/enum.rst @@ -372,6 +372,11 @@ below):: >>> Color.BLUE == 2 False +.. warning:: + + It is possible to reload modules -- if a reloaded module contains + enums, they will be recreated, and the new members may not + compare identical/equal to the original members. Allowed members and attributes of enumerations ---------------------------------------------- diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 24b6dbfe37cd38..c690c837309ea5 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -141,9 +141,8 @@ Module Contents :func:`global_enum` Modify the :class:`str() ` and :func:`repr` of an enum - to show its members as belonging to the module instead of its class. - Should only be used if the enum members will be exported to the - module global namespace. + to show its members as belonging to the module instead of its class, + and export the enum members to the global namespace. :func:`show_flag_values` @@ -170,6 +169,27 @@ Data Types final *enum*, as well as creating the enum members, properly handling duplicates, providing iteration over the enum class, etc. + .. method:: EnumType.__call__(cls, value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None) + + This method is called in two different ways: + + * to look up an existing member: + + :cls: The enum class being called. + :value: The value to lookup. + + * to use the ``cls`` enum to create a new enum (only if the existing enum + does not have any members): + + :cls: The enum class being called. + :value: The name of the new Enum to create. + :names: The names/values of the members for the new Enum. + :module: The name of the module the new Enum is created in. + :qualname: The actual location in the module where this Enum can be found. + :type: A mix-in type for the new Enum. + :start: The first integer value for the Enum (used by :class:`auto`). + :boundary: How to handle out-of-range values from bit operations (:class:`Flag` only). + .. method:: EnumType.__contains__(cls, member) Returns ``True`` if member belongs to the ``cls``:: @@ -255,26 +275,6 @@ Data Types names will also be removed from the completed enumeration. See :ref:`TimePeriod ` for an example. - .. method:: Enum.__call__(cls, value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None) - - This method is called in two different ways: - - * to look up an existing member: - - :cls: The enum class being called. - :value: The value to lookup. - - * to use the ``cls`` enum to create a new enum: - - :cls: The enum class being called. - :value: The name of the new Enum to create. - :names: The names/values of the members for the new Enum. - :module: The name of the module the new Enum is created in. - :qualname: The actual location in the module where this Enum can be found. - :type: A mix-in type for the new Enum. - :start: The first integer value for the Enum (used by :class:`auto`). - :boundary: How to handle out-of-range values from bit operations (:class:`Flag` only). - .. method:: Enum.__dir__(self) Returns ``['__class__', '__doc__', '__module__', 'name', 'value']`` and @@ -728,7 +728,6 @@ Data Types .. attribute:: EJECT Out-of-range values lose their *Flag* membership and revert to :class:`int`. - This is the default for :class:`IntFlag`:: >>> from enum import Flag, EJECT, auto >>> class EjectFlag(Flag, boundary=EJECT): @@ -741,8 +740,8 @@ Data Types .. attribute:: KEEP - Out-of-range values are kept, and the *Flag* membership is kept. This is - used for some stdlib flags:: + Out-of-range values are kept, and the *Flag* membership is kept. + This is the default for :class:`IntFlag`:: >>> from enum import Flag, KEEP, auto >>> class KeepFlag(Flag, boundary=KEEP): diff --git a/Lib/enum.py b/Lib/enum.py index b8ea7af9e74775..9d836c716d8423 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -1301,10 +1301,10 @@ def _reduce_ex_by_global_name(self, proto): class FlagBoundary(StrEnum): """ control how out of range values are handled - "strict" -> error is raised [default for Flag] - "conform" -> extra bits are discarded - "eject" -> lose flag status [default for IntFlag] - "keep" -> keep flag status and all bits + "strict" -> error is raised + "conform" -> extra bits are discarded [default for Flag] + "eject" -> lose flag status + "keep" -> keep flag status and all bits [default for IntFlag] """ STRICT = auto() CONFORM = auto() From 02f9920900551fd0281c8989d65521d4fce4ead1 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 4 Apr 2023 07:44:00 +0900 Subject: [PATCH 051/349] gh-100062: Remove error code tables from _ssl and err_names_to_codes (GH-100063) Prior to https://github.com/python/cpython/pull/25300, the make_ssl_data.py script used various tables, exposed in _ssl, to update the error list. After that PR, this is no longer used. Moreover, the err_names_to_codes map isn't used at all. Clean those up. This gets them out of the way if, in the future, OpenSSL provides an API to do what the code here is doing directly. (https://github.com/openssl/openssl/issues/19848) --- Modules/_ssl.c | 14 -------------- Modules/_ssl.h | 1 - 2 files changed, 15 deletions(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c index e0351a89e6a1e9..5f17cd502d4598 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -5991,9 +5991,6 @@ sslmodule_init_errorcodes(PyObject *module) state->err_codes_to_names = PyDict_New(); if (state->err_codes_to_names == NULL) return -1; - state->err_names_to_codes = PyDict_New(); - if (state->err_names_to_codes == NULL) - return -1; state->lib_codes_to_names = PyDict_New(); if (state->lib_codes_to_names == NULL) return -1; @@ -6007,8 +6004,6 @@ sslmodule_init_errorcodes(PyObject *module) return -1; if (PyDict_SetItem(state->err_codes_to_names, key, mnemo)) return -1; - if (PyDict_SetItem(state->err_names_to_codes, mnemo, key)) - return -1; Py_DECREF(key); Py_DECREF(mnemo); errcode++; @@ -6028,13 +6023,6 @@ sslmodule_init_errorcodes(PyObject *module) libcode++; } - if (PyModule_AddObjectRef(module, "err_codes_to_names", state->err_codes_to_names)) - return -1; - if (PyModule_AddObjectRef(module, "err_names_to_codes", state->err_names_to_codes)) - return -1; - if (PyModule_AddObjectRef(module, "lib_codes_to_names", state->lib_codes_to_names)) - return -1; - return 0; } @@ -6189,7 +6177,6 @@ sslmodule_traverse(PyObject *m, visitproc visit, void *arg) Py_VISIT(state->PySSLSyscallErrorObject); Py_VISIT(state->PySSLEOFErrorObject); Py_VISIT(state->err_codes_to_names); - Py_VISIT(state->err_names_to_codes); Py_VISIT(state->lib_codes_to_names); Py_VISIT(state->Sock_Type); @@ -6214,7 +6201,6 @@ sslmodule_clear(PyObject *m) Py_CLEAR(state->PySSLSyscallErrorObject); Py_CLEAR(state->PySSLEOFErrorObject); Py_CLEAR(state->err_codes_to_names); - Py_CLEAR(state->err_names_to_codes); Py_CLEAR(state->lib_codes_to_names); Py_CLEAR(state->Sock_Type); Py_CLEAR(state->str_library); diff --git a/Modules/_ssl.h b/Modules/_ssl.h index d68ccdec5e88c4..c1da8b46b536d3 100644 --- a/Modules/_ssl.h +++ b/Modules/_ssl.h @@ -25,7 +25,6 @@ typedef struct { PyObject *PySSLEOFErrorObject; /* Error mappings */ PyObject *err_codes_to_names; - PyObject *err_names_to_codes; PyObject *lib_codes_to_names; /* socket type from module CAPI */ PyTypeObject *Sock_Type; From c71756fa651e51041ac8b55776320e3297ba081d Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Mon, 3 Apr 2023 16:47:48 -0700 Subject: [PATCH 052/349] Specify more settings for the C extension of VS Code for dev containers (GH-103229) Should help with auto-complete. --- .devcontainer/devcontainer.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index e3fb4c6c88f497..9fbaf7fddd8514 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -37,10 +37,16 @@ // "ms-python.python" ], "settings": { + "C_Cpp.default.compilerPath": "/usr/bin/clang", "C_Cpp.default.cStandard": "c11", "C_Cpp.default.defines": [ + "CONFIG_64", "Py_BUILD_CORE" ], + "C_Cpp.default.includePath": [ + "${workspaceFolder}/*", + "${workspaceFolder}/Include/**" + ], // https://github.com/microsoft/vscode-cpptools/issues/10732 "C_Cpp.errorSquiggles": "disabled", "editor.insertSpaces": true, From 810d365b5eb2cf3043957ca2971f6e7a7cd87d0d Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Mon, 3 Apr 2023 17:47:40 -0700 Subject: [PATCH 053/349] gh-103056: [Enum] use staticmethod decorator for _gnv_ (GH-103231) _gnv_ --> _generate_next_value_ --- Doc/howto/enum.rst | 1 + Lib/enum.py | 3 +++ 2 files changed, 4 insertions(+) diff --git a/Doc/howto/enum.rst b/Doc/howto/enum.rst index fc8ea55069a9ec..38951ed7348f56 100644 --- a/Doc/howto/enum.rst +++ b/Doc/howto/enum.rst @@ -284,6 +284,7 @@ The values are chosen by :func:`_generate_next_value_`, which can be overridden:: >>> class AutoName(Enum): + ... @staticmethod ... def _generate_next_value_(name, start, count, last_values): ... return name ... diff --git a/Lib/enum.py b/Lib/enum.py index 9d836c716d8423..ec698d5fa3c300 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -1146,6 +1146,7 @@ def __new__(cls, value): def __init__(self, *args, **kwds): pass + @staticmethod def _generate_next_value_(name, start, count, last_values): """ Generate the next value when not given. @@ -1288,6 +1289,7 @@ def __new__(cls, *values): member._value_ = value return member + @staticmethod def _generate_next_value_(name, start, count, last_values): """ Return the lower-cased version of the member name. @@ -1337,6 +1339,7 @@ def __reduce_ex__(self, proto): _numeric_repr_ = repr + @staticmethod def _generate_next_value_(name, start, count, last_values): """ Generate the next value when not given. From c00dcf0e381a090f7e905f887a98bbf63c88af5a Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 4 Apr 2023 12:08:54 +0200 Subject: [PATCH 054/349] gh-103092: Isolate `_pickle` module (#102982) Co-authored-by: Mohamed Koubaa Co-authored-by: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> --- Lib/test/test_pickle.py | 28 + ...2020-07-04-09-04-41.bpo-1635741.ZsP31Y.rst | 1 + Modules/_pickle.c | 1262 ++++++++--------- Modules/clinic/_pickle.c.h | 76 +- Tools/c-analyzer/cpython/globals-to-fix.tsv | 5 - 5 files changed, 703 insertions(+), 669 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-04-09-04-41.bpo-1635741.ZsP31Y.rst diff --git a/Lib/test/test_pickle.py b/Lib/test/test_pickle.py index 80e7a4d23a4ba8..1a55da39bdc58d 100644 --- a/Lib/test/test_pickle.py +++ b/Lib/test/test_pickle.py @@ -293,6 +293,34 @@ class CustomCPicklerClass(_pickle.Pickler, AbstractCustomPicklerClass): pass pickler_class = CustomCPicklerClass + @support.cpython_only + class HeapTypesTests(unittest.TestCase): + def setUp(self): + pickler = _pickle.Pickler(io.BytesIO()) + unpickler = _pickle.Unpickler(io.BytesIO()) + + self._types = ( + _pickle.Pickler, + _pickle.Unpickler, + type(pickler.memo), + type(unpickler.memo), + + # We cannot test the _pickle.Pdata; + # there's no way to get to it. + ) + + def test_have_gc(self): + import gc + for tp in self._types: + with self.subTest(tp=tp): + self.assertTrue(gc.is_tracked(tp)) + + def test_immutable(self): + for tp in self._types: + with self.subTest(tp=tp): + with self.assertRaisesRegex(TypeError, "immutable"): + tp.foo = "bar" + @support.cpython_only class SizeofTests(unittest.TestCase): check_sizeof = support.check_sizeof diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-04-09-04-41.bpo-1635741.ZsP31Y.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-04-09-04-41.bpo-1635741.ZsP31Y.rst new file mode 100644 index 00000000000000..9f9c8121bea5ae --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-07-04-09-04-41.bpo-1635741.ZsP31Y.rst @@ -0,0 +1 @@ +Adapt :mod:`!_pickle` to :pep:`687`. Patch by Mohamed Koubaa and Erlend Aasland. diff --git a/Modules/_pickle.c b/Modules/_pickle.c index a26732af8ba2a1..360c7910f67187 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -22,12 +22,12 @@ PyDoc_STRVAR(pickle_module_doc, /*[clinic input] module _pickle -class _pickle.Pickler "PicklerObject *" "&Pickler_Type" -class _pickle.PicklerMemoProxy "PicklerMemoProxyObject *" "&PicklerMemoProxyType" -class _pickle.Unpickler "UnpicklerObject *" "&Unpickler_Type" -class _pickle.UnpicklerMemoProxy "UnpicklerMemoProxyObject *" "&UnpicklerMemoProxyType" +class _pickle.Pickler "PicklerObject *" "" +class _pickle.PicklerMemoProxy "PicklerMemoProxyObject *" "" +class _pickle.Unpickler "UnpicklerObject *" "" +class _pickle.UnpicklerMemoProxy "UnpicklerMemoProxyObject *" "" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=4b3e113468a58e6c]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=b6d7191ab6466cda]*/ /* Bump HIGHEST_PROTOCOL when new opcodes are added to the pickle protocol. Bump DEFAULT_PROTOCOL only when the oldest still supported version of Python @@ -192,24 +192,41 @@ typedef struct { /* functools.partial, used for implementing __newobj_ex__ with protocols 2 and 3 */ PyObject *partial; + + /* Types */ + PyTypeObject *Pickler_Type; + PyTypeObject *Unpickler_Type; + PyTypeObject *Pdata_Type; + PyTypeObject *PicklerMemoProxyType; + PyTypeObject *UnpicklerMemoProxyType; } PickleState; /* Forward declaration of the _pickle module definition. */ static struct PyModuleDef _picklemodule; /* Given a module object, get its per-module state. */ -static PickleState * +static inline PickleState * _Pickle_GetState(PyObject *module) { - return (PickleState *)_PyModule_GetState(module); + void *state = _PyModule_GetState(module); + assert(state != NULL); + return (PickleState *)state; +} + +static inline PickleState * +_Pickle_GetStateByClass(PyTypeObject *cls) +{ + void *state = _PyType_GetModuleState(cls); + assert(state != NULL); + return (PickleState *)state; } -/* Find the module instance imported in the currently running sub-interpreter - and get its state. */ -static PickleState * -_Pickle_GetGlobalState(void) +static inline PickleState * +_Pickle_FindStateByType(PyTypeObject *tp) { - return _Pickle_GetState(PyState_FindModule(&_picklemodule)); + PyObject *module = PyType_GetModuleByDef(tp, &_picklemodule); + assert(module != NULL); + return _Pickle_GetState(module); } /* Clear the given pickle module state. */ @@ -230,6 +247,11 @@ _Pickle_ClearState(PickleState *st) Py_CLEAR(st->codecs_encode); Py_CLEAR(st->getattr); Py_CLEAR(st->partial); + Py_CLEAR(st->Pickler_Type); + Py_CLEAR(st->Unpickler_Type); + Py_CLEAR(st->Pdata_Type); + Py_CLEAR(st->PicklerMemoProxyType); + Py_CLEAR(st->UnpicklerMemoProxyType); } /* Initialize the given pickle module state. */ @@ -439,39 +461,58 @@ typedef struct { Py_ssize_t allocated; /* number of slots in data allocated */ } Pdata; +static int +Pdata_traverse(Pdata *self, visitproc visit, void *arg) +{ + Py_VISIT(Py_TYPE(self)); + return 0; +} + static void Pdata_dealloc(Pdata *self) { + PyTypeObject *tp = Py_TYPE(self); + PyObject_GC_UnTrack(self); Py_ssize_t i = Py_SIZE(self); while (--i >= 0) { Py_DECREF(self->data[i]); } PyMem_Free(self->data); - PyObject_Free(self); + tp->tp_free((PyObject *)self); + Py_DECREF(tp); } -static PyTypeObject Pdata_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_pickle.Pdata", /*tp_name*/ - sizeof(Pdata), /*tp_basicsize*/ - sizeof(PyObject *), /*tp_itemsize*/ - (destructor)Pdata_dealloc, /*tp_dealloc*/ +static PyType_Slot pdata_slots[] = { + {Py_tp_dealloc, Pdata_dealloc}, + {Py_tp_traverse, Pdata_traverse}, + {0, NULL}, +}; + +static PyType_Spec pdata_spec = { + .name = "_pickle.Pdata", + .basicsize = sizeof(Pdata), + .itemsize = sizeof(PyObject *), + .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_IMMUTABLETYPE), + .slots = pdata_slots, }; static PyObject * -Pdata_New(void) +Pdata_New(PickleState *state) { Pdata *self; - if (!(self = PyObject_New(Pdata, &Pdata_Type))) + if (!(self = PyObject_GC_New(Pdata, state->Pdata_Type))) return NULL; Py_SET_SIZE(self, 0); self->mark_set = 0; self->fence = 0; self->allocated = 8; self->data = PyMem_Malloc(self->allocated * sizeof(PyObject *)); - if (self->data) + if (self->data) { + PyObject_GC_Track(self); return (PyObject *)self; + } Py_DECREF(self); return PyErr_NoMemory(); } @@ -522,9 +563,8 @@ Pdata_grow(Pdata *self) } static int -Pdata_stack_underflow(Pdata *self) +Pdata_stack_underflow(PickleState *st, Pdata *self) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->UnpicklingError, self->mark_set ? "unexpected MARK found" : @@ -537,16 +577,16 @@ Pdata_stack_underflow(Pdata *self) * is raised and V is set to NULL. */ static PyObject * -Pdata_pop(Pdata *self) +Pdata_pop(PickleState *state, Pdata *self) { if (Py_SIZE(self) <= self->fence) { - Pdata_stack_underflow(self); + Pdata_stack_underflow(state, self); return NULL; } Py_SET_SIZE(self, Py_SIZE(self) - 1); return self->data[Py_SIZE(self)]; } -#define PDATA_POP(D, V) do { (V) = Pdata_pop((D)); } while (0) +#define PDATA_POP(S, D, V) do { (V) = Pdata_pop(S, (D)); } while (0) static int Pdata_push(Pdata *self, PyObject *obj) @@ -569,13 +609,13 @@ Pdata_push(Pdata *self, PyObject *obj) if (Pdata_push((D), (O)) < 0) return (ER); } while(0) static PyObject * -Pdata_poptuple(Pdata *self, Py_ssize_t start) +Pdata_poptuple(PickleState *state, Pdata *self, Py_ssize_t start) { PyObject *tuple; Py_ssize_t len, i, j; if (start < self->fence) { - Pdata_stack_underflow(self); + Pdata_stack_underflow(state, self); return NULL; } len = Py_SIZE(self) - start; @@ -710,10 +750,8 @@ typedef struct { } UnpicklerMemoProxyObject; /* Forward declarations */ -static int save(PicklerObject *, PyObject *, int); -static int save_reduce(PicklerObject *, PyObject *, PyObject *); -static PyTypeObject Pickler_Type; -static PyTypeObject Unpickler_Type; +static int save(PickleState *state, PicklerObject *, PyObject *, int); +static int save_reduce(PickleState *, PicklerObject *, PyObject *, PyObject *); #include "clinic/_pickle.c.h" @@ -1105,11 +1143,11 @@ _Pickler_Write(PicklerObject *self, const char *s, Py_ssize_t data_len) } static PicklerObject * -_Pickler_New(void) +_Pickler_New(PickleState *st) { PicklerObject *self; - self = PyObject_GC_New(PicklerObject, &Pickler_Type); + self = PyObject_GC_New(PicklerObject, st->Pickler_Type); if (self == NULL) return NULL; @@ -1220,9 +1258,8 @@ _Unpickler_SetStringInput(UnpicklerObject *self, PyObject *input) } static int -bad_readline(void) +bad_readline(PickleState *st) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->UnpicklingError, "pickle data was truncated"); return -1; } @@ -1317,13 +1354,12 @@ _Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n) /* Don't call it directly: use _Unpickler_Read() */ static Py_ssize_t -_Unpickler_ReadImpl(UnpicklerObject *self, char **s, Py_ssize_t n) +_Unpickler_ReadImpl(UnpicklerObject *self, PickleState *st, char **s, Py_ssize_t n) { Py_ssize_t num_read; *s = NULL; if (self->next_read_idx > PY_SSIZE_T_MAX - n) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->UnpicklingError, "read would overflow (invalid bytecode)"); return -1; @@ -1333,14 +1369,14 @@ _Unpickler_ReadImpl(UnpicklerObject *self, char **s, Py_ssize_t n) assert(self->next_read_idx + n > self->input_len); if (!self->read) - return bad_readline(); + return bad_readline(st); /* Extend the buffer to satisfy desired size */ num_read = _Unpickler_ReadFromFile(self, n); if (num_read < 0) return -1; if (num_read < n) - return bad_readline(); + return bad_readline(st); *s = self->input_buffer; self->next_read_idx = n; return n; @@ -1355,7 +1391,8 @@ _Unpickler_ReadImpl(UnpicklerObject *self, char **s, Py_ssize_t n) * _Unpickler_Read() is recommended in most cases. */ static Py_ssize_t -_Unpickler_ReadInto(UnpicklerObject *self, char *buf, Py_ssize_t n) +_Unpickler_ReadInto(PickleState *state, UnpicklerObject *self, char *buf, + Py_ssize_t n) { assert(n != READ_WHOLE_LINE); @@ -1376,7 +1413,7 @@ _Unpickler_ReadInto(UnpicklerObject *self, char *buf, Py_ssize_t n) /* Read from file */ if (!self->read) { /* We're unpickling memory, this means the input is truncated */ - return bad_readline(); + return bad_readline(state); } if (_Unpickler_SkipConsumed(self) < 0) { return -1; @@ -1403,7 +1440,7 @@ _Unpickler_ReadInto(UnpicklerObject *self, char *buf, Py_ssize_t n) Py_ssize_t read_size = PyBytes_GET_SIZE(data); if (read_size < n) { Py_DECREF(data); - return bad_readline(); + return bad_readline(state); } memcpy(buf, PyBytes_AS_STRING(data), n); Py_DECREF(data); @@ -1430,7 +1467,7 @@ _Unpickler_ReadInto(UnpicklerObject *self, char *buf, Py_ssize_t n) return -1; } if (read_size < n) { - return bad_readline(); + return bad_readline(state); } return n; } @@ -1448,12 +1485,12 @@ _Unpickler_ReadInto(UnpicklerObject *self, char *buf, Py_ssize_t n) Returns -1 (with an exception set) on failure. On success, return the number of chars read. */ -#define _Unpickler_Read(self, s, n) \ +#define _Unpickler_Read(self, state, s, n) \ (((n) <= (self)->input_len - (self)->next_read_idx) \ ? (*(s) = (self)->input_buffer + (self)->next_read_idx, \ (self)->next_read_idx += (n), \ (n)) \ - : _Unpickler_ReadImpl(self, (s), (n))) + : _Unpickler_ReadImpl(self, state, (s), (n))) static Py_ssize_t _Unpickler_CopyLine(UnpicklerObject *self, char *line, Py_ssize_t len, @@ -1477,7 +1514,7 @@ _Unpickler_CopyLine(UnpicklerObject *self, char *line, Py_ssize_t len, Returns the number of chars read, or -1 on failure. */ static Py_ssize_t -_Unpickler_Readline(UnpicklerObject *self, char **result) +_Unpickler_Readline(PickleState *state, UnpicklerObject *self, char **result) { Py_ssize_t i, num_read; @@ -1490,13 +1527,13 @@ _Unpickler_Readline(UnpicklerObject *self, char **result) } } if (!self->read) - return bad_readline(); + return bad_readline(state); num_read = _Unpickler_ReadFromFile(self, READ_WHOLE_LINE); if (num_read < 0) return -1; if (num_read == 0 || self->input_buffer[num_read - 1] != '\n') - return bad_readline(); + return bad_readline(state); self->next_read_idx = num_read; return _Unpickler_CopyLine(self, self->input_buffer, num_read, result); } @@ -1586,11 +1623,12 @@ _Unpickler_MemoCleanup(UnpicklerObject *self) } static UnpicklerObject * -_Unpickler_New(void) +_Unpickler_New(PyObject *module) { UnpicklerObject *self; + PickleState *st = _Pickle_GetState(module); - self = PyObject_GC_New(UnpicklerObject, &Unpickler_Type); + self = PyObject_GC_New(UnpicklerObject, st->Unpickler_Type); if (self == NULL) return NULL; @@ -1616,7 +1654,7 @@ _Unpickler_New(void) self->memo_size = 32; self->memo_len = 0; self->memo = _Unpickler_NewMemo(self->memo_size); - self->stack = (Pdata *)Pdata_New(); + self->stack = (Pdata *)Pdata_New(st); if (self->memo == NULL || self->stack == NULL) { Py_DECREF(self); @@ -1695,7 +1733,7 @@ _Unpickler_SetBuffers(UnpicklerObject *self, PyObject *buffers) /* Generate a GET opcode for an object stored in the memo. */ static int -memo_get(PicklerObject *self, PyObject *key) +memo_get(PickleState *st, PicklerObject *self, PyObject *key) { Py_ssize_t *value; char pdata[30]; @@ -1728,7 +1766,6 @@ memo_get(PicklerObject *self, PyObject *key) len = 5; } else { /* unlikely */ - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->PicklingError, "memo id too large for LONG_BINGET"); return -1; @@ -1744,7 +1781,7 @@ memo_get(PicklerObject *self, PyObject *key) /* Store an object in the memo, assign it a new unique ID based on the number of objects currently stored in the memo and generate a PUT opcode. */ static int -memo_put(PicklerObject *self, PyObject *obj) +memo_put(PickleState *st, PicklerObject *self, PyObject *obj) { char pdata[30]; Py_ssize_t len; @@ -1785,7 +1822,6 @@ memo_put(PicklerObject *self, PyObject *obj) len = 5; } else { /* unlikely */ - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->PicklingError, "memo id too large for LONG_BINPUT"); return -1; @@ -2338,8 +2374,8 @@ _Pickler_write_bytes(PicklerObject *self, } static int -_save_bytes_data(PicklerObject *self, PyObject *obj, const char *data, - Py_ssize_t size) +_save_bytes_data(PickleState *st, PicklerObject *self, PyObject *obj, + const char *data, Py_ssize_t size) { assert(self->proto >= 3); @@ -2378,7 +2414,7 @@ _save_bytes_data(PicklerObject *self, PyObject *obj, const char *data, return -1; } - if (memo_put(self, obj) < 0) { + if (memo_put(st, self, obj) < 0) { return -1; } @@ -2386,7 +2422,7 @@ _save_bytes_data(PicklerObject *self, PyObject *obj, const char *data, } static int -save_bytes(PicklerObject *self, PyObject *obj) +save_bytes(PickleState *st, PicklerObject *self, PyObject *obj) { if (self->proto < 3) { /* Older pickle protocols do not have an opcode for pickling bytes @@ -2407,7 +2443,6 @@ save_bytes(PicklerObject *self, PyObject *obj) reduce_value = Py_BuildValue("(O())", (PyObject*)&PyBytes_Type); } else { - PickleState *st = _Pickle_GetGlobalState(); PyObject *unicode_str = PyUnicode_DecodeLatin1(PyBytes_AS_STRING(obj), PyBytes_GET_SIZE(obj), @@ -2425,19 +2460,19 @@ save_bytes(PicklerObject *self, PyObject *obj) return -1; /* save_reduce() will memoize the object automatically. */ - status = save_reduce(self, reduce_value, obj); + status = save_reduce(st, self, reduce_value, obj); Py_DECREF(reduce_value); return status; } else { - return _save_bytes_data(self, obj, PyBytes_AS_STRING(obj), + return _save_bytes_data(st, self, obj, PyBytes_AS_STRING(obj), PyBytes_GET_SIZE(obj)); } } static int -_save_bytearray_data(PicklerObject *self, PyObject *obj, const char *data, - Py_ssize_t size) +_save_bytearray_data(PickleState *state, PicklerObject *self, PyObject *obj, + const char *data, Py_ssize_t size) { assert(self->proto >= 5); @@ -2455,7 +2490,7 @@ _save_bytearray_data(PicklerObject *self, PyObject *obj, const char *data, return -1; } - if (memo_put(self, obj) < 0) { + if (memo_put(state, self, obj) < 0) { return -1; } @@ -2463,7 +2498,7 @@ _save_bytearray_data(PicklerObject *self, PyObject *obj, const char *data, } static int -save_bytearray(PicklerObject *self, PyObject *obj) +save_bytearray(PickleState *state, PicklerObject *self, PyObject *obj) { if (self->proto < 5) { /* Older pickle protocols do not have an opcode for pickling @@ -2488,21 +2523,21 @@ save_bytearray(PicklerObject *self, PyObject *obj) return -1; /* save_reduce() will memoize the object automatically. */ - status = save_reduce(self, reduce_value, obj); + status = save_reduce(state, self, reduce_value, obj); Py_DECREF(reduce_value); return status; } else { - return _save_bytearray_data(self, obj, PyByteArray_AS_STRING(obj), + return _save_bytearray_data(state, self, obj, + PyByteArray_AS_STRING(obj), PyByteArray_GET_SIZE(obj)); } } static int -save_picklebuffer(PicklerObject *self, PyObject *obj) +save_picklebuffer(PickleState *st, PicklerObject *self, PyObject *obj) { if (self->proto < 5) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->PicklingError, "PickleBuffer can only pickled with protocol >= 5"); return -1; @@ -2512,7 +2547,6 @@ save_picklebuffer(PicklerObject *self, PyObject *obj) return -1; } if (view->suboffsets != NULL || !PyBuffer_IsContiguous(view, 'A')) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->PicklingError, "PickleBuffer can not be pickled when " "pointing to a non-contiguous buffer"); @@ -2533,11 +2567,11 @@ save_picklebuffer(PicklerObject *self, PyObject *obj) if (in_band) { /* Write data in-band */ if (view->readonly) { - return _save_bytes_data(self, obj, (const char*) view->buf, + return _save_bytes_data(st, self, obj, (const char *)view->buf, view->len); } else { - return _save_bytearray_data(self, obj, (const char*) view->buf, + return _save_bytearray_data(st, self, obj, (const char *)view->buf, view->len); } } @@ -2692,7 +2726,7 @@ write_unicode_binary(PicklerObject *self, PyObject *obj) } static int -save_unicode(PicklerObject *self, PyObject *obj) +save_unicode(PickleState *state, PicklerObject *self, PyObject *obj) { if (self->bin) { if (write_unicode_binary(self, obj) < 0) @@ -2722,7 +2756,7 @@ save_unicode(PicklerObject *self, PyObject *obj) if (_Pickler_Write(self, "\n", 1) < 0) return -1; } - if (memo_put(self, obj) < 0) + if (memo_put(state, self, obj) < 0) return -1; return 0; @@ -2730,7 +2764,8 @@ save_unicode(PicklerObject *self, PyObject *obj) /* A helper for save_tuple. Push the len elements in tuple t on the stack. */ static int -store_tuple_elements(PicklerObject *self, PyObject *t, Py_ssize_t len) +store_tuple_elements(PickleState *state, PicklerObject *self, PyObject *t, + Py_ssize_t len) { Py_ssize_t i; @@ -2741,7 +2776,7 @@ store_tuple_elements(PicklerObject *self, PyObject *t, Py_ssize_t len) if (element == NULL) return -1; - if (save(self, element, 0) < 0) + if (save(state, self, element, 0) < 0) return -1; } @@ -2755,7 +2790,7 @@ store_tuple_elements(PicklerObject *self, PyObject *t, Py_ssize_t len) * magic so that it works in all cases. IOW, this is a long routine. */ static int -save_tuple(PicklerObject *self, PyObject *obj) +save_tuple(PickleState *state, PicklerObject *self, PyObject *obj) { Py_ssize_t len, i; @@ -2792,7 +2827,7 @@ save_tuple(PicklerObject *self, PyObject *obj) */ if (len <= 3 && self->proto >= 2) { /* Use TUPLE{1,2,3} opcodes. */ - if (store_tuple_elements(self, obj, len) < 0) + if (store_tuple_elements(state, self, obj, len) < 0) return -1; if (PyMemoTable_Get(self->memo, obj)) { @@ -2801,7 +2836,7 @@ save_tuple(PicklerObject *self, PyObject *obj) if (_Pickler_Write(self, &pop_op, 1) < 0) return -1; /* fetch from memo */ - if (memo_get(self, obj) < 0) + if (memo_get(state, self, obj) < 0) return -1; return 0; @@ -2819,7 +2854,7 @@ save_tuple(PicklerObject *self, PyObject *obj) if (_Pickler_Write(self, &mark_op, 1) < 0) return -1; - if (store_tuple_elements(self, obj, len) < 0) + if (store_tuple_elements(state, self, obj, len) < 0) return -1; if (PyMemoTable_Get(self->memo, obj)) { @@ -2837,7 +2872,7 @@ save_tuple(PicklerObject *self, PyObject *obj) return -1; } /* fetch from memo */ - if (memo_get(self, obj) < 0) + if (memo_get(state, self, obj) < 0) return -1; return 0; @@ -2848,7 +2883,7 @@ save_tuple(PicklerObject *self, PyObject *obj) } memoize: - if (memo_put(self, obj) < 0) + if (memo_put(state, self, obj) < 0) return -1; return 0; @@ -2861,7 +2896,7 @@ save_tuple(PicklerObject *self, PyObject *obj) * Returns 0 on success, <0 on error. */ static int -batch_list(PicklerObject *self, PyObject *iter) +batch_list(PickleState *state, PicklerObject *self, PyObject *iter) { PyObject *obj = NULL; PyObject *firstitem = NULL; @@ -2887,7 +2922,7 @@ batch_list(PicklerObject *self, PyObject *iter) return -1; break; } - i = save(self, obj, 0); + i = save(state, self, obj, 0); Py_DECREF(obj); if (i < 0) return -1; @@ -2916,7 +2951,7 @@ batch_list(PicklerObject *self, PyObject *iter) goto error; /* Only one item to write */ - if (save(self, firstitem, 0) < 0) + if (save(state, self, firstitem, 0) < 0) goto error; if (_Pickler_Write(self, &append_op, 1) < 0) goto error; @@ -2930,14 +2965,14 @@ batch_list(PicklerObject *self, PyObject *iter) if (_Pickler_Write(self, &mark_op, 1) < 0) goto error; - if (save(self, firstitem, 0) < 0) + if (save(state, self, firstitem, 0) < 0) goto error; Py_CLEAR(firstitem); n = 1; /* Fetch and save up to BATCHSIZE items */ while (obj) { - if (save(self, obj, 0) < 0) + if (save(state, self, obj, 0) < 0) goto error; Py_CLEAR(obj); n += 1; @@ -2977,7 +3012,7 @@ batch_list(PicklerObject *self, PyObject *iter) * Note that this only works for protocols > 0. */ static int -batch_list_exact(PicklerObject *self, PyObject *obj) +batch_list_exact(PickleState *state, PicklerObject *self, PyObject *obj) { PyObject *item = NULL; Py_ssize_t this_batch, total; @@ -2993,7 +3028,7 @@ batch_list_exact(PicklerObject *self, PyObject *obj) if (PyList_GET_SIZE(obj) == 1) { item = PyList_GET_ITEM(obj, 0); Py_INCREF(item); - int err = save(self, item, 0); + int err = save(state, self, item, 0); Py_DECREF(item); if (err < 0) return -1; @@ -3011,7 +3046,7 @@ batch_list_exact(PicklerObject *self, PyObject *obj) while (total < PyList_GET_SIZE(obj)) { item = PyList_GET_ITEM(obj, total); Py_INCREF(item); - int err = save(self, item, 0); + int err = save(state, self, item, 0); Py_DECREF(item); if (err < 0) return -1; @@ -3028,7 +3063,7 @@ batch_list_exact(PicklerObject *self, PyObject *obj) } static int -save_list(PicklerObject *self, PyObject *obj) +save_list(PickleState *state, PicklerObject *self, PyObject *obj) { char header[3]; Py_ssize_t len; @@ -3055,7 +3090,7 @@ save_list(PicklerObject *self, PyObject *obj) if ((len = PyList_Size(obj)) < 0) goto error; - if (memo_put(self, obj) < 0) + if (memo_put(state, self, obj) < 0) goto error; if (len != 0) { @@ -3063,7 +3098,7 @@ save_list(PicklerObject *self, PyObject *obj) if (PyList_CheckExact(obj) && self->proto > 0) { if (_Py_EnterRecursiveCall(" while pickling an object")) goto error; - status = batch_list_exact(self, obj); + status = batch_list_exact(state, self, obj); _Py_LeaveRecursiveCall(); } else { PyObject *iter = PyObject_GetIter(obj); @@ -3074,7 +3109,7 @@ save_list(PicklerObject *self, PyObject *obj) Py_DECREF(iter); goto error; } - status = batch_list(self, iter); + status = batch_list(state, self, iter); _Py_LeaveRecursiveCall(); Py_DECREF(iter); } @@ -3102,7 +3137,7 @@ save_list(PicklerObject *self, PyObject *obj) * ugly to bear. */ static int -batch_dict(PicklerObject *self, PyObject *iter) +batch_dict(PickleState *state, PicklerObject *self, PyObject *iter) { PyObject *obj = NULL; PyObject *firstitem = NULL; @@ -3128,9 +3163,9 @@ batch_dict(PicklerObject *self, PyObject *iter) "iterator must return 2-tuples"); return -1; } - i = save(self, PyTuple_GET_ITEM(obj, 0), 0); + i = save(state, self, PyTuple_GET_ITEM(obj, 0), 0); if (i >= 0) - i = save(self, PyTuple_GET_ITEM(obj, 1), 0); + i = save(state, self, PyTuple_GET_ITEM(obj, 1), 0); Py_DECREF(obj); if (i < 0) return -1; @@ -3164,9 +3199,9 @@ batch_dict(PicklerObject *self, PyObject *iter) goto error; /* Only one item to write */ - if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0) + if (save(state, self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0) goto error; - if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0) + if (save(state, self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0) goto error; if (_Pickler_Write(self, &setitem_op, 1) < 0) goto error; @@ -3180,9 +3215,9 @@ batch_dict(PicklerObject *self, PyObject *iter) if (_Pickler_Write(self, &mark_op, 1) < 0) goto error; - if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0) + if (save(state, self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0) goto error; - if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0) + if (save(state, self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0) goto error; Py_CLEAR(firstitem); n = 1; @@ -3194,8 +3229,8 @@ batch_dict(PicklerObject *self, PyObject *iter) "iterator must return 2-tuples"); goto error; } - if (save(self, PyTuple_GET_ITEM(obj, 0), 0) < 0 || - save(self, PyTuple_GET_ITEM(obj, 1), 0) < 0) + if (save(state, self, PyTuple_GET_ITEM(obj, 0), 0) < 0 || + save(state, self, PyTuple_GET_ITEM(obj, 1), 0) < 0) goto error; Py_CLEAR(obj); n += 1; @@ -3233,7 +3268,7 @@ batch_dict(PicklerObject *self, PyObject *iter) * Note that this currently doesn't work for protocol 0. */ static int -batch_dict_exact(PicklerObject *self, PyObject *obj) +batch_dict_exact(PickleState *state, PicklerObject *self, PyObject *obj) { PyObject *key = NULL, *value = NULL; int i; @@ -3253,10 +3288,10 @@ batch_dict_exact(PicklerObject *self, PyObject *obj) PyDict_Next(obj, &ppos, &key, &value); Py_INCREF(key); Py_INCREF(value); - if (save(self, key, 0) < 0) { + if (save(state, self, key, 0) < 0) { goto error; } - if (save(self, value, 0) < 0) { + if (save(state, self, value, 0) < 0) { goto error; } Py_CLEAR(key); @@ -3274,10 +3309,10 @@ batch_dict_exact(PicklerObject *self, PyObject *obj) while (PyDict_Next(obj, &ppos, &key, &value)) { Py_INCREF(key); Py_INCREF(value); - if (save(self, key, 0) < 0) { + if (save(state, self, key, 0) < 0) { goto error; } - if (save(self, value, 0) < 0) { + if (save(state, self, value, 0) < 0) { goto error; } Py_CLEAR(key); @@ -3303,7 +3338,7 @@ batch_dict_exact(PicklerObject *self, PyObject *obj) } static int -save_dict(PicklerObject *self, PyObject *obj) +save_dict(PickleState *state, PicklerObject *self, PyObject *obj) { PyObject *items, *iter; char header[3]; @@ -3328,7 +3363,7 @@ save_dict(PicklerObject *self, PyObject *obj) if (_Pickler_Write(self, header, len) < 0) goto error; - if (memo_put(self, obj) < 0) + if (memo_put(state, self, obj) < 0) goto error; if (PyDict_GET_SIZE(obj)) { @@ -3338,7 +3373,7 @@ save_dict(PicklerObject *self, PyObject *obj) not a dict subclass. */ if (_Py_EnterRecursiveCall(" while pickling an object")) goto error; - status = batch_dict_exact(self, obj); + status = batch_dict_exact(state, self, obj); _Py_LeaveRecursiveCall(); } else { items = PyObject_CallMethodNoArgs(obj, &_Py_ID(items)); @@ -3352,7 +3387,7 @@ save_dict(PicklerObject *self, PyObject *obj) Py_DECREF(iter); goto error; } - status = batch_dict(self, iter); + status = batch_dict(state, self, iter); _Py_LeaveRecursiveCall(); Py_DECREF(iter); } @@ -3370,7 +3405,7 @@ save_dict(PicklerObject *self, PyObject *obj) } static int -save_set(PicklerObject *self, PyObject *obj) +save_set(PickleState *state, PicklerObject *self, PyObject *obj) { PyObject *item; int i; @@ -3396,7 +3431,7 @@ save_set(PicklerObject *self, PyObject *obj) return -1; } /* save_reduce() will memoize the object automatically. */ - status = save_reduce(self, reduce_value, obj); + status = save_reduce(state, self, reduce_value, obj); Py_DECREF(reduce_value); return status; } @@ -3404,7 +3439,7 @@ save_set(PicklerObject *self, PyObject *obj) if (_Pickler_Write(self, &empty_set_op, 1) < 0) return -1; - if (memo_put(self, obj) < 0) + if (memo_put(state, self, obj) < 0) return -1; set_size = PySet_GET_SIZE(obj); @@ -3418,7 +3453,7 @@ save_set(PicklerObject *self, PyObject *obj) return -1; while (_PySet_NextEntry(obj, &ppos, &item, &hash)) { Py_INCREF(item); - int err = save(self, item, 0); + int err = save(state, self, item, 0); Py_CLEAR(item); if (err < 0) return -1; @@ -3439,7 +3474,7 @@ save_set(PicklerObject *self, PyObject *obj) } static int -save_frozenset(PicklerObject *self, PyObject *obj) +save_frozenset(PickleState *state, PicklerObject *self, PyObject *obj) { PyObject *iter; @@ -3465,7 +3500,7 @@ save_frozenset(PicklerObject *self, PyObject *obj) return -1; } /* save_reduce() will memoize the object automatically. */ - status = save_reduce(self, reduce_value, obj); + status = save_reduce(state, self, reduce_value, obj); Py_DECREF(reduce_value); return status; } @@ -3488,7 +3523,7 @@ save_frozenset(PicklerObject *self, PyObject *obj) } break; } - if (save(self, item, 0) < 0) { + if (save(state, self, item, 0) < 0) { Py_DECREF(item); Py_DECREF(iter); return -1; @@ -3505,25 +3540,24 @@ save_frozenset(PicklerObject *self, PyObject *obj) if (_Pickler_Write(self, &pop_mark_op, 1) < 0) return -1; - if (memo_get(self, obj) < 0) + if (memo_get(state, self, obj) < 0) return -1; return 0; } if (_Pickler_Write(self, &frozenset_op, 1) < 0) return -1; - if (memo_put(self, obj) < 0) + if (memo_put(state, self, obj) < 0) return -1; return 0; } static int -fix_imports(PyObject **module_name, PyObject **global_name) +fix_imports(PickleState *st, PyObject **module_name, PyObject **global_name) { PyObject *key; PyObject *item; - PickleState *st = _Pickle_GetGlobalState(); key = PyTuple_Pack(2, *module_name, *global_name); if (key == NULL) @@ -3582,7 +3616,8 @@ fix_imports(PyObject **module_name, PyObject **global_name) } static int -save_global(PicklerObject *self, PyObject *obj, PyObject *name) +save_global(PickleState *st, PicklerObject *self, PyObject *obj, + PyObject *name) { PyObject *global_name = NULL; PyObject *module_name = NULL; @@ -3591,7 +3626,6 @@ save_global(PicklerObject *self, PyObject *obj, PyObject *name) PyObject *dotted_path = NULL; PyObject *lastname = NULL; PyObject *cls; - PickleState *st = _Pickle_GetGlobalState(); int status = 0; const char global_op = GLOBAL; @@ -3727,21 +3761,20 @@ save_global(PicklerObject *self, PyObject *obj, PyObject *name) if (self->proto >= 4) { const char stack_global_op = STACK_GLOBAL; - if (save(self, module_name, 0) < 0) + if (save(st, self, module_name, 0) < 0) goto error; - if (save(self, global_name, 0) < 0) + if (save(st, self, global_name, 0) < 0) goto error; if (_Pickler_Write(self, &stack_global_op, 1) < 0) goto error; } else if (parent != module) { - PickleState *st = _Pickle_GetGlobalState(); PyObject *reduce_value = Py_BuildValue("(O(OO))", st->getattr, parent, lastname); if (reduce_value == NULL) goto error; - status = save_reduce(self, reduce_value, NULL); + status = save_reduce(st, self, reduce_value, NULL); Py_DECREF(reduce_value); if (status < 0) goto error; @@ -3759,7 +3792,7 @@ save_global(PicklerObject *self, PyObject *obj, PyObject *name) /* For protocol < 3 and if the user didn't request against doing so, we convert module names to the old 2.x module names. */ if (self->proto < 3 && self->fix_imports) { - if (fix_imports(&module_name, &global_name) < 0) { + if (fix_imports(st, &module_name, &global_name) < 0) { goto error; } } @@ -3813,7 +3846,7 @@ save_global(PicklerObject *self, PyObject *obj, PyObject *name) goto error; } /* Memoize the object. */ - if (memo_put(self, obj) < 0) + if (memo_put(st, self, obj) < 0) goto error; } @@ -3832,7 +3865,8 @@ save_global(PicklerObject *self, PyObject *obj, PyObject *name) } static int -save_singleton_type(PicklerObject *self, PyObject *obj, PyObject *singleton) +save_singleton_type(PickleState *state, PicklerObject *self, PyObject *obj, + PyObject *singleton) { PyObject *reduce_value; int status; @@ -3841,28 +3875,28 @@ save_singleton_type(PicklerObject *self, PyObject *obj, PyObject *singleton) if (reduce_value == NULL) { return -1; } - status = save_reduce(self, reduce_value, obj); + status = save_reduce(state, self, reduce_value, obj); Py_DECREF(reduce_value); return status; } static int -save_type(PicklerObject *self, PyObject *obj) +save_type(PickleState *state, PicklerObject *self, PyObject *obj) { if (obj == (PyObject *)&_PyNone_Type) { - return save_singleton_type(self, obj, Py_None); + return save_singleton_type(state, self, obj, Py_None); } else if (obj == (PyObject *)&PyEllipsis_Type) { - return save_singleton_type(self, obj, Py_Ellipsis); + return save_singleton_type(state, self, obj, Py_Ellipsis); } else if (obj == (PyObject *)&_PyNotImplemented_Type) { - return save_singleton_type(self, obj, Py_NotImplemented); + return save_singleton_type(state, self, obj, Py_NotImplemented); } - return save_global(self, obj, NULL); + return save_global(state, self, obj, NULL); } static int -save_pers(PicklerObject *self, PyObject *obj) +save_pers(PickleState *state, PicklerObject *self, PyObject *obj) { PyObject *pid = NULL; int status = 0; @@ -3876,7 +3910,7 @@ save_pers(PicklerObject *self, PyObject *obj) if (pid != Py_None) { if (self->bin) { - if (save(self, pid, 1) < 0 || + if (save(state, self, pid, 1) < 0 || _Pickler_Write(self, &binpersid_op, 1) < 0) goto error; } @@ -3890,7 +3924,7 @@ save_pers(PicklerObject *self, PyObject *obj) /* XXX: Should it check whether the pid contains embedded newlines? */ if (!PyUnicode_IS_ASCII(pid_str)) { - PyErr_SetString(_Pickle_GetGlobalState()->PicklingError, + PyErr_SetString(state->PicklingError, "persistent IDs in protocol 0 must be " "ASCII strings"); Py_DECREF(pid_str); @@ -3933,7 +3967,8 @@ get_class(PyObject *obj) * appropriate __reduce__ method for obj. */ static int -save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) +save_reduce(PickleState *st, PicklerObject *self, PyObject *args, + PyObject *obj) { PyObject *callable; PyObject *argtup; @@ -3941,7 +3976,6 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) PyObject *listitems = Py_None; PyObject *dictitems = Py_None; PyObject *state_setter = Py_None; - PickleState *st = _Pickle_GetGlobalState(); Py_ssize_t size; int use_newobj = 0, use_newobj_ex = 0; @@ -4053,9 +4087,9 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) } if (self->proto >= 4) { - if (save(self, cls, 0) < 0 || - save(self, args, 0) < 0 || - save(self, kwargs, 0) < 0 || + if (save(st, self, cls, 0) < 0 || + save(st, self, args, 0) < 0 || + save(st, self, kwargs, 0) < 0 || _Pickler_Write(self, &newobj_ex_op, 1) < 0) { return -1; } @@ -4092,8 +4126,8 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) return -1; } - if (save(self, callable, 0) < 0 || - save(self, newargs, 0) < 0 || + if (save(st, self, callable, 0) < 0 || + save(st, self, newargs, 0) < 0 || _Pickler_Write(self, &reduce_op, 1) < 0) { Py_DECREF(newargs); Py_DECREF(callable); @@ -4163,14 +4197,15 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) function. */ /* Save the class and its __new__ arguments. */ - if (save(self, cls, 0) < 0) + if (save(st, self, cls, 0) < 0) { return -1; + } newargtup = PyTuple_GetSlice(argtup, 1, PyTuple_GET_SIZE(argtup)); if (newargtup == NULL) return -1; - p = save(self, newargtup, 0); + p = save(st, self, newargtup, 0); Py_DECREF(newargtup); if (p < 0) return -1; @@ -4180,8 +4215,8 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) return -1; } else { /* Not using NEWOBJ. */ - if (save(self, callable, 0) < 0 || - save(self, argtup, 0) < 0 || + if (save(st, self, callable, 0) < 0 || + save(st, self, argtup, 0) < 0 || _Pickler_Write(self, &reduce_op, 1) < 0) return -1; } @@ -4199,24 +4234,24 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) if (_Pickler_Write(self, &pop_op, 1) < 0) return -1; - if (memo_get(self, obj) < 0) + if (memo_get(st, self, obj) < 0) return -1; return 0; } - else if (memo_put(self, obj) < 0) + else if (memo_put(st, self, obj) < 0) return -1; } - if (listitems && batch_list(self, listitems) < 0) + if (listitems && batch_list(st, self, listitems) < 0) return -1; - if (dictitems && batch_dict(self, dictitems) < 0) + if (dictitems && batch_dict(st, self, dictitems) < 0) return -1; if (state) { if (state_setter == NULL) { - if (save(self, state, 0) < 0 || + if (save(st, self, state, 0) < 0 || _Pickler_Write(self, &build_op, 1) < 0) return -1; } @@ -4233,8 +4268,8 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) const char tupletwo_op = TUPLE2; const char pop_op = POP; - if (save(self, state_setter, 0) < 0 || - save(self, obj, 0) < 0 || save(self, state, 0) < 0 || + if (save(st, self, state_setter, 0) < 0 || + save(st, self, obj, 0) < 0 || save(st, self, state, 0) < 0 || _Pickler_Write(self, &tupletwo_op, 1) < 0 || _Pickler_Write(self, &reduce_op, 1) < 0 || _Pickler_Write(self, &pop_op, 1) < 0) @@ -4245,7 +4280,7 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) } static int -save(PicklerObject *self, PyObject *obj, int pers_save) +save(PickleState *st, PicklerObject *self, PyObject *obj, int pers_save) { PyTypeObject *type; PyObject *reduce_func = NULL; @@ -4263,7 +4298,7 @@ save(PicklerObject *self, PyObject *obj, int pers_save) 0 if it did nothing successfully; 1 if a persistent id was saved. */ - if ((status = save_pers(self, obj)) != 0) + if ((status = save_pers(st, self, obj)) != 0) return status; } @@ -4293,14 +4328,14 @@ save(PicklerObject *self, PyObject *obj, int pers_save) a GET (or BINGET) opcode, instead of pickling the object once again. */ if (PyMemoTable_Get(self->memo, obj)) { - return memo_get(self, obj); + return memo_get(st, self, obj); } if (type == &PyBytes_Type) { - return save_bytes(self, obj); + return save_bytes(st, self, obj); } else if (type == &PyUnicode_Type) { - return save_unicode(self, obj); + return save_unicode(st, self, obj); } /* We're only calling _Py_EnterRecursiveCall here so that atomic @@ -4310,31 +4345,31 @@ save(PicklerObject *self, PyObject *obj, int pers_save) } if (type == &PyDict_Type) { - status = save_dict(self, obj); + status = save_dict(st, self, obj); goto done; } else if (type == &PySet_Type) { - status = save_set(self, obj); + status = save_set(st, self, obj); goto done; } else if (type == &PyFrozenSet_Type) { - status = save_frozenset(self, obj); + status = save_frozenset(st, self, obj); goto done; } else if (type == &PyList_Type) { - status = save_list(self, obj); + status = save_list(st, self, obj); goto done; } else if (type == &PyTuple_Type) { - status = save_tuple(self, obj); + status = save_tuple(st, self, obj); goto done; } else if (type == &PyByteArray_Type) { - status = save_bytearray(self, obj); + status = save_bytearray(st, self, obj); goto done; } else if (type == &PyPickleBuffer_Type) { - status = save_picklebuffer(self, obj); + status = save_picklebuffer(st, self, obj); goto done; } @@ -4354,11 +4389,11 @@ save(PicklerObject *self, PyObject *obj, int pers_save) } if (type == &PyType_Type) { - status = save_type(self, obj); + status = save_type(st, self, obj); goto done; } else if (type == &PyFunction_Type) { - status = save_global(self, obj, NULL); + status = save_global(st, self, obj, NULL); goto done; } @@ -4369,7 +4404,6 @@ save(PicklerObject *self, PyObject *obj, int pers_save) * __reduce_ex__ method, or the object's __reduce__ method. */ if (self->dispatch_table == NULL) { - PickleState *st = _Pickle_GetGlobalState(); reduce_func = PyDict_GetItemWithError(st->dispatch_table, (PyObject *)type); if (reduce_func == NULL) { @@ -4396,7 +4430,7 @@ save(PicklerObject *self, PyObject *obj, int pers_save) reduce_value = _Pickle_FastCall(reduce_func, Py_NewRef(obj)); } else if (PyType_IsSubtype(type, &PyType_Type)) { - status = save_global(self, obj, NULL); + status = save_global(st, self, obj, NULL); goto done; } else { @@ -4428,7 +4462,6 @@ save(PicklerObject *self, PyObject *obj, int pers_save) reduce_value = PyObject_CallNoArgs(reduce_func); } else { - PickleState *st = _Pickle_GetGlobalState(); PyErr_Format(st->PicklingError, "can't pickle '%.200s' object: %R", type->tp_name, obj); @@ -4442,18 +4475,17 @@ save(PicklerObject *self, PyObject *obj, int pers_save) reduce: if (PyUnicode_Check(reduce_value)) { - status = save_global(self, obj, reduce_value); + status = save_global(st, self, obj, reduce_value); goto done; } if (!PyTuple_Check(reduce_value)) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->PicklingError, "__reduce__ must return a string or tuple"); goto error; } - status = save_reduce(self, reduce_value, obj); + status = save_reduce(st, self, reduce_value, obj); if (0) { error: @@ -4469,7 +4501,7 @@ save(PicklerObject *self, PyObject *obj, int pers_save) } static int -dump(PicklerObject *self, PyObject *obj) +dump(PickleState *state, PicklerObject *self, PyObject *obj) { const char stop_op = STOP; int status = -1; @@ -4499,7 +4531,7 @@ dump(PicklerObject *self, PyObject *obj) self->framing = 1; } - if (save(self, obj, 0) < 0 || + if (save(state, self, obj, 0) < 0 || _Pickler_Write(self, &stop_op, 1) < 0 || _Pickler_CommitFrame(self) < 0) goto error; @@ -4546,6 +4578,7 @@ _pickle_Pickler_clear_memo_impl(PicklerObject *self) _pickle.Pickler.dump + cls: defining_class obj: object / @@ -4553,14 +4586,15 @@ Write a pickled representation of the given object to the open file. [clinic start generated code]*/ static PyObject * -_pickle_Pickler_dump(PicklerObject *self, PyObject *obj) -/*[clinic end generated code: output=87ecad1261e02ac7 input=552eb1c0f52260d9]*/ +_pickle_Pickler_dump_impl(PicklerObject *self, PyTypeObject *cls, + PyObject *obj) +/*[clinic end generated code: output=952cf7f68b1445bb input=f949d84151983594]*/ { + PickleState *st = _Pickle_GetStateByClass(cls); /* Check whether the Pickler was initialized correctly (issue3664). Developers often forget to call __init__() in their subclasses, which would trigger a segfault without this check. */ if (self->write == NULL) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_Format(st->PicklingError, "Pickler.__init__() was not called by %s.__init__()", Py_TYPE(self)->tp_name); @@ -4570,7 +4604,7 @@ _pickle_Pickler_dump(PicklerObject *self, PyObject *obj) if (_Pickler_ClearBuffer(self) < 0) return NULL; - if (dump(self, obj) < 0) + if (dump(st, self, obj) < 0) return NULL; if (_Pickler_FlushToFile(self) < 0) @@ -4612,36 +4646,6 @@ static struct PyMethodDef Pickler_methods[] = { {NULL, NULL} /* sentinel */ }; -static void -Pickler_dealloc(PicklerObject *self) -{ - PyObject_GC_UnTrack(self); - - Py_XDECREF(self->output_buffer); - Py_XDECREF(self->write); - Py_XDECREF(self->pers_func); - Py_XDECREF(self->dispatch_table); - Py_XDECREF(self->fast_memo); - Py_XDECREF(self->reducer_override); - Py_XDECREF(self->buffer_callback); - - PyMemoTable_Del(self->memo); - - Py_TYPE(self)->tp_free((PyObject *)self); -} - -static int -Pickler_traverse(PicklerObject *self, visitproc visit, void *arg) -{ - Py_VISIT(self->write); - Py_VISIT(self->pers_func); - Py_VISIT(self->dispatch_table); - Py_VISIT(self->fast_memo); - Py_VISIT(self->reducer_override); - Py_VISIT(self->buffer_callback); - return 0; -} - static int Pickler_clear(PicklerObject *self) { @@ -4661,6 +4665,29 @@ Pickler_clear(PicklerObject *self) return 0; } +static void +Pickler_dealloc(PicklerObject *self) +{ + PyTypeObject *tp = Py_TYPE(self); + PyObject_GC_UnTrack(self); + (void)Pickler_clear(self); + tp->tp_free((PyObject *)self); + Py_DECREF(tp); +} + +static int +Pickler_traverse(PicklerObject *self, visitproc visit, void *arg) +{ + Py_VISIT(Py_TYPE(self)); + Py_VISIT(self->write); + Py_VISIT(self->pers_func); + Py_VISIT(self->dispatch_table); + Py_VISIT(self->fast_memo); + Py_VISIT(self->reducer_override); + Py_VISIT(self->buffer_callback); + return 0; +} + /*[clinic input] @@ -4870,15 +4897,18 @@ static PyMethodDef picklerproxy_methods[] = { static void PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self) { + PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); - Py_XDECREF(self->pickler); - PyObject_GC_Del((PyObject *)self); + Py_CLEAR(self->pickler); + tp->tp_free((PyObject *)self); + Py_DECREF(tp); } static int PicklerMemoProxy_traverse(PicklerMemoProxyObject *self, visitproc visit, void *arg) { + Py_VISIT(Py_TYPE(self)); Py_VISIT(self->pickler); return 0; } @@ -4890,43 +4920,29 @@ PicklerMemoProxy_clear(PicklerMemoProxyObject *self) return 0; } -static PyTypeObject PicklerMemoProxyType = { - PyVarObject_HEAD_INIT(NULL, 0) - "_pickle.PicklerMemoProxy", /*tp_name*/ - sizeof(PicklerMemoProxyObject), /*tp_basicsize*/ - 0, - (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - PyObject_HashNotImplemented, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - PyObject_GenericSetAttr, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, - 0, /* tp_doc */ - (traverseproc)PicklerMemoProxy_traverse, /* tp_traverse */ - (inquiry)PicklerMemoProxy_clear, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - picklerproxy_methods, /* tp_methods */ +static PyType_Slot memoproxy_slots[] = { + {Py_tp_dealloc, PicklerMemoProxy_dealloc}, + {Py_tp_traverse, PicklerMemoProxy_traverse}, + {Py_tp_clear, PicklerMemoProxy_clear}, + {Py_tp_methods, picklerproxy_methods}, + {Py_tp_hash, PyObject_HashNotImplemented}, + {0, NULL}, +}; + +static PyType_Spec memoproxy_spec = { + .name = "_pickle.PicklerMemoProxy", + .basicsize = sizeof(PicklerMemoProxyObject), + .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_IMMUTABLETYPE), + .slots = memoproxy_slots, }; static PyObject * PicklerMemoProxy_New(PicklerObject *pickler) { PicklerMemoProxyObject *self; - - self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType); + PickleState *st = _Pickle_FindStateByType(Py_TYPE(pickler)); + self = PyObject_GC_New(PicklerMemoProxyObject, st->PicklerMemoProxyType); if (self == NULL) return NULL; self->pickler = (PicklerObject*)Py_NewRef(pickler); @@ -4953,7 +4969,8 @@ Pickler_set_memo(PicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored)) return -1; } - if (Py_IS_TYPE(obj, &PicklerMemoProxyType)) { + PickleState *st = _Pickle_FindStateByType(Py_TYPE(self)); + if (Py_IS_TYPE(obj, st->PicklerMemoProxyType)) { PicklerObject *pickler = ((PicklerMemoProxyObject *)obj)->pickler; @@ -5049,47 +5066,27 @@ static PyGetSetDef Pickler_getsets[] = { {NULL} }; -static PyTypeObject Pickler_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_pickle.Pickler" , /*tp_name*/ - sizeof(PicklerObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)Pickler_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, - _pickle_Pickler___init____doc__, /*tp_doc*/ - (traverseproc)Pickler_traverse, /*tp_traverse*/ - (inquiry)Pickler_clear, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - Pickler_methods, /*tp_methods*/ - Pickler_members, /*tp_members*/ - Pickler_getsets, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - _pickle_Pickler___init__, /*tp_init*/ - PyType_GenericAlloc, /*tp_alloc*/ - PyType_GenericNew, /*tp_new*/ - PyObject_GC_Del, /*tp_free*/ - 0, /*tp_is_gc*/ +static PyType_Slot pickler_type_slots[] = { + {Py_tp_dealloc, Pickler_dealloc}, + {Py_tp_methods, Pickler_methods}, + {Py_tp_members, Pickler_members}, + {Py_tp_getset, Pickler_getsets}, + {Py_tp_clear, Pickler_clear}, + {Py_tp_doc, (char*)_pickle_Pickler___init____doc__}, + {Py_tp_traverse, Pickler_traverse}, + {Py_tp_init, _pickle_Pickler___init__}, + {Py_tp_new, PyType_GenericNew}, + {Py_tp_alloc, PyType_GenericAlloc}, + {Py_tp_free, PyObject_GC_Del}, + {0, NULL}, +}; + +static PyType_Spec pickler_type_spec = { + .name = "_pickle.Pickler", + .basicsize = sizeof(PicklerObject), + .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_IMMUTABLETYPE), + .slots = pickler_type_slots, }; /* Temporary helper for calling self.find_class(). @@ -5107,17 +5104,14 @@ find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name) } static Py_ssize_t -marker(UnpicklerObject *self) +marker(PickleState *st, UnpicklerObject *self) { - Py_ssize_t mark; - if (self->num_marks < 1) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->UnpicklingError, "could not find MARK"); return -1; } - mark = self->marks[--self->num_marks]; + Py_ssize_t mark = self->marks[--self->num_marks]; self->stack->mark_set = self->num_marks != 0; self->stack->fence = self->num_marks ? self->marks[self->num_marks - 1] : 0; @@ -5125,24 +5119,24 @@ marker(UnpicklerObject *self) } static int -load_none(UnpicklerObject *self) +load_none(PickleState *state, UnpicklerObject *self) { PDATA_APPEND(self->stack, Py_None, -1); return 0; } static int -load_int(UnpicklerObject *self) +load_int(PickleState *state, UnpicklerObject *self) { PyObject *value; char *endptr, *s; Py_ssize_t len; long x; - if ((len = _Unpickler_Readline(self, &s)) < 0) + if ((len = _Unpickler_Readline(state, self, &s)) < 0) return -1; if (len < 2) - return bad_readline(); + return bad_readline(state); errno = 0; /* XXX: Should the base argument of strtol() be explicitly set to 10? @@ -5177,7 +5171,7 @@ load_int(UnpicklerObject *self) } static int -load_bool(UnpicklerObject *self, PyObject *boolean) +load_bool(PickleState *state, UnpicklerObject *self, PyObject *boolean) { assert(boolean == Py_True || boolean == Py_False); PDATA_APPEND(self->stack, boolean, -1); @@ -5257,49 +5251,46 @@ load_binintx(UnpicklerObject *self, char *s, int size) } static int -load_binint(UnpicklerObject *self) +load_binint(PickleState *state, UnpicklerObject *self) { char *s; - - if (_Unpickler_Read(self, &s, 4) < 0) + if (_Unpickler_Read(self, state, &s, 4) < 0) return -1; return load_binintx(self, s, 4); } static int -load_binint1(UnpicklerObject *self) +load_binint1(PickleState *state, UnpicklerObject *self) { char *s; - - if (_Unpickler_Read(self, &s, 1) < 0) + if (_Unpickler_Read(self, state, &s, 1) < 0) return -1; return load_binintx(self, s, 1); } static int -load_binint2(UnpicklerObject *self) +load_binint2(PickleState *state, UnpicklerObject *self) { char *s; - - if (_Unpickler_Read(self, &s, 2) < 0) + if (_Unpickler_Read(self, state, &s, 2) < 0) return -1; return load_binintx(self, s, 2); } static int -load_long(UnpicklerObject *self) +load_long(PickleState *state, UnpicklerObject *self) { PyObject *value; char *s = NULL; Py_ssize_t len; - if ((len = _Unpickler_Readline(self, &s)) < 0) + if ((len = _Unpickler_Readline(state, self, &s)) < 0) return -1; if (len < 2) - return bad_readline(); + return bad_readline(state); /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove the 'L' before calling PyLong_FromString. In order to maintain @@ -5320,19 +5311,18 @@ load_long(UnpicklerObject *self) * data following. */ static int -load_counted_long(UnpicklerObject *self, int size) +load_counted_long(PickleState *st, UnpicklerObject *self, int size) { PyObject *value; char *nbytes; char *pdata; assert(size == 1 || size == 4); - if (_Unpickler_Read(self, &nbytes, size) < 0) + if (_Unpickler_Read(self, st, &nbytes, size) < 0) return -1; size = calc_binint(nbytes, size); if (size < 0) { - PickleState *st = _Pickle_GetGlobalState(); /* Corrupt or hostile pickle -- we never write one like this */ PyErr_SetString(st->UnpicklingError, "LONG pickle has negative byte count"); @@ -5343,7 +5333,7 @@ load_counted_long(UnpicklerObject *self, int size) value = PyLong_FromLong(0L); else { /* Read the raw little-endian bytes and convert. */ - if (_Unpickler_Read(self, &pdata, size) < 0) + if (_Unpickler_Read(self, st, &pdata, size) < 0) return -1; value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size, 1 /* little endian */ , 1 /* signed */ ); @@ -5355,17 +5345,17 @@ load_counted_long(UnpicklerObject *self, int size) } static int -load_float(UnpicklerObject *self) +load_float(PickleState *state, UnpicklerObject *self) { PyObject *value; char *endptr, *s; Py_ssize_t len; double d; - if ((len = _Unpickler_Readline(self, &s)) < 0) + if ((len = _Unpickler_Readline(state, self, &s)) < 0) return -1; if (len < 2) - return bad_readline(); + return bad_readline(state); errno = 0; d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError); @@ -5384,13 +5374,13 @@ load_float(UnpicklerObject *self) } static int -load_binfloat(UnpicklerObject *self) +load_binfloat(PickleState *state, UnpicklerObject *self) { PyObject *value; double x; char *s; - if (_Unpickler_Read(self, &s, 8) < 0) + if (_Unpickler_Read(self, state, &s, 8) < 0) return -1; x = PyFloat_Unpack8(s, 0); @@ -5405,14 +5395,14 @@ load_binfloat(UnpicklerObject *self) } static int -load_string(UnpicklerObject *self) +load_string(PickleState *st, UnpicklerObject *self) { PyObject *bytes; PyObject *obj; Py_ssize_t len; char *s, *p; - if ((len = _Unpickler_Readline(self, &s)) < 0) + if ((len = _Unpickler_Readline(st, self, &s)) < 0) return -1; /* Strip the newline */ len--; @@ -5422,7 +5412,6 @@ load_string(UnpicklerObject *self) len -= 2; } else { - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->UnpicklingError, "the STRING opcode argument must be quoted"); return -1; @@ -5453,25 +5442,24 @@ load_string(UnpicklerObject *self) } static int -load_counted_binstring(UnpicklerObject *self, int nbytes) +load_counted_binstring(PickleState *st, UnpicklerObject *self, int nbytes) { PyObject *obj; Py_ssize_t size; char *s; - if (_Unpickler_Read(self, &s, nbytes) < 0) + if (_Unpickler_Read(self, st, &s, nbytes) < 0) return -1; size = calc_binsize(s, nbytes); if (size < 0) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_Format(st->UnpicklingError, "BINSTRING exceeds system's maximum size of %zd bytes", PY_SSIZE_T_MAX); return -1; } - if (_Unpickler_Read(self, &s, size) < 0) + if (_Unpickler_Read(self, st, &s, size) < 0) return -1; /* Convert Python 2.x strings to bytes if the *encoding* given to the @@ -5491,13 +5479,13 @@ load_counted_binstring(UnpicklerObject *self, int nbytes) } static int -load_counted_binbytes(UnpicklerObject *self, int nbytes) +load_counted_binbytes(PickleState *state, UnpicklerObject *self, int nbytes) { PyObject *bytes; Py_ssize_t size; char *s; - if (_Unpickler_Read(self, &s, nbytes) < 0) + if (_Unpickler_Read(self, state, &s, nbytes) < 0) return -1; size = calc_binsize(s, nbytes); @@ -5511,7 +5499,7 @@ load_counted_binbytes(UnpicklerObject *self, int nbytes) bytes = PyBytes_FromStringAndSize(NULL, size); if (bytes == NULL) return -1; - if (_Unpickler_ReadInto(self, PyBytes_AS_STRING(bytes), size) < 0) { + if (_Unpickler_ReadInto(state, self, PyBytes_AS_STRING(bytes), size) < 0) { Py_DECREF(bytes); return -1; } @@ -5521,13 +5509,13 @@ load_counted_binbytes(UnpicklerObject *self, int nbytes) } static int -load_counted_bytearray(UnpicklerObject *self) +load_counted_bytearray(PickleState *state, UnpicklerObject *self) { PyObject *bytearray; Py_ssize_t size; char *s; - if (_Unpickler_Read(self, &s, 8) < 0) { + if (_Unpickler_Read(self, state, &s, 8) < 0) { return -1; } @@ -5543,7 +5531,8 @@ load_counted_bytearray(UnpicklerObject *self) if (bytearray == NULL) { return -1; } - if (_Unpickler_ReadInto(self, PyByteArray_AS_STRING(bytearray), size) < 0) { + char *str = PyByteArray_AS_STRING(bytearray); + if (_Unpickler_ReadInto(state, self, str, size) < 0) { Py_DECREF(bytearray); return -1; } @@ -5553,10 +5542,9 @@ load_counted_bytearray(UnpicklerObject *self) } static int -load_next_buffer(UnpicklerObject *self) +load_next_buffer(PickleState *st, UnpicklerObject *self) { if (self->buffers == NULL) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->UnpicklingError, "pickle stream refers to out-of-band data " "but no *buffers* argument was given"); @@ -5565,7 +5553,6 @@ load_next_buffer(UnpicklerObject *self) PyObject *buf = PyIter_Next(self->buffers); if (buf == NULL) { if (!PyErr_Occurred()) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->UnpicklingError, "not enough out-of-band buffers"); } @@ -5577,11 +5564,11 @@ load_next_buffer(UnpicklerObject *self) } static int -load_readonly_buffer(UnpicklerObject *self) +load_readonly_buffer(PickleState *state, UnpicklerObject *self) { Py_ssize_t len = Py_SIZE(self->stack); if (len <= self->stack->fence) { - return Pdata_stack_underflow(self->stack); + return Pdata_stack_underflow(state, self->stack); } PyObject *obj = self->stack->data[len - 1]; @@ -5603,16 +5590,16 @@ load_readonly_buffer(UnpicklerObject *self) } static int -load_unicode(UnpicklerObject *self) +load_unicode(PickleState *state, UnpicklerObject *self) { PyObject *str; Py_ssize_t len; char *s = NULL; - if ((len = _Unpickler_Readline(self, &s)) < 0) + if ((len = _Unpickler_Readline(state, self, &s)) < 0) return -1; if (len < 1) - return bad_readline(); + return bad_readline(state); str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL); if (str == NULL) @@ -5623,13 +5610,13 @@ load_unicode(UnpicklerObject *self) } static int -load_counted_binunicode(UnpicklerObject *self, int nbytes) +load_counted_binunicode(PickleState *state, UnpicklerObject *self, int nbytes) { PyObject *str; Py_ssize_t size; char *s; - if (_Unpickler_Read(self, &s, nbytes) < 0) + if (_Unpickler_Read(self, state, &s, nbytes) < 0) return -1; size = calc_binsize(s, nbytes); @@ -5640,7 +5627,7 @@ load_counted_binunicode(UnpicklerObject *self, int nbytes) return -1; } - if (_Unpickler_Read(self, &s, size) < 0) + if (_Unpickler_Read(self, state, &s, size) < 0) return -1; str = PyUnicode_DecodeUTF8(s, size, "surrogatepass"); @@ -5652,14 +5639,14 @@ load_counted_binunicode(UnpicklerObject *self, int nbytes) } static int -load_counted_tuple(UnpicklerObject *self, Py_ssize_t len) +load_counted_tuple(PickleState *state, UnpicklerObject *self, Py_ssize_t len) { PyObject *tuple; if (Py_SIZE(self->stack) < len) - return Pdata_stack_underflow(self->stack); + return Pdata_stack_underflow(state, self->stack); - tuple = Pdata_poptuple(self->stack, Py_SIZE(self->stack) - len); + tuple = Pdata_poptuple(state, self->stack, Py_SIZE(self->stack) - len); if (tuple == NULL) return -1; PDATA_PUSH(self->stack, tuple, -1); @@ -5667,18 +5654,18 @@ load_counted_tuple(UnpicklerObject *self, Py_ssize_t len) } static int -load_tuple(UnpicklerObject *self) +load_tuple(PickleState *state, UnpicklerObject *self) { Py_ssize_t i; - if ((i = marker(self)) < 0) + if ((i = marker(state, self)) < 0) return -1; - return load_counted_tuple(self, Py_SIZE(self->stack) - i); + return load_counted_tuple(state, self, Py_SIZE(self->stack) - i); } static int -load_empty_list(UnpicklerObject *self) +load_empty_list(PickleState *state, UnpicklerObject *self) { PyObject *list; @@ -5689,7 +5676,7 @@ load_empty_list(UnpicklerObject *self) } static int -load_empty_dict(UnpicklerObject *self) +load_empty_dict(PickleState *state, UnpicklerObject *self) { PyObject *dict; @@ -5700,7 +5687,7 @@ load_empty_dict(UnpicklerObject *self) } static int -load_empty_set(UnpicklerObject *self) +load_empty_set(PickleState *state, UnpicklerObject *self) { PyObject *set; @@ -5711,12 +5698,12 @@ load_empty_set(UnpicklerObject *self) } static int -load_list(UnpicklerObject *self) +load_list(PickleState *state, UnpicklerObject *self) { PyObject *list; Py_ssize_t i; - if ((i = marker(self)) < 0) + if ((i = marker(state, self)) < 0) return -1; list = Pdata_poplist(self->stack, i); @@ -5727,12 +5714,12 @@ load_list(UnpicklerObject *self) } static int -load_dict(UnpicklerObject *self) +load_dict(PickleState *st, UnpicklerObject *self) { PyObject *dict, *key, *value; Py_ssize_t i, j, k; - if ((i = marker(self)) < 0) + if ((i = marker(st, self)) < 0) return -1; j = Py_SIZE(self->stack); @@ -5740,7 +5727,6 @@ load_dict(UnpicklerObject *self) return -1; if ((j - i) % 2 != 0) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->UnpicklingError, "odd number of items for DICT"); Py_DECREF(dict); return -1; @@ -5760,16 +5746,16 @@ load_dict(UnpicklerObject *self) } static int -load_frozenset(UnpicklerObject *self) +load_frozenset(PickleState *state, UnpicklerObject *self) { PyObject *items; PyObject *frozenset; Py_ssize_t i; - if ((i = marker(self)) < 0) + if ((i = marker(state, self)) < 0) return -1; - items = Pdata_poptuple(self->stack, i); + items = Pdata_poptuple(state, self->stack, i); if (items == NULL) return -1; @@ -5803,22 +5789,22 @@ instantiate(PyObject *cls, PyObject *args) } static int -load_obj(UnpicklerObject *self) +load_obj(PickleState *state, UnpicklerObject *self) { PyObject *cls, *args, *obj = NULL; Py_ssize_t i; - if ((i = marker(self)) < 0) + if ((i = marker(state, self)) < 0) return -1; if (Py_SIZE(self->stack) - i < 1) - return Pdata_stack_underflow(self->stack); + return Pdata_stack_underflow(state, self->stack); - args = Pdata_poptuple(self->stack, i + 1); + args = Pdata_poptuple(state, self->stack, i + 1); if (args == NULL) return -1; - PDATA_POP(self->stack, cls); + PDATA_POP(state, self->stack, cls); if (cls) { obj = instantiate(cls, args); Py_DECREF(cls); @@ -5832,7 +5818,7 @@ load_obj(UnpicklerObject *self) } static int -load_inst(UnpicklerObject *self) +load_inst(PickleState *state, UnpicklerObject *self) { PyObject *cls = NULL; PyObject *args = NULL; @@ -5843,12 +5829,12 @@ load_inst(UnpicklerObject *self) Py_ssize_t i; char *s; - if ((i = marker(self)) < 0) + if ((i = marker(state, self)) < 0) return -1; - if ((len = _Unpickler_Readline(self, &s)) < 0) + if ((len = _Unpickler_Readline(state, self, &s)) < 0) return -1; if (len < 2) - return bad_readline(); + return bad_readline(state); /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII identifiers are permitted in Python 3.0, since the INST opcode is only @@ -5857,10 +5843,10 @@ load_inst(UnpicklerObject *self) if (module_name == NULL) return -1; - if ((len = _Unpickler_Readline(self, &s)) >= 0) { + if ((len = _Unpickler_Readline(state, self, &s)) >= 0) { if (len < 2) { Py_DECREF(module_name); - return bad_readline(); + return bad_readline(state); } class_name = PyUnicode_DecodeASCII(s, len - 1, "strict"); if (class_name != NULL) { @@ -5873,7 +5859,7 @@ load_inst(UnpicklerObject *self) if (cls == NULL) return -1; - if ((args = Pdata_poptuple(self->stack, i)) != NULL) { + if ((args = Pdata_poptuple(state, self->stack, i)) != NULL) { obj = instantiate(cls, args); Py_DECREF(args); } @@ -5887,16 +5873,16 @@ load_inst(UnpicklerObject *self) } static void -newobj_unpickling_error(const char * msg, int use_kwargs, PyObject *arg) +newobj_unpickling_error(PickleState *st, const char *msg, int use_kwargs, + PyObject *arg) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_Format(st->UnpicklingError, msg, use_kwargs ? "NEWOBJ_EX" : "NEWOBJ", Py_TYPE(arg)->tp_name); } static int -load_newobj(UnpicklerObject *self, int use_kwargs) +load_newobj(PickleState *state, UnpicklerObject *self, int use_kwargs) { PyObject *cls, *args, *kwargs = NULL; PyObject *obj; @@ -5905,17 +5891,17 @@ load_newobj(UnpicklerObject *self, int use_kwargs) * cls.__new__(cls, *args, **kwargs). */ if (use_kwargs) { - PDATA_POP(self->stack, kwargs); + PDATA_POP(state, self->stack, kwargs); if (kwargs == NULL) { return -1; } } - PDATA_POP(self->stack, args); + PDATA_POP(state, self->stack, args); if (args == NULL) { Py_XDECREF(kwargs); return -1; } - PDATA_POP(self->stack, cls); + PDATA_POP(state, self->stack, cls); if (cls == NULL) { Py_XDECREF(kwargs); Py_DECREF(args); @@ -5923,22 +5909,26 @@ load_newobj(UnpicklerObject *self, int use_kwargs) } if (!PyType_Check(cls)) { - newobj_unpickling_error("%s class argument must be a type, not %.200s", + newobj_unpickling_error(state, + "%s class argument must be a type, not %.200s", use_kwargs, cls); goto error; } if (((PyTypeObject *)cls)->tp_new == NULL) { - newobj_unpickling_error("%s class argument '%.200s' doesn't have __new__", + newobj_unpickling_error(state, + "%s class argument '%.200s' doesn't have __new__", use_kwargs, cls); goto error; } if (!PyTuple_Check(args)) { - newobj_unpickling_error("%s args argument must be a tuple, not %.200s", + newobj_unpickling_error(state, + "%s args argument must be a tuple, not %.200s", use_kwargs, args); goto error; } if (use_kwargs && !PyDict_Check(kwargs)) { - newobj_unpickling_error("%s kwargs argument must be a dict, not %.200s", + newobj_unpickling_error(state, + "%s kwargs argument must be a dict, not %.200s", use_kwargs, kwargs); goto error; } @@ -5961,7 +5951,7 @@ load_newobj(UnpicklerObject *self, int use_kwargs) } static int -load_global(UnpicklerObject *self) +load_global(PickleState *state, UnpicklerObject *self) { PyObject *global = NULL; PyObject *module_name; @@ -5969,18 +5959,18 @@ load_global(UnpicklerObject *self) Py_ssize_t len; char *s; - if ((len = _Unpickler_Readline(self, &s)) < 0) + if ((len = _Unpickler_Readline(state, self, &s)) < 0) return -1; if (len < 2) - return bad_readline(); + return bad_readline(state); module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict"); if (!module_name) return -1; - if ((len = _Unpickler_Readline(self, &s)) >= 0) { + if ((len = _Unpickler_Readline(state, self, &s)) >= 0) { if (len < 2) { Py_DECREF(module_name); - return bad_readline(); + return bad_readline(state); } global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict"); if (global_name) { @@ -5997,17 +5987,16 @@ load_global(UnpicklerObject *self) } static int -load_stack_global(UnpicklerObject *self) +load_stack_global(PickleState *st, UnpicklerObject *self) { PyObject *global; PyObject *module_name; PyObject *global_name; - PDATA_POP(self->stack, global_name); - PDATA_POP(self->stack, module_name); + PDATA_POP(st, self->stack, global_name); + PDATA_POP(st, self->stack, module_name); if (module_name == NULL || !PyUnicode_CheckExact(module_name) || global_name == NULL || !PyUnicode_CheckExact(global_name)) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str"); Py_XDECREF(global_name); Py_XDECREF(module_name); @@ -6023,22 +6012,22 @@ load_stack_global(UnpicklerObject *self) } static int -load_persid(UnpicklerObject *self) +load_persid(PickleState *st, UnpicklerObject *self) { PyObject *pid, *obj; Py_ssize_t len; char *s; if (self->pers_func) { - if ((len = _Unpickler_Readline(self, &s)) < 0) + if ((len = _Unpickler_Readline(st, self, &s)) < 0) return -1; if (len < 1) - return bad_readline(); + return bad_readline(st); pid = PyUnicode_DecodeASCII(s, len - 1, "strict"); if (pid == NULL) { if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) { - PyErr_SetString(_Pickle_GetGlobalState()->UnpicklingError, + PyErr_SetString(st->UnpicklingError, "persistent IDs in protocol 0 must be " "ASCII strings"); } @@ -6054,7 +6043,6 @@ load_persid(UnpicklerObject *self) return 0; } else { - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->UnpicklingError, "A load persistent id instruction was encountered, " "but no persistent_load function was specified."); @@ -6063,12 +6051,12 @@ load_persid(UnpicklerObject *self) } static int -load_binpersid(UnpicklerObject *self) +load_binpersid(PickleState *st, UnpicklerObject *self) { PyObject *pid, *obj; if (self->pers_func) { - PDATA_POP(self->stack, pid); + PDATA_POP(st, self->stack, pid); if (pid == NULL) return -1; @@ -6081,7 +6069,6 @@ load_binpersid(UnpicklerObject *self) return 0; } else { - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->UnpicklingError, "A load persistent id instruction was encountered, " "but no persistent_load function was specified."); @@ -6090,7 +6077,7 @@ load_binpersid(UnpicklerObject *self) } static int -load_pop(UnpicklerObject *self) +load_pop(PickleState *state, UnpicklerObject *self) { Py_ssize_t len = Py_SIZE(self->stack); @@ -6107,7 +6094,7 @@ load_pop(UnpicklerObject *self) self->stack->fence = self->num_marks ? self->marks[self->num_marks - 1] : 0; } else if (len <= self->stack->fence) - return Pdata_stack_underflow(self->stack); + return Pdata_stack_underflow(state, self->stack); else { len--; Py_DECREF(self->stack->data[len]); @@ -6117,11 +6104,10 @@ load_pop(UnpicklerObject *self) } static int -load_pop_mark(UnpicklerObject *self) +load_pop_mark(PickleState *state, UnpicklerObject *self) { Py_ssize_t i; - - if ((i = marker(self)) < 0) + if ((i = marker(state, self)) < 0) return -1; Pdata_clear(self->stack, i); @@ -6130,30 +6116,30 @@ load_pop_mark(UnpicklerObject *self) } static int -load_dup(UnpicklerObject *self) +load_dup(PickleState *state, UnpicklerObject *self) { PyObject *last; Py_ssize_t len = Py_SIZE(self->stack); if (len <= self->stack->fence) - return Pdata_stack_underflow(self->stack); + return Pdata_stack_underflow(state, self->stack); last = self->stack->data[len - 1]; PDATA_APPEND(self->stack, last, -1); return 0; } static int -load_get(UnpicklerObject *self) +load_get(PickleState *st, UnpicklerObject *self) { PyObject *key, *value; Py_ssize_t idx; Py_ssize_t len; char *s; - if ((len = _Unpickler_Readline(self, &s)) < 0) + if ((len = _Unpickler_Readline(st, self, &s)) < 0) return -1; if (len < 2) - return bad_readline(); + return bad_readline(st); key = PyLong_FromString(s, NULL, 10); if (key == NULL) @@ -6167,7 +6153,6 @@ load_get(UnpicklerObject *self) value = _Unpickler_MemoGet(self, idx); if (value == NULL) { if (!PyErr_Occurred()) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_Format(st->UnpicklingError, "Memo value not found at index %ld", idx); } Py_DECREF(key); @@ -6180,13 +6165,13 @@ load_get(UnpicklerObject *self) } static int -load_binget(UnpicklerObject *self) +load_binget(PickleState *st, UnpicklerObject *self) { PyObject *value; Py_ssize_t idx; char *s; - if (_Unpickler_Read(self, &s, 1) < 0) + if (_Unpickler_Read(self, st, &s, 1) < 0) return -1; idx = Py_CHARMASK(s[0]); @@ -6195,7 +6180,6 @@ load_binget(UnpicklerObject *self) if (value == NULL) { PyObject *key = PyLong_FromSsize_t(idx); if (key != NULL) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_Format(st->UnpicklingError, "Memo value not found at index %ld", idx); Py_DECREF(key); } @@ -6207,13 +6191,13 @@ load_binget(UnpicklerObject *self) } static int -load_long_binget(UnpicklerObject *self) +load_long_binget(PickleState *st, UnpicklerObject *self) { PyObject *value; Py_ssize_t idx; char *s; - if (_Unpickler_Read(self, &s, 4) < 0) + if (_Unpickler_Read(self, st, &s, 4) < 0) return -1; idx = calc_binsize(s, 4); @@ -6222,7 +6206,6 @@ load_long_binget(UnpicklerObject *self) if (value == NULL) { PyObject *key = PyLong_FromSsize_t(idx); if (key != NULL) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_Format(st->UnpicklingError, "Memo value not found at index %ld", idx); Py_DECREF(key); } @@ -6237,7 +6220,7 @@ load_long_binget(UnpicklerObject *self) * the number of bytes following the opcode, holding the index (code) value. */ static int -load_extension(UnpicklerObject *self, int nbytes) +load_extension(PickleState *st, UnpicklerObject *self, int nbytes) { char *codebytes; /* the nbytes bytes after the opcode */ long code; /* calc_binint returns long */ @@ -6245,10 +6228,9 @@ load_extension(UnpicklerObject *self, int nbytes) PyObject *obj; /* the object to push */ PyObject *pair; /* (module_name, class_name) */ PyObject *module_name, *class_name; - PickleState *st = _Pickle_GetGlobalState(); assert(nbytes == 1 || nbytes == 2 || nbytes == 4); - if (_Unpickler_Read(self, &codebytes, nbytes) < 0) + if (_Unpickler_Read(self, st, &codebytes, nbytes) < 0) return -1; code = calc_binint(codebytes, nbytes); if (code <= 0) { /* note that 0 is forbidden */ @@ -6324,19 +6306,19 @@ load_extension(UnpicklerObject *self, int nbytes) } static int -load_put(UnpicklerObject *self) +load_put(PickleState *state, UnpicklerObject *self) { PyObject *key, *value; Py_ssize_t idx; Py_ssize_t len; char *s = NULL; - if ((len = _Unpickler_Readline(self, &s)) < 0) + if ((len = _Unpickler_Readline(state, self, &s)) < 0) return -1; if (len < 2) - return bad_readline(); + return bad_readline(state); if (Py_SIZE(self->stack) <= self->stack->fence) - return Pdata_stack_underflow(self->stack); + return Pdata_stack_underflow(state, self->stack); value = self->stack->data[Py_SIZE(self->stack) - 1]; key = PyLong_FromString(s, NULL, 10); @@ -6355,17 +6337,17 @@ load_put(UnpicklerObject *self) } static int -load_binput(UnpicklerObject *self) +load_binput(PickleState *state, UnpicklerObject *self) { PyObject *value; Py_ssize_t idx; char *s; - if (_Unpickler_Read(self, &s, 1) < 0) + if (_Unpickler_Read(self, state, &s, 1) < 0) return -1; if (Py_SIZE(self->stack) <= self->stack->fence) - return Pdata_stack_underflow(self->stack); + return Pdata_stack_underflow(state, self->stack); value = self->stack->data[Py_SIZE(self->stack) - 1]; idx = Py_CHARMASK(s[0]); @@ -6374,17 +6356,17 @@ load_binput(UnpicklerObject *self) } static int -load_long_binput(UnpicklerObject *self) +load_long_binput(PickleState *state, UnpicklerObject *self) { PyObject *value; Py_ssize_t idx; char *s; - if (_Unpickler_Read(self, &s, 4) < 0) + if (_Unpickler_Read(self, state, &s, 4) < 0) return -1; if (Py_SIZE(self->stack) <= self->stack->fence) - return Pdata_stack_underflow(self->stack); + return Pdata_stack_underflow(state, self->stack); value = self->stack->data[Py_SIZE(self->stack) - 1]; idx = calc_binsize(s, 4); @@ -6398,19 +6380,19 @@ load_long_binput(UnpicklerObject *self) } static int -load_memoize(UnpicklerObject *self) +load_memoize(PickleState *state, UnpicklerObject *self) { PyObject *value; if (Py_SIZE(self->stack) <= self->stack->fence) - return Pdata_stack_underflow(self->stack); + return Pdata_stack_underflow(state, self->stack); value = self->stack->data[Py_SIZE(self->stack) - 1]; return _Unpickler_MemoPut(self, self->memo_len, value); } static int -do_append(UnpicklerObject *self, Py_ssize_t x) +do_append(PickleState *state, UnpicklerObject *self, Py_ssize_t x) { PyObject *value; PyObject *slice; @@ -6420,7 +6402,7 @@ do_append(UnpicklerObject *self, Py_ssize_t x) len = Py_SIZE(self->stack); if (x > len || x <= self->stack->fence) - return Pdata_stack_underflow(self->stack); + return Pdata_stack_underflow(state, self->stack); if (len == x) /* nothing to do */ return 0; @@ -6485,24 +6467,24 @@ do_append(UnpicklerObject *self, Py_ssize_t x) } static int -load_append(UnpicklerObject *self) +load_append(PickleState *state, UnpicklerObject *self) { if (Py_SIZE(self->stack) - 1 <= self->stack->fence) - return Pdata_stack_underflow(self->stack); - return do_append(self, Py_SIZE(self->stack) - 1); + return Pdata_stack_underflow(state, self->stack); + return do_append(state, self, Py_SIZE(self->stack) - 1); } static int -load_appends(UnpicklerObject *self) +load_appends(PickleState *state, UnpicklerObject *self) { - Py_ssize_t i = marker(self); + Py_ssize_t i = marker(state, self); if (i < 0) return -1; - return do_append(self, i); + return do_append(state, self, i); } static int -do_setitems(UnpicklerObject *self, Py_ssize_t x) +do_setitems(PickleState *st, UnpicklerObject *self, Py_ssize_t x) { PyObject *value, *key; PyObject *dict; @@ -6511,11 +6493,10 @@ do_setitems(UnpicklerObject *self, Py_ssize_t x) len = Py_SIZE(self->stack); if (x > len || x <= self->stack->fence) - return Pdata_stack_underflow(self->stack); + return Pdata_stack_underflow(st, self->stack); if (len == x) /* nothing to do */ return 0; if ((len - x) % 2 != 0) { - PickleState *st = _Pickle_GetGlobalState(); /* Corrupt or hostile pickle -- we never write one like this. */ PyErr_SetString(st->UnpicklingError, "odd number of items for SETITEMS"); @@ -6540,32 +6521,32 @@ do_setitems(UnpicklerObject *self, Py_ssize_t x) } static int -load_setitem(UnpicklerObject *self) +load_setitem(PickleState *state, UnpicklerObject *self) { - return do_setitems(self, Py_SIZE(self->stack) - 2); + return do_setitems(state, self, Py_SIZE(self->stack) - 2); } static int -load_setitems(UnpicklerObject *self) +load_setitems(PickleState *state, UnpicklerObject *self) { - Py_ssize_t i = marker(self); + Py_ssize_t i = marker(state, self); if (i < 0) return -1; - return do_setitems(self, i); + return do_setitems(state, self, i); } static int -load_additems(UnpicklerObject *self) +load_additems(PickleState *state, UnpicklerObject *self) { PyObject *set; Py_ssize_t mark, len, i; - mark = marker(self); + mark = marker(state, self); if (mark < 0) return -1; len = Py_SIZE(self->stack); if (mark > len || mark <= self->stack->fence) - return Pdata_stack_underflow(self->stack); + return Pdata_stack_underflow(state, self->stack); if (len == mark) /* nothing to do */ return 0; @@ -6575,7 +6556,7 @@ load_additems(UnpicklerObject *self) PyObject *items; int status; - items = Pdata_poptuple(self->stack, mark); + items = Pdata_poptuple(state, self->stack, mark); if (items == NULL) return -1; @@ -6609,9 +6590,9 @@ load_additems(UnpicklerObject *self) } static int -load_build(UnpicklerObject *self) +load_build(PickleState *st, UnpicklerObject *self) { - PyObject *state, *inst, *slotstate; + PyObject *inst, *slotstate; PyObject *setstate; int status = 0; @@ -6619,9 +6600,10 @@ load_build(UnpicklerObject *self) * the stack top, possibly mutated via instance.__setstate__(state). */ if (Py_SIZE(self->stack) - 2 < self->stack->fence) - return Pdata_stack_underflow(self->stack); + return Pdata_stack_underflow(st, self->stack); - PDATA_POP(self->stack, state); + PyObject *state; + PDATA_POP(st, self->stack, state); if (state == NULL) return -1; @@ -6665,7 +6647,6 @@ load_build(UnpicklerObject *self) Py_ssize_t i; if (!PyDict_Check(state)) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->UnpicklingError, "state is not a dictionary"); goto error; } @@ -6695,7 +6676,6 @@ load_build(UnpicklerObject *self) Py_ssize_t i; if (!PyDict_Check(slotstate)) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_SetString(st->UnpicklingError, "slot state is not a dictionary"); goto error; @@ -6718,7 +6698,7 @@ load_build(UnpicklerObject *self) } static int -load_mark(UnpicklerObject *self) +load_mark(PickleState *state, UnpicklerObject *self) { /* Note that we split the (pickle.py) stack into two stacks, an @@ -6745,16 +6725,16 @@ load_mark(UnpicklerObject *self) } static int -load_reduce(UnpicklerObject *self) +load_reduce(PickleState *state, UnpicklerObject *self) { PyObject *callable = NULL; PyObject *argtup = NULL; PyObject *obj = NULL; - PDATA_POP(self->stack, argtup); + PDATA_POP(state, self->stack, argtup); if (argtup == NULL) return -1; - PDATA_POP(self->stack, callable); + PDATA_POP(state, self->stack, callable); if (callable) { obj = PyObject_CallObject(callable, argtup); Py_DECREF(callable); @@ -6772,12 +6752,12 @@ load_reduce(UnpicklerObject *self) * is the first opcode for protocols >= 2. */ static int -load_proto(UnpicklerObject *self) +load_proto(PickleState *state, UnpicklerObject *self) { char *s; int i; - if (_Unpickler_Read(self, &s, 1) < 0) + if (_Unpickler_Read(self, state, &s, 1) < 0) return -1; i = (unsigned char)s[0]; @@ -6791,12 +6771,12 @@ load_proto(UnpicklerObject *self) } static int -load_frame(UnpicklerObject *self) +load_frame(PickleState *state, UnpicklerObject *self) { char *s; Py_ssize_t frame_len; - if (_Unpickler_Read(self, &s, 8) < 0) + if (_Unpickler_Read(self, state, &s, 8) < 0) return -1; frame_len = calc_binsize(s, 8); @@ -6807,7 +6787,7 @@ load_frame(UnpicklerObject *self) return -1; } - if (_Unpickler_Read(self, &s, frame_len) < 0) + if (_Unpickler_Read(self, state, &s, frame_len) < 0) return -1; /* Rewind to start of frame */ @@ -6816,7 +6796,7 @@ load_frame(UnpicklerObject *self) } static PyObject * -load(UnpicklerObject *self) +load(PickleState *st, UnpicklerObject *self) { PyObject *value = NULL; char *s = NULL; @@ -6830,14 +6810,13 @@ load(UnpicklerObject *self) /* Convenient macros for the dispatch while-switch loop just below. */ #define OP(opcode, load_func) \ - case opcode: if (load_func(self) < 0) break; continue; + case opcode: if (load_func(st, self) < 0) break; continue; #define OP_ARG(opcode, load_func, arg) \ - case opcode: if (load_func(self, (arg)) < 0) break; continue; + case opcode: if (load_func(st, self, (arg)) < 0) break; continue; while (1) { - if (_Unpickler_Read(self, &s, 1) < 0) { - PickleState *st = _Pickle_GetGlobalState(); + if (_Unpickler_Read(self, st, &s, 1) < 0) { if (PyErr_ExceptionMatches(st->UnpicklingError)) { PyErr_Format(PyExc_EOFError, "Ran out of input"); } @@ -6918,7 +6897,6 @@ load(UnpicklerObject *self) default: { - PickleState *st = _Pickle_GetGlobalState(); unsigned char c = (unsigned char) *s; if (0x20 <= c && c <= 0x7e && c != '\'' && c != '\\') { PyErr_Format(st->UnpicklingError, @@ -6942,7 +6920,7 @@ load(UnpicklerObject *self) if (_Unpickler_SkipConsumed(self) < 0) return NULL; - PDATA_POP(self->stack, value); + PDATA_POP(st, self->stack, value); return value; } @@ -6950,6 +6928,8 @@ load(UnpicklerObject *self) _pickle.Unpickler.load + cls: defining_class + Load a pickle. Read a pickled object representation from the open file object given @@ -6958,24 +6938,25 @@ specified therein. [clinic start generated code]*/ static PyObject * -_pickle_Unpickler_load_impl(UnpicklerObject *self) -/*[clinic end generated code: output=fdcc488aad675b14 input=acbb91a42fa9b7b9]*/ +_pickle_Unpickler_load_impl(UnpicklerObject *self, PyTypeObject *cls) +/*[clinic end generated code: output=cc88168f608e3007 input=f5d2f87e61d5f07f]*/ { UnpicklerObject *unpickler = (UnpicklerObject*)self; + PickleState *st = _Pickle_GetStateByClass(cls); + /* Check whether the Unpickler was initialized correctly. This prevents segfaulting if a subclass overridden __init__ with a function that does not call Unpickler.__init__(). Here, we simply ensure that self->read is not NULL. */ if (unpickler->read == NULL) { - PickleState *st = _Pickle_GetGlobalState(); PyErr_Format(st->UnpicklingError, "Unpickler.__init__() was not called by %s.__init__()", Py_TYPE(unpickler)->tp_name); return NULL; } - return load(unpickler); + return load(st, unpickler); } /* The name of find_class() is misleading. In newer pickle protocols, this @@ -6986,6 +6967,7 @@ _pickle_Unpickler_load_impl(UnpicklerObject *self) _pickle.Unpickler.find_class + cls: defining_class module_name: object global_name: object / @@ -7001,10 +6983,10 @@ needed. Both arguments passed are str objects. [clinic start generated code]*/ static PyObject * -_pickle_Unpickler_find_class_impl(UnpicklerObject *self, +_pickle_Unpickler_find_class_impl(UnpicklerObject *self, PyTypeObject *cls, PyObject *module_name, PyObject *global_name) -/*[clinic end generated code: output=becc08d7f9ed41e3 input=e2e6a865de093ef4]*/ +/*[clinic end generated code: output=99577948abb0be81 input=9577745719219fc7]*/ { PyObject *global; PyObject *module; @@ -7020,7 +7002,7 @@ _pickle_Unpickler_find_class_impl(UnpicklerObject *self, if (self->proto < 3 && self->fix_imports) { PyObject *key; PyObject *item; - PickleState *st = _Pickle_GetGlobalState(); + PickleState *st = _Pickle_GetStateByClass(cls); /* Check if the global (i.e., a function or a class) was renamed or moved to another module. */ @@ -7114,44 +7096,6 @@ static struct PyMethodDef Unpickler_methods[] = { {NULL, NULL} /* sentinel */ }; -static void -Unpickler_dealloc(UnpicklerObject *self) -{ - PyObject_GC_UnTrack((PyObject *)self); - Py_XDECREF(self->readline); - Py_XDECREF(self->readinto); - Py_XDECREF(self->read); - Py_XDECREF(self->peek); - Py_XDECREF(self->stack); - Py_XDECREF(self->pers_func); - Py_XDECREF(self->buffers); - if (self->buffer.buf != NULL) { - PyBuffer_Release(&self->buffer); - self->buffer.buf = NULL; - } - - _Unpickler_MemoCleanup(self); - PyMem_Free(self->marks); - PyMem_Free(self->input_line); - PyMem_Free(self->encoding); - PyMem_Free(self->errors); - - Py_TYPE(self)->tp_free((PyObject *)self); -} - -static int -Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg) -{ - Py_VISIT(self->readline); - Py_VISIT(self->readinto); - Py_VISIT(self->read); - Py_VISIT(self->peek); - Py_VISIT(self->stack); - Py_VISIT(self->pers_func); - Py_VISIT(self->buffers); - return 0; -} - static int Unpickler_clear(UnpicklerObject *self) { @@ -7180,6 +7124,30 @@ Unpickler_clear(UnpicklerObject *self) return 0; } +static void +Unpickler_dealloc(UnpicklerObject *self) +{ + PyTypeObject *tp = Py_TYPE(self); + PyObject_GC_UnTrack((PyObject *)self); + (void)Unpickler_clear(self); + tp->tp_free((PyObject *)self); + Py_DECREF(tp); +} + +static int +Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg) +{ + Py_VISIT(Py_TYPE(self)); + Py_VISIT(self->readline); + Py_VISIT(self->readinto); + Py_VISIT(self->read); + Py_VISIT(self->peek); + Py_VISIT(self->stack); + Py_VISIT(self->pers_func); + Py_VISIT(self->buffers); + return 0; +} + /*[clinic input] _pickle.Unpickler.__init__ @@ -7240,7 +7208,9 @@ _pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, return -1; } - self->stack = (Pdata *)Pdata_New(); + PyTypeObject *tp = Py_TYPE(self); + PickleState *state = _Pickle_FindStateByType(tp); + self->stack = (Pdata *)Pdata_New(state); if (self->stack == NULL) return -1; @@ -7366,15 +7336,18 @@ static PyMethodDef unpicklerproxy_methods[] = { static void UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self) { + PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); - Py_XDECREF(self->unpickler); - PyObject_GC_Del((PyObject *)self); + Py_CLEAR(self->unpickler); + tp->tp_free((PyObject *)self); + Py_DECREF(tp); } static int UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self, visitproc visit, void *arg) { + Py_VISIT(Py_TYPE(self)); Py_VISIT(self->unpickler); return 0; } @@ -7386,44 +7359,30 @@ UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self) return 0; } -static PyTypeObject UnpicklerMemoProxyType = { - PyVarObject_HEAD_INIT(NULL, 0) - "_pickle.UnpicklerMemoProxy", /*tp_name*/ - sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/ - 0, - (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - PyObject_HashNotImplemented, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - PyObject_GenericSetAttr, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, - 0, /* tp_doc */ - (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */ - (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - unpicklerproxy_methods, /* tp_methods */ +static PyType_Slot unpickler_memoproxy_slots[] = { + {Py_tp_dealloc, UnpicklerMemoProxy_dealloc}, + {Py_tp_traverse, UnpicklerMemoProxy_traverse}, + {Py_tp_clear, UnpicklerMemoProxy_clear}, + {Py_tp_methods, unpicklerproxy_methods}, + {Py_tp_hash, PyObject_HashNotImplemented}, + {0, NULL}, +}; + +static PyType_Spec unpickler_memoproxy_spec = { + .name = "_pickle.UnpicklerMemoProxy", + .basicsize = sizeof(UnpicklerMemoProxyObject), + .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_IMMUTABLETYPE), + .slots = unpickler_memoproxy_slots, }; static PyObject * UnpicklerMemoProxy_New(UnpicklerObject *unpickler) { + PickleState *state = _Pickle_FindStateByType(Py_TYPE(unpickler)); UnpicklerMemoProxyObject *self; - self = PyObject_GC_New(UnpicklerMemoProxyObject, - &UnpicklerMemoProxyType); + state->UnpicklerMemoProxyType); if (self == NULL) return NULL; self->unpickler = (UnpicklerObject*)Py_NewRef(unpickler); @@ -7452,7 +7411,8 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored return -1; } - if (Py_IS_TYPE(obj, &UnpicklerMemoProxyType)) { + PickleState *state = _Pickle_FindStateByType(Py_TYPE(self)); + if (Py_IS_TYPE(obj, state->UnpicklerMemoProxyType)) { UnpicklerObject *unpickler = ((UnpicklerMemoProxyObject *)obj)->unpickler; @@ -7554,47 +7514,26 @@ static PyGetSetDef Unpickler_getsets[] = { {NULL} }; -static PyTypeObject Unpickler_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_pickle.Unpickler", /*tp_name*/ - sizeof(UnpicklerObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)Unpickler_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, - _pickle_Unpickler___init____doc__, /*tp_doc*/ - (traverseproc)Unpickler_traverse, /*tp_traverse*/ - (inquiry)Unpickler_clear, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - Unpickler_methods, /*tp_methods*/ - 0, /*tp_members*/ - Unpickler_getsets, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - _pickle_Unpickler___init__, /*tp_init*/ - PyType_GenericAlloc, /*tp_alloc*/ - PyType_GenericNew, /*tp_new*/ - PyObject_GC_Del, /*tp_free*/ - 0, /*tp_is_gc*/ +static PyType_Slot unpickler_type_slots[] = { + {Py_tp_dealloc, Unpickler_dealloc}, + {Py_tp_doc, (char *)_pickle_Unpickler___init____doc__}, + {Py_tp_traverse, Unpickler_traverse}, + {Py_tp_clear, Unpickler_clear}, + {Py_tp_methods, Unpickler_methods}, + {Py_tp_getset, Unpickler_getsets}, + {Py_tp_init, _pickle_Unpickler___init__}, + {Py_tp_alloc, PyType_GenericAlloc}, + {Py_tp_new, PyType_GenericNew}, + {Py_tp_free, PyObject_GC_Del}, + {0, NULL}, +}; + +static PyType_Spec unpickler_type_spec = { + .name = "_pickle.Unpickler", + .basicsize = sizeof(UnpicklerObject), + .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_IMMUTABLETYPE), + .slots = unpickler_type_slots, }; /*[clinic input] @@ -7643,7 +7582,8 @@ _pickle_dump_impl(PyObject *module, PyObject *obj, PyObject *file, PyObject *buffer_callback) /*[clinic end generated code: output=706186dba996490c input=5ed6653da99cd97c]*/ { - PicklerObject *pickler = _Pickler_New(); + PickleState *state = _Pickle_GetState(module); + PicklerObject *pickler = _Pickler_New(state); if (pickler == NULL) return NULL; @@ -7657,7 +7597,7 @@ _pickle_dump_impl(PyObject *module, PyObject *obj, PyObject *file, if (_Pickler_SetBufferCallback(pickler, buffer_callback) < 0) goto error; - if (dump(pickler, obj) < 0) + if (dump(state, pickler, obj) < 0) goto error; if (_Pickler_FlushToFile(pickler) < 0) @@ -7708,7 +7648,8 @@ _pickle_dumps_impl(PyObject *module, PyObject *obj, PyObject *protocol, /*[clinic end generated code: output=fbab0093a5580fdf input=e543272436c6f987]*/ { PyObject *result; - PicklerObject *pickler = _Pickler_New(); + PickleState *state = _Pickle_GetState(module); + PicklerObject *pickler = _Pickler_New(state); if (pickler == NULL) return NULL; @@ -7719,7 +7660,7 @@ _pickle_dumps_impl(PyObject *module, PyObject *obj, PyObject *protocol, if (_Pickler_SetBufferCallback(pickler, buffer_callback) < 0) goto error; - if (dump(pickler, obj) < 0) + if (dump(state, pickler, obj) < 0) goto error; result = _Pickler_GetString(pickler); @@ -7774,7 +7715,7 @@ _pickle_load_impl(PyObject *module, PyObject *file, int fix_imports, /*[clinic end generated code: output=250452d141c23e76 input=46c7c31c92f4f371]*/ { PyObject *result; - UnpicklerObject *unpickler = _Unpickler_New(); + UnpicklerObject *unpickler = _Unpickler_New(module); if (unpickler == NULL) return NULL; @@ -7790,7 +7731,8 @@ _pickle_load_impl(PyObject *module, PyObject *file, int fix_imports, unpickler->fix_imports = fix_imports; - result = load(unpickler); + PickleState *state = _Pickle_GetState(module); + result = load(state, unpickler); Py_DECREF(unpickler); return result; @@ -7834,7 +7776,7 @@ _pickle_loads_impl(PyObject *module, PyObject *data, int fix_imports, /*[clinic end generated code: output=82ac1e6b588e6d02 input=b3615540d0535087]*/ { PyObject *result; - UnpicklerObject *unpickler = _Unpickler_New(); + UnpicklerObject *unpickler = _Unpickler_New(module); if (unpickler == NULL) return NULL; @@ -7850,7 +7792,8 @@ _pickle_loads_impl(PyObject *module, PyObject *data, int fix_imports, unpickler->fix_imports = fix_imports; - result = load(unpickler); + PickleState *state = _Pickle_GetState(module); + result = load(state, unpickler); Py_DECREF(unpickler); return result; @@ -7898,81 +7841,94 @@ pickle_traverse(PyObject *m, visitproc visit, void *arg) Py_VISIT(st->codecs_encode); Py_VISIT(st->getattr); Py_VISIT(st->partial); + Py_VISIT(st->Pickler_Type); + Py_VISIT(st->Unpickler_Type); + Py_VISIT(st->Pdata_Type); + Py_VISIT(st->PicklerMemoProxyType); + Py_VISIT(st->UnpicklerMemoProxyType); return 0; } -static struct PyModuleDef _picklemodule = { - PyModuleDef_HEAD_INIT, - "_pickle", /* m_name */ - pickle_module_doc, /* m_doc */ - sizeof(PickleState), /* m_size */ - pickle_methods, /* m_methods */ - NULL, /* m_reload */ - pickle_traverse, /* m_traverse */ - pickle_clear, /* m_clear */ - (freefunc)pickle_free /* m_free */ -}; - -PyMODINIT_FUNC -PyInit__pickle(void) +static int +_pickle_exec(PyObject *m) { - PyObject *m; - PickleState *st; + PickleState *st = _Pickle_GetState(m); - m = PyState_FindModule(&_picklemodule); - if (m) { - return Py_NewRef(m); - } +#define CREATE_TYPE(mod, type, spec) \ + do { \ + type = (PyTypeObject *)PyType_FromMetaclass(NULL, mod, spec, NULL); \ + if (type == NULL) { \ + return -1; \ + } \ + } while (0) - if (PyType_Ready(&Pdata_Type) < 0) - return NULL; - if (PyType_Ready(&PicklerMemoProxyType) < 0) - return NULL; - if (PyType_Ready(&UnpicklerMemoProxyType) < 0) - return NULL; + CREATE_TYPE(m, st->Pdata_Type, &pdata_spec); + CREATE_TYPE(m, st->PicklerMemoProxyType, &memoproxy_spec); + CREATE_TYPE(m, st->UnpicklerMemoProxyType, &unpickler_memoproxy_spec); + CREATE_TYPE(m, st->Pickler_Type, &pickler_type_spec); + CREATE_TYPE(m, st->Unpickler_Type, &unpickler_type_spec); - /* Create the module and add the functions. */ - m = PyModule_Create(&_picklemodule); - if (m == NULL) - return NULL; +#undef CREATE_TYPE /* Add types */ - if (PyModule_AddType(m, &Pickler_Type) < 0) { - return NULL; + if (PyModule_AddType(m, &PyPickleBuffer_Type) < 0) { + return -1; } - if (PyModule_AddType(m, &Unpickler_Type) < 0) { - return NULL; + if (PyModule_AddType(m, st->Pickler_Type) < 0) { + return -1; } - if (PyModule_AddType(m, &PyPickleBuffer_Type) < 0) { - return NULL; + if (PyModule_AddType(m, st->Unpickler_Type) < 0) { + return -1; } - st = _Pickle_GetState(m); - /* Initialize the exceptions. */ st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL); if (st->PickleError == NULL) - return NULL; + return -1; st->PicklingError = \ PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL); if (st->PicklingError == NULL) - return NULL; + return -1; st->UnpicklingError = \ PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL); if (st->UnpicklingError == NULL) - return NULL; + return -1; if (PyModule_AddObjectRef(m, "PickleError", st->PickleError) < 0) { - return NULL; + return -1; } if (PyModule_AddObjectRef(m, "PicklingError", st->PicklingError) < 0) { - return NULL; + return -1; } if (PyModule_AddObjectRef(m, "UnpicklingError", st->UnpicklingError) < 0) { - return NULL; + return -1; } + if (_Pickle_InitState(st) < 0) - return NULL; + return -1; - return m; + return 0; +} + +static PyModuleDef_Slot pickle_slots[] = { + {Py_mod_exec, _pickle_exec}, + {0, NULL}, +}; + +static struct PyModuleDef _picklemodule = { + PyModuleDef_HEAD_INIT, + .m_name = "_pickle", + .m_doc = pickle_module_doc, + .m_size = sizeof(PickleState), + .m_methods = pickle_methods, + .m_slots = pickle_slots, + .m_traverse = pickle_traverse, + .m_clear = pickle_clear, + .m_free = (freefunc)pickle_free, +}; + +PyMODINIT_FUNC +PyInit__pickle(void) +{ + return PyModuleDef_Init(&_picklemodule); } diff --git a/Modules/clinic/_pickle.c.h b/Modules/clinic/_pickle.c.h index adb3abc5eb2372..539acc34a05cc1 100644 --- a/Modules/clinic/_pickle.c.h +++ b/Modules/clinic/_pickle.c.h @@ -38,7 +38,42 @@ PyDoc_STRVAR(_pickle_Pickler_dump__doc__, "Write a pickled representation of the given object to the open file."); #define _PICKLE_PICKLER_DUMP_METHODDEF \ - {"dump", (PyCFunction)_pickle_Pickler_dump, METH_O, _pickle_Pickler_dump__doc__}, + {"dump", _PyCFunction_CAST(_pickle_Pickler_dump), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _pickle_Pickler_dump__doc__}, + +static PyObject * +_pickle_Pickler_dump_impl(PicklerObject *self, PyTypeObject *cls, + PyObject *obj); + +static PyObject * +_pickle_Pickler_dump(PicklerObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) + # define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty) + #else + # define KWTUPLE NULL + #endif + + static const char * const _keywords[] = {"", NULL}; + static _PyArg_Parser _parser = { + .keywords = _keywords, + .fname = "dump", + .kwtuple = KWTUPLE, + }; + #undef KWTUPLE + PyObject *argsbuf[1]; + PyObject *obj; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + obj = args[0]; + return_value = _pickle_Pickler_dump_impl(self, cls, obj); + +exit: + return return_value; +} PyDoc_STRVAR(_pickle_Pickler___sizeof____doc__, "__sizeof__($self, /)\n" @@ -242,15 +277,19 @@ PyDoc_STRVAR(_pickle_Unpickler_load__doc__, "specified therein."); #define _PICKLE_UNPICKLER_LOAD_METHODDEF \ - {"load", (PyCFunction)_pickle_Unpickler_load, METH_NOARGS, _pickle_Unpickler_load__doc__}, + {"load", _PyCFunction_CAST(_pickle_Unpickler_load), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _pickle_Unpickler_load__doc__}, static PyObject * -_pickle_Unpickler_load_impl(UnpicklerObject *self); +_pickle_Unpickler_load_impl(UnpicklerObject *self, PyTypeObject *cls); static PyObject * -_pickle_Unpickler_load(UnpicklerObject *self, PyObject *Py_UNUSED(ignored)) +_pickle_Unpickler_load(UnpicklerObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return _pickle_Unpickler_load_impl(self); + if (nargs) { + PyErr_SetString(PyExc_TypeError, "load() takes no arguments"); + return NULL; + } + return _pickle_Unpickler_load_impl(self, cls); } PyDoc_STRVAR(_pickle_Unpickler_find_class__doc__, @@ -267,26 +306,41 @@ PyDoc_STRVAR(_pickle_Unpickler_find_class__doc__, "needed. Both arguments passed are str objects."); #define _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF \ - {"find_class", _PyCFunction_CAST(_pickle_Unpickler_find_class), METH_FASTCALL, _pickle_Unpickler_find_class__doc__}, + {"find_class", _PyCFunction_CAST(_pickle_Unpickler_find_class), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _pickle_Unpickler_find_class__doc__}, static PyObject * -_pickle_Unpickler_find_class_impl(UnpicklerObject *self, +_pickle_Unpickler_find_class_impl(UnpicklerObject *self, PyTypeObject *cls, PyObject *module_name, PyObject *global_name); static PyObject * -_pickle_Unpickler_find_class(UnpicklerObject *self, PyObject *const *args, Py_ssize_t nargs) +_pickle_Unpickler_find_class(UnpicklerObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; + #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) + # define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty) + #else + # define KWTUPLE NULL + #endif + + static const char * const _keywords[] = {"", "", NULL}; + static _PyArg_Parser _parser = { + .keywords = _keywords, + .fname = "find_class", + .kwtuple = KWTUPLE, + }; + #undef KWTUPLE + PyObject *argsbuf[2]; PyObject *module_name; PyObject *global_name; - if (!_PyArg_CheckPositional("find_class", nargs, 2, 2)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { goto exit; } module_name = args[0]; global_name = args[1]; - return_value = _pickle_Unpickler_find_class_impl(self, module_name, global_name); + return_value = _pickle_Unpickler_find_class_impl(self, cls, module_name, global_name); exit: return return_value; @@ -980,4 +1034,4 @@ _pickle_loads(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec exit: return return_value; } -/*[clinic end generated code: output=730dc26938561313 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a0e04b85e7bae626 input=a9049054013a1b77]*/ diff --git a/Tools/c-analyzer/cpython/globals-to-fix.tsv b/Tools/c-analyzer/cpython/globals-to-fix.tsv index e0e45265209fff..0620c7e13925b5 100644 --- a/Tools/c-analyzer/cpython/globals-to-fix.tsv +++ b/Tools/c-analyzer/cpython/globals-to-fix.tsv @@ -390,11 +390,6 @@ Modules/_decimal/_decimal.c - PyDecContextManager_Type - Modules/_decimal/_decimal.c - PyDecContext_Type - Modules/_decimal/_decimal.c - PyDecSignalDictMixin_Type - Modules/_decimal/_decimal.c - PyDec_Type - -Modules/_pickle.c - Pdata_Type - -Modules/_pickle.c - PicklerMemoProxyType - -Modules/_pickle.c - Pickler_Type - -Modules/_pickle.c - UnpicklerMemoProxyType - -Modules/_pickle.c - Unpickler_Type - Modules/ossaudiodev.c - OSSAudioType - Modules/ossaudiodev.c - OSSMixerType - Modules/socketmodule.c - sock_type - From 89e6a3446184925ee7f17cd0d948c7784a88b8d7 Mon Sep 17 00:00:00 2001 From: "T. Wouters" Date: Tue, 4 Apr 2023 16:51:30 +0200 Subject: [PATCH 055/349] Fix a compiler warning in _xxsubinterpretermodule.c (#103245) Fix a (correct) warning about potential uses of uninitialized memory in _xxsubinterpreter. Unlike newly allocated PyObject structs or global structs, stack-allocated structs are not initialised, and a few places in the code expect the _sharedexception struct data to be either NULL or initialised. --- Modules/_xxsubinterpretersmodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index 9648f080cd756c..11164676c4d107 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -481,7 +481,7 @@ _run_script_in_interpreter(PyObject *mod, PyInterpreterState *interp, } // Run the script. - _sharedexception exc; + _sharedexception exc = {NULL, NULL}; int result = _run_script(interp, codestr, shared, &exc); // Switch back. From b861ba4a8247af8159df1e01d33157cf57705067 Mon Sep 17 00:00:00 2001 From: Thomas Wouters Date: Tue, 4 Apr 2023 17:51:44 +0200 Subject: [PATCH 056/349] Python 3.12.0a7 --- Include/patchlevel.h | 4 +- Lib/pydoc_data/topics.py | 146 ++-- Misc/NEWS.d/3.12.0a7.rst | 745 ++++++++++++++++++ ...-03-15-02-03-39.gh-issue-102711.zTkjts.rst | 1 - ...-03-23-20-58-56.gh-issue-102973.EaJUrw.rst | 2 - ...-02-18-00-55-14.gh-issue-102013.83mrtI.rst | 1 - ...2020-07-04-09-04-41.bpo-1635741.ZsP31Y.rst | 1 - ...-02-21-17-22-06.gh-issue-101865.fwrTOA.rst | 2 - ...-02-21-23-42-39.gh-issue-102027.fQARG0.rst | 2 - ...-02-26-11-43-56.gh-issue-102255.cRnI5x.rst | 1 - ...-02-26-13-12-55.gh-issue-102213.fTH8X7.rst | 1 - ...-02-27-15-48-31.gh-issue-102300.8o-_Mt.rst | 1 - ...-03-02-13-49-21.gh-issue-102281.QCuu2N.rst | 1 - ...-03-03-23-21-16.gh-issue-102406.XLqYO3.rst | 1 - ...-03-04-06-48-34.gh-issue-102397.ACJaOf.rst | 2 - ...-03-06-10-02-22.gh-issue-101291.0FT2QS.rst | 7 - ...-03-08-08-37-36.gh-issue-102491.SFvvsC.rst | 2 - ...3-03-09-13-57-35.gh-issue-90997.J-Yhn2.rst | 2 - ...-03-14-00-11-46.gh-issue-102594.BjU-m2.rst | 1 - ...-03-16-14-44-29.gh-issue-102755.j1GxlV.rst | 3 - ...-03-16-17-24-44.gh-issue-102701.iNGVaS.rst | 1 - ...-03-17-12-09-45.gh-issue-100982.Pf_BI6.rst | 1 - ...-03-17-13-43-34.gh-issue-102778.ANDv8I.rst | 3 - ...-03-18-02-36-39.gh-issue-101975.HwMR1d.rst | 1 - ...-03-21-00-46-36.gh-issue-102859.PRkGca.rst | 2 - ...3-03-24-02-50-33.gh-issue-89987.oraTzh.rst | 2 - ...-03-31-12-22-25.gh-issue-102192.gYxJP_.rst | 2 - ...-03-29-14-51-39.gh-issue-103112.XgGSEO.rst | 1 - .../2019-03-15-22-50-27.bpo-36305.Pbkv6u.rst | 2 - ...2-04-11-18-34-33.gh-issue-72346.pC7gnM.rst | 1 - ...2-06-30-21-28-41.gh-issue-94440.LtgX0d.rst | 2 - ...2-07-09-13-07-30.gh-issue-94684.nV5yno.rst | 1 - ...2-07-30-23-01-43.gh-issue-95495.RA-q1d.rst | 7 - ...2-09-19-08-12-58.gh-issue-96931.x0WQhh.rst | 1 - ...2-10-10-19-14-51.gh-issue-98169.DBWIxL.rst | 2 - ...2-11-24-13-23-07.gh-issue-48330.6uAX9F.rst | 8 - ...-12-09-11-21-38.gh-issue-100131.v863yR.rst | 1 - ...2-12-16-10-27-58.gh-issue-89727.y64ZLM.rst | 1 - ...-12-20-10-55-14.gh-issue-100372.utfP65.rst | 2 - ...-01-27-14-51-07.gh-issue-101313.10AEXh.rst | 1 - ...-02-09-19-40-41.gh-issue-101673.mX-Ppq.rst | 1 - ...3-02-18-23-03-50.gh-issue-98886.LkKGWv.rst | 1 - ...-02-19-01-49-46.gh-issue-102038.n3if3D.rst | 1 - ...-02-20-16-47-56.gh-issue-102069.FS7f1j.rst | 1 - ...-02-21-11-56-16.gh-issue-102103.Dj0WEj.rst | 2 - ...3-02-26-17-29-57.gh-issue-79940.SAfmAy.rst | 2 - ...-03-03-19-53-08.gh-issue-102378.kRdOZc.rst | 1 - ...3-03-04-20-58-29.gh-issue-74468.Ac5Ew_.rst | 3 - ...-03-08-23-08-38.gh-issue-102519.wlcsFI.rst | 2 - ...-03-10-13-21-16.gh-issue-102578.-gujoI.rst | 4 - ...-03-10-13-51-21.gh-issue-100112.VHh4mw.rst | 1 - ...-03-13-12-05-55.gh-issue-102615.NcA_ZL.rst | 3 - ...-03-13-18-27-00.gh-issue-102670.GyoThv.rst | 2 - ...-03-16-08-17-29.gh-issue-102748.WNACpI.rst | 3 - ...3-03-16-16-43-04.gh-issue-78530.Lr8eq_.rst | 1 - ...3-03-17-19-14-26.gh-issue-76846.KEamjK.rst | 3 - ...3-03-18-14-59-21.gh-issue-88965.kA70Km.rst | 7 - ...-03-19-15-30-59.gh-issue-102828.NKClXg.rst | 3 - ...-03-20-12-21-19.gh-issue-102839.RjRi12.rst | 1 - ...-03-21-15-17-07.gh-issue-102871.U9mchn.rst | 3 - ...-03-22-16-15-18.gh-issue-102780.NEcljy.rst | 3 - ...-03-23-13-34-33.gh-issue-102947.cTwcpU.rst | 2 - ...-03-25-02-08-05.gh-issue-103023.Qfn7Hl.rst | 2 - ...-03-25-16-57-18.gh-issue-102433.L-7x2Q.rst | 10 - ...-03-26-20-54-57.gh-issue-103046.xBlA2l.rst | 1 - ...-03-27-15-01-16.gh-issue-103056.-Efh5Q.rst | 1 - ...-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst | 1 - ...-03-28-05-14-59.gh-issue-103068.YQTmrA.rst | 2 - ...-03-28-15-12-53.gh-issue-103085.DqNehf.rst | 1 - ...-01-27-18-10-40.gh-issue-101377.IJGpqh.rst | 1 - ...-03-08-13-54-20.gh-issue-102537.Vfplpb.rst | 2 - ...-03-23-23-25-18.gh-issue-102980.Zps4QF.rst | 1 - ...-03-21-01-27-07.gh-issue-102809.2F1Byz.rst | 1 - ...3-02-22-17-26-10.gh-issue-99726.76t957.rst | 2 - ...-03-14-10-52-43.gh-issue-102690.sbXtqk.rst | 1 - README.rst | 2 +- 76 files changed, 822 insertions(+), 224 deletions(-) create mode 100644 Misc/NEWS.d/3.12.0a7.rst delete mode 100644 Misc/NEWS.d/next/Build/2023-03-15-02-03-39.gh-issue-102711.zTkjts.rst delete mode 100644 Misc/NEWS.d/next/Build/2023-03-23-20-58-56.gh-issue-102973.EaJUrw.rst delete mode 100644 Misc/NEWS.d/next/C API/2023-02-18-00-55-14.gh-issue-102013.83mrtI.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-04-09-04-41.bpo-1635741.ZsP31Y.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-02-21-17-22-06.gh-issue-101865.fwrTOA.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-02-21-23-42-39.gh-issue-102027.fQARG0.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-02-26-11-43-56.gh-issue-102255.cRnI5x.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-02-26-13-12-55.gh-issue-102213.fTH8X7.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-02-27-15-48-31.gh-issue-102300.8o-_Mt.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-02-13-49-21.gh-issue-102281.QCuu2N.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-03-23-21-16.gh-issue-102406.XLqYO3.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-04-06-48-34.gh-issue-102397.ACJaOf.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-06-10-02-22.gh-issue-101291.0FT2QS.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-08-08-37-36.gh-issue-102491.SFvvsC.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-09-13-57-35.gh-issue-90997.J-Yhn2.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-14-00-11-46.gh-issue-102594.BjU-m2.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-16-14-44-29.gh-issue-102755.j1GxlV.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-16-17-24-44.gh-issue-102701.iNGVaS.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-17-12-09-45.gh-issue-100982.Pf_BI6.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-17-13-43-34.gh-issue-102778.ANDv8I.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-18-02-36-39.gh-issue-101975.HwMR1d.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-21-00-46-36.gh-issue-102859.PRkGca.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-24-02-50-33.gh-issue-89987.oraTzh.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-31-12-22-25.gh-issue-102192.gYxJP_.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2023-03-29-14-51-39.gh-issue-103112.XgGSEO.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-03-15-22-50-27.bpo-36305.Pbkv6u.rst delete mode 100644 Misc/NEWS.d/next/Library/2022-04-11-18-34-33.gh-issue-72346.pC7gnM.rst delete mode 100644 Misc/NEWS.d/next/Library/2022-06-30-21-28-41.gh-issue-94440.LtgX0d.rst delete mode 100644 Misc/NEWS.d/next/Library/2022-07-09-13-07-30.gh-issue-94684.nV5yno.rst delete mode 100644 Misc/NEWS.d/next/Library/2022-07-30-23-01-43.gh-issue-95495.RA-q1d.rst delete mode 100644 Misc/NEWS.d/next/Library/2022-09-19-08-12-58.gh-issue-96931.x0WQhh.rst delete mode 100644 Misc/NEWS.d/next/Library/2022-10-10-19-14-51.gh-issue-98169.DBWIxL.rst delete mode 100644 Misc/NEWS.d/next/Library/2022-11-24-13-23-07.gh-issue-48330.6uAX9F.rst delete mode 100644 Misc/NEWS.d/next/Library/2022-12-09-11-21-38.gh-issue-100131.v863yR.rst delete mode 100644 Misc/NEWS.d/next/Library/2022-12-16-10-27-58.gh-issue-89727.y64ZLM.rst delete mode 100644 Misc/NEWS.d/next/Library/2022-12-20-10-55-14.gh-issue-100372.utfP65.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-01-27-14-51-07.gh-issue-101313.10AEXh.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-02-09-19-40-41.gh-issue-101673.mX-Ppq.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-02-18-23-03-50.gh-issue-98886.LkKGWv.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-02-19-01-49-46.gh-issue-102038.n3if3D.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-02-20-16-47-56.gh-issue-102069.FS7f1j.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-02-21-11-56-16.gh-issue-102103.Dj0WEj.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-02-26-17-29-57.gh-issue-79940.SAfmAy.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-03-19-53-08.gh-issue-102378.kRdOZc.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-04-20-58-29.gh-issue-74468.Ac5Ew_.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-08-23-08-38.gh-issue-102519.wlcsFI.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-10-13-21-16.gh-issue-102578.-gujoI.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-10-13-51-21.gh-issue-100112.VHh4mw.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-13-12-05-55.gh-issue-102615.NcA_ZL.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-13-18-27-00.gh-issue-102670.GyoThv.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-16-08-17-29.gh-issue-102748.WNACpI.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-16-16-43-04.gh-issue-78530.Lr8eq_.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-17-19-14-26.gh-issue-76846.KEamjK.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-18-14-59-21.gh-issue-88965.kA70Km.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-19-15-30-59.gh-issue-102828.NKClXg.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-20-12-21-19.gh-issue-102839.RjRi12.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-21-15-17-07.gh-issue-102871.U9mchn.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-22-16-15-18.gh-issue-102780.NEcljy.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-23-13-34-33.gh-issue-102947.cTwcpU.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-25-02-08-05.gh-issue-103023.Qfn7Hl.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-25-16-57-18.gh-issue-102433.L-7x2Q.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-26-20-54-57.gh-issue-103046.xBlA2l.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-27-15-01-16.gh-issue-103056.-Efh5Q.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-28-05-14-59.gh-issue-103068.YQTmrA.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-28-15-12-53.gh-issue-103085.DqNehf.rst delete mode 100644 Misc/NEWS.d/next/Tests/2023-01-27-18-10-40.gh-issue-101377.IJGpqh.rst delete mode 100644 Misc/NEWS.d/next/Tests/2023-03-08-13-54-20.gh-issue-102537.Vfplpb.rst delete mode 100644 Misc/NEWS.d/next/Tests/2023-03-23-23-25-18.gh-issue-102980.Zps4QF.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2023-03-21-01-27-07.gh-issue-102809.2F1Byz.rst delete mode 100644 Misc/NEWS.d/next/Windows/2023-02-22-17-26-10.gh-issue-99726.76t957.rst delete mode 100644 Misc/NEWS.d/next/Windows/2023-03-14-10-52-43.gh-issue-102690.sbXtqk.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 049cdfa30897ca..1a8a6d9c8f7a3d 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -20,10 +20,10 @@ #define PY_MINOR_VERSION 12 #define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA -#define PY_RELEASE_SERIAL 6 +#define PY_RELEASE_SERIAL 7 /* Version as a string */ -#define PY_VERSION "3.12.0a6+" +#define PY_VERSION "3.12.0a7" /*--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 ad1b6aca6b95bc..1babb5ce9476c9 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Tue Mar 7 22:42:28 2023 +# Autogenerated by Sphinx on Tue Apr 4 17:52:21 2023 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -1134,10 +1134,11 @@ 'future, a\n' ' check may be added to prevent this.\n' '\n' - '* Nonempty *__slots__* does not work for classes derived ' - 'from\n' - ' “variable-length” built-in types such as "int", ' - '"bytes" and "tuple".\n' + '* "TypeError" will be raised if nonempty *__slots__* are ' + 'defined for a\n' + ' class derived from a ""variable-length" built-in type" ' + 'such as\n' + ' "int", "bytes", and "tuple".\n' '\n' '* Any non-string *iterable* may be assigned to ' '*__slots__*.\n' @@ -3072,7 +3073,7 @@ 'AS\n' 'pattern binds the subject to the name on the right of the as ' 'keyword\n' - 'and succeeds. "capture_pattern" cannot be a a "_".\n' + 'and succeeds. "capture_pattern" cannot be a "_".\n' '\n' 'In simple terms "P as NAME" will match with "P", and on success ' 'it\n' @@ -4675,7 +4676,7 @@ 'scripts. For\n' 'example:\n' '\n' - ' python3 -m pdb myscript.py\n' + ' python -m pdb myscript.py\n' '\n' 'When invoked as a script, pdb will automatically enter ' 'post-mortem\n' @@ -4695,7 +4696,7 @@ '\n' 'New in version 3.7: "pdb.py" now accepts a "-m" option that ' 'execute\n' - 'modules similar to the way "python3 -m" does. As with a script, ' + 'modules similar to the way "python -m" does. As with a script, ' 'the\n' 'debugger will pause execution just before the first line of the\n' 'module.\n' @@ -4759,8 +4760,8 @@ 'object)\n' ' under debugger control. When "runeval()" returns, it returns ' 'the\n' - ' value of the expression. Otherwise this function is similar ' - 'to\n' + ' value of the *expression*. Otherwise this function is ' + 'similar to\n' ' "run()".\n' '\n' 'pdb.runcall(function, *args, **kwds)\n' @@ -4799,7 +4800,7 @@ 'pdb.pm()\n' '\n' ' Enter post-mortem debugging of the traceback found in\n' - ' "sys.last_exc".\n' + ' "sys.last_traceback".\n' '\n' 'The "run*" functions and "set_trace()" are aliases for ' 'instantiating\n' @@ -5022,14 +5023,15 @@ 'ignore bpnumber [count]\n' '\n' ' Set the ignore count for the given breakpoint number. If ' - 'count is\n' - ' omitted, the ignore count is set to 0. A breakpoint becomes ' - 'active\n' - ' when the ignore count is zero. When non-zero, the count is\n' - ' decremented each time the breakpoint is reached and the ' - 'breakpoint\n' - ' is not disabled and any associated condition evaluates to ' - 'true.\n' + '*count*\n' + ' is omitted, the ignore count is set to 0. A breakpoint ' + 'becomes\n' + ' active when the ignore count is zero. When non-zero, the ' + '*count*\n' + ' is decremented each time the breakpoint is reached and the\n' + ' breakpoint is not disabled and any associated condition ' + 'evaluates\n' + ' to true.\n' '\n' 'condition bpnumber [condition]\n' '\n' @@ -5079,7 +5081,7 @@ ' breakpoint—which could have its own command list, leading to\n' ' ambiguities about which list to execute.\n' '\n' - ' If you use the ‘silent’ command in the command list, the ' + ' If you use the "silent" command in the command list, the ' 'usual\n' ' message about stopping at a breakpoint is not printed. This ' 'may be\n' @@ -5114,11 +5116,10 @@ 'number\n' ' greater than the current one is reached.\n' '\n' - ' With a line number, continue execution until a line with a ' - 'number\n' - ' greater or equal to that is reached. In both cases, also ' - 'stop when\n' - ' the current frame returns.\n' + ' With *lineno*, continue execution until a line with a number\n' + ' greater or equal to *lineno* is reached. In both cases, also ' + 'stop\n' + ' when the current frame returns.\n' '\n' ' Changed in version 3.2: Allow giving an explicit line ' 'number.\n' @@ -5182,9 +5183,8 @@ '\n' 'p expression\n' '\n' - ' Evaluate the *expression* in the current context and print ' - 'its\n' - ' value.\n' + ' Evaluate *expression* in the current context and print its ' + 'value.\n' '\n' ' Note:\n' '\n' @@ -5194,26 +5194,26 @@ '\n' 'pp expression\n' '\n' - ' Like the "p" command, except the value of the expression is ' + ' Like the "p" command, except the value of *expression* is ' 'pretty-\n' ' printed using the "pprint" module.\n' '\n' 'whatis expression\n' '\n' - ' Print the type of the *expression*.\n' + ' Print the type of *expression*.\n' '\n' 'source expression\n' '\n' - ' Try to get source code for the given object and display it.\n' + ' Try to get source code of *expression* and display it.\n' '\n' ' New in version 3.2.\n' '\n' 'display [expression]\n' '\n' - ' Display the value of the expression if it changed, each time\n' + ' Display the value of *expression* if it changed, each time\n' ' execution stops in the current frame.\n' '\n' - ' Without expression, list all display expressions for the ' + ' Without *expression*, list all display expressions for the ' 'current\n' ' frame.\n' '\n' @@ -5221,10 +5221,10 @@ '\n' 'undisplay [expression]\n' '\n' - ' Do not display the expression any more in the current frame.\n' - ' Without expression, clear all display expressions for the ' - 'current\n' - ' frame.\n' + ' Do not display *expression* anymore in the current frame. ' + 'Without\n' + ' *expression*, clear all display expressions for the current ' + 'frame.\n' '\n' ' New in version 3.2.\n' '\n' @@ -5240,16 +5240,16 @@ '\n' 'alias [name [command]]\n' '\n' - ' Create an alias called *name* that executes *command*. The ' - 'command\n' - ' must *not* be enclosed in quotes. Replaceable parameters can ' - 'be\n' - ' indicated by "%1", "%2", and so on, while "%*" is replaced by ' - 'all\n' - ' the parameters. If no command is given, the current alias ' - 'for\n' - ' *name* is shown. If no arguments are given, all aliases are ' - 'listed.\n' + ' Create an alias called *name* that executes *command*. The\n' + ' *command* must *not* be enclosed in quotes. Replaceable ' + 'parameters\n' + ' can be indicated by "%1", "%2", and so on, while "%*" is ' + 'replaced\n' + ' by all the parameters. If *command* is omitted, the current ' + 'alias\n' + ' for *name* is shown. If no arguments are given, all aliases ' + 'are\n' + ' listed.\n' '\n' ' Aliases may be nested and can contain anything that can be ' 'legally\n' @@ -5268,14 +5268,14 @@ ' in the ".pdbrc" file):\n' '\n' ' # Print instance variables (usage "pi classInst")\n' - ' alias pi for k in %1.__dict__.keys(): ' - 'print("%1.",k,"=",%1.__dict__[k])\n' + ' alias pi for k in %1.__dict__.keys(): print(f"%1.{k} = ' + '{%1.__dict__[k]}")\n' ' # Print instance variables in self\n' ' alias ps pi self\n' '\n' 'unalias name\n' '\n' - ' Delete the specified alias.\n' + ' Delete the specified alias *name*.\n' '\n' '! statement\n' '\n' @@ -5295,12 +5295,13 @@ 'run [args ...]\n' 'restart [args ...]\n' '\n' - ' Restart the debugged Python program. If an argument is ' - 'supplied,\n' - ' it is split with "shlex" and the result is used as the new\n' - ' "sys.argv". History, breakpoints, actions and debugger ' - 'options are\n' - ' preserved. "restart" is an alias for "run".\n' + ' Restart the debugged Python program. If *args* is supplied, ' + 'it is\n' + ' split with "shlex" and the result is used as the new ' + '"sys.argv".\n' + ' History, breakpoints, actions and debugger options are ' + 'preserved.\n' + ' "restart" is an alias for "run".\n' '\n' 'q(uit)\n' '\n' @@ -5309,11 +5310,11 @@ '\n' 'debug code\n' '\n' - ' Enter a recursive debugger that steps through the code ' - 'argument\n' - ' (which is an arbitrary expression or statement to be executed ' - 'in\n' - ' the current environment).\n' + ' Enter a recursive debugger that steps through *code* (which ' + 'is an\n' + ' arbitrary expression or statement to be executed in the ' + 'current\n' + ' environment).\n' '\n' 'retval\n' '\n' @@ -6170,7 +6171,8 @@ 'The general form of a *standard format specifier* is:\n' '\n' ' format_spec ::= ' - '[[fill]align][sign][z][#][0][width][grouping_option][.precision][type]\n' + '[[fill]align][sign]["z"]["#"]["0"][width][grouping_option]["." ' + 'precision][type]\n' ' fill ::= \n' ' align ::= "<" | ">" | "=" | "^"\n' ' sign ::= "+" | "-" | " "\n' @@ -9981,10 +9983,11 @@ 'future, a\n' ' check may be added to prevent this.\n' '\n' - '* Nonempty *__slots__* does not work for classes derived ' - 'from\n' - ' “variable-length” built-in types such as "int", "bytes" ' - 'and "tuple".\n' + '* "TypeError" will be raised if nonempty *__slots__* are ' + 'defined for a\n' + ' class derived from a ""variable-length" built-in type" ' + 'such as\n' + ' "int", "bytes", and "tuple".\n' '\n' '* Any non-string *iterable* may be assigned to *__slots__*.\n' '\n' @@ -13691,11 +13694,10 @@ ' compiled; "co_firstlineno" is the first line number of the\n' ' function; "co_lnotab" is a string encoding the mapping from\n' ' bytecode offsets to line numbers (for details see the source\n' - ' code of the interpreter); "co_stacksize" is the required ' - 'stack\n' - ' size; "co_flags" is an integer encoding a number of flags ' - 'for\n' - ' the interpreter.\n' + ' code of the interpreter, is deprecated since 3.12 and may be\n' + ' removed in 3.14); "co_stacksize" is the required stack size;\n' + ' "co_flags" is an integer encoding a number of flags for the\n' + ' interpreter.\n' '\n' ' The following flag bits are defined for "co_flags": bit ' '"0x04"\n' @@ -13858,7 +13860,7 @@ 'if\n' ' the interpreter is interactive, it is also made available to ' 'the\n' - ' user as "sys.last_exc".\n' + ' user as "sys.last_traceback".\n' '\n' ' For explicitly created tracebacks, it is up to the creator ' 'of\n' diff --git a/Misc/NEWS.d/3.12.0a7.rst b/Misc/NEWS.d/3.12.0a7.rst new file mode 100644 index 00000000000000..8f078e50823a00 --- /dev/null +++ b/Misc/NEWS.d/3.12.0a7.rst @@ -0,0 +1,745 @@ +.. date: 2023-03-31-12-22-25 +.. gh-issue: 102192 +.. nonce: gYxJP_ +.. release date: 2023-04-04 +.. section: Core and Builtins + +Deprecated ``_PyErr_ChainExceptions`` in favour of +``_PyErr_ChainExceptions1``. + +.. + +.. date: 2023-03-24-02-50-33 +.. gh-issue: 89987 +.. nonce: oraTzh +.. section: Core and Builtins + +Reduce the number of inline :opcode:`CACHE` entries for +:opcode:`BINARY_SUBSCR`. + +.. + +.. date: 2023-03-21-00-46-36 +.. gh-issue: 102859 +.. nonce: PRkGca +.. section: Core and Builtins + +Removed :opcode:`JUMP_IF_FALSE_OR_POP` and :opcode:`JUMP_IF_TRUE_OR_POP` +instructions. + +.. + +.. date: 2023-03-18-02-36-39 +.. gh-issue: 101975 +.. nonce: HwMR1d +.. section: Core and Builtins + +Fixed ``stacktop`` value on tracing entries to avoid corruption on garbage +collection. + +.. + +.. date: 2023-03-17-13-43-34 +.. gh-issue: 102778 +.. nonce: ANDv8I +.. section: Core and Builtins + +Add :data:`sys.last_exc` and deprecate :data:`sys.last_type`, +:data:`sys.last_value` and :data:`sys.last_traceback`, which hold the same +information in its legacy form. + +.. + +.. date: 2023-03-17-12-09-45 +.. gh-issue: 100982 +.. nonce: Pf_BI6 +.. section: Core and Builtins + +Replace all occurrences of ``COMPARE_AND_BRANCH`` with :opcode:`COMPARE_OP`. + +.. + +.. date: 2023-03-16-17-24-44 +.. gh-issue: 102701 +.. nonce: iNGVaS +.. section: Core and Builtins + +Fix overflow when creating very large dict. + +.. + +.. date: 2023-03-16-14-44-29 +.. gh-issue: 102755 +.. nonce: j1GxlV +.. section: Core and Builtins + +Add :c:func:`PyErr_DisplayException` which takes just an exception instance, +to replace the legacy :c:func:`PyErr_Display` which takes the ``(typ, exc, +tb)`` triplet. + +.. + +.. date: 2023-03-14-00-11-46 +.. gh-issue: 102594 +.. nonce: BjU-m2 +.. section: Core and Builtins + +Add note to exception raised in ``PyErr_SetObject`` when normalization +fails. + +.. + +.. date: 2023-03-09-13-57-35 +.. gh-issue: 90997 +.. nonce: J-Yhn2 +.. section: Core and Builtins + +Shrink the number of inline :opcode:`CACHE` entries used by +:opcode:`LOAD_GLOBAL`. + +.. + +.. date: 2023-03-08-08-37-36 +.. gh-issue: 102491 +.. nonce: SFvvsC +.. section: Core and Builtins + +Improve import time of ``platform`` by removing IronPython version parsing. +The IronPython version parsing was not functional (see +https://github.com/IronLanguages/ironpython3/issues/1667). + +.. + +.. date: 2023-03-06-10-02-22 +.. gh-issue: 101291 +.. nonce: 0FT2QS +.. section: Core and Builtins + +Rearrage bits in first field (after header) of PyLongObject. * Bits 0 and 1: +1 - sign. I.e. 0 for positive numbers, 1 for zero and 2 for negative +numbers. * Bit 2 reserved (probably for the immortal bit) * Bits 3+ the +unsigned size. + +This makes a few operations slightly more efficient, and will enable a more +compact and faster 2s-complement representation of most ints in future. + +.. + +.. date: 2023-03-04-06-48-34 +.. gh-issue: 102397 +.. nonce: ACJaOf +.. section: Core and Builtins + +Fix segfault from race condition in signal handling during garbage +collection. Patch by Kumar Aditya. + +.. + +.. date: 2023-03-03-23-21-16 +.. gh-issue: 102406 +.. nonce: XLqYO3 +.. section: Core and Builtins + +:mod:`codecs` encoding/decoding errors now get the context information +(which operation and which codecs) attached as :pep:`678` notes instead of +through chaining a new instance of the exception. + +.. + +.. date: 2023-03-02-13-49-21 +.. gh-issue: 102281 +.. nonce: QCuu2N +.. section: Core and Builtins + +Fix potential nullptr dereference and use of uninitialized memory in +fileutils. Patch by Max Bachmann. + +.. + +.. date: 2023-02-27-15-48-31 +.. gh-issue: 102300 +.. nonce: 8o-_Mt +.. section: Core and Builtins + +Reuse operands with refcount of 1 in float specializations of BINARY_OP. + +.. + +.. date: 2023-02-26-13-12-55 +.. gh-issue: 102213 +.. nonce: fTH8X7 +.. section: Core and Builtins + +Fix performance loss when accessing an object's attributes with +``__getattr__`` defined. + +.. + +.. date: 2023-02-26-11-43-56 +.. gh-issue: 102255 +.. nonce: cRnI5x +.. section: Core and Builtins + +Improve build support for the Xbox. Patch by Max Bachmann. + +.. + +.. date: 2023-02-21-23-42-39 +.. gh-issue: 102027 +.. nonce: fQARG0 +.. section: Core and Builtins + +Fix SSE2 and SSE3 detection in ``_blake2`` internal module. Patch by Max +Bachmann. + +.. + +.. date: 2023-02-21-17-22-06 +.. gh-issue: 101865 +.. nonce: fwrTOA +.. section: Core and Builtins + +Deprecate ``co_lnotab`` in code objects, schedule it for removal in Python +3.14 + +.. + +.. bpo: 1635741 +.. date: 2020-07-04-09-04-41 +.. nonce: ZsP31Y +.. section: Core and Builtins + +Adapt :mod:`!_pickle` to :pep:`687`. Patch by Mohamed Koubaa and Erlend +Aasland. + +.. + +.. date: 2023-03-28-15-12-53 +.. gh-issue: 103085 +.. nonce: DqNehf +.. section: Library + +Pure python :func:`locale.getencoding()` will not warn deprecation. + +.. + +.. date: 2023-03-28-05-14-59 +.. gh-issue: 103068 +.. nonce: YQTmrA +.. section: Library + +It's no longer possible to register conditional breakpoints in +:class:`~pdb.Pdb` that raise :exc:`SyntaxError`. Patch by Tian Gao. + +.. + +.. date: 2023-03-27-19-21-51 +.. gh-issue: 102549 +.. nonce: NQ6Nlv +.. section: Library + +Don't ignore exceptions in member type creation. + +.. + +.. date: 2023-03-27-15-01-16 +.. gh-issue: 103056 +.. nonce: -Efh5Q +.. section: Library + +Ensure final ``_generate_next_value_`` is a ``staticmethod``. + +.. + +.. date: 2023-03-26-20-54-57 +.. gh-issue: 103046 +.. nonce: xBlA2l +.. section: Library + +Display current line label correctly in :mod:`dis` when ``show_caches`` is +False and ``lasti`` points to a CACHE entry. + +.. + +.. date: 2023-03-25-16-57-18 +.. gh-issue: 102433 +.. nonce: L-7x2Q +.. section: Library + +:func:`isinstance` checks against :func:`runtime-checkable protocols +` now use :func:`inspect.getattr_static` rather +than :func:`hasattr` to lookup whether attributes exist. This means that +descriptors and :meth:`~object.__getattr__` methods are no longer +unexpectedly evaluated during ``isinstance()`` checks against +runtime-checkable protocols. However, it may also mean that some objects +which used to be considered instances of a runtime-checkable protocol may no +longer be considered instances of that protocol on Python 3.12+, and vice +versa. Most users are unlikely to be affected by this change. Patch by Alex +Waygood. + +.. + +.. date: 2023-03-25-02-08-05 +.. gh-issue: 103023 +.. nonce: Qfn7Hl +.. section: Library + +It's no longer possible to register expressions to display in +:class:`~pdb.Pdb` that raise :exc:`SyntaxError`. Patch by Tian Gao. + +.. + +.. date: 2023-03-23-13-34-33 +.. gh-issue: 102947 +.. nonce: cTwcpU +.. section: Library + +Improve traceback when :func:`dataclasses.fields` is called on a +non-dataclass. Patch by Alex Waygood + +.. + +.. date: 2023-03-22-16-15-18 +.. gh-issue: 102780 +.. nonce: NEcljy +.. section: Library + +The :class:`asyncio.Timeout` context manager now works reliably even when +performing cleanup due to task cancellation. Previously it could raise a +:exc:`~asyncio.CancelledError` instead of an :exc:`~asyncio.TimeoutError` in +such cases. + +.. + +.. date: 2023-03-21-15-17-07 +.. gh-issue: 102871 +.. nonce: U9mchn +.. section: Library + +Remove support for obsolete browsers from :mod:`webbrowser`. Removed +browsers include Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, +Firebird, and Firefox versions 35 and below. + +.. + +.. date: 2023-03-20-12-21-19 +.. gh-issue: 102839 +.. nonce: RjRi12 +.. section: Library + +Improve performance of :func:`math.log` arguments handling by removing the +argument clinic. + +.. + +.. date: 2023-03-19-15-30-59 +.. gh-issue: 102828 +.. nonce: NKClXg +.. section: Library + +Add the ``onexc`` arg to :func:`shutil.rmtree`, which is like ``onerror`` +but expects an exception instance rather than an exc_info tuple. Deprecate +``onerror``. + +.. + +.. date: 2023-03-18-14-59-21 +.. gh-issue: 88965 +.. nonce: kA70Km +.. section: Library + +typing: Fix a bug relating to substitution in custom classes generic over a +:class:`~typing.ParamSpec`. Previously, if the ``ParamSpec`` was substituted +with a parameters list that itself contained a :class:`~typing.TypeVar`, the +``TypeVar`` in the parameters list could not be subsequently substituted. +This is now fixed. + +Patch by Nikita Sobolev. + +.. + +.. date: 2023-03-17-19-14-26 +.. gh-issue: 76846 +.. nonce: KEamjK +.. section: Library + +Fix issue where ``__new__()`` and ``__init__()`` methods of +:class:`pathlib.PurePath` and :class:`~pathlib.Path` subclasses were not +called in some circumstances. + +.. + +.. date: 2023-03-16-16-43-04 +.. gh-issue: 78530 +.. nonce: Lr8eq_ +.. section: Library + +:func:`asyncio.wait` now accepts generators yielding tasks. Patch by Kumar +Aditya. + +.. + +.. date: 2023-03-16-08-17-29 +.. gh-issue: 102748 +.. nonce: WNACpI +.. section: Library + +:func:`asyncio.iscoroutine` now returns ``False`` for generators as +:mod:`asyncio` does not support legacy generator-based coroutines. Patch by +Kumar Aditya. + +.. + +.. date: 2023-03-13-18-27-00 +.. gh-issue: 102670 +.. nonce: GyoThv +.. section: Library + +Optimized fmean(), correlation(), covariance(), and linear_regression() +using the new math.sumprod() function. + +.. + +.. date: 2023-03-13-12-05-55 +.. gh-issue: 102615 +.. nonce: NcA_ZL +.. section: Library + +Typing: Improve the ``repr`` of generic aliases for classes generic over a +:class:`~typing.ParamSpec`. (Use square brackets to represent a parameter +list.) + +.. + +.. date: 2023-03-10-13-51-21 +.. gh-issue: 100112 +.. nonce: VHh4mw +.. section: Library + +:meth:`asyncio.Task.get_coro` now always returns a coroutine when wrapping +an awaitable object. Patch by Kumar Aditya. + +.. + +.. date: 2023-03-10-13-21-16 +.. gh-issue: 102578 +.. nonce: -gujoI +.. section: Library + +Speed up setting or deleting mutable attributes on non-dataclass subclasses +of frozen dataclasses. Due to the implementation of ``__setattr__`` and +``__delattr__`` for frozen dataclasses, this previously had a time +complexity of ``O(n)``. It now has a time complexity of ``O(1)``. + +.. + +.. date: 2023-03-08-23-08-38 +.. gh-issue: 102519 +.. nonce: wlcsFI +.. section: Library + +Add :func:`os.listdrives`, :func:`os.listvolumes` and :func:`os.listmounts` +functions on Windows for enumerating drives, volumes and mount points + +.. + +.. date: 2023-03-04-20-58-29 +.. gh-issue: 74468 +.. nonce: Ac5Ew_ +.. section: Library + +Attribute name of the extracted :mod:`tarfile` file object now holds +filename of itself rather than of the archive it is contained in. Patch by +Oleg Iarygin. + +.. + +.. date: 2023-03-03-19-53-08 +.. gh-issue: 102378 +.. nonce: kRdOZc +.. section: Library + +Private helper method ``inspect._signature_strip_non_python_syntax`` will no +longer strip ``/`` from the input string. + +.. + +.. date: 2023-02-26-17-29-57 +.. gh-issue: 79940 +.. nonce: SAfmAy +.. section: Library + +Add :func:`inspect.getasyncgenstate` and :func:`inspect.getasyncgenlocals`. +Patch by Thomas Krennwallner. + +.. + +.. date: 2023-02-21-11-56-16 +.. gh-issue: 102103 +.. nonce: Dj0WEj +.. section: Library + +Add ``module`` argument to :func:`dataclasses.make_dataclass` and make +classes produced by it pickleable. + +.. + +.. date: 2023-02-20-16-47-56 +.. gh-issue: 102069 +.. nonce: FS7f1j +.. section: Library + +Fix ``__weakref__`` descriptor generation for custom dataclasses. + +.. + +.. date: 2023-02-19-01-49-46 +.. gh-issue: 102038 +.. nonce: n3if3D +.. section: Library + +Skip a ``stat`` in :mod:`site` if we have already found a ``pyvenv.cfg`` + +.. + +.. date: 2023-02-18-23-03-50 +.. gh-issue: 98886 +.. nonce: LkKGWv +.. section: Library + +Fix issues when defining dataclasses that have fields with specific +underscore names that aren't clearly reserved by :mod:`dataclasses`. + +.. + +.. date: 2023-02-09-19-40-41 +.. gh-issue: 101673 +.. nonce: mX-Ppq +.. section: Library + +Fix a :mod:`pdb` bug where ``ll`` clears the changes to local variables. + +.. + +.. date: 2023-01-27-14-51-07 +.. gh-issue: 101313 +.. nonce: 10AEXh +.. section: Library + +Added -h and --help arguments to the webbrowser CLI + +.. + +.. date: 2022-12-20-10-55-14 +.. gh-issue: 100372 +.. nonce: utfP65 +.. section: Library + +:meth:`ssl.SSLContext.load_verify_locations` no longer incorrectly accepts +some cases of trailing data when parsing DER. + +.. + +.. date: 2022-12-16-10-27-58 +.. gh-issue: 89727 +.. nonce: y64ZLM +.. section: Library + +Fix pathlib.Path.walk RecursionError on deep directory trees by rewriting it +using iteration instead of recursion. + +.. + +.. date: 2022-12-09-11-21-38 +.. gh-issue: 100131 +.. nonce: v863yR +.. section: Library + +Added an optional ``delete`` keyword argument to +:class:`tempfile.TemporaryDirectory`. + +.. + +.. date: 2022-11-24-13-23-07 +.. gh-issue: 48330 +.. nonce: 6uAX9F +.. section: Library + +Added ``--durations`` command line option, showing the N slowest test cases. +:class:`unittest.TextTestRunner` and :class:`unittest.TextTestResult` +constructors accept a new *durations* keyword argument. Subclasses should +take this into account or accept ``**kwargs``. Added +:meth:`unittest.TestResult.addDuration` method and +:attr:`unittest.TestResult.collectedDurations` attribute. + +(Contributed by Giampaolo Rodola) + +.. + +.. date: 2022-10-10-19-14-51 +.. gh-issue: 98169 +.. nonce: DBWIxL +.. section: Library + +Fix :func:`dataclasses.astuple` crash when :class:`collections.defaultdict` +is present in the attributes. + +.. + +.. date: 2022-09-19-08-12-58 +.. gh-issue: 96931 +.. nonce: x0WQhh +.. section: Library + +Fix incorrect results from :meth:`ssl.SSLSocket.shared_ciphers` + +.. + +.. date: 2022-07-30-23-01-43 +.. gh-issue: 95495 +.. nonce: RA-q1d +.. section: Library + +When built against OpenSSL 3.0, the :mod:`ssl` module had a bug where it +reported unauthenticated EOFs (i.e. without close_notify) as a clean +TLS-level EOF. It now raises :exc:`~ssl.SSLEOFError`, matching the behavior +in previous versions of OpenSSL. The :attr:`~ssl.SSLContext.options` +attribute on :class:`~ssl.SSLContext` also no longer includes +:data:`~ssl.OP_IGNORE_UNEXPECTED_EOF` by default. This option may be set to +specify the previous OpenSSL 3.0 behavior. + +.. + +.. date: 2022-07-09-13-07-30 +.. gh-issue: 94684 +.. nonce: nV5yno +.. section: Library + +Now :func:`uuid.uuid3` and :func:`uuid.uuid5` functions support +:class:`bytes` objects as their *name* argument. + +.. + +.. date: 2022-06-30-21-28-41 +.. gh-issue: 94440 +.. nonce: LtgX0d +.. section: Library + +Fix a :mod:`concurrent.futures.process` bug where ``ProcessPoolExecutor`` +shutdown could hang after a future has been quickly submitted and canceled. + +.. + +.. date: 2022-04-11-18-34-33 +.. gh-issue: 72346 +.. nonce: pC7gnM +.. section: Library + +Added deprecation warning to *isdst* parameter of +:func:`email.utils.localtime`. + +.. + +.. bpo: 36305 +.. date: 2019-03-15-22-50-27 +.. nonce: Pbkv6u +.. section: Library + +Fix handling of Windows filenames that resemble drives, such as ``./a:b``, +in :mod:`pathlib`. + +.. + +.. date: 2023-03-29-14-51-39 +.. gh-issue: 103112 +.. nonce: XgGSEO +.. section: Documentation + +Add docstring to :meth:`http.client.HTTPResponse.read` to fix ``pydoc`` +output. + +.. + +.. date: 2023-03-23-23-25-18 +.. gh-issue: 102980 +.. nonce: Zps4QF +.. section: Tests + +Improve test coverage on :mod:`pdb`. + +.. + +.. date: 2023-03-08-13-54-20 +.. gh-issue: 102537 +.. nonce: Vfplpb +.. section: Tests + +Adjust the error handling strategy in +``test_zoneinfo.TzPathTest.python_tzpath_context``. Patch by Paul Ganssle. + +.. + +.. date: 2023-01-27-18-10-40 +.. gh-issue: 101377 +.. nonce: IJGpqh +.. section: Tests + +Improved test_locale_calendar_formatweekday of calendar. + +.. + +.. date: 2023-03-23-20-58-56 +.. gh-issue: 102973 +.. nonce: EaJUrw +.. section: Build + +Add a dev container (along with accompanying Dockerfile) for development +purposes. + +.. + +.. date: 2023-03-15-02-03-39 +.. gh-issue: 102711 +.. nonce: zTkjts +.. section: Build + +Fix ``-Wstrict-prototypes`` compiler warnings. + +.. + +.. date: 2023-03-14-10-52-43 +.. gh-issue: 102690 +.. nonce: sbXtqk +.. section: Windows + +Update :mod:`webbrowser` to fall back to Microsoft Edge instead of Internet +Explorer. + +.. + +.. date: 2023-02-22-17-26-10 +.. gh-issue: 99726 +.. nonce: 76t957 +.. section: Windows + +Improves correctness of stat results for Windows, and uses faster API when +available + +.. + +.. date: 2023-03-21-01-27-07 +.. gh-issue: 102809 +.. nonce: 2F1Byz +.. section: Tools/Demos + +``Misc/gdbinit`` was removed. + +.. + +.. date: 2023-02-18-00-55-14 +.. gh-issue: 102013 +.. nonce: 83mrtI +.. section: C API + +Add a new (unstable) C-API function for iterating over GC'able objects using +a callback: ``PyUnstable_VisitObjects``. diff --git a/Misc/NEWS.d/next/Build/2023-03-15-02-03-39.gh-issue-102711.zTkjts.rst b/Misc/NEWS.d/next/Build/2023-03-15-02-03-39.gh-issue-102711.zTkjts.rst deleted file mode 100644 index 51184396877721..00000000000000 --- a/Misc/NEWS.d/next/Build/2023-03-15-02-03-39.gh-issue-102711.zTkjts.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``-Wstrict-prototypes`` compiler warnings. diff --git a/Misc/NEWS.d/next/Build/2023-03-23-20-58-56.gh-issue-102973.EaJUrw.rst b/Misc/NEWS.d/next/Build/2023-03-23-20-58-56.gh-issue-102973.EaJUrw.rst deleted file mode 100644 index 38b02391266ffb..00000000000000 --- a/Misc/NEWS.d/next/Build/2023-03-23-20-58-56.gh-issue-102973.EaJUrw.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add a dev container (along with accompanying Dockerfile) for development -purposes. diff --git a/Misc/NEWS.d/next/C API/2023-02-18-00-55-14.gh-issue-102013.83mrtI.rst b/Misc/NEWS.d/next/C API/2023-02-18-00-55-14.gh-issue-102013.83mrtI.rst deleted file mode 100644 index 0350237ebc7390..00000000000000 --- a/Misc/NEWS.d/next/C API/2023-02-18-00-55-14.gh-issue-102013.83mrtI.rst +++ /dev/null @@ -1 +0,0 @@ -Add a new (unstable) C-API function for iterating over GC'able objects using a callback: ``PyUnstable_VisitObjects``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-04-09-04-41.bpo-1635741.ZsP31Y.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-04-09-04-41.bpo-1635741.ZsP31Y.rst deleted file mode 100644 index 9f9c8121bea5ae..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-07-04-09-04-41.bpo-1635741.ZsP31Y.rst +++ /dev/null @@ -1 +0,0 @@ -Adapt :mod:`!_pickle` to :pep:`687`. Patch by Mohamed Koubaa and Erlend Aasland. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-02-21-17-22-06.gh-issue-101865.fwrTOA.rst b/Misc/NEWS.d/next/Core and Builtins/2023-02-21-17-22-06.gh-issue-101865.fwrTOA.rst deleted file mode 100644 index 876cc223a0e727..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-02-21-17-22-06.gh-issue-101865.fwrTOA.rst +++ /dev/null @@ -1,2 +0,0 @@ -Deprecate ``co_lnotab`` in code objects, schedule it for removal in Python -3.14 diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-02-21-23-42-39.gh-issue-102027.fQARG0.rst b/Misc/NEWS.d/next/Core and Builtins/2023-02-21-23-42-39.gh-issue-102027.fQARG0.rst deleted file mode 100644 index 42d96b54677e41..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-02-21-23-42-39.gh-issue-102027.fQARG0.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix SSE2 and SSE3 detection in ``_blake2`` internal module. Patch by Max -Bachmann. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-02-26-11-43-56.gh-issue-102255.cRnI5x.rst b/Misc/NEWS.d/next/Core and Builtins/2023-02-26-11-43-56.gh-issue-102255.cRnI5x.rst deleted file mode 100644 index daabc3c15f6ee2..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-02-26-11-43-56.gh-issue-102255.cRnI5x.rst +++ /dev/null @@ -1 +0,0 @@ -Improve build support for the Xbox. Patch by Max Bachmann. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-02-26-13-12-55.gh-issue-102213.fTH8X7.rst b/Misc/NEWS.d/next/Core and Builtins/2023-02-26-13-12-55.gh-issue-102213.fTH8X7.rst deleted file mode 100644 index 997bef226e713f..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-02-26-13-12-55.gh-issue-102213.fTH8X7.rst +++ /dev/null @@ -1 +0,0 @@ -Fix performance loss when accessing an object's attributes with ``__getattr__`` defined. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-02-27-15-48-31.gh-issue-102300.8o-_Mt.rst b/Misc/NEWS.d/next/Core and Builtins/2023-02-27-15-48-31.gh-issue-102300.8o-_Mt.rst deleted file mode 100644 index 4227014582b7e6..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-02-27-15-48-31.gh-issue-102300.8o-_Mt.rst +++ /dev/null @@ -1 +0,0 @@ -Reuse operands with refcount of 1 in float specializations of BINARY_OP. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-02-13-49-21.gh-issue-102281.QCuu2N.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-02-13-49-21.gh-issue-102281.QCuu2N.rst deleted file mode 100644 index b0269dd3d92bd5..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-03-02-13-49-21.gh-issue-102281.QCuu2N.rst +++ /dev/null @@ -1 +0,0 @@ -Fix potential nullptr dereference and use of uninitialized memory in fileutils. Patch by Max Bachmann. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-03-23-21-16.gh-issue-102406.XLqYO3.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-03-23-21-16.gh-issue-102406.XLqYO3.rst deleted file mode 100644 index e0d061c37299f2..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-03-03-23-21-16.gh-issue-102406.XLqYO3.rst +++ /dev/null @@ -1 +0,0 @@ -:mod:`codecs` encoding/decoding errors now get the context information (which operation and which codecs) attached as :pep:`678` notes instead of through chaining a new instance of the exception. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-04-06-48-34.gh-issue-102397.ACJaOf.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-04-06-48-34.gh-issue-102397.ACJaOf.rst deleted file mode 100644 index db0b3f32c2ec0b..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-03-04-06-48-34.gh-issue-102397.ACJaOf.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix segfault from race condition in signal handling during garbage collection. -Patch by Kumar Aditya. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-06-10-02-22.gh-issue-101291.0FT2QS.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-06-10-02-22.gh-issue-101291.0FT2QS.rst deleted file mode 100644 index 46f0f325f91630..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-03-06-10-02-22.gh-issue-101291.0FT2QS.rst +++ /dev/null @@ -1,7 +0,0 @@ -Rearrage bits in first field (after header) of PyLongObject. -* Bits 0 and 1: 1 - sign. I.e. 0 for positive numbers, 1 for zero and 2 for negative numbers. -* Bit 2 reserved (probably for the immortal bit) -* Bits 3+ the unsigned size. - -This makes a few operations slightly more efficient, and will enable a more -compact and faster 2s-complement representation of most ints in future. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-08-08-37-36.gh-issue-102491.SFvvsC.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-08-08-37-36.gh-issue-102491.SFvvsC.rst deleted file mode 100644 index 5bdc9ed2f37adc..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-03-08-08-37-36.gh-issue-102491.SFvvsC.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve import time of ``platform`` by removing IronPython version parsing. The IronPython version parsing -was not functional (see https://github.com/IronLanguages/ironpython3/issues/1667). diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-09-13-57-35.gh-issue-90997.J-Yhn2.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-09-13-57-35.gh-issue-90997.J-Yhn2.rst deleted file mode 100644 index 723a4b9fa777d6..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-03-09-13-57-35.gh-issue-90997.J-Yhn2.rst +++ /dev/null @@ -1,2 +0,0 @@ -Shrink the number of inline :opcode:`CACHE` entries used by -:opcode:`LOAD_GLOBAL`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-14-00-11-46.gh-issue-102594.BjU-m2.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-14-00-11-46.gh-issue-102594.BjU-m2.rst deleted file mode 100644 index 0b95b5ec98e811..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-03-14-00-11-46.gh-issue-102594.BjU-m2.rst +++ /dev/null @@ -1 +0,0 @@ -Add note to exception raised in ``PyErr_SetObject`` when normalization fails. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-16-14-44-29.gh-issue-102755.j1GxlV.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-16-14-44-29.gh-issue-102755.j1GxlV.rst deleted file mode 100644 index d09af8d060d405..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-03-16-14-44-29.gh-issue-102755.j1GxlV.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add :c:func:`PyErr_DisplayException` which takes just an exception instance, -to replace the legacy :c:func:`PyErr_Display` which takes the ``(typ, exc, -tb)`` triplet. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-16-17-24-44.gh-issue-102701.iNGVaS.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-16-17-24-44.gh-issue-102701.iNGVaS.rst deleted file mode 100644 index 4e1f31893377ba..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-03-16-17-24-44.gh-issue-102701.iNGVaS.rst +++ /dev/null @@ -1 +0,0 @@ -Fix overflow when creating very large dict. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-17-12-09-45.gh-issue-100982.Pf_BI6.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-17-12-09-45.gh-issue-100982.Pf_BI6.rst deleted file mode 100644 index 31a8660836c759..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-03-17-12-09-45.gh-issue-100982.Pf_BI6.rst +++ /dev/null @@ -1 +0,0 @@ -Replace all occurrences of ``COMPARE_AND_BRANCH`` with :opcode:`COMPARE_OP`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-17-13-43-34.gh-issue-102778.ANDv8I.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-17-13-43-34.gh-issue-102778.ANDv8I.rst deleted file mode 100644 index b5da227afa5a69..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-03-17-13-43-34.gh-issue-102778.ANDv8I.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add :data:`sys.last_exc` and deprecate :data:`sys.last_type`, :data:`sys.last_value` -and :data:`sys.last_traceback`, -which hold the same information in its legacy form. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-18-02-36-39.gh-issue-101975.HwMR1d.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-18-02-36-39.gh-issue-101975.HwMR1d.rst deleted file mode 100644 index 28c9a8465180db..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-03-18-02-36-39.gh-issue-101975.HwMR1d.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed ``stacktop`` value on tracing entries to avoid corruption on garbage collection. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-21-00-46-36.gh-issue-102859.PRkGca.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-21-00-46-36.gh-issue-102859.PRkGca.rst deleted file mode 100644 index d2e2232c33cc4d..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-03-21-00-46-36.gh-issue-102859.PRkGca.rst +++ /dev/null @@ -1,2 +0,0 @@ -Removed :opcode:`JUMP_IF_FALSE_OR_POP` and :opcode:`JUMP_IF_TRUE_OR_POP` -instructions. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-24-02-50-33.gh-issue-89987.oraTzh.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-24-02-50-33.gh-issue-89987.oraTzh.rst deleted file mode 100644 index 507f68b0c5affe..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-03-24-02-50-33.gh-issue-89987.oraTzh.rst +++ /dev/null @@ -1,2 +0,0 @@ -Reduce the number of inline :opcode:`CACHE` entries for -:opcode:`BINARY_SUBSCR`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-31-12-22-25.gh-issue-102192.gYxJP_.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-31-12-22-25.gh-issue-102192.gYxJP_.rst deleted file mode 100644 index 10dd72b1abc422..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-03-31-12-22-25.gh-issue-102192.gYxJP_.rst +++ /dev/null @@ -1,2 +0,0 @@ -Deprecated ``_PyErr_ChainExceptions`` in favour of -``_PyErr_ChainExceptions1``. diff --git a/Misc/NEWS.d/next/Documentation/2023-03-29-14-51-39.gh-issue-103112.XgGSEO.rst b/Misc/NEWS.d/next/Documentation/2023-03-29-14-51-39.gh-issue-103112.XgGSEO.rst deleted file mode 100644 index babc8150966117..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2023-03-29-14-51-39.gh-issue-103112.XgGSEO.rst +++ /dev/null @@ -1 +0,0 @@ -Add docstring to :meth:`http.client.HTTPResponse.read` to fix ``pydoc`` output. diff --git a/Misc/NEWS.d/next/Library/2019-03-15-22-50-27.bpo-36305.Pbkv6u.rst b/Misc/NEWS.d/next/Library/2019-03-15-22-50-27.bpo-36305.Pbkv6u.rst deleted file mode 100644 index d9360496ac24cb..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-15-22-50-27.bpo-36305.Pbkv6u.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix handling of Windows filenames that resemble drives, such as ``./a:b``, -in :mod:`pathlib`. diff --git a/Misc/NEWS.d/next/Library/2022-04-11-18-34-33.gh-issue-72346.pC7gnM.rst b/Misc/NEWS.d/next/Library/2022-04-11-18-34-33.gh-issue-72346.pC7gnM.rst deleted file mode 100644 index 149ddd706c358f..00000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-11-18-34-33.gh-issue-72346.pC7gnM.rst +++ /dev/null @@ -1 +0,0 @@ -Added deprecation warning to *isdst* parameter of :func:`email.utils.localtime`. diff --git a/Misc/NEWS.d/next/Library/2022-06-30-21-28-41.gh-issue-94440.LtgX0d.rst b/Misc/NEWS.d/next/Library/2022-06-30-21-28-41.gh-issue-94440.LtgX0d.rst deleted file mode 100644 index 3eee82e59dfafb..00000000000000 --- a/Misc/NEWS.d/next/Library/2022-06-30-21-28-41.gh-issue-94440.LtgX0d.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a :mod:`concurrent.futures.process` bug where ``ProcessPoolExecutor`` shutdown -could hang after a future has been quickly submitted and canceled. diff --git a/Misc/NEWS.d/next/Library/2022-07-09-13-07-30.gh-issue-94684.nV5yno.rst b/Misc/NEWS.d/next/Library/2022-07-09-13-07-30.gh-issue-94684.nV5yno.rst deleted file mode 100644 index 1fa38c0044d36f..00000000000000 --- a/Misc/NEWS.d/next/Library/2022-07-09-13-07-30.gh-issue-94684.nV5yno.rst +++ /dev/null @@ -1 +0,0 @@ -Now :func:`uuid.uuid3` and :func:`uuid.uuid5` functions support :class:`bytes` objects as their *name* argument. diff --git a/Misc/NEWS.d/next/Library/2022-07-30-23-01-43.gh-issue-95495.RA-q1d.rst b/Misc/NEWS.d/next/Library/2022-07-30-23-01-43.gh-issue-95495.RA-q1d.rst deleted file mode 100644 index d0f4ccbdd3e39f..00000000000000 --- a/Misc/NEWS.d/next/Library/2022-07-30-23-01-43.gh-issue-95495.RA-q1d.rst +++ /dev/null @@ -1,7 +0,0 @@ -When built against OpenSSL 3.0, the :mod:`ssl` module had a bug where it -reported unauthenticated EOFs (i.e. without close_notify) as a clean TLS-level -EOF. It now raises :exc:`~ssl.SSLEOFError`, matching the behavior in previous -versions of OpenSSL. The :attr:`~ssl.SSLContext.options` attribute on -:class:`~ssl.SSLContext` also no longer includes -:data:`~ssl.OP_IGNORE_UNEXPECTED_EOF` by default. This option may be set to -specify the previous OpenSSL 3.0 behavior. diff --git a/Misc/NEWS.d/next/Library/2022-09-19-08-12-58.gh-issue-96931.x0WQhh.rst b/Misc/NEWS.d/next/Library/2022-09-19-08-12-58.gh-issue-96931.x0WQhh.rst deleted file mode 100644 index 766b1d4d477b72..00000000000000 --- a/Misc/NEWS.d/next/Library/2022-09-19-08-12-58.gh-issue-96931.x0WQhh.rst +++ /dev/null @@ -1 +0,0 @@ -Fix incorrect results from :meth:`ssl.SSLSocket.shared_ciphers` diff --git a/Misc/NEWS.d/next/Library/2022-10-10-19-14-51.gh-issue-98169.DBWIxL.rst b/Misc/NEWS.d/next/Library/2022-10-10-19-14-51.gh-issue-98169.DBWIxL.rst deleted file mode 100644 index 24c3aeecc83f18..00000000000000 --- a/Misc/NEWS.d/next/Library/2022-10-10-19-14-51.gh-issue-98169.DBWIxL.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :func:`dataclasses.astuple` crash when :class:`collections.defaultdict` -is present in the attributes. diff --git a/Misc/NEWS.d/next/Library/2022-11-24-13-23-07.gh-issue-48330.6uAX9F.rst b/Misc/NEWS.d/next/Library/2022-11-24-13-23-07.gh-issue-48330.6uAX9F.rst deleted file mode 100644 index 5b63a0a6b96dfa..00000000000000 --- a/Misc/NEWS.d/next/Library/2022-11-24-13-23-07.gh-issue-48330.6uAX9F.rst +++ /dev/null @@ -1,8 +0,0 @@ -Added ``--durations`` command line option, showing the N slowest test cases. -:class:`unittest.TextTestRunner` and :class:`unittest.TextTestResult` -constructors accept a new *durations* keyword argument. Subclasses should take -this into account or accept ``**kwargs``. Added -:meth:`unittest.TestResult.addDuration` method and -:attr:`unittest.TestResult.collectedDurations` attribute. - -(Contributed by Giampaolo Rodola) diff --git a/Misc/NEWS.d/next/Library/2022-12-09-11-21-38.gh-issue-100131.v863yR.rst b/Misc/NEWS.d/next/Library/2022-12-09-11-21-38.gh-issue-100131.v863yR.rst deleted file mode 100644 index 07891f2c1e9eb6..00000000000000 --- a/Misc/NEWS.d/next/Library/2022-12-09-11-21-38.gh-issue-100131.v863yR.rst +++ /dev/null @@ -1 +0,0 @@ -Added an optional ``delete`` keyword argument to :class:`tempfile.TemporaryDirectory`. diff --git a/Misc/NEWS.d/next/Library/2022-12-16-10-27-58.gh-issue-89727.y64ZLM.rst b/Misc/NEWS.d/next/Library/2022-12-16-10-27-58.gh-issue-89727.y64ZLM.rst deleted file mode 100644 index f9ac1475dceb00..00000000000000 --- a/Misc/NEWS.d/next/Library/2022-12-16-10-27-58.gh-issue-89727.y64ZLM.rst +++ /dev/null @@ -1 +0,0 @@ -Fix pathlib.Path.walk RecursionError on deep directory trees by rewriting it using iteration instead of recursion. diff --git a/Misc/NEWS.d/next/Library/2022-12-20-10-55-14.gh-issue-100372.utfP65.rst b/Misc/NEWS.d/next/Library/2022-12-20-10-55-14.gh-issue-100372.utfP65.rst deleted file mode 100644 index ec37aff5092c3a..00000000000000 --- a/Misc/NEWS.d/next/Library/2022-12-20-10-55-14.gh-issue-100372.utfP65.rst +++ /dev/null @@ -1,2 +0,0 @@ -:meth:`ssl.SSLContext.load_verify_locations` no longer incorrectly accepts -some cases of trailing data when parsing DER. diff --git a/Misc/NEWS.d/next/Library/2023-01-27-14-51-07.gh-issue-101313.10AEXh.rst b/Misc/NEWS.d/next/Library/2023-01-27-14-51-07.gh-issue-101313.10AEXh.rst deleted file mode 100644 index 63d0a7286920a4..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-01-27-14-51-07.gh-issue-101313.10AEXh.rst +++ /dev/null @@ -1 +0,0 @@ -Added -h and --help arguments to the webbrowser CLI diff --git a/Misc/NEWS.d/next/Library/2023-02-09-19-40-41.gh-issue-101673.mX-Ppq.rst b/Misc/NEWS.d/next/Library/2023-02-09-19-40-41.gh-issue-101673.mX-Ppq.rst deleted file mode 100644 index 4e673ba9811568..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-02-09-19-40-41.gh-issue-101673.mX-Ppq.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a :mod:`pdb` bug where ``ll`` clears the changes to local variables. diff --git a/Misc/NEWS.d/next/Library/2023-02-18-23-03-50.gh-issue-98886.LkKGWv.rst b/Misc/NEWS.d/next/Library/2023-02-18-23-03-50.gh-issue-98886.LkKGWv.rst deleted file mode 100644 index 64e4d6eed2f62d..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-02-18-23-03-50.gh-issue-98886.LkKGWv.rst +++ /dev/null @@ -1 +0,0 @@ -Fix issues when defining dataclasses that have fields with specific underscore names that aren't clearly reserved by :mod:`dataclasses`. diff --git a/Misc/NEWS.d/next/Library/2023-02-19-01-49-46.gh-issue-102038.n3if3D.rst b/Misc/NEWS.d/next/Library/2023-02-19-01-49-46.gh-issue-102038.n3if3D.rst deleted file mode 100644 index 40df20cb596049..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-02-19-01-49-46.gh-issue-102038.n3if3D.rst +++ /dev/null @@ -1 +0,0 @@ -Skip a ``stat`` in :mod:`site` if we have already found a ``pyvenv.cfg`` diff --git a/Misc/NEWS.d/next/Library/2023-02-20-16-47-56.gh-issue-102069.FS7f1j.rst b/Misc/NEWS.d/next/Library/2023-02-20-16-47-56.gh-issue-102069.FS7f1j.rst deleted file mode 100644 index 04c87e515cca93..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-02-20-16-47-56.gh-issue-102069.FS7f1j.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``__weakref__`` descriptor generation for custom dataclasses. diff --git a/Misc/NEWS.d/next/Library/2023-02-21-11-56-16.gh-issue-102103.Dj0WEj.rst b/Misc/NEWS.d/next/Library/2023-02-21-11-56-16.gh-issue-102103.Dj0WEj.rst deleted file mode 100644 index feba433f5bee89..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-02-21-11-56-16.gh-issue-102103.Dj0WEj.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add ``module`` argument to :func:`dataclasses.make_dataclass` and make -classes produced by it pickleable. diff --git a/Misc/NEWS.d/next/Library/2023-02-26-17-29-57.gh-issue-79940.SAfmAy.rst b/Misc/NEWS.d/next/Library/2023-02-26-17-29-57.gh-issue-79940.SAfmAy.rst deleted file mode 100644 index 31b8ead8433279..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-02-26-17-29-57.gh-issue-79940.SAfmAy.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add :func:`inspect.getasyncgenstate` and :func:`inspect.getasyncgenlocals`. -Patch by Thomas Krennwallner. diff --git a/Misc/NEWS.d/next/Library/2023-03-03-19-53-08.gh-issue-102378.kRdOZc.rst b/Misc/NEWS.d/next/Library/2023-03-03-19-53-08.gh-issue-102378.kRdOZc.rst deleted file mode 100644 index d30f65f30d109a..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-03-19-53-08.gh-issue-102378.kRdOZc.rst +++ /dev/null @@ -1 +0,0 @@ -Private helper method ``inspect._signature_strip_non_python_syntax`` will no longer strip ``/`` from the input string. diff --git a/Misc/NEWS.d/next/Library/2023-03-04-20-58-29.gh-issue-74468.Ac5Ew_.rst b/Misc/NEWS.d/next/Library/2023-03-04-20-58-29.gh-issue-74468.Ac5Ew_.rst deleted file mode 100644 index 8fad551f3a4ece..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-04-20-58-29.gh-issue-74468.Ac5Ew_.rst +++ /dev/null @@ -1,3 +0,0 @@ -Attribute name of the extracted :mod:`tarfile` file object now holds -filename of itself rather than of the archive it is contained in. -Patch by Oleg Iarygin. diff --git a/Misc/NEWS.d/next/Library/2023-03-08-23-08-38.gh-issue-102519.wlcsFI.rst b/Misc/NEWS.d/next/Library/2023-03-08-23-08-38.gh-issue-102519.wlcsFI.rst deleted file mode 100644 index f47e4f70b1301d..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-08-23-08-38.gh-issue-102519.wlcsFI.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add :func:`os.listdrives`, :func:`os.listvolumes` and :func:`os.listmounts` -functions on Windows for enumerating drives, volumes and mount points diff --git a/Misc/NEWS.d/next/Library/2023-03-10-13-21-16.gh-issue-102578.-gujoI.rst b/Misc/NEWS.d/next/Library/2023-03-10-13-21-16.gh-issue-102578.-gujoI.rst deleted file mode 100644 index 7307148d9a81ef..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-10-13-21-16.gh-issue-102578.-gujoI.rst +++ /dev/null @@ -1,4 +0,0 @@ -Speed up setting or deleting mutable attributes on non-dataclass subclasses of -frozen dataclasses. Due to the implementation of ``__setattr__`` and -``__delattr__`` for frozen dataclasses, this previously had a time complexity -of ``O(n)``. It now has a time complexity of ``O(1)``. diff --git a/Misc/NEWS.d/next/Library/2023-03-10-13-51-21.gh-issue-100112.VHh4mw.rst b/Misc/NEWS.d/next/Library/2023-03-10-13-51-21.gh-issue-100112.VHh4mw.rst deleted file mode 100644 index eff77c40e30c48..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-10-13-51-21.gh-issue-100112.VHh4mw.rst +++ /dev/null @@ -1 +0,0 @@ -:meth:`asyncio.Task.get_coro` now always returns a coroutine when wrapping an awaitable object. Patch by Kumar Aditya. diff --git a/Misc/NEWS.d/next/Library/2023-03-13-12-05-55.gh-issue-102615.NcA_ZL.rst b/Misc/NEWS.d/next/Library/2023-03-13-12-05-55.gh-issue-102615.NcA_ZL.rst deleted file mode 100644 index 333068369bc4f7..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-13-12-05-55.gh-issue-102615.NcA_ZL.rst +++ /dev/null @@ -1,3 +0,0 @@ -Typing: Improve the ``repr`` of generic aliases for classes generic over a -:class:`~typing.ParamSpec`. (Use square brackets to represent a parameter -list.) diff --git a/Misc/NEWS.d/next/Library/2023-03-13-18-27-00.gh-issue-102670.GyoThv.rst b/Misc/NEWS.d/next/Library/2023-03-13-18-27-00.gh-issue-102670.GyoThv.rst deleted file mode 100644 index 3de09f86754f3e..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-13-18-27-00.gh-issue-102670.GyoThv.rst +++ /dev/null @@ -1,2 +0,0 @@ -Optimized fmean(), correlation(), covariance(), and linear_regression() -using the new math.sumprod() function. diff --git a/Misc/NEWS.d/next/Library/2023-03-16-08-17-29.gh-issue-102748.WNACpI.rst b/Misc/NEWS.d/next/Library/2023-03-16-08-17-29.gh-issue-102748.WNACpI.rst deleted file mode 100644 index b1dc67f38fe85d..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-16-08-17-29.gh-issue-102748.WNACpI.rst +++ /dev/null @@ -1,3 +0,0 @@ -:func:`asyncio.iscoroutine` now returns ``False`` for generators as -:mod:`asyncio` does not support legacy generator-based coroutines. -Patch by Kumar Aditya. diff --git a/Misc/NEWS.d/next/Library/2023-03-16-16-43-04.gh-issue-78530.Lr8eq_.rst b/Misc/NEWS.d/next/Library/2023-03-16-16-43-04.gh-issue-78530.Lr8eq_.rst deleted file mode 100644 index bdb46d08c5c4af..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-16-16-43-04.gh-issue-78530.Lr8eq_.rst +++ /dev/null @@ -1 +0,0 @@ -:func:`asyncio.wait` now accepts generators yielding tasks. Patch by Kumar Aditya. diff --git a/Misc/NEWS.d/next/Library/2023-03-17-19-14-26.gh-issue-76846.KEamjK.rst b/Misc/NEWS.d/next/Library/2023-03-17-19-14-26.gh-issue-76846.KEamjK.rst deleted file mode 100644 index 9fba11f074ee1c..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-17-19-14-26.gh-issue-76846.KEamjK.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix issue where ``__new__()`` and ``__init__()`` methods of -:class:`pathlib.PurePath` and :class:`~pathlib.Path` subclasses were not -called in some circumstances. diff --git a/Misc/NEWS.d/next/Library/2023-03-18-14-59-21.gh-issue-88965.kA70Km.rst b/Misc/NEWS.d/next/Library/2023-03-18-14-59-21.gh-issue-88965.kA70Km.rst deleted file mode 100644 index 6e9642100cd8cb..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-18-14-59-21.gh-issue-88965.kA70Km.rst +++ /dev/null @@ -1,7 +0,0 @@ -typing: Fix a bug relating to substitution in custom classes generic over a -:class:`~typing.ParamSpec`. Previously, if the ``ParamSpec`` was substituted -with a parameters list that itself contained a :class:`~typing.TypeVar`, the -``TypeVar`` in the parameters list could not be subsequently substituted. This -is now fixed. - -Patch by Nikita Sobolev. diff --git a/Misc/NEWS.d/next/Library/2023-03-19-15-30-59.gh-issue-102828.NKClXg.rst b/Misc/NEWS.d/next/Library/2023-03-19-15-30-59.gh-issue-102828.NKClXg.rst deleted file mode 100644 index be9b2bab24a381..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-19-15-30-59.gh-issue-102828.NKClXg.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add the ``onexc`` arg to :func:`shutil.rmtree`, which is like ``onerror`` -but expects an exception instance rather than an exc_info tuple. Deprecate -``onerror``. diff --git a/Misc/NEWS.d/next/Library/2023-03-20-12-21-19.gh-issue-102839.RjRi12.rst b/Misc/NEWS.d/next/Library/2023-03-20-12-21-19.gh-issue-102839.RjRi12.rst deleted file mode 100644 index 673b38974e4d1b..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-20-12-21-19.gh-issue-102839.RjRi12.rst +++ /dev/null @@ -1 +0,0 @@ -Improve performance of :func:`math.log` arguments handling by removing the argument clinic. diff --git a/Misc/NEWS.d/next/Library/2023-03-21-15-17-07.gh-issue-102871.U9mchn.rst b/Misc/NEWS.d/next/Library/2023-03-21-15-17-07.gh-issue-102871.U9mchn.rst deleted file mode 100644 index 3ef0e74d21ca00..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-21-15-17-07.gh-issue-102871.U9mchn.rst +++ /dev/null @@ -1,3 +0,0 @@ -Remove support for obsolete browsers from :mod:`webbrowser`. -Removed browsers include Grail, Mosaic, Netscape, Galeon, Skipstone, -Iceape, Firebird, and Firefox versions 35 and below. diff --git a/Misc/NEWS.d/next/Library/2023-03-22-16-15-18.gh-issue-102780.NEcljy.rst b/Misc/NEWS.d/next/Library/2023-03-22-16-15-18.gh-issue-102780.NEcljy.rst deleted file mode 100644 index 2aaffe34b86414..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-22-16-15-18.gh-issue-102780.NEcljy.rst +++ /dev/null @@ -1,3 +0,0 @@ -The :class:`asyncio.Timeout` context manager now works reliably even when performing cleanup due -to task cancellation. Previously it could raise a -:exc:`~asyncio.CancelledError` instead of an :exc:`~asyncio.TimeoutError` in such cases. diff --git a/Misc/NEWS.d/next/Library/2023-03-23-13-34-33.gh-issue-102947.cTwcpU.rst b/Misc/NEWS.d/next/Library/2023-03-23-13-34-33.gh-issue-102947.cTwcpU.rst deleted file mode 100644 index b59c9820356697..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-23-13-34-33.gh-issue-102947.cTwcpU.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve traceback when :func:`dataclasses.fields` is called on a -non-dataclass. Patch by Alex Waygood diff --git a/Misc/NEWS.d/next/Library/2023-03-25-02-08-05.gh-issue-103023.Qfn7Hl.rst b/Misc/NEWS.d/next/Library/2023-03-25-02-08-05.gh-issue-103023.Qfn7Hl.rst deleted file mode 100644 index e7958f6f002055..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-25-02-08-05.gh-issue-103023.Qfn7Hl.rst +++ /dev/null @@ -1,2 +0,0 @@ -It's no longer possible to register expressions to display in -:class:`~pdb.Pdb` that raise :exc:`SyntaxError`. Patch by Tian Gao. diff --git a/Misc/NEWS.d/next/Library/2023-03-25-16-57-18.gh-issue-102433.L-7x2Q.rst b/Misc/NEWS.d/next/Library/2023-03-25-16-57-18.gh-issue-102433.L-7x2Q.rst deleted file mode 100644 index a4de4b4448f391..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-25-16-57-18.gh-issue-102433.L-7x2Q.rst +++ /dev/null @@ -1,10 +0,0 @@ -:func:`isinstance` checks against :func:`runtime-checkable protocols -` now use :func:`inspect.getattr_static` rather -than :func:`hasattr` to lookup whether attributes exist. This means that -descriptors and :meth:`~object.__getattr__` methods are no longer -unexpectedly evaluated during ``isinstance()`` checks against -runtime-checkable protocols. However, it may also mean that some objects -which used to be considered instances of a runtime-checkable protocol may no -longer be considered instances of that protocol on Python 3.12+, and vice -versa. Most users are unlikely to be affected by this change. Patch by Alex -Waygood. diff --git a/Misc/NEWS.d/next/Library/2023-03-26-20-54-57.gh-issue-103046.xBlA2l.rst b/Misc/NEWS.d/next/Library/2023-03-26-20-54-57.gh-issue-103046.xBlA2l.rst deleted file mode 100644 index f9bd0a10056ef1..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-26-20-54-57.gh-issue-103046.xBlA2l.rst +++ /dev/null @@ -1 +0,0 @@ -Display current line label correctly in :mod:`dis` when ``show_caches`` is False and ``lasti`` points to a CACHE entry. diff --git a/Misc/NEWS.d/next/Library/2023-03-27-15-01-16.gh-issue-103056.-Efh5Q.rst b/Misc/NEWS.d/next/Library/2023-03-27-15-01-16.gh-issue-103056.-Efh5Q.rst deleted file mode 100644 index c892d8376503f8..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-27-15-01-16.gh-issue-103056.-Efh5Q.rst +++ /dev/null @@ -1 +0,0 @@ -Ensure final ``_generate_next_value_`` is a ``staticmethod``. diff --git a/Misc/NEWS.d/next/Library/2023-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst b/Misc/NEWS.d/next/Library/2023-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst deleted file mode 100644 index e4def038175b87..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-27-19-21-51.gh-issue-102549.NQ6Nlv.rst +++ /dev/null @@ -1 +0,0 @@ -Don't ignore exceptions in member type creation. diff --git a/Misc/NEWS.d/next/Library/2023-03-28-05-14-59.gh-issue-103068.YQTmrA.rst b/Misc/NEWS.d/next/Library/2023-03-28-05-14-59.gh-issue-103068.YQTmrA.rst deleted file mode 100644 index 71c142c30f4eff..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-28-05-14-59.gh-issue-103068.YQTmrA.rst +++ /dev/null @@ -1,2 +0,0 @@ -It's no longer possible to register conditional breakpoints in -:class:`~pdb.Pdb` that raise :exc:`SyntaxError`. Patch by Tian Gao. diff --git a/Misc/NEWS.d/next/Library/2023-03-28-15-12-53.gh-issue-103085.DqNehf.rst b/Misc/NEWS.d/next/Library/2023-03-28-15-12-53.gh-issue-103085.DqNehf.rst deleted file mode 100644 index fa07fa5226c06a..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-28-15-12-53.gh-issue-103085.DqNehf.rst +++ /dev/null @@ -1 +0,0 @@ -Pure python :func:`locale.getencoding()` will not warn deprecation. diff --git a/Misc/NEWS.d/next/Tests/2023-01-27-18-10-40.gh-issue-101377.IJGpqh.rst b/Misc/NEWS.d/next/Tests/2023-01-27-18-10-40.gh-issue-101377.IJGpqh.rst deleted file mode 100644 index a9c19ce060e3ab..00000000000000 --- a/Misc/NEWS.d/next/Tests/2023-01-27-18-10-40.gh-issue-101377.IJGpqh.rst +++ /dev/null @@ -1 +0,0 @@ -Improved test_locale_calendar_formatweekday of calendar. diff --git a/Misc/NEWS.d/next/Tests/2023-03-08-13-54-20.gh-issue-102537.Vfplpb.rst b/Misc/NEWS.d/next/Tests/2023-03-08-13-54-20.gh-issue-102537.Vfplpb.rst deleted file mode 100644 index 94d160dd4127a6..00000000000000 --- a/Misc/NEWS.d/next/Tests/2023-03-08-13-54-20.gh-issue-102537.Vfplpb.rst +++ /dev/null @@ -1,2 +0,0 @@ -Adjust the error handling strategy in -``test_zoneinfo.TzPathTest.python_tzpath_context``. Patch by Paul Ganssle. diff --git a/Misc/NEWS.d/next/Tests/2023-03-23-23-25-18.gh-issue-102980.Zps4QF.rst b/Misc/NEWS.d/next/Tests/2023-03-23-23-25-18.gh-issue-102980.Zps4QF.rst deleted file mode 100644 index 48277367fc8755..00000000000000 --- a/Misc/NEWS.d/next/Tests/2023-03-23-23-25-18.gh-issue-102980.Zps4QF.rst +++ /dev/null @@ -1 +0,0 @@ -Improve test coverage on :mod:`pdb`. diff --git a/Misc/NEWS.d/next/Tools-Demos/2023-03-21-01-27-07.gh-issue-102809.2F1Byz.rst b/Misc/NEWS.d/next/Tools-Demos/2023-03-21-01-27-07.gh-issue-102809.2F1Byz.rst deleted file mode 100644 index 5c282769878563..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2023-03-21-01-27-07.gh-issue-102809.2F1Byz.rst +++ /dev/null @@ -1 +0,0 @@ -``Misc/gdbinit`` was removed. diff --git a/Misc/NEWS.d/next/Windows/2023-02-22-17-26-10.gh-issue-99726.76t957.rst b/Misc/NEWS.d/next/Windows/2023-02-22-17-26-10.gh-issue-99726.76t957.rst deleted file mode 100644 index e2578620017894..00000000000000 --- a/Misc/NEWS.d/next/Windows/2023-02-22-17-26-10.gh-issue-99726.76t957.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improves correctness of stat results for Windows, and uses faster API when -available diff --git a/Misc/NEWS.d/next/Windows/2023-03-14-10-52-43.gh-issue-102690.sbXtqk.rst b/Misc/NEWS.d/next/Windows/2023-03-14-10-52-43.gh-issue-102690.sbXtqk.rst deleted file mode 100644 index 5669ebbb442c24..00000000000000 --- a/Misc/NEWS.d/next/Windows/2023-03-14-10-52-43.gh-issue-102690.sbXtqk.rst +++ /dev/null @@ -1 +0,0 @@ -Update :mod:`webbrowser` to fall back to Microsoft Edge instead of Internet Explorer. diff --git a/README.rst b/README.rst index 6923b692f6c971..06c4f0a1fa3917 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.12.0 alpha 6 +This is Python version 3.12.0 alpha 7 ===================================== .. image:: https://github.com/python/cpython/workflows/Tests/badge.svg From fd1947ecfba589feebd48c1ebb60d1c01ee0a89d Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 4 Apr 2023 17:00:03 +0100 Subject: [PATCH 057/349] bpo-44844: Enable detection of Microsoft Edge browser in webbrowser module (GH-29908) --- Lib/test/test_webbrowser.py | 25 +++++++++++++++++++ Lib/webbrowser.py | 16 ++++++++++++ .../2021-12-03-23-00-56.bpo-44844.tvg2VY.rst | 1 + 3 files changed, 42 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2021-12-03-23-00-56.bpo-44844.tvg2VY.rst diff --git a/Lib/test/test_webbrowser.py b/Lib/test/test_webbrowser.py index 147a113c7fd730..2d695bc883131f 100644 --- a/Lib/test/test_webbrowser.py +++ b/Lib/test/test_webbrowser.py @@ -95,6 +95,31 @@ def test_open_new_tab(self): arguments=[URL]) +class EdgeCommandTest(CommandTestMixin, unittest.TestCase): + + browser_class = webbrowser.Edge + + def test_open(self): + self._test('open', + options=[], + arguments=[URL]) + + def test_open_with_autoraise_false(self): + self._test('open', kw=dict(autoraise=False), + options=[], + arguments=[URL]) + + def test_open_new(self): + self._test('open_new', + options=['--new-window'], + arguments=[URL]) + + def test_open_new_tab(self): + self._test('open_new_tab', + options=[], + arguments=[URL]) + + class MozillaCommandTest(CommandTestMixin, unittest.TestCase): browser_class = webbrowser.Mozilla diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py index d98c5997d2f44f..b86d131f030d80 100755 --- a/Lib/webbrowser.py +++ b/Lib/webbrowser.py @@ -400,6 +400,16 @@ def open(self, url, new=0, autoraise=True): return ok +class Edge(UnixBrowser): + "Launcher class for Microsoft Edge browser." + + remote_args = ['%action', '%s'] + remote_action = "" + remote_action_newwin = "--new-window" + remote_action_newtab = "" + background = True + + # # Platform support for Unix # @@ -456,6 +466,10 @@ def register_X_browsers(): register("opera", None, Opera("opera")) + if shutil.which("microsoft-edge"): + register("microsoft-edge", None, Edge("microsoft-edge")) + + def register_standard_browsers(): global _tryorder _tryorder = [] @@ -487,6 +501,8 @@ def register_standard_browsers(): "opera", edge64, edge32): if shutil.which(browser): register(browser, None, BackgroundBrowser(browser)) + if shutil.which("MicrosoftEdge.exe"): + register("microsoft-edge", None, Edge("MicrosoftEdge.exe")) else: # Prefer X browsers if present if os.environ.get("DISPLAY") or os.environ.get("WAYLAND_DISPLAY"): diff --git a/Misc/NEWS.d/next/Library/2021-12-03-23-00-56.bpo-44844.tvg2VY.rst b/Misc/NEWS.d/next/Library/2021-12-03-23-00-56.bpo-44844.tvg2VY.rst new file mode 100644 index 00000000000000..f0c91236dfdf21 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-12-03-23-00-56.bpo-44844.tvg2VY.rst @@ -0,0 +1 @@ +Enables :mod:`webbrowser` to detect and launch Microsoft Edge browser. From a90f5ca87b9ad713280af50b30558a2aca566be0 Mon Sep 17 00:00:00 2001 From: Thomas Wouters Date: Tue, 4 Apr 2023 22:00:41 +0200 Subject: [PATCH 058/349] Post 3.12.0a7 --- Include/patchlevel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 1a8a6d9c8f7a3d..aaedd563a905e9 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -23,7 +23,7 @@ #define PY_RELEASE_SERIAL 7 /* Version as a string */ -#define PY_VERSION "3.12.0a7" +#define PY_VERSION "3.12.0a7+" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. From f184abbdc9ac3a5656de5f606faf505aa42ff391 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 4 Apr 2023 17:06:00 -0400 Subject: [PATCH 059/349] =?UTF-8?q?gh-103207:=20Add=20instructions=20to=20?= =?UTF-8?q?the=20macOS=20installer=20welcome=20display=20on=20how=20to=20w?= =?UTF-8?q?orkaround=20=20the=20macOS=2013=20Ventura=20=E2=80=9CThe=20inst?= =?UTF-8?q?aller=20encountered=20an=20error=E2=80=9D=20failure.=20(GH-1032?= =?UTF-8?q?51)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mac/BuildScript/resources/Welcome.rtf | 39 ++++++++++++++++--- ...-04-04-13-37-28.gh-issue-103207.x0vvQp.rst | 2 + 2 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2023-04-04-13-37-28.gh-issue-103207.x0vvQp.rst diff --git a/Mac/BuildScript/resources/Welcome.rtf b/Mac/BuildScript/resources/Welcome.rtf index 7819241b618d87..efdcb12f849b66 100644 --- a/Mac/BuildScript/resources/Welcome.rtf +++ b/Mac/BuildScript/resources/Welcome.rtf @@ -1,9 +1,9 @@ -{\rtf1\ansi\ansicpg1252\cocoartf2639 +{\rtf1\ansi\ansicpg1252\cocoartf2708 \cocoascreenfonts1\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 Helvetica-Bold;\f2\fmodern\fcharset0 CourierNewPSMT; -} -{\colortbl;\red255\green255\blue255;} -{\*\expandedcolortbl;;} -\paperw11900\paperh16840\margl1440\margr1440\vieww12200\viewh10880\viewkind0 +\f3\fnil\fcharset0 HelveticaNeue;\f4\fnil\fcharset0 HelveticaNeue-Bold;} +{\colortbl;\red255\green255\blue255;\red24\green26\blue30;\red255\green255\blue255;} +{\*\expandedcolortbl;;\cssrgb\c12157\c13725\c15686;\cssrgb\c100000\c100000\c100000;} +\margl1440\margr1440\vieww12820\viewh10620\viewkind0 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\partightenfactor0 \f0\fs24 \cf0 This package will install @@ -25,6 +25,35 @@ At the end of this install, click on \f0 to install a set of current SSL root certificates.\ \ +\f1\b macOS 13 Ventura users +\f0\b0 : due to an issue with macOS +\f1\b Installer +\f0\b0 app, installation of some +\f3 \cf2 \cb3 \expnd0\expndtw0\kerning0 +third-party +\f0 \cf0 \cb1 \kerning1\expnd0\expndtw0 packages including this Python package may fail with a vague +\f4\b \cf2 \cb3 \expnd0\expndtw0\kerning0 +\'93The installer encountered an error\'94 +\f3\b0 message if the +\f4\b Installer +\f3\b0 app does not have permission to access the folder containing the downloaded installer file, typically in the +\f4\b Downloads +\f3\b0 folder. Go to +\f4\b System Settings +\f3\b0 -> +\f4\b Privacy & Security +\f3\b0 -> +\f4\b Files and Folders +\f3\b0 , then click the mark in front of +\f4\b Installer +\f3\b0 to expand, and enable +\f4\b Downloads Folder +\f0\b0 \cf0 \cb1 \kerning1\expnd0\expndtw0 by moving the toggle to the right +\f3 \cf2 \cb3 \expnd0\expndtw0\kerning0 +. See {\field{\*\fldinst{HYPERLINK "https://github.com/python/cpython/issues/103207"}}{\fldrslt https://github.com/python/cpython/issues/103207}} for up-to-date information on this issue. +\f0 \cf0 \cb1 \kerning1\expnd0\expndtw0 \ +\ + \f1\b NOTE: \f0\b0 This is an alpha test preview of Python 3.12.0, the next feature release of Python 3. It is not intended for production use.\ } \ No newline at end of file diff --git a/Misc/NEWS.d/next/macOS/2023-04-04-13-37-28.gh-issue-103207.x0vvQp.rst b/Misc/NEWS.d/next/macOS/2023-04-04-13-37-28.gh-issue-103207.x0vvQp.rst new file mode 100644 index 00000000000000..3c176e3a6b5310 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2023-04-04-13-37-28.gh-issue-103207.x0vvQp.rst @@ -0,0 +1,2 @@ +Add instructions to the macOS installer welcome display on how to workaround +the macOS 13 Ventura “The installer encountered an error” failure. From 935aa452359ac3f79febefcdb4387b962cf528af Mon Sep 17 00:00:00 2001 From: Charles Machalow Date: Tue, 4 Apr 2023 15:24:13 -0700 Subject: [PATCH 060/349] GH-75586: Make shutil.which() on Windows more consistent with the OS (GH-103179) --- Doc/library/shutil.rst | 34 +++++-- Doc/whatsnew/3.12.rst | 14 +++ Lib/shutil.py | 89 ++++++++++--------- Lib/test/test_shutil.py | 86 ++++++++++++++++-- ...3-04-02-22-04-26.gh-issue-75586.526iJm.rst | 1 + Modules/_winapi.c | 21 +++++ Modules/clinic/_winapi.c.h | 42 ++++++++- 7 files changed, 233 insertions(+), 54 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-02-22-04-26.gh-issue-75586.526iJm.rst diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index acba66258fe8f0..373cc7d6072031 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -433,23 +433,43 @@ Directory and files operations When no *path* is specified, the results of :func:`os.environ` are used, returning either the "PATH" value or a fallback of :attr:`os.defpath`. - On Windows, the current directory is always prepended to the *path* whether - or not you use the default or provide your own, which is the behavior the - command shell uses when finding executables. Additionally, when finding the - *cmd* in the *path*, the ``PATHEXT`` environment variable is checked. For - example, if you call ``shutil.which("python")``, :func:`which` will search - ``PATHEXT`` to know that it should look for ``python.exe`` within the *path* - directories. For example, on Windows:: + On Windows, the current directory is prepended to the *path* if *mode* does + not include ``os.X_OK``. When the *mode* does include ``os.X_OK``, the + Windows API ``NeedCurrentDirectoryForExePathW`` will be consulted to + determine if the current directory should be prepended to *path*. To avoid + consulting the current working directory for executables: set the environment + variable ``NoDefaultCurrentDirectoryInExePath``. + + Also on Windows, the ``PATHEXT`` variable is used to resolve commands + that may not already include an extension. For example, if you call + ``shutil.which("python")``, :func:`which` will search ``PATHEXT`` + to know that it should look for ``python.exe`` within the *path* + directories. For example, on Windows:: >>> shutil.which("python") 'C:\\Python33\\python.EXE' + This is also applied when *cmd* is a path that contains a directory + component:: + + >> shutil.which("C:\\Python33\\python") + 'C:\\Python33\\python.EXE' + .. versionadded:: 3.3 .. versionchanged:: 3.8 The :class:`bytes` type is now accepted. If *cmd* type is :class:`bytes`, the result type is also :class:`bytes`. + .. versionchanged:: 3.12 + On Windows, the current directory is no longer prepended to the search + path if *mode* includes ``os.X_OK`` and WinAPI + ``NeedCurrentDirectoryForExePathW(cmd)`` is false, else the current + directory is prepended even if it is already in the search path; + ``PATHEXT`` is used now even when *cmd* includes a directory component + or ends with an extension that is in ``PATHEXT``; and filenames that + have no extension can now be found. + .. exception:: Error This exception collects exceptions that are raised during a multi-file diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 88b99828f0beeb..cc2c0560a57c85 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -343,6 +343,20 @@ shutil will be removed in Python 3.14. (Contributed by Irit Katriel in :gh:`102828`.) +* :func:`shutil.which` now consults the *PATHEXT* environment variable to + find matches within *PATH* on Windows even when the given *cmd* includes + a directory component. + (Contributed by Charles Machalow in :gh:`103179`.) + + :func:`shutil.which` will call ``NeedCurrentDirectoryForExePathW`` when + querying for executables on Windows to determine if the current working + directory should be prepended to the search path. + (Contributed by Charles Machalow in :gh:`103179`.) + + :func:`shutil.which` will return a path matching the *cmd* with a component + from ``PATHEXT`` prior to a direct match elsewhere in the search path on + Windows. + (Contributed by Charles Machalow in :gh:`103179`.) sqlite3 ------- diff --git a/Lib/shutil.py b/Lib/shutil.py index b0576407e02ffb..8b378645a5a375 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -40,6 +40,9 @@ elif _WINDOWS: import nt +if sys.platform == 'win32': + import _winapi + COPY_BUFSIZE = 1024 * 1024 if _WINDOWS else 64 * 1024 # This should never be removed, see rationale in: # https://bugs.python.org/issue43743#msg393429 @@ -1449,6 +1452,16 @@ def _access_check(fn, mode): and not os.path.isdir(fn)) +def _win_path_needs_curdir(cmd, mode): + """ + On Windows, we can use NeedCurrentDirectoryForExePath to figure out + if we should add the cwd to PATH when searching for executables if + the mode is executable. + """ + return (not (mode & os.X_OK)) or _winapi.NeedCurrentDirectoryForExePath( + os.fsdecode(cmd)) + + def which(cmd, mode=os.F_OK | os.X_OK, path=None): """Given a command, mode, and a PATH string, return the path which conforms to the given mode on the PATH, or None if there is no such @@ -1459,60 +1472,54 @@ def which(cmd, mode=os.F_OK | os.X_OK, path=None): path. """ - # If we're given a path with a directory part, look it up directly rather - # than referring to PATH directories. This includes checking relative to the - # current directory, e.g. ./script - if os.path.dirname(cmd): - if _access_check(cmd, mode): - return cmd - return None - use_bytes = isinstance(cmd, bytes) - if path is None: - path = os.environ.get("PATH", None) - if path is None: - try: - path = os.confstr("CS_PATH") - except (AttributeError, ValueError): - # os.confstr() or CS_PATH is not available - path = os.defpath - # bpo-35755: Don't use os.defpath if the PATH environment variable is - # set to an empty string - - # PATH='' doesn't match, whereas PATH=':' looks in the current directory - if not path: - return None - - if use_bytes: - path = os.fsencode(path) - path = path.split(os.fsencode(os.pathsep)) + # If we're given a path with a directory part, look it up directly rather + # than referring to PATH directories. This includes checking relative to + # the current directory, e.g. ./script + dirname, cmd = os.path.split(cmd) + if dirname: + path = [dirname] else: - path = os.fsdecode(path) - path = path.split(os.pathsep) + if path is None: + path = os.environ.get("PATH", None) + if path is None: + try: + path = os.confstr("CS_PATH") + except (AttributeError, ValueError): + # os.confstr() or CS_PATH is not available + path = os.defpath + # bpo-35755: Don't use os.defpath if the PATH environment variable + # is set to an empty string + + # PATH='' doesn't match, whereas PATH=':' looks in the current + # directory + if not path: + return None - if sys.platform == "win32": - # The current directory takes precedence on Windows. - curdir = os.curdir if use_bytes: - curdir = os.fsencode(curdir) - if curdir not in path: + path = os.fsencode(path) + path = path.split(os.fsencode(os.pathsep)) + else: + path = os.fsdecode(path) + path = path.split(os.pathsep) + + if sys.platform == "win32" and _win_path_needs_curdir(cmd, mode): + curdir = os.curdir + if use_bytes: + curdir = os.fsencode(curdir) path.insert(0, curdir) + if sys.platform == "win32": # PATHEXT is necessary to check on Windows. pathext_source = os.getenv("PATHEXT") or _WIN_DEFAULT_PATHEXT pathext = [ext for ext in pathext_source.split(os.pathsep) if ext] if use_bytes: pathext = [os.fsencode(ext) for ext in pathext] - # See if the given file matches any of the expected path extensions. - # This will allow us to short circuit when given "python.exe". - # If it does match, only test that one, otherwise we have to try - # others. - if any(cmd.lower().endswith(ext.lower()) for ext in pathext): - files = [cmd] - else: - files = [cmd + ext for ext in pathext] + + # Always try checking the originally given cmd, if it doesn't match, try pathext + files = [cmd] + [cmd + ext for ext in pathext] else: # On other platforms you don't have things like PATHEXT to tell you # what file suffixes are executable, so just pass on cmd as-is. diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index 1c0589ced9ea89..9eaf167a9fa3c9 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -2034,18 +2034,68 @@ def test_relative_cmd(self): rv = shutil.which(relpath, path=base_dir) self.assertIsNone(rv) - def test_cwd(self): + @unittest.skipUnless(sys.platform != "win32", + "test is for non win32") + def test_cwd_non_win32(self): # Issue #16957 base_dir = os.path.dirname(self.dir) with os_helper.change_cwd(path=self.dir): rv = shutil.which(self.file, path=base_dir) - if sys.platform == "win32": - # Windows: current directory implicitly on PATH + # non-win32: shouldn't match in the current directory. + self.assertIsNone(rv) + + @unittest.skipUnless(sys.platform == "win32", + "test is for win32") + def test_cwd_win32(self): + base_dir = os.path.dirname(self.dir) + with os_helper.change_cwd(path=self.dir): + with unittest.mock.patch('shutil._win_path_needs_curdir', return_value=True): + rv = shutil.which(self.file, path=base_dir) + # Current directory implicitly on PATH self.assertEqual(rv, os.path.join(self.curdir, self.file)) - else: - # Other platforms: shouldn't match in the current directory. + with unittest.mock.patch('shutil._win_path_needs_curdir', return_value=False): + rv = shutil.which(self.file, path=base_dir) + # Current directory not on PATH self.assertIsNone(rv) + @unittest.skipUnless(sys.platform == "win32", + "test is for win32") + def test_cwd_win32_added_before_all_other_path(self): + base_dir = pathlib.Path(os.fsdecode(self.dir)) + + elsewhere_in_path_dir = base_dir / 'dir1' + elsewhere_in_path_dir.mkdir() + match_elsewhere_in_path = elsewhere_in_path_dir / 'hello.exe' + match_elsewhere_in_path.touch() + + exe_in_cwd = base_dir / 'hello.exe' + exe_in_cwd.touch() + + with os_helper.change_cwd(path=base_dir): + with unittest.mock.patch('shutil._win_path_needs_curdir', return_value=True): + rv = shutil.which('hello.exe', path=elsewhere_in_path_dir) + + self.assertEqual(os.path.abspath(rv), os.path.abspath(exe_in_cwd)) + + @unittest.skipUnless(sys.platform == "win32", + "test is for win32") + def test_pathext_match_before_path_full_match(self): + base_dir = pathlib.Path(os.fsdecode(self.dir)) + dir1 = base_dir / 'dir1' + dir2 = base_dir / 'dir2' + dir1.mkdir() + dir2.mkdir() + + pathext_match = dir1 / 'hello.com.exe' + path_match = dir2 / 'hello.com' + pathext_match.touch() + path_match.touch() + + test_path = os.pathsep.join([str(dir1), str(dir2)]) + assert os.path.basename(shutil.which( + 'hello.com', path=test_path, mode = os.F_OK + )).lower() == 'hello.com.exe' + @os_helper.skip_if_dac_override def test_non_matching_mode(self): # Set the file read-only and ask for writeable files. @@ -2179,6 +2229,32 @@ def test_pathext_with_empty_str(self): rv = shutil.which(program, path=self.temp_dir) self.assertEqual(rv, temp_filexyz.name) + # See GH-75586 + @unittest.skipUnless(sys.platform == "win32", 'test specific to Windows') + def test_pathext_applied_on_files_in_path(self): + with os_helper.EnvironmentVarGuard() as env: + env["PATH"] = self.temp_dir + env["PATHEXT"] = ".test" + + test_path = pathlib.Path(self.temp_dir) / "test_program.test" + test_path.touch(mode=0o755) + + self.assertEqual(shutil.which("test_program"), str(test_path)) + + # See GH-75586 + @unittest.skipUnless(sys.platform == "win32", 'test specific to Windows') + def test_win_path_needs_curdir(self): + with unittest.mock.patch('_winapi.NeedCurrentDirectoryForExePath', return_value=True) as need_curdir_mock: + self.assertTrue(shutil._win_path_needs_curdir('dontcare', os.X_OK)) + need_curdir_mock.assert_called_once_with('dontcare') + need_curdir_mock.reset_mock() + self.assertTrue(shutil._win_path_needs_curdir('dontcare', 0)) + need_curdir_mock.assert_not_called() + + with unittest.mock.patch('_winapi.NeedCurrentDirectoryForExePath', return_value=False) as need_curdir_mock: + self.assertFalse(shutil._win_path_needs_curdir('dontcare', os.X_OK)) + need_curdir_mock.assert_called_once_with('dontcare') + class TestWhichBytes(TestWhich): def setUp(self): diff --git a/Misc/NEWS.d/next/Library/2023-04-02-22-04-26.gh-issue-75586.526iJm.rst b/Misc/NEWS.d/next/Library/2023-04-02-22-04-26.gh-issue-75586.526iJm.rst new file mode 100644 index 00000000000000..8ec568ec4e4775 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-02-22-04-26.gh-issue-75586.526iJm.rst @@ -0,0 +1 @@ +Fix various Windows-specific issues with ``shutil.which``. diff --git a/Modules/_winapi.c b/Modules/_winapi.c index 83cde7501176b6..fa380b8b798405 100644 --- a/Modules/_winapi.c +++ b/Modules/_winapi.c @@ -2054,6 +2054,26 @@ _winapi__mimetypes_read_windows_registry_impl(PyObject *module, #undef CB_TYPE } +/*[clinic input] +_winapi.NeedCurrentDirectoryForExePath -> bool + + exe_name: LPCWSTR + / +[clinic start generated code]*/ + +static int +_winapi_NeedCurrentDirectoryForExePath_impl(PyObject *module, + LPCWSTR exe_name) +/*[clinic end generated code: output=a65ec879502b58fc input=972aac88a1ec2f00]*/ +{ + BOOL result; + + Py_BEGIN_ALLOW_THREADS + result = NeedCurrentDirectoryForExePathW(exe_name); + Py_END_ALLOW_THREADS + + return result; +} static PyMethodDef winapi_functions[] = { _WINAPI_CLOSEHANDLE_METHODDEF @@ -2089,6 +2109,7 @@ static PyMethodDef winapi_functions[] = { _WINAPI_GETACP_METHODDEF _WINAPI_GETFILETYPE_METHODDEF _WINAPI__MIMETYPES_READ_WINDOWS_REGISTRY_METHODDEF + _WINAPI_NEEDCURRENTDIRECTORYFOREXEPATH_METHODDEF {NULL, NULL} }; diff --git a/Modules/clinic/_winapi.c.h b/Modules/clinic/_winapi.c.h index 891b3f851d1243..7bc63e612be348 100644 --- a/Modules/clinic/_winapi.c.h +++ b/Modules/clinic/_winapi.c.h @@ -1371,4 +1371,44 @@ _winapi__mimetypes_read_windows_registry(PyObject *module, PyObject *const *args exit: return return_value; } -/*[clinic end generated code: output=edb1a9d1bbfd6394 input=a9049054013a1b77]*/ + +PyDoc_STRVAR(_winapi_NeedCurrentDirectoryForExePath__doc__, +"NeedCurrentDirectoryForExePath($module, exe_name, /)\n" +"--\n" +"\n"); + +#define _WINAPI_NEEDCURRENTDIRECTORYFOREXEPATH_METHODDEF \ + {"NeedCurrentDirectoryForExePath", (PyCFunction)_winapi_NeedCurrentDirectoryForExePath, METH_O, _winapi_NeedCurrentDirectoryForExePath__doc__}, + +static int +_winapi_NeedCurrentDirectoryForExePath_impl(PyObject *module, + LPCWSTR exe_name); + +static PyObject * +_winapi_NeedCurrentDirectoryForExePath(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + LPCWSTR exe_name = NULL; + int _return_value; + + if (!PyUnicode_Check(arg)) { + _PyArg_BadArgument("NeedCurrentDirectoryForExePath", "argument", "str", arg); + goto exit; + } + exe_name = PyUnicode_AsWideCharString(arg, NULL); + if (exe_name == NULL) { + goto exit; + } + _return_value = _winapi_NeedCurrentDirectoryForExePath_impl(module, exe_name); + if ((_return_value == -1) && PyErr_Occurred()) { + goto exit; + } + return_value = PyBool_FromLong((long)_return_value); + +exit: + /* Cleanup for exe_name */ + PyMem_Free((void *)exe_name); + + return return_value; +} +/*[clinic end generated code: output=96ea65ece7912d0a input=a9049054013a1b77]*/ From bceb9e00ad2998e5193ad5b477e92a114dd31024 Mon Sep 17 00:00:00 2001 From: Tim Burke Date: Tue, 4 Apr 2023 15:46:46 -0700 Subject: [PATCH 061/349] Improve some grammar in the socket docs (#103254) --- Doc/library/socket.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index aec79da57f0576..c8ca555700a3c9 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -1775,7 +1775,7 @@ to sockets. much data, if any, was successfully sent. .. versionchanged:: 3.5 - The socket timeout is no more reset each time data is sent successfully. + The socket timeout is no longer reset each time data is sent successfully. The socket timeout is now the maximum total duration to send all data. .. versionchanged:: 3.5 @@ -1998,8 +1998,8 @@ can be changed by calling :func:`setdefaulttimeout`. * In *non-blocking mode*, operations fail (with an error that is unfortunately system-dependent) if they cannot be completed immediately: functions from the - :mod:`select` can be used to know when and whether a socket is available for - reading or writing. + :mod:`select` module can be used to know when and whether a socket is available + for reading or writing. * In *timeout mode*, operations fail if they cannot be completed within the timeout specified for the socket (they raise a :exc:`timeout` exception) @@ -2188,7 +2188,7 @@ manager protocol instead, open a socket with:: socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) After binding (:const:`CAN_RAW`) or connecting (:const:`CAN_BCM`) the socket, you -can use the :meth:`socket.send`, and the :meth:`socket.recv` operations (and +can use the :meth:`socket.send` and :meth:`socket.recv` operations (and their counterparts) on the socket object as usual. This last example might require special privileges:: From f513d5c80672c76acbdaf7d5b601f4bbe9fae56a Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Tue, 4 Apr 2023 17:03:40 -0600 Subject: [PATCH 062/349] gh-102660: Fix is_core_module() (gh-103257) In gh-102744 we added is_core_module() (in Python/import.c), which relies on get_core_module_dict() (also added in that PR). The problem is that_PyImport_FixupBuiltin(), which ultimately calls is_core_module(), is called on the builtins module before interp->builtins_copyis set. Consequently, the builtins module isn't considered a "core" module while it is getting "fixed up" and its module def m_copy erroneously gets set. Under isolated interpreters this causes problems since sys and builtins are allowed even though they are still single-phase init modules. (This was discovered while working on gh-101660.) The solution is to stop relying on get_core_module_dict() in is_core_module(). --- Python/import.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Python/import.c b/Python/import.c index 24249ae4a6ade1..1db5b9333bbba1 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1110,7 +1110,17 @@ get_core_module_dict(PyInterpreterState *interp, static inline int is_core_module(PyInterpreterState *interp, PyObject *name, PyObject *filename) { - return get_core_module_dict(interp, name, filename) != NULL; + /* This might be called before the core dict copies are in place, + so we can't rely on get_core_module_dict() here. */ + if (filename == name) { + if (PyUnicode_CompareWithASCIIString(name, "sys") == 0) { + return 1; + } + if (PyUnicode_CompareWithASCIIString(name, "builtins") == 0) { + return 1; + } + } + return 0; } static int @@ -1136,6 +1146,8 @@ fix_up_extension(PyObject *mod, PyObject *name, PyObject *filename) // when the extension module doesn't support sub-interpreters. if (def->m_size == -1) { if (!is_core_module(tstate->interp, name, filename)) { + assert(PyUnicode_CompareWithASCIIString(name, "sys") != 0); + assert(PyUnicode_CompareWithASCIIString(name, "builtins") != 0); if (def->m_base.m_copy) { /* Somebody already imported the module, likely under a different name. From a62ff970750267441a7175b1bd6d6b2ec59d9a2c Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Wed, 5 Apr 2023 09:10:45 +0900 Subject: [PATCH 063/349] gh-101525: Disable peephole optimization process of BOLT (gh-103187) Co-authored-by: Dong-hee Na --- Doc/whatsnew/3.12.rst | 2 +- Makefile.pre.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index cc2c0560a57c85..23524ec5d7d452 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -465,7 +465,7 @@ Optimizations * Added experimental support for using the BOLT binary optimizer in the build process, which improves performance by 1-5%. - (Contributed by Kevin Modzelewski in :gh:`90536`.) + (Contributed by Kevin Modzelewski in :gh:`90536` and tuned by Dong-hee Na in :gh:`101525`) * Speed up the regular expression substitution (functions :func:`re.sub` and :func:`re.subn` and corresponding :class:`!re.Pattern` methods) for diff --git a/Makefile.pre.in b/Makefile.pre.in index b97daaf6f445cc..9fdbd8db19bb33 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -670,7 +670,7 @@ bolt-opt: @PREBOLT_RULE@ @LLVM_BOLT@ ./$(BUILDPYTHON) -instrument -instrumentation-file-append-pid -instrumentation-file=$(abspath $(BUILDPYTHON).bolt) -o $(BUILDPYTHON).bolt_inst ./$(BUILDPYTHON).bolt_inst $(PROFILE_TASK) || true @MERGE_FDATA@ $(BUILDPYTHON).*.fdata > $(BUILDPYTHON).fdata - @LLVM_BOLT@ ./$(BUILDPYTHON) -o $(BUILDPYTHON).bolt -data=$(BUILDPYTHON).fdata -update-debug-sections -reorder-blocks=ext-tsp -reorder-functions=hfsort+ -split-functions -icf=1 -inline-all -split-eh -reorder-functions-use-hot-size -peepholes=all -jump-tables=aggressive -inline-ap -indirect-call-promotion=all -dyno-stats -use-gnu-stack -frame-opt=hot + @LLVM_BOLT@ ./$(BUILDPYTHON) -o $(BUILDPYTHON).bolt -data=$(BUILDPYTHON).fdata -update-debug-sections -reorder-blocks=ext-tsp -reorder-functions=hfsort+ -split-functions -icf=1 -inline-all -split-eh -reorder-functions-use-hot-size -peepholes=none -jump-tables=aggressive -inline-ap -indirect-call-promotion=all -dyno-stats -use-gnu-stack -frame-opt=hot rm -f *.fdata rm -f $(BUILDPYTHON).bolt_inst mv $(BUILDPYTHON).bolt $(BUILDPYTHON) From 1a8f862e329c3872a11d4ef8eb85cf353ca2f4d5 Mon Sep 17 00:00:00 2001 From: Michael Handler Date: Tue, 4 Apr 2023 21:55:24 -0700 Subject: [PATCH 064/349] gh-66897: Upgrade HTTP CONNECT to protocol HTTP/1.1 (#8305) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * bpo-22708: Upgrade HTTP CONNECT to protocol HTTP/1.1 (GH-NNNN) Use protocol HTTP/1.1 when sending HTTP CONNECT tunnelling requests; generate Host: headers if one is not already provided (required by HTTP/1.1), convert IDN domains to punycode in HTTP CONNECT requests. * Refactor tests to pass under -bb (fix ByteWarnings); missed some lines >80. * Use consistent 'tunnelling' spelling in Lib/http/client.py * Lib/test/test_httplib: Remove remnant of obsoleted test. * Use dict.copy() not copy.copy() * fix version changed * Update Lib/http/client.py Co-authored-by: bgehman * Switch to for/else: syntax, as suggested * Don't use for: else: * Sure, fine, w/e * Oops * 1nm to the left --------- Co-authored-by: Éric Co-authored-by: bgehman Co-authored-by: Oleg Iarygin --- Doc/library/http.client.rst | 12 ++ Lib/http/client.py | 25 ++- Lib/test/test_httplib.py | 147 ++++++++++++++++-- Misc/ACKS | 1 + .../2018-07-16-14-10-29.bpo-22708.592iRR.rst | 3 + 5 files changed, 167 insertions(+), 21 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-07-16-14-10-29.bpo-22708.592iRR.rst diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst index ad3416135e307b..38821b32c91cf1 100644 --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -353,6 +353,13 @@ HTTPConnection Objects The *headers* argument should be a mapping of extra HTTP headers to send with the CONNECT request. + As HTTP/1.1 is used for HTTP CONNECT tunnelling request, `as per the RFC + `_, a HTTP ``Host:`` + header must be provided, matching the authority-form of the request target + provided as the destination for the CONNECT request. If a HTTP ``Host:`` + header is not provided via the headers argument, one is generated and + transmitted automatically. + For example, to tunnel through a HTTPS proxy server running locally on port 8080, we would pass the address of the proxy to the :class:`HTTPSConnection` constructor, and the address of the host that we eventually want to reach to @@ -365,6 +372,11 @@ HTTPConnection Objects .. versionadded:: 3.2 + .. versionchanged:: 3.12 + HTTP CONNECT tunnelling requests use protocol HTTP/1.1, upgraded from + protocol HTTP/1.0. ``Host:`` HTTP headers are mandatory for HTTP/1.1, so + one will be automatically generated and transmitted if not provided in + the headers argument. .. method:: HTTPConnection.connect() diff --git a/Lib/http/client.py b/Lib/http/client.py index bd55e7d239af0c..0f5cd35247ae82 100644 --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -870,9 +870,9 @@ def __init__(self, host, port=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, def set_tunnel(self, host, port=None, headers=None): """Set up host and port for HTTP CONNECT tunnelling. - In a connection that uses HTTP CONNECT tunneling, the host passed to the - constructor is used as a proxy server that relays all communication to - the endpoint passed to `set_tunnel`. This done by sending an HTTP + In a connection that uses HTTP CONNECT tunnelling, the host passed to + the constructor is used as a proxy server that relays all communication + to the endpoint passed to `set_tunnel`. This done by sending an HTTP CONNECT request to the proxy server when the connection is established. This method must be called before the HTTP connection has been @@ -880,6 +880,13 @@ def set_tunnel(self, host, port=None, headers=None): The headers argument should be a mapping of extra HTTP headers to send with the CONNECT request. + + As HTTP/1.1 is used for HTTP CONNECT tunnelling request, as per the RFC + (https://tools.ietf.org/html/rfc7231#section-4.3.6), a HTTP Host: + header must be provided, matching the authority-form of the request + target provided as the destination for the CONNECT request. If a + HTTP Host: header is not provided via the headers argument, one + is generated and transmitted automatically. """ if self.sock: @@ -887,10 +894,15 @@ def set_tunnel(self, host, port=None, headers=None): self._tunnel_host, self._tunnel_port = self._get_hostport(host, port) if headers: - self._tunnel_headers = headers + self._tunnel_headers = headers.copy() else: self._tunnel_headers.clear() + if not any(header.lower() == "host" for header in self._tunnel_headers): + encoded_host = self._tunnel_host.encode("idna").decode("ascii") + self._tunnel_headers["Host"] = "%s:%d" % ( + encoded_host, self._tunnel_port) + def _get_hostport(self, host, port): if port is None: i = host.rfind(':') @@ -915,8 +927,9 @@ def set_debuglevel(self, level): self.debuglevel = level def _tunnel(self): - connect = b"CONNECT %s:%d HTTP/1.0\r\n" % ( - self._tunnel_host.encode("ascii"), self._tunnel_port) + connect = b"CONNECT %s:%d %s\r\n" % ( + self._tunnel_host.encode("idna"), self._tunnel_port, + self._http_vsn_str.encode("ascii")) headers = [connect] for header, value in self._tunnel_headers.items(): headers.append(f"{header}: {value}\r\n".encode("latin-1")) diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py index 9ff6afcbadec54..b4f4e2b14351a6 100644 --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -2187,11 +2187,12 @@ def test_getting_header_defaultint(self): class TunnelTests(TestCase): def setUp(self): response_text = ( - 'HTTP/1.0 200 OK\r\n\r\n' # Reply to CONNECT + 'HTTP/1.1 200 OK\r\n\r\n' # Reply to CONNECT 'HTTP/1.1 200 OK\r\n' # Reply to HEAD 'Content-Length: 42\r\n\r\n' ) self.host = 'proxy.com' + self.port = client.HTTP_PORT self.conn = client.HTTPConnection(self.host) self.conn._create_connection = self._create_connection(response_text) @@ -2203,15 +2204,45 @@ def create_connection(address, timeout=None, source_address=None): return FakeSocket(response_text, host=address[0], port=address[1]) return create_connection - def test_set_tunnel_host_port_headers(self): + def test_set_tunnel_host_port_headers_add_host_missing(self): tunnel_host = 'destination.com' tunnel_port = 8888 tunnel_headers = {'User-Agent': 'Mozilla/5.0 (compatible, MSIE 11)'} + tunnel_headers_after = tunnel_headers.copy() + tunnel_headers_after['Host'] = '%s:%d' % (tunnel_host, tunnel_port) self.conn.set_tunnel(tunnel_host, port=tunnel_port, headers=tunnel_headers) self.conn.request('HEAD', '/', '') self.assertEqual(self.conn.sock.host, self.host) - self.assertEqual(self.conn.sock.port, client.HTTP_PORT) + self.assertEqual(self.conn.sock.port, self.port) + self.assertEqual(self.conn._tunnel_host, tunnel_host) + self.assertEqual(self.conn._tunnel_port, tunnel_port) + self.assertEqual(self.conn._tunnel_headers, tunnel_headers_after) + + def test_set_tunnel_host_port_headers_set_host_identical(self): + tunnel_host = 'destination.com' + tunnel_port = 8888 + tunnel_headers = {'User-Agent': 'Mozilla/5.0 (compatible, MSIE 11)', + 'Host': '%s:%d' % (tunnel_host, tunnel_port)} + self.conn.set_tunnel(tunnel_host, port=tunnel_port, + headers=tunnel_headers) + self.conn.request('HEAD', '/', '') + self.assertEqual(self.conn.sock.host, self.host) + self.assertEqual(self.conn.sock.port, self.port) + self.assertEqual(self.conn._tunnel_host, tunnel_host) + self.assertEqual(self.conn._tunnel_port, tunnel_port) + self.assertEqual(self.conn._tunnel_headers, tunnel_headers) + + def test_set_tunnel_host_port_headers_set_host_different(self): + tunnel_host = 'destination.com' + tunnel_port = 8888 + tunnel_headers = {'User-Agent': 'Mozilla/5.0 (compatible, MSIE 11)', + 'Host': '%s:%d' % ('example.com', 4200)} + self.conn.set_tunnel(tunnel_host, port=tunnel_port, + headers=tunnel_headers) + self.conn.request('HEAD', '/', '') + self.assertEqual(self.conn.sock.host, self.host) + self.assertEqual(self.conn.sock.port, self.port) self.assertEqual(self.conn._tunnel_host, tunnel_host) self.assertEqual(self.conn._tunnel_port, tunnel_port) self.assertEqual(self.conn._tunnel_headers, tunnel_headers) @@ -2223,17 +2254,96 @@ def test_disallow_set_tunnel_after_connect(self): 'destination.com') def test_connect_with_tunnel(self): - self.conn.set_tunnel('destination.com') + d = { + b'host': b'destination.com', + b'port': client.HTTP_PORT, + } + self.conn.set_tunnel(d[b'host'].decode('ascii')) + self.conn.request('HEAD', '/', '') + self.assertEqual(self.conn.sock.host, self.host) + self.assertEqual(self.conn.sock.port, self.port) + self.assertIn(b'CONNECT %(host)s:%(port)d HTTP/1.1\r\n' + b'Host: %(host)s:%(port)d\r\n\r\n' % d, + self.conn.sock.data) + self.assertIn(b'HEAD / HTTP/1.1\r\nHost: %(host)s\r\n' % d, + self.conn.sock.data) + + def test_connect_with_tunnel_with_default_port(self): + d = { + b'host': b'destination.com', + b'port': client.HTTP_PORT, + } + self.conn.set_tunnel(d[b'host'].decode('ascii'), port=d[b'port']) + self.conn.request('HEAD', '/', '') + self.assertEqual(self.conn.sock.host, self.host) + self.assertEqual(self.conn.sock.port, self.port) + self.assertIn(b'CONNECT %(host)s:%(port)d HTTP/1.1\r\n' + b'Host: %(host)s:%(port)d\r\n\r\n' % d, + self.conn.sock.data) + self.assertIn(b'HEAD / HTTP/1.1\r\nHost: %(host)s\r\n' % d, + self.conn.sock.data) + + def test_connect_with_tunnel_with_nonstandard_port(self): + d = { + b'host': b'destination.com', + b'port': 8888, + } + self.conn.set_tunnel(d[b'host'].decode('ascii'), port=d[b'port']) + self.conn.request('HEAD', '/', '') + self.assertEqual(self.conn.sock.host, self.host) + self.assertEqual(self.conn.sock.port, self.port) + self.assertIn(b'CONNECT %(host)s:%(port)d HTTP/1.1\r\n' + b'Host: %(host)s:%(port)d\r\n\r\n' % d, + self.conn.sock.data) + self.assertIn(b'HEAD / HTTP/1.1\r\nHost: %(host)s:%(port)d\r\n' % d, + self.conn.sock.data) + + # This request is not RFC-valid, but it's been possible with the library + # for years, so don't break it unexpectedly... This also tests + # case-insensitivity when injecting Host: headers if they're missing. + def test_connect_with_tunnel_with_different_host_header(self): + d = { + b'host': b'destination.com', + b'tunnel_host_header': b'example.com:9876', + b'port': client.HTTP_PORT, + } + self.conn.set_tunnel( + d[b'host'].decode('ascii'), + headers={'HOST': d[b'tunnel_host_header'].decode('ascii')}) + self.conn.request('HEAD', '/', '') + self.assertEqual(self.conn.sock.host, self.host) + self.assertEqual(self.conn.sock.port, self.port) + self.assertIn(b'CONNECT %(host)s:%(port)d HTTP/1.1\r\n' + b'HOST: %(tunnel_host_header)s\r\n\r\n' % d, + self.conn.sock.data) + self.assertIn(b'HEAD / HTTP/1.1\r\nHost: %(host)s\r\n' % d, + self.conn.sock.data) + + def test_connect_with_tunnel_different_host(self): + d = { + b'host': b'destination.com', + b'port': client.HTTP_PORT, + } + self.conn.set_tunnel(d[b'host'].decode('ascii')) + self.conn.request('HEAD', '/', '') + self.assertEqual(self.conn.sock.host, self.host) + self.assertEqual(self.conn.sock.port, self.port) + self.assertIn(b'CONNECT %(host)s:%(port)d HTTP/1.1\r\n' + b'Host: %(host)s:%(port)d\r\n\r\n' % d, + self.conn.sock.data) + self.assertIn(b'HEAD / HTTP/1.1\r\nHost: %(host)s\r\n' % d, + self.conn.sock.data) + + def test_connect_with_tunnel_idna(self): + dest = '\u03b4\u03c0\u03b8.gr' + dest_port = b'%s:%d' % (dest.encode('idna'), client.HTTP_PORT) + expected = b'CONNECT %s HTTP/1.1\r\nHost: %s\r\n\r\n' % ( + dest_port, dest_port) + self.conn.set_tunnel(dest) self.conn.request('HEAD', '/', '') self.assertEqual(self.conn.sock.host, self.host) self.assertEqual(self.conn.sock.port, client.HTTP_PORT) - self.assertIn(b'CONNECT destination.com', self.conn.sock.data) - # issue22095 - self.assertNotIn(b'Host: destination.com:None', self.conn.sock.data) - self.assertIn(b'Host: destination.com', self.conn.sock.data) - - # This test should be removed when CONNECT gets the HTTP/1.1 blessing - self.assertNotIn(b'Host: proxy.com', self.conn.sock.data) + self.assertIn(expected, self.conn.sock.data) def test_tunnel_connect_single_send_connection_setup(self): """Regresstion test for https://bugs.python.org/issue43332.""" @@ -2253,12 +2363,19 @@ def test_tunnel_connect_single_send_connection_setup(self): msg=f'unexpected proxy data sent {proxy_setup_data_sent!r}') def test_connect_put_request(self): - self.conn.set_tunnel('destination.com') + d = { + b'host': b'destination.com', + b'port': client.HTTP_PORT, + } + self.conn.set_tunnel(d[b'host'].decode('ascii')) self.conn.request('PUT', '/', '') self.assertEqual(self.conn.sock.host, self.host) - self.assertEqual(self.conn.sock.port, client.HTTP_PORT) - self.assertIn(b'CONNECT destination.com', self.conn.sock.data) - self.assertIn(b'Host: destination.com', self.conn.sock.data) + self.assertEqual(self.conn.sock.port, self.port) + self.assertIn(b'CONNECT %(host)s:%(port)d HTTP/1.1\r\n' + b'Host: %(host)s:%(port)d\r\n\r\n' % d, + self.conn.sock.data) + self.assertIn(b'PUT / HTTP/1.1\r\nHost: %(host)s\r\n' % d, + self.conn.sock.data) def test_tunnel_debuglog(self): expected_header = 'X-Dummy: 1' diff --git a/Misc/ACKS b/Misc/ACKS index 8cf5166a2bb1f4..929e06a87cb794 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -693,6 +693,7 @@ Anders Hammarquist Mark Hammond Harald Hanche-Olsen Manus Hand +Michael Handler Andreas Hangauer Milton L. Hankins Carl Bordum Hansen diff --git a/Misc/NEWS.d/next/Library/2018-07-16-14-10-29.bpo-22708.592iRR.rst b/Misc/NEWS.d/next/Library/2018-07-16-14-10-29.bpo-22708.592iRR.rst new file mode 100644 index 00000000000000..00bcf38bbcdf51 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-07-16-14-10-29.bpo-22708.592iRR.rst @@ -0,0 +1,3 @@ +http.client CONNECT method tunnel improvements: Use HTTP 1.1 protocol; send +a matching Host: header with CONNECT, if one is not provided; convert IDN +domain names to Punycode. Patch by Michael Handler. From 119f67de08f1fddc2a3f7b7caac7454cb57ef800 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Wed, 5 Apr 2023 10:22:33 +0300 Subject: [PATCH 065/349] gh-103167: Fix `-Wstrict-prototypes` warnings by using `(void)` for functions with no args (GH-103168) --- Modules/_tkinter.c | 2 +- Modules/posixmodule.c | 4 ++-- PC/launcher.c | 12 ++++++------ PC/launcher2.c | 6 +++--- Python/ceval_gil.c | 2 +- Python/initconfig.c | 4 ++-- Python/sysmodule.c | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 606e578a1f3116..20e01c79668549 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -121,7 +121,7 @@ Copyright (C) 1994 Steen Lumholt. #define WAIT_FOR_STDIN static PyObject * -_get_tcl_lib_path() +_get_tcl_lib_path(void) { static PyObject *tcl_library_path = NULL; static int already_checked = 0; diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index e38caf7cc0abee..dd150107e4a9de 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -8546,7 +8546,7 @@ os_setpgrp_impl(PyObject *module) #include static PyObject* -win32_getppid() +win32_getppid(void) { DWORD error; PyObject* result = NULL; @@ -13330,7 +13330,7 @@ static int has_ShellExecute = -1; static HINSTANCE (CALLBACK *Py_ShellExecuteW)(HWND, LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR, INT); static int -check_ShellExecute() +check_ShellExecute(void) { HINSTANCE hShell32; diff --git a/PC/launcher.c b/PC/launcher.c index 0776e57249c427..dc265533740b67 100644 --- a/PC/launcher.c +++ b/PC/launcher.c @@ -449,7 +449,7 @@ locate_pythons_for_key(HKEY root, REGSAM flags) } static void -locate_store_pythons() +locate_store_pythons(void) { #if defined(_M_X64) /* 64bit process, so look in native registry */ @@ -466,7 +466,7 @@ locate_store_pythons() } static void -locate_venv_python() +locate_venv_python(void) { static wchar_t venv_python[MAX_PATH]; INSTALLED_PYTHON * ip; @@ -495,7 +495,7 @@ locate_venv_python() } static void -locate_all_pythons() +locate_all_pythons(void) { /* venv Python is highest priority */ locate_venv_python(); @@ -694,7 +694,7 @@ static wchar_t wrapped_script_path[MAX_PATH]; * valid wrapped script file. */ static void -locate_wrapped_script() +locate_wrapped_script(void) { wchar_t * p; size_t plen; @@ -1034,7 +1034,7 @@ read_config_file(wchar_t * config_path) } } -static void read_commands() +static void read_commands(void) { if (launcher_ini_path[0]) read_config_file(launcher_ini_path); @@ -1684,7 +1684,7 @@ wcsdup_pad(const wchar_t *s, int padding, int *newlen) } static wchar_t * -get_process_name() +get_process_name(void) { DWORD bufferLen = MAX_PATH; DWORD len = bufferLen; diff --git a/PC/launcher2.c b/PC/launcher2.c index 932665387f1966..bb500d4b6bfb07 100644 --- a/PC/launcher2.c +++ b/PC/launcher2.c @@ -132,7 +132,7 @@ typedef BOOL (*PIsWow64Process2)(HANDLE, USHORT*, USHORT*); USHORT -_getNativeMachine() +_getNativeMachine(void) { static USHORT _nativeMachine = IMAGE_FILE_MACHINE_UNKNOWN; if (_nativeMachine == IMAGE_FILE_MACHINE_UNKNOWN) { @@ -163,14 +163,14 @@ _getNativeMachine() bool -isAMD64Host() +isAMD64Host(void) { return _getNativeMachine() == IMAGE_FILE_MACHINE_AMD64; } bool -isARM64Host() +isARM64Host(void) { return _getNativeMachine() == IMAGE_FILE_MACHINE_ARM64; } diff --git a/Python/ceval_gil.c b/Python/ceval_gil.c index 749d8144bf7a23..29796be4b80e93 100644 --- a/Python/ceval_gil.c +++ b/Python/ceval_gil.c @@ -467,7 +467,7 @@ void _PyEval_SetSwitchInterval(unsigned long microseconds) gil->interval = microseconds; } -unsigned long _PyEval_GetSwitchInterval() +unsigned long _PyEval_GetSwitchInterval(void) { struct _gil_runtime_state *gil = &_PyRuntime.ceval.gil; return gil->interval; diff --git a/Python/initconfig.c b/Python/initconfig.c index db7f11e17d6662..0d42b7ea082d61 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -2355,13 +2355,13 @@ config_usage(int error, const wchar_t* program) } static void -config_envvars_usage() +config_envvars_usage(void) { printf(usage_envvars, (wint_t)DELIM, (wint_t)DELIM, PYTHONHOMEHELP); } static void -config_xoptions_usage() +config_xoptions_usage(void) { puts(usage_xoptions); } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 4afb0f1d0b5ed2..f1a294de598420 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1488,7 +1488,7 @@ static PyStructSequence_Desc windows_version_desc = { }; static PyObject * -_sys_getwindowsversion_from_kernel32() +_sys_getwindowsversion_from_kernel32(void) { #ifndef MS_WINDOWS_DESKTOP return NULL; From 264c00a1c512a9bd58f47c80e72e436c639763c8 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Wed, 5 Apr 2023 08:27:01 +0100 Subject: [PATCH 066/349] gh-103193: Micro-optimise helper functions for `inspect.getattr_static` (#103195) --- Lib/inspect.py | 7 +++---- .../Library/2023-04-02-17-51-08.gh-issue-103193.xrZbM1.rst | 2 ++ 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-02-17-51-08.gh-issue-103193.xrZbM1.rst diff --git a/Lib/inspect.py b/Lib/inspect.py index 0eceaaf9a24f5d..8739c9c2572643 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1772,9 +1772,9 @@ def trace(context=1): # ------------------------------------------------ static version of getattr _sentinel = object() +_static_getmro = type.__dict__['__mro__'].__get__ +_get_dunder_dict_of_class = type.__dict__["__dict__"].__get__ -def _static_getmro(klass): - return type.__dict__['__mro__'].__get__(klass) def _check_instance(obj, attr): instance_dict = {} @@ -1802,10 +1802,9 @@ def _is_type(obj): return True def _shadowed_dict(klass): - dict_attr = type.__dict__["__dict__"] for entry in _static_getmro(klass): try: - class_dict = dict_attr.__get__(entry)["__dict__"] + class_dict = _get_dunder_dict_of_class(entry)["__dict__"] except KeyError: pass else: diff --git a/Misc/NEWS.d/next/Library/2023-04-02-17-51-08.gh-issue-103193.xrZbM1.rst b/Misc/NEWS.d/next/Library/2023-04-02-17-51-08.gh-issue-103193.xrZbM1.rst new file mode 100644 index 00000000000000..f0b76a605a5610 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-02-17-51-08.gh-issue-103193.xrZbM1.rst @@ -0,0 +1,2 @@ +Improve performance of :func:`inspect.getattr_static`. Patch by Alex +Waygood. From 47753ecde21b79b5c5f11d883946fda2a340e427 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Wed, 5 Apr 2023 10:07:30 +0100 Subject: [PATCH 067/349] gh-74690: typing: Simplify and optimise `_ProtocolMeta.__instancecheck__` (#103159) --- Lib/typing.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/Lib/typing.py b/Lib/typing.py index 442d684d14c928..f50e9b0a93b061 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -2024,20 +2024,12 @@ def __instancecheck__(cls, instance): raise TypeError("Instance and class checks can only be used with" " @runtime_checkable protocols") - if not is_protocol_cls and issubclass(instance.__class__, cls): - return True - - protocol_attrs = _get_protocol_attrs(cls) - - if ( - _is_callable_members_only(cls, protocol_attrs) - and issubclass(instance.__class__, cls) - ): + if super().__instancecheck__(instance): return True if is_protocol_cls: getattr_static = _lazy_load_getattr_static() - for attr in protocol_attrs: + for attr in _get_protocol_attrs(cls): try: val = getattr_static(instance, attr) except AttributeError: @@ -2047,7 +2039,7 @@ def __instancecheck__(cls, instance): else: return True - return super().__instancecheck__(instance) + return False class Protocol(Generic, metaclass=_ProtocolMeta): From c396b6ddf3da784349bac9ebf7f28c55bde016ea Mon Sep 17 00:00:00 2001 From: "C.A.M. Gerlach" Date: Wed, 5 Apr 2023 06:16:36 -0500 Subject: [PATCH 068/349] gh-81762: Clarify and simplify description of print's flush param (#103264) --- Doc/library/functions.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index f0f374771b0cf1..8797485cd05d83 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1444,8 +1444,9 @@ are always available. They are listed here in alphabetical order. arguments are converted to text strings, :func:`print` cannot be used with binary mode file objects. For these, use ``file.write(...)`` instead. - Whether the output is buffered is usually determined by *file*, but if the - *flush* keyword argument is true, the stream is forcibly flushed. + Output buffering is usually determined by *file*. + However, if *flush* is true, the stream is forcibly flushed. + .. versionchanged:: 3.3 Added the *flush* keyword argument. From 3246688918a428738b61c4adb5fbc6525eae96f9 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Wed, 5 Apr 2023 12:19:03 +0100 Subject: [PATCH 069/349] gh-74690: typing: Call `_get_protocol_attrs` and `_callable_members_only` at protocol class creation time, not during `isinstance()` checks (#103160) --- Lib/typing.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/Lib/typing.py b/Lib/typing.py index f50e9b0a93b061..b8420f619a1d05 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1905,7 +1905,8 @@ class _TypingEllipsis: _TYPING_INTERNALS = frozenset({ '__parameters__', '__orig_bases__', '__orig_class__', - '_is_protocol', '_is_runtime_protocol' + '_is_protocol', '_is_runtime_protocol', '__protocol_attrs__', + '__callable_proto_members_only__', }) _SPECIAL_NAMES = frozenset({ @@ -1935,11 +1936,6 @@ def _get_protocol_attrs(cls): return attrs -def _is_callable_members_only(cls, protocol_attrs): - # PEP 544 prohibits using issubclass() with protocols that have non-method members. - return all(callable(getattr(cls, attr, None)) for attr in protocol_attrs) - - def _no_init_or_replace_init(self, *args, **kwargs): cls = type(self) @@ -2012,6 +2008,15 @@ def _lazy_load_getattr_static(): class _ProtocolMeta(ABCMeta): # This metaclass is really unfortunate and exists only because of # the lack of __instancehook__. + def __init__(cls, *args, **kwargs): + super().__init__(*args, **kwargs) + cls.__protocol_attrs__ = _get_protocol_attrs(cls) + # PEP 544 prohibits using issubclass() + # with protocols that have non-method members. + cls.__callable_proto_members_only__ = all( + callable(getattr(cls, attr, None)) for attr in cls.__protocol_attrs__ + ) + def __instancecheck__(cls, instance): # We need this method for situations where attributes are # assigned in __init__. @@ -2029,7 +2034,7 @@ def __instancecheck__(cls, instance): if is_protocol_cls: getattr_static = _lazy_load_getattr_static() - for attr in _get_protocol_attrs(cls): + for attr in cls.__protocol_attrs__: try: val = getattr_static(instance, attr) except AttributeError: @@ -2095,9 +2100,7 @@ def _proto_hook(other): raise TypeError("Instance and class checks can only be used with" " @runtime_checkable protocols") - protocol_attrs = _get_protocol_attrs(cls) - - if not _is_callable_members_only(cls, protocol_attrs): + if not cls.__callable_proto_members_only__ : if _allow_reckless_class_checks(): return NotImplemented raise TypeError("Protocols with non-method members" @@ -2107,7 +2110,7 @@ def _proto_hook(other): raise TypeError('issubclass() arg 1 must be a class') # Second, perform the actual structural compatibility check. - for attr in protocol_attrs: + for attr in cls.__protocol_attrs__: for base in other.__mro__: # Check if the members appears in the class dictionary... if attr in base.__dict__: From a28d4edb23b7150942f1eceb9e97c6f53aa4de42 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 5 Apr 2023 14:43:26 +0300 Subject: [PATCH 070/349] gh-100408: Fix a traceback in multiprocessing example (#100409) --- Doc/library/multiprocessing.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 0ec47bb956a99e..8454296b815b41 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -460,16 +460,16 @@ process which created it. ... return x*x ... >>> with p: - ... p.map(f, [1,2,3]) + ... p.map(f, [1,2,3]) Process PoolWorker-1: Process PoolWorker-2: Process PoolWorker-3: Traceback (most recent call last): Traceback (most recent call last): Traceback (most recent call last): - AttributeError: 'module' object has no attribute 'f' - AttributeError: 'module' object has no attribute 'f' - AttributeError: 'module' object has no attribute 'f' + AttributeError: Can't get attribute 'f' on )> + AttributeError: Can't get attribute 'f' on )> + AttributeError: Can't get attribute 'f' on )> (If you try this it will actually output three full tracebacks interleaved in a semi-random fashion, and then you may have to From 8f70b16e3397ad32757ddbabd5180cbef0036a4b Mon Sep 17 00:00:00 2001 From: Yeojin Kim Date: Wed, 5 Apr 2023 20:54:48 +0900 Subject: [PATCH 071/349] gh-86094: Add support for Unicode Path Extra Field in ZipFile (gh-102566) --- Lib/test/test_zipfile/test_core.py | 27 ++++++++++ Lib/zipfile/__init__.py | 50 ++++++++++++++----- Misc/ACKS | 1 + ...3-03-10-04-59-35.gh-issue-86094.zOYdy8.rst | 2 + 4 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2023-03-10-04-59-35.gh-issue-86094.zOYdy8.rst diff --git a/Lib/test/test_zipfile/test_core.py b/Lib/test/test_zipfile/test_core.py index e23f5c2a8556f2..73c6b0185a1a0e 100644 --- a/Lib/test/test_zipfile/test_core.py +++ b/Lib/test/test_zipfile/test_core.py @@ -1616,6 +1616,33 @@ def test_write_unicode_filenames(self): self.assertEqual(zf.filelist[0].filename, "foo.txt") self.assertEqual(zf.filelist[1].filename, "\xf6.txt") + @requires_zlib() + def test_read_zipfile_containing_unicode_path_extra_field(self): + with zipfile.ZipFile(TESTFN, mode='w') as zf: + # create a file with a non-ASCII name + filename = '이름.txt' + filename_encoded = filename.encode('utf-8') + + # create a ZipInfo object with Unicode path extra field + zip_info = zipfile.ZipInfo(filename) + + tag_for_unicode_path = b'\x75\x70' + version_of_unicode_path = b'\x01' + + import zlib + filename_crc = struct.pack('= 0: + filename = filename[0:null_byte] + # This is used to ensure paths in generated ZIP files always use + # forward slashes as the directory separator, as required by the + # ZIP format specification. + if os.sep != "/" and os.sep in filename: + filename = filename.replace(os.sep, "/") + return filename + class ZipInfo (object): """Class with attributes describing each file in the ZIP archive.""" @@ -368,16 +384,9 @@ class ZipInfo (object): def __init__(self, filename="NoName", date_time=(1980,1,1,0,0,0)): self.orig_filename = filename # Original file name in archive - # Terminate the file name at the first null byte. Null bytes in file - # names are used as tricks by viruses in archives. - null_byte = filename.find(chr(0)) - if null_byte >= 0: - filename = filename[0:null_byte] - # This is used to ensure paths in generated ZIP files always use - # forward slashes as the directory separator, as required by the - # ZIP format specification. - if os.sep != "/" and os.sep in filename: - filename = filename.replace(os.sep, "/") + # Terminate the file name at the first null byte and + # ensure paths always use forward slashes as the directory separator. + filename = _sanitize_filename(filename) self.filename = filename # Normalized file name self.date_time = date_time # year, month, day, hour, min, sec @@ -482,7 +491,7 @@ def _encodeFilenameFlags(self): except UnicodeEncodeError: return self.filename.encode('utf-8'), self.flag_bits | _MASK_UTF_FILENAME - def _decodeExtra(self): + def _decodeExtra(self, filename_crc): # Try to decode the extra field. extra = self.extra unpack = struct.unpack @@ -508,6 +517,21 @@ def _decodeExtra(self): except struct.error: raise BadZipFile(f"Corrupt zip64 extra field. " f"{field} not found.") from None + elif tp == 0x7075: + data = extra[4:ln+4] + # Unicode Path Extra Field + try: + up_version, up_name_crc = unpack(' 2: print(centdir) filename = fp.read(centdir[_CD_FILENAME_LENGTH]) + orig_filename_crc = crc32(filename) flags = centdir[_CD_FLAG_BITS] if flags & _MASK_UTF_FILENAME: # UTF-8 file names extension @@ -1432,8 +1457,7 @@ def _RealGetContents(self): x._raw_time = t x.date_time = ( (d>>9)+1980, (d>>5)&0xF, d&0x1F, t>>11, (t>>5)&0x3F, (t&0x1F) * 2 ) - - x._decodeExtra() + x._decodeExtra(orig_filename_crc) x.header_offset = x.header_offset + concat self.filelist.append(x) self.NameToInfo[x.filename] = x diff --git a/Misc/ACKS b/Misc/ACKS index 929e06a87cb794..49f3692dfd6b8f 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -627,6 +627,7 @@ Julian Gindi Yannick Gingras Neil Girdhar Matt Giuca +Andrea Giudiceandrea Franz Glasner Wim Glenn Michael Goderbauer diff --git a/Misc/NEWS.d/next/Documentation/2023-03-10-04-59-35.gh-issue-86094.zOYdy8.rst b/Misc/NEWS.d/next/Documentation/2023-03-10-04-59-35.gh-issue-86094.zOYdy8.rst new file mode 100644 index 00000000000000..39461f3f84c9ac --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2023-03-10-04-59-35.gh-issue-86094.zOYdy8.rst @@ -0,0 +1,2 @@ +Add support for Unicode Path Extra Field in ZipFile. Patch by Yeojin Kim +and Andrea Giudiceandrea From 5e7c468fc4ceb801c30844b794e04a2ac6a35743 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Wed, 5 Apr 2023 15:52:38 +0100 Subject: [PATCH 072/349] gh-89058: remove skip from test_no_hang_on_context_chain_cycle2 (#102903) --- Lib/test/test_exceptions.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 284f26be717794..74a5884264d577 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -1135,7 +1135,6 @@ def cycle(): self.assertIsInstance(exc.__context__, ValueError) self.assertIs(exc.__context__.__context__, exc.__context__) - @unittest.skip("See issue 44895") def test_no_hang_on_context_chain_cycle2(self): # See issue 25782. Cycle at head of context chain. From fdd0fff277a55c010a4da0a7af0e986e38560545 Mon Sep 17 00:00:00 2001 From: Olivier Gayot Date: Wed, 5 Apr 2023 16:54:43 +0200 Subject: [PATCH 073/349] gh-102899: Fix doc link for getting filesystem error handler (#102901) --- Doc/library/sys.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index b3b9b5e74ac068..00721efd1cf65e 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -697,7 +697,7 @@ always available. the encoding used with the :term:`filesystem error handler ` to convert between Unicode filenames and bytes filenames. The filesystem error handler is returned from - :func:`getfilesystemencoding`. + :func:`getfilesystemencodeerrors`. For best compatibility, str should be used for filenames in all cases, although representing filenames as bytes is also supported. Functions From 96e1901a59ed3bb6188743d60395666969a3ba42 Mon Sep 17 00:00:00 2001 From: Joshua Root Date: Thu, 6 Apr 2023 01:09:19 +1000 Subject: [PATCH 074/349] gh-99069: Consolidate checks for static_assert (#94766) Several platforms don't define the static_assert macro despite having compiler support for the _Static_assert keyword. The macro needs to be defined since it is used unconditionally in the Python code. So it should always be safe to define it if undefined and not in C++11 (or later) mode. Hence, remove the checks for particular platforms or libc versions, and just define static_assert anytime it needs to be defined but isn't. That way, all platforms that need the fix will get it, regardless of whether someone specifically thought of them. Also document that certain macOS versions are among the platforms that need this. The C2x draft (currently expected to become C23) makes static_assert a keyword to match C++. So only define the macro for up to C17. Co-authored-by: Victor Stinner --- Include/pymacro.h | 29 ++++++++++--------- ...3-02-11-05-31-05.gh-issue-99069.X4LDvY.rst | 1 + 2 files changed, 17 insertions(+), 13 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2023-02-11-05-31-05.gh-issue-99069.X4LDvY.rst diff --git a/Include/pymacro.h b/Include/pymacro.h index e37cda44c5ebf1..342d2a7b844adf 100644 --- a/Include/pymacro.h +++ b/Include/pymacro.h @@ -3,20 +3,23 @@ // gh-91782: On FreeBSD 12, if the _POSIX_C_SOURCE and _XOPEN_SOURCE macros are // defined, disables C11 support and does not define -// the static_assert() macro. Define the static_assert() macro in Python until -// suports C11: +// the static_assert() macro. // https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=255290 -#if defined(__FreeBSD__) && !defined(static_assert) -# define static_assert _Static_assert -#endif - -// static_assert is defined in glibc from version 2.16. Before it requires -// compiler support (gcc >= 4.6) and is called _Static_assert. -// In C++ 11 static_assert is a keyword, redefining is undefined behaviour. -#if (defined(__GLIBC__) \ - && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 16)) \ - && !(defined(__cplusplus) && __cplusplus >= 201103L) \ - && !defined(static_assert)) +// +// macOS <= 10.10 doesn't define static_assert in assert.h at all despite +// having C11 compiler support. +// +// static_assert is defined in glibc from version 2.16. Compiler support for +// the C11 _Static_assert keyword is in gcc >= 4.6. +// +// MSVC makes static_assert a keyword in C11-17, contrary to the standards. +// +// In C++11 and C2x, static_assert is a keyword, redefining is undefined +// behaviour. So only define if building as C (if __STDC_VERSION__ is defined), +// not C++, and only for C11-17. +#if !defined(static_assert) && (defined(__GNUC__) || defined(__clang__)) \ + && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L \ + && __STDC_VERSION__ <= 201710L # define static_assert _Static_assert #endif diff --git a/Misc/NEWS.d/next/Build/2023-02-11-05-31-05.gh-issue-99069.X4LDvY.rst b/Misc/NEWS.d/next/Build/2023-02-11-05-31-05.gh-issue-99069.X4LDvY.rst new file mode 100644 index 00000000000000..ae9b4d59ca8cec --- /dev/null +++ b/Misc/NEWS.d/next/Build/2023-02-11-05-31-05.gh-issue-99069.X4LDvY.rst @@ -0,0 +1 @@ +Extended workaround defining ``static_assert`` when missing from the libc headers to all clang and gcc builds. In particular, this fixes building on macOS <= 10.10. From de182676853e8de22363e8a0641c42392c0fdaa9 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Wed, 5 Apr 2023 17:37:36 +0100 Subject: [PATCH 075/349] gh-74690: Further optimise `typing._ProtocolMeta.__instancecheck__` (#103280) --- Lib/typing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/typing.py b/Lib/typing.py index b8420f619a1d05..1f1c4ffa2566ab 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -2039,7 +2039,7 @@ def __instancecheck__(cls, instance): val = getattr_static(instance, attr) except AttributeError: break - if callable(getattr(cls, attr, None)) and val is None: + if val is None and callable(getattr(cls, attr, None)): break else: return True From aa5a9b5eb767fd849ea09d0842e33691e690de7c Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Wed, 5 Apr 2023 15:13:12 -0600 Subject: [PATCH 076/349] gh-101659: Use the Raw Allocator in the _xxinterpchannels Module (gh-103287) Using the raw allocator for any of the global state makes sense, especially as we move to a per-interpreter obmalloc state (gh-101660). --- Modules/_xxinterpchannelsmodule.c | 115 ++++++++++++++++++++++++------ 1 file changed, 93 insertions(+), 22 deletions(-) diff --git a/Modules/_xxinterpchannelsmodule.c b/Modules/_xxinterpchannelsmodule.c index fead12c963da26..ef1cdcab952271 100644 --- a/Modules/_xxinterpchannelsmodule.c +++ b/Modules/_xxinterpchannelsmodule.c @@ -10,9 +10,77 @@ #include "pycore_interpreteridobject.h" +/* +This module has the following process-global state: + +_globals (static struct globals): + module_count (int) + channels (struct _channels): + numopen (int64_t) + next_id; (int64_t) + mutex (PyThread_type_lock) + head (linked list of struct _channelref *): + id (int64_t) + objcount (Py_ssize_t) + next (struct _channelref *): + ... + chan (struct _channel *): + open (int) + mutex (PyThread_type_lock) + closing (struct _channel_closing *): + ref (struct _channelref *): + ... + ends (struct _channelends *): + numsendopen (int64_t) + numrecvopen (int64_t) + send (struct _channelend *): + interp (int64_t) + open (int) + next (struct _channelend *) + recv (struct _channelend *): + ... + queue (struct _channelqueue *): + count (int64_t) + first (struct _channelitem *): + next (struct _channelitem *): + ... + data (_PyCrossInterpreterData *): + data (void *) + obj (PyObject *) + interp (int64_t) + new_object (xid_newobjectfunc) + free (xid_freefunc) + last (struct _channelitem *): + ... + +The above state includes the following allocations by the module: + +* 1 top-level mutex (to protect the rest of the state) +* for each channel: + * 1 struct _channelref + * 1 struct _channel + * 0-1 struct _channel_closing + * 1 struct _channelends + * 2 struct _channelend + * 1 struct _channelqueue +* for each item in each channel: + * 1 struct _channelitem + * 1 _PyCrossInterpreterData + +The only objects in that global state are the references held by each +channel's queue, which are safely managed via the _PyCrossInterpreterData_*() +API.. The module does not create any objects that are shared globally. +*/ + #define MODULE_NAME "_xxinterpchannels" +#define GLOBAL_MALLOC(TYPE) \ + PyMem_RawMalloc(sizeof(TYPE)) +#define GLOBAL_FREE(VAR) \ + PyMem_RawFree(VAR) + + static PyInterpreterState * _get_current_interp(void) { @@ -301,7 +369,7 @@ typedef struct _channelitem { static _channelitem * _channelitem_new(void) { - _channelitem *item = PyMem_NEW(_channelitem, 1); + _channelitem *item = GLOBAL_MALLOC(_channelitem); if (item == NULL) { PyErr_NoMemory(); return NULL; @@ -316,7 +384,8 @@ _channelitem_clear(_channelitem *item) { if (item->data != NULL) { (void)_release_xid_data(item->data, 1); - PyMem_Free(item->data); + // It was allocated in _channel_send(). + GLOBAL_FREE(item->data); item->data = NULL; } item->next = NULL; @@ -326,7 +395,7 @@ static void _channelitem_free(_channelitem *item) { _channelitem_clear(item); - PyMem_Free(item); + GLOBAL_FREE(item); } static void @@ -357,7 +426,7 @@ typedef struct _channelqueue { static _channelqueue * _channelqueue_new(void) { - _channelqueue *queue = PyMem_NEW(_channelqueue, 1); + _channelqueue *queue = GLOBAL_MALLOC(_channelqueue); if (queue == NULL) { PyErr_NoMemory(); return NULL; @@ -381,7 +450,7 @@ static void _channelqueue_free(_channelqueue *queue) { _channelqueue_clear(queue); - PyMem_Free(queue); + GLOBAL_FREE(queue); } static int @@ -433,7 +502,7 @@ typedef struct _channelend { static _channelend * _channelend_new(int64_t interp) { - _channelend *end = PyMem_NEW(_channelend, 1); + _channelend *end = GLOBAL_MALLOC(_channelend); if (end == NULL) { PyErr_NoMemory(); return NULL; @@ -447,7 +516,7 @@ _channelend_new(int64_t interp) static void _channelend_free(_channelend *end) { - PyMem_Free(end); + GLOBAL_FREE(end); } static void @@ -492,7 +561,7 @@ typedef struct _channelassociations { static _channelends * _channelends_new(void) { - _channelends *ends = PyMem_NEW(_channelends, 1); + _channelends *ends = GLOBAL_MALLOC(_channelends); if (ends== NULL) { return NULL; } @@ -519,7 +588,7 @@ static void _channelends_free(_channelends *ends) { _channelends_clear(ends); - PyMem_Free(ends); + GLOBAL_FREE(ends); } static _channelend * @@ -660,20 +729,20 @@ typedef struct _channel { static _PyChannelState * _channel_new(PyThread_type_lock mutex) { - _PyChannelState *chan = PyMem_NEW(_PyChannelState, 1); + _PyChannelState *chan = GLOBAL_MALLOC(_PyChannelState); if (chan == NULL) { return NULL; } chan->mutex = mutex; chan->queue = _channelqueue_new(); if (chan->queue == NULL) { - PyMem_Free(chan); + GLOBAL_FREE(chan); return NULL; } chan->ends = _channelends_new(); if (chan->ends == NULL) { _channelqueue_free(chan->queue); - PyMem_Free(chan); + GLOBAL_FREE(chan); return NULL; } chan->open = 1; @@ -691,7 +760,7 @@ _channel_free(_PyChannelState *chan) PyThread_release_lock(chan->mutex); PyThread_free_lock(chan->mutex); - PyMem_Free(chan); + GLOBAL_FREE(chan); } static int @@ -814,7 +883,7 @@ typedef struct _channelref { static _channelref * _channelref_new(int64_t id, _PyChannelState *chan) { - _channelref *ref = PyMem_NEW(_channelref, 1); + _channelref *ref = GLOBAL_MALLOC(_channelref); if (ref == NULL) { return NULL; } @@ -841,7 +910,7 @@ _channelref_free(_channelref *ref) _channel_clear_closing(ref->chan); } //_channelref_clear(ref); - PyMem_Free(ref); + GLOBAL_FREE(ref); } static _channelref * @@ -1163,7 +1232,7 @@ _channel_set_closing(struct _channelref *ref, PyThread_type_lock mutex) { res = ERR_CHANNEL_CLOSED; goto done; } - chan->closing = PyMem_NEW(struct _channel_closing, 1); + chan->closing = GLOBAL_MALLOC(struct _channel_closing); if (chan->closing == NULL) { goto done; } @@ -1179,7 +1248,7 @@ static void _channel_clear_closing(struct _channel *chan) { PyThread_acquire_lock(chan->mutex, WAIT_LOCK); if (chan->closing != NULL) { - PyMem_Free(chan->closing); + GLOBAL_FREE(chan->closing); chan->closing = NULL; } PyThread_release_lock(chan->mutex); @@ -1257,14 +1326,14 @@ _channel_send(_channels *channels, int64_t id, PyObject *obj) } // Convert the object to cross-interpreter data. - _PyCrossInterpreterData *data = PyMem_NEW(_PyCrossInterpreterData, 1); + _PyCrossInterpreterData *data = GLOBAL_MALLOC(_PyCrossInterpreterData); if (data == NULL) { PyThread_release_lock(mutex); return -1; } if (_PyObject_GetCrossInterpreterData(obj, data) != 0) { PyThread_release_lock(mutex); - PyMem_Free(data); + GLOBAL_FREE(data); return -1; } @@ -1274,7 +1343,7 @@ _channel_send(_channels *channels, int64_t id, PyObject *obj) if (res != 0) { // We may chain an exception here: (void)_release_xid_data(data, 0); - PyMem_Free(data); + GLOBAL_FREE(data); return res; } @@ -1323,11 +1392,13 @@ _channel_recv(_channels *channels, int64_t id, PyObject **res) if (obj == NULL) { assert(PyErr_Occurred()); (void)_release_xid_data(data, 1); - PyMem_Free(data); + // It was allocated in _channel_send(). + GLOBAL_FREE(data); return -1; } int release_res = _release_xid_data(data, 0); - PyMem_Free(data); + // It was allocated in _channel_send(). + GLOBAL_FREE(data); if (release_res < 0) { // The source interpreter has been destroyed already. assert(PyErr_Occurred()); From b4978ff872be5102117b4e25d93dbbb4e04c8292 Mon Sep 17 00:00:00 2001 From: Brandt Bucher Date: Wed, 5 Apr 2023 14:15:49 -0700 Subject: [PATCH 077/349] GH-88691: Shrink the CALL caches (GH-103230) --- Doc/library/dis.rst | 2 +- Include/internal/pycore_code.h | 1 - Include/internal/pycore_opcode.h | 2 +- Lib/importlib/_bootstrap_external.py | 3 +- Lib/opcode.py | 1 - Lib/test/test_dis.py | 258 +++++++++--------- ...3-03-25-23-24-38.gh-issue-88691.2SWBd1.rst | 1 + Programs/test_frozenmain.h | 66 ++--- Python/bytecodes.c | 43 +-- Python/generated_cases.c.h | 146 +++++----- Python/opcode_metadata.h | 38 +-- Python/specialize.c | 5 - 12 files changed, 285 insertions(+), 281 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-25-23-24-38.gh-issue-88691.2SWBd1.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 8703cddb3448cc..19c08b225ef2bc 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -59,7 +59,7 @@ the following command can be used to display the disassembly of 3 2 LOAD_GLOBAL 1 (NULL + len) 12 LOAD_FAST 0 (alist) 14 CALL 1 - 24 RETURN_VALUE + 22 RETURN_VALUE (The "2" is a line number). diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 7f3148a38ff13e..faf1be585e17ef 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -73,7 +73,6 @@ typedef struct { typedef struct { uint16_t counter; uint16_t func_version[2]; - uint16_t min_args; } _PyCallCache; #define INLINE_CACHE_ENTRIES_CALL CACHE_ENTRIES(_PyCallCache) diff --git a/Include/internal/pycore_opcode.h b/Include/internal/pycore_opcode.h index 58f7da51aebd5e..81ca91465950b7 100644 --- a/Include/internal/pycore_opcode.h +++ b/Include/internal/pycore_opcode.h @@ -55,7 +55,7 @@ const uint8_t _PyOpcode_Caches[256] = { [LOAD_GLOBAL] = 4, [BINARY_OP] = 1, [SEND] = 1, - [CALL] = 4, + [CALL] = 3, }; const uint8_t _PyOpcode_Deopt[256] = { diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 9c4c5f907744cd..de6c434450fc82 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -438,6 +438,7 @@ def _write_atomic(path, data, mode=0o666): # Python 3.12a7 3522 (Removed JUMP_IF_FALSE_OR_POP/JUMP_IF_TRUE_OR_POP) # Python 3.12a7 3523 (Convert COMPARE_AND_BRANCH back to COMPARE_OP) # Python 3.12a7 3524 (Shrink the BINARY_SUBSCR caches) +# Python 3.12b1 3525 (Shrink the CALL caches) # Python 3.13 will start with 3550 @@ -454,7 +455,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3524).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3525).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c diff --git a/Lib/opcode.py b/Lib/opcode.py index 16a61dff47b5b3..b62dfa1bcb42c5 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -410,7 +410,6 @@ def pseudo_op(name, op, real_ops): "CALL": { "counter": 1, "func_version": 2, - "min_args": 1, }, "STORE_SUBSCR": { "counter": 1, diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 7e501045662f4c..4a2144743f6567 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -138,10 +138,10 @@ def bug708901(): %3d CALL 2 GET_ITER - >> FOR_ITER 2 (to 36) + >> FOR_ITER 2 (to 34) STORE_FAST 0 (res) -%3d JUMP_BACKWARD 4 (to 28) +%3d JUMP_BACKWARD 4 (to 26) %3d >> END_FOR RETURN_CONST 0 (None) @@ -437,7 +437,7 @@ def _with(c): %3d >> PUSH_EXC_INFO WITH_EXCEPT_START - POP_JUMP_IF_TRUE 1 (to 44) + POP_JUMP_IF_TRUE 1 (to 42) RERAISE 2 >> POP_TOP POP_EXCEPT @@ -492,10 +492,10 @@ async def _asyncwith(c): CALL 2 GET_AWAITABLE 2 LOAD_CONST 0 (None) - >> SEND 3 (to 64) + >> SEND 3 (to 62) YIELD_VALUE 2 RESUME 3 - JUMP_BACKWARD_NO_INTERRUPT 5 (to 54) + JUMP_BACKWARD_NO_INTERRUPT 5 (to 52) >> POP_TOP POP_TOP @@ -504,21 +504,21 @@ async def _asyncwith(c): RETURN_CONST 0 (None) %3d >> CLEANUP_THROW - JUMP_BACKWARD 27 (to 24) + JUMP_BACKWARD 26 (to 24) >> CLEANUP_THROW - JUMP_BACKWARD 9 (to 64) + JUMP_BACKWARD 9 (to 62) >> PUSH_EXC_INFO WITH_EXCEPT_START GET_AWAITABLE 2 LOAD_CONST 0 (None) - >> SEND 4 (to 102) + >> SEND 4 (to 100) YIELD_VALUE 3 RESUME 3 - JUMP_BACKWARD_NO_INTERRUPT 5 (to 90) + JUMP_BACKWARD_NO_INTERRUPT 5 (to 88) >> CLEANUP_THROW >> SWAP 2 POP_TOP - POP_JUMP_IF_TRUE 1 (to 110) + POP_JUMP_IF_TRUE 1 (to 108) RERAISE 2 >> POP_TOP POP_EXCEPT @@ -730,14 +730,14 @@ def loop_test(): LOAD_CONST 2 (3) BINARY_OP 5 (*) GET_ITER - >> FOR_ITER_LIST 14 (to 48) + >> FOR_ITER_LIST 13 (to 46) STORE_FAST 0 (i) %3d LOAD_GLOBAL_MODULE 1 (NULL + load_test) LOAD_FAST 0 (i) CALL_PY_WITH_DEFAULTS 1 POP_TOP - JUMP_BACKWARD 16 (to 16) + JUMP_BACKWARD 15 (to 16) %3d >> END_FOR RETURN_CONST 0 (None) @@ -1193,7 +1193,7 @@ def test_show_caches(self): caches = list(self.get_cached_values(quickened, adaptive)) for cache in caches: self.assertRegex(cache, pattern) - total_caches = 22 + total_caches = 20 empty_caches = 7 self.assertEqual(caches.count(""), empty_caches) self.assertEqual(len(caches), total_caches) @@ -1524,9 +1524,9 @@ def _prepare_test_cases(): Instruction(opname='BUILD_MAP', opcode=105, arg=0, argval=0, argrepr='', offset=40, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='Hello world!', argrepr="'Hello world!'", offset=42, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='CALL', opcode=171, arg=7, argval=7, argrepr='', offset=44, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=54, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='f', argrepr='f', offset=56, starts_line=8, is_jump_target=False, positions=None), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=58, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=52, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='f', argrepr='f', offset=54, starts_line=8, is_jump_target=False, positions=None), + Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=56, starts_line=None, is_jump_target=False, positions=None), ] expected_opinfo_f = [ @@ -1549,9 +1549,9 @@ def _prepare_test_cases(): Instruction(opname='LOAD_DEREF', opcode=137, arg=0, argval='c', argrepr='c', offset=40, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_DEREF', opcode=137, arg=1, argval='d', argrepr='d', offset=42, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='CALL', opcode=171, arg=4, argval=4, argrepr='', offset=44, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=54, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='inner', argrepr='inner', offset=56, starts_line=6, is_jump_target=False, positions=None), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=58, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=52, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='inner', argrepr='inner', offset=54, starts_line=6, is_jump_target=False, positions=None), + Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=56, starts_line=None, is_jump_target=False, positions=None), ] expected_opinfo_inner = [ @@ -1565,8 +1565,8 @@ def _prepare_test_cases(): Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='e', argrepr='e', offset=22, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_FAST', opcode=124, arg=1, argval='f', argrepr='f', offset=24, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='CALL', opcode=171, arg=6, argval=6, argrepr='', offset=26, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=36, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RETURN_CONST', opcode=121, arg=0, argval=None, argrepr='None', offset=38, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=34, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RETURN_CONST', opcode=121, arg=0, argval=None, argrepr='None', offset=36, starts_line=None, is_jump_target=False, positions=None), ] expected_opinfo_jumpy = [ @@ -1574,115 +1574,115 @@ def _prepare_test_cases(): Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='range', argrepr='NULL + range', offset=2, starts_line=3, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=10, argrepr='10', offset=12, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=14, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='GET_ITER', opcode=68, arg=None, argval=None, argrepr='', offset=24, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='FOR_ITER', opcode=93, arg=27, argval=84, argrepr='to 84', offset=26, starts_line=None, is_jump_target=True, positions=None), - Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=30, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=32, starts_line=4, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=42, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=44, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=54, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=56, starts_line=5, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=58, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=107, arg=2, argval='<', argrepr='<', offset=60, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=1, argval=68, argrepr='to 68', offset=64, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=140, arg=21, argval=26, argrepr='to 26', offset=66, starts_line=6, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=68, starts_line=7, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=70, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=107, arg=68, argval='>', argrepr='>', offset=72, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=1, argval=80, argrepr='to 80', offset=76, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=140, arg=27, argval=26, argrepr='to 26', offset=78, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=80, starts_line=8, is_jump_target=True, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=13, argval=110, argrepr='to 110', offset=82, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='END_FOR', opcode=4, arg=None, argval=None, argrepr='', offset=84, starts_line=3, is_jump_target=True, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=86, starts_line=10, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=96, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=98, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=108, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST_CHECK', opcode=127, arg=0, argval='i', argrepr='i', offset=110, starts_line=11, is_jump_target=True, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=32, argval=178, argrepr='to 178', offset=112, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=114, starts_line=12, is_jump_target=True, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=124, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=126, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=136, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=138, starts_line=13, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=140, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='BINARY_OP', opcode=122, arg=23, argval=23, argrepr='-=', offset=142, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=146, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=148, starts_line=14, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=150, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=107, arg=68, argval='>', argrepr='>', offset=152, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=1, argval=160, argrepr='to 160', offset=156, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=140, arg=25, argval=110, argrepr='to 110', offset=158, starts_line=15, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=160, starts_line=16, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=162, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=107, arg=2, argval='<', argrepr='<', offset=164, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=1, argval=172, argrepr='to 172', offset=168, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=15, argval=202, argrepr='to 202', offset=170, starts_line=17, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=172, starts_line=11, is_jump_target=True, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=1, argval=178, argrepr='to 178', offset=174, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=140, arg=32, argval=114, argrepr='to 114', offset=176, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=178, starts_line=19, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=188, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=190, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=200, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='NOP', opcode=9, arg=None, argval=None, argrepr='', offset=202, starts_line=20, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=204, starts_line=21, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=206, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='BINARY_OP', opcode=122, arg=11, argval=11, argrepr='/', offset=208, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=212, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=214, starts_line=25, is_jump_target=False, positions=None), - Instruction(opname='BEFORE_WITH', opcode=53, arg=None, argval=None, argrepr='', offset=216, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=218, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=220, starts_line=26, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Never reach this', argrepr="'Never reach this'", offset=230, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=232, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=242, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=244, starts_line=25, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=246, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=248, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=2, argval=2, argrepr='', offset=250, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=260, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=262, starts_line=28, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=272, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=274, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='GET_ITER', opcode=68, arg=None, argval=None, argrepr='', offset=22, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='FOR_ITER', opcode=93, arg=26, argval=80, argrepr='to 80', offset=24, starts_line=None, is_jump_target=True, positions=None), + Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=28, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=30, starts_line=4, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=40, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=42, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=50, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=52, starts_line=5, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=54, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=107, arg=2, argval='<', argrepr='<', offset=56, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=1, argval=64, argrepr='to 64', offset=60, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=140, arg=20, argval=24, argrepr='to 24', offset=62, starts_line=6, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=64, starts_line=7, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=66, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=107, arg=68, argval='>', argrepr='>', offset=68, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=1, argval=76, argrepr='to 76', offset=72, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=140, arg=26, argval=24, argrepr='to 24', offset=74, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=76, starts_line=8, is_jump_target=True, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=12, argval=104, argrepr='to 104', offset=78, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='END_FOR', opcode=4, arg=None, argval=None, argrepr='', offset=80, starts_line=3, is_jump_target=True, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=82, starts_line=10, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=92, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=94, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=102, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST_CHECK', opcode=127, arg=0, argval='i', argrepr='i', offset=104, starts_line=11, is_jump_target=True, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=31, argval=170, argrepr='to 170', offset=106, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=108, starts_line=12, is_jump_target=True, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=118, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=120, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=128, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=130, starts_line=13, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=132, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='BINARY_OP', opcode=122, arg=23, argval=23, argrepr='-=', offset=134, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=138, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=140, starts_line=14, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=142, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=107, arg=68, argval='>', argrepr='>', offset=144, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=1, argval=152, argrepr='to 152', offset=148, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=140, arg=24, argval=104, argrepr='to 104', offset=150, starts_line=15, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=152, starts_line=16, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=154, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=107, arg=2, argval='<', argrepr='<', offset=156, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=1, argval=164, argrepr='to 164', offset=160, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=14, argval=192, argrepr='to 192', offset=162, starts_line=17, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=164, starts_line=11, is_jump_target=True, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=1, argval=170, argrepr='to 170', offset=166, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=140, arg=31, argval=108, argrepr='to 108', offset=168, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=170, starts_line=19, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=180, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=182, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=190, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='NOP', opcode=9, arg=None, argval=None, argrepr='', offset=192, starts_line=20, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=194, starts_line=21, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=196, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='BINARY_OP', opcode=122, arg=11, argval=11, argrepr='/', offset=198, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=202, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=204, starts_line=25, is_jump_target=False, positions=None), + Instruction(opname='BEFORE_WITH', opcode=53, arg=None, argval=None, argrepr='', offset=206, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=208, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=210, starts_line=26, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Never reach this', argrepr="'Never reach this'", offset=220, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=222, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=230, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=232, starts_line=25, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=234, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=236, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=2, argval=2, argrepr='', offset=238, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=246, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=248, starts_line=28, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=258, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=260, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=268, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RETURN_CONST', opcode=121, arg=0, argval=None, argrepr='None', offset=270, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=272, starts_line=25, is_jump_target=False, positions=None), + Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=274, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=1, argval=280, argrepr='to 280', offset=276, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=2, argval=2, argrepr='', offset=278, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=280, starts_line=None, is_jump_target=True, positions=None), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=282, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=284, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RETURN_CONST', opcode=121, arg=0, argval=None, argrepr='None', offset=286, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=288, starts_line=25, is_jump_target=False, positions=None), - Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=290, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=1, argval=296, argrepr='to 296', offset=292, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=2, argval=2, argrepr='', offset=294, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=296, starts_line=None, is_jump_target=True, positions=None), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=298, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=300, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=302, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=140, arg=22, argval=262, argrepr='to 262', offset=304, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=306, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=308, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=310, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=312, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=314, starts_line=22, is_jump_target=False, positions=None), - Instruction(opname='CHECK_EXC_MATCH', opcode=36, arg=None, argval=None, argrepr='', offset=324, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=15, argval=358, argrepr='to 358', offset=326, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=328, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=330, starts_line=23, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=340, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=342, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=352, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=354, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=140, arg=48, argval=262, argrepr='to 262', offset=356, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=358, starts_line=22, is_jump_target=True, positions=None), - Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=360, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=362, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=364, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=366, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=368, starts_line=28, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=378, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=380, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=390, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=392, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=394, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=396, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=398, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=286, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=140, arg=21, argval=248, argrepr='to 248', offset=288, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=290, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=292, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=294, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=296, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=298, starts_line=22, is_jump_target=False, positions=None), + Instruction(opname='CHECK_EXC_MATCH', opcode=36, arg=None, argval=None, argrepr='', offset=308, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=14, argval=340, argrepr='to 340', offset=310, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=312, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=314, starts_line=23, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=324, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=326, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=334, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=336, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=140, arg=46, argval=248, argrepr='to 248', offset=338, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=340, starts_line=22, is_jump_target=True, positions=None), + Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=342, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=344, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=346, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=348, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=350, starts_line=28, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=360, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=362, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=370, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=372, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=374, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=376, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=378, starts_line=None, is_jump_target=False, positions=None), ] # One last piece of inspect fodder to check the default line number handling diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-25-23-24-38.gh-issue-88691.2SWBd1.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-25-23-24-38.gh-issue-88691.2SWBd1.rst new file mode 100644 index 00000000000000..761d45b0a3a84f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-03-25-23-24-38.gh-issue-88691.2SWBd1.rst @@ -0,0 +1 @@ +Reduce the number of inline :opcode:`CACHE` entries for :opcode:`CALL`. diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h index c33bb18f4da8b3..4ac472a88261e1 100644 --- a/Programs/test_frozenmain.h +++ b/Programs/test_frozenmain.h @@ -1,38 +1,38 @@ // Auto-generated by Programs/freeze_test_frozenmain.py unsigned char M_test_frozenmain[] = { 227,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0, - 0,0,0,0,0,243,170,0,0,0,151,0,100,0,100,1, + 0,0,0,0,0,243,162,0,0,0,151,0,100,0,100,1, 108,0,90,0,100,0,100,1,108,1,90,1,2,0,101,2, - 100,2,171,1,0,0,0,0,0,0,0,0,1,0,2,0, - 101,2,100,3,101,0,106,6,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,171,2,0,0,0,0, - 0,0,0,0,1,0,2,0,101,1,106,8,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,0, - 0,0,0,0,0,0,0,0,100,4,25,0,0,0,90,5, - 100,5,68,0,93,20,0,0,90,6,2,0,101,2,100,6, - 101,6,155,0,100,7,101,5,101,6,25,0,0,0,155,0, - 157,4,171,1,0,0,0,0,0,0,0,0,1,0,140,22, - 4,0,121,1,41,8,233,0,0,0,0,78,122,18,70,114, - 111,122,101,110,32,72,101,108,108,111,32,87,111,114,108,100, - 122,8,115,121,115,46,97,114,103,118,218,6,99,111,110,102, - 105,103,41,5,218,12,112,114,111,103,114,97,109,95,110,97, - 109,101,218,10,101,120,101,99,117,116,97,98,108,101,218,15, - 117,115,101,95,101,110,118,105,114,111,110,109,101,110,116,218, - 17,99,111,110,102,105,103,117,114,101,95,99,95,115,116,100, - 105,111,218,14,98,117,102,102,101,114,101,100,95,115,116,100, - 105,111,122,7,99,111,110,102,105,103,32,122,2,58,32,41, - 7,218,3,115,121,115,218,17,95,116,101,115,116,105,110,116, - 101,114,110,97,108,99,97,112,105,218,5,112,114,105,110,116, - 218,4,97,114,103,118,218,11,103,101,116,95,99,111,110,102, - 105,103,115,114,3,0,0,0,218,3,107,101,121,169,0,243, - 0,0,0,0,250,18,116,101,115,116,95,102,114,111,122,101, - 110,109,97,105,110,46,112,121,250,8,60,109,111,100,117,108, - 101,62,114,18,0,0,0,1,0,0,0,115,100,0,0,0, - 240,3,1,1,1,243,8,0,1,11,219,0,24,225,0,5, - 208,6,26,213,0,27,217,0,5,128,106,144,35,151,40,145, - 40,213,0,27,216,9,38,208,9,26,215,9,38,209,9,38, - 212,9,40,168,24,209,9,50,128,6,240,2,6,12,2,242, - 0,7,1,42,128,67,241,14,0,5,10,208,10,40,144,67, - 209,10,40,152,54,160,35,153,59,209,10,40,214,4,41,241, - 15,7,1,42,114,16,0,0,0, + 100,2,171,1,0,0,0,0,0,0,1,0,2,0,101,2, + 100,3,101,0,106,6,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,171,2,0,0,0,0,0,0, + 1,0,2,0,101,1,106,8,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,0, + 0,0,100,4,25,0,0,0,90,5,100,5,68,0,93,19, + 0,0,90,6,2,0,101,2,100,6,101,6,155,0,100,7, + 101,5,101,6,25,0,0,0,155,0,157,4,171,1,0,0, + 0,0,0,0,1,0,140,21,4,0,121,1,41,8,233,0, + 0,0,0,78,122,18,70,114,111,122,101,110,32,72,101,108, + 108,111,32,87,111,114,108,100,122,8,115,121,115,46,97,114, + 103,118,218,6,99,111,110,102,105,103,41,5,218,12,112,114, + 111,103,114,97,109,95,110,97,109,101,218,10,101,120,101,99, + 117,116,97,98,108,101,218,15,117,115,101,95,101,110,118,105, + 114,111,110,109,101,110,116,218,17,99,111,110,102,105,103,117, + 114,101,95,99,95,115,116,100,105,111,218,14,98,117,102,102, + 101,114,101,100,95,115,116,100,105,111,122,7,99,111,110,102, + 105,103,32,122,2,58,32,41,7,218,3,115,121,115,218,17, + 95,116,101,115,116,105,110,116,101,114,110,97,108,99,97,112, + 105,218,5,112,114,105,110,116,218,4,97,114,103,118,218,11, + 103,101,116,95,99,111,110,102,105,103,115,114,3,0,0,0, + 218,3,107,101,121,169,0,243,0,0,0,0,250,18,116,101, + 115,116,95,102,114,111,122,101,110,109,97,105,110,46,112,121, + 250,8,60,109,111,100,117,108,101,62,114,18,0,0,0,1, + 0,0,0,115,100,0,0,0,240,3,1,1,1,243,8,0, + 1,11,219,0,24,225,0,5,208,6,26,212,0,27,217,0, + 5,128,106,144,35,151,40,145,40,212,0,27,216,9,38,208, + 9,26,215,9,38,209,9,38,211,9,40,168,24,209,9,50, + 128,6,240,2,6,12,2,242,0,7,1,42,128,67,241,14, + 0,5,10,208,10,40,144,67,209,10,40,152,54,160,35,153, + 59,209,10,40,213,4,41,241,15,7,1,42,114,16,0,0, + 0, }; diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 617b6f311e2f77..72f85cc92b0c92 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -2318,7 +2318,7 @@ dummy_func( kwnames = GETITEM(frame->f_code->co_consts, oparg); } - // Cache layout: counter/1, func_version/2, min_args/1 + // Cache layout: counter/1, func_version/2 // Neither CALL_INTRINSIC_1/2 nor CALL_FUNCTION_EX are members! family(call, INLINE_CACHE_ENTRIES_CALL) = { CALL, @@ -2348,7 +2348,7 @@ dummy_func( // (Some args may be keywords, see KW_NAMES, which sets 'kwnames'.) // On exit, the stack is [result]. // When calling Python, inline the call using DISPATCH_INLINED(). - inst(CALL, (unused/1, unused/2, unused/1, method, callable, args[oparg] -- res)) { + inst(CALL, (unused/1, unused/2, method, callable, args[oparg] -- res)) { int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -2426,7 +2426,7 @@ dummy_func( // Start out with [NULL, bound_method, arg1, arg2, ...] // Transform to [callable, self, arg1, arg2, ...] // Then fall through to CALL_PY_EXACT_ARGS - inst(CALL_BOUND_METHOD_EXACT_ARGS, (unused/1, unused/2, unused/1, method, callable, unused[oparg] -- unused)) { + inst(CALL_BOUND_METHOD_EXACT_ARGS, (unused/1, unused/2, method, callable, unused[oparg] -- unused)) { DEOPT_IF(method != NULL, CALL); DEOPT_IF(Py_TYPE(callable) != &PyMethod_Type, CALL); STAT_INC(CALL, hit); @@ -2438,7 +2438,7 @@ dummy_func( GO_TO_INSTRUCTION(CALL_PY_EXACT_ARGS); } - inst(CALL_PY_EXACT_ARGS, (unused/1, func_version/2, unused/1, method, callable, args[oparg] -- unused)) { + inst(CALL_PY_EXACT_ARGS, (unused/1, func_version/2, method, callable, args[oparg] -- unused)) { assert(kwnames == NULL); DEOPT_IF(tstate->interp->eval_frame, CALL); int is_meth = method != NULL; @@ -2465,7 +2465,7 @@ dummy_func( DISPATCH_INLINED(new_frame); } - inst(CALL_PY_WITH_DEFAULTS, (unused/1, func_version/2, min_args/1, method, callable, args[oparg] -- unused)) { + inst(CALL_PY_WITH_DEFAULTS, (unused/1, func_version/2, method, callable, args[oparg] -- unused)) { assert(kwnames == NULL); DEOPT_IF(tstate->interp->eval_frame, CALL); int is_meth = method != NULL; @@ -2479,6 +2479,11 @@ dummy_func( PyFunctionObject *func = (PyFunctionObject *)callable; DEOPT_IF(func->func_version != func_version, CALL); PyCodeObject *code = (PyCodeObject *)func->func_code; + assert(func->func_defaults); + assert(PyTuple_CheckExact(func->func_defaults)); + int defcount = (int)PyTuple_GET_SIZE(func->func_defaults); + assert(defcount <= code->co_argcount); + int min_args = code->co_argcount - defcount; DEOPT_IF(argcount > code->co_argcount, CALL); DEOPT_IF(argcount < min_args, CALL); DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize), CALL); @@ -2497,7 +2502,7 @@ dummy_func( DISPATCH_INLINED(new_frame); } - inst(CALL_NO_KW_TYPE_1, (unused/1, unused/2, unused/1, null, callable, args[oparg] -- res)) { + inst(CALL_NO_KW_TYPE_1, (unused/1, unused/2, null, callable, args[oparg] -- res)) { assert(kwnames == NULL); assert(cframe.use_tracing == 0); assert(oparg == 1); @@ -2510,7 +2515,7 @@ dummy_func( Py_DECREF(&PyType_Type); // I.e., callable } - inst(CALL_NO_KW_STR_1, (unused/1, unused/2, unused/1, null, callable, args[oparg] -- res)) { + inst(CALL_NO_KW_STR_1, (unused/1, unused/2, null, callable, args[oparg] -- res)) { assert(kwnames == NULL); assert(cframe.use_tracing == 0); assert(oparg == 1); @@ -2525,7 +2530,7 @@ dummy_func( CHECK_EVAL_BREAKER(); } - inst(CALL_NO_KW_TUPLE_1, (unused/1, unused/2, unused/1, null, callable, args[oparg] -- res)) { + inst(CALL_NO_KW_TUPLE_1, (unused/1, unused/2, null, callable, args[oparg] -- res)) { assert(kwnames == NULL); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); @@ -2539,7 +2544,7 @@ dummy_func( CHECK_EVAL_BREAKER(); } - inst(CALL_BUILTIN_CLASS, (unused/1, unused/2, unused/1, method, callable, args[oparg] -- res)) { + inst(CALL_BUILTIN_CLASS, (unused/1, unused/2, method, callable, args[oparg] -- res)) { int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -2564,7 +2569,7 @@ dummy_func( CHECK_EVAL_BREAKER(); } - inst(CALL_NO_KW_BUILTIN_O, (unused/1, unused/2, unused/1, method, callable, args[oparg] -- res)) { + inst(CALL_NO_KW_BUILTIN_O, (unused/1, unused/2, method, callable, args[oparg] -- res)) { assert(cframe.use_tracing == 0); /* Builtin METH_O functions */ assert(kwnames == NULL); @@ -2596,7 +2601,7 @@ dummy_func( CHECK_EVAL_BREAKER(); } - inst(CALL_NO_KW_BUILTIN_FAST, (unused/1, unused/2, unused/1, method, callable, args[oparg] -- res)) { + inst(CALL_NO_KW_BUILTIN_FAST, (unused/1, unused/2, method, callable, args[oparg] -- res)) { assert(cframe.use_tracing == 0); /* Builtin METH_FASTCALL functions, without keywords */ assert(kwnames == NULL); @@ -2632,7 +2637,7 @@ dummy_func( CHECK_EVAL_BREAKER(); } - inst(CALL_BUILTIN_FAST_WITH_KEYWORDS, (unused/1, unused/2, unused/1, method, callable, args[oparg] -- res)) { + inst(CALL_BUILTIN_FAST_WITH_KEYWORDS, (unused/1, unused/2, method, callable, args[oparg] -- res)) { assert(cframe.use_tracing == 0); /* Builtin METH_FASTCALL | METH_KEYWORDS functions */ int is_meth = method != NULL; @@ -2668,7 +2673,7 @@ dummy_func( CHECK_EVAL_BREAKER(); } - inst(CALL_NO_KW_LEN, (unused/1, unused/2, unused/1, method, callable, args[oparg] -- res)) { + inst(CALL_NO_KW_LEN, (unused/1, unused/2, method, callable, args[oparg] -- res)) { assert(cframe.use_tracing == 0); assert(kwnames == NULL); /* len(o) */ @@ -2696,7 +2701,7 @@ dummy_func( ERROR_IF(res == NULL, error); } - inst(CALL_NO_KW_ISINSTANCE, (unused/1, unused/2, unused/1, method, callable, args[oparg] -- res)) { + inst(CALL_NO_KW_ISINSTANCE, (unused/1, unused/2, method, callable, args[oparg] -- res)) { assert(cframe.use_tracing == 0); assert(kwnames == NULL); /* isinstance(o, o2) */ @@ -2727,7 +2732,7 @@ dummy_func( } // This is secretly a super-instruction - inst(CALL_NO_KW_LIST_APPEND, (unused/1, unused/2, unused/1, method, self, args[oparg] -- unused)) { + inst(CALL_NO_KW_LIST_APPEND, (unused/1, unused/2, method, self, args[oparg] -- unused)) { assert(cframe.use_tracing == 0); assert(kwnames == NULL); assert(oparg == 1); @@ -2748,7 +2753,7 @@ dummy_func( DISPATCH(); } - inst(CALL_NO_KW_METHOD_DESCRIPTOR_O, (unused/1, unused/2, unused/1, method, unused, args[oparg] -- res)) { + inst(CALL_NO_KW_METHOD_DESCRIPTOR_O, (unused/1, unused/2, method, unused, args[oparg] -- res)) { assert(kwnames == NULL); int is_meth = method != NULL; int total_args = oparg; @@ -2782,7 +2787,7 @@ dummy_func( CHECK_EVAL_BREAKER(); } - inst(CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, (unused/1, unused/2, unused/1, method, unused, args[oparg] -- res)) { + inst(CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, (unused/1, unused/2, method, unused, args[oparg] -- res)) { int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -2814,7 +2819,7 @@ dummy_func( CHECK_EVAL_BREAKER(); } - inst(CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS, (unused/1, unused/2, unused/1, method, unused, args[oparg] -- res)) { + inst(CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS, (unused/1, unused/2, method, unused, args[oparg] -- res)) { assert(kwnames == NULL); assert(oparg == 0 || oparg == 1); int is_meth = method != NULL; @@ -2846,7 +2851,7 @@ dummy_func( CHECK_EVAL_BREAKER(); } - inst(CALL_NO_KW_METHOD_DESCRIPTOR_FAST, (unused/1, unused/2, unused/1, method, unused, args[oparg] -- res)) { + inst(CALL_NO_KW_METHOD_DESCRIPTOR_FAST, (unused/1, unused/2, method, unused, args[oparg] -- res)) { assert(kwnames == NULL); int is_meth = method != NULL; int total_args = oparg; diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 7df585be0bef50..420d136bb98158 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -3301,7 +3301,7 @@ TARGET(CALL) { PREDICTED(CALL); - static_assert(INLINE_CACHE_ENTRIES_CALL == 4, "incorrect cache size"); + static_assert(INLINE_CACHE_ENTRIES_CALL == 3, "incorrect cache size"); PyObject **args = (stack_pointer - oparg); PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; @@ -3382,7 +3382,7 @@ STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 3; CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -3442,7 +3442,6 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; uint32_t func_version = read_u32(&next_instr[1].cache); - uint16_t min_args = read_u16(&next_instr[3].cache); #line 2469 "Python/bytecodes.c" assert(kwnames == NULL); DEOPT_IF(tstate->interp->eval_frame, CALL); @@ -3457,6 +3456,11 @@ PyFunctionObject *func = (PyFunctionObject *)callable; DEOPT_IF(func->func_version != func_version, CALL); PyCodeObject *code = (PyCodeObject *)func->func_code; + assert(func->func_defaults); + assert(PyTuple_CheckExact(func->func_defaults)); + int defcount = (int)PyTuple_GET_SIZE(func->func_defaults); + assert(defcount <= code->co_argcount); + int min_args = code->co_argcount - defcount; DEOPT_IF(argcount > code->co_argcount, CALL); DEOPT_IF(argcount < min_args, CALL); DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize), CALL); @@ -3473,7 +3477,7 @@ STACK_SHRINK(oparg + 2); JUMPBY(INLINE_CACHE_ENTRIES_CALL); DISPATCH_INLINED(new_frame); - #line 3477 "Python/generated_cases.c.h" + #line 3481 "Python/generated_cases.c.h" } TARGET(CALL_NO_KW_TYPE_1) { @@ -3481,7 +3485,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2501 "Python/bytecodes.c" + #line 2506 "Python/bytecodes.c" assert(kwnames == NULL); assert(cframe.use_tracing == 0); assert(oparg == 1); @@ -3492,11 +3496,11 @@ res = Py_NewRef(Py_TYPE(obj)); Py_DECREF(obj); Py_DECREF(&PyType_Type); // I.e., callable - #line 3496 "Python/generated_cases.c.h" + #line 3500 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 3; DISPATCH(); } @@ -3505,7 +3509,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2514 "Python/bytecodes.c" + #line 2519 "Python/bytecodes.c" assert(kwnames == NULL); assert(cframe.use_tracing == 0); assert(oparg == 1); @@ -3517,11 +3521,11 @@ Py_DECREF(arg); Py_DECREF(&PyUnicode_Type); // I.e., callable if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3521 "Python/generated_cases.c.h" + #line 3525 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 3; CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -3531,7 +3535,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2529 "Python/bytecodes.c" + #line 2534 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); @@ -3542,11 +3546,11 @@ Py_DECREF(arg); Py_DECREF(&PyTuple_Type); // I.e., tuple if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3546 "Python/generated_cases.c.h" + #line 3550 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 3; CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -3556,7 +3560,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2543 "Python/bytecodes.c" + #line 2548 "Python/bytecodes.c" int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -3578,11 +3582,11 @@ } Py_DECREF(tp); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3582 "Python/generated_cases.c.h" + #line 3586 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 3; CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -3592,7 +3596,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2568 "Python/bytecodes.c" + #line 2573 "Python/bytecodes.c" assert(cframe.use_tracing == 0); /* Builtin METH_O functions */ assert(kwnames == NULL); @@ -3621,11 +3625,11 @@ Py_DECREF(arg); Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3625 "Python/generated_cases.c.h" + #line 3629 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 3; CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -3635,7 +3639,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2600 "Python/bytecodes.c" + #line 2605 "Python/bytecodes.c" assert(cframe.use_tracing == 0); /* Builtin METH_FASTCALL functions, without keywords */ assert(kwnames == NULL); @@ -3668,11 +3672,11 @@ 'invalid'). In those cases an exception is set, so we must handle it. */ - #line 3672 "Python/generated_cases.c.h" + #line 3676 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 3; CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -3682,7 +3686,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2636 "Python/bytecodes.c" + #line 2641 "Python/bytecodes.c" assert(cframe.use_tracing == 0); /* Builtin METH_FASTCALL | METH_KEYWORDS functions */ int is_meth = method != NULL; @@ -3715,11 +3719,11 @@ } Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3719 "Python/generated_cases.c.h" + #line 3723 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 3; CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -3729,7 +3733,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2672 "Python/bytecodes.c" + #line 2677 "Python/bytecodes.c" assert(cframe.use_tracing == 0); assert(kwnames == NULL); /* len(o) */ @@ -3755,11 +3759,11 @@ Py_DECREF(callable); Py_DECREF(arg); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3759 "Python/generated_cases.c.h" + #line 3763 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 3; DISPATCH(); } @@ -3768,7 +3772,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2700 "Python/bytecodes.c" + #line 2705 "Python/bytecodes.c" assert(cframe.use_tracing == 0); assert(kwnames == NULL); /* isinstance(o, o2) */ @@ -3796,11 +3800,11 @@ Py_DECREF(cls); Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3800 "Python/generated_cases.c.h" + #line 3804 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 3; DISPATCH(); } @@ -3808,7 +3812,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *self = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; - #line 2731 "Python/bytecodes.c" + #line 2736 "Python/bytecodes.c" assert(cframe.use_tracing == 0); assert(kwnames == NULL); assert(oparg == 1); @@ -3827,14 +3831,14 @@ JUMPBY(INLINE_CACHE_ENTRIES_CALL + 1); assert(next_instr[-1].op.code == POP_TOP); DISPATCH(); - #line 3831 "Python/generated_cases.c.h" + #line 3835 "Python/generated_cases.c.h" } TARGET(CALL_NO_KW_METHOD_DESCRIPTOR_O) { PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2752 "Python/bytecodes.c" + #line 2757 "Python/bytecodes.c" assert(kwnames == NULL); int is_meth = method != NULL; int total_args = oparg; @@ -3865,11 +3869,11 @@ Py_DECREF(arg); Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3869 "Python/generated_cases.c.h" + #line 3873 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 3; CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -3878,7 +3882,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2786 "Python/bytecodes.c" + #line 2791 "Python/bytecodes.c" int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -3907,11 +3911,11 @@ } Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3911 "Python/generated_cases.c.h" + #line 3915 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 3; CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -3920,7 +3924,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2818 "Python/bytecodes.c" + #line 2823 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 0 || oparg == 1); int is_meth = method != NULL; @@ -3949,11 +3953,11 @@ Py_DECREF(self); Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3953 "Python/generated_cases.c.h" + #line 3957 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 3; CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -3962,7 +3966,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2850 "Python/bytecodes.c" + #line 2855 "Python/bytecodes.c" assert(kwnames == NULL); int is_meth = method != NULL; int total_args = oparg; @@ -3990,11 +3994,11 @@ } Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3994 "Python/generated_cases.c.h" + #line 3998 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; - next_instr += 4; + next_instr += 3; CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -4005,7 +4009,7 @@ PyObject *callargs = stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))]; PyObject *func = stack_pointer[-(2 + ((oparg & 1) ? 1 : 0))]; PyObject *result; - #line 2881 "Python/bytecodes.c" + #line 2886 "Python/bytecodes.c" if (oparg & 1) { // DICT_MERGE is called before this opcode if there are kwargs. // It converts all dict subtypes in kwargs into regular dicts. @@ -4024,15 +4028,15 @@ assert(PyTuple_CheckExact(callargs)); result = do_call_core(tstate, func, callargs, kwargs, cframe.use_tracing); - #line 4028 "Python/generated_cases.c.h" + #line 4032 "Python/generated_cases.c.h" Py_DECREF(func); Py_DECREF(callargs); Py_XDECREF(kwargs); - #line 2900 "Python/bytecodes.c" + #line 2905 "Python/bytecodes.c" assert(PEEK(3 + (oparg & 1)) == NULL); if (result == NULL) { STACK_SHRINK(((oparg & 1) ? 1 : 0)); goto pop_3_error; } - #line 4036 "Python/generated_cases.c.h" + #line 4040 "Python/generated_cases.c.h" STACK_SHRINK(((oparg & 1) ? 1 : 0)); STACK_SHRINK(2); stack_pointer[-1] = result; @@ -4047,7 +4051,7 @@ PyObject *kwdefaults = (oparg & 0x02) ? stack_pointer[-(1 + ((oparg & 0x08) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0))] : NULL; PyObject *defaults = (oparg & 0x01) ? stack_pointer[-(1 + ((oparg & 0x08) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0) + ((oparg & 0x01) ? 1 : 0))] : NULL; PyObject *func; - #line 2911 "Python/bytecodes.c" + #line 2916 "Python/bytecodes.c" PyFunctionObject *func_obj = (PyFunctionObject *) PyFunction_New(codeobj, GLOBALS()); @@ -4076,14 +4080,14 @@ func_obj->func_version = ((PyCodeObject *)codeobj)->co_version; func = (PyObject *)func_obj; - #line 4080 "Python/generated_cases.c.h" + #line 4084 "Python/generated_cases.c.h" STACK_SHRINK(((oparg & 0x01) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x08) ? 1 : 0)); stack_pointer[-1] = func; DISPATCH(); } TARGET(RETURN_GENERATOR) { - #line 2942 "Python/bytecodes.c" + #line 2947 "Python/bytecodes.c" assert(PyFunction_Check(frame->f_funcobj)); PyFunctionObject *func = (PyFunctionObject *)frame->f_funcobj; PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func); @@ -4104,7 +4108,7 @@ frame = cframe.current_frame = prev; _PyFrame_StackPush(frame, (PyObject *)gen); goto resume_frame; - #line 4108 "Python/generated_cases.c.h" + #line 4112 "Python/generated_cases.c.h" } TARGET(BUILD_SLICE) { @@ -4112,15 +4116,15 @@ PyObject *stop = stack_pointer[-(1 + ((oparg == 3) ? 1 : 0))]; PyObject *start = stack_pointer[-(2 + ((oparg == 3) ? 1 : 0))]; PyObject *slice; - #line 2965 "Python/bytecodes.c" + #line 2970 "Python/bytecodes.c" slice = PySlice_New(start, stop, step); - #line 4118 "Python/generated_cases.c.h" + #line 4122 "Python/generated_cases.c.h" Py_DECREF(start); Py_DECREF(stop); Py_XDECREF(step); - #line 2967 "Python/bytecodes.c" + #line 2972 "Python/bytecodes.c" if (slice == NULL) { STACK_SHRINK(((oparg == 3) ? 1 : 0)); goto pop_2_error; } - #line 4124 "Python/generated_cases.c.h" + #line 4128 "Python/generated_cases.c.h" STACK_SHRINK(((oparg == 3) ? 1 : 0)); STACK_SHRINK(1); stack_pointer[-1] = slice; @@ -4131,7 +4135,7 @@ PyObject *fmt_spec = ((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? stack_pointer[-((((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0))] : NULL; PyObject *value = stack_pointer[-(1 + (((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0))]; PyObject *result; - #line 2971 "Python/bytecodes.c" + #line 2976 "Python/bytecodes.c" /* Handles f-string value formatting. */ PyObject *(*conv_fn)(PyObject *); int which_conversion = oparg & FVC_MASK; @@ -4166,7 +4170,7 @@ Py_DECREF(value); Py_XDECREF(fmt_spec); if (result == NULL) { STACK_SHRINK((((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0)); goto pop_1_error; } - #line 4170 "Python/generated_cases.c.h" + #line 4174 "Python/generated_cases.c.h" STACK_SHRINK((((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0)); stack_pointer[-1] = result; DISPATCH(); @@ -4175,10 +4179,10 @@ TARGET(COPY) { PyObject *bottom = stack_pointer[-(1 + (oparg-1))]; PyObject *top; - #line 3008 "Python/bytecodes.c" + #line 3013 "Python/bytecodes.c" assert(oparg > 0); top = Py_NewRef(bottom); - #line 4182 "Python/generated_cases.c.h" + #line 4186 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = top; DISPATCH(); @@ -4190,7 +4194,7 @@ PyObject *rhs = stack_pointer[-1]; PyObject *lhs = stack_pointer[-2]; PyObject *res; - #line 3013 "Python/bytecodes.c" + #line 3018 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyBinaryOpCache *cache = (_PyBinaryOpCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -4206,12 +4210,12 @@ assert((unsigned)oparg < Py_ARRAY_LENGTH(binary_ops)); assert(binary_ops[oparg]); res = binary_ops[oparg](lhs, rhs); - #line 4210 "Python/generated_cases.c.h" + #line 4214 "Python/generated_cases.c.h" Py_DECREF(lhs); Py_DECREF(rhs); - #line 3029 "Python/bytecodes.c" + #line 3034 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; - #line 4215 "Python/generated_cases.c.h" + #line 4219 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -4221,27 +4225,27 @@ TARGET(SWAP) { PyObject *top = stack_pointer[-1]; PyObject *bottom = stack_pointer[-(2 + (oparg-2))]; - #line 3034 "Python/bytecodes.c" + #line 3039 "Python/bytecodes.c" assert(oparg >= 2); - #line 4227 "Python/generated_cases.c.h" + #line 4231 "Python/generated_cases.c.h" stack_pointer[-1] = bottom; stack_pointer[-(2 + (oparg-2))] = top; DISPATCH(); } TARGET(EXTENDED_ARG) { - #line 3038 "Python/bytecodes.c" + #line 3043 "Python/bytecodes.c" assert(oparg); assert(cframe.use_tracing == 0); opcode = next_instr->op.code; oparg = oparg << 8 | next_instr->op.arg; PRE_DISPATCH_GOTO(); DISPATCH_GOTO(); - #line 4241 "Python/generated_cases.c.h" + #line 4245 "Python/generated_cases.c.h" } TARGET(CACHE) { - #line 3047 "Python/bytecodes.c" + #line 3052 "Python/bytecodes.c" Py_UNREACHABLE(); - #line 4247 "Python/generated_cases.c.h" + #line 4251 "Python/generated_cases.c.h" } diff --git a/Python/opcode_metadata.h b/Python/opcode_metadata.h index 5c984eb4ae12e3..f57b76aeb31050 100644 --- a/Python/opcode_metadata.h +++ b/Python/opcode_metadata.h @@ -695,7 +695,7 @@ _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { } #endif -enum InstructionFormat { INSTR_FMT_IB, INSTR_FMT_IBC, INSTR_FMT_IBC000, INSTR_FMT_IBC00000000, INSTR_FMT_IBIB, INSTR_FMT_IX, INSTR_FMT_IXC, INSTR_FMT_IXC000 }; +enum InstructionFormat { INSTR_FMT_IB, INSTR_FMT_IBC, INSTR_FMT_IBC00, INSTR_FMT_IBC000, INSTR_FMT_IBC00000000, INSTR_FMT_IBIB, INSTR_FMT_IX, INSTR_FMT_IXC, INSTR_FMT_IXC000 }; struct opcode_metadata { bool valid_entry; enum InstructionFormat instr_format; @@ -844,24 +844,24 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[256] = { [LOAD_ATTR_METHOD_NO_DICT] = { true, INSTR_FMT_IBC00000000 }, [LOAD_ATTR_METHOD_LAZY_DICT] = { true, INSTR_FMT_IBC00000000 }, [KW_NAMES] = { true, INSTR_FMT_IB }, - [CALL] = { true, INSTR_FMT_IBC000 }, - [CALL_BOUND_METHOD_EXACT_ARGS] = { true, INSTR_FMT_IBC000 }, - [CALL_PY_EXACT_ARGS] = { true, INSTR_FMT_IBC000 }, - [CALL_PY_WITH_DEFAULTS] = { true, INSTR_FMT_IBC000 }, - [CALL_NO_KW_TYPE_1] = { true, INSTR_FMT_IBC000 }, - [CALL_NO_KW_STR_1] = { true, INSTR_FMT_IBC000 }, - [CALL_NO_KW_TUPLE_1] = { true, INSTR_FMT_IBC000 }, - [CALL_BUILTIN_CLASS] = { true, INSTR_FMT_IBC000 }, - [CALL_NO_KW_BUILTIN_O] = { true, INSTR_FMT_IBC000 }, - [CALL_NO_KW_BUILTIN_FAST] = { true, INSTR_FMT_IBC000 }, - [CALL_BUILTIN_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC000 }, - [CALL_NO_KW_LEN] = { true, INSTR_FMT_IBC000 }, - [CALL_NO_KW_ISINSTANCE] = { true, INSTR_FMT_IBC000 }, - [CALL_NO_KW_LIST_APPEND] = { true, INSTR_FMT_IBC000 }, - [CALL_NO_KW_METHOD_DESCRIPTOR_O] = { true, INSTR_FMT_IBC000 }, - [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC000 }, - [CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = { true, INSTR_FMT_IBC000 }, - [CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = { true, INSTR_FMT_IBC000 }, + [CALL] = { true, INSTR_FMT_IBC00 }, + [CALL_BOUND_METHOD_EXACT_ARGS] = { true, INSTR_FMT_IBC00 }, + [CALL_PY_EXACT_ARGS] = { true, INSTR_FMT_IBC00 }, + [CALL_PY_WITH_DEFAULTS] = { true, INSTR_FMT_IBC00 }, + [CALL_NO_KW_TYPE_1] = { true, INSTR_FMT_IBC00 }, + [CALL_NO_KW_STR_1] = { true, INSTR_FMT_IBC00 }, + [CALL_NO_KW_TUPLE_1] = { true, INSTR_FMT_IBC00 }, + [CALL_BUILTIN_CLASS] = { true, INSTR_FMT_IBC00 }, + [CALL_NO_KW_BUILTIN_O] = { true, INSTR_FMT_IBC00 }, + [CALL_NO_KW_BUILTIN_FAST] = { true, INSTR_FMT_IBC00 }, + [CALL_BUILTIN_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC00 }, + [CALL_NO_KW_LEN] = { true, INSTR_FMT_IBC00 }, + [CALL_NO_KW_ISINSTANCE] = { true, INSTR_FMT_IBC00 }, + [CALL_NO_KW_LIST_APPEND] = { true, INSTR_FMT_IBC00 }, + [CALL_NO_KW_METHOD_DESCRIPTOR_O] = { true, INSTR_FMT_IBC00 }, + [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC00 }, + [CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = { true, INSTR_FMT_IBC00 }, + [CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = { true, INSTR_FMT_IBC00 }, [CALL_FUNCTION_EX] = { true, INSTR_FMT_IB }, [MAKE_FUNCTION] = { true, INSTR_FMT_IB }, [RETURN_GENERATOR] = { true, INSTR_FMT_IX }, diff --git a/Python/specialize.c b/Python/specialize.c index 9187438d519b26..a9d3226ee39f5f 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -1627,17 +1627,12 @@ specialize_py_call(PyFunctionObject *func, _Py_CODEUNIT *instr, int nargs, assert(nargs <= argcount && nargs >= min_args); assert(min_args >= 0 && defcount >= 0); assert(defcount == 0 || func->func_defaults != NULL); - if (min_args > 0xffff) { - SPECIALIZATION_FAIL(CALL, SPEC_FAIL_OUT_OF_RANGE); - return -1; - } int version = _PyFunction_GetVersionForCurrentState(func); if (version == 0) { SPECIALIZATION_FAIL(CALL, SPEC_FAIL_OUT_OF_VERSIONS); return -1; } write_u32(cache->func_version, version); - cache->min_args = min_args; if (argcount == nargs) { instr->op.code = bound_method ? CALL_BOUND_METHOD_EXACT_ARGS : CALL_PY_EXACT_ARGS; } From 4ec8dd10bd4682793559c4eccbcf6ae00688c4c3 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Wed, 5 Apr 2023 17:33:52 -0700 Subject: [PATCH 078/349] gh-93910: [Enum] remove member.member deprecation (GH-103236) i.e. Color.RED.BLUE is now officially supported. --- Doc/howto/enum.rst | 7 ++- Lib/enum.py | 50 +++++++++---------- Lib/test/test_enum.py | 29 +++-------- ...3-04-04-12-43-38.gh-issue-93910.jurMzv.rst | 1 + 4 files changed, 37 insertions(+), 50 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-04-12-43-38.gh-issue-93910.jurMzv.rst diff --git a/Doc/howto/enum.rst b/Doc/howto/enum.rst index 38951ed7348f56..9390faded2fb8d 100644 --- a/Doc/howto/enum.rst +++ b/Doc/howto/enum.rst @@ -988,12 +988,11 @@ but remain normal attributes. """""""""""""""""""" Enum members are instances of their enum class, and are normally accessed as -``EnumClass.member``. In Python versions starting with ``3.5`` you could access -members from other members -- this practice is discouraged, is deprecated -in ``3.12``, and will be removed in ``3.14``. +``EnumClass.member``. In certain situations, such as writing custom enum +behavior, being able to access one member directly from another is useful, +and is supported. .. versionchanged:: 3.5 -.. versionchanged:: 3.12 Creating members that are mixed with other data types diff --git a/Lib/enum.py b/Lib/enum.py index ec698d5fa3c300..0b0629cf920506 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -201,23 +201,13 @@ def __get__(self, instance, ownerclass=None): ) else: if self.fget is None: - if self.member is None: # not sure this can happen, but just in case + # look for a member by this name. + try: + return ownerclass._member_map_[self.name] + except KeyError: raise AttributeError( '%r has no attribute %r' % (ownerclass, self.name) ) - # issue warning deprecating this behavior - import warnings - warnings.warn( - "`member.member` access (e.g. `Color.RED.BLUE`) is " - "deprecated and will be removed in 3.14.", - DeprecationWarning, - stacklevel=2, - ) - return self.member - # XXX: uncomment in 3.14 and remove warning above - # raise AttributeError( - # '%r member has no attribute %r' % (ownerclass, self.name) - # ) else: return self.fget(instance) @@ -314,22 +304,32 @@ def __set_name__(self, enum_class, member_name): ): # no other instances found, record this member in _member_names_ enum_class._member_names_.append(member_name) - # get redirect in place before adding to _member_map_ - # but check for other instances in parent classes first - descriptor = None + # if necessary, get redirect in place and then add it to _member_map_ + found_descriptor = None for base in enum_class.__mro__[1:]: descriptor = base.__dict__.get(member_name) if descriptor is not None: if isinstance(descriptor, (property, DynamicClassAttribute)): + found_descriptor = descriptor break - redirect = property() - redirect.member = enum_member - redirect.__set_name__(enum_class, member_name) - if descriptor: - redirect.fget = getattr(descriptor, 'fget', None) - redirect.fset = getattr(descriptor, 'fset', None) - redirect.fdel = getattr(descriptor, 'fdel', None) - setattr(enum_class, member_name, redirect) + elif ( + hasattr(descriptor, 'fget') and + hasattr(descriptor, 'fset') and + hasattr(descriptor, 'fdel') + ): + found_descriptor = descriptor + continue + if found_descriptor: + redirect = property() + redirect.member = enum_member + redirect.__set_name__(enum_class, member_name) + # earlier descriptor found; copy fget, fset, fdel to this one. + redirect.fget = found_descriptor.fget + redirect.fset = found_descriptor.fset + redirect.fdel = found_descriptor.fdel + setattr(enum_class, member_name, redirect) + else: + setattr(enum_class, member_name, enum_member) # now add to _member_map_ (even aliases) enum_class._member_map_[member_name] = enum_member try: diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index ee5280601be184..e4151bf9e6d9b3 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2686,28 +2686,15 @@ class Private(Enum): self.assertEqual(Private._Private__corporal, 'Radar') self.assertEqual(Private._Private__major_, 'Hoolihan') - @unittest.skipIf( - python_version <= (3, 13), - 'member.member access currently deprecated', - ) - def test_exception_for_member_from_member_access(self): - with self.assertRaisesRegex(AttributeError, " member has no attribute .NO."): - class Di(Enum): - YES = 1 - NO = 0 - nope = Di.YES.NO - - @unittest.skipIf( - python_version > (3, 13), - 'member.member access now raises', - ) - def test_warning_for_member_from_member_access(self): - with self.assertWarnsRegex(DeprecationWarning, '`member.member` access .* is deprecated and will be removed in 3.14'): - class Di(Enum): - YES = 1 - NO = 0 - warn = Di.YES.NO + def test_member_from_member_access(self): + class Di(Enum): + YES = 1 + NO = 0 + name = 3 + warn = Di.YES.NO self.assertIs(warn, Di.NO) + self.assertIs(Di.name, Di['name']) + self.assertEqual(Di.name.name, 'name') def test_dynamic_members_with_static_methods(self): # diff --git a/Misc/NEWS.d/next/Library/2023-04-04-12-43-38.gh-issue-93910.jurMzv.rst b/Misc/NEWS.d/next/Library/2023-04-04-12-43-38.gh-issue-93910.jurMzv.rst new file mode 100644 index 00000000000000..783aefae0770a9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-04-12-43-38.gh-issue-93910.jurMzv.rst @@ -0,0 +1 @@ +Remove deprecation of enum ``memmber.member`` access. From 03089fdccc7dbe3f69227fbd570df92278371e7f Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Wed, 5 Apr 2023 18:42:02 -0600 Subject: [PATCH 079/349] gh-101659: Add _Py_AtExit() (gh-103298) The function is like Py_AtExit() but for a single interpreter. This is a companion to the atexit module's register() function, taking a C callback instead of a Python one. We also update the _xxinterpchannels module to use _Py_AtExit(), which is the motivating case. (This is inspired by pain points felt while working on gh-101660.) --- Include/cpython/pylifecycle.h | 4 ++ Include/internal/pycore_atexit.h | 56 +++++++++++++++++ Include/internal/pycore_interp.h | 17 +----- Include/internal/pycore_runtime.h | 5 +- Lib/test/test__xxinterpchannels.py | 40 +++++++++---- Makefile.pre.in | 1 + Modules/_testcapimodule.c | 32 ++++++++++ Modules/_xxinterpchannelsmodule.c | 96 ++++++++++++++++++++++++++---- Modules/_xxsubinterpretersmodule.c | 11 +--- Modules/atexitmodule.c | 57 +++++++++++++++--- PCbuild/pythoncore.vcxproj | 1 + PCbuild/pythoncore.vcxproj.filters | 3 + Python/pylifecycle.c | 14 ++--- 13 files changed, 269 insertions(+), 68 deletions(-) create mode 100644 Include/internal/pycore_atexit.h diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index 821b169d7a1759..79d55711319e55 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -65,3 +65,7 @@ PyAPI_FUNC(char *) _Py_SetLocaleFromEnv(int category); PyAPI_FUNC(PyStatus) _Py_NewInterpreterFromConfig( PyThreadState **tstate_p, const _PyInterpreterConfig *config); + +typedef void (*atexit_datacallbackfunc)(void *); +PyAPI_FUNC(int) _Py_AtExit( + PyInterpreterState *, atexit_datacallbackfunc, void *); diff --git a/Include/internal/pycore_atexit.h b/Include/internal/pycore_atexit.h new file mode 100644 index 00000000000000..b4663b396852f3 --- /dev/null +++ b/Include/internal/pycore_atexit.h @@ -0,0 +1,56 @@ +#ifndef Py_INTERNAL_ATEXIT_H +#define Py_INTERNAL_ATEXIT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + + +//############### +// runtime atexit + +typedef void (*atexit_callbackfunc)(void); + +struct _atexit_runtime_state { +#define NEXITFUNCS 32 + atexit_callbackfunc callbacks[NEXITFUNCS]; + int ncallbacks; +}; + + +//################### +// interpreter atexit + +struct atexit_callback; +typedef struct atexit_callback { + atexit_datacallbackfunc func; + void *data; + struct atexit_callback *next; +} atexit_callback; + +typedef struct { + PyObject *func; + PyObject *args; + PyObject *kwargs; +} atexit_py_callback; + +struct atexit_state { + atexit_callback *ll_callbacks; + atexit_callback *last_ll_callback; + + // XXX The rest of the state could be moved to the atexit module state + // and a low-level callback added for it during module exec. + // For the moment we leave it here. + atexit_py_callback **callbacks; + int ncallbacks; + int callback_len; +}; + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_ATEXIT_H */ diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index 1f2c0db2eb5f27..d64a68cd2da54e 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -10,8 +10,9 @@ extern "C" { #include -#include "pycore_atomic.h" // _Py_atomic_address #include "pycore_ast_state.h" // struct ast_state +#include "pycore_atexit.h" // struct atexit_state +#include "pycore_atomic.h" // _Py_atomic_address #include "pycore_ceval_state.h" // struct _ceval_state #include "pycore_code.h" // struct callable_cache #include "pycore_context.h" // struct _Py_context_state @@ -32,20 +33,6 @@ extern "C" { #include "pycore_warnings.h" // struct _warnings_runtime_state -// atexit state -typedef struct { - PyObject *func; - PyObject *args; - PyObject *kwargs; -} atexit_callback; - -struct atexit_state { - atexit_callback **callbacks; - int ncallbacks; - int callback_len; -}; - - struct _Py_long_state { int max_str_digits; }; diff --git a/Include/internal/pycore_runtime.h b/Include/internal/pycore_runtime.h index 8877b282bc38de..3ebe49926edda6 100644 --- a/Include/internal/pycore_runtime.h +++ b/Include/internal/pycore_runtime.h @@ -8,6 +8,7 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +#include "pycore_atexit.h" // struct atexit_runtime_state #include "pycore_atomic.h" /* _Py_atomic_address */ #include "pycore_ceval_state.h" // struct _ceval_runtime_state #include "pycore_floatobject.h" // struct _Py_float_runtime_state @@ -131,9 +132,7 @@ typedef struct pyruntimestate { struct _parser_runtime_state parser; -#define NEXITFUNCS 32 - void (*exitfuncs[NEXITFUNCS])(void); - int nexitfuncs; + struct _atexit_runtime_state atexit; struct _import_runtime_state imports; struct _ceval_runtime_state ceval; diff --git a/Lib/test/test__xxinterpchannels.py b/Lib/test/test__xxinterpchannels.py index 69bda89a1688f5..b65281106f667c 100644 --- a/Lib/test/test__xxinterpchannels.py +++ b/Lib/test/test__xxinterpchannels.py @@ -550,6 +550,7 @@ def test_channel_list_interpreters_closed_send_end(self): import _xxinterpchannels as _channels _channels.close({cid}, force=True) """)) + return # Both ends should raise an error. with self.assertRaises(channels.ChannelClosedError): channels.list_interpreters(cid, send=True) @@ -673,17 +674,34 @@ def test_recv_default(self): self.assertIs(obj6, default) def test_recv_sending_interp_destroyed(self): - cid = channels.create() - interp = interpreters.create() - interpreters.run_string(interp, dedent(f""" - import _xxinterpchannels as _channels - _channels.send({cid}, b'spam') - """)) - interpreters.destroy(interp) - - with self.assertRaisesRegex(RuntimeError, - 'unrecognized interpreter ID'): - channels.recv(cid) + with self.subTest('closed'): + cid1 = channels.create() + interp = interpreters.create() + interpreters.run_string(interp, dedent(f""" + import _xxinterpchannels as _channels + _channels.send({cid1}, b'spam') + """)) + interpreters.destroy(interp) + + with self.assertRaisesRegex(RuntimeError, + f'channel {cid1} is closed'): + channels.recv(cid1) + del cid1 + with self.subTest('still open'): + cid2 = channels.create() + interp = interpreters.create() + interpreters.run_string(interp, dedent(f""" + import _xxinterpchannels as _channels + _channels.send({cid2}, b'spam') + """)) + channels.send(cid2, b'eggs') + interpreters.destroy(interp) + + channels.recv(cid2) + with self.assertRaisesRegex(RuntimeError, + f'channel {cid2} is empty'): + channels.recv(cid2) + del cid2 def test_allowed_types(self): cid = channels.create() diff --git a/Makefile.pre.in b/Makefile.pre.in index 9fdbd8db19bb33..1c1bddcad82475 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1660,6 +1660,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_asdl.h \ $(srcdir)/Include/internal/pycore_ast.h \ $(srcdir)/Include/internal/pycore_ast_state.h \ + $(srcdir)/Include/internal/pycore_atexit.h \ $(srcdir)/Include/internal/pycore_atomic.h \ $(srcdir)/Include/internal/pycore_atomic_funcs.h \ $(srcdir)/Include/internal/pycore_bitutils.h \ diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 3d9a2aeeb7cfd5..557a6d46ed4632 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -3381,6 +3381,37 @@ test_gc_visit_objects_exit_early(PyObject *Py_UNUSED(self), } +struct atexit_data { + int called; +}; + +static void +callback(void *data) +{ + ((struct atexit_data *)data)->called += 1; +} + +static PyObject * +test_atexit(PyObject *self, PyObject *Py_UNUSED(args)) +{ + PyThreadState *oldts = PyThreadState_Swap(NULL); + PyThreadState *tstate = Py_NewInterpreter(); + + struct atexit_data data = {0}; + int res = _Py_AtExit(tstate->interp, callback, (void *)&data); + Py_EndInterpreter(tstate); + PyThreadState_Swap(oldts); + if (res < 0) { + return NULL; + } + if (data.called == 0) { + PyErr_SetString(PyExc_RuntimeError, "atexit callback not called"); + return NULL; + } + Py_RETURN_NONE; +} + + static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *); static PyMethodDef TestMethods[] = { @@ -3525,6 +3556,7 @@ static PyMethodDef TestMethods[] = { {"function_set_kw_defaults", function_set_kw_defaults, METH_VARARGS, NULL}, {"test_gc_visit_objects_basic", test_gc_visit_objects_basic, METH_NOARGS, NULL}, {"test_gc_visit_objects_exit_early", test_gc_visit_objects_exit_early, METH_NOARGS, NULL}, + {"test_atexit", test_atexit, METH_NOARGS}, {NULL, NULL} /* sentinel */ }; diff --git a/Modules/_xxinterpchannelsmodule.c b/Modules/_xxinterpchannelsmodule.c index ef1cdcab952271..13b005eaef9866 100644 --- a/Modules/_xxinterpchannelsmodule.c +++ b/Modules/_xxinterpchannelsmodule.c @@ -174,19 +174,7 @@ _release_xid_data(_PyCrossInterpreterData *data, int ignoreexc) } int res = _PyCrossInterpreterData_Release(data); if (res < 0) { - // XXX Fix this! - /* The owning interpreter is already destroyed. - * Ideally, this shouldn't ever happen. When an interpreter is - * about to be destroyed, we should clear out all of its objects - * from every channel associated with that interpreter. - * For now we hack around that to resolve refleaks, by decref'ing - * the released object here, even if its the wrong interpreter. - * The owning interpreter has already been destroyed - * so we should be okay, especially since the currently - * shareable types are all very basic, with no GC. - * That said, it becomes much messier once interpreters - * no longer share a GIL, so this needs to be fixed before then. */ - _PyCrossInterpreterData_Clear(NULL, data); + /* The owning interpreter is already destroyed. */ if (ignoreexc) { // XXX Emit a warning? PyErr_Clear(); @@ -489,6 +477,30 @@ _channelqueue_get(_channelqueue *queue) return _channelitem_popped(item); } +static void +_channelqueue_drop_interpreter(_channelqueue *queue, int64_t interp) +{ + _channelitem *prev = NULL; + _channelitem *next = queue->first; + while (next != NULL) { + _channelitem *item = next; + next = item->next; + if (item->data->interp == interp) { + if (prev == NULL) { + queue->first = item->next; + } + else { + prev->next = item->next; + } + _channelitem_free(item); + queue->count -= 1; + } + else { + prev = item; + } + } +} + /* channel-interpreter associations */ struct _channelend; @@ -693,6 +705,20 @@ _channelends_close_interpreter(_channelends *ends, int64_t interp, int which) return 0; } +static void +_channelends_drop_interpreter(_channelends *ends, int64_t interp) +{ + _channelend *end; + end = _channelend_find(ends->send, interp, NULL); + if (end != NULL) { + _channelends_close_end(ends, end, 1); + } + end = _channelend_find(ends->recv, interp, NULL); + if (end != NULL) { + _channelends_close_end(ends, end, 0); + } +} + static void _channelends_close_all(_channelends *ends, int which, int force) { @@ -841,6 +867,18 @@ _channel_close_interpreter(_PyChannelState *chan, int64_t interp, int end) return res; } +static void +_channel_drop_interpreter(_PyChannelState *chan, int64_t interp) +{ + PyThread_acquire_lock(chan->mutex, WAIT_LOCK); + + _channelqueue_drop_interpreter(chan->queue, interp); + _channelends_drop_interpreter(chan->ends, interp); + chan->open = _channelends_is_open(chan->ends); + + PyThread_release_lock(chan->mutex); +} + static int _channel_close_all(_PyChannelState *chan, int end, int force) { @@ -1213,6 +1251,21 @@ _channels_list_all(_channels *channels, int64_t *count) return cids; } +static void +_channels_drop_interpreter(_channels *channels, int64_t interp) +{ + PyThread_acquire_lock(channels->mutex, WAIT_LOCK); + + _channelref *ref = channels->head; + for (; ref != NULL; ref = ref->next) { + if (ref->chan != NULL) { + _channel_drop_interpreter(ref->chan, interp); + } + } + + PyThread_release_lock(channels->mutex); +} + /* support for closing non-empty channels */ struct _channel_closing { @@ -1932,6 +1985,19 @@ _global_channels(void) { } +static void +clear_interpreter(void *data) +{ + if (_globals.module_count == 0) { + return; + } + PyInterpreterState *interp = (PyInterpreterState *)data; + assert(interp == _get_current_interp()); + int64_t id = PyInterpreterState_GetID(interp); + _channels_drop_interpreter(&_globals.channels, id); +} + + static PyObject * channel_create(PyObject *self, PyObject *Py_UNUSED(ignored)) { @@ -2339,6 +2405,10 @@ module_exec(PyObject *mod) goto error; } + // Make sure chnnels drop objects owned by this interpreter + PyInterpreterState *interp = _get_current_interp(); + _Py_AtExit(interp, clear_interpreter, (void *)interp); + return 0; error: diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index 11164676c4d107..884fb0d31f2b7f 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -67,16 +67,7 @@ _release_xid_data(_PyCrossInterpreterData *data, int ignoreexc) } int res = _PyCrossInterpreterData_Release(data); if (res < 0) { - // XXX Fix this! - /* The owning interpreter is already destroyed. - * Ideally, this shouldn't ever happen. (It's highly unlikely.) - * For now we hack around that to resolve refleaks, by decref'ing - * the released object here, even if its the wrong interpreter. - * The owning interpreter has already been destroyed - * so we should be okay, especially since the currently - * shareable types are all very basic, with no GC. - * That said, it becomes much messier once interpreters - * no longer share a GIL, so this needs to be fixed before then. */ + /* The owning interpreter is already destroyed. */ _PyCrossInterpreterData_Clear(NULL, data); if (ignoreexc) { // XXX Emit a warning? diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c index a1c511e09d704e..47afd7f0751039 100644 --- a/Modules/atexitmodule.c +++ b/Modules/atexitmodule.c @@ -7,6 +7,7 @@ */ #include "Python.h" +#include "pycore_atexit.h" #include "pycore_initconfig.h" // _PyStatus_NO_MEMORY #include "pycore_interp.h" // PyInterpreterState.atexit #include "pycore_pystate.h" // _PyInterpreterState_GET @@ -22,10 +23,36 @@ get_atexit_state(void) } +int +_Py_AtExit(PyInterpreterState *interp, + atexit_datacallbackfunc func, void *data) +{ + assert(interp == _PyInterpreterState_GET()); + atexit_callback *callback = PyMem_Malloc(sizeof(atexit_callback)); + if (callback == NULL) { + PyErr_NoMemory(); + return -1; + } + callback->func = func; + callback->data = data; + callback->next = NULL; + + struct atexit_state *state = &interp->atexit; + if (state->ll_callbacks == NULL) { + state->ll_callbacks = callback; + state->last_ll_callback = callback; + } + else { + state->last_ll_callback->next = callback; + } + return 0; +} + + static void atexit_delete_cb(struct atexit_state *state, int i) { - atexit_callback *cb = state->callbacks[i]; + atexit_py_callback *cb = state->callbacks[i]; state->callbacks[i] = NULL; Py_DECREF(cb->func); @@ -39,7 +66,7 @@ atexit_delete_cb(struct atexit_state *state, int i) static void atexit_cleanup(struct atexit_state *state) { - atexit_callback *cb; + atexit_py_callback *cb; for (int i = 0; i < state->ncallbacks; i++) { cb = state->callbacks[i]; if (cb == NULL) @@ -60,7 +87,7 @@ _PyAtExit_Init(PyInterpreterState *interp) state->callback_len = 32; state->ncallbacks = 0; - state->callbacks = PyMem_New(atexit_callback*, state->callback_len); + state->callbacks = PyMem_New(atexit_py_callback*, state->callback_len); if (state->callbacks == NULL) { return _PyStatus_NO_MEMORY(); } @@ -75,6 +102,18 @@ _PyAtExit_Fini(PyInterpreterState *interp) atexit_cleanup(state); PyMem_Free(state->callbacks); state->callbacks = NULL; + + atexit_callback *next = state->ll_callbacks; + state->ll_callbacks = NULL; + while (next != NULL) { + atexit_callback *callback = next; + next = callback->next; + atexit_datacallbackfunc exitfunc = callback->func; + void *data = callback->data; + // It was allocated in _PyAtExit_AddCallback(). + PyMem_Free(callback); + exitfunc(data); + } } @@ -88,7 +127,7 @@ atexit_callfuncs(struct atexit_state *state) } for (int i = state->ncallbacks - 1; i >= 0; i--) { - atexit_callback *cb = state->callbacks[i]; + atexit_py_callback *cb = state->callbacks[i]; if (cb == NULL) { continue; } @@ -152,17 +191,17 @@ atexit_register(PyObject *module, PyObject *args, PyObject *kwargs) struct atexit_state *state = get_atexit_state(); if (state->ncallbacks >= state->callback_len) { - atexit_callback **r; + atexit_py_callback **r; state->callback_len += 16; - size_t size = sizeof(atexit_callback*) * (size_t)state->callback_len; - r = (atexit_callback**)PyMem_Realloc(state->callbacks, size); + size_t size = sizeof(atexit_py_callback*) * (size_t)state->callback_len; + r = (atexit_py_callback**)PyMem_Realloc(state->callbacks, size); if (r == NULL) { return PyErr_NoMemory(); } state->callbacks = r; } - atexit_callback *callback = PyMem_Malloc(sizeof(atexit_callback)); + atexit_py_callback *callback = PyMem_Malloc(sizeof(atexit_py_callback)); if (callback == NULL) { return PyErr_NoMemory(); } @@ -233,7 +272,7 @@ atexit_unregister(PyObject *module, PyObject *func) struct atexit_state *state = get_atexit_state(); for (int i = 0; i < state->ncallbacks; i++) { - atexit_callback *cb = state->callbacks[i]; + atexit_py_callback *cb = state->callbacks[i]; if (cb == NULL) { continue; } diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 8fab600334160d..29f32db579fa40 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -197,6 +197,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 6c5d8dd89f5bc7..6a622fd93930ad 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -498,6 +498,9 @@ Include\internal + + Include\internal + Include\internal diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 8110d94ba17526..d6627bc6b7e86b 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -2937,23 +2937,23 @@ wait_for_thread_shutdown(PyThreadState *tstate) Py_DECREF(threading); } -#define NEXITFUNCS 32 int Py_AtExit(void (*func)(void)) { - if (_PyRuntime.nexitfuncs >= NEXITFUNCS) + if (_PyRuntime.atexit.ncallbacks >= NEXITFUNCS) return -1; - _PyRuntime.exitfuncs[_PyRuntime.nexitfuncs++] = func; + _PyRuntime.atexit.callbacks[_PyRuntime.atexit.ncallbacks++] = func; return 0; } static void call_ll_exitfuncs(_PyRuntimeState *runtime) { - while (runtime->nexitfuncs > 0) { + struct _atexit_runtime_state *state = &runtime->atexit; + while (state->ncallbacks > 0) { /* pop last function from the list */ - runtime->nexitfuncs--; - void (*exitfunc)(void) = runtime->exitfuncs[runtime->nexitfuncs]; - runtime->exitfuncs[runtime->nexitfuncs] = NULL; + state->ncallbacks--; + atexit_callbackfunc exitfunc = state->callbacks[state->ncallbacks]; + state->callbacks[state->ncallbacks] = NULL; exitfunc(); } From 6e3ee049ace60beb97784f10099ae399efd83bac Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Wed, 5 Apr 2023 23:42:14 -0400 Subject: [PATCH 080/349] gh-103207: Fix Welcome formatting issues when macOS Installer is run in dark mode. (GH-103303) --- Mac/BuildScript/resources/Welcome.rtf | 51 ++++++++++++--------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/Mac/BuildScript/resources/Welcome.rtf b/Mac/BuildScript/resources/Welcome.rtf index efdcb12f849b66..1f109ee9f13e0d 100644 --- a/Mac/BuildScript/resources/Welcome.rtf +++ b/Mac/BuildScript/resources/Welcome.rtf @@ -1,9 +1,9 @@ {\rtf1\ansi\ansicpg1252\cocoartf2708 \cocoascreenfonts1\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 Helvetica-Bold;\f2\fmodern\fcharset0 CourierNewPSMT; -\f3\fnil\fcharset0 HelveticaNeue;\f4\fnil\fcharset0 HelveticaNeue-Bold;} -{\colortbl;\red255\green255\blue255;\red24\green26\blue30;\red255\green255\blue255;} -{\*\expandedcolortbl;;\cssrgb\c12157\c13725\c15686;\cssrgb\c100000\c100000\c100000;} -\margl1440\margr1440\vieww12820\viewh10620\viewkind0 +} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\margl1440\margr1440\vieww12200\viewh10880\viewkind0 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\partightenfactor0 \f0\fs24 \cf0 This package will install @@ -26,32 +26,25 @@ At the end of this install, click on \ \f1\b macOS 13 Ventura users -\f0\b0 : due to an issue with macOS +\f0\b0 : Due to an issue with the macOS \f1\b Installer -\f0\b0 app, installation of some -\f3 \cf2 \cb3 \expnd0\expndtw0\kerning0 -third-party -\f0 \cf0 \cb1 \kerning1\expnd0\expndtw0 packages including this Python package may fail with a vague -\f4\b \cf2 \cb3 \expnd0\expndtw0\kerning0 -\'93The installer encountered an error\'94 -\f3\b0 message if the -\f4\b Installer -\f3\b0 app does not have permission to access the folder containing the downloaded installer file, typically in the -\f4\b Downloads -\f3\b0 folder. Go to -\f4\b System Settings -\f3\b0 -> -\f4\b Privacy & Security -\f3\b0 -> -\f4\b Files and Folders -\f3\b0 , then click the mark in front of -\f4\b Installer -\f3\b0 to expand, and enable -\f4\b Downloads Folder -\f0\b0 \cf0 \cb1 \kerning1\expnd0\expndtw0 by moving the toggle to the right -\f3 \cf2 \cb3 \expnd0\expndtw0\kerning0 -. See {\field{\*\fldinst{HYPERLINK "https://github.com/python/cpython/issues/103207"}}{\fldrslt https://github.com/python/cpython/issues/103207}} for up-to-date information on this issue. -\f0 \cf0 \cb1 \kerning1\expnd0\expndtw0 \ +\f0\b0 app, installation of some third-party packages including this Python package may fail with a vague +\f1\b "The installer encountered an error" +\f0\b0 message if the +\f1\b Installer +\f0\b0 app does not have permission to access the folder containing the downloaded installer file, typically in the +\f1\b Downloads +\f0\b0 folder. Go to +\f1\b System Settings +\f0\b0 -> +\f1\b Privacy & Security +\f0\b0 -> +\f1\b Files and Folders +\f0\b0 , then click the mark in front of +\f1\b Installer +\f0\b0 to expand, and enable +\f1\b Downloads Folder +\f0\b0 by moving the toggle to the right. See {\field{\*\fldinst{HYPERLINK "https://github.com/python/cpython/issues/103207"}}{\fldrslt https://github.com/python/cpython/issues/103207}} for up-to-date information on this issue.\ \ \f1\b NOTE: From a44568b80dfc494759d45db59423ed314bc70f9e Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Wed, 5 Apr 2023 21:30:11 -0700 Subject: [PATCH 081/349] [Enum] unchain exception property.__get__ (GH-103305) --- Lib/enum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/enum.py b/Lib/enum.py index 0b0629cf920506..10902c4b202a2d 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -207,7 +207,7 @@ def __get__(self, instance, ownerclass=None): except KeyError: raise AttributeError( '%r has no attribute %r' % (ownerclass, self.name) - ) + ) from None else: return self.fget(instance) From 482b6eeadcde3e6573f0d243e687de7be7680379 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Thu, 6 Apr 2023 11:08:25 +0100 Subject: [PATCH 082/349] gh-102799: use sys.exception() instead of sys.exc_info() in tests (#103293) --- Lib/test/profilee.py | 2 +- Lib/test/support/asyncore.py | 7 +-- Lib/test/test_asyncio/test_tasks.py | 2 +- Lib/test/test_asyncio/utils.py | 2 +- Lib/test/test_class.py | 2 +- Lib/test/test_cprofile.py | 2 +- Lib/test/test_exceptions.py | 66 ++++++++++++++--------------- Lib/test/test_generators.py | 34 +++++++-------- Lib/test/test_logging.py | 3 +- Lib/test/test_profile.py | 2 +- Lib/test/test_ssl.py | 2 +- Lib/test/test_traceback.py | 15 +++---- 12 files changed, 68 insertions(+), 71 deletions(-) diff --git a/Lib/test/profilee.py b/Lib/test/profilee.py index 6ad2c8395634fd..b6a090a2e34613 100644 --- a/Lib/test/profilee.py +++ b/Lib/test/profilee.py @@ -79,7 +79,7 @@ def helper1(): TICKS += 19 lst = [] lst.append(42) # 0 - sys.exc_info() # 0 + sys.exception() # 0 def helper2_indirect(): helper2() # 50 diff --git a/Lib/test/support/asyncore.py b/Lib/test/support/asyncore.py index 401fa60bcf35f2..b397aca5568079 100644 --- a/Lib/test/support/asyncore.py +++ b/Lib/test/support/asyncore.py @@ -537,10 +537,11 @@ def send(self, data): # --------------------------------------------------------------------------- def compact_traceback(): - t, v, tb = sys.exc_info() - tbinfo = [] + exc = sys.exception() + tb = exc.__traceback__ if not tb: # Must have a traceback raise AssertionError("traceback does not exist") + tbinfo = [] while tb: tbinfo.append(( tb.tb_frame.f_code.co_filename, @@ -554,7 +555,7 @@ def compact_traceback(): file, function, line = tbinfo[-1] info = ' '.join(['[%s|%s|%s]' % x for x in tbinfo]) - return (file, function, line), t, v, info + return (file, function, line), type(exc), exc, info def close_all(map=None, ignore_all=False): if map is None: diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 731fa0c5a60b9b..31622c91470bcb 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -606,7 +606,7 @@ def on_timeout(): if ( timed_out and task.uncancel() == 0 - and sys.exc_info()[0] is asyncio.CancelledError + and type(sys.exception()) is asyncio.CancelledError ): # Note the five rules that are needed here to satisfy proper # uncancellation: diff --git a/Lib/test/test_asyncio/utils.py b/Lib/test/test_asyncio/utils.py index 5b9c86eb9859a0..6dee5bb33b2560 100644 --- a/Lib/test/test_asyncio/utils.py +++ b/Lib/test/test_asyncio/utils.py @@ -577,7 +577,7 @@ def tearDown(self): # Detect CPython bug #23353: ensure that yield/yield-from is not used # in an except block of a generator - self.assertEqual(sys.exc_info(), (None, None, None)) + self.assertIsNone(sys.exception()) self.doCleanups() threading_helper.threading_cleanup(*self._thread_cleanup) diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py index 61df81b169775e..d7a48e55b10180 100644 --- a/Lib/test/test_class.py +++ b/Lib/test/test_class.py @@ -457,7 +457,7 @@ def __init__(self): a = A() self.assertEqual(_testcapi.hasattr_string(a, "attr"), True) self.assertEqual(_testcapi.hasattr_string(a, "noattr"), False) - self.assertEqual(sys.exc_info(), (None, None, None)) + self.assertIsNone(sys.exception()) def testDel(self): x = [] diff --git a/Lib/test/test_cprofile.py b/Lib/test/test_cprofile.py index 4ec769885292a8..98648528bc81f2 100644 --- a/Lib/test/test_cprofile.py +++ b/Lib/test/test_cprofile.py @@ -100,7 +100,7 @@ def main(): profilee.py:98(subhelper) <- 8 0.064 0.080 profilee.py:88(helper2) {built-in method builtins.hasattr} <- 4 0.000 0.004 profilee.py:73(helper1) 8 0.000 0.008 profilee.py:88(helper2) -{built-in method sys.exc_info} <- 4 0.000 0.000 profilee.py:73(helper1) +{built-in method sys.exception} <- 4 0.000 0.000 profilee.py:73(helper1) {method 'append' of 'list' objects} <- 4 0.000 0.000 profilee.py:73(helper1)""" _ProfileOutput['print_callees'] = """\ :1() -> 1 0.270 1.000 profilee.py:25(testfunc) diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 74a5884264d577..684e888f08c778 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -334,8 +334,7 @@ def test_capi1(): try: _testcapi.raise_exception(BadException, 1) except TypeError as err: - exc, err, tb = sys.exc_info() - co = tb.tb_frame.f_code + co = err.__traceback__.tb_frame.f_code self.assertEqual(co.co_name, "test_capi1") self.assertTrue(co.co_filename.endswith('test_exceptions.py')) else: @@ -346,8 +345,7 @@ def test_capi2(): try: _testcapi.raise_exception(BadException, 0) except RuntimeError as err: - exc, err, tb = sys.exc_info() - tb = tb.tb_next + tb = err.__traceback__.tb_next co = tb.tb_frame.f_code self.assertEqual(co.co_name, "__init__") self.assertTrue(co.co_filename.endswith('test_exceptions.py')) @@ -888,28 +886,28 @@ def yield_raise(): try: raise KeyError("caught") except KeyError: - yield sys.exc_info()[0] - yield sys.exc_info()[0] - yield sys.exc_info()[0] + yield sys.exception() + yield sys.exception() + yield sys.exception() g = yield_raise() - self.assertEqual(next(g), KeyError) - self.assertEqual(sys.exc_info()[0], None) - self.assertEqual(next(g), KeyError) - self.assertEqual(sys.exc_info()[0], None) - self.assertEqual(next(g), None) + self.assertIsInstance(next(g), KeyError) + self.assertIsNone(sys.exception()) + self.assertIsInstance(next(g), KeyError) + self.assertIsNone(sys.exception()) + self.assertIsNone(next(g)) # Same test, but inside an exception handler try: raise TypeError("foo") except TypeError: g = yield_raise() - self.assertEqual(next(g), KeyError) - self.assertEqual(sys.exc_info()[0], TypeError) - self.assertEqual(next(g), KeyError) - self.assertEqual(sys.exc_info()[0], TypeError) - self.assertEqual(next(g), TypeError) + self.assertIsInstance(next(g), KeyError) + self.assertIsInstance(sys.exception(), TypeError) + self.assertIsInstance(next(g), KeyError) + self.assertIsInstance(sys.exception(), TypeError) + self.assertIsInstance(next(g), TypeError) del g - self.assertEqual(sys.exc_info()[0], TypeError) + self.assertIsInstance(sys.exception(), TypeError) def test_generator_leaking2(self): # See issue 12475. @@ -924,7 +922,7 @@ def g(): next(it) except StopIteration: pass - self.assertEqual(sys.exc_info(), (None, None, None)) + self.assertIsNone(sys.exception()) def test_generator_leaking3(self): # See issue #23353. When gen.throw() is called, the caller's @@ -933,17 +931,17 @@ def g(): try: yield except ZeroDivisionError: - yield sys.exc_info()[1] + yield sys.exception() it = g() next(it) try: 1/0 except ZeroDivisionError as e: - self.assertIs(sys.exc_info()[1], e) + self.assertIs(sys.exception(), e) gen_exc = it.throw(e) - self.assertIs(sys.exc_info()[1], e) + self.assertIs(sys.exception(), e) self.assertIs(gen_exc, e) - self.assertEqual(sys.exc_info(), (None, None, None)) + self.assertIsNone(sys.exception()) def test_generator_leaking4(self): # See issue #23353. When an exception is raised by a generator, @@ -952,7 +950,7 @@ def g(): try: 1/0 except ZeroDivisionError: - yield sys.exc_info()[0] + yield sys.exception() raise it = g() try: @@ -960,7 +958,7 @@ def g(): except TypeError: # The caller's exception state (TypeError) is temporarily # saved in the generator. - tp = next(it) + tp = type(next(it)) self.assertIs(tp, ZeroDivisionError) try: next(it) @@ -968,15 +966,15 @@ def g(): # with an exception, it shouldn't have restored the old # exception state (TypeError). except ZeroDivisionError as e: - self.assertIs(sys.exc_info()[1], e) + self.assertIs(sys.exception(), e) # We used to find TypeError here. - self.assertEqual(sys.exc_info(), (None, None, None)) + self.assertIsNone(sys.exception()) def test_generator_doesnt_retain_old_exc(self): def g(): - self.assertIsInstance(sys.exc_info()[1], RuntimeError) + self.assertIsInstance(sys.exception(), RuntimeError) yield - self.assertEqual(sys.exc_info(), (None, None, None)) + self.assertIsNone(sys.exception()) it = g() try: raise RuntimeError @@ -984,7 +982,7 @@ def g(): next(it) self.assertRaises(StopIteration, next, it) - def test_generator_finalizing_and_exc_info(self): + def test_generator_finalizing_and_sys_exception(self): # See #7173 def simple_gen(): yield 1 @@ -996,7 +994,7 @@ def run_gen(): return next(gen) run_gen() gc_collect() - self.assertEqual(sys.exc_info(), (None, None, None)) + self.assertIsNone(sys.exception()) def _check_generator_cleanup_exc_state(self, testfunc): # Issue #12791: exception state is cleaned up as soon as a generator @@ -1067,14 +1065,14 @@ def test_3114(self): class MyObject: def __del__(self): nonlocal e - e = sys.exc_info() + e = sys.exception() e = () try: raise Exception(MyObject()) except: pass gc_collect() # For PyPy or other GCs. - self.assertEqual(e, (None, None, None)) + self.assertIsNone(e) def test_raise_does_not_create_context_chain_cycle(self): class A(Exception): @@ -1692,7 +1690,7 @@ def g(): raise ValueError except ValueError: yield 1 - self.assertEqual(sys.exc_info(), (None, None, None)) + self.assertIsNone(sys.exception()) yield 2 gen = g() diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py index 492b77a954d865..a5949dec70d176 100644 --- a/Lib/test/test_generators.py +++ b/Lib/test/test_generators.py @@ -234,16 +234,16 @@ class ExceptionTest(unittest.TestCase): def test_except_throw(self): def store_raise_exc_generator(): try: - self.assertEqual(sys.exc_info()[0], None) + self.assertIsNone(sys.exception()) yield except Exception as exc: # exception raised by gen.throw(exc) - self.assertEqual(sys.exc_info()[0], ValueError) + self.assertIsInstance(sys.exception(), ValueError) self.assertIsNone(exc.__context__) yield # ensure that the exception is not lost - self.assertEqual(sys.exc_info()[0], ValueError) + self.assertIsInstance(sys.exception(), ValueError) yield # we should be able to raise back the ValueError @@ -265,11 +265,11 @@ def store_raise_exc_generator(): next(make) self.assertIsNone(cm.exception.__context__) - self.assertEqual(sys.exc_info(), (None, None, None)) + self.assertIsNone(sys.exception()) def test_except_next(self): def gen(): - self.assertEqual(sys.exc_info()[0], ValueError) + self.assertIsInstance(sys.exception(), ValueError) yield "done" g = gen() @@ -277,23 +277,23 @@ def gen(): raise ValueError except Exception: self.assertEqual(next(g), "done") - self.assertEqual(sys.exc_info(), (None, None, None)) + self.assertIsNone(sys.exception()) def test_except_gen_except(self): def gen(): try: - self.assertEqual(sys.exc_info()[0], None) + self.assertIsNone(sys.exception()) yield # we are called from "except ValueError:", TypeError must # inherit ValueError in its context raise TypeError() except TypeError as exc: - self.assertEqual(sys.exc_info()[0], TypeError) + self.assertIsInstance(sys.exception(), TypeError) self.assertEqual(type(exc.__context__), ValueError) # here we are still called from the "except ValueError:" - self.assertEqual(sys.exc_info()[0], ValueError) + self.assertIsInstance(sys.exception(), ValueError) yield - self.assertIsNone(sys.exc_info()[0]) + self.assertIsNone(sys.exception()) yield "done" g = gen() @@ -304,7 +304,7 @@ def gen(): next(g) self.assertEqual(next(g), "done") - self.assertEqual(sys.exc_info(), (None, None, None)) + self.assertIsNone(sys.exception()) def test_nested_gen_except_loop(self): def gen(): @@ -330,19 +330,19 @@ def test_except_throw_exception_context(self): def gen(): try: try: - self.assertEqual(sys.exc_info()[0], None) + self.assertIsNone(sys.exception()) yield except ValueError: # we are called from "except ValueError:" - self.assertEqual(sys.exc_info()[0], ValueError) + self.assertIsInstance(sys.exception(), ValueError) raise TypeError() except Exception as exc: - self.assertEqual(sys.exc_info()[0], TypeError) + self.assertIsInstance(sys.exception(), TypeError) self.assertEqual(type(exc.__context__), ValueError) # we are still called from "except ValueError:" - self.assertEqual(sys.exc_info()[0], ValueError) + self.assertIsInstance(sys.exception(), ValueError) yield - self.assertIsNone(sys.exc_info()[0]) + self.assertIsNone(sys.exception()) yield "done" g = gen() @@ -353,7 +353,7 @@ def gen(): g.throw(exc) self.assertEqual(next(g), "done") - self.assertEqual(sys.exc_info(), (None, None, None)) + self.assertIsNone(sys.exception()) def test_except_throw_bad_exception(self): class E(Exception): diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 072056d3722106..c6de34e9dbdc8f 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -5097,8 +5097,7 @@ def test_encoding_errors_none(self): message = [] def dummy_handle_error(record): - _, v, _ = sys.exc_info() - message.append(str(v)) + message.append(str(sys.exception())) handler.handleError = dummy_handle_error logging.debug('The Øresund Bridge joins Copenhagen to Malmö') diff --git a/Lib/test/test_profile.py b/Lib/test/test_profile.py index d97fe447c38b01..a1dfc9abbb8ef7 100644 --- a/Lib/test/test_profile.py +++ b/Lib/test/test_profile.py @@ -178,7 +178,7 @@ def main(): 8 63.976 7.997 79.960 9.995 profilee.py:98(subhelper)""" _ProfileOutput['print_callers'] = """\ :0(append) <- profilee.py:73(helper1)(4) 119.964 -:0(exc_info) <- profilee.py:73(helper1)(4) 119.964 +:0(exception) <- profilee.py:73(helper1)(4) 119.964 :0(hasattr) <- profilee.py:73(helper1)(4) 119.964 profilee.py:88(helper2)(8) 399.912 profilee.py:110(__getattr__) <- :0(hasattr)(12) 11.964 diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index abf024fb89d2f3..d46ce5e60e2141 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -253,7 +253,7 @@ def wrapper(*args, **kw): def handle_error(prefix): - exc_format = ' '.join(traceback.format_exception(*sys.exc_info())) + exc_format = ' '.join(traceback.format_exception(sys.exception())) if support.verbose: sys.stdout.write(prefix + exc_format) diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 399c59f8780d8e..a6172ff05eed47 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -1211,8 +1211,7 @@ def test_recursive_traceback_python(self): def test_recursive_traceback_cpython_internal(self): from _testcapi import exception_print def render_exc(): - exc_type, exc_value, exc_tb = sys.exc_info() - exception_print(exc_value) + exception_print(sys.exception()) self._check_recursive_traceback_display(render_exc) def test_format_stack(self): @@ -2470,8 +2469,8 @@ def test_cause(self): try: 1/0 finally: - exc_info_context = sys.exc_info() - exc_context = traceback.TracebackException(*exc_info_context) + exc = sys.exception() + exc_context = traceback.TracebackException.from_exception(exc) cause = Exception("cause") raise Exception("uh oh") from cause except Exception as e: @@ -2492,8 +2491,8 @@ def test_context(self): try: 1/0 finally: - exc_info_context = sys.exc_info() - exc_context = traceback.TracebackException(*exc_info_context) + exc = sys.exception() + exc_context = traceback.TracebackException.from_exception(exc) raise Exception("uh oh") except Exception as e: exc_obj = e @@ -2557,8 +2556,8 @@ def test_compact_no_cause(self): try: 1/0 finally: - exc_info_context = sys.exc_info() - exc_context = traceback.TracebackException(*exc_info_context) + exc = sys.exception() + exc_context = traceback.TracebackException.from_exception(exc) raise Exception("uh oh") except Exception as e: exc_obj = e From 52bc2e7b9d451821513a580a9b73c20cfdcf2b21 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Thu, 6 Apr 2023 14:05:23 +0100 Subject: [PATCH 083/349] gh-48330: assert warning is emitted on unittest.TestResult with no addDuration (#103309) --- Lib/test/test_unittest/test_case.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_unittest/test_case.py b/Lib/test/test_unittest/test_case.py index 05d60a8ad3cf94..dd5ff6d553e61d 100644 --- a/Lib/test/test_unittest/test_case.py +++ b/Lib/test/test_unittest/test_case.py @@ -304,7 +304,8 @@ def defaultTestResult(self): def test(self): pass - Foo('test').run() + with self.assertWarns(RuntimeWarning): + Foo('test').run() def test_deprecation_of_return_val_from_test(self): # Issue 41322 - deprecate return of value that is not None from a test From 23cf1e20a6470588fbc64483031ceeec7614dc56 Mon Sep 17 00:00:00 2001 From: Jeffrey Newman Date: Thu, 6 Apr 2023 10:59:36 -0500 Subject: [PATCH 084/349] gh-99202: Fix extension type from documentation for compiling in C++20 mode (#102518) --- Doc/extending/newtypes_tutorial.rst | 4 ++-- Doc/includes/custom.c | 4 ++-- Doc/includes/custom2.c | 4 ++-- Doc/includes/custom3.c | 4 ++-- Doc/includes/custom4.c | 4 ++-- .../2023-03-07-23-30-29.gh-issue-99202.hhiAJF.rst | 1 + 6 files changed, 11 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2023-03-07-23-30-29.gh-issue-99202.hhiAJF.rst diff --git a/Doc/extending/newtypes_tutorial.rst b/Doc/extending/newtypes_tutorial.rst index 54de3fd42437d9..f89934a11f12a8 100644 --- a/Doc/extending/newtypes_tutorial.rst +++ b/Doc/extending/newtypes_tutorial.rst @@ -88,7 +88,7 @@ standard Python floats:: The second bit is the definition of the type object. :: static PyTypeObject CustomType = { - PyVarObject_HEAD_INIT(NULL, 0) + .ob_base = PyVarObject_HEAD_INIT(NULL, 0) .tp_name = "custom.Custom", .tp_doc = PyDoc_STR("Custom objects"), .tp_basicsize = sizeof(CustomObject), @@ -109,7 +109,7 @@ common practice to not specify them explicitly unless you need them. We're going to pick it apart, one field at a time:: - PyVarObject_HEAD_INIT(NULL, 0) + .ob_base = PyVarObject_HEAD_INIT(NULL, 0) This line is mandatory boilerplate to initialize the ``ob_base`` field mentioned above. :: diff --git a/Doc/includes/custom.c b/Doc/includes/custom.c index 26ca754964733d..9cfba50ace25db 100644 --- a/Doc/includes/custom.c +++ b/Doc/includes/custom.c @@ -7,7 +7,7 @@ typedef struct { } CustomObject; static PyTypeObject CustomType = { - PyVarObject_HEAD_INIT(NULL, 0) + .ob_base = PyVarObject_HEAD_INIT(NULL, 0) .tp_name = "custom.Custom", .tp_doc = PyDoc_STR("Custom objects"), .tp_basicsize = sizeof(CustomObject), @@ -17,7 +17,7 @@ static PyTypeObject CustomType = { }; static PyModuleDef custommodule = { - PyModuleDef_HEAD_INIT, + .m_base = PyModuleDef_HEAD_INIT, .m_name = "custom", .m_doc = "Example module that creates an extension type.", .m_size = -1, diff --git a/Doc/includes/custom2.c b/Doc/includes/custom2.c index a3b2d6ab78d3c4..a0222b1795209b 100644 --- a/Doc/includes/custom2.c +++ b/Doc/includes/custom2.c @@ -90,7 +90,7 @@ static PyMethodDef Custom_methods[] = { }; static PyTypeObject CustomType = { - PyVarObject_HEAD_INIT(NULL, 0) + .ob_base = PyVarObject_HEAD_INIT(NULL, 0) .tp_name = "custom2.Custom", .tp_doc = PyDoc_STR("Custom objects"), .tp_basicsize = sizeof(CustomObject), @@ -104,7 +104,7 @@ static PyTypeObject CustomType = { }; static PyModuleDef custommodule = { - PyModuleDef_HEAD_INIT, + .m_base =PyModuleDef_HEAD_INIT, .m_name = "custom2", .m_doc = "Example module that creates an extension type.", .m_size = -1, diff --git a/Doc/includes/custom3.c b/Doc/includes/custom3.c index 1a68bc4be8c399..4aeebe0a7507d1 100644 --- a/Doc/includes/custom3.c +++ b/Doc/includes/custom3.c @@ -130,7 +130,7 @@ static PyMethodDef Custom_methods[] = { }; static PyTypeObject CustomType = { - PyVarObject_HEAD_INIT(NULL, 0) + .ob_base = PyVarObject_HEAD_INIT(NULL, 0) .tp_name = "custom3.Custom", .tp_doc = PyDoc_STR("Custom objects"), .tp_basicsize = sizeof(CustomObject), @@ -145,7 +145,7 @@ static PyTypeObject CustomType = { }; static PyModuleDef custommodule = { - PyModuleDef_HEAD_INIT, + .m_base = PyModuleDef_HEAD_INIT, .m_name = "custom3", .m_doc = "Example module that creates an extension type.", .m_size = -1, diff --git a/Doc/includes/custom4.c b/Doc/includes/custom4.c index b932d159d26e93..3998918f68301e 100644 --- a/Doc/includes/custom4.c +++ b/Doc/includes/custom4.c @@ -146,7 +146,7 @@ static PyMethodDef Custom_methods[] = { }; static PyTypeObject CustomType = { - PyVarObject_HEAD_INIT(NULL, 0) + .ob_base = PyVarObject_HEAD_INIT(NULL, 0) .tp_name = "custom4.Custom", .tp_doc = PyDoc_STR("Custom objects"), .tp_basicsize = sizeof(CustomObject), @@ -163,7 +163,7 @@ static PyTypeObject CustomType = { }; static PyModuleDef custommodule = { - PyModuleDef_HEAD_INIT, + .m_base = PyModuleDef_HEAD_INIT, .m_name = "custom4", .m_doc = "Example module that creates an extension type.", .m_size = -1, diff --git a/Misc/NEWS.d/next/Documentation/2023-03-07-23-30-29.gh-issue-99202.hhiAJF.rst b/Misc/NEWS.d/next/Documentation/2023-03-07-23-30-29.gh-issue-99202.hhiAJF.rst new file mode 100644 index 00000000000000..1569e815ee50fa --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2023-03-07-23-30-29.gh-issue-99202.hhiAJF.rst @@ -0,0 +1 @@ +Fix extension type from documentation for compiling in C++20 mode From 52e9b389a8773f485c3b0f1d62bf3cce4812d44d Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Thu, 6 Apr 2023 12:00:49 -0600 Subject: [PATCH 085/349] gh-100227: Use an Array for _PyRuntime's Set of Locks During Init (gh-103315) This cleans things up a bit and simplifies adding new granular global locks. --- Python/pystate.c | 108 +++++++++++++++++++++-------------------------- 1 file changed, 48 insertions(+), 60 deletions(-) diff --git a/Python/pystate.c b/Python/pystate.c index 1e59a8c5f89717..d09c1d5743a4c6 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -354,47 +354,29 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS static const _PyRuntimeState initial = _PyRuntimeState_INIT(_PyRuntime); _Py_COMP_DIAG_POP +#define NUMLOCKS 4 + static int -alloc_for_runtime(PyThread_type_lock *plock1, PyThread_type_lock *plock2, - PyThread_type_lock *plock3, PyThread_type_lock *plock4) +alloc_for_runtime(PyThread_type_lock locks[NUMLOCKS]) { /* Force default allocator, since _PyRuntimeState_Fini() must use the same allocator than this function. */ PyMemAllocatorEx old_alloc; _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - PyThread_type_lock lock1 = PyThread_allocate_lock(); - if (lock1 == NULL) { - return -1; - } - - PyThread_type_lock lock2 = PyThread_allocate_lock(); - if (lock2 == NULL) { - PyThread_free_lock(lock1); - return -1; - } - - PyThread_type_lock lock3 = PyThread_allocate_lock(); - if (lock3 == NULL) { - PyThread_free_lock(lock1); - PyThread_free_lock(lock2); - return -1; - } - - PyThread_type_lock lock4 = PyThread_allocate_lock(); - if (lock4 == NULL) { - PyThread_free_lock(lock1); - PyThread_free_lock(lock2); - PyThread_free_lock(lock3); - return -1; + for (int i = 0; i < NUMLOCKS; i++) { + PyThread_type_lock lock = PyThread_allocate_lock(); + if (lock == NULL) { + for (int j = 0; j < i; j++) { + PyThread_free_lock(locks[j]); + locks[j] = NULL; + } + break; + } + locks[i] = lock; } PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - - *plock1 = lock1; - *plock2 = lock2; - *plock3 = lock3; - *plock4 = lock4; return 0; } @@ -403,10 +385,7 @@ init_runtime(_PyRuntimeState *runtime, void *open_code_hook, void *open_code_userdata, _Py_AuditHookEntry *audit_hook_head, Py_ssize_t unicode_next_index, - PyThread_type_lock unicode_ids_mutex, - PyThread_type_lock interpreters_mutex, - PyThread_type_lock xidregistry_mutex, - PyThread_type_lock getargs_mutex) + PyThread_type_lock locks[NUMLOCKS]) { if (runtime->_initialized) { Py_FatalError("runtime already initialized"); @@ -424,17 +403,21 @@ init_runtime(_PyRuntimeState *runtime, PyPreConfig_InitPythonConfig(&runtime->preconfig); - runtime->interpreters.mutex = interpreters_mutex; - - runtime->xidregistry.mutex = xidregistry_mutex; - - runtime->getargs.mutex = getargs_mutex; + PyThread_type_lock *lockptrs[NUMLOCKS] = { + &runtime->interpreters.mutex, + &runtime->xidregistry.mutex, + &runtime->getargs.mutex, + &runtime->unicode_state.ids.lock, + }; + for (int i = 0; i < NUMLOCKS; i++) { + assert(locks[i] != NULL); + *lockptrs[i] = locks[i]; + } // Set it to the ID of the main thread of the main interpreter. runtime->main_thread = PyThread_get_thread_ident(); runtime->unicode_state.ids.next_index = unicode_next_index; - runtime->unicode_state.ids.lock = unicode_ids_mutex; runtime->_initialized = 1; } @@ -452,8 +435,8 @@ _PyRuntimeState_Init(_PyRuntimeState *runtime) // is called multiple times. Py_ssize_t unicode_next_index = runtime->unicode_state.ids.next_index; - PyThread_type_lock lock1, lock2, lock3, lock4; - if (alloc_for_runtime(&lock1, &lock2, &lock3, &lock4) != 0) { + PyThread_type_lock locks[NUMLOCKS]; + if (alloc_for_runtime(locks) != 0) { return _PyStatus_NO_MEMORY(); } @@ -474,7 +457,7 @@ _PyRuntimeState_Init(_PyRuntimeState *runtime) } init_runtime(runtime, open_code_hook, open_code_userdata, audit_hook_head, - unicode_next_index, lock1, lock2, lock3, lock4); + unicode_next_index, locks); return _PyStatus_OK(); } @@ -504,10 +487,15 @@ _PyRuntimeState_Fini(_PyRuntimeState *runtime) LOCK = NULL; \ } - FREE_LOCK(runtime->interpreters.mutex); - FREE_LOCK(runtime->xidregistry.mutex); - FREE_LOCK(runtime->unicode_state.ids.lock); - FREE_LOCK(runtime->getargs.mutex); + PyThread_type_lock *lockptrs[NUMLOCKS] = { + &runtime->interpreters.mutex, + &runtime->xidregistry.mutex, + &runtime->getargs.mutex, + &runtime->unicode_state.ids.lock, + }; + for (int i = 0; i < NUMLOCKS; i++) { + FREE_LOCK(*lockptrs[i]); + } #undef FREE_LOCK PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); @@ -527,25 +515,25 @@ _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime) PyMemAllocatorEx old_alloc; _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - int reinit_interp = _PyThread_at_fork_reinit(&runtime->interpreters.mutex); - int reinit_xidregistry = _PyThread_at_fork_reinit(&runtime->xidregistry.mutex); - int reinit_unicode_ids = _PyThread_at_fork_reinit(&runtime->unicode_state.ids.lock); - int reinit_getargs = _PyThread_at_fork_reinit(&runtime->getargs.mutex); + PyThread_type_lock *lockptrs[NUMLOCKS] = { + &runtime->interpreters.mutex, + &runtime->xidregistry.mutex, + &runtime->getargs.mutex, + &runtime->unicode_state.ids.lock, + }; + int reinit_err = 0; + for (int i = 0; i < NUMLOCKS; i++) { + reinit_err += _PyThread_at_fork_reinit(lockptrs[i]); + } PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); /* bpo-42540: id_mutex is freed by _PyInterpreterState_Delete, which does * not force the default allocator. */ - int reinit_main_id = _PyThread_at_fork_reinit(&runtime->interpreters.main->id_mutex); + reinit_err += _PyThread_at_fork_reinit(&runtime->interpreters.main->id_mutex); - if (reinit_interp < 0 - || reinit_main_id < 0 - || reinit_xidregistry < 0 - || reinit_unicode_ids < 0 - || reinit_getargs < 0) - { + if (reinit_err < 0) { return _PyStatus_ERR("Failed to reinitialize runtime locks"); - } PyStatus status = gilstate_tss_reinit(runtime); From 1724553e6e8baae655901488968a40df981f32da Mon Sep 17 00:00:00 2001 From: Ijtaba Hussain Date: Thu, 6 Apr 2023 23:13:33 +0500 Subject: [PATCH 086/349] gh-103186: assert in tests that UnsafeMailcapInput warnings are provided (#103217) --- Lib/test/test_mailcap.py | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_mailcap.py b/Lib/test/test_mailcap.py index 819dc80a266433..8a94b0cb1f27c7 100644 --- a/Lib/test/test_mailcap.py +++ b/Lib/test/test_mailcap.py @@ -127,7 +127,6 @@ def test_subst(self): (["", "audio/*", "foo.txt"], ""), (["echo foo", "audio/*", "foo.txt"], "echo foo"), (["echo %s", "audio/*", "foo.txt"], "echo foo.txt"), - (["echo %t", "audio/*", "foo.txt"], None), (["echo %t", "audio/wav", "foo.txt"], "echo audio/wav"), (["echo \\%t", "audio/*", "foo.txt"], "echo %t"), (["echo foo", "audio/*", "foo.txt", plist], "echo foo"), @@ -210,9 +209,6 @@ def test_findmatch(self): ([c, "audio/basic"], {"key": "description", "filename": fname}, ('"An audio fragment"', audio_basic_entry)), - ([c, "audio/*"], - {"filename": fname}, - (None, None)), ([c, "audio/wav"], {"filename": fname}, ("/usr/local/bin/showaudio audio/wav", audio_entry)), @@ -245,6 +241,30 @@ def test_test(self): ] self._run_cases(cases) + def test_unsafe_mailcap_input(self): + with self.assertWarnsRegex(mailcap.UnsafeMailcapInput, + 'Refusing to substitute parameter.*' + 'into a shell command'): + unsafe_param = mailcap.subst("echo %{total}", + "audio/wav", + "foo.txt", + ["total=*"]) + self.assertEqual(unsafe_param, None) + + with self.assertWarnsRegex(mailcap.UnsafeMailcapInput, + 'Refusing to substitute MIME type' + '.*into a shell'): + unsafe_mimetype = mailcap.subst("echo %t", "audio/*", "foo.txt") + self.assertEqual(unsafe_mimetype, None) + + with self.assertWarnsRegex(mailcap.UnsafeMailcapInput, + 'Refusing to use mailcap with filename.*' + 'Use a safe temporary filename.'): + unsafe_filename = mailcap.findmatch(MAILCAPDICT, + "audio/wav", + filename="foo*.txt") + self.assertEqual(unsafe_filename, (None, None)) + def _run_cases(self, cases): for c in cases: self.assertEqual(mailcap.findmatch(*c[0], **c[1]), c[2]) From affedee8bf2ec00c404ffa39342a593a66bf95bd Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Thu, 6 Apr 2023 20:17:53 +0100 Subject: [PATCH 087/349] gh-103193: Use LBYL idioms rather than EAFP in `inspect.getattr_static` (#103318) --- Lib/inspect.py | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/Lib/inspect.py b/Lib/inspect.py index 8739c9c2572643..a317f0ca74884f 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1787,11 +1787,8 @@ def _check_instance(obj, attr): def _check_class(klass, attr): for entry in _static_getmro(klass): - if _shadowed_dict(type(entry)) is _sentinel: - try: - return entry.__dict__[attr] - except KeyError: - pass + if _shadowed_dict(type(entry)) is _sentinel and attr in entry.__dict__: + return entry.__dict__[attr] return _sentinel def _is_type(obj): @@ -1803,11 +1800,9 @@ def _is_type(obj): def _shadowed_dict(klass): for entry in _static_getmro(klass): - try: - class_dict = _get_dunder_dict_of_class(entry)["__dict__"] - except KeyError: - pass - else: + dunder_dict = _get_dunder_dict_of_class(entry) + if '__dict__' in dunder_dict: + class_dict = dunder_dict['__dict__'] if not (type(class_dict) is types.GetSetDescriptorType and class_dict.__name__ == "__dict__" and class_dict.__objclass__ is entry): @@ -1850,11 +1845,11 @@ def getattr_static(obj, attr, default=_sentinel): if obj is klass: # for types we check the metaclass too for entry in _static_getmro(type(klass)): - if _shadowed_dict(type(entry)) is _sentinel: - try: - return entry.__dict__[attr] - except KeyError: - pass + if ( + _shadowed_dict(type(entry)) is _sentinel + and attr in entry.__dict__ + ): + return entry.__dict__[attr] if default is not _sentinel: return default raise AttributeError(attr) From dca7d174f1dc3f9e67c7451a27bc92dc5a733008 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Thu, 6 Apr 2023 21:49:24 +0100 Subject: [PATCH 088/349] gh-103193: Speedup and inline `inspect._is_type` (#103321) Improve performance of `inspect.getattr_static` --- Lib/inspect.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/Lib/inspect.py b/Lib/inspect.py index a317f0ca74884f..4242b40c2a08df 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1791,13 +1791,6 @@ def _check_class(klass, attr): return entry.__dict__[attr] return _sentinel -def _is_type(obj): - try: - _static_getmro(obj) - except TypeError: - return False - return True - def _shadowed_dict(klass): for entry in _static_getmro(klass): dunder_dict = _get_dunder_dict_of_class(entry) @@ -1821,8 +1814,10 @@ def getattr_static(obj, attr, default=_sentinel): documentation for details. """ instance_result = _sentinel - if not _is_type(obj): - klass = type(obj) + + objtype = type(obj) + if type not in _static_getmro(objtype): + klass = objtype dict_attr = _shadowed_dict(klass) if (dict_attr is _sentinel or type(dict_attr) is types.MemberDescriptorType): From 5d08c3ff7d89ca11556f18663a372f6c12435504 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Thu, 6 Apr 2023 14:19:54 -0700 Subject: [PATCH 089/349] GH-102700: allow built-in modules to be submodules (GH-103162) --- Lib/importlib/_bootstrap.py | 2 -- Lib/test/test_importlib/builtin/test_finder.py | 17 ----------------- ...23-04-01-00-46-31.gh-issue-102700.493NB4.rst | 1 + 3 files changed, 1 insertion(+), 19 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-04-01-00-46-31.gh-issue-102700.493NB4.rst diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index bebe7e15cbce67..22fa2469964ab3 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -887,8 +887,6 @@ class BuiltinImporter: @classmethod def find_spec(cls, fullname, path=None, target=None): - if path is not None: - return None if _imp.is_builtin(fullname): return spec_from_loader(fullname, cls, origin=cls._ORIGIN) else: diff --git a/Lib/test/test_importlib/builtin/test_finder.py b/Lib/test/test_importlib/builtin/test_finder.py index a4869e07b9c0c2..81dc5a3699d952 100644 --- a/Lib/test/test_importlib/builtin/test_finder.py +++ b/Lib/test/test_importlib/builtin/test_finder.py @@ -37,13 +37,6 @@ def test_failure(self): spec = self.machinery.BuiltinImporter.find_spec(name) self.assertIsNone(spec) - def test_ignore_path(self): - # The value for 'path' should always trigger a failed import. - with util.uncache(util.BUILTINS.good_name): - spec = self.machinery.BuiltinImporter.find_spec(util.BUILTINS.good_name, - ['pkg']) - self.assertIsNone(spec) - (Frozen_FindSpecTests, Source_FindSpecTests @@ -77,16 +70,6 @@ def test_failure(self): loader = self.machinery.BuiltinImporter.find_module('importlib') self.assertIsNone(loader) - def test_ignore_path(self): - # The value for 'path' should always trigger a failed import. - with util.uncache(util.BUILTINS.good_name): - with warnings.catch_warnings(): - warnings.simplefilter("ignore", DeprecationWarning) - loader = self.machinery.BuiltinImporter.find_module( - util.BUILTINS.good_name, - ['pkg']) - self.assertIsNone(loader) - (Frozen_FinderTests, Source_FinderTests diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-04-01-00-46-31.gh-issue-102700.493NB4.rst b/Misc/NEWS.d/next/Core and Builtins/2023-04-01-00-46-31.gh-issue-102700.493NB4.rst new file mode 100644 index 00000000000000..46951486e4f9c9 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-04-01-00-46-31.gh-issue-102700.493NB4.rst @@ -0,0 +1 @@ +Allow built-in modules to be submodules. This allows submodules to be statically linked into a CPython binary. From a653c32d08abfa34d70186542479e3a7e704f8bd Mon Sep 17 00:00:00 2001 From: AGZain <31054801+AGZain@users.noreply.github.com> Date: Thu, 6 Apr 2023 18:19:11 -0400 Subject: [PATCH 090/349] gh-93121: fix test_mailbox where some test cases were accidentally dropped (#93242) --- Lib/test/test_mailbox.py | 45 ++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py index 07c2764dfd1b2f..4c592eaf34da23 100644 --- a/Lib/test/test_mailbox.py +++ b/Lib/test/test_mailbox.py @@ -31,7 +31,7 @@ def _check_sample(self, msg): # Inspect a mailbox.Message representation of the sample message self.assertIsInstance(msg, email.message.Message) self.assertIsInstance(msg, mailbox.Message) - for key, value in _sample_headers.items(): + for key, value in _sample_headers: self.assertIn(value, msg.get_all(key)) self.assertTrue(msg.is_multipart()) self.assertEqual(len(msg.get_payload()), len(_sample_payloads)) @@ -2264,30 +2264,31 @@ def test_nonempty_maildir_both(self): _bytes_sample_message = _sample_message.encode('ascii') -_sample_headers = { - "Return-Path":"", - "X-Original-To":"gkj+person@localhost", - "Delivered-To":"gkj+person@localhost", - "Received":"""from localhost (localhost [127.0.0.1]) +_sample_headers = [ + ("Return-Path", ""), + ("X-Original-To", "gkj+person@localhost"), + ("Delivered-To", "gkj+person@localhost"), + ("Received", """from localhost (localhost [127.0.0.1]) by andy.gregorykjohnson.com (Postfix) with ESMTP id 356ED9DD17 - for ; Wed, 13 Jul 2005 17:23:16 -0400 (EDT)""", - "Delivered-To":"gkj@sundance.gregorykjohnson.com", - "Received":"""from localhost [127.0.0.1] + for ; Wed, 13 Jul 2005 17:23:16 -0400 (EDT)"""), + ("Delivered-To", "gkj@sundance.gregorykjohnson.com"), + ("Received", """from localhost [127.0.0.1] by localhost with POP3 (fetchmail-6.2.5) - for gkj+person@localhost (single-drop); Wed, 13 Jul 2005 17:23:16 -0400 (EDT)""", - "Received":"""from andy.gregorykjohnson.com (andy.gregorykjohnson.com [64.32.235.228]) + for gkj+person@localhost (single-drop); Wed, 13 Jul 2005 17:23:16 -0400 (EDT)"""), + ("Received", """from andy.gregorykjohnson.com (andy.gregorykjohnson.com [64.32.235.228]) by sundance.gregorykjohnson.com (Postfix) with ESMTP id 5B056316746 - for ; Wed, 13 Jul 2005 17:23:11 -0400 (EDT)""", - "Received":"""by andy.gregorykjohnson.com (Postfix, from userid 1000) - id 490CD9DD17; Wed, 13 Jul 2005 17:23:11 -0400 (EDT)""", - "Date":"Wed, 13 Jul 2005 17:23:11 -0400", - "From":""""Gregory K. Johnson" """, - "To":"gkj@gregorykjohnson.com", - "Subject":"Sample message", - "Mime-Version":"1.0", - "Content-Type":"""multipart/mixed; boundary="NMuMz9nt05w80d4+\"""", - "Content-Disposition":"inline", - "User-Agent": "Mutt/1.5.9i" } + for ; Wed, 13 Jul 2005 17:23:11 -0400 (EDT)"""), + ("Received", """by andy.gregorykjohnson.com (Postfix, from userid 1000) + id 490CD9DD17; Wed, 13 Jul 2005 17:23:11 -0400 (EDT)"""), + ("Date", "Wed, 13 Jul 2005 17:23:11 -0400"), + ("From", """"Gregory K. Johnson" """), + ("To", "gkj@gregorykjohnson.com"), + ("Subject", "Sample message"), + ("Mime-Version", "1.0"), + ("Content-Type", """multipart/mixed; boundary="NMuMz9nt05w80d4+\""""), + ("Content-Disposition", "inline"), + ("User-Agent", "Mutt/1.5.9i"), +] _sample_payloads = ("""This is a sample message. From f0424ba4b6663d2a4240239266bea08aff46bb6c Mon Sep 17 00:00:00 2001 From: Oleg Iarygin Date: Fri, 7 Apr 2023 04:34:19 +0400 Subject: [PATCH 091/349] gh-103266: Fix a typo in example code for bisect() function (#103267) --- Doc/library/bisect.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/bisect.rst b/Doc/library/bisect.rst index b85564f17866e0..e3c8c801904b61 100644 --- a/Doc/library/bisect.rst +++ b/Doc/library/bisect.rst @@ -210,10 +210,10 @@ records in a table:: >>> Movie = namedtuple('Movie', ('name', 'released', 'director')) >>> movies = [ - ... Movie('Jaws', 1975, 'Speilberg'), + ... Movie('Jaws', 1975, 'Spielberg'), ... Movie('Titanic', 1997, 'Cameron'), ... Movie('The Birds', 1963, 'Hitchcock'), - ... Movie('Aliens', 1986, 'Scott') + ... Movie('Aliens', 1986, 'Cameron') ... ] >>> # Find the first movie released after 1960 @@ -228,8 +228,8 @@ records in a table:: >>> pprint(movies) [Movie(name='The Birds', released=1963, director='Hitchcock'), Movie(name='Love Story', released=1970, director='Hiller'), - Movie(name='Jaws', released=1975, director='Speilberg'), - Movie(name='Aliens', released=1986, director='Scott'), + Movie(name='Jaws', released=1975, director='Spielberg'), + Movie(name='Aliens', released=1986, director='Cameron'), Movie(name='Titanic', released=1997, director='Cameron')] If the key function is expensive, it is possible to avoid repeated function From efb0a2cf3adf4629cf4669cb558758fb78107319 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Fri, 7 Apr 2023 10:51:29 +0900 Subject: [PATCH 092/349] gh-103256: Fix hmac algorithm to support fallback implementation (gh-103286) Co-authored-by: Gregory P. Smith --- Lib/test/test_hmac.py | 10 ++++++++++ .../2023-04-06-17-28-36.gh-issue-103256.1syxfs.rst | 6 ++++++ Modules/_hashopenssl.c | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-06-17-28-36.gh-issue-103256.1syxfs.rst diff --git a/Lib/test/test_hmac.py b/Lib/test/test_hmac.py index 7cf99735ca39f0..a39a2c45ebc2e2 100644 --- a/Lib/test/test_hmac.py +++ b/Lib/test/test_hmac.py @@ -373,6 +373,16 @@ def test_with_digestmod_no_default(self): with self.assertRaisesRegex(TypeError, r'required.*digestmod'): hmac.HMAC(key, msg=data, digestmod='') + def test_with_fallback(self): + cache = getattr(hashlib, '__builtin_constructor_cache') + try: + cache['foo'] = hashlib.sha256 + hexdigest = hmac.digest(b'key', b'message', 'foo').hex() + expected = '6e9ef29b75fffc5b7abae527d58fdadb2fe42e7219011976917343065f58ed4a' + self.assertEqual(hexdigest, expected) + finally: + cache.pop('foo') + class ConstructorTestCase(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2023-04-06-17-28-36.gh-issue-103256.1syxfs.rst b/Misc/NEWS.d/next/Library/2023-04-06-17-28-36.gh-issue-103256.1syxfs.rst new file mode 100644 index 00000000000000..894c046dcdf0fd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-06-17-28-36.gh-issue-103256.1syxfs.rst @@ -0,0 +1,6 @@ +Fixed a bug that caused :mod:`hmac` to raise an exception when the requested +hash algorithm was not available in OpenSSL despite being available +separately as part of ``hashlib`` itself. It now falls back properly to the +built-in. This could happen when, for example, your OpenSSL does not include +SHA3 support and you want to compute ``hmac.digest(b'K', b'M', +'sha3_256')``. diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index ee8c588020118c..7476e5dc7dd61e 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -355,7 +355,7 @@ py_digest_by_name(PyObject *module, const char *name, enum Py_hash_type py_ht) } } if (digest == NULL) { - _setException(PyExc_ValueError, "unsupported hash type %s", name); + _setException(state->unsupported_digestmod_error, "unsupported hash type %s", name); return NULL; } return digest; From 059bb04245a8b3490f93dfd72522a431a113eef1 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Fri, 7 Apr 2023 12:22:36 +0300 Subject: [PATCH 093/349] gh-102213: Revert "gh-102213: Optimize the performance of `__getattr__` (GH-102248)" (GH-103332) This reverts commit aa0a73d1bc53dcb6348a869df1e775138991e561. --- Include/internal/pycore_object.h | 1 - Objects/object.c | 6 ------ Objects/typeobject.c | 9 +++------ 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index e18e787449c257..b3d496ed6fc240 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -375,7 +375,6 @@ extern void _PyObject_FreeInstanceAttributes(PyObject *obj); extern int _PyObject_IsInstanceDictEmpty(PyObject *); extern int _PyType_HasSubclasses(PyTypeObject *); extern PyObject* _PyType_GetSubclasses(PyTypeObject *); -extern PyObject* _PyObject_GenericTryGetAttr(PyObject *, PyObject *); // Access macro to the members which are floating "behind" the object static inline PyMemberDef* _PyHeapType_GET_MEMBERS(PyHeapTypeObject *etype) { diff --git a/Objects/object.c b/Objects/object.c index 9dd5eb998217f6..71f098eed37f51 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1491,12 +1491,6 @@ PyObject_GenericGetAttr(PyObject *obj, PyObject *name) return _PyObject_GenericGetAttrWithDict(obj, name, NULL, 0); } -PyObject * -_PyObject_GenericTryGetAttr(PyObject *obj, PyObject *name) -{ - return _PyObject_GenericGetAttrWithDict(obj, name, NULL, 1); -} - int _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name, PyObject *value, PyObject *dict) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 24541bddbbc33f..995547e7915f77 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -8274,17 +8274,14 @@ _Py_slot_tp_getattr_hook(PyObject *self, PyObject *name) (Py_IS_TYPE(getattribute, &PyWrapperDescr_Type) && ((PyWrapperDescrObject *)getattribute)->d_wrapped == (void *)PyObject_GenericGetAttr)) - /* finding nothing is reasonable when __getattr__ is defined */ - res = _PyObject_GenericTryGetAttr(self, name); + res = PyObject_GenericGetAttr(self, name); else { Py_INCREF(getattribute); res = call_attribute(self, getattribute, name); Py_DECREF(getattribute); } - if (res == NULL) { - if (PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Clear(); - } + if (res == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); res = call_attribute(self, getattr, name); } Py_DECREF(getattr); From 995386071f96e4cfebfa027a71ca9134e4651d2a Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Fri, 7 Apr 2023 13:43:41 +0300 Subject: [PATCH 094/349] bpo-46523: fix tests rerun when `setUp[Class|Module]` fails (#30895) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jelle Zijlstra Co-authored-by: Łukasz Langa --- Lib/test/libregrtest/main.py | 31 ++++++- Lib/test/support/__init__.py | 2 +- Lib/test/test_regrtest.py | 154 +++++++++++++++++++++++++++++++++++ 3 files changed, 184 insertions(+), 3 deletions(-) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 19ccf2db5e7f06..3c3509d0303371 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -29,6 +29,14 @@ # Must be smaller than buildbot "1200 seconds without output" limit. EXIT_TIMEOUT = 120.0 +# gh-90681: When rerunning tests, we might need to rerun the whole +# class or module suite if some its life-cycle hooks fail. +# Test level hooks are not affected. +_TEST_LIFECYCLE_HOOKS = frozenset(( + 'setUpClass', 'tearDownClass', + 'setUpModule', 'tearDownModule', +)) + EXITCODE_BAD_TEST = 2 EXITCODE_INTERRUPTED = 130 EXITCODE_ENV_CHANGED = 3 @@ -337,8 +345,12 @@ def rerun_failed_tests(self): errors = result.errors or [] failures = result.failures or [] - error_names = [test_full_name.split(" ")[0] for (test_full_name, *_) in errors] - failure_names = [test_full_name.split(" ")[0] for (test_full_name, *_) in failures] + error_names = [ + self.normalize_test_name(test_full_name, is_error=True) + for (test_full_name, *_) in errors] + failure_names = [ + self.normalize_test_name(test_full_name) + for (test_full_name, *_) in failures] self.ns.verbose = True orig_match_tests = self.ns.match_tests if errors or failures: @@ -364,6 +376,21 @@ def rerun_failed_tests(self): self.display_result() + def normalize_test_name(self, test_full_name, *, is_error=False): + short_name = test_full_name.split(" ")[0] + if is_error and short_name in _TEST_LIFECYCLE_HOOKS: + # This means that we have a failure in a life-cycle hook, + # we need to rerun the whole module or class suite. + # Basically the error looks like this: + # ERROR: setUpClass (test.test_reg_ex.RegTest) + # or + # ERROR: setUpModule (test.test_reg_ex) + # So, we need to parse the class / module name. + lpar = test_full_name.index('(') + rpar = test_full_name.index(')') + return test_full_name[lpar + 1: rpar].split('.')[-1] + return short_name + def display_result(self): # If running the test suite for PGO then no one cares about results. if self.ns.pgo: diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index c309fd7910e0e6..d063837baee2de 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -1108,7 +1108,7 @@ def _run_suite(suite): if junit_xml_list is not None: junit_xml_list.append(result.get_xml_element()) - if not result.testsRun and not result.skipped: + if not result.testsRun and not result.skipped and not result.errors: raise TestDidNotRun if not result.wasSuccessful(): if len(result.errors) == 1 and not result.failures: diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index baae4efc2ad789..ac49fbae847726 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -1120,6 +1120,160 @@ def test_fail_once(self): self.check_executed_tests(output, [testname], rerun={testname: "test_fail_once"}) + def test_rerun_setup_class_hook_failure(self): + # FAILURE then FAILURE + code = textwrap.dedent(""" + import unittest + + class ExampleTests(unittest.TestCase): + @classmethod + def setUpClass(self): + raise RuntimeError('Fail') + + def test_success(self): + return + """) + testname = self.create_test(code=code) + + output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) + self.check_executed_tests(output, testname, + failed=[testname], + rerun={testname: "ExampleTests"}) + + def test_rerun_teardown_class_hook_failure(self): + # FAILURE then FAILURE + code = textwrap.dedent(""" + import unittest + + class ExampleTests(unittest.TestCase): + @classmethod + def tearDownClass(self): + raise RuntimeError('Fail') + + def test_success(self): + return + """) + testname = self.create_test(code=code) + + output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) + self.check_executed_tests(output, testname, + failed=[testname], + rerun={testname: "ExampleTests"}) + + def test_rerun_setup_module_hook_failure(self): + # FAILURE then FAILURE + code = textwrap.dedent(""" + import unittest + + def setUpModule(): + raise RuntimeError('Fail') + + class ExampleTests(unittest.TestCase): + def test_success(self): + return + """) + testname = self.create_test(code=code) + + output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) + self.check_executed_tests(output, testname, + failed=[testname], + rerun={testname: testname}) + + def test_rerun_teardown_module_hook_failure(self): + # FAILURE then FAILURE + code = textwrap.dedent(""" + import unittest + + def tearDownModule(): + raise RuntimeError('Fail') + + class ExampleTests(unittest.TestCase): + def test_success(self): + return + """) + testname = self.create_test(code=code) + + output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) + self.check_executed_tests(output, testname, + failed=[testname], + rerun={testname: testname}) + + def test_rerun_setup_hook_failure(self): + # FAILURE then FAILURE + code = textwrap.dedent(""" + import unittest + + class ExampleTests(unittest.TestCase): + def setUp(self): + raise RuntimeError('Fail') + + def test_success(self): + return + """) + testname = self.create_test(code=code) + + output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) + self.check_executed_tests(output, testname, + failed=[testname], + rerun={testname: "test_success"}) + + def test_rerun_teardown_hook_failure(self): + # FAILURE then FAILURE + code = textwrap.dedent(""" + import unittest + + class ExampleTests(unittest.TestCase): + def tearDown(self): + raise RuntimeError('Fail') + + def test_success(self): + return + """) + testname = self.create_test(code=code) + + output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) + self.check_executed_tests(output, testname, + failed=[testname], + rerun={testname: "test_success"}) + + def test_rerun_async_setup_hook_failure(self): + # FAILURE then FAILURE + code = textwrap.dedent(""" + import unittest + + class ExampleTests(unittest.IsolatedAsyncioTestCase): + async def asyncSetUp(self): + raise RuntimeError('Fail') + + async def test_success(self): + return + """) + testname = self.create_test(code=code) + + output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) + self.check_executed_tests(output, testname, + failed=[testname], + rerun={testname: "test_success"}) + + def test_rerun_async_teardown_hook_failure(self): + # FAILURE then FAILURE + code = textwrap.dedent(""" + import unittest + + class ExampleTests(unittest.IsolatedAsyncioTestCase): + async def asyncTearDown(self): + raise RuntimeError('Fail') + + async def test_success(self): + return + """) + testname = self.create_test(code=code) + + output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) + self.check_executed_tests(output, testname, + failed=[testname], + rerun={testname: "test_success"}) + def test_no_tests_ran(self): code = textwrap.dedent(""" import unittest From 4dc339b4d69195448207e1faecc3e258700daf33 Mon Sep 17 00:00:00 2001 From: AN Long Date: Fri, 7 Apr 2023 19:56:00 +0800 Subject: [PATCH 095/349] GH-88013: Fix TypeError raised by ntpath.realpath in some cases (GH-102813) --- Lib/ntpath.py | 2 +- Lib/test/test_ntpath.py | 7 +++++++ .../Windows/2023-03-18-21-38-00.gh-issue-88013.Z3loxC.rst | 2 ++ 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Windows/2023-03-18-21-38-00.gh-issue-88013.Z3loxC.rst diff --git a/Lib/ntpath.py b/Lib/ntpath.py index e93a5e69600973..6e2da79c85d3f0 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -670,7 +670,7 @@ def _getfinalpathname_nonstrict(path): # Non-strict algorithm is to find as much of the target directory # as we can and join the rest. - tail = '' + tail = path[:0] while path: try: path = _getfinalpathname(path) diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py index 08c8a7a1f94b95..4e755d15403916 100644 --- a/Lib/test/test_ntpath.py +++ b/Lib/test/test_ntpath.py @@ -1,6 +1,7 @@ import inspect import ntpath import os +import string import sys import unittest import warnings @@ -374,6 +375,12 @@ def test_realpath_basic(self): self.assertPathEqual(ntpath.realpath(os.fsencode(ABSTFN + "1")), os.fsencode(ABSTFN)) + # gh-88013: call ntpath.realpath with binary drive name may raise a + # TypeError. The drive should not exist to reproduce the bug. + drives = {f"{c}:\\" for c in string.ascii_uppercase} - set(os.listdrives()) + d = drives.pop().encode() + self.assertEqual(ntpath.realpath(d), d) + @os_helper.skip_unless_symlink @unittest.skipUnless(HAVE_GETFINALPATHNAME, 'need _getfinalpathname') def test_realpath_strict(self): diff --git a/Misc/NEWS.d/next/Windows/2023-03-18-21-38-00.gh-issue-88013.Z3loxC.rst b/Misc/NEWS.d/next/Windows/2023-03-18-21-38-00.gh-issue-88013.Z3loxC.rst new file mode 100644 index 00000000000000..4ca3185ea1f65e --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2023-03-18-21-38-00.gh-issue-88013.Z3loxC.rst @@ -0,0 +1,2 @@ +Fixed a bug where :exc:`TypeError` was raised when calling +:func:`ntpath.realpath` with a bytes parameter in some cases. From 04501ee57e7f6ef216b15b45785285fe4acebc42 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Fri, 7 Apr 2023 18:14:50 +0100 Subject: [PATCH 096/349] gh-103193: Celebrate performance improvements to `inspect.getattr_static` in 'What's New in Python 3.12' (#103349) --- Doc/whatsnew/3.12.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 23524ec5d7d452..3a12fb20c43c51 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -255,6 +255,10 @@ inspect for determining the current state of asynchronous generators. (Contributed by Thomas Krennwallner in :issue:`35759`.) +* The performance of :func:`inspect.getattr_static` has been considerably + improved. Most calls to the function should be around 2x faster than they + were in Python 3.11. (Contributed by Alex Waygood in :gh:`103193`.) + pathlib ------- From 800382a2b0980c21dfb2a8ac02aaf1e881f987b9 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Fri, 7 Apr 2023 18:21:19 +0100 Subject: [PATCH 097/349] gh-74690: Add more tests for runtime-checkable protocols (#103347) --- Lib/test/test_typing.py | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 7d2e6a6a9f6287..b8eee9a570a301 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -2577,6 +2577,22 @@ def meth(x): ... class PG(Protocol[T]): def meth(x): ... + @runtime_checkable + class WeirdProto(Protocol): + meth = str.maketrans + + @runtime_checkable + class WeirdProto2(Protocol): + meth = lambda *args, **kwargs: None + + class CustomCallable: + def __call__(self, *args, **kwargs): + pass + + @runtime_checkable + class WeirderProto(Protocol): + meth = CustomCallable() + class BadP(Protocol): def meth(x): ... @@ -2586,8 +2602,15 @@ def meth(x): ... class C: def meth(x): ... - self.assertIsInstance(C(), P) - self.assertIsInstance(C(), PG) + class C2: + def __init__(self): + self.meth = lambda: None + + for klass in C, C2: + for proto in P, PG, WeirdProto, WeirdProto2, WeirderProto: + with self.subTest(klass=klass.__name__, proto=proto.__name__): + self.assertIsInstance(klass(), proto) + with self.assertRaises(TypeError): isinstance(C(), PG[T]) with self.assertRaises(TypeError): @@ -2829,6 +2852,20 @@ def __init__(self, x): self.assertIsInstance(C(1), P) self.assertIsInstance(C(1), PG) + def test_protocols_isinstance_monkeypatching(self): + @runtime_checkable + class HasX(Protocol): + x: int + + class Foo: ... + + f = Foo() + self.assertNotIsInstance(f, HasX) + f.x = 42 + self.assertIsInstance(f, HasX) + del f.x + self.assertNotIsInstance(f, HasX) + def test_protocol_checks_after_subscript(self): class P(Protocol[T]): pass class C(P[T]): pass From 2667452945eb0a3b8993bb4298ca8da54dc0155a Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Fri, 7 Apr 2023 10:57:46 -0700 Subject: [PATCH 098/349] gh-103225: Fixed zero lineno issue for pdb (#103265) Co-authored-by: Artem Mukhin --- Lib/pdb.py | 14 +++++++++-- Lib/test/test_pdb.py | 25 +++++++++++++++++++ ...-04-05-01-28-53.gh-issue-103225.QD3JVU.rst | 1 + 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-05-01-28-53.gh-issue-103225.QD3JVU.rst diff --git a/Lib/pdb.py b/Lib/pdb.py index 3a06cd00ad2bf1..e043b0d46f7dd0 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1351,7 +1351,7 @@ def do_longlist(self, arg): filename = self.curframe.f_code.co_filename breaklist = self.get_file_breaks(filename) try: - lines, lineno = inspect.getsourcelines(self.curframe) + lines, lineno = self._getsourcelines(self.curframe) except OSError as err: self.error(err) return @@ -1367,7 +1367,7 @@ def do_source(self, arg): except: return try: - lines, lineno = inspect.getsourcelines(obj) + lines, lineno = self._getsourcelines(obj) except (OSError, TypeError) as err: self.error(err) return @@ -1662,6 +1662,16 @@ def _compile_error_message(self, expr): return _rstr(self._format_exc(exc)) return "" + def _getsourcelines(self, obj): + # GH-103319 + # inspect.getsourcelines() returns lineno = 0 for + # module-level frame which breaks our code print line number + # This method should be replaced by inspect.getsourcelines(obj) + # once this bug is fixed in inspect + lines, lineno = inspect.getsourcelines(obj) + lineno = max(1, lineno) + return lines, lineno + # Collect all command help into docstring, if not run with -OO if __doc__ is not None: diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index de2bab46495729..9ad9a1c52ac102 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -1675,6 +1675,31 @@ def test_pdb_issue_gh_101673(): (Pdb) continue """ +def test_pdb_issue_gh_103225(): + """See GH-103225 + + Make sure longlist uses 1-based line numbers in frames that correspond to a module + + >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE + ... 'longlist', + ... 'continue' + ... ]): + ... a = 1 + ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() + ... b = 2 + > (7)() + -> b = 2 + (Pdb) longlist + 1 with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE + 2 'longlist', + 3 'continue' + 4 ]): + 5 a = 1 + 6 import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() + 7 -> b = 2 + (Pdb) continue + """ + @support.requires_subprocess() class PdbTestCase(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2023-04-05-01-28-53.gh-issue-103225.QD3JVU.rst b/Misc/NEWS.d/next/Library/2023-04-05-01-28-53.gh-issue-103225.QD3JVU.rst new file mode 100644 index 00000000000000..5d1a063acdeb8c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-05-01-28-53.gh-issue-103225.QD3JVU.rst @@ -0,0 +1 @@ +Fix a bug in :mod:`pdb` when displaying line numbers of module-level source code. From a90863c993157ae65e040476cf46abd73ae54b4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Fri, 7 Apr 2023 18:23:59 +0000 Subject: [PATCH 099/349] gh-100220: Fix error handling in make rules (GH-100328) Set `SHELL = /bin/sh -e` to ensure that complex recipes fail on the first error rather than incorrectly reporting success. Co-authored-by: Zachary Ware --- Makefile.pre.in | 2 +- .../next/Build/2022-12-18-07-24-44.gh-issue-100220.BgSV7C.rst | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Build/2022-12-18-07-24-44.gh-issue-100220.BgSV7C.rst diff --git a/Makefile.pre.in b/Makefile.pre.in index 1c1bddcad82475..fefa5d4e8147bf 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -59,7 +59,7 @@ DSYMUTIL_PATH= @DSYMUTIL_PATH@ GNULD= @GNULD@ # Shell used by make (some versions default to the login shell, which is bad) -SHELL= /bin/sh +SHELL= /bin/sh -e # Use this to make a link between python$(VERSION) and python in $(BINDIR) LN= @LN@ diff --git a/Misc/NEWS.d/next/Build/2022-12-18-07-24-44.gh-issue-100220.BgSV7C.rst b/Misc/NEWS.d/next/Build/2022-12-18-07-24-44.gh-issue-100220.BgSV7C.rst new file mode 100644 index 00000000000000..7135317cd06fa2 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2022-12-18-07-24-44.gh-issue-100220.BgSV7C.rst @@ -0,0 +1,4 @@ +Changed the default value of the ``SHELL`` Makefile variable from ``/bin/sh`` +to ``/bin/sh -e`` to ensure that complex recipes correctly fail after an error. +Previously, ``make install`` could fail to install some files and yet return +a successful result. From 5d7d86f2fdbbfc23325e7256ee289bf20ce7124e Mon Sep 17 00:00:00 2001 From: sunmy2019 <59365878+sunmy2019@users.noreply.github.com> Date: Sat, 8 Apr 2023 03:11:11 +0800 Subject: [PATCH 100/349] gh-103272: regression test for getattr exception in property (#103336) --- Lib/test/test_descr.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index cbc020d1d3904a..f17bb1813b9d87 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -5003,6 +5003,19 @@ class Child(Parent): gc.collect() self.assertEqual(Parent.__subclasses__(), []) + def test_attr_raise_through_property(self): + # add test case for gh-103272 + class A: + def __getattr__(self, name): + raise ValueError("FOO") + + @property + def foo(self): + return self.__getattr__("asdf") + + with self.assertRaisesRegex(ValueError, "FOO"): + A().foo + class DictProxyTests(unittest.TestCase): def setUp(self): From 644136563da653a93268cb8cae7e25ff691047a3 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Fri, 7 Apr 2023 22:06:37 +0100 Subject: [PATCH 101/349] gh-74690: Document changes made to runtime-checkable protocols in 3.12 (#103348) Co-authored-by: Jelle Zijlstra --- Doc/library/typing.rst | 27 +++++++++----- Doc/whatsnew/3.12.rst | 35 +++++++++++++++++++ ...3-04-07-15-09-26.gh-issue-74690.0f886b.rst | 3 ++ ...3-04-07-15-15-40.gh-issue-74690.un84hh.rst | 8 +++++ 4 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-07-15-09-26.gh-issue-74690.0f886b.rst create mode 100644 Misc/NEWS.d/next/Library/2023-04-07-15-15-40.gh-issue-74690.un84hh.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 8728ca7b6b358c..03ff259bbdf75f 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1598,15 +1598,6 @@ These are not used in annotations. They are building blocks for creating generic import threading assert isinstance(threading.Thread(name='Bob'), Named) - .. versionchanged:: 3.12 - The internal implementation of :func:`isinstance` checks against - runtime-checkable protocols now uses :func:`inspect.getattr_static` - to look up attributes (previously, :func:`hasattr` was used). - As a result, some objects which used to be considered instances - of a runtime-checkable protocol may no longer be considered instances - of that protocol on Python 3.12+, and vice versa. - Most users are unlikely to be affected by this change. - .. note:: :func:`!runtime_checkable` will check only the presence of the required @@ -1628,6 +1619,24 @@ These are not used in annotations. They are building blocks for creating generic .. versionadded:: 3.8 + .. versionchanged:: 3.12 + The internal implementation of :func:`isinstance` checks against + runtime-checkable protocols now uses :func:`inspect.getattr_static` + to look up attributes (previously, :func:`hasattr` was used). + As a result, some objects which used to be considered instances + of a runtime-checkable protocol may no longer be considered instances + of that protocol on Python 3.12+, and vice versa. + Most users are unlikely to be affected by this change. + + .. versionchanged:: 3.12 + The members of a runtime-checkable protocol are now considered "frozen" + at runtime as soon as the class has been created. Monkey-patching + attributes onto a runtime-checkable protocol will still work, but will + have no impact on :func:`isinstance` checks comparing objects to the + protocol. See :ref:`"What's new in Python 3.12" ` + for more details. + + Other special directives """""""""""""""""""""""" diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 3a12fb20c43c51..66e40ef7326cc0 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -422,6 +422,8 @@ tempfile The :class:`tempfile.NamedTemporaryFile` function has a new optional parameter *delete_on_close* (Contributed by Evgeny Zorin in :gh:`58451`.) +.. _whatsnew-typing-py312: + typing ------ @@ -441,6 +443,39 @@ typing vice versa. Most users are unlikely to be affected by this change. (Contributed by Alex Waygood in :gh:`102433`.) +* The members of a runtime-checkable protocol are now considered "frozen" at + runtime as soon as the class has been created. Monkey-patching attributes + onto a runtime-checkable protocol will still work, but will have no impact on + :func:`isinstance` checks comparing objects to the protocol. For example:: + + >>> from typing import Protocol, runtime_checkable + >>> @runtime_checkable + ... class HasX(Protocol): + ... x = 1 + ... + >>> class Foo: ... + ... + >>> f = Foo() + >>> isinstance(f, HasX) + False + >>> f.x = 1 + >>> isinstance(f, HasX) + True + >>> HasX.y = 2 + >>> isinstance(f, HasX) # unchanged, even though HasX now also has a "y" attribute + True + + This change was made in order to speed up ``isinstance()`` checks against + runtime-checkable protocols. + +* The performance profile of :func:`isinstance` checks against + :func:`runtime-checkable protocols ` has changed + significantly. Most ``isinstance()`` checks against protocols with only a few + members should be at least 2x faster than in 3.11, and some may be 20x + faster or more. However, ``isinstance()`` checks against protocols with seven + or more members may be slower than in Python 3.11. (Contributed by Alex + Waygood in :gh:`74690` and :gh:`103193`.) + sys --- diff --git a/Misc/NEWS.d/next/Library/2023-04-07-15-09-26.gh-issue-74690.0f886b.rst b/Misc/NEWS.d/next/Library/2023-04-07-15-09-26.gh-issue-74690.0f886b.rst new file mode 100644 index 00000000000000..0a103ae11970d4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-07-15-09-26.gh-issue-74690.0f886b.rst @@ -0,0 +1,3 @@ +The members of a runtime-checkable protocol are now considered "frozen" at +runtime as soon as the class has been created. See +:ref:`"What's new in Python 3.12" ` for more details. diff --git a/Misc/NEWS.d/next/Library/2023-04-07-15-15-40.gh-issue-74690.un84hh.rst b/Misc/NEWS.d/next/Library/2023-04-07-15-15-40.gh-issue-74690.un84hh.rst new file mode 100644 index 00000000000000..48f11aac692ddb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-07-15-15-40.gh-issue-74690.un84hh.rst @@ -0,0 +1,8 @@ +The performance of :func:`isinstance` checks against +:func:`runtime-checkable protocols ` has been +considerably improved for protocols that only have a few members. To achieve +this improvement, several internal implementation details of the +:mod:`typing` module have been refactored, including +``typing._ProtocolMeta.__instancecheck__``, +``typing._is_callable_members_only``, and ``typing._get_protocol_attrs``. +Patches by Alex Waygood. From 91794e587306343619a451473efae22aa9f4b9bd Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sat, 8 Apr 2023 01:43:44 +0200 Subject: [PATCH 102/349] gh-83004: Harden _socket init (GH-103261) Automerge-Triggered-By: GH:erlend-aasland --- Modules/socketmodule.c | 1118 +++++++++++++++++++++------------------- 1 file changed, 581 insertions(+), 537 deletions(-) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index c2b8283d84e5f8..49342b3d48de0e 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -7338,1394 +7338,1427 @@ static struct PyModuleDef socketmodule = { PyMODINIT_FUNC PyInit__socket(void) { - PyObject *m, *has_ipv6; + PyObject *m = NULL; - if (!os_init()) - return NULL; + if (!os_init()) { + goto error; + } Py_SET_TYPE(&sock_type, &PyType_Type); m = PyModule_Create(&socketmodule); - if (m == NULL) - return NULL; + if (m == NULL) { + goto error; + } - PyModule_AddObject(m, "error", Py_NewRef(PyExc_OSError)); - socket_herror = PyErr_NewException("socket.herror", - PyExc_OSError, NULL); - if (socket_herror == NULL) - return NULL; - PyModule_AddObject(m, "herror", Py_NewRef(socket_herror)); - socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError, - NULL); - if (socket_gaierror == NULL) - return NULL; - PyModule_AddObject(m, "gaierror", Py_NewRef(socket_gaierror)); - PyModule_AddObjectRef(m, "timeout", PyExc_TimeoutError); +#define ADD_EXC(MOD, NAME, VAR, BASE) do { \ + VAR = PyErr_NewException("socket." NAME, BASE, NULL); \ + if (VAR == NULL) { \ + goto error; \ + } \ + int rc = PyModule_AddObjectRef(MOD, NAME, VAR); \ + Py_DECREF(VAR); \ + if (rc < 0) { \ + goto error; \ + } \ +} while (0) - if (PyModule_AddObject(m, "SocketType", Py_NewRef(&sock_type)) != 0) - return NULL; - if (PyModule_AddObject(m, "socket", Py_NewRef(&sock_type)) != 0) - return NULL; + ADD_EXC(m, "herror", socket_herror, PyExc_OSError); + ADD_EXC(m, "gaierror", socket_gaierror, PyExc_OSError); +#undef ADD_EXC + + if (PyModule_AddObjectRef(m, "error", PyExc_OSError) < 0) { + goto error; + } + if (PyModule_AddObjectRef(m, "timeout", PyExc_TimeoutError) < 0) { + goto error; + } + if (PyModule_AddObjectRef(m, "SocketType", (PyObject *)&sock_type) < 0) { + goto error; + } + if (PyModule_AddType(m, &sock_type) < 0) { + goto error; + } + + PyObject *has_ipv6; #ifdef ENABLE_IPV6 has_ipv6 = Py_True; #else has_ipv6 = Py_False; #endif - PyModule_AddObject(m, "has_ipv6", Py_NewRef(has_ipv6)); + if (PyModule_AddObjectRef(m, "has_ipv6", has_ipv6) < 0) { + goto error; + } /* Export C API */ PySocketModule_APIObject *capi = sock_get_api(); if (capi == NULL) { - Py_DECREF(m); - return NULL; + goto error; } PyObject *capsule = PyCapsule_New(capi, PySocket_CAPSULE_NAME, sock_destroy_api); if (capsule == NULL) { sock_free_api(capi); - Py_DECREF(m); - return NULL; + goto error; } - if (PyModule_AddObject(m, PySocket_CAPI_NAME, capsule) < 0) { - Py_DECREF(capsule); - Py_DECREF(m); - return NULL; + int rc = PyModule_AddObjectRef(m, PySocket_CAPI_NAME, capsule); + Py_DECREF(capsule); + if (rc < 0) { + goto error; } +#define ADD_INT_MACRO(MOD, INT) do { \ + if (PyModule_AddIntConstant(MOD, #INT, INT) < 0) { \ + goto error; \ + } \ +} while (0) + +#define ADD_INT_CONST(MOD, NAME, INT) do { \ + if (PyModule_AddIntConstant(MOD, NAME, INT) < 0) { \ + goto error; \ + } \ +} while (0) + +#define ADD_STR_CONST(MOD, NAME, STR) do { \ + if (PyModule_AddStringConstant(MOD, NAME, STR) < 0) { \ + goto error; \ + } \ +} while (0) + /* Address families (we only support AF_INET and AF_UNIX) */ #ifdef AF_UNSPEC - PyModule_AddIntMacro(m, AF_UNSPEC); + ADD_INT_MACRO(m, AF_UNSPEC); #endif - PyModule_AddIntMacro(m, AF_INET); + ADD_INT_MACRO(m, AF_INET); #if defined(AF_UNIX) - PyModule_AddIntMacro(m, AF_UNIX); + ADD_INT_MACRO(m, AF_UNIX); #endif /* AF_UNIX */ #ifdef AF_AX25 /* Amateur Radio AX.25 */ - PyModule_AddIntMacro(m, AF_AX25); + ADD_INT_MACRO(m, AF_AX25); #endif #ifdef AF_IPX - PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */ + ADD_INT_MACRO(m, AF_IPX); /* Novell IPX */ #endif #ifdef AF_APPLETALK /* Appletalk DDP */ - PyModule_AddIntMacro(m, AF_APPLETALK); + ADD_INT_MACRO(m, AF_APPLETALK); #endif #ifdef AF_NETROM /* Amateur radio NetROM */ - PyModule_AddIntMacro(m, AF_NETROM); + ADD_INT_MACRO(m, AF_NETROM); #endif #ifdef AF_BRIDGE /* Multiprotocol bridge */ - PyModule_AddIntMacro(m, AF_BRIDGE); + ADD_INT_MACRO(m, AF_BRIDGE); #endif #ifdef AF_ATMPVC /* ATM PVCs */ - PyModule_AddIntMacro(m, AF_ATMPVC); + ADD_INT_MACRO(m, AF_ATMPVC); #endif #ifdef AF_AAL5 /* Reserved for Werner's ATM */ - PyModule_AddIntMacro(m, AF_AAL5); + ADD_INT_MACRO(m, AF_AAL5); #endif #ifdef HAVE_SOCKADDR_ALG - PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */ + ADD_INT_MACRO(m, AF_ALG); /* Linux crypto */ #endif #ifdef AF_X25 /* Reserved for X.25 project */ - PyModule_AddIntMacro(m, AF_X25); + ADD_INT_MACRO(m, AF_X25); #endif #ifdef AF_INET6 - PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */ + ADD_INT_MACRO(m, AF_INET6); /* IP version 6 */ #endif #ifdef AF_ROSE /* Amateur Radio X.25 PLP */ - PyModule_AddIntMacro(m, AF_ROSE); + ADD_INT_MACRO(m, AF_ROSE); #endif #ifdef AF_DECnet /* Reserved for DECnet project */ - PyModule_AddIntMacro(m, AF_DECnet); + ADD_INT_MACRO(m, AF_DECnet); #endif #ifdef AF_NETBEUI /* Reserved for 802.2LLC project */ - PyModule_AddIntMacro(m, AF_NETBEUI); + ADD_INT_MACRO(m, AF_NETBEUI); #endif #ifdef AF_SECURITY /* Security callback pseudo AF */ - PyModule_AddIntMacro(m, AF_SECURITY); + ADD_INT_MACRO(m, AF_SECURITY); #endif #ifdef AF_KEY /* PF_KEY key management API */ - PyModule_AddIntMacro(m, AF_KEY); + ADD_INT_MACRO(m, AF_KEY); #endif #ifdef AF_NETLINK /* */ - PyModule_AddIntMacro(m, AF_NETLINK); - PyModule_AddIntMacro(m, NETLINK_ROUTE); + ADD_INT_MACRO(m, AF_NETLINK); + ADD_INT_MACRO(m, NETLINK_ROUTE); #ifdef NETLINK_SKIP - PyModule_AddIntMacro(m, NETLINK_SKIP); + ADD_INT_MACRO(m, NETLINK_SKIP); #endif #ifdef NETLINK_W1 - PyModule_AddIntMacro(m, NETLINK_W1); + ADD_INT_MACRO(m, NETLINK_W1); #endif - PyModule_AddIntMacro(m, NETLINK_USERSOCK); - PyModule_AddIntMacro(m, NETLINK_FIREWALL); + ADD_INT_MACRO(m, NETLINK_USERSOCK); + ADD_INT_MACRO(m, NETLINK_FIREWALL); #ifdef NETLINK_TCPDIAG - PyModule_AddIntMacro(m, NETLINK_TCPDIAG); + ADD_INT_MACRO(m, NETLINK_TCPDIAG); #endif #ifdef NETLINK_NFLOG - PyModule_AddIntMacro(m, NETLINK_NFLOG); + ADD_INT_MACRO(m, NETLINK_NFLOG); #endif #ifdef NETLINK_XFRM - PyModule_AddIntMacro(m, NETLINK_XFRM); + ADD_INT_MACRO(m, NETLINK_XFRM); #endif #ifdef NETLINK_ARPD - PyModule_AddIntMacro(m, NETLINK_ARPD); + ADD_INT_MACRO(m, NETLINK_ARPD); #endif #ifdef NETLINK_ROUTE6 - PyModule_AddIntMacro(m, NETLINK_ROUTE6); + ADD_INT_MACRO(m, NETLINK_ROUTE6); #endif - PyModule_AddIntMacro(m, NETLINK_IP6_FW); + ADD_INT_MACRO(m, NETLINK_IP6_FW); #ifdef NETLINK_DNRTMSG - PyModule_AddIntMacro(m, NETLINK_DNRTMSG); + ADD_INT_MACRO(m, NETLINK_DNRTMSG); #endif #ifdef NETLINK_TAPBASE - PyModule_AddIntMacro(m, NETLINK_TAPBASE); + ADD_INT_MACRO(m, NETLINK_TAPBASE); #endif #ifdef NETLINK_CRYPTO - PyModule_AddIntMacro(m, NETLINK_CRYPTO); + ADD_INT_MACRO(m, NETLINK_CRYPTO); #endif #endif /* AF_NETLINK */ #ifdef AF_QIPCRTR /* Qualcomm IPCROUTER */ - PyModule_AddIntMacro(m, AF_QIPCRTR); + ADD_INT_MACRO(m, AF_QIPCRTR); #endif #ifdef AF_VSOCK - PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK); - PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0); - PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1); - PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2); - PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff); - PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff); - PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2); - PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff); - PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9)); + ADD_INT_CONST(m, "AF_VSOCK", AF_VSOCK); + ADD_INT_CONST(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0); + ADD_INT_CONST(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1); + ADD_INT_CONST(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2); + ADD_INT_CONST(m, "VMADDR_CID_ANY", 0xffffffff); + ADD_INT_CONST(m, "VMADDR_PORT_ANY", 0xffffffff); + ADD_INT_CONST(m, "VMADDR_CID_HOST", 2); + ADD_INT_CONST(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff); + ADD_INT_CONST(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9)); #endif #ifdef AF_ROUTE /* Alias to emulate 4.4BSD */ - PyModule_AddIntMacro(m, AF_ROUTE); + ADD_INT_MACRO(m, AF_ROUTE); #endif #ifdef AF_LINK - PyModule_AddIntMacro(m, AF_LINK); + ADD_INT_MACRO(m, AF_LINK); #endif #ifdef AF_ASH /* Ash */ - PyModule_AddIntMacro(m, AF_ASH); + ADD_INT_MACRO(m, AF_ASH); #endif #ifdef AF_ECONET /* Acorn Econet */ - PyModule_AddIntMacro(m, AF_ECONET); + ADD_INT_MACRO(m, AF_ECONET); #endif #ifdef AF_ATMSVC /* ATM SVCs */ - PyModule_AddIntMacro(m, AF_ATMSVC); + ADD_INT_MACRO(m, AF_ATMSVC); #endif #ifdef AF_SNA /* Linux SNA Project (nutters!) */ - PyModule_AddIntMacro(m, AF_SNA); + ADD_INT_MACRO(m, AF_SNA); #endif #ifdef AF_IRDA /* IRDA sockets */ - PyModule_AddIntMacro(m, AF_IRDA); + ADD_INT_MACRO(m, AF_IRDA); #endif #ifdef AF_PPPOX /* PPPoX sockets */ - PyModule_AddIntMacro(m, AF_PPPOX); + ADD_INT_MACRO(m, AF_PPPOX); #endif #ifdef AF_WANPIPE /* Wanpipe API Sockets */ - PyModule_AddIntMacro(m, AF_WANPIPE); + ADD_INT_MACRO(m, AF_WANPIPE); #endif #ifdef AF_LLC /* Linux LLC */ - PyModule_AddIntMacro(m, AF_LLC); + ADD_INT_MACRO(m, AF_LLC); #endif #ifdef HAVE_AF_HYPERV /* Hyper-V sockets */ - PyModule_AddIntMacro(m, AF_HYPERV); + ADD_INT_MACRO(m, AF_HYPERV); /* for proto */ - PyModule_AddIntMacro(m, HV_PROTOCOL_RAW); + ADD_INT_MACRO(m, HV_PROTOCOL_RAW); /* for setsockopt() */ - PyModule_AddIntMacro(m, HVSOCKET_CONNECT_TIMEOUT); - PyModule_AddIntMacro(m, HVSOCKET_CONNECT_TIMEOUT_MAX); - PyModule_AddIntMacro(m, HVSOCKET_CONNECTED_SUSPEND); - PyModule_AddIntMacro(m, HVSOCKET_ADDRESS_FLAG_PASSTHRU); + ADD_INT_MACRO(m, HVSOCKET_CONNECT_TIMEOUT); + ADD_INT_MACRO(m, HVSOCKET_CONNECT_TIMEOUT_MAX); + ADD_INT_MACRO(m, HVSOCKET_CONNECTED_SUSPEND); + ADD_INT_MACRO(m, HVSOCKET_ADDRESS_FLAG_PASSTHRU); /* for bind() or connect() */ - PyModule_AddStringConstant(m, "HV_GUID_ZERO", "00000000-0000-0000-0000-000000000000"); - PyModule_AddStringConstant(m, "HV_GUID_WILDCARD", "00000000-0000-0000-0000-000000000000"); - PyModule_AddStringConstant(m, "HV_GUID_BROADCAST", "FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF"); - PyModule_AddStringConstant(m, "HV_GUID_CHILDREN", "90DB8B89-0D35-4F79-8CE9-49EA0AC8B7CD"); - PyModule_AddStringConstant(m, "HV_GUID_LOOPBACK", "E0E16197-DD56-4A10-9195-5EE7A155A838"); - PyModule_AddStringConstant(m, "HV_GUID_PARENT", "A42E7CDA-D03F-480C-9CC2-A4DE20ABB878"); + ADD_STR_CONST(m, "HV_GUID_ZERO", "00000000-0000-0000-0000-000000000000"); + ADD_STR_CONST(m, "HV_GUID_WILDCARD", "00000000-0000-0000-0000-000000000000"); + ADD_STR_CONST(m, "HV_GUID_BROADCAST", "FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF"); + ADD_STR_CONST(m, "HV_GUID_CHILDREN", "90DB8B89-0D35-4F79-8CE9-49EA0AC8B7CD"); + ADD_STR_CONST(m, "HV_GUID_LOOPBACK", "E0E16197-DD56-4A10-9195-5EE7A155A838"); + ADD_STR_CONST(m, "HV_GUID_PARENT", "A42E7CDA-D03F-480C-9CC2-A4DE20ABB878"); #endif /* HAVE_AF_HYPERV */ #ifdef USE_BLUETOOTH - PyModule_AddIntMacro(m, AF_BLUETOOTH); + ADD_INT_MACRO(m, AF_BLUETOOTH); #ifdef BTPROTO_L2CAP - PyModule_AddIntMacro(m, BTPROTO_L2CAP); + ADD_INT_MACRO(m, BTPROTO_L2CAP); #endif /* BTPROTO_L2CAP */ #ifdef BTPROTO_HCI - PyModule_AddIntMacro(m, BTPROTO_HCI); - PyModule_AddIntMacro(m, SOL_HCI); + ADD_INT_MACRO(m, BTPROTO_HCI); + ADD_INT_MACRO(m, SOL_HCI); #if !defined(__NetBSD__) && !defined(__DragonFly__) - PyModule_AddIntMacro(m, HCI_FILTER); + ADD_INT_MACRO(m, HCI_FILTER); #if !defined(__FreeBSD__) - PyModule_AddIntMacro(m, HCI_TIME_STAMP); - PyModule_AddIntMacro(m, HCI_DATA_DIR); + ADD_INT_MACRO(m, HCI_TIME_STAMP); + ADD_INT_MACRO(m, HCI_DATA_DIR); #endif /* !__FreeBSD__ */ #endif /* !__NetBSD__ && !__DragonFly__ */ #endif /* BTPROTO_HCI */ #ifdef BTPROTO_RFCOMM - PyModule_AddIntMacro(m, BTPROTO_RFCOMM); + ADD_INT_MACRO(m, BTPROTO_RFCOMM); #endif /* BTPROTO_RFCOMM */ - PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00"); - PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF"); + ADD_STR_CONST(m, "BDADDR_ANY", "00:00:00:00:00:00"); + ADD_STR_CONST(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF"); #ifdef BTPROTO_SCO - PyModule_AddIntMacro(m, BTPROTO_SCO); + ADD_INT_MACRO(m, BTPROTO_SCO); #endif /* BTPROTO_SCO */ #endif /* USE_BLUETOOTH */ #ifdef AF_CAN /* Controller Area Network */ - PyModule_AddIntMacro(m, AF_CAN); + ADD_INT_MACRO(m, AF_CAN); #endif #ifdef PF_CAN /* Controller Area Network */ - PyModule_AddIntMacro(m, PF_CAN); + ADD_INT_MACRO(m, PF_CAN); #endif /* Reliable Datagram Sockets */ #ifdef AF_RDS - PyModule_AddIntMacro(m, AF_RDS); + ADD_INT_MACRO(m, AF_RDS); #endif #ifdef PF_RDS - PyModule_AddIntMacro(m, PF_RDS); + ADD_INT_MACRO(m, PF_RDS); #endif /* Kernel event messages */ #ifdef PF_SYSTEM - PyModule_AddIntMacro(m, PF_SYSTEM); + ADD_INT_MACRO(m, PF_SYSTEM); #endif #ifdef AF_SYSTEM - PyModule_AddIntMacro(m, AF_SYSTEM); + ADD_INT_MACRO(m, AF_SYSTEM); #endif #ifdef AF_PACKET - PyModule_AddIntMacro(m, AF_PACKET); + ADD_INT_MACRO(m, AF_PACKET); #endif #ifdef PF_PACKET - PyModule_AddIntMacro(m, PF_PACKET); + ADD_INT_MACRO(m, PF_PACKET); #endif #ifdef PACKET_HOST - PyModule_AddIntMacro(m, PACKET_HOST); + ADD_INT_MACRO(m, PACKET_HOST); #endif #ifdef PACKET_BROADCAST - PyModule_AddIntMacro(m, PACKET_BROADCAST); + ADD_INT_MACRO(m, PACKET_BROADCAST); #endif #ifdef PACKET_MULTICAST - PyModule_AddIntMacro(m, PACKET_MULTICAST); + ADD_INT_MACRO(m, PACKET_MULTICAST); #endif #ifdef PACKET_OTHERHOST - PyModule_AddIntMacro(m, PACKET_OTHERHOST); + ADD_INT_MACRO(m, PACKET_OTHERHOST); #endif #ifdef PACKET_OUTGOING - PyModule_AddIntMacro(m, PACKET_OUTGOING); + ADD_INT_MACRO(m, PACKET_OUTGOING); #endif #ifdef PACKET_LOOPBACK - PyModule_AddIntMacro(m, PACKET_LOOPBACK); + ADD_INT_MACRO(m, PACKET_LOOPBACK); #endif #ifdef PACKET_FASTROUTE - PyModule_AddIntMacro(m, PACKET_FASTROUTE); + ADD_INT_MACRO(m, PACKET_FASTROUTE); #endif #ifdef HAVE_LINUX_TIPC_H - PyModule_AddIntMacro(m, AF_TIPC); + ADD_INT_MACRO(m, AF_TIPC); /* for addresses */ - PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ); - PyModule_AddIntMacro(m, TIPC_ADDR_NAME); - PyModule_AddIntMacro(m, TIPC_ADDR_ID); + ADD_INT_MACRO(m, TIPC_ADDR_NAMESEQ); + ADD_INT_MACRO(m, TIPC_ADDR_NAME); + ADD_INT_MACRO(m, TIPC_ADDR_ID); - PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE); - PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE); - PyModule_AddIntMacro(m, TIPC_NODE_SCOPE); + ADD_INT_MACRO(m, TIPC_ZONE_SCOPE); + ADD_INT_MACRO(m, TIPC_CLUSTER_SCOPE); + ADD_INT_MACRO(m, TIPC_NODE_SCOPE); /* for setsockopt() */ - PyModule_AddIntMacro(m, SOL_TIPC); - PyModule_AddIntMacro(m, TIPC_IMPORTANCE); - PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE); - PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE); - PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT); + ADD_INT_MACRO(m, SOL_TIPC); + ADD_INT_MACRO(m, TIPC_IMPORTANCE); + ADD_INT_MACRO(m, TIPC_SRC_DROPPABLE); + ADD_INT_MACRO(m, TIPC_DEST_DROPPABLE); + ADD_INT_MACRO(m, TIPC_CONN_TIMEOUT); - PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE); - PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE); - PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE); - PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE); + ADD_INT_MACRO(m, TIPC_LOW_IMPORTANCE); + ADD_INT_MACRO(m, TIPC_MEDIUM_IMPORTANCE); + ADD_INT_MACRO(m, TIPC_HIGH_IMPORTANCE); + ADD_INT_MACRO(m, TIPC_CRITICAL_IMPORTANCE); /* for subscriptions */ - PyModule_AddIntMacro(m, TIPC_SUB_PORTS); - PyModule_AddIntMacro(m, TIPC_SUB_SERVICE); + ADD_INT_MACRO(m, TIPC_SUB_PORTS); + ADD_INT_MACRO(m, TIPC_SUB_SERVICE); #ifdef TIPC_SUB_CANCEL /* doesn't seem to be available everywhere */ - PyModule_AddIntMacro(m, TIPC_SUB_CANCEL); + ADD_INT_MACRO(m, TIPC_SUB_CANCEL); #endif - PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER); - PyModule_AddIntMacro(m, TIPC_PUBLISHED); - PyModule_AddIntMacro(m, TIPC_WITHDRAWN); - PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT); - PyModule_AddIntMacro(m, TIPC_CFG_SRV); - PyModule_AddIntMacro(m, TIPC_TOP_SRV); + ADD_INT_MACRO(m, TIPC_WAIT_FOREVER); + ADD_INT_MACRO(m, TIPC_PUBLISHED); + ADD_INT_MACRO(m, TIPC_WITHDRAWN); + ADD_INT_MACRO(m, TIPC_SUBSCR_TIMEOUT); + ADD_INT_MACRO(m, TIPC_CFG_SRV); + ADD_INT_MACRO(m, TIPC_TOP_SRV); #endif #ifdef HAVE_SOCKADDR_ALG /* Socket options */ - PyModule_AddIntMacro(m, ALG_SET_KEY); - PyModule_AddIntMacro(m, ALG_SET_IV); - PyModule_AddIntMacro(m, ALG_SET_OP); - PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN); - PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE); - PyModule_AddIntMacro(m, ALG_SET_PUBKEY); + ADD_INT_MACRO(m, ALG_SET_KEY); + ADD_INT_MACRO(m, ALG_SET_IV); + ADD_INT_MACRO(m, ALG_SET_OP); + ADD_INT_MACRO(m, ALG_SET_AEAD_ASSOCLEN); + ADD_INT_MACRO(m, ALG_SET_AEAD_AUTHSIZE); + ADD_INT_MACRO(m, ALG_SET_PUBKEY); /* Operations */ - PyModule_AddIntMacro(m, ALG_OP_DECRYPT); - PyModule_AddIntMacro(m, ALG_OP_ENCRYPT); - PyModule_AddIntMacro(m, ALG_OP_SIGN); - PyModule_AddIntMacro(m, ALG_OP_VERIFY); + ADD_INT_MACRO(m, ALG_OP_DECRYPT); + ADD_INT_MACRO(m, ALG_OP_ENCRYPT); + ADD_INT_MACRO(m, ALG_OP_SIGN); + ADD_INT_MACRO(m, ALG_OP_VERIFY); #endif /* IEEE 802.3 protocol numbers required for a standard TCP/IP network stack */ #ifdef ETHERTYPE_ARP - PyModule_AddIntMacro(m, ETHERTYPE_ARP); + ADD_INT_MACRO(m, ETHERTYPE_ARP); #endif #ifdef ETHERTYPE_IP - PyModule_AddIntMacro(m, ETHERTYPE_IP); + ADD_INT_MACRO(m, ETHERTYPE_IP); #endif #ifdef ETHERTYPE_IPV6 - PyModule_AddIntMacro(m, ETHERTYPE_IPV6); + ADD_INT_MACRO(m, ETHERTYPE_IPV6); #endif #ifdef ETHERTYPE_VLAN - PyModule_AddIntMacro(m, ETHERTYPE_VLAN); + ADD_INT_MACRO(m, ETHERTYPE_VLAN); #endif /* Linux pseudo-protocol for sniffing every packet */ #ifdef ETH_P_ALL - PyModule_AddIntMacro(m, ETH_P_ALL); + ADD_INT_MACRO(m, ETH_P_ALL); #endif /* Socket types */ - PyModule_AddIntMacro(m, SOCK_STREAM); - PyModule_AddIntMacro(m, SOCK_DGRAM); + ADD_INT_MACRO(m, SOCK_STREAM); + ADD_INT_MACRO(m, SOCK_DGRAM); /* We have incomplete socket support. */ #ifdef SOCK_RAW /* SOCK_RAW is marked as optional in the POSIX specification */ - PyModule_AddIntMacro(m, SOCK_RAW); + ADD_INT_MACRO(m, SOCK_RAW); #endif #ifdef SOCK_SEQPACKET - PyModule_AddIntMacro(m, SOCK_SEQPACKET); + ADD_INT_MACRO(m, SOCK_SEQPACKET); #endif #if defined(SOCK_RDM) - PyModule_AddIntMacro(m, SOCK_RDM); + ADD_INT_MACRO(m, SOCK_RDM); #endif #ifdef SOCK_CLOEXEC - PyModule_AddIntMacro(m, SOCK_CLOEXEC); + ADD_INT_MACRO(m, SOCK_CLOEXEC); #endif #ifdef SOCK_NONBLOCK - PyModule_AddIntMacro(m, SOCK_NONBLOCK); + ADD_INT_MACRO(m, SOCK_NONBLOCK); #endif #ifdef SO_DEBUG - PyModule_AddIntMacro(m, SO_DEBUG); + ADD_INT_MACRO(m, SO_DEBUG); #endif #ifdef SO_ACCEPTCONN - PyModule_AddIntMacro(m, SO_ACCEPTCONN); + ADD_INT_MACRO(m, SO_ACCEPTCONN); #endif #ifdef SO_REUSEADDR - PyModule_AddIntMacro(m, SO_REUSEADDR); + ADD_INT_MACRO(m, SO_REUSEADDR); #endif #ifdef SO_EXCLUSIVEADDRUSE - PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE); + ADD_INT_MACRO(m, SO_EXCLUSIVEADDRUSE); #endif #ifdef SO_INCOMING_CPU - PyModule_AddIntMacro(m, SO_INCOMING_CPU); + ADD_INT_MACRO(m, SO_INCOMING_CPU); #endif #ifdef SO_KEEPALIVE - PyModule_AddIntMacro(m, SO_KEEPALIVE); + ADD_INT_MACRO(m, SO_KEEPALIVE); #endif #ifdef SO_DONTROUTE - PyModule_AddIntMacro(m, SO_DONTROUTE); + ADD_INT_MACRO(m, SO_DONTROUTE); #endif #ifdef SO_BROADCAST - PyModule_AddIntMacro(m, SO_BROADCAST); + ADD_INT_MACRO(m, SO_BROADCAST); #endif #ifdef SO_USELOOPBACK - PyModule_AddIntMacro(m, SO_USELOOPBACK); + ADD_INT_MACRO(m, SO_USELOOPBACK); #endif #ifdef SO_LINGER - PyModule_AddIntMacro(m, SO_LINGER); + ADD_INT_MACRO(m, SO_LINGER); #endif #ifdef SO_OOBINLINE - PyModule_AddIntMacro(m, SO_OOBINLINE); + ADD_INT_MACRO(m, SO_OOBINLINE); #endif #ifndef __GNU__ #ifdef SO_REUSEPORT - PyModule_AddIntMacro(m, SO_REUSEPORT); + ADD_INT_MACRO(m, SO_REUSEPORT); #endif #endif #ifdef SO_SNDBUF - PyModule_AddIntMacro(m, SO_SNDBUF); + ADD_INT_MACRO(m, SO_SNDBUF); #endif #ifdef SO_RCVBUF - PyModule_AddIntMacro(m, SO_RCVBUF); + ADD_INT_MACRO(m, SO_RCVBUF); #endif #ifdef SO_SNDLOWAT - PyModule_AddIntMacro(m, SO_SNDLOWAT); + ADD_INT_MACRO(m, SO_SNDLOWAT); #endif #ifdef SO_RCVLOWAT - PyModule_AddIntMacro(m, SO_RCVLOWAT); + ADD_INT_MACRO(m, SO_RCVLOWAT); #endif #ifdef SO_SNDTIMEO - PyModule_AddIntMacro(m, SO_SNDTIMEO); + ADD_INT_MACRO(m, SO_SNDTIMEO); #endif #ifdef SO_RCVTIMEO - PyModule_AddIntMacro(m, SO_RCVTIMEO); + ADD_INT_MACRO(m, SO_RCVTIMEO); #endif #ifdef SO_ERROR - PyModule_AddIntMacro(m, SO_ERROR); + ADD_INT_MACRO(m, SO_ERROR); #endif #ifdef SO_TYPE - PyModule_AddIntMacro(m, SO_TYPE); + ADD_INT_MACRO(m, SO_TYPE); #endif #ifdef SO_SETFIB - PyModule_AddIntMacro(m, SO_SETFIB); + ADD_INT_MACRO(m, SO_SETFIB); #endif #ifdef SO_PASSCRED - PyModule_AddIntMacro(m, SO_PASSCRED); + ADD_INT_MACRO(m, SO_PASSCRED); #endif #ifdef SO_PEERCRED - PyModule_AddIntMacro(m, SO_PEERCRED); + ADD_INT_MACRO(m, SO_PEERCRED); #endif #ifdef LOCAL_PEERCRED - PyModule_AddIntMacro(m, LOCAL_PEERCRED); + ADD_INT_MACRO(m, LOCAL_PEERCRED); #endif #ifdef SO_PASSSEC - PyModule_AddIntMacro(m, SO_PASSSEC); + ADD_INT_MACRO(m, SO_PASSSEC); #endif #ifdef SO_PEERSEC - PyModule_AddIntMacro(m, SO_PEERSEC); + ADD_INT_MACRO(m, SO_PEERSEC); #endif #ifdef SO_BINDTODEVICE - PyModule_AddIntMacro(m, SO_BINDTODEVICE); + ADD_INT_MACRO(m, SO_BINDTODEVICE); #endif #ifdef SO_PRIORITY - PyModule_AddIntMacro(m, SO_PRIORITY); + ADD_INT_MACRO(m, SO_PRIORITY); #endif #ifdef SO_MARK - PyModule_AddIntMacro(m, SO_MARK); + ADD_INT_MACRO(m, SO_MARK); #endif #ifdef SO_USER_COOKIE - PyModule_AddIntMacro(m, SO_USER_COOKIE); + ADD_INT_MACRO(m, SO_USER_COOKIE); #endif #ifdef SO_RTABLE - PyModule_AddIntMacro(m, SO_RTABLE); + ADD_INT_MACRO(m, SO_RTABLE); #endif #ifdef SO_DOMAIN - PyModule_AddIntMacro(m, SO_DOMAIN); + ADD_INT_MACRO(m, SO_DOMAIN); #endif #ifdef SO_PROTOCOL - PyModule_AddIntMacro(m, SO_PROTOCOL); + ADD_INT_MACRO(m, SO_PROTOCOL); #endif #ifdef LOCAL_CREDS - PyModule_AddIntMacro(m, LOCAL_CREDS); + ADD_INT_MACRO(m, LOCAL_CREDS); #endif #ifdef LOCAL_CREDS_PERSISTENT - PyModule_AddIntMacro(m, LOCAL_CREDS_PERSISTENT); + ADD_INT_MACRO(m, LOCAL_CREDS_PERSISTENT); #endif /* Maximum number of connections for "listen" */ #ifdef SOMAXCONN - PyModule_AddIntMacro(m, SOMAXCONN); + ADD_INT_MACRO(m, SOMAXCONN); #else - PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */ + ADD_INT_CONST(m, "SOMAXCONN", 5); /* Common value */ #endif /* Ancillary message types */ #ifdef SCM_RIGHTS - PyModule_AddIntMacro(m, SCM_RIGHTS); + ADD_INT_MACRO(m, SCM_RIGHTS); #endif #ifdef SCM_CREDENTIALS - PyModule_AddIntMacro(m, SCM_CREDENTIALS); + ADD_INT_MACRO(m, SCM_CREDENTIALS); #endif #ifdef SCM_CREDS - PyModule_AddIntMacro(m, SCM_CREDS); + ADD_INT_MACRO(m, SCM_CREDS); #endif #ifdef SCM_CREDS2 - PyModule_AddIntMacro(m, SCM_CREDS2); + ADD_INT_MACRO(m, SCM_CREDS2); #endif /* Flags for send, recv */ #ifdef MSG_OOB - PyModule_AddIntMacro(m, MSG_OOB); + ADD_INT_MACRO(m, MSG_OOB); #endif #ifdef MSG_PEEK - PyModule_AddIntMacro(m, MSG_PEEK); + ADD_INT_MACRO(m, MSG_PEEK); #endif #ifdef MSG_DONTROUTE - PyModule_AddIntMacro(m, MSG_DONTROUTE); + ADD_INT_MACRO(m, MSG_DONTROUTE); #endif #ifdef MSG_DONTWAIT - PyModule_AddIntMacro(m, MSG_DONTWAIT); + ADD_INT_MACRO(m, MSG_DONTWAIT); #endif #ifdef MSG_EOR - PyModule_AddIntMacro(m, MSG_EOR); + ADD_INT_MACRO(m, MSG_EOR); #endif #ifdef MSG_TRUNC // workaround for https://github.com/WebAssembly/wasi-libc/issues/305 #if defined(__wasi__) && !defined(__WASI_RIFLAGS_RECV_DATA_TRUNCATED) # define __WASI_RIFLAGS_RECV_DATA_TRUNCATED 2 #endif - PyModule_AddIntMacro(m, MSG_TRUNC); + ADD_INT_MACRO(m, MSG_TRUNC); #endif #ifdef MSG_CTRUNC - PyModule_AddIntMacro(m, MSG_CTRUNC); + ADD_INT_MACRO(m, MSG_CTRUNC); #endif #ifdef MSG_WAITALL - PyModule_AddIntMacro(m, MSG_WAITALL); + ADD_INT_MACRO(m, MSG_WAITALL); #endif #ifdef MSG_BTAG - PyModule_AddIntMacro(m, MSG_BTAG); + ADD_INT_MACRO(m, MSG_BTAG); #endif #ifdef MSG_ETAG - PyModule_AddIntMacro(m, MSG_ETAG); + ADD_INT_MACRO(m, MSG_ETAG); #endif #ifdef MSG_NOSIGNAL - PyModule_AddIntMacro(m, MSG_NOSIGNAL); + ADD_INT_MACRO(m, MSG_NOSIGNAL); #endif #ifdef MSG_NOTIFICATION - PyModule_AddIntMacro(m, MSG_NOTIFICATION); + ADD_INT_MACRO(m, MSG_NOTIFICATION); #endif #ifdef MSG_CMSG_CLOEXEC - PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC); + ADD_INT_MACRO(m, MSG_CMSG_CLOEXEC); #endif #ifdef MSG_ERRQUEUE - PyModule_AddIntMacro(m, MSG_ERRQUEUE); + ADD_INT_MACRO(m, MSG_ERRQUEUE); #endif #ifdef MSG_CONFIRM - PyModule_AddIntMacro(m, MSG_CONFIRM); + ADD_INT_MACRO(m, MSG_CONFIRM); #endif #ifdef MSG_MORE - PyModule_AddIntMacro(m, MSG_MORE); + ADD_INT_MACRO(m, MSG_MORE); #endif #ifdef MSG_EOF - PyModule_AddIntMacro(m, MSG_EOF); + ADD_INT_MACRO(m, MSG_EOF); #endif #ifdef MSG_BCAST - PyModule_AddIntMacro(m, MSG_BCAST); + ADD_INT_MACRO(m, MSG_BCAST); #endif #ifdef MSG_MCAST - PyModule_AddIntMacro(m, MSG_MCAST); + ADD_INT_MACRO(m, MSG_MCAST); #endif #ifdef MSG_FASTOPEN - PyModule_AddIntMacro(m, MSG_FASTOPEN); + ADD_INT_MACRO(m, MSG_FASTOPEN); #endif /* Protocol level and numbers, usable for [gs]etsockopt */ #ifdef SOL_SOCKET - PyModule_AddIntMacro(m, SOL_SOCKET); + ADD_INT_MACRO(m, SOL_SOCKET); #endif #ifdef SOL_IP - PyModule_AddIntMacro(m, SOL_IP); + ADD_INT_MACRO(m, SOL_IP); #else - PyModule_AddIntConstant(m, "SOL_IP", 0); + ADD_INT_CONST(m, "SOL_IP", 0); #endif #ifdef SOL_IPX - PyModule_AddIntMacro(m, SOL_IPX); + ADD_INT_MACRO(m, SOL_IPX); #endif #ifdef SOL_AX25 - PyModule_AddIntMacro(m, SOL_AX25); + ADD_INT_MACRO(m, SOL_AX25); #endif #ifdef SOL_ATALK - PyModule_AddIntMacro(m, SOL_ATALK); + ADD_INT_MACRO(m, SOL_ATALK); #endif #ifdef SOL_NETROM - PyModule_AddIntMacro(m, SOL_NETROM); + ADD_INT_MACRO(m, SOL_NETROM); #endif #ifdef SOL_ROSE - PyModule_AddIntMacro(m, SOL_ROSE); + ADD_INT_MACRO(m, SOL_ROSE); #endif #ifdef SOL_TCP - PyModule_AddIntMacro(m, SOL_TCP); + ADD_INT_MACRO(m, SOL_TCP); #else - PyModule_AddIntConstant(m, "SOL_TCP", 6); + ADD_INT_CONST(m, "SOL_TCP", 6); #endif #ifdef SOL_UDP - PyModule_AddIntMacro(m, SOL_UDP); + ADD_INT_MACRO(m, SOL_UDP); #else - PyModule_AddIntConstant(m, "SOL_UDP", 17); + ADD_INT_CONST(m, "SOL_UDP", 17); #endif #ifdef SOL_CAN_BASE - PyModule_AddIntMacro(m, SOL_CAN_BASE); + ADD_INT_MACRO(m, SOL_CAN_BASE); #endif #ifdef SOL_CAN_RAW - PyModule_AddIntMacro(m, SOL_CAN_RAW); - PyModule_AddIntMacro(m, CAN_RAW); + ADD_INT_MACRO(m, SOL_CAN_RAW); + ADD_INT_MACRO(m, CAN_RAW); #endif #if defined(HAVE_LINUX_CAN_H) || defined(HAVE_NETCAN_CAN_H) - PyModule_AddIntMacro(m, CAN_EFF_FLAG); - PyModule_AddIntMacro(m, CAN_RTR_FLAG); - PyModule_AddIntMacro(m, CAN_ERR_FLAG); + ADD_INT_MACRO(m, CAN_EFF_FLAG); + ADD_INT_MACRO(m, CAN_RTR_FLAG); + ADD_INT_MACRO(m, CAN_ERR_FLAG); - PyModule_AddIntMacro(m, CAN_SFF_MASK); - PyModule_AddIntMacro(m, CAN_EFF_MASK); - PyModule_AddIntMacro(m, CAN_ERR_MASK); + ADD_INT_MACRO(m, CAN_SFF_MASK); + ADD_INT_MACRO(m, CAN_EFF_MASK); + ADD_INT_MACRO(m, CAN_ERR_MASK); #ifdef CAN_ISOTP - PyModule_AddIntMacro(m, CAN_ISOTP); + ADD_INT_MACRO(m, CAN_ISOTP); #endif #ifdef CAN_J1939 - PyModule_AddIntMacro(m, CAN_J1939); + ADD_INT_MACRO(m, CAN_J1939); #endif #endif #if defined(HAVE_LINUX_CAN_RAW_H) || defined(HAVE_NETCAN_CAN_H) - PyModule_AddIntMacro(m, CAN_RAW_FILTER); + ADD_INT_MACRO(m, CAN_RAW_FILTER); #ifdef CAN_RAW_ERR_FILTER - PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER); + ADD_INT_MACRO(m, CAN_RAW_ERR_FILTER); #endif - PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK); - PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS); + ADD_INT_MACRO(m, CAN_RAW_LOOPBACK); + ADD_INT_MACRO(m, CAN_RAW_RECV_OWN_MSGS); #endif #ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES - PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES); + ADD_INT_MACRO(m, CAN_RAW_FD_FRAMES); #endif #ifdef HAVE_LINUX_CAN_RAW_JOIN_FILTERS - PyModule_AddIntMacro(m, CAN_RAW_JOIN_FILTERS); + ADD_INT_MACRO(m, CAN_RAW_JOIN_FILTERS); #endif #ifdef HAVE_LINUX_CAN_BCM_H - PyModule_AddIntMacro(m, CAN_BCM); + ADD_INT_MACRO(m, CAN_BCM); /* BCM opcodes */ - PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP); - PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE); - PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ); - PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND); - PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP); - PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE); - PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ); - PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS); - PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED); - PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS); - PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT); - PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED); + ADD_INT_CONST(m, "CAN_BCM_TX_SETUP", TX_SETUP); + ADD_INT_CONST(m, "CAN_BCM_TX_DELETE", TX_DELETE); + ADD_INT_CONST(m, "CAN_BCM_TX_READ", TX_READ); + ADD_INT_CONST(m, "CAN_BCM_TX_SEND", TX_SEND); + ADD_INT_CONST(m, "CAN_BCM_RX_SETUP", RX_SETUP); + ADD_INT_CONST(m, "CAN_BCM_RX_DELETE", RX_DELETE); + ADD_INT_CONST(m, "CAN_BCM_RX_READ", RX_READ); + ADD_INT_CONST(m, "CAN_BCM_TX_STATUS", TX_STATUS); + ADD_INT_CONST(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED); + ADD_INT_CONST(m, "CAN_BCM_RX_STATUS", RX_STATUS); + ADD_INT_CONST(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT); + ADD_INT_CONST(m, "CAN_BCM_RX_CHANGED", RX_CHANGED); /* BCM flags */ - PyModule_AddIntConstant(m, "CAN_BCM_SETTIMER", SETTIMER); - PyModule_AddIntConstant(m, "CAN_BCM_STARTTIMER", STARTTIMER); - PyModule_AddIntConstant(m, "CAN_BCM_TX_COUNTEVT", TX_COUNTEVT); - PyModule_AddIntConstant(m, "CAN_BCM_TX_ANNOUNCE", TX_ANNOUNCE); - PyModule_AddIntConstant(m, "CAN_BCM_TX_CP_CAN_ID", TX_CP_CAN_ID); - PyModule_AddIntConstant(m, "CAN_BCM_RX_FILTER_ID", RX_FILTER_ID); - PyModule_AddIntConstant(m, "CAN_BCM_RX_CHECK_DLC", RX_CHECK_DLC); - PyModule_AddIntConstant(m, "CAN_BCM_RX_NO_AUTOTIMER", RX_NO_AUTOTIMER); - PyModule_AddIntConstant(m, "CAN_BCM_RX_ANNOUNCE_RESUME", RX_ANNOUNCE_RESUME); - PyModule_AddIntConstant(m, "CAN_BCM_TX_RESET_MULTI_IDX", TX_RESET_MULTI_IDX); - PyModule_AddIntConstant(m, "CAN_BCM_RX_RTR_FRAME", RX_RTR_FRAME); + ADD_INT_CONST(m, "CAN_BCM_SETTIMER", SETTIMER); + ADD_INT_CONST(m, "CAN_BCM_STARTTIMER", STARTTIMER); + ADD_INT_CONST(m, "CAN_BCM_TX_COUNTEVT", TX_COUNTEVT); + ADD_INT_CONST(m, "CAN_BCM_TX_ANNOUNCE", TX_ANNOUNCE); + ADD_INT_CONST(m, "CAN_BCM_TX_CP_CAN_ID", TX_CP_CAN_ID); + ADD_INT_CONST(m, "CAN_BCM_RX_FILTER_ID", RX_FILTER_ID); + ADD_INT_CONST(m, "CAN_BCM_RX_CHECK_DLC", RX_CHECK_DLC); + ADD_INT_CONST(m, "CAN_BCM_RX_NO_AUTOTIMER", RX_NO_AUTOTIMER); + ADD_INT_CONST(m, "CAN_BCM_RX_ANNOUNCE_RESUME", RX_ANNOUNCE_RESUME); + ADD_INT_CONST(m, "CAN_BCM_TX_RESET_MULTI_IDX", TX_RESET_MULTI_IDX); + ADD_INT_CONST(m, "CAN_BCM_RX_RTR_FRAME", RX_RTR_FRAME); #ifdef CAN_FD_FRAME /* CAN_FD_FRAME was only introduced in the 4.8.x kernel series */ - PyModule_AddIntConstant(m, "CAN_BCM_CAN_FD_FRAME", CAN_FD_FRAME); + ADD_INT_CONST(m, "CAN_BCM_CAN_FD_FRAME", CAN_FD_FRAME); #endif #endif #ifdef HAVE_LINUX_CAN_J1939_H - PyModule_AddIntMacro(m, J1939_MAX_UNICAST_ADDR); - PyModule_AddIntMacro(m, J1939_IDLE_ADDR); - PyModule_AddIntMacro(m, J1939_NO_ADDR); - PyModule_AddIntMacro(m, J1939_NO_NAME); - PyModule_AddIntMacro(m, J1939_PGN_REQUEST); - PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_CLAIMED); - PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_COMMANDED); - PyModule_AddIntMacro(m, J1939_PGN_PDU1_MAX); - PyModule_AddIntMacro(m, J1939_PGN_MAX); - PyModule_AddIntMacro(m, J1939_NO_PGN); + ADD_INT_MACRO(m, J1939_MAX_UNICAST_ADDR); + ADD_INT_MACRO(m, J1939_IDLE_ADDR); + ADD_INT_MACRO(m, J1939_NO_ADDR); + ADD_INT_MACRO(m, J1939_NO_NAME); + ADD_INT_MACRO(m, J1939_PGN_REQUEST); + ADD_INT_MACRO(m, J1939_PGN_ADDRESS_CLAIMED); + ADD_INT_MACRO(m, J1939_PGN_ADDRESS_COMMANDED); + ADD_INT_MACRO(m, J1939_PGN_PDU1_MAX); + ADD_INT_MACRO(m, J1939_PGN_MAX); + ADD_INT_MACRO(m, J1939_NO_PGN); /* J1939 socket options */ - PyModule_AddIntMacro(m, SO_J1939_FILTER); - PyModule_AddIntMacro(m, SO_J1939_PROMISC); - PyModule_AddIntMacro(m, SO_J1939_SEND_PRIO); - PyModule_AddIntMacro(m, SO_J1939_ERRQUEUE); + ADD_INT_MACRO(m, SO_J1939_FILTER); + ADD_INT_MACRO(m, SO_J1939_PROMISC); + ADD_INT_MACRO(m, SO_J1939_SEND_PRIO); + ADD_INT_MACRO(m, SO_J1939_ERRQUEUE); - PyModule_AddIntMacro(m, SCM_J1939_DEST_ADDR); - PyModule_AddIntMacro(m, SCM_J1939_DEST_NAME); - PyModule_AddIntMacro(m, SCM_J1939_PRIO); - PyModule_AddIntMacro(m, SCM_J1939_ERRQUEUE); + ADD_INT_MACRO(m, SCM_J1939_DEST_ADDR); + ADD_INT_MACRO(m, SCM_J1939_DEST_NAME); + ADD_INT_MACRO(m, SCM_J1939_PRIO); + ADD_INT_MACRO(m, SCM_J1939_ERRQUEUE); - PyModule_AddIntMacro(m, J1939_NLA_PAD); - PyModule_AddIntMacro(m, J1939_NLA_BYTES_ACKED); + ADD_INT_MACRO(m, J1939_NLA_PAD); + ADD_INT_MACRO(m, J1939_NLA_BYTES_ACKED); - PyModule_AddIntMacro(m, J1939_EE_INFO_NONE); - PyModule_AddIntMacro(m, J1939_EE_INFO_TX_ABORT); + ADD_INT_MACRO(m, J1939_EE_INFO_NONE); + ADD_INT_MACRO(m, J1939_EE_INFO_TX_ABORT); - PyModule_AddIntMacro(m, J1939_FILTER_MAX); + ADD_INT_MACRO(m, J1939_FILTER_MAX); #endif #ifdef SOL_RDS - PyModule_AddIntMacro(m, SOL_RDS); + ADD_INT_MACRO(m, SOL_RDS); #endif #ifdef HAVE_SOCKADDR_ALG - PyModule_AddIntMacro(m, SOL_ALG); + ADD_INT_MACRO(m, SOL_ALG); #endif #ifdef RDS_CANCEL_SENT_TO - PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO); + ADD_INT_MACRO(m, RDS_CANCEL_SENT_TO); #endif #ifdef RDS_GET_MR - PyModule_AddIntMacro(m, RDS_GET_MR); + ADD_INT_MACRO(m, RDS_GET_MR); #endif #ifdef RDS_FREE_MR - PyModule_AddIntMacro(m, RDS_FREE_MR); + ADD_INT_MACRO(m, RDS_FREE_MR); #endif #ifdef RDS_RECVERR - PyModule_AddIntMacro(m, RDS_RECVERR); + ADD_INT_MACRO(m, RDS_RECVERR); #endif #ifdef RDS_CONG_MONITOR - PyModule_AddIntMacro(m, RDS_CONG_MONITOR); + ADD_INT_MACRO(m, RDS_CONG_MONITOR); #endif #ifdef RDS_GET_MR_FOR_DEST - PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST); + ADD_INT_MACRO(m, RDS_GET_MR_FOR_DEST); #endif #ifdef IPPROTO_IP - PyModule_AddIntMacro(m, IPPROTO_IP); + ADD_INT_MACRO(m, IPPROTO_IP); #else - PyModule_AddIntConstant(m, "IPPROTO_IP", 0); + ADD_INT_CONST(m, "IPPROTO_IP", 0); #endif #ifdef IPPROTO_HOPOPTS - PyModule_AddIntMacro(m, IPPROTO_HOPOPTS); + ADD_INT_MACRO(m, IPPROTO_HOPOPTS); #endif #ifdef IPPROTO_ICMP - PyModule_AddIntMacro(m, IPPROTO_ICMP); + ADD_INT_MACRO(m, IPPROTO_ICMP); #else - PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1); + ADD_INT_CONST(m, "IPPROTO_ICMP", 1); #endif #ifdef IPPROTO_IGMP - PyModule_AddIntMacro(m, IPPROTO_IGMP); + ADD_INT_MACRO(m, IPPROTO_IGMP); #endif #ifdef IPPROTO_GGP - PyModule_AddIntMacro(m, IPPROTO_GGP); + ADD_INT_MACRO(m, IPPROTO_GGP); #endif #ifdef IPPROTO_IPV4 - PyModule_AddIntMacro(m, IPPROTO_IPV4); + ADD_INT_MACRO(m, IPPROTO_IPV4); #endif #ifdef IPPROTO_IPV6 - PyModule_AddIntMacro(m, IPPROTO_IPV6); + ADD_INT_MACRO(m, IPPROTO_IPV6); #endif #ifdef IPPROTO_IPIP - PyModule_AddIntMacro(m, IPPROTO_IPIP); + ADD_INT_MACRO(m, IPPROTO_IPIP); #endif #ifdef IPPROTO_TCP - PyModule_AddIntMacro(m, IPPROTO_TCP); + ADD_INT_MACRO(m, IPPROTO_TCP); #else - PyModule_AddIntConstant(m, "IPPROTO_TCP", 6); + ADD_INT_CONST(m, "IPPROTO_TCP", 6); #endif #ifdef IPPROTO_EGP - PyModule_AddIntMacro(m, IPPROTO_EGP); + ADD_INT_MACRO(m, IPPROTO_EGP); #endif #ifdef IPPROTO_PUP - PyModule_AddIntMacro(m, IPPROTO_PUP); + ADD_INT_MACRO(m, IPPROTO_PUP); #endif #ifdef IPPROTO_UDP - PyModule_AddIntMacro(m, IPPROTO_UDP); + ADD_INT_MACRO(m, IPPROTO_UDP); #else - PyModule_AddIntConstant(m, "IPPROTO_UDP", 17); + ADD_INT_CONST(m, "IPPROTO_UDP", 17); #endif #ifdef IPPROTO_UDPLITE - PyModule_AddIntMacro(m, IPPROTO_UDPLITE); + ADD_INT_MACRO(m, IPPROTO_UDPLITE); #ifndef UDPLITE_SEND_CSCOV #define UDPLITE_SEND_CSCOV 10 #endif - PyModule_AddIntMacro(m, UDPLITE_SEND_CSCOV); + ADD_INT_MACRO(m, UDPLITE_SEND_CSCOV); #ifndef UDPLITE_RECV_CSCOV #define UDPLITE_RECV_CSCOV 11 #endif - PyModule_AddIntMacro(m, UDPLITE_RECV_CSCOV); + ADD_INT_MACRO(m, UDPLITE_RECV_CSCOV); #endif #ifdef IPPROTO_IDP - PyModule_AddIntMacro(m, IPPROTO_IDP); + ADD_INT_MACRO(m, IPPROTO_IDP); #endif #ifdef IPPROTO_HELLO - PyModule_AddIntMacro(m, IPPROTO_HELLO); + ADD_INT_MACRO(m, IPPROTO_HELLO); #endif #ifdef IPPROTO_ND - PyModule_AddIntMacro(m, IPPROTO_ND); + ADD_INT_MACRO(m, IPPROTO_ND); #endif #ifdef IPPROTO_TP - PyModule_AddIntMacro(m, IPPROTO_TP); + ADD_INT_MACRO(m, IPPROTO_TP); #endif #ifdef IPPROTO_ROUTING - PyModule_AddIntMacro(m, IPPROTO_ROUTING); + ADD_INT_MACRO(m, IPPROTO_ROUTING); #endif #ifdef IPPROTO_FRAGMENT - PyModule_AddIntMacro(m, IPPROTO_FRAGMENT); + ADD_INT_MACRO(m, IPPROTO_FRAGMENT); #endif #ifdef IPPROTO_RSVP - PyModule_AddIntMacro(m, IPPROTO_RSVP); + ADD_INT_MACRO(m, IPPROTO_RSVP); #endif #ifdef IPPROTO_GRE - PyModule_AddIntMacro(m, IPPROTO_GRE); + ADD_INT_MACRO(m, IPPROTO_GRE); #endif #ifdef IPPROTO_ESP - PyModule_AddIntMacro(m, IPPROTO_ESP); + ADD_INT_MACRO(m, IPPROTO_ESP); #endif #ifdef IPPROTO_AH - PyModule_AddIntMacro(m, IPPROTO_AH); + ADD_INT_MACRO(m, IPPROTO_AH); #endif #ifdef IPPROTO_MOBILE - PyModule_AddIntMacro(m, IPPROTO_MOBILE); + ADD_INT_MACRO(m, IPPROTO_MOBILE); #endif #ifdef IPPROTO_ICMPV6 - PyModule_AddIntMacro(m, IPPROTO_ICMPV6); + ADD_INT_MACRO(m, IPPROTO_ICMPV6); #endif #ifdef IPPROTO_NONE - PyModule_AddIntMacro(m, IPPROTO_NONE); + ADD_INT_MACRO(m, IPPROTO_NONE); #endif #ifdef IPPROTO_DSTOPTS - PyModule_AddIntMacro(m, IPPROTO_DSTOPTS); + ADD_INT_MACRO(m, IPPROTO_DSTOPTS); #endif #ifdef IPPROTO_XTP - PyModule_AddIntMacro(m, IPPROTO_XTP); + ADD_INT_MACRO(m, IPPROTO_XTP); #endif #ifdef IPPROTO_EON - PyModule_AddIntMacro(m, IPPROTO_EON); + ADD_INT_MACRO(m, IPPROTO_EON); #endif #ifdef IPPROTO_PIM - PyModule_AddIntMacro(m, IPPROTO_PIM); + ADD_INT_MACRO(m, IPPROTO_PIM); #endif #ifdef IPPROTO_IPCOMP - PyModule_AddIntMacro(m, IPPROTO_IPCOMP); + ADD_INT_MACRO(m, IPPROTO_IPCOMP); #endif #ifdef IPPROTO_VRRP - PyModule_AddIntMacro(m, IPPROTO_VRRP); + ADD_INT_MACRO(m, IPPROTO_VRRP); #endif #ifdef IPPROTO_SCTP - PyModule_AddIntMacro(m, IPPROTO_SCTP); + ADD_INT_MACRO(m, IPPROTO_SCTP); #endif #ifdef IPPROTO_BIP - PyModule_AddIntMacro(m, IPPROTO_BIP); + ADD_INT_MACRO(m, IPPROTO_BIP); #endif #ifdef IPPROTO_MPTCP - PyModule_AddIntMacro(m, IPPROTO_MPTCP); + ADD_INT_MACRO(m, IPPROTO_MPTCP); #endif /**/ #ifdef IPPROTO_RAW - PyModule_AddIntMacro(m, IPPROTO_RAW); + ADD_INT_MACRO(m, IPPROTO_RAW); #else - PyModule_AddIntConstant(m, "IPPROTO_RAW", 255); + ADD_INT_CONST(m, "IPPROTO_RAW", 255); #endif #ifdef IPPROTO_MAX - PyModule_AddIntMacro(m, IPPROTO_MAX); + ADD_INT_MACRO(m, IPPROTO_MAX); #endif #ifdef MS_WINDOWS - PyModule_AddIntMacro(m, IPPROTO_ICLFXBM); - PyModule_AddIntMacro(m, IPPROTO_ST); - PyModule_AddIntMacro(m, IPPROTO_CBT); - PyModule_AddIntMacro(m, IPPROTO_IGP); - PyModule_AddIntMacro(m, IPPROTO_RDP); - PyModule_AddIntMacro(m, IPPROTO_PGM); - PyModule_AddIntMacro(m, IPPROTO_L2TP); - PyModule_AddIntMacro(m, IPPROTO_SCTP); + ADD_INT_MACRO(m, IPPROTO_ICLFXBM); + ADD_INT_MACRO(m, IPPROTO_ST); + ADD_INT_MACRO(m, IPPROTO_CBT); + ADD_INT_MACRO(m, IPPROTO_IGP); + ADD_INT_MACRO(m, IPPROTO_RDP); + ADD_INT_MACRO(m, IPPROTO_PGM); + ADD_INT_MACRO(m, IPPROTO_L2TP); + ADD_INT_MACRO(m, IPPROTO_SCTP); #endif #ifdef SYSPROTO_CONTROL - PyModule_AddIntMacro(m, SYSPROTO_CONTROL); + ADD_INT_MACRO(m, SYSPROTO_CONTROL); #endif /* Some port configuration */ #ifdef IPPORT_RESERVED - PyModule_AddIntMacro(m, IPPORT_RESERVED); + ADD_INT_MACRO(m, IPPORT_RESERVED); #else - PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024); + ADD_INT_CONST(m, "IPPORT_RESERVED", 1024); #endif #ifdef IPPORT_USERRESERVED - PyModule_AddIntMacro(m, IPPORT_USERRESERVED); + ADD_INT_MACRO(m, IPPORT_USERRESERVED); #else - PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000); + ADD_INT_CONST(m, "IPPORT_USERRESERVED", 5000); #endif /* Some reserved IP v.4 addresses */ #ifdef INADDR_ANY - PyModule_AddIntMacro(m, INADDR_ANY); + ADD_INT_MACRO(m, INADDR_ANY); #else - PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000); + ADD_INT_CONST(m, "INADDR_ANY", 0x00000000); #endif #ifdef INADDR_BROADCAST - PyModule_AddIntMacro(m, INADDR_BROADCAST); + ADD_INT_MACRO(m, INADDR_BROADCAST); #else - PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff); + ADD_INT_CONST(m, "INADDR_BROADCAST", 0xffffffff); #endif #ifdef INADDR_LOOPBACK - PyModule_AddIntMacro(m, INADDR_LOOPBACK); + ADD_INT_MACRO(m, INADDR_LOOPBACK); #else - PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001); + ADD_INT_CONST(m, "INADDR_LOOPBACK", 0x7F000001); #endif #ifdef INADDR_UNSPEC_GROUP - PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP); + ADD_INT_MACRO(m, INADDR_UNSPEC_GROUP); #else - PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000); + ADD_INT_CONST(m, "INADDR_UNSPEC_GROUP", 0xe0000000); #endif #ifdef INADDR_ALLHOSTS_GROUP - PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", + ADD_INT_CONST(m, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP); #else - PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001); + ADD_INT_CONST(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001); #endif #ifdef INADDR_MAX_LOCAL_GROUP - PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP); + ADD_INT_MACRO(m, INADDR_MAX_LOCAL_GROUP); #else - PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff); + ADD_INT_CONST(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff); #endif #ifdef INADDR_NONE - PyModule_AddIntMacro(m, INADDR_NONE); + ADD_INT_MACRO(m, INADDR_NONE); #else - PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff); + ADD_INT_CONST(m, "INADDR_NONE", 0xffffffff); #endif /* IPv4 [gs]etsockopt options */ #ifdef IP_OPTIONS - PyModule_AddIntMacro(m, IP_OPTIONS); + ADD_INT_MACRO(m, IP_OPTIONS); #endif #ifdef IP_HDRINCL - PyModule_AddIntMacro(m, IP_HDRINCL); + ADD_INT_MACRO(m, IP_HDRINCL); #endif #ifdef IP_TOS - PyModule_AddIntMacro(m, IP_TOS); + ADD_INT_MACRO(m, IP_TOS); #endif #ifdef IP_TTL - PyModule_AddIntMacro(m, IP_TTL); + ADD_INT_MACRO(m, IP_TTL); #endif #ifdef IP_RECVOPTS - PyModule_AddIntMacro(m, IP_RECVOPTS); + ADD_INT_MACRO(m, IP_RECVOPTS); #endif #ifdef IP_RECVRETOPTS - PyModule_AddIntMacro(m, IP_RECVRETOPTS); + ADD_INT_MACRO(m, IP_RECVRETOPTS); #endif #ifdef IP_RECVTOS - PyModule_AddIntMacro(m, IP_RECVTOS); + ADD_INT_MACRO(m, IP_RECVTOS); #endif #ifdef IP_RECVDSTADDR - PyModule_AddIntMacro(m, IP_RECVDSTADDR); + ADD_INT_MACRO(m, IP_RECVDSTADDR); #endif #ifdef IP_RETOPTS - PyModule_AddIntMacro(m, IP_RETOPTS); + ADD_INT_MACRO(m, IP_RETOPTS); #endif #ifdef IP_MULTICAST_IF - PyModule_AddIntMacro(m, IP_MULTICAST_IF); + ADD_INT_MACRO(m, IP_MULTICAST_IF); #endif #ifdef IP_MULTICAST_TTL - PyModule_AddIntMacro(m, IP_MULTICAST_TTL); + ADD_INT_MACRO(m, IP_MULTICAST_TTL); #endif #ifdef IP_MULTICAST_LOOP - PyModule_AddIntMacro(m, IP_MULTICAST_LOOP); + ADD_INT_MACRO(m, IP_MULTICAST_LOOP); #endif #ifdef IP_ADD_MEMBERSHIP - PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP); + ADD_INT_MACRO(m, IP_ADD_MEMBERSHIP); #endif #ifdef IP_DROP_MEMBERSHIP - PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP); + ADD_INT_MACRO(m, IP_DROP_MEMBERSHIP); #endif #ifdef IP_DEFAULT_MULTICAST_TTL - PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL); + ADD_INT_MACRO(m, IP_DEFAULT_MULTICAST_TTL); #endif #ifdef IP_DEFAULT_MULTICAST_LOOP - PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP); + ADD_INT_MACRO(m, IP_DEFAULT_MULTICAST_LOOP); #endif #ifdef IP_MAX_MEMBERSHIPS - PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS); + ADD_INT_MACRO(m, IP_MAX_MEMBERSHIPS); #endif #ifdef IP_TRANSPARENT - PyModule_AddIntMacro(m, IP_TRANSPARENT); + ADD_INT_MACRO(m, IP_TRANSPARENT); #endif #ifdef IP_PKTINFO - PyModule_AddIntMacro(m, IP_PKTINFO); + ADD_INT_MACRO(m, IP_PKTINFO); #endif #ifdef IP_BIND_ADDRESS_NO_PORT - PyModule_AddIntMacro(m, IP_BIND_ADDRESS_NO_PORT); + ADD_INT_MACRO(m, IP_BIND_ADDRESS_NO_PORT); #endif /* IPv6 [gs]etsockopt options, defined in RFC2553 */ #ifdef IPV6_JOIN_GROUP - PyModule_AddIntMacro(m, IPV6_JOIN_GROUP); + ADD_INT_MACRO(m, IPV6_JOIN_GROUP); #endif #ifdef IPV6_LEAVE_GROUP - PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP); + ADD_INT_MACRO(m, IPV6_LEAVE_GROUP); #endif #ifdef IPV6_MULTICAST_HOPS - PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS); + ADD_INT_MACRO(m, IPV6_MULTICAST_HOPS); #endif #ifdef IPV6_MULTICAST_IF - PyModule_AddIntMacro(m, IPV6_MULTICAST_IF); + ADD_INT_MACRO(m, IPV6_MULTICAST_IF); #endif #ifdef IPV6_MULTICAST_LOOP - PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP); + ADD_INT_MACRO(m, IPV6_MULTICAST_LOOP); #endif #ifdef IPV6_UNICAST_HOPS - PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS); + ADD_INT_MACRO(m, IPV6_UNICAST_HOPS); #endif /* Additional IPV6 socket options, defined in RFC 3493 */ #ifdef IPV6_V6ONLY - PyModule_AddIntMacro(m, IPV6_V6ONLY); + ADD_INT_MACRO(m, IPV6_V6ONLY); #endif /* Advanced IPV6 socket options, from RFC 3542 */ #ifdef IPV6_CHECKSUM - PyModule_AddIntMacro(m, IPV6_CHECKSUM); + ADD_INT_MACRO(m, IPV6_CHECKSUM); #endif #ifdef IPV6_DONTFRAG - PyModule_AddIntMacro(m, IPV6_DONTFRAG); + ADD_INT_MACRO(m, IPV6_DONTFRAG); #endif #ifdef IPV6_DSTOPTS - PyModule_AddIntMacro(m, IPV6_DSTOPTS); + ADD_INT_MACRO(m, IPV6_DSTOPTS); #endif #ifdef IPV6_HOPLIMIT - PyModule_AddIntMacro(m, IPV6_HOPLIMIT); + ADD_INT_MACRO(m, IPV6_HOPLIMIT); #endif #ifdef IPV6_HOPOPTS - PyModule_AddIntMacro(m, IPV6_HOPOPTS); + ADD_INT_MACRO(m, IPV6_HOPOPTS); #endif #ifdef IPV6_NEXTHOP - PyModule_AddIntMacro(m, IPV6_NEXTHOP); + ADD_INT_MACRO(m, IPV6_NEXTHOP); #endif #ifdef IPV6_PATHMTU - PyModule_AddIntMacro(m, IPV6_PATHMTU); + ADD_INT_MACRO(m, IPV6_PATHMTU); #endif #ifdef IPV6_PKTINFO - PyModule_AddIntMacro(m, IPV6_PKTINFO); + ADD_INT_MACRO(m, IPV6_PKTINFO); #endif #ifdef IPV6_RECVDSTOPTS - PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS); + ADD_INT_MACRO(m, IPV6_RECVDSTOPTS); #endif #ifdef IPV6_RECVHOPLIMIT - PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT); + ADD_INT_MACRO(m, IPV6_RECVHOPLIMIT); #endif #ifdef IPV6_RECVHOPOPTS - PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS); + ADD_INT_MACRO(m, IPV6_RECVHOPOPTS); #endif #ifdef IPV6_RECVPKTINFO - PyModule_AddIntMacro(m, IPV6_RECVPKTINFO); + ADD_INT_MACRO(m, IPV6_RECVPKTINFO); #endif #ifdef IPV6_RECVRTHDR - PyModule_AddIntMacro(m, IPV6_RECVRTHDR); + ADD_INT_MACRO(m, IPV6_RECVRTHDR); #endif #ifdef IPV6_RECVTCLASS - PyModule_AddIntMacro(m, IPV6_RECVTCLASS); + ADD_INT_MACRO(m, IPV6_RECVTCLASS); #endif #ifdef IPV6_RTHDR - PyModule_AddIntMacro(m, IPV6_RTHDR); + ADD_INT_MACRO(m, IPV6_RTHDR); #endif #ifdef IPV6_RTHDRDSTOPTS - PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS); + ADD_INT_MACRO(m, IPV6_RTHDRDSTOPTS); #endif #ifdef IPV6_RTHDR_TYPE_0 - PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0); + ADD_INT_MACRO(m, IPV6_RTHDR_TYPE_0); #endif #ifdef IPV6_RECVPATHMTU - PyModule_AddIntMacro(m, IPV6_RECVPATHMTU); + ADD_INT_MACRO(m, IPV6_RECVPATHMTU); #endif #ifdef IPV6_TCLASS - PyModule_AddIntMacro(m, IPV6_TCLASS); + ADD_INT_MACRO(m, IPV6_TCLASS); #endif #ifdef IPV6_USE_MIN_MTU - PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU); + ADD_INT_MACRO(m, IPV6_USE_MIN_MTU); #endif /* TCP options */ #ifdef TCP_NODELAY - PyModule_AddIntMacro(m, TCP_NODELAY); + ADD_INT_MACRO(m, TCP_NODELAY); #endif #ifdef TCP_MAXSEG - PyModule_AddIntMacro(m, TCP_MAXSEG); + ADD_INT_MACRO(m, TCP_MAXSEG); #endif #ifdef TCP_CORK - PyModule_AddIntMacro(m, TCP_CORK); + ADD_INT_MACRO(m, TCP_CORK); #endif #ifdef TCP_KEEPIDLE - PyModule_AddIntMacro(m, TCP_KEEPIDLE); + ADD_INT_MACRO(m, TCP_KEEPIDLE); #endif /* TCP_KEEPALIVE is OSX's TCP_KEEPIDLE equivalent */ #if defined(__APPLE__) && defined(TCP_KEEPALIVE) - PyModule_AddIntMacro(m, TCP_KEEPALIVE); + ADD_INT_MACRO(m, TCP_KEEPALIVE); #endif #ifdef TCP_KEEPINTVL - PyModule_AddIntMacro(m, TCP_KEEPINTVL); + ADD_INT_MACRO(m, TCP_KEEPINTVL); #endif #ifdef TCP_KEEPCNT - PyModule_AddIntMacro(m, TCP_KEEPCNT); + ADD_INT_MACRO(m, TCP_KEEPCNT); #endif #ifdef TCP_SYNCNT - PyModule_AddIntMacro(m, TCP_SYNCNT); + ADD_INT_MACRO(m, TCP_SYNCNT); #endif #ifdef TCP_LINGER2 - PyModule_AddIntMacro(m, TCP_LINGER2); + ADD_INT_MACRO(m, TCP_LINGER2); #endif #ifdef TCP_DEFER_ACCEPT - PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT); + ADD_INT_MACRO(m, TCP_DEFER_ACCEPT); #endif #ifdef TCP_WINDOW_CLAMP - PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP); + ADD_INT_MACRO(m, TCP_WINDOW_CLAMP); #endif #ifdef TCP_INFO - PyModule_AddIntMacro(m, TCP_INFO); + ADD_INT_MACRO(m, TCP_INFO); #endif #ifdef TCP_CONNECTION_INFO - PyModule_AddIntMacro(m, TCP_CONNECTION_INFO); + ADD_INT_MACRO(m, TCP_CONNECTION_INFO); #endif #ifdef TCP_QUICKACK - PyModule_AddIntMacro(m, TCP_QUICKACK); + ADD_INT_MACRO(m, TCP_QUICKACK); #endif #ifdef TCP_CONGESTION - PyModule_AddIntMacro(m, TCP_CONGESTION); + ADD_INT_MACRO(m, TCP_CONGESTION); #endif #ifdef TCP_MD5SIG - PyModule_AddIntMacro(m, TCP_MD5SIG); + ADD_INT_MACRO(m, TCP_MD5SIG); #endif #ifdef TCP_THIN_LINEAR_TIMEOUTS - PyModule_AddIntMacro(m, TCP_THIN_LINEAR_TIMEOUTS); + ADD_INT_MACRO(m, TCP_THIN_LINEAR_TIMEOUTS); #endif #ifdef TCP_THIN_DUPACK - PyModule_AddIntMacro(m, TCP_THIN_DUPACK); + ADD_INT_MACRO(m, TCP_THIN_DUPACK); #endif #ifdef TCP_USER_TIMEOUT - PyModule_AddIntMacro(m, TCP_USER_TIMEOUT); + ADD_INT_MACRO(m, TCP_USER_TIMEOUT); #endif #ifdef TCP_REPAIR - PyModule_AddIntMacro(m, TCP_REPAIR); + ADD_INT_MACRO(m, TCP_REPAIR); #endif #ifdef TCP_REPAIR_QUEUE - PyModule_AddIntMacro(m, TCP_REPAIR_QUEUE); + ADD_INT_MACRO(m, TCP_REPAIR_QUEUE); #endif #ifdef TCP_QUEUE_SEQ - PyModule_AddIntMacro(m, TCP_QUEUE_SEQ); + ADD_INT_MACRO(m, TCP_QUEUE_SEQ); #endif #ifdef TCP_REPAIR_OPTIONS - PyModule_AddIntMacro(m, TCP_REPAIR_OPTIONS); + ADD_INT_MACRO(m, TCP_REPAIR_OPTIONS); #endif #ifdef TCP_FASTOPEN - PyModule_AddIntMacro(m, TCP_FASTOPEN); + ADD_INT_MACRO(m, TCP_FASTOPEN); #endif #ifdef TCP_TIMESTAMP - PyModule_AddIntMacro(m, TCP_TIMESTAMP); + ADD_INT_MACRO(m, TCP_TIMESTAMP); #endif #ifdef TCP_NOTSENT_LOWAT - PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT); + ADD_INT_MACRO(m, TCP_NOTSENT_LOWAT); #endif #ifdef TCP_CC_INFO - PyModule_AddIntMacro(m, TCP_CC_INFO); + ADD_INT_MACRO(m, TCP_CC_INFO); #endif #ifdef TCP_SAVE_SYN - PyModule_AddIntMacro(m, TCP_SAVE_SYN); + ADD_INT_MACRO(m, TCP_SAVE_SYN); #endif #ifdef TCP_SAVED_SYN - PyModule_AddIntMacro(m, TCP_SAVED_SYN); + ADD_INT_MACRO(m, TCP_SAVED_SYN); #endif #ifdef TCP_REPAIR_WINDOW - PyModule_AddIntMacro(m, TCP_REPAIR_WINDOW); + ADD_INT_MACRO(m, TCP_REPAIR_WINDOW); #endif #ifdef TCP_FASTOPEN_CONNECT - PyModule_AddIntMacro(m, TCP_FASTOPEN_CONNECT); + ADD_INT_MACRO(m, TCP_FASTOPEN_CONNECT); #endif #ifdef TCP_ULP - PyModule_AddIntMacro(m, TCP_ULP); + ADD_INT_MACRO(m, TCP_ULP); #endif #ifdef TCP_MD5SIG_EXT - PyModule_AddIntMacro(m, TCP_MD5SIG_EXT); + ADD_INT_MACRO(m, TCP_MD5SIG_EXT); #endif #ifdef TCP_FASTOPEN_KEY - PyModule_AddIntMacro(m, TCP_FASTOPEN_KEY); + ADD_INT_MACRO(m, TCP_FASTOPEN_KEY); #endif #ifdef TCP_FASTOPEN_NO_COOKIE - PyModule_AddIntMacro(m, TCP_FASTOPEN_NO_COOKIE); + ADD_INT_MACRO(m, TCP_FASTOPEN_NO_COOKIE); #endif #ifdef TCP_ZEROCOPY_RECEIVE - PyModule_AddIntMacro(m, TCP_ZEROCOPY_RECEIVE); + ADD_INT_MACRO(m, TCP_ZEROCOPY_RECEIVE); #endif #ifdef TCP_INQ - PyModule_AddIntMacro(m, TCP_INQ); + ADD_INT_MACRO(m, TCP_INQ); #endif #ifdef TCP_TX_DELAY - PyModule_AddIntMacro(m, TCP_TX_DELAY); + ADD_INT_MACRO(m, TCP_TX_DELAY); #endif /* IPX options */ #ifdef IPX_TYPE - PyModule_AddIntMacro(m, IPX_TYPE); + ADD_INT_MACRO(m, IPX_TYPE); #endif /* Reliable Datagram Sockets */ #ifdef RDS_CMSG_RDMA_ARGS - PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS); + ADD_INT_MACRO(m, RDS_CMSG_RDMA_ARGS); #endif #ifdef RDS_CMSG_RDMA_DEST - PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST); + ADD_INT_MACRO(m, RDS_CMSG_RDMA_DEST); #endif #ifdef RDS_CMSG_RDMA_MAP - PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP); + ADD_INT_MACRO(m, RDS_CMSG_RDMA_MAP); #endif #ifdef RDS_CMSG_RDMA_STATUS - PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS); + ADD_INT_MACRO(m, RDS_CMSG_RDMA_STATUS); #endif #ifdef RDS_CMSG_RDMA_UPDATE - PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE); + ADD_INT_MACRO(m, RDS_CMSG_RDMA_UPDATE); #endif #ifdef RDS_RDMA_READWRITE - PyModule_AddIntMacro(m, RDS_RDMA_READWRITE); + ADD_INT_MACRO(m, RDS_RDMA_READWRITE); #endif #ifdef RDS_RDMA_FENCE - PyModule_AddIntMacro(m, RDS_RDMA_FENCE); + ADD_INT_MACRO(m, RDS_RDMA_FENCE); #endif #ifdef RDS_RDMA_INVALIDATE - PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE); + ADD_INT_MACRO(m, RDS_RDMA_INVALIDATE); #endif #ifdef RDS_RDMA_USE_ONCE - PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE); + ADD_INT_MACRO(m, RDS_RDMA_USE_ONCE); #endif #ifdef RDS_RDMA_DONTWAIT - PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT); + ADD_INT_MACRO(m, RDS_RDMA_DONTWAIT); #endif #ifdef RDS_RDMA_NOTIFY_ME - PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME); + ADD_INT_MACRO(m, RDS_RDMA_NOTIFY_ME); #endif #ifdef RDS_RDMA_SILENT - PyModule_AddIntMacro(m, RDS_RDMA_SILENT); + ADD_INT_MACRO(m, RDS_RDMA_SILENT); #endif /* get{addr,name}info parameters */ #ifdef EAI_ADDRFAMILY - PyModule_AddIntMacro(m, EAI_ADDRFAMILY); + ADD_INT_MACRO(m, EAI_ADDRFAMILY); #endif #ifdef EAI_AGAIN - PyModule_AddIntMacro(m, EAI_AGAIN); + ADD_INT_MACRO(m, EAI_AGAIN); #endif #ifdef EAI_BADFLAGS - PyModule_AddIntMacro(m, EAI_BADFLAGS); + ADD_INT_MACRO(m, EAI_BADFLAGS); #endif #ifdef EAI_FAIL - PyModule_AddIntMacro(m, EAI_FAIL); + ADD_INT_MACRO(m, EAI_FAIL); #endif #ifdef EAI_FAMILY - PyModule_AddIntMacro(m, EAI_FAMILY); + ADD_INT_MACRO(m, EAI_FAMILY); #endif #ifdef EAI_MEMORY - PyModule_AddIntMacro(m, EAI_MEMORY); + ADD_INT_MACRO(m, EAI_MEMORY); #endif #ifdef EAI_NODATA - PyModule_AddIntMacro(m, EAI_NODATA); + ADD_INT_MACRO(m, EAI_NODATA); #endif #ifdef EAI_NONAME - PyModule_AddIntMacro(m, EAI_NONAME); + ADD_INT_MACRO(m, EAI_NONAME); #endif #ifdef EAI_OVERFLOW - PyModule_AddIntMacro(m, EAI_OVERFLOW); + ADD_INT_MACRO(m, EAI_OVERFLOW); #endif #ifdef EAI_SERVICE - PyModule_AddIntMacro(m, EAI_SERVICE); + ADD_INT_MACRO(m, EAI_SERVICE); #endif #ifdef EAI_SOCKTYPE - PyModule_AddIntMacro(m, EAI_SOCKTYPE); + ADD_INT_MACRO(m, EAI_SOCKTYPE); #endif #ifdef EAI_SYSTEM - PyModule_AddIntMacro(m, EAI_SYSTEM); + ADD_INT_MACRO(m, EAI_SYSTEM); #endif #ifdef EAI_BADHINTS - PyModule_AddIntMacro(m, EAI_BADHINTS); + ADD_INT_MACRO(m, EAI_BADHINTS); #endif #ifdef EAI_PROTOCOL - PyModule_AddIntMacro(m, EAI_PROTOCOL); + ADD_INT_MACRO(m, EAI_PROTOCOL); #endif #ifdef EAI_MAX - PyModule_AddIntMacro(m, EAI_MAX); + ADD_INT_MACRO(m, EAI_MAX); #endif #ifdef AI_PASSIVE - PyModule_AddIntMacro(m, AI_PASSIVE); + ADD_INT_MACRO(m, AI_PASSIVE); #endif #ifdef AI_CANONNAME - PyModule_AddIntMacro(m, AI_CANONNAME); + ADD_INT_MACRO(m, AI_CANONNAME); #endif #ifdef AI_NUMERICHOST - PyModule_AddIntMacro(m, AI_NUMERICHOST); + ADD_INT_MACRO(m, AI_NUMERICHOST); #endif #ifdef AI_NUMERICSERV - PyModule_AddIntMacro(m, AI_NUMERICSERV); + ADD_INT_MACRO(m, AI_NUMERICSERV); #endif #ifdef AI_MASK - PyModule_AddIntMacro(m, AI_MASK); + ADD_INT_MACRO(m, AI_MASK); #endif #ifdef AI_ALL - PyModule_AddIntMacro(m, AI_ALL); + ADD_INT_MACRO(m, AI_ALL); #endif #ifdef AI_V4MAPPED_CFG - PyModule_AddIntMacro(m, AI_V4MAPPED_CFG); + ADD_INT_MACRO(m, AI_V4MAPPED_CFG); #endif #ifdef AI_ADDRCONFIG - PyModule_AddIntMacro(m, AI_ADDRCONFIG); + ADD_INT_MACRO(m, AI_ADDRCONFIG); #endif #ifdef AI_V4MAPPED - PyModule_AddIntMacro(m, AI_V4MAPPED); + ADD_INT_MACRO(m, AI_V4MAPPED); #endif #ifdef AI_DEFAULT - PyModule_AddIntMacro(m, AI_DEFAULT); + ADD_INT_MACRO(m, AI_DEFAULT); #endif #ifdef NI_MAXHOST - PyModule_AddIntMacro(m, NI_MAXHOST); + ADD_INT_MACRO(m, NI_MAXHOST); #endif #ifdef NI_MAXSERV - PyModule_AddIntMacro(m, NI_MAXSERV); + ADD_INT_MACRO(m, NI_MAXSERV); #endif #ifdef NI_NOFQDN - PyModule_AddIntMacro(m, NI_NOFQDN); + ADD_INT_MACRO(m, NI_NOFQDN); #endif #ifdef NI_NUMERICHOST - PyModule_AddIntMacro(m, NI_NUMERICHOST); + ADD_INT_MACRO(m, NI_NUMERICHOST); #endif #ifdef NI_NAMEREQD - PyModule_AddIntMacro(m, NI_NAMEREQD); + ADD_INT_MACRO(m, NI_NAMEREQD); #endif #ifdef NI_NUMERICSERV - PyModule_AddIntMacro(m, NI_NUMERICSERV); + ADD_INT_MACRO(m, NI_NUMERICSERV); #endif #ifdef NI_DGRAM - PyModule_AddIntMacro(m, NI_DGRAM); + ADD_INT_MACRO(m, NI_DGRAM); #endif /* shutdown() parameters */ #ifdef SHUT_RD - PyModule_AddIntMacro(m, SHUT_RD); + ADD_INT_MACRO(m, SHUT_RD); #elif defined(SD_RECEIVE) - PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE); + ADD_INT_CONST(m, "SHUT_RD", SD_RECEIVE); #else - PyModule_AddIntConstant(m, "SHUT_RD", 0); + ADD_INT_CONST(m, "SHUT_RD", 0); #endif #ifdef SHUT_WR - PyModule_AddIntMacro(m, SHUT_WR); + ADD_INT_MACRO(m, SHUT_WR); #elif defined(SD_SEND) - PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND); + ADD_INT_CONST(m, "SHUT_WR", SD_SEND); #else - PyModule_AddIntConstant(m, "SHUT_WR", 1); + ADD_INT_CONST(m, "SHUT_WR", 1); #endif #ifdef SHUT_RDWR - PyModule_AddIntMacro(m, SHUT_RDWR); + ADD_INT_MACRO(m, SHUT_RDWR); #elif defined(SD_BOTH) - PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH); + ADD_INT_CONST(m, "SHUT_RDWR", SD_BOTH); #else - PyModule_AddIntConstant(m, "SHUT_RDWR", 2); + ADD_INT_CONST(m, "SHUT_RDWR", 2); #endif #ifdef SIO_RCVALL @@ -8741,22 +8774,26 @@ PyInit__socket(void) #endif }; int i; - for(i = 0; i Date: Sat, 8 Apr 2023 10:09:00 +0800 Subject: [PATCH 103/349] gh-103329: Add regression test for PropertyMock with side effect (#103358) --- .../test_unittest/testmock/testhelpers.py | 23 ++++++++++++++++++- ...-04-08-00-50-23.gh-issue-103329.M38tqF.rst | 1 + 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-04-08-00-50-23.gh-issue-103329.M38tqF.rst diff --git a/Lib/test/test_unittest/testmock/testhelpers.py b/Lib/test/test_unittest/testmock/testhelpers.py index 9e7ec5d62d5da2..dc4d004cda8a75 100644 --- a/Lib/test/test_unittest/testmock/testhelpers.py +++ b/Lib/test/test_unittest/testmock/testhelpers.py @@ -1077,7 +1077,7 @@ def test_propertymock(self): p.stop() - def test_propertymock_returnvalue(self): + def test_propertymock_bare(self): m = MagicMock() p = PropertyMock() type(m).foo = p @@ -1088,6 +1088,27 @@ def test_propertymock_returnvalue(self): self.assertNotIsInstance(returned, PropertyMock) + def test_propertymock_returnvalue(self): + m = MagicMock() + p = PropertyMock(return_value=42) + type(m).foo = p + + returned = m.foo + p.assert_called_once_with() + self.assertEqual(returned, 42) + self.assertNotIsInstance(returned, PropertyMock) + + + def test_propertymock_side_effect(self): + m = MagicMock() + p = PropertyMock(side_effect=ValueError) + type(m).foo = p + + with self.assertRaises(ValueError): + m.foo + p.assert_called_once_with() + + class TestCallablePredicate(unittest.TestCase): def test_type(self): diff --git a/Misc/NEWS.d/next/Tests/2023-04-08-00-50-23.gh-issue-103329.M38tqF.rst b/Misc/NEWS.d/next/Tests/2023-04-08-00-50-23.gh-issue-103329.M38tqF.rst new file mode 100644 index 00000000000000..79448ed728040d --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-04-08-00-50-23.gh-issue-103329.M38tqF.rst @@ -0,0 +1 @@ +Regression tests for the behaviour of ``unittest.mock.PropertyMock`` were added. From 13774969f78de0435da4efbdf21f1130a7a71964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hrn=C4=8Diar?= Date: Sat, 8 Apr 2023 09:04:23 +0200 Subject: [PATCH 104/349] gh-102809: Remove gdbinit mention in Misc/README (#103269) --- Misc/README | 1 - 1 file changed, 1 deletion(-) diff --git a/Misc/README b/Misc/README index e4dd2005411a8d..3dab768ba1a7a4 100644 --- a/Misc/README +++ b/Misc/README @@ -8,7 +8,6 @@ Files found here ---------------- ACKS Acknowledgements -gdbinit Handy stuff to put in your .gdbinit file, if you use gdb HISTORY News from previous releases -- oldest last indent.pro GNU indent profile approximating my C style NEWS News for this release (for some meaning of "this") From a34c79623877a7ed0c86a6d48ddccffa0de76836 Mon Sep 17 00:00:00 2001 From: "C.A.M. Gerlach" Date: Sat, 8 Apr 2023 02:37:23 -0500 Subject: [PATCH 105/349] gh-75729: Fix os.spawn tests not handling spaces on Windows (#99150) * Quote paths in os.spawn tests on Windows so they work with spaces * Add NEWS entry for os spawn test fix * Fix code style to avoid double negative in os.spawn tests Co-authored-by: Jelle Zijlstra --------- Co-authored-by: Jelle Zijlstra --- Lib/test/test_os.py | 102 ++++++++++-------- ...2-11-06-18-42-38.gh-issue-75729.uGYJrv.rst | 2 + 2 files changed, 59 insertions(+), 45 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2022-11-06-18-42-38.gh-issue-75729.uGYJrv.rst diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 74ece3ffb4ed17..584cc05ca82a55 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -3214,6 +3214,14 @@ def kill_process(pid): @support.requires_subprocess() class SpawnTests(unittest.TestCase): + @staticmethod + def quote_args(args): + # On Windows, os.spawn* simply joins arguments with spaces: + # arguments need to be quoted + if os.name != 'nt': + return args + return [f'"{arg}"' if " " in arg.strip() else arg for arg in args] + def create_args(self, *, with_env=False, use_bytes=False): self.exitcode = 17 @@ -3234,115 +3242,118 @@ def create_args(self, *, with_env=False, use_bytes=False): with open(filename, "w", encoding="utf-8") as fp: fp.write(code) - args = [sys.executable, filename] + program = sys.executable + args = self.quote_args([program, filename]) if use_bytes: + program = os.fsencode(program) args = [os.fsencode(a) for a in args] self.env = {os.fsencode(k): os.fsencode(v) for k, v in self.env.items()} - return args + return program, args @requires_os_func('spawnl') def test_spawnl(self): - args = self.create_args() - exitcode = os.spawnl(os.P_WAIT, args[0], *args) + program, args = self.create_args() + exitcode = os.spawnl(os.P_WAIT, program, *args) self.assertEqual(exitcode, self.exitcode) @requires_os_func('spawnle') def test_spawnle(self): - args = self.create_args(with_env=True) - exitcode = os.spawnle(os.P_WAIT, args[0], *args, self.env) + program, args = self.create_args(with_env=True) + exitcode = os.spawnle(os.P_WAIT, program, *args, self.env) self.assertEqual(exitcode, self.exitcode) @requires_os_func('spawnlp') def test_spawnlp(self): - args = self.create_args() - exitcode = os.spawnlp(os.P_WAIT, args[0], *args) + program, args = self.create_args() + exitcode = os.spawnlp(os.P_WAIT, program, *args) self.assertEqual(exitcode, self.exitcode) @requires_os_func('spawnlpe') def test_spawnlpe(self): - args = self.create_args(with_env=True) - exitcode = os.spawnlpe(os.P_WAIT, args[0], *args, self.env) + program, args = self.create_args(with_env=True) + exitcode = os.spawnlpe(os.P_WAIT, program, *args, self.env) self.assertEqual(exitcode, self.exitcode) @requires_os_func('spawnv') def test_spawnv(self): - args = self.create_args() - exitcode = os.spawnv(os.P_WAIT, args[0], args) + program, args = self.create_args() + exitcode = os.spawnv(os.P_WAIT, program, args) self.assertEqual(exitcode, self.exitcode) # Test for PyUnicode_FSConverter() - exitcode = os.spawnv(os.P_WAIT, FakePath(args[0]), args) + exitcode = os.spawnv(os.P_WAIT, FakePath(program), args) self.assertEqual(exitcode, self.exitcode) @requires_os_func('spawnve') def test_spawnve(self): - args = self.create_args(with_env=True) - exitcode = os.spawnve(os.P_WAIT, args[0], args, self.env) + program, args = self.create_args(with_env=True) + exitcode = os.spawnve(os.P_WAIT, program, args, self.env) self.assertEqual(exitcode, self.exitcode) @requires_os_func('spawnvp') def test_spawnvp(self): - args = self.create_args() - exitcode = os.spawnvp(os.P_WAIT, args[0], args) + program, args = self.create_args() + exitcode = os.spawnvp(os.P_WAIT, program, args) self.assertEqual(exitcode, self.exitcode) @requires_os_func('spawnvpe') def test_spawnvpe(self): - args = self.create_args(with_env=True) - exitcode = os.spawnvpe(os.P_WAIT, args[0], args, self.env) + program, args = self.create_args(with_env=True) + exitcode = os.spawnvpe(os.P_WAIT, program, args, self.env) self.assertEqual(exitcode, self.exitcode) @requires_os_func('spawnv') def test_nowait(self): - args = self.create_args() - pid = os.spawnv(os.P_NOWAIT, args[0], args) + program, args = self.create_args() + pid = os.spawnv(os.P_NOWAIT, program, args) support.wait_process(pid, exitcode=self.exitcode) @requires_os_func('spawnve') def test_spawnve_bytes(self): # Test bytes handling in parse_arglist and parse_envlist (#28114) - args = self.create_args(with_env=True, use_bytes=True) - exitcode = os.spawnve(os.P_WAIT, args[0], args, self.env) + program, args = self.create_args(with_env=True, use_bytes=True) + exitcode = os.spawnve(os.P_WAIT, program, args, self.env) self.assertEqual(exitcode, self.exitcode) @requires_os_func('spawnl') def test_spawnl_noargs(self): - args = self.create_args() - self.assertRaises(ValueError, os.spawnl, os.P_NOWAIT, args[0]) - self.assertRaises(ValueError, os.spawnl, os.P_NOWAIT, args[0], '') + program, __ = self.create_args() + self.assertRaises(ValueError, os.spawnl, os.P_NOWAIT, program) + self.assertRaises(ValueError, os.spawnl, os.P_NOWAIT, program, '') @requires_os_func('spawnle') def test_spawnle_noargs(self): - args = self.create_args() - self.assertRaises(ValueError, os.spawnle, os.P_NOWAIT, args[0], {}) - self.assertRaises(ValueError, os.spawnle, os.P_NOWAIT, args[0], '', {}) + program, __ = self.create_args() + self.assertRaises(ValueError, os.spawnle, os.P_NOWAIT, program, {}) + self.assertRaises(ValueError, os.spawnle, os.P_NOWAIT, program, '', {}) @requires_os_func('spawnv') def test_spawnv_noargs(self): - args = self.create_args() - self.assertRaises(ValueError, os.spawnv, os.P_NOWAIT, args[0], ()) - self.assertRaises(ValueError, os.spawnv, os.P_NOWAIT, args[0], []) - self.assertRaises(ValueError, os.spawnv, os.P_NOWAIT, args[0], ('',)) - self.assertRaises(ValueError, os.spawnv, os.P_NOWAIT, args[0], ['']) + program, __ = self.create_args() + self.assertRaises(ValueError, os.spawnv, os.P_NOWAIT, program, ()) + self.assertRaises(ValueError, os.spawnv, os.P_NOWAIT, program, []) + self.assertRaises(ValueError, os.spawnv, os.P_NOWAIT, program, ('',)) + self.assertRaises(ValueError, os.spawnv, os.P_NOWAIT, program, ['']) @requires_os_func('spawnve') def test_spawnve_noargs(self): - args = self.create_args() - self.assertRaises(ValueError, os.spawnve, os.P_NOWAIT, args[0], (), {}) - self.assertRaises(ValueError, os.spawnve, os.P_NOWAIT, args[0], [], {}) - self.assertRaises(ValueError, os.spawnve, os.P_NOWAIT, args[0], ('',), {}) - self.assertRaises(ValueError, os.spawnve, os.P_NOWAIT, args[0], [''], {}) + program, __ = self.create_args() + self.assertRaises(ValueError, os.spawnve, os.P_NOWAIT, program, (), {}) + self.assertRaises(ValueError, os.spawnve, os.P_NOWAIT, program, [], {}) + self.assertRaises(ValueError, os.spawnve, os.P_NOWAIT, program, ('',), {}) + self.assertRaises(ValueError, os.spawnve, os.P_NOWAIT, program, [''], {}) def _test_invalid_env(self, spawn): - args = [sys.executable, '-c', 'pass'] + program = sys.executable + args = self.quote_args([program, '-c', 'pass']) # null character in the environment variable name newenv = os.environ.copy() newenv["FRUIT\0VEGETABLE"] = "cabbage" try: - exitcode = spawn(os.P_WAIT, args[0], args, newenv) + exitcode = spawn(os.P_WAIT, program, args, newenv) except ValueError: pass else: @@ -3352,7 +3363,7 @@ def _test_invalid_env(self, spawn): newenv = os.environ.copy() newenv["FRUIT"] = "orange\0VEGETABLE=cabbage" try: - exitcode = spawn(os.P_WAIT, args[0], args, newenv) + exitcode = spawn(os.P_WAIT, program, args, newenv) except ValueError: pass else: @@ -3362,7 +3373,7 @@ def _test_invalid_env(self, spawn): newenv = os.environ.copy() newenv["FRUIT=ORANGE"] = "lemon" try: - exitcode = spawn(os.P_WAIT, args[0], args, newenv) + exitcode = spawn(os.P_WAIT, program, args, newenv) except ValueError: pass else: @@ -3375,10 +3386,11 @@ def _test_invalid_env(self, spawn): fp.write('import sys, os\n' 'if os.getenv("FRUIT") != "orange=lemon":\n' ' raise AssertionError') - args = [sys.executable, filename] + + args = self.quote_args([program, filename]) newenv = os.environ.copy() newenv["FRUIT"] = "orange=lemon" - exitcode = spawn(os.P_WAIT, args[0], args, newenv) + exitcode = spawn(os.P_WAIT, program, args, newenv) self.assertEqual(exitcode, 0) @requires_os_func('spawnve') diff --git a/Misc/NEWS.d/next/Tests/2022-11-06-18-42-38.gh-issue-75729.uGYJrv.rst b/Misc/NEWS.d/next/Tests/2022-11-06-18-42-38.gh-issue-75729.uGYJrv.rst new file mode 100644 index 00000000000000..8baecdfc31881f --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-11-06-18-42-38.gh-issue-75729.uGYJrv.rst @@ -0,0 +1,2 @@ +Fix the :func:`os.spawn* ` tests failing on Windows +when the working directory or interpreter path contains spaces. From 1e9dfdacefa2c8c27762ba6491b0f570147ee355 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Sat, 8 Apr 2023 08:56:20 +0100 Subject: [PATCH 106/349] Docs: use Node.findall to avoid a deprecation warning (#99403) --- Doc/tools/extensions/c_annotations.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Doc/tools/extensions/c_annotations.py b/Doc/tools/extensions/c_annotations.py index 5af56433f41573..3551bfa4c0f133 100644 --- a/Doc/tools/extensions/c_annotations.py +++ b/Doc/tools/extensions/c_annotations.py @@ -20,6 +20,7 @@ """ from os import path +import docutils from docutils import nodes from docutils.parsers.rst import directives from docutils.parsers.rst import Directive @@ -41,6 +42,16 @@ } +# Monkeypatch nodes.Node.findall for forwards compatability +# This patch can be dropped when the minimum Sphinx version is 4.4.0 +# or the minimum Docutils version is 0.18.1. +if docutils.__version_info__ < (0, 18, 1): + def findall(self, *args, **kwargs): + return iter(self.traverse(*args, **kwargs)) + + nodes.Node.findall = findall + + class RCEntry: def __init__(self, name): self.name = name @@ -87,7 +98,7 @@ def __init__(self, refcount_filename, stable_abi_file): self.stable_abi_data[name] = record def add_annotations(self, app, doctree): - for node in doctree.traverse(addnodes.desc_content): + for node in doctree.findall(addnodes.desc_content): par = node.parent if par['domain'] != 'c': continue From 3310b94d3db2f477cf2b8789c30ac0f22f82d2dd Mon Sep 17 00:00:00 2001 From: Ezio Melotti Date: Sat, 8 Apr 2023 16:46:47 +0800 Subject: [PATCH 107/349] gh-100574: add examples/links to the `strptime`/`strftime` docs (#100575) --- Doc/library/datetime.rst | 47 ++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index 50827b27ebea04..761f5f04b9b288 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -737,18 +737,16 @@ Instance methods: .. method:: date.strftime(format) Return a string representing the date, controlled by an explicit format string. - Format codes referring to hours, minutes or seconds will see 0 values. For a - complete list of formatting directives, see - :ref:`strftime-strptime-behavior`. + Format codes referring to hours, minutes or seconds will see 0 values. + See also :ref:`strftime-strptime-behavior` and :meth:`date.isoformat`. .. method:: date.__format__(format) Same as :meth:`.date.strftime`. This makes it possible to specify a format string for a :class:`.date` object in :ref:`formatted string - literals ` and when using :meth:`str.format`. For a - complete list of formatting directives, see - :ref:`strftime-strptime-behavior`. + literals ` and when using :meth:`str.format`. + See also :ref:`strftime-strptime-behavior` and :meth:`date.isoformat`. Examples of Usage: :class:`date` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1051,8 +1049,8 @@ Other constructors, all class methods: :exc:`ValueError` is raised if the date_string and format can't be parsed by :func:`time.strptime` or if it returns a value which isn't a - time tuple. For a complete list of formatting directives, see - :ref:`strftime-strptime-behavior`. + time tuple. See also :ref:`strftime-strptime-behavior` and + :meth:`datetime.fromisoformat`. @@ -1510,20 +1508,21 @@ Instance methods: (which :func:`time.ctime` invokes, but which :meth:`datetime.ctime` does not invoke) conforms to the C standard. + .. method:: datetime.strftime(format) - Return a string representing the date and time, controlled by an explicit format - string. For a complete list of formatting directives, see - :ref:`strftime-strptime-behavior`. + Return a string representing the date and time, + controlled by an explicit format string. + See also :ref:`strftime-strptime-behavior` and :meth:`datetime.isoformat`. .. method:: datetime.__format__(format) Same as :meth:`.datetime.strftime`. This makes it possible to specify a format string for a :class:`.datetime` object in :ref:`formatted string - literals ` and when using :meth:`str.format`. For a - complete list of formatting directives, see - :ref:`strftime-strptime-behavior`. + literals ` and when using :meth:`str.format`. + See also :ref:`strftime-strptime-behavior` and :meth:`datetime.isoformat`. + Examples of Usage: :class:`.datetime` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1868,17 +1867,15 @@ Instance methods: .. method:: time.strftime(format) Return a string representing the time, controlled by an explicit format - string. For a complete list of formatting directives, see - :ref:`strftime-strptime-behavior`. + string. See also :ref:`strftime-strptime-behavior` and :meth:`time.isoformat`. .. method:: time.__format__(format) - Same as :meth:`.time.strftime`. This makes it possible to specify a format string - for a :class:`.time` object in :ref:`formatted string - literals ` and when using :meth:`str.format`. For a - complete list of formatting directives, see - :ref:`strftime-strptime-behavior`. + Same as :meth:`.time.strftime`. This makes it possible to specify + a format string for a :class:`.time` object in :ref:`formatted string + literals ` and when using :meth:`str.format`. + See also :ref:`strftime-strptime-behavior` and :meth:`time.isoformat`. .. method:: time.utcoffset() @@ -2320,6 +2317,14 @@ versus :meth:`strptime`: :meth:`strftime` and :meth:`strptime` Format Codes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +These methods accept format codes that can be used to parse and format dates:: + + >>> datetime.strptime('31/01/22 23:59:59.999999', + ... '%d/%m/%y %H:%M:%S.%f') + datetime.datetime(2022, 1, 31, 23, 59, 59, 999999) + >>> _.strftime('%a %d %b %Y, %I:%M%p') + 'Mon 31 Jan 2022, 11:59PM' + The following is a list of all the format codes that the 1989 C standard requires, and these work on all platforms with a standard C implementation. From b22d021ee6309f9b0d43e683056db84cfb6fd3c0 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sat, 8 Apr 2023 12:04:47 +0300 Subject: [PATCH 108/349] gh-100176: Tools/iobench: Remove redundant compat code for Python <= 3.2 (#100197) Co-authored-by: Alex Waygood --- Tools/iobench/iobench.py | 96 ++++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 42 deletions(-) diff --git a/Tools/iobench/iobench.py b/Tools/iobench/iobench.py index b0a7feb92e4f92..4017149ec91630 100644 --- a/Tools/iobench/iobench.py +++ b/Tools/iobench/iobench.py @@ -1,6 +1,3 @@ -# -*- coding: utf-8 -*- -# This file should be kept compatible with both Python 2.6 and Python >= 3.0. - import itertools import os import platform @@ -14,39 +11,37 @@ TEXT_ENCODING = 'utf8' NEWLINES = 'lf' -# Compatibility -try: - xrange -except NameError: - xrange = range def text_open(fn, mode, encoding=None): try: return open(fn, mode, encoding=encoding or TEXT_ENCODING) except TypeError: - if 'r' in mode: - mode += 'U' # 'U' mode is needed only in Python 2.x return open(fn, mode) + def get_file_sizes(): for s in ['20 KiB', '400 KiB', '10 MiB']: size, unit = s.split() size = int(size) * {'KiB': 1024, 'MiB': 1024 ** 2}[unit] yield s.replace(' ', ''), size + def get_binary_files(): return ((name + ".bin", size) for name, size in get_file_sizes()) + def get_text_files(): - return (("%s-%s-%s.txt" % (name, TEXT_ENCODING, NEWLINES), size) + return ((f"{name}-{TEXT_ENCODING}-{NEWLINES}.txt", size) for name, size in get_file_sizes()) + def with_open_mode(mode): def decorate(f): f.file_open_mode = mode return f return decorate + def with_sizes(*sizes): def decorate(f): f.file_sizes = sizes @@ -64,6 +59,7 @@ def read_bytewise(f): while f.read(1): pass + @with_open_mode("r") @with_sizes("medium") def read_small_chunks(f): @@ -72,6 +68,7 @@ def read_small_chunks(f): while f.read(20): pass + @with_open_mode("r") @with_sizes("medium") def read_big_chunks(f): @@ -80,6 +77,7 @@ def read_big_chunks(f): while f.read(4096): pass + @with_open_mode("r") @with_sizes("small", "medium", "large") def read_whole_file(f): @@ -88,6 +86,7 @@ def read_whole_file(f): while f.read(): pass + @with_open_mode("rt") @with_sizes("medium") def read_lines(f): @@ -96,6 +95,7 @@ def read_lines(f): for line in f: pass + @with_open_mode("r") @with_sizes("medium") def seek_forward_bytewise(f): @@ -103,9 +103,10 @@ def seek_forward_bytewise(f): f.seek(0, 2) size = f.tell() f.seek(0, 0) - for i in xrange(0, size - 1): + for i in range(0, size - 1): f.seek(i, 0) + @with_open_mode("r") @with_sizes("medium") def seek_forward_blockwise(f): @@ -113,9 +114,10 @@ def seek_forward_blockwise(f): f.seek(0, 2) size = f.tell() f.seek(0, 0) - for i in xrange(0, size - 1, 1000): + for i in range(0, size - 1, 1000): f.seek(i, 0) + @with_open_mode("rb") @with_sizes("medium") def read_seek_bytewise(f): @@ -124,6 +126,7 @@ def read_seek_bytewise(f): while f.read(1): f.seek(1, 1) + @with_open_mode("rb") @with_sizes("medium") def read_seek_blockwise(f): @@ -137,28 +140,31 @@ def read_seek_blockwise(f): @with_sizes("small") def write_bytewise(f, source): """ write one unit at a time """ - for i in xrange(0, len(source)): + for i in range(0, len(source)): f.write(source[i:i+1]) + @with_open_mode("w") @with_sizes("medium") def write_small_chunks(f, source): """ write 20 units at a time """ - for i in xrange(0, len(source), 20): + for i in range(0, len(source), 20): f.write(source[i:i+20]) + @with_open_mode("w") @with_sizes("medium") def write_medium_chunks(f, source): """ write 4096 units at a time """ - for i in xrange(0, len(source), 4096): + for i in range(0, len(source), 4096): f.write(source[i:i+4096]) + @with_open_mode("w") @with_sizes("large") def write_large_chunks(f, source): """ write 1e6 units at a time """ - for i in xrange(0, len(source), 1000000): + for i in range(0, len(source), 1000000): f.write(source[i:i+1000000]) @@ -167,59 +173,65 @@ def write_large_chunks(f, source): def modify_bytewise(f, source): """ modify one unit at a time """ f.seek(0) - for i in xrange(0, len(source)): + for i in range(0, len(source)): f.write(source[i:i+1]) + @with_open_mode("w+") @with_sizes("medium") def modify_small_chunks(f, source): """ modify 20 units at a time """ f.seek(0) - for i in xrange(0, len(source), 20): + for i in range(0, len(source), 20): f.write(source[i:i+20]) + @with_open_mode("w+") @with_sizes("medium") def modify_medium_chunks(f, source): """ modify 4096 units at a time """ f.seek(0) - for i in xrange(0, len(source), 4096): + for i in range(0, len(source), 4096): f.write(source[i:i+4096]) + @with_open_mode("wb+") @with_sizes("medium") def modify_seek_forward_bytewise(f, source): """ alternate write & seek one unit """ f.seek(0) - for i in xrange(0, len(source), 2): + for i in range(0, len(source), 2): f.write(source[i:i+1]) f.seek(i+2) + @with_open_mode("wb+") @with_sizes("medium") def modify_seek_forward_blockwise(f, source): """ alternate write & seek 1000 units """ f.seek(0) - for i in xrange(0, len(source), 2000): + for i in range(0, len(source), 2000): f.write(source[i:i+1000]) f.seek(i+2000) + # XXX the 2 following tests don't work with py3k's text IO @with_open_mode("wb+") @with_sizes("medium") def read_modify_bytewise(f, source): """ alternate read & write one unit """ f.seek(0) - for i in xrange(0, len(source), 2): + for i in range(0, len(source), 2): f.read(1) f.write(source[i+1:i+2]) + @with_open_mode("wb+") @with_sizes("medium") def read_modify_blockwise(f, source): """ alternate read & write 1000 units """ f.seek(0) - for i in xrange(0, len(source), 2000): + for i in range(0, len(source), 2000): f.read(1000) f.write(source[i+1000:i+2000]) @@ -242,6 +254,7 @@ def read_modify_blockwise(f, source): read_modify_bytewise, read_modify_blockwise, ] + def run_during(duration, func): _t = time.time n = 0 @@ -257,6 +270,7 @@ def run_during(duration, func): real = (end[4] if start[4] else time.time()) - real_start return n, real, sum(end[0:2]) - sum(start[0:2]) + def warm_cache(filename): with open(filename, "rb") as f: f.read() @@ -266,9 +280,7 @@ def run_all_tests(options): def print_label(filename, func): name = re.split(r'[-.]', filename)[0] out.write( - ("[%s] %s... " - % (name.center(7), func.__doc__.strip()) - ).ljust(52)) + f"[{name.center(7)}] {func.__doc__.strip()}... ".ljust(52)) out.flush() def print_results(size, n, real, cpu): @@ -276,8 +288,9 @@ def print_results(size, n, real, cpu): bw = ("%4d MiB/s" if bw > 100 else "%.3g MiB/s") % bw out.write(bw.rjust(12) + "\n") if cpu < 0.90 * real: - out.write(" warning: test above used only %d%% CPU, " - "result may be flawed!\n" % (100.0 * cpu / real)) + out.write(" warning: test above used only " + f"{cpu / real:%} CPU, " + "result may be flawed!\n") def run_one_test(name, size, open_func, test_func, *args): mode = test_func.file_open_mode @@ -308,22 +321,15 @@ def run_test_family(tests, mode_filter, files, open_func, *make_args): "large": 2, } - print("Python %s" % sys.version) - if sys.version_info < (3, 3): - if sys.maxunicode > 0xffff: - text = "UCS-4 (wide build)" - else: - text = "UTF-16 (narrow build)" - else: - text = "PEP 393" - print("Unicode: %s" % text) + print(f"Python {sys.version}") + print("Unicode: PEP 393") print(platform.platform()) binary_files = list(get_binary_files()) text_files = list(get_text_files()) if "b" in options: print("Binary unit = one byte") if "t" in options: - print("Text unit = one character (%s-decoded)" % TEXT_ENCODING) + print(f"Text unit = one character ({TEXT_ENCODING}-decoded)") # Binary reads if "b" in options and "r" in options: @@ -338,6 +344,7 @@ def run_test_family(tests, mode_filter, files, open_func, *make_args): # Binary writes if "b" in options and "w" in options: print("\n** Binary append **\n") + def make_test_source(name, size): with open(name, "rb") as f: return f.read() @@ -347,6 +354,7 @@ def make_test_source(name, size): # Text writes if "t" in options and "w" in options: print("\n** Text append **\n") + def make_test_source(name, size): with text_open(name, "r") as f: return f.read() @@ -356,6 +364,7 @@ def make_test_source(name, size): # Binary overwrites if "b" in options and "w" in options: print("\n** Binary overwrite **\n") + def make_test_source(name, size): with open(name, "rb") as f: return f.read() @@ -365,6 +374,7 @@ def make_test_source(name, size): # Text overwrites if "t" in options and "w" in options: print("\n** Text overwrite **\n") + def make_test_source(name, size): with text_open(name, "r") as f: return f.read() @@ -388,7 +398,7 @@ def prepare_files(): break else: raise RuntimeError( - "Couldn't find chunk marker in %s !" % __file__) + f"Couldn't find chunk marker in {__file__} !") if NEWLINES == "all": it = itertools.cycle(["\n", "\r", "\r\n"]) else: @@ -414,6 +424,7 @@ def prepare_files(): f.write(head) f.write(tail) + def main(): global TEXT_ENCODING, NEWLINES @@ -433,7 +444,7 @@ def main(): help="run write & modify tests") parser.add_option("-E", "--encoding", action="store", dest="encoding", default=None, - help="encoding for text tests (default: %s)" % TEXT_ENCODING) + help=f"encoding for text tests (default: {TEXT_ENCODING})") parser.add_option("-N", "--newlines", action="store", dest="newlines", default='lf', help="line endings for text tests " @@ -446,7 +457,7 @@ def main(): parser.error("unexpected arguments") NEWLINES = options.newlines.lower() if NEWLINES not in ('lf', 'cr', 'crlf', 'all'): - parser.error("invalid 'newlines' option: %r" % NEWLINES) + parser.error(f"invalid 'newlines' option: {NEWLINES!r}") test_options = "" if options.read: @@ -471,6 +482,7 @@ def main(): prepare_files() run_all_tests(test_options) + if __name__ == "__main__": main() From 0ba0ca05d2b56afa0b055db02233e703fe138918 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Sat, 8 Apr 2023 15:09:00 +0100 Subject: [PATCH 109/349] gh-103373: Improve documentation for `__mro_entries__` (#103374) --- Doc/reference/datamodel.rst | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index a09d5529c8c6f9..ed9ebaba784bc2 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -2086,11 +2086,15 @@ When a class definition is executed, the following steps occur: Resolving MRO entries ^^^^^^^^^^^^^^^^^^^^^ -If a base that appears in class definition is not an instance of :class:`type`, -then an ``__mro_entries__`` method is searched on it. If found, it is called -with the original bases tuple. This method must return a tuple of classes that -will be used instead of this base. The tuple may be empty, in such case -the original base is ignored. +.. method:: object.__mro_entries__(self, bases) + + If a base that appears in a class definition is not an instance of + :class:`type`, then an ``__mro_entries__`` method is searched on the base. + If an ``__mro_entries__`` method is found, the base is substituted with the + result of a call to ``__mro_entries__`` when creating the class. + The method is called with the original bases tuple, and must return a tuple + of classes that will be used instead of the base. The returned tuple may be + empty: in these cases, the original base is ignored. .. seealso:: From 35167043e3a21055a94cf3de6ceccd1585554cb8 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sun, 9 Apr 2023 02:56:42 +0900 Subject: [PATCH 110/349] gh-103242: Migrate SSLContext.set_ecdh_curve not to use deprecated APIs (#103378) Migrate `SSLContext.set_ecdh_curve()` not to use deprecated OpenSSL APIs. --- .../2023-04-08-17-13-07.gh-issue-103242.ysI1b3.rst | 2 ++ Modules/_ssl.c | 11 ++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-04-08-17-13-07.gh-issue-103242.ysI1b3.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-04-08-17-13-07.gh-issue-103242.ysI1b3.rst b/Misc/NEWS.d/next/Core and Builtins/2023-04-08-17-13-07.gh-issue-103242.ysI1b3.rst new file mode 100644 index 00000000000000..38b107f3be174f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-04-08-17-13-07.gh-issue-103242.ysI1b3.rst @@ -0,0 +1,2 @@ +Migrate :meth:`~ssl.SSLContext.set_ecdh_curve` method not to use deprecated +OpenSSL APIs. Patch by Dong-hee Na. diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 5f17cd502d4598..c9e2f24d66cc00 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -4336,8 +4336,6 @@ _ssl__SSLContext_set_ecdh_curve(PySSLContext *self, PyObject *name) { PyObject *name_bytes; int nid; - EC_KEY *key; - if (!PyUnicode_FSConverter(name, &name_bytes)) return NULL; assert(PyBytes_Check(name_bytes)); @@ -4348,13 +4346,20 @@ _ssl__SSLContext_set_ecdh_curve(PySSLContext *self, PyObject *name) "unknown elliptic curve name %R", name); return NULL; } - key = EC_KEY_new_by_curve_name(nid); +#if OPENSSL_VERSION_MAJOR < 3 + EC_KEY *key = EC_KEY_new_by_curve_name(nid); if (key == NULL) { _setSSLError(get_state_ctx(self), NULL, 0, __FILE__, __LINE__); return NULL; } SSL_CTX_set_tmp_ecdh(self->ctx, key); EC_KEY_free(key); +#else + if (!SSL_CTX_set1_groups(self->ctx, &nid, 1)) { + _setSSLError(get_state_ctx(self), NULL, 0, __FILE__, __LINE__); + return NULL; + } +#endif Py_RETURN_NONE; } From f329a8bc1e57e454852f8887df6267b42047cd1b Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 9 Apr 2023 03:03:52 +0200 Subject: [PATCH 111/349] gh-103092: Isolate `socket` module (#103094) --- Lib/test/test_socket.py | 7 + ...-04-03-23-43-12.gh-issue-103092.3xqk4y.rst | 1 + Modules/socketmodule.c | 394 +++++++++++------- Modules/socketmodule.h | 1 + Tools/c-analyzer/cpython/globals-to-fix.tsv | 6 - 5 files changed, 242 insertions(+), 167 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-03-23-43-12.gh-issue-103092.3xqk4y.rst diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 32252f7b741fda..bb7bf436d2d721 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -8,6 +8,7 @@ import array import contextlib import errno +import gc import io import itertools import math @@ -836,6 +837,12 @@ def requireSocket(*args): class GeneralModuleTests(unittest.TestCase): + @unittest.skipUnless(_socket is not None, 'need _socket module') + def test_socket_type(self): + self.assertTrue(gc.is_tracked(_socket.socket)) + with self.assertRaisesRegex(TypeError, "immutable"): + _socket.socket.foo = 1 + def test_SocketType_is_socketobject(self): import _socket self.assertTrue(socket.SocketType is _socket.socket) diff --git a/Misc/NEWS.d/next/Library/2023-04-03-23-43-12.gh-issue-103092.3xqk4y.rst b/Misc/NEWS.d/next/Library/2023-04-03-23-43-12.gh-issue-103092.3xqk4y.rst new file mode 100644 index 00000000000000..e7586a223c1415 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-03-23-43-12.gh-issue-103092.3xqk4y.rst @@ -0,0 +1 @@ +Isolate :mod:`!_socket` (apply :pep:`687`). Patch by Erlend E. Aasland. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 49342b3d48de0e..656cd546d46d31 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -108,6 +108,7 @@ Local naming conventions: #define PY_SSIZE_T_CLEAN #include "Python.h" #include "pycore_fileutils.h" // _Py_set_inheritable() +#include "pycore_moduleobject.h" // _PyModule_GetState #include "structmember.h" // PyMemberDef #ifdef _Py_MEMORY_SANITIZER @@ -337,9 +338,9 @@ static FlagRuntimeInfo win_runtime_flags[] = { /*[clinic input] module _socket -class _socket.socket "PySocketSockObject *" "&sock_type" +class _socket.socket "PySocketSockObject *" "clinic_state()->sock_type" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=7a8313d9b7f51988]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=2db2489bd2219fd8]*/ static int remove_unusable_flags(PyObject *m) @@ -541,22 +542,59 @@ remove_unusable_flags(PyObject *m) #define INADDR_NONE (-1) #endif +typedef struct _socket_state { + /* The sock_type variable contains pointers to various functions, + some of which call new_sockobject(), which uses sock_type, so + there has to be a circular reference. */ + PyTypeObject *sock_type; + + /* Global variable holding the exception type for errors detected + by this module (but not argument type or memory errors, etc.). */ + PyObject *socket_herror; + PyObject *socket_gaierror; + + /* Default timeout for new sockets */ + _PyTime_t defaulttimeout; + +#if defined(HAVE_ACCEPT) || defined(HAVE_ACCEPT4) +#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) + /* accept4() is available on Linux 2.6.28+ and glibc 2.10 */ + int accept4_works; +#endif +#endif + +#ifdef SOCK_CLOEXEC + /* socket() and socketpair() fail with EINVAL on Linux kernel older + * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */ + int sock_cloexec_works; +#endif +} socket_state; + +static inline socket_state * +get_module_state(PyObject *mod) +{ + void *state = _PyModule_GetState(mod); + assert(state != NULL); + return (socket_state *)state; +} + +static struct PyModuleDef socketmodule; + +static inline socket_state * +find_module_state_by_def(PyTypeObject *type) +{ + PyObject *mod = PyType_GetModuleByDef(type, &socketmodule); + assert(mod != NULL); + return get_module_state(mod); +} + +#define clinic_state() (find_module_state_by_def(type)) #include "clinic/socketmodule.c.h" +#undef clinic_state /* XXX There's a problem here: *static* functions are not supposed to have a Py prefix (or use CapitalizedWords). Later... */ -/* Global variable holding the exception type for errors detected - by this module (but not argument type or memory errors, etc.). */ -static PyObject *socket_herror; -static PyObject *socket_gaierror; - -/* A forward reference to the socket type object. - The sock_type variable contains pointers to various functions, - some of which call new_sockobject(), which uses sock_type, so - there has to be a circular reference. */ -static PyTypeObject sock_type; - #if defined(HAVE_POLL_H) #include #elif defined(HAVE_SYS_POLL_H) @@ -641,7 +679,7 @@ set_error(void) #if defined(HAVE_GETHOSTBYNAME_R) || defined (HAVE_GETHOSTBYNAME) || defined (HAVE_GETHOSTBYADDR) static PyObject * -set_herror(int h_error) +set_herror(socket_state *state, int h_error) { PyObject *v; @@ -651,7 +689,7 @@ set_herror(int h_error) v = Py_BuildValue("(is)", h_error, "host not found"); #endif if (v != NULL) { - PyErr_SetObject(socket_herror, v); + PyErr_SetObject(state->socket_herror, v); Py_DECREF(v); } @@ -662,7 +700,7 @@ set_herror(int h_error) #ifdef HAVE_GETADDRINFO static PyObject * -set_gaierror(int error) +set_gaierror(socket_state *state, int error) { PyObject *v; @@ -678,7 +716,7 @@ set_gaierror(int error) v = Py_BuildValue("(is)", error, "getaddrinfo failed"); #endif if (v != NULL) { - PyErr_SetObject(socket_gaierror, v); + PyErr_SetObject(state->socket_gaierror, v); Py_DECREF(v); } @@ -991,11 +1029,8 @@ sock_call(PySocketSockObject *s, /* Initialize a new socket object. */ -/* Default timeout for new sockets */ -static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1); - static int -init_sockobject(PySocketSockObject *s, +init_sockobject(socket_state *state, PySocketSockObject *s, SOCKET_T fd, int family, int type, int proto) { s->sock_fd = fd; @@ -1025,13 +1060,14 @@ init_sockobject(PySocketSockObject *s, else #endif { - s->sock_timeout = defaulttimeout; - if (defaulttimeout >= 0) { + s->sock_timeout = state->defaulttimeout; + if (state->defaulttimeout >= 0) { if (internal_setblocking(s, 0) == -1) { return -1; } } } + s->state = state; return 0; } @@ -1043,14 +1079,15 @@ init_sockobject(PySocketSockObject *s, in NEWOBJ()). */ static PySocketSockObject * -new_sockobject(SOCKET_T fd, int family, int type, int proto) +new_sockobject(socket_state *state, SOCKET_T fd, int family, int type, + int proto) { - PySocketSockObject *s; - s = (PySocketSockObject *) - PyType_GenericNew(&sock_type, NULL, NULL); - if (s == NULL) + PyTypeObject *tp = state->sock_type; + PySocketSockObject *s = (PySocketSockObject *)tp->tp_alloc(tp, 0); + if (s == NULL) { return NULL; - if (init_sockobject(s, fd, family, type, proto) == -1) { + } + if (init_sockobject(state, s, fd, family, type, proto) == -1) { Py_DECREF(s); return NULL; } @@ -1074,7 +1111,8 @@ static PyThread_type_lock netdb_lock; an error occurred; then an exception is raised. */ static int -setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af) +setipaddr(socket_state *state, const char *name, struct sockaddr *addr_ret, + size_t addr_ret_size, int af) { struct addrinfo hints, *res; int error; @@ -1095,7 +1133,7 @@ setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int outcome of the first call. */ if (error) { res = NULL; // no-op, remind us that it is invalid; gh-100795 - set_gaierror(error); + set_gaierror(state, error); return -1; } switch (res->ai_family) { @@ -1206,7 +1244,7 @@ setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int Py_END_ALLOW_THREADS if (error) { res = NULL; // no-op, remind us that it is invalid; gh-100795 - set_gaierror(error); + set_gaierror(state, error); return -1; } if (res->ai_addrlen < addr_ret_size) @@ -1889,7 +1927,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, return 0; } struct sockaddr_in* addr = &addrbuf->in; - result = setipaddr(host.buf, (struct sockaddr *)addr, + result = setipaddr(s->state, host.buf, (struct sockaddr *)addr, sizeof(*addr), AF_INET); idna_cleanup(&host); if (result < 0) @@ -1934,7 +1972,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, return 0; } struct sockaddr_in6* addr = &addrbuf->in6; - result = setipaddr(host.buf, (struct sockaddr *)addr, + result = setipaddr(s->state, host.buf, (struct sockaddr *)addr, sizeof(*addr), AF_INET6); idna_cleanup(&host); if (result < 0) @@ -2813,10 +2851,6 @@ struct sock_accept { }; #if defined(HAVE_ACCEPT) || defined(HAVE_ACCEPT4) -#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) -/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */ -static int accept4_works = -1; -#endif static int sock_accept_impl(PySocketSockObject *s, void *data) @@ -2835,15 +2869,16 @@ sock_accept_impl(PySocketSockObject *s, void *data) #endif #if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) - if (accept4_works != 0) { + socket_state *state = s->state; + if (state->accept4_works != 0) { ctx->result = accept4(s->sock_fd, addr, paddrlen, SOCK_CLOEXEC); - if (ctx->result == INVALID_SOCKET && accept4_works == -1) { + if (ctx->result == INVALID_SOCKET && state->accept4_works == -1) { /* On Linux older than 2.6.28, accept4() fails with ENOSYS */ - accept4_works = (errno != ENOSYS); + state->accept4_works = (errno != ENOSYS); } } - if (accept4_works == 0) + if (state->accept4_works == 0) ctx->result = accept(s->sock_fd, addr, paddrlen); #else ctx->result = accept(s->sock_fd, addr, paddrlen); @@ -2896,7 +2931,8 @@ sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored)) #else #if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) - if (!accept4_works) + socket_state *state = s->state; + if (!state->accept4_works) #endif { if (_Py_set_inheritable(newfd, 0, NULL) < 0) { @@ -5219,13 +5255,23 @@ sock_finalize(PySocketSockObject *s) PyErr_SetRaisedException(exc); } +static int +sock_traverse(PySocketSockObject *s, visitproc visit, void *arg) +{ + Py_VISIT(Py_TYPE(s)); + return 0; +} + static void sock_dealloc(PySocketSockObject *s) { - if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0) + if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0) { return; - - Py_TYPE(s)->tp_free((PyObject *)s); + } + PyTypeObject *tp = Py_TYPE(s); + PyObject_GC_UnTrack(s); + tp->tp_free((PyObject *)s); + Py_DECREF(tp); } @@ -5277,12 +5323,6 @@ sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds) /* Initialize a new socket object. */ -#ifdef SOCK_CLOEXEC -/* socket() and socketpair() fail with EINVAL on Linux kernel older - * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */ -static int sock_cloexec_works = -1; -#endif - /*ARGSUSED*/ #ifndef HAVE_SOCKET @@ -5310,10 +5350,11 @@ sock_initobj_impl(PySocketSockObject *self, int family, int type, int proto, { SOCKET_T fd = INVALID_SOCKET; + socket_state *state = find_module_state_by_def(Py_TYPE(self)); #ifndef MS_WINDOWS #ifdef SOCK_CLOEXEC - int *atomic_flag_works = &sock_cloexec_works; + int *atomic_flag_works = &state->sock_cloexec_works; #else int *atomic_flag_works = NULL; #endif @@ -5468,15 +5509,15 @@ sock_initobj_impl(PySocketSockObject *self, int family, int type, int proto, /* UNIX */ Py_BEGIN_ALLOW_THREADS #ifdef SOCK_CLOEXEC - if (sock_cloexec_works != 0) { + if (state->sock_cloexec_works != 0) { fd = socket(family, type | SOCK_CLOEXEC, proto); - if (sock_cloexec_works == -1) { + if (state->sock_cloexec_works == -1) { if (fd >= 0) { - sock_cloexec_works = 1; + state->sock_cloexec_works = 1; } else if (errno == EINVAL) { /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */ - sock_cloexec_works = 0; + state->sock_cloexec_works = 0; fd = socket(family, type, proto); } } @@ -5499,7 +5540,7 @@ sock_initobj_impl(PySocketSockObject *self, int family, int type, int proto, } #endif } - if (init_sockobject(self, fd, family, type, proto) == -1) { + if (init_sockobject(state, self, fd, family, type, proto) == -1) { SOCKETCLOSE(fd); return -1; } @@ -5511,55 +5552,26 @@ sock_initobj_impl(PySocketSockObject *self, int family, int type, int proto, /* Type object for socket objects. */ -static PyTypeObject sock_type = { - PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */ - "_socket.socket", /* tp_name */ - sizeof(PySocketSockObject), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)sock_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - (reprfunc)sock_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - sock_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - sock_methods, /* tp_methods */ - sock_memberlist, /* tp_members */ - sock_getsetlist, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - sock_initobj, /* tp_init */ - PyType_GenericAlloc, /* tp_alloc */ - sock_new, /* tp_new */ - PyObject_Del, /* tp_free */ - 0, /* tp_is_gc */ - 0, /* tp_bases */ - 0, /* tp_mro */ - 0, /* tp_cache */ - 0, /* tp_subclasses */ - 0, /* tp_weaklist */ - 0, /* tp_del */ - 0, /* tp_version_tag */ - (destructor)sock_finalize, /* tp_finalize */ +static PyType_Slot sock_slots[] = { + {Py_tp_dealloc, sock_dealloc}, + {Py_tp_traverse, sock_traverse}, + {Py_tp_repr, sock_repr}, + {Py_tp_doc, (void *)sock_doc}, + {Py_tp_methods, sock_methods}, + {Py_tp_members, sock_memberlist}, + {Py_tp_getset, sock_getsetlist}, + {Py_tp_init, sock_initobj}, + {Py_tp_new, sock_new}, + {Py_tp_finalize, sock_finalize}, + {0, NULL}, +}; + +static PyType_Spec sock_spec = { + .name = "_socket.socket", + .basicsize = sizeof(PySocketSockObject), + .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_IMMUTABLETYPE), + .slots = sock_slots, }; @@ -5687,8 +5699,12 @@ socket_gethostbyname(PyObject *self, PyObject *args) if (PySys_Audit("socket.gethostbyname", "O", args) < 0) { goto finally; } - if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0) + socket_state *state = get_module_state(self); + int rc = setipaddr(state, name, (struct sockaddr *)&addrbuf, + sizeof(addrbuf), AF_INET); + if (rc < 0) { goto finally; + } ret = make_ipv4_addr(&addrbuf); finally: PyMem_Free(name); @@ -5719,7 +5735,8 @@ sock_decode_hostname(const char *name) /* Convenience function common to gethostbyname_ex and gethostbyaddr */ static PyObject * -gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af) +gethost_common(socket_state *state, struct hostent *h, struct sockaddr *addr, + size_t alen, int af) { char **pch; PyObject *rtn_tuple = (PyObject *)NULL; @@ -5730,7 +5747,7 @@ gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af) if (h == NULL) { /* Let's get real error message to return */ - set_herror(h_errno); + set_herror(state, h_errno); return NULL; } @@ -5877,8 +5894,10 @@ socket_gethostbyname_ex(PyObject *self, PyObject *args) if (PySys_Audit("socket.gethostbyname", "O", args) < 0) { goto finally; } - if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0) + socket_state *state = get_module_state(self); + if (setipaddr(state, name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0) { goto finally; + } Py_BEGIN_ALLOW_THREADS #ifdef HAVE_GETHOSTBYNAME_R #if defined(HAVE_GETHOSTBYNAME_R_6_ARG) @@ -5904,7 +5923,7 @@ socket_gethostbyname_ex(PyObject *self, PyObject *args) Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */ sa = SAS2SA(&addr); - ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), + ret = gethost_common(state, h, SAS2SA(&addr), sizeof(addr), sa->sa_family); #ifdef USE_GETHOSTBYNAME_LOCK PyThread_release_lock(netdb_lock); @@ -5960,8 +5979,10 @@ socket_gethostbyaddr(PyObject *self, PyObject *args) goto finally; } af = AF_UNSPEC; - if (setipaddr(ip_num, sa, sizeof(addr), af) < 0) + socket_state *state = get_module_state(self); + if (setipaddr(state, ip_num, sa, sizeof(addr), af) < 0) { goto finally; + } af = sa->sa_family; ap = NULL; /* al = 0; */ @@ -6002,7 +6023,7 @@ socket_gethostbyaddr(PyObject *self, PyObject *args) h = gethostbyaddr(ap, al, af); #endif /* HAVE_GETHOSTBYNAME_R */ Py_END_ALLOW_THREADS - ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af); + ret = gethost_common(state, h, SAS2SA(&addr), sizeof(addr), af); #ifdef USE_GETHOSTBYNAME_LOCK PyThread_release_lock(netdb_lock); #endif @@ -6221,8 +6242,9 @@ socket_socketpair(PyObject *self, PyObject *args) SOCKET_T sv[2]; int family, type = SOCK_STREAM, proto = 0; PyObject *res = NULL; + socket_state *state = get_module_state(self); #ifdef SOCK_CLOEXEC - int *atomic_flag_works = &sock_cloexec_works; + int *atomic_flag_works = &state->sock_cloexec_works; #else int *atomic_flag_works = NULL; #endif @@ -6240,15 +6262,15 @@ socket_socketpair(PyObject *self, PyObject *args) /* Create a pair of socket fds */ Py_BEGIN_ALLOW_THREADS #ifdef SOCK_CLOEXEC - if (sock_cloexec_works != 0) { + if (state->sock_cloexec_works != 0) { ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv); - if (sock_cloexec_works == -1) { + if (state->sock_cloexec_works == -1) { if (ret >= 0) { - sock_cloexec_works = 1; + state->sock_cloexec_works = 1; } else if (errno == EINVAL) { /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */ - sock_cloexec_works = 0; + state->sock_cloexec_works = 0; ret = socketpair(family, type, proto, sv); } } @@ -6268,10 +6290,10 @@ socket_socketpair(PyObject *self, PyObject *args) if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0) goto finally; - s0 = new_sockobject(sv[0], family, type, proto); + s0 = new_sockobject(state, sv[0], family, type, proto); if (s0 == NULL) goto finally; - s1 = new_sockobject(sv[1], family, type, proto); + s1 = new_sockobject(state, sv[1], family, type, proto); if (s1 == NULL) goto finally; res = PyTuple_Pack(2, s0, s1); @@ -6726,7 +6748,8 @@ socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs) Py_END_ALLOW_THREADS if (error) { res0 = NULL; // gh-100795 - set_gaierror(error); + socket_state *state = get_module_state(self); + set_gaierror(state, error); goto err; } @@ -6825,7 +6848,8 @@ socket_getnameinfo(PyObject *self, PyObject *args) Py_END_ALLOW_THREADS if (error) { res = NULL; // gh-100795 - set_gaierror(error); + socket_state *state = get_module_state(self); + set_gaierror(state, error); goto fail; } if (res->ai_next) { @@ -6857,7 +6881,8 @@ socket_getnameinfo(PyObject *self, PyObject *args) error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen, hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags); if (error) { - set_gaierror(error); + socket_state *state = get_module_state(self); + set_gaierror(state, error); goto fail; } @@ -6883,11 +6908,12 @@ Get host and port for a sockaddr."); static PyObject * socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored)) { - if (defaulttimeout < 0) { + socket_state *state = get_module_state(self); + if (state->defaulttimeout < 0) { Py_RETURN_NONE; } else { - double seconds = _PyTime_AsSecondsDouble(defaulttimeout); + double seconds = _PyTime_AsSecondsDouble(state->defaulttimeout); return PyFloat_FromDouble(seconds); } } @@ -6907,7 +6933,8 @@ socket_setdefaulttimeout(PyObject *self, PyObject *arg) if (socket_parse_timeout(&timeout, arg) < 0) return NULL; - defaulttimeout = timeout; + socket_state *state = get_module_state(self); + state->defaulttimeout = timeout; Py_RETURN_NONE; } @@ -7293,7 +7320,7 @@ sock_destroy_api(PyObject *capsule) } static PySocketModule_APIObject * -sock_get_api(void) +sock_get_api(socket_state *state) { PySocketModule_APIObject *capi = PyMem_Malloc(sizeof(PySocketModule_APIObject)); if (capi == NULL) { @@ -7301,7 +7328,7 @@ sock_get_api(void) return NULL; } - capi->Sock_Type = (PyTypeObject *)Py_NewRef(&sock_type); + capi->Sock_Type = (PyTypeObject *)Py_NewRef(state->sock_type); capi->error = Py_NewRef(PyExc_OSError); capi->timeout_error = Py_NewRef(PyExc_TimeoutError); return capi; @@ -7323,47 +7350,38 @@ PyDoc_STRVAR(socket_doc, \n\ See the socket module for documentation."); -static struct PyModuleDef socketmodule = { - PyModuleDef_HEAD_INIT, - PySocket_MODULE_NAME, - socket_doc, - -1, - socket_methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC -PyInit__socket(void) +static int +socket_exec(PyObject *m) { - PyObject *m = NULL; - if (!os_init()) { goto error; } - Py_SET_TYPE(&sock_type, &PyType_Type); - m = PyModule_Create(&socketmodule); - if (m == NULL) { - goto error; - } + socket_state *state = get_module_state(m); + state->defaulttimeout = _PYTIME_FROMSECONDS(-1); + +#if defined(HAVE_ACCEPT) || defined(HAVE_ACCEPT4) +#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) + state->accept4_works = -1; +#endif +#endif + +#ifdef SOCK_CLOEXEC + state->sock_cloexec_works = -1; +#endif #define ADD_EXC(MOD, NAME, VAR, BASE) do { \ VAR = PyErr_NewException("socket." NAME, BASE, NULL); \ if (VAR == NULL) { \ goto error; \ } \ - int rc = PyModule_AddObjectRef(MOD, NAME, VAR); \ - Py_DECREF(VAR); \ - if (rc < 0) { \ + if (PyModule_AddObjectRef(MOD, NAME, VAR) < 0) { \ goto error; \ } \ } while (0) - ADD_EXC(m, "herror", socket_herror, PyExc_OSError); - ADD_EXC(m, "gaierror", socket_gaierror, PyExc_OSError); + ADD_EXC(m, "herror", state->socket_herror, PyExc_OSError); + ADD_EXC(m, "gaierror", state->socket_gaierror, PyExc_OSError); #undef ADD_EXC @@ -7373,10 +7391,16 @@ PyInit__socket(void) if (PyModule_AddObjectRef(m, "timeout", PyExc_TimeoutError) < 0) { goto error; } - if (PyModule_AddObjectRef(m, "SocketType", (PyObject *)&sock_type) < 0) { + + PyObject *sock_type = PyType_FromMetaclass(NULL, m, &sock_spec, NULL); + if (sock_type == NULL) { + goto error; + } + state->sock_type = (PyTypeObject *)sock_type; + if (PyModule_AddObjectRef(m, "SocketType", sock_type) < 0) { goto error; } - if (PyModule_AddType(m, &sock_type) < 0) { + if (PyModule_AddType(m, state->sock_type) < 0) { goto error; } @@ -7391,7 +7415,7 @@ PyInit__socket(void) } /* Export C API */ - PySocketModule_APIObject *capi = sock_get_api(); + PySocketModule_APIObject *capi = sock_get_api(state); if (capi == NULL) { goto error; } @@ -8813,9 +8837,57 @@ PyInit__socket(void) #undef ADD_INT_CONST #undef ADD_STR_CONST - return m; + return 0; error: - Py_XDECREF(m); - return NULL; + return -1; +} + +static struct PyModuleDef_Slot socket_slots[] = { + {Py_mod_exec, socket_exec}, + {0, NULL}, +}; + +static int +socket_traverse(PyObject *mod, visitproc visit, void *arg) +{ + socket_state *state = get_module_state(mod); + Py_VISIT(state->sock_type); + Py_VISIT(state->socket_herror); + Py_VISIT(state->socket_gaierror); + return 0; +} + +static int +socket_clear(PyObject *mod) +{ + socket_state *state = get_module_state(mod); + Py_CLEAR(state->sock_type); + Py_CLEAR(state->socket_herror); + Py_CLEAR(state->socket_gaierror); + return 0; +} + +static void +socket_free(void *mod) +{ + (void)socket_clear((PyObject *)mod); +} + +static struct PyModuleDef socketmodule = { + .m_base = PyModuleDef_HEAD_INIT, + .m_name = PySocket_MODULE_NAME, + .m_doc = socket_doc, + .m_size = sizeof(socket_state), + .m_methods = socket_methods, + .m_slots = socket_slots, + .m_traverse = socket_traverse, + .m_clear = socket_clear, + .m_free = socket_free, +}; + +PyMODINIT_FUNC +PyInit__socket(void) +{ + return PyModuleDef_Init(&socketmodule); } diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h index f31ba532a6c60d..f5ca00450ee92a 100644 --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -322,6 +322,7 @@ typedef struct { sets a Python exception */ _PyTime_t sock_timeout; /* Operation timeout in seconds; 0.0 means non-blocking */ + struct _socket_state *state; } PySocketSockObject; /* --- C API ----------------------------------------------------*/ diff --git a/Tools/c-analyzer/cpython/globals-to-fix.tsv b/Tools/c-analyzer/cpython/globals-to-fix.tsv index 0620c7e13925b5..e36024ad16c271 100644 --- a/Tools/c-analyzer/cpython/globals-to-fix.tsv +++ b/Tools/c-analyzer/cpython/globals-to-fix.tsv @@ -392,7 +392,6 @@ Modules/_decimal/_decimal.c - PyDecSignalDictMixin_Type - Modules/_decimal/_decimal.c - PyDec_Type - Modules/ossaudiodev.c - OSSAudioType - Modules/ossaudiodev.c - OSSMixerType - -Modules/socketmodule.c - sock_type - Modules/xxmodule.c - Null_Type - Modules/xxmodule.c - Str_Type - Modules/xxmodule.c - Xxo_Type - @@ -416,8 +415,6 @@ Modules/_cursesmodule.c - PyCursesError - Modules/_decimal/_decimal.c - DecimalException - Modules/_tkinter.c - Tkinter_TclError - Modules/ossaudiodev.c - OSSAudioError - -Modules/socketmodule.c - socket_herror - -Modules/socketmodule.c - socket_gaierror - Modules/xxlimited_35.c - ErrorObject - Modules/xxmodule.c - ErrorObject - @@ -514,8 +511,6 @@ Modules/cjkcodecs/cjkcodecs.h - mapping_list - Modules/readline.c - libedit_append_replace_history_offset - Modules/readline.c - using_libedit_emulation - Modules/readline.c - libedit_history_start - -Modules/socketmodule.c - accept4_works - -Modules/socketmodule.c - sock_cloexec_works - ##----------------------- ## state @@ -541,4 +536,3 @@ Modules/readline.c - sigwinch_ohandler - Modules/readline.c - completed_input_string - Modules/rotatingtree.c - random_stream - Modules/rotatingtree.c - random_value - -Modules/socketmodule.c - defaulttimeout - From 63dc969ec6129704c3b23b384ecfa8e485d6c4cb Mon Sep 17 00:00:00 2001 From: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> Date: Sun, 9 Apr 2023 07:29:08 +0530 Subject: [PATCH 112/349] Document `asyncio` performance improvement in What's New (#103370) Co-authored-by: Alex Waygood --- Doc/whatsnew/3.12.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 66e40ef7326cc0..651caed864fef7 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -210,6 +210,11 @@ array asyncio ------- +* The performance of writing to sockets in :mod:`asyncio` has been + significantly improved. ``asyncio`` now avoids unnecessary copying when + writing to sockets and uses :meth:`~socket.socket.sendmsg` if the platform + supports it. (Contributed by Kumar Aditya in :gh:`91166`.) + * On Linux, :mod:`asyncio` uses :class:`~asyncio.PidfdChildWatcher` by default if :func:`os.pidfd_open` is available and functional instead of :class:`~asyncio.ThreadedChildWatcher`. From 83af8f268629139b9628ff53617671469167146a Mon Sep 17 00:00:00 2001 From: yuki Date: Sun, 9 Apr 2023 11:02:16 +0900 Subject: [PATCH 113/349] Docs: Fix broken reference `__getitem__` in `string.rst` (#103371) --- Doc/library/string.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/string.rst b/Doc/library/string.rst index 5ada827328188d..f55074cc582718 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -235,7 +235,7 @@ dictionary keys (e.g., the strings ``'10'`` or ``':-]'``) within a format string The *arg_name* can be followed by any number of index or attribute expressions. An expression of the form ``'.name'`` selects the named attribute using :func:`getattr`, while an expression of the form ``'[index]'`` -does an index lookup using :func:`__getitem__`. +does an index lookup using :meth:`~object.__getitem__`. .. versionchanged:: 3.1 The positional argument specifiers can be omitted for :meth:`str.format`, From 264b87f7fd0634485b9b4d21df49bec3401d7b2a Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Sun, 9 Apr 2023 03:05:50 +0100 Subject: [PATCH 114/349] gh-102799: use `sys.exception()` instead of `sys.exc_info()` in pdb (#103294) --- Lib/pdb.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Lib/pdb.py b/Lib/pdb.py index e043b0d46f7dd0..e03142e9b5d85c 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1258,7 +1258,7 @@ def _getval_except(self, arg, frame=None): return _rstr('** raised %s **' % self._format_exc(exc)) def _error_exc(self): - exc = sys.exc_info()[1] + exc = sys.exception() self.error(self._format_exc(exc)) def _msg_val_func(self, arg, func): @@ -1755,9 +1755,10 @@ def post_mortem(t=None): """ # handling the default if t is None: - # sys.exc_info() returns (type, value, traceback) if an exception is - # being handled, otherwise it returns None - t = sys.exc_info()[2] + exc = sys.exception() + if exc is not None: + t = exc.__traceback__ + if t is None: raise ValueError("A valid traceback must be passed if no " "exception is being handled") @@ -1841,18 +1842,18 @@ def main(): except Restart: print("Restarting", target, "with arguments:") print("\t" + " ".join(sys.argv[1:])) - except SystemExit: + except SystemExit as e: # In most cases SystemExit does not warrant a post-mortem session. print("The program exited via sys.exit(). Exit status:", end=' ') - print(sys.exc_info()[1]) + print(e) except SyntaxError: traceback.print_exc() sys.exit(1) - except: + except BaseException as e: traceback.print_exc() print("Uncaught exception. Entering post mortem debugging") print("Running 'cont' or 'step' will restart the program") - t = sys.exc_info()[2] + t = e.__traceback__ pdb.interaction(None, t) print("Post mortem debugger finished. The " + target + " will be restarted") From 090e26ea807aa414d6a6a01d9365b0288c10a5db Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sun, 9 Apr 2023 09:39:03 +0300 Subject: [PATCH 115/349] CI: Do not allow merge if labelled DO-NOT-MERGE (#103337) Co-authored-by: C.A.M. Gerlach --- .github/workflows/require-pr-label.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/require-pr-label.yml diff --git a/.github/workflows/require-pr-label.yml b/.github/workflows/require-pr-label.yml new file mode 100644 index 00000000000000..e847bae155e216 --- /dev/null +++ b/.github/workflows/require-pr-label.yml @@ -0,0 +1,17 @@ +name: Check labels + +on: + pull_request: + types: [opened, reopened, labeled, unlabeled, synchronize] + +jobs: + label: + name: DO-NOT-MERGE + runs-on: ubuntu-latest + + steps: + - uses: mheap/github-action-required-labels@v4 + with: + mode: exactly + count: 0 + labels: "DO-NOT-MERGE" From c330b4a3e7b34308ad97d51de9ab8f4e51a0805c Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sun, 9 Apr 2023 10:43:01 +0300 Subject: [PATCH 116/349] Add hugovk as a .github code owner (GH-103394) Automerge-Triggered-By: GH:hugovk --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index fc1bb3388976d5..60af0519cdb743 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -5,7 +5,7 @@ # https://git-scm.com/docs/gitignore#_pattern_format # GitHub -.github/** @ezio-melotti +.github/** @ezio-melotti @hugovk # Build system configure* @erlend-aasland @corona10 From 5d4afc45b9567d227ea9a9988d58404662fce58c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 9 Apr 2023 13:42:43 +0530 Subject: [PATCH 117/349] build(deps): bump actions/stale from 7 to 8 (#103169) Bumps [actions/stale](https://github.com/actions/stale) from 7 to 8. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v7...v8) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 07dbcfe31d6563..d79e856c87e78d 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -15,7 +15,7 @@ jobs: steps: - name: "Check PRs" - uses: actions/stale@v7 + uses: actions/stale@v8 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-pr-message: 'This PR is stale because it has been open for 30 days with no activity.' From d9305f8e9d3e0f6267286c2da4b24e97b7a569f2 Mon Sep 17 00:00:00 2001 From: JakobDev Date: Sun, 9 Apr 2023 10:13:40 +0200 Subject: [PATCH 118/349] Fix typos in test_tempfile.py (#102841) --- Lib/test/test_tempfile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index 90155487cff585..11a43aca17e88a 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -1016,7 +1016,7 @@ def use_closed(): self.assertRaises(ValueError, use_closed) def test_context_man_not_del_on_close_if_delete_on_close_false(self): - # Issue gh-58451: tempfile.NamedTemporaryFile is not particulary useful + # Issue gh-58451: tempfile.NamedTemporaryFile is not particularly useful # on Windows # A NamedTemporaryFile is NOT deleted when closed if # delete_on_close=False, but is deleted on context manager exit @@ -1608,7 +1608,7 @@ def test_explicit_cleanup(self): finally: os.rmdir(dir) - def test_explict_cleanup_ignore_errors(self): + def test_explicit_cleanup_ignore_errors(self): """Test that cleanup doesn't return an error when ignoring them.""" with tempfile.TemporaryDirectory() as working_dir: temp_dir = self.do_create( From 86d20441557bedbea3dadd5d0818a492148335bd Mon Sep 17 00:00:00 2001 From: Oleg Iarygin Date: Sun, 9 Apr 2023 12:18:53 +0400 Subject: [PATCH 119/349] gh-103300: Fix `Popen.wait()` deadlock in patchcheck.py (#103301) --- Tools/patchcheck/patchcheck.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Tools/patchcheck/patchcheck.py b/Tools/patchcheck/patchcheck.py index 6dcf612066199c..44a6fb8c660cd2 100755 --- a/Tools/patchcheck/patchcheck.py +++ b/Tools/patchcheck/patchcheck.py @@ -130,9 +130,10 @@ def changed_files(base_branch=None): with subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, cwd=SRCDIR) as st: - if st.wait() != 0: + git_file_status, _ = st.communicate() + if st.returncode != 0: sys.exit(f'error running {cmd}') - for line in st.stdout: + for line in git_file_status.splitlines(): line = line.decode().rstrip() status_text, filename = line.split(maxsplit=1) status = set(status_text) From 975d220bbed0e7a15b62f1d2d03557740a55f68d Mon Sep 17 00:00:00 2001 From: mara004 Date: Sun, 9 Apr 2023 10:26:52 +0200 Subject: [PATCH 120/349] ctypes docs: fix missing `not` in variadic functions section (#102611) --- Doc/library/ctypes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index d49d702e9e7999..81509c0920bb6e 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -390,7 +390,7 @@ regular, non-variadic, function arguments: libc.printf.argtypes = [ctypes.c_char_p] -Because specifying the attribute does inhibit portability it is advised to always +Because specifying the attribute does not inhibit portability it is advised to always specify ``argtypes`` for all variadic functions. From 45b4b37fc26f288fabb27dc08b253121697c517b Mon Sep 17 00:00:00 2001 From: Stepfen Shawn Date: Sun, 9 Apr 2023 16:43:21 +0800 Subject: [PATCH 121/349] Remove useless symbol in pystats.h (#101864) --- Include/pystats.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/Include/pystats.h b/Include/pystats.h index 25ed4bddc7240c..4b961bad2a43e4 100644 --- a/Include/pystats.h +++ b/Include/pystats.h @@ -72,8 +72,6 @@ typedef struct _object_stats { uint64_t type_cache_collisions; } ObjectStats; -# - typedef struct _stats { OpcodeStats opcode_stats[256]; CallStats call_stats; From 8317d51996e68d8bb205385c1d47a9edcd128e7b Mon Sep 17 00:00:00 2001 From: Furkan Onder Date: Sun, 9 Apr 2023 11:44:49 +0300 Subject: [PATCH 122/349] Gh-68586: use run_python_until_end in test_capi (GH-102729) Co-authored-by: Aidin Gharibnavaz Automerge-Triggered-By: GH:kumaraditya303 --- Lib/test/test_capi/test_misc.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Lib/test/test_capi/test_misc.py b/Lib/test/test_capi/test_misc.py index c34ee578b5c83f..637adc01a331ce 100644 --- a/Lib/test/test_capi/test_misc.py +++ b/Lib/test/test_capi/test_misc.py @@ -21,7 +21,7 @@ from test.support import import_helper from test.support import threading_helper from test.support import warnings_helper -from test.support.script_helper import assert_python_failure, assert_python_ok +from test.support.script_helper import assert_python_failure, assert_python_ok, run_python_until_end try: import _posixsubprocess except ImportError: @@ -69,21 +69,17 @@ def test_instancemethod(self): @support.requires_subprocess() def test_no_FatalError_infinite_loop(self): - with support.SuppressCrashReport(): - p = subprocess.Popen([sys.executable, "-c", - 'import _testcapi;' - '_testcapi.crash_no_current_thread()'], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - text=True) - (out, err) = p.communicate() - self.assertEqual(out, '') + run_result, _cmd_line = run_python_until_end( + '-c', 'import _testcapi; _testcapi.crash_no_current_thread()', + ) + _rc, out, err = run_result + self.assertEqual(out, b'') # This used to cause an infinite loop. msg = ("Fatal Python error: PyThreadState_Get: " "the function must be called with the GIL held, " "after Python initialization and before Python finalization, " "but the GIL is released " - "(the current Python thread state is NULL)") + "(the current Python thread state is NULL)").encode() self.assertTrue(err.rstrip().startswith(msg), err) From 0a675f4bb57d01a5e69f8f58ae934ad7ca501a8d Mon Sep 17 00:00:00 2001 From: Barney Gale Date: Sun, 9 Apr 2023 16:48:45 +0100 Subject: [PATCH 123/349] GH-103379: Fix up old tests for `pathlib.PurePath._parse_path` (GH-103380) Co-authored-by: Terry Jan Reedy --- Lib/test/test_pathlib.py | 207 ++++++++++++++++++--------------------- 1 file changed, 97 insertions(+), 110 deletions(-) diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 8b6e012b730d75..fe75f1c2580bc4 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -24,116 +24,6 @@ grp = pwd = None -class _BaseFlavourTest(object): - - def _check_parse_parts(self, arg, expected): - def f(parts): - path = self.cls(*parts)._raw_path - return self.cls._parse_path(path) - sep = self.flavour.sep - altsep = self.flavour.altsep - actual = f([x.replace('/', sep) for x in arg]) - self.assertEqual(actual, expected) - if altsep: - actual = f([x.replace('/', altsep) for x in arg]) - self.assertEqual(actual, expected) - - def test_parse_parts_common(self): - check = self._check_parse_parts - sep = self.flavour.sep - # Unanchored parts. - check([], ('', '', [])) - check(['a'], ('', '', ['a'])) - check(['a/'], ('', '', ['a'])) - check(['a', 'b'], ('', '', ['a', 'b'])) - # Expansion. - check(['a/b'], ('', '', ['a', 'b'])) - check(['a/b/'], ('', '', ['a', 'b'])) - check(['a', 'b/c', 'd'], ('', '', ['a', 'b', 'c', 'd'])) - # Collapsing and stripping excess slashes. - check(['a', 'b//c', 'd'], ('', '', ['a', 'b', 'c', 'd'])) - check(['a', 'b/c/', 'd'], ('', '', ['a', 'b', 'c', 'd'])) - # Eliminating standalone dots. - check(['.'], ('', '', [])) - check(['.', '.', 'b'], ('', '', ['b'])) - check(['a', '.', 'b'], ('', '', ['a', 'b'])) - check(['a', '.', '.'], ('', '', ['a'])) - # The first part is anchored. - check(['/a/b'], ('', sep, [sep, 'a', 'b'])) - check(['/a', 'b'], ('', sep, [sep, 'a', 'b'])) - check(['/a/', 'b'], ('', sep, [sep, 'a', 'b'])) - # Ignoring parts before an anchored part. - check(['a', '/b', 'c'], ('', sep, [sep, 'b', 'c'])) - check(['a', '/b', '/c'], ('', sep, [sep, 'c'])) - - -class PosixFlavourTest(_BaseFlavourTest, unittest.TestCase): - cls = pathlib.PurePosixPath - flavour = pathlib.PurePosixPath._flavour - - def test_parse_parts(self): - check = self._check_parse_parts - # Collapsing of excess leading slashes, except for the double-slash - # special case. - check(['//a', 'b'], ('', '//', ['//', 'a', 'b'])) - check(['///a', 'b'], ('', '/', ['/', 'a', 'b'])) - check(['////a', 'b'], ('', '/', ['/', 'a', 'b'])) - # Paths which look like NT paths aren't treated specially. - check(['c:a'], ('', '', ['c:a'])) - check(['c:\\a'], ('', '', ['c:\\a'])) - check(['\\a'], ('', '', ['\\a'])) - - -class NTFlavourTest(_BaseFlavourTest, unittest.TestCase): - cls = pathlib.PureWindowsPath - flavour = pathlib.PureWindowsPath._flavour - - def test_parse_parts(self): - check = self._check_parse_parts - # First part is anchored. - check(['c:'], ('c:', '', ['c:'])) - check(['c:/'], ('c:', '\\', ['c:\\'])) - check(['/'], ('', '\\', ['\\'])) - check(['c:a'], ('c:', '', ['c:', 'a'])) - check(['c:/a'], ('c:', '\\', ['c:\\', 'a'])) - check(['/a'], ('', '\\', ['\\', 'a'])) - # UNC paths. - check(['//a/b'], ('\\\\a\\b', '\\', ['\\\\a\\b\\'])) - check(['//a/b/'], ('\\\\a\\b', '\\', ['\\\\a\\b\\'])) - check(['//a/b/c'], ('\\\\a\\b', '\\', ['\\\\a\\b\\', 'c'])) - # Second part is anchored, so that the first part is ignored. - check(['a', 'Z:b', 'c'], ('Z:', '', ['Z:', 'b', 'c'])) - check(['a', 'Z:/b', 'c'], ('Z:', '\\', ['Z:\\', 'b', 'c'])) - # UNC paths. - check(['a', '//b/c', 'd'], ('\\\\b\\c', '\\', ['\\\\b\\c\\', 'd'])) - # Collapsing and stripping excess slashes. - check(['a', 'Z://b//c/', 'd/'], ('Z:', '\\', ['Z:\\', 'b', 'c', 'd'])) - # UNC paths. - check(['a', '//b/c//', 'd'], ('\\\\b\\c', '\\', ['\\\\b\\c\\', 'd'])) - # Extended paths. - check(['//?/c:/'], ('\\\\?\\c:', '\\', ['\\\\?\\c:\\'])) - check(['//?/c:/a'], ('\\\\?\\c:', '\\', ['\\\\?\\c:\\', 'a'])) - check(['//?/c:/a', '/b'], ('\\\\?\\c:', '\\', ['\\\\?\\c:\\', 'b'])) - # Extended UNC paths (format is "\\?\UNC\server\share"). - check(['//?/UNC/b/c'], ('\\\\?\\UNC\\b\\c', '\\', ['\\\\?\\UNC\\b\\c\\'])) - check(['//?/UNC/b/c/d'], ('\\\\?\\UNC\\b\\c', '\\', ['\\\\?\\UNC\\b\\c\\', 'd'])) - # Second part has a root but not drive. - check(['a', '/b', 'c'], ('', '\\', ['\\', 'b', 'c'])) - check(['Z:/a', '/b', 'c'], ('Z:', '\\', ['Z:\\', 'b', 'c'])) - check(['//?/Z:/a', '/b', 'c'], ('\\\\?\\Z:', '\\', ['\\\\?\\Z:\\', 'b', 'c'])) - # Joining with the same drive => the first path is appended to if - # the second path is relative. - check(['c:/a/b', 'c:x/y'], ('c:', '\\', ['c:\\', 'a', 'b', 'x', 'y'])) - check(['c:/a/b', 'c:/x/y'], ('c:', '\\', ['c:\\', 'x', 'y'])) - # Paths to files with NTFS alternate data streams - check(['./c:s'], ('', '', ['c:s'])) - check(['cc:s'], ('', '', ['cc:s'])) - check(['C:c:s'], ('C:', '', ['C:', 'c:s'])) - check(['C:/c:s'], ('C:', '\\', ['C:\\', 'c:s'])) - check(['D:a', './c:b'], ('D:', '', ['D:', 'a', 'c:b'])) - check(['D:/a', './c:b'], ('D:', '\\', ['D:\\', 'a', 'c:b'])) - - # # Tests for the pure classes. # @@ -246,6 +136,46 @@ class P(_BasePurePathSubclass, self.cls): for parent in p.parents: self.assertTrue(parent.init_called) + def _get_drive_root_parts(self, parts): + path = self.cls(*parts) + return path.drive, path.root, path.parts + + def _check_drive_root_parts(self, arg, *expected): + sep = self.flavour.sep + actual = self._get_drive_root_parts([x.replace('/', sep) for x in arg]) + self.assertEqual(actual, expected) + if altsep := self.flavour.altsep: + actual = self._get_drive_root_parts([x.replace('/', altsep) for x in arg]) + self.assertEqual(actual, expected) + + def test_drive_root_parts_common(self): + check = self._check_drive_root_parts + sep = self.flavour.sep + # Unanchored parts. + check((), '', '', ()) + check(('a',), '', '', ('a',)) + check(('a/',), '', '', ('a',)) + check(('a', 'b'), '', '', ('a', 'b')) + # Expansion. + check(('a/b',), '', '', ('a', 'b')) + check(('a/b/',), '', '', ('a', 'b')) + check(('a', 'b/c', 'd'), '', '', ('a', 'b', 'c', 'd')) + # Collapsing and stripping excess slashes. + check(('a', 'b//c', 'd'), '', '', ('a', 'b', 'c', 'd')) + check(('a', 'b/c/', 'd'), '', '', ('a', 'b', 'c', 'd')) + # Eliminating standalone dots. + check(('.',), '', '', ()) + check(('.', '.', 'b'), '', '', ('b',)) + check(('a', '.', 'b'), '', '', ('a', 'b')) + check(('a', '.', '.'), '', '', ('a',)) + # The first part is anchored. + check(('/a/b',), '', sep, (sep, 'a', 'b')) + check(('/a', 'b'), '', sep, (sep, 'a', 'b')) + check(('/a/', 'b'), '', sep, (sep, 'a', 'b')) + # Ignoring parts before an anchored part. + check(('a', '/b', 'c'), '', sep, (sep, 'b', 'c')) + check(('a', '/b', '/c'), '', sep, (sep, 'c')) + def test_join_common(self): P = self.cls p = P('a/b') @@ -770,6 +700,18 @@ def test_pickling_common(self): class PurePosixPathTest(_BasePurePathTest, unittest.TestCase): cls = pathlib.PurePosixPath + def test_drive_root_parts(self): + check = self._check_drive_root_parts + # Collapsing of excess leading slashes, except for the double-slash + # special case. + check(('//a', 'b'), '', '//', ('//', 'a', 'b')) + check(('///a', 'b'), '', '/', ('/', 'a', 'b')) + check(('////a', 'b'), '', '/', ('/', 'a', 'b')) + # Paths which look like NT paths aren't treated specially. + check(('c:a',), '', '', ('c:a',)) + check(('c:\\a',), '', '', ('c:\\a',)) + check(('\\a',), '', '', ('\\a',)) + def test_root(self): P = self.cls self.assertEqual(P('/a/b').root, '/') @@ -860,6 +802,51 @@ class PureWindowsPathTest(_BasePurePathTest, unittest.TestCase): ], }) + def test_drive_root_parts(self): + check = self._check_drive_root_parts + # First part is anchored. + check(('c:',), 'c:', '', ('c:',)) + check(('c:/',), 'c:', '\\', ('c:\\',)) + check(('/',), '', '\\', ('\\',)) + check(('c:a',), 'c:', '', ('c:', 'a')) + check(('c:/a',), 'c:', '\\', ('c:\\', 'a')) + check(('/a',), '', '\\', ('\\', 'a')) + # UNC paths. + check(('//a/b',), '\\\\a\\b', '\\', ('\\\\a\\b\\',)) + check(('//a/b/',), '\\\\a\\b', '\\', ('\\\\a\\b\\',)) + check(('//a/b/c',), '\\\\a\\b', '\\', ('\\\\a\\b\\', 'c')) + # Second part is anchored, so that the first part is ignored. + check(('a', 'Z:b', 'c'), 'Z:', '', ('Z:', 'b', 'c')) + check(('a', 'Z:/b', 'c'), 'Z:', '\\', ('Z:\\', 'b', 'c')) + # UNC paths. + check(('a', '//b/c', 'd'), '\\\\b\\c', '\\', ('\\\\b\\c\\', 'd')) + # Collapsing and stripping excess slashes. + check(('a', 'Z://b//c/', 'd/'), 'Z:', '\\', ('Z:\\', 'b', 'c', 'd')) + # UNC paths. + check(('a', '//b/c//', 'd'), '\\\\b\\c', '\\', ('\\\\b\\c\\', 'd')) + # Extended paths. + check(('//?/c:/',), '\\\\?\\c:', '\\', ('\\\\?\\c:\\',)) + check(('//?/c:/a',), '\\\\?\\c:', '\\', ('\\\\?\\c:\\', 'a')) + check(('//?/c:/a', '/b'), '\\\\?\\c:', '\\', ('\\\\?\\c:\\', 'b')) + # Extended UNC paths (format is "\\?\UNC\server\share"). + check(('//?/UNC/b/c',), '\\\\?\\UNC\\b\\c', '\\', ('\\\\?\\UNC\\b\\c\\',)) + check(('//?/UNC/b/c/d',), '\\\\?\\UNC\\b\\c', '\\', ('\\\\?\\UNC\\b\\c\\', 'd')) + # Second part has a root but not drive. + check(('a', '/b', 'c'), '', '\\', ('\\', 'b', 'c')) + check(('Z:/a', '/b', 'c'), 'Z:', '\\', ('Z:\\', 'b', 'c')) + check(('//?/Z:/a', '/b', 'c'), '\\\\?\\Z:', '\\', ('\\\\?\\Z:\\', 'b', 'c')) + # Joining with the same drive => the first path is appended to if + # the second path is relative. + check(('c:/a/b', 'c:x/y'), 'c:', '\\', ('c:\\', 'a', 'b', 'x', 'y')) + check(('c:/a/b', 'c:/x/y'), 'c:', '\\', ('c:\\', 'x', 'y')) + # Paths to files with NTFS alternate data streams + check(('./c:s',), '', '', ('c:s',)) + check(('cc:s',), '', '', ('cc:s',)) + check(('C:c:s',), 'C:', '', ('C:', 'c:s')) + check(('C:/c:s',), 'C:', '\\', ('C:\\', 'c:s')) + check(('D:a', './c:b'), 'D:', '', ('D:', 'a', 'c:b')) + check(('D:/a', './c:b'), 'D:', '\\', ('D:\\', 'a', 'c:b')) + def test_str(self): p = self.cls('a/b/c') self.assertEqual(str(p), 'a\\b\\c') From 2c673d5e93cfe2779f27c4e742d7e50f7a94f356 Mon Sep 17 00:00:00 2001 From: Barney Gale Date: Sun, 9 Apr 2023 18:40:03 +0100 Subject: [PATCH 124/349] GH-101362: Omit path anchor from `pathlib.PurePath()._parts` (GH-102476) Improve performance of path construction by skipping the addition of the path anchor (`drive + root`) to the internal `_parts` list. Rename this attribute to `_tail` for clarity. --- Lib/pathlib.py | 171 +++++++++++------- Lib/test/test_pathlib.py | 2 - ...-03-06-18-49-57.gh-issue-101362.eSSy6L.rst | 2 + 3 files changed, 108 insertions(+), 67 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-03-06-18-49-57.gh-issue-101362.eSSy6L.rst diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 490f89f39d26d1..4ae1fae6f4b358 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -210,20 +210,17 @@ def _select_from(self, parent_path, is_dir, exists, scandir, normcase): class _PathParents(Sequence): """This object provides sequence-like access to the logical ancestors of a path. Don't try to construct it yourself.""" - __slots__ = ('_pathcls', '_drv', '_root', '_parts') + __slots__ = ('_pathcls', '_drv', '_root', '_tail') def __init__(self, path): # We don't store the instance to avoid reference cycles self._pathcls = type(path) self._drv = path.drive self._root = path.root - self._parts = path._parts + self._tail = path._tail def __len__(self): - if self._drv or self._root: - return len(self._parts) - 1 - else: - return len(self._parts) + return len(self._tail) def __getitem__(self, idx): if isinstance(idx, slice): @@ -234,7 +231,7 @@ def __getitem__(self, idx): if idx < 0: idx += len(self) return self._pathcls._from_parsed_parts(self._drv, self._root, - self._parts[:-idx - 1]) + self._tail[:-idx - 1]) def __repr__(self): return "<{}.parents>".format(self._pathcls.__name__) @@ -249,9 +246,41 @@ class PurePath(object): PureWindowsPath object. You can also instantiate either of these classes directly, regardless of your system. """ + __slots__ = ( - '_raw_path', '_drv', '_root', '_parts_cached', - '_str', '_hash', '_parts_tuple', '_parts_normcase_cached', + # The `_raw_path` slot stores an unnormalized string path. This is set + # in the `__init__()` method. + '_raw_path', + + # The `_drv`, `_root` and `_tail_cached` slots store parsed and + # normalized parts of the path. They are set when any of the `drive`, + # `root` or `_tail` properties are accessed for the first time. The + # three-part division corresponds to the result of + # `os.path.splitroot()`, except that the tail is further split on path + # separators (i.e. it is a list of strings), and that the root and + # tail are normalized. + '_drv', '_root', '_tail_cached', + + # The `_str` slot stores the string representation of the path, + # computed from the drive, root and tail when `__str__()` is called + # for the first time. It's used to implement `_str_normcase` + '_str', + + # The `_str_normcase_cached` slot stores the string path with + # normalized case. It is set when the `_str_normcase` property is + # accessed for the first time. It's used to implement `__eq__()` + # `__hash__()`, and `_parts_normcase` + '_str_normcase_cached', + + # The `_parts_normcase_cached` slot stores the case-normalized + # string path after splitting on path separators. It's set when the + # `_parts_normcase` property is accessed for the first time. It's used + # to implement comparison methods like `__lt__()`. + '_parts_normcase_cached', + + # The `_hash` slot stores the hash of the case-normalized string + # path. It's set when `__hash__()` is called for the first time. + '_hash', ) _flavour = os.path @@ -277,10 +306,7 @@ def __init__(self, *args): path = os.fspath(args[0]) else: path = self._flavour.join(*args) - if isinstance(path, str): - # Force-cast str subclasses to str (issue #21127) - path = str(path) - else: + if not isinstance(path, str): raise TypeError( "argument should be a str or an os.PathLike " "object where __fspath__ returns a str, " @@ -299,33 +325,32 @@ def _parse_path(cls, path): if drv.startswith(sep): # pathlib assumes that UNC paths always have a root. root = sep - unfiltered_parsed = [drv + root] + rel.split(sep) - parsed = [sys.intern(x) for x in unfiltered_parsed if x and x != '.'] + parsed = [sys.intern(str(x)) for x in rel.split(sep) if x and x != '.'] return drv, root, parsed def _load_parts(self): - drv, root, parts = self._parse_path(self._raw_path) + drv, root, tail = self._parse_path(self._raw_path) self._drv = drv self._root = root - self._parts_cached = parts + self._tail_cached = tail @classmethod - def _from_parsed_parts(cls, drv, root, parts): - path = cls._format_parsed_parts(drv, root, parts) + def _from_parsed_parts(cls, drv, root, tail): + path = cls._format_parsed_parts(drv, root, tail) self = cls(path) self._str = path or '.' self._drv = drv self._root = root - self._parts_cached = parts + self._tail_cached = tail return self @classmethod - def _format_parsed_parts(cls, drv, root, parts): + def _format_parsed_parts(cls, drv, root, tail): if drv or root: - return drv + root + cls._flavour.sep.join(parts[1:]) - elif parts and cls._flavour.splitdrive(parts[0])[0]: - parts = ['.'] + parts - return cls._flavour.sep.join(parts) + return drv + root + cls._flavour.sep.join(tail) + elif tail and cls._flavour.splitdrive(tail[0])[0]: + tail = ['.'] + tail + return cls._flavour.sep.join(tail) def __str__(self): """Return the string representation of the path, suitable for @@ -334,7 +359,7 @@ def __str__(self): return self._str except AttributeError: self._str = self._format_parsed_parts(self.drive, self.root, - self._parts) or '.' + self._tail) or '.' return self._str def __fspath__(self): @@ -374,25 +399,34 @@ def as_uri(self): path = str(self) return prefix + urlquote_from_bytes(os.fsencode(path)) + @property + def _str_normcase(self): + # String with normalized case, for hashing and equality checks + try: + return self._str_normcase_cached + except AttributeError: + self._str_normcase_cached = self._flavour.normcase(str(self)) + return self._str_normcase_cached + @property def _parts_normcase(self): - # Cached parts with normalized case, for hashing and comparison. + # Cached parts with normalized case, for comparisons. try: return self._parts_normcase_cached except AttributeError: - self._parts_normcase_cached = [self._flavour.normcase(p) for p in self._parts] + self._parts_normcase_cached = self._str_normcase.split(self._flavour.sep) return self._parts_normcase_cached def __eq__(self, other): if not isinstance(other, PurePath): return NotImplemented - return self._parts_normcase == other._parts_normcase and self._flavour is other._flavour + return self._str_normcase == other._str_normcase and self._flavour is other._flavour def __hash__(self): try: return self._hash except AttributeError: - self._hash = hash(tuple(self._parts_normcase)) + self._hash = hash(self._str_normcase) return self._hash def __lt__(self, other): @@ -434,12 +468,12 @@ def root(self): return self._root @property - def _parts(self): + def _tail(self): try: - return self._parts_cached + return self._tail_cached except AttributeError: self._load_parts() - return self._parts_cached + return self._tail_cached @property def anchor(self): @@ -450,10 +484,10 @@ def anchor(self): @property def name(self): """The final path component, if any.""" - parts = self._parts - if len(parts) == (1 if (self.drive or self.root) else 0): + tail = self._tail + if not tail: return '' - return parts[-1] + return tail[-1] @property def suffix(self): @@ -501,7 +535,7 @@ def with_name(self, name): if drv or root or not tail or f.sep in tail or (f.altsep and f.altsep in tail): raise ValueError("Invalid name %r" % (name)) return self._from_parsed_parts(self.drive, self.root, - self._parts[:-1] + [name]) + self._tail[:-1] + [name]) def with_stem(self, stem): """Return a new path with the stem changed.""" @@ -526,7 +560,7 @@ def with_suffix(self, suffix): else: name = name[:-len(old_suffix)] + suffix return self._from_parsed_parts(self.drive, self.root, - self._parts[:-1] + [name]) + self._tail[:-1] + [name]) def relative_to(self, other, /, *_deprecated, walk_up=False): """Return the relative path to another path identified by the passed @@ -551,7 +585,7 @@ def relative_to(self, other, /, *_deprecated, walk_up=False): raise ValueError(f"{str(self)!r} and {str(other)!r} have different anchors") if step and not walk_up: raise ValueError(f"{str(self)!r} is not in the subpath of {str(other)!r}") - parts = ('..',) * step + self.parts[len(path.parts):] + parts = ['..'] * step + self._tail[len(path._tail):] return path_cls(*parts) def is_relative_to(self, other, /, *_deprecated): @@ -570,13 +604,10 @@ def is_relative_to(self, other, /, *_deprecated): def parts(self): """An object providing sequence-like access to the components in the filesystem path.""" - # We cache the tuple to avoid building a new one each time .parts - # is accessed. XXX is this necessary? - try: - return self._parts_tuple - except AttributeError: - self._parts_tuple = tuple(self._parts) - return self._parts_tuple + if self.drive or self.root: + return (self.drive + self.root,) + tuple(self._tail) + else: + return tuple(self._tail) def joinpath(self, *args): """Combine this path with one or several arguments, and return a @@ -603,10 +634,10 @@ def parent(self): """The logical parent of the path.""" drv = self.drive root = self.root - parts = self._parts - if len(parts) == 1 and (drv or root): + tail = self._tail + if not tail: return self - return self._from_parsed_parts(drv, root, parts[:-1]) + return self._from_parsed_parts(drv, root, tail[:-1]) @property def parents(self): @@ -624,29 +655,29 @@ def is_absolute(self): def is_reserved(self): """Return True if the path contains one of the special names reserved by the system, if any.""" - if self._flavour is posixpath or not self._parts: + if self._flavour is posixpath or not self._tail: return False # NOTE: the rules for reserved names seem somewhat complicated # (e.g. r"..\NUL" is reserved but not r"foo\NUL" if "foo" does not # exist). We err on the side of caution and return True for paths # which are not considered reserved by Windows. - if self._parts[0].startswith('\\\\'): + if self.drive.startswith('\\\\'): # UNC paths are never reserved. return False - name = self._parts[-1].partition('.')[0].partition(':')[0].rstrip(' ') + name = self._tail[-1].partition('.')[0].partition(':')[0].rstrip(' ') return name.upper() in _WIN_RESERVED_NAMES def match(self, path_pattern): """ Return True if this path matches the given pattern. """ - path_pattern = self._flavour.normcase(path_pattern) - drv, root, pat_parts = self._parse_path(path_pattern) - if not pat_parts: + pat = type(self)(path_pattern) + if not pat.parts: raise ValueError("empty pattern") + pat_parts = pat._parts_normcase parts = self._parts_normcase - if drv or root: + if pat.drive or pat.root: if len(pat_parts) != len(parts): return False elif len(pat_parts) > len(parts): @@ -707,11 +738,21 @@ def __new__(cls, *args, **kwargs): cls = WindowsPath if os.name == 'nt' else PosixPath return object.__new__(cls) - def _make_child_relpath(self, part): - # This is an optimization used for dir walking. `part` must be - # a single part relative to this path. - parts = self._parts + [part] - return self._from_parsed_parts(self.drive, self.root, parts) + def _make_child_relpath(self, name): + path_str = str(self) + tail = self._tail + if tail: + path_str = f'{path_str}{self._flavour.sep}{name}' + elif path_str != '.': + path_str = f'{path_str}{name}' + else: + path_str = name + path = type(self)(path_str) + path._str = path_str + path._drv = self.drive + path._root = self.root + path._tail_cached = tail + [name] + return path def __enter__(self): # In previous versions of pathlib, __exit__() marked this path as @@ -1196,12 +1237,12 @@ def expanduser(self): (as returned by os.path.expanduser) """ if (not (self.drive or self.root) and - self._parts and self._parts[0][:1] == '~'): - homedir = self._flavour.expanduser(self._parts[0]) + self._tail and self._tail[0][:1] == '~'): + homedir = self._flavour.expanduser(self._tail[0]) if homedir[:1] == "~": raise RuntimeError("Could not determine home directory.") - drv, root, parts = self._parse_path(homedir) - return self._from_parsed_parts(drv, root, parts + self._parts[1:]) + drv, root, tail = self._parse_path(homedir) + return self._from_parsed_parts(drv, root, tail + self._tail[1:]) return self diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index fe75f1c2580bc4..3c6da94d094610 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -346,8 +346,6 @@ def test_parts_common(self): p = P('a/b') parts = p.parts self.assertEqual(parts, ('a', 'b')) - # The object gets reused. - self.assertIs(parts, p.parts) # When the path is absolute, the anchor is a separate part. p = P('/a/b') parts = p.parts diff --git a/Misc/NEWS.d/next/Library/2023-03-06-18-49-57.gh-issue-101362.eSSy6L.rst b/Misc/NEWS.d/next/Library/2023-03-06-18-49-57.gh-issue-101362.eSSy6L.rst new file mode 100644 index 00000000000000..87617a503c0dba --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-03-06-18-49-57.gh-issue-101362.eSSy6L.rst @@ -0,0 +1,2 @@ +Speed up :class:`pathlib.Path` construction by omitting the path anchor from +the internal list of path parts. From f65fdbb8fdc16d6b1eddaecc92d0dfa131761090 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 9 Apr 2023 14:17:37 -0500 Subject: [PATCH 125/349] Itertool recipe improvements (GH-103399) --- Doc/library/itertools.rst | 316 +++++++++++++++++++++----------------- 1 file changed, 179 insertions(+), 137 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 70e5b7905f20a9..e57c393a6b370b 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -769,8 +769,8 @@ well as with the built-in itertools such as ``map()``, ``filter()``, A secondary purpose of the recipes is to serve as an incubator. The ``accumulate()``, ``compress()``, and ``pairwise()`` itertools started out as -recipes. Currently, the ``iter_index()`` recipe is being tested to see -whether it proves its worth. +recipes. Currently, the ``sliding_window()`` and ``iter_index()`` recipes +are being tested to see whether they prove their worth. Substantially all of these recipes and many, many others can be installed from the `more-itertools project `_ found @@ -806,6 +806,23 @@ which incur interpreter overhead. "Return function(0), function(1), ..." return map(function, count(start)) + def repeatfunc(func, times=None, *args): + """Repeat calls to func with specified arguments. + + Example: repeatfunc(random.random) + """ + if times is None: + return starmap(func, repeat(args)) + return starmap(func, repeat(args, times)) + + def flatten(list_of_lists): + "Flatten one level of nesting" + return chain.from_iterable(list_of_lists) + + def ncycles(iterable, n): + "Returns the sequence elements n times" + return chain.from_iterable(repeat(tuple(iterable), n)) + def tail(n, iterable): "Return an iterator over the last n items" # tail(3, 'ABCDEFG') --> E F G @@ -825,70 +842,27 @@ which incur interpreter overhead. "Returns the nth item or a default value" return next(islice(iterable, n, None), default) - def all_equal(iterable): - "Returns True if all the elements are equal to each other" - g = groupby(iterable) - return next(g, True) and not next(g, False) - def quantify(iterable, pred=bool): "Count how many times the predicate is True" return sum(map(pred, iterable)) - def ncycles(iterable, n): - "Returns the sequence elements n times" - return chain.from_iterable(repeat(tuple(iterable), n)) - - def sum_of_squares(it): - "Add up the squares of the input values." - # sum_of_squares([10, 20, 30]) -> 1400 - return math.sumprod(*tee(it)) - - def transpose(it): - "Swap the rows and columns of the input." - # transpose([(1, 2, 3), (11, 22, 33)]) --> (1, 11) (2, 22) (3, 33) - return zip(*it, strict=True) - - def matmul(m1, m2): - "Multiply two matrices." - # matmul([(7, 5), (3, 5)], [[2, 5], [7, 9]]) --> (49, 80), (41, 60) - n = len(m2[0]) - return batched(starmap(math.sumprod, product(m1, transpose(m2))), n) - - def convolve(signal, kernel): - # See: https://betterexplained.com/articles/intuitive-convolution/ - # convolve(data, [0.25, 0.25, 0.25, 0.25]) --> Moving average (blur) - # convolve(data, [1, -1]) --> 1st finite difference (1st derivative) - # convolve(data, [1, -2, 1]) --> 2nd finite difference (2nd derivative) - kernel = tuple(kernel)[::-1] - n = len(kernel) - window = collections.deque([0], maxlen=n) * n - for x in chain(signal, repeat(0, n-1)): - window.append(x) - yield math.sumprod(kernel, window) + def all_equal(iterable): + "Returns True if all the elements are equal to each other" + g = groupby(iterable) + return next(g, True) and not next(g, False) - def polynomial_from_roots(roots): - """Compute a polynomial's coefficients from its roots. + def first_true(iterable, default=False, pred=None): + """Returns the first true value in the iterable. - (x - 5) (x + 4) (x - 3) expands to: x³ -4x² -17x + 60 - """ - # polynomial_from_roots([5, -4, 3]) --> [1, -4, -17, 60] - expansion = [1] - for r in roots: - expansion = convolve(expansion, (1, -r)) - return list(expansion) + If no true value is found, returns *default* - def polynomial_eval(coefficients, x): - """Evaluate a polynomial at a specific value. + If *pred* is not None, returns the first item + for which pred(item) is true. - Computes with better numeric stability than Horner's method. """ - # Evaluate x³ -4x² -17x + 60 at x = 2.5 - # polynomial_eval([1, -4, -17, 60], x=2.5) --> 8.125 - n = len(coefficients) - if n == 0: - return x * 0 # coerce zero to the type of x - powers = map(pow, repeat(x), reversed(range(n))) - return math.sumprod(coefficients, powers) + # first_true([a,b,c], x) --> a or b or c or x + # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x + return next(filter(pred, iterable), default) def iter_index(iterable, value, start=0): "Return indices where a value occurs in a sequence or iterable." @@ -913,44 +887,28 @@ which incur interpreter overhead. except ValueError: pass - def sieve(n): - "Primes less than n" - # sieve(30) --> 2 3 5 7 11 13 17 19 23 29 - data = bytearray((0, 1)) * (n // 2) - data[:3] = 0, 0, 0 - limit = math.isqrt(n) + 1 - for p in compress(range(limit), data): - data[p*p : n : p+p] = bytes(len(range(p*p, n, p+p))) - data[2] = 1 - return iter_index(data, 1) if n > 2 else iter([]) - - def factor(n): - "Prime factors of n." - # factor(99) --> 3 3 11 - for prime in sieve(math.isqrt(n) + 1): - while True: - quotient, remainder = divmod(n, prime) - if remainder: - break - yield prime - n = quotient - if n == 1: - return - if n > 1: - yield n + def iter_except(func, exception, first=None): + """ Call a function repeatedly until an exception is raised. - def flatten(list_of_lists): - "Flatten one level of nesting" - return chain.from_iterable(list_of_lists) + Converts a call-until-exception interface to an iterator interface. + Like builtins.iter(func, sentinel) but uses an exception instead + of a sentinel to end the loop. - def repeatfunc(func, times=None, *args): - """Repeat calls to func with specified arguments. + Examples: + iter_except(functools.partial(heappop, h), IndexError) # priority queue iterator + iter_except(d.popitem, KeyError) # non-blocking dict iterator + iter_except(d.popleft, IndexError) # non-blocking deque iterator + iter_except(q.get_nowait, Queue.Empty) # loop over a producer Queue + iter_except(s.pop, KeyError) # non-blocking set iterator - Example: repeatfunc(random.random) """ - if times is None: - return starmap(func, repeat(args)) - return starmap(func, repeat(args, times)) + try: + if first is not None: + yield first() # For database APIs needing an initial cast to db.first() + while True: + yield func() + except exception: + pass def grouper(iterable, n, *, incomplete='fill', fillvalue=None): "Collect data into non-overlapping fixed-length chunks or blocks" @@ -967,12 +925,6 @@ which incur interpreter overhead. else: raise ValueError('Expected fill, strict, or ignore') - def triplewise(iterable): - "Return overlapping triplets from an iterable" - # triplewise('ABCDEFG') --> ABC BCD CDE DEF EFG - for (a, _), (b, c) in pairwise(pairwise(iterable)): - yield a, b, c - def sliding_window(iterable, n): # sliding_window('ABCDEFG', 4) --> ABCD BCDE CDEF DEFG it = iter(iterable) @@ -1003,6 +955,12 @@ which incur interpreter overhead. t1, t2 = tee(iterable) return filterfalse(pred, t1), filter(pred, t2) + def subslices(seq): + "Return all contiguous non-empty subslices of a sequence" + # subslices('ABCD') --> A AB ABC ABCD B BC BCD C CD D + slices = starmap(slice, combinations(range(len(seq) + 1), 2)) + return map(operator.getitem, repeat(seq), slices) + def before_and_after(predicate, it): """ Variant of takewhile() that allows complete access to the remainder of the iterator. @@ -1032,17 +990,6 @@ which incur interpreter overhead. yield from it return true_iterator(), remainder_iterator() - def subslices(seq): - "Return all contiguous non-empty subslices of a sequence" - # subslices('ABCD') --> A AB ABC ABCD B BC BCD C CD D - slices = starmap(slice, combinations(range(len(seq) + 1), 2)) - return map(operator.getitem, repeat(seq), slices) - - def powerset(iterable): - "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)" - s = list(iterable) - return chain.from_iterable(combinations(s, r) for r in range(len(s)+1)) - def unique_everseen(iterable, key=None): "List unique elements, preserving order. Remember all elements ever seen." # unique_everseen('AAAABBBCCDAABBB') --> A B C D @@ -1072,41 +1019,96 @@ which incur interpreter overhead. # unique_justseen('ABBcCAD', str.lower) --> A B c A D return map(next, map(operator.itemgetter(1), groupby(iterable, key))) - def iter_except(func, exception, first=None): - """ Call a function repeatedly until an exception is raised. - Converts a call-until-exception interface to an iterator interface. - Like builtins.iter(func, sentinel) but uses an exception instead - of a sentinel to end the loop. +The following recipes have a more mathematical flavor: - Examples: - iter_except(functools.partial(heappop, h), IndexError) # priority queue iterator - iter_except(d.popitem, KeyError) # non-blocking dict iterator - iter_except(d.popleft, IndexError) # non-blocking deque iterator - iter_except(q.get_nowait, Queue.Empty) # loop over a producer Queue - iter_except(s.pop, KeyError) # non-blocking set iterator +.. testcode:: - """ - try: - if first is not None: - yield first() # For database APIs needing an initial cast to db.first() + def powerset(iterable): + "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)" + s = list(iterable) + return chain.from_iterable(combinations(s, r) for r in range(len(s)+1)) + + def sieve(n): + "Primes less than n" + # sieve(30) --> 2 3 5 7 11 13 17 19 23 29 + data = bytearray((0, 1)) * (n // 2) + data[:3] = 0, 0, 0 + limit = math.isqrt(n) + 1 + for p in compress(range(limit), data): + data[p*p : n : p+p] = bytes(len(range(p*p, n, p+p))) + data[2] = 1 + return iter_index(data, 1) if n > 2 else iter([]) + + def factor(n): + "Prime factors of n." + # factor(99) --> 3 3 11 + for prime in sieve(math.isqrt(n) + 1): while True: - yield func() - except exception: - pass + quotient, remainder = divmod(n, prime) + if remainder: + break + yield prime + n = quotient + if n == 1: + return + if n > 1: + yield n - def first_true(iterable, default=False, pred=None): - """Returns the first true value in the iterable. + def sum_of_squares(it): + "Add up the squares of the input values." + # sum_of_squares([10, 20, 30]) -> 1400 + return math.sumprod(*tee(it)) - If no true value is found, returns *default* + def transpose(it): + "Swap the rows and columns of the input." + # transpose([(1, 2, 3), (11, 22, 33)]) --> (1, 11) (2, 22) (3, 33) + return zip(*it, strict=True) - If *pred* is not None, returns the first item - for which pred(item) is true. + def matmul(m1, m2): + "Multiply two matrices." + # matmul([(7, 5), (3, 5)], [[2, 5], [7, 9]]) --> (49, 80), (41, 60) + n = len(m2[0]) + return batched(starmap(math.sumprod, product(m1, transpose(m2))), n) + + def convolve(signal, kernel): + """Linear convolution of two iterables. + Article: https://betterexplained.com/articles/intuitive-convolution/ + Video: https://www.youtube.com/watch?v=KuXjwB4LzSA """ - # first_true([a,b,c], x) --> a or b or c or x - # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x - return next(filter(pred, iterable), default) + # convolve(data, [0.25, 0.25, 0.25, 0.25]) --> Moving average (blur) + # convolve(data, [1, -1]) --> 1st finite difference (1st derivative) + # convolve(data, [1, -2, 1]) --> 2nd finite difference (2nd derivative) + kernel = tuple(kernel)[::-1] + n = len(kernel) + padded_signal = chain(repeat(0, n-1), signal, [0] * (n-1)) + for window in sliding_window(padded_signal, n): + yield math.sumprod(kernel, window) + + def polynomial_from_roots(roots): + """Compute a polynomial's coefficients from its roots. + + (x - 5) (x + 4) (x - 3) expands to: x³ -4x² -17x + 60 + """ + # polynomial_from_roots([5, -4, 3]) --> [1, -4, -17, 60] + expansion = [1] + for r in roots: + expansion = convolve(expansion, (1, -r)) + return list(expansion) + + def polynomial_eval(coefficients, x): + """Evaluate a polynomial at a specific value. + + Computes with better numeric stability than Horner's method. + """ + # Evaluate x³ -4x² -17x + 60 at x = 2.5 + # polynomial_eval([1, -4, -17, 60], x=2.5) --> 8.125 + n = len(coefficients) + if n == 0: + return x * 0 # coerce zero to the type of x + powers = map(pow, repeat(x), reversed(range(n))) + return math.sumprod(coefficients, powers) def nth_combination(iterable, r, index): "Equivalent to list(combinations(iterable, r))[index]" @@ -1126,6 +1128,7 @@ which incur interpreter overhead. result.append(pool[-1-n]) return tuple(result) + .. doctest:: :hide: @@ -1401,9 +1404,6 @@ which incur interpreter overhead. >>> list(grouper('abcdefg', n=3, incomplete='ignore')) [('a', 'b', 'c'), ('d', 'e', 'f')] - >>> list(triplewise('ABCDEFG')) - [('A', 'B', 'C'), ('B', 'C', 'D'), ('C', 'D', 'E'), ('D', 'E', 'F'), ('E', 'F', 'G')] - >>> list(sliding_window('ABCDEFG', 4)) [('A', 'B', 'C', 'D'), ('B', 'C', 'D', 'E'), ('C', 'D', 'E', 'F'), ('D', 'E', 'F', 'G')] @@ -1485,3 +1485,45 @@ which incur interpreter overhead. >>> combos = list(combinations(iterable, r)) >>> all(nth_combination(iterable, r, i) == comb for i, comb in enumerate(combos)) True + + +.. testcode:: + :hide: + + # Old recipes and their tests which are guaranteed to continue to work. + + def sumprod(vec1, vec2): + "Compute a sum of products." + return sum(starmap(operator.mul, zip(vec1, vec2, strict=True))) + + def dotproduct(vec1, vec2): + return sum(map(operator.mul, vec1, vec2)) + + def pad_none(iterable): + """Returns the sequence elements and then returns None indefinitely. + + Useful for emulating the behavior of the built-in map() function. + """ + return chain(iterable, repeat(None)) + + def triplewise(iterable): + "Return overlapping triplets from an iterable" + # triplewise('ABCDEFG') --> ABC BCD CDE DEF EFG + for (a, _), (b, c) in pairwise(pairwise(iterable)): + yield a, b, c + + +.. doctest:: + :hide: + + >>> dotproduct([1,2,3], [4,5,6]) + 32 + + >>> sumprod([1,2,3], [4,5,6]) + 32 + + >>> list(islice(pad_none('abc'), 0, 6)) + ['a', 'b', 'c', None, None, None] + + >>> list(triplewise('ABCDEFG')) + [('A', 'B', 'C'), ('B', 'C', 'D'), ('C', 'D', 'E'), ('D', 'E', 'F'), ('E', 'F', 'G')] From 6d97e521169b07851cbbf7fccbf9bef3f41e3ce0 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 9 Apr 2023 22:00:22 +0200 Subject: [PATCH 126/349] gh-83004: Harden winsound init (#103385) --- PC/winsound.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/PC/winsound.c b/PC/winsound.c index 65025ddc5e1f51..bae8e449795733 100644 --- a/PC/winsound.c +++ b/PC/winsound.c @@ -202,19 +202,11 @@ static struct PyMethodDef sound_methods[] = {NULL, NULL} }; -static void -add_define(PyObject *dict, const char *key, long value) -{ - PyObject *k = PyUnicode_FromString(key); - PyObject *v = PyLong_FromLong(value); - if (v && k) { - PyDict_SetItem(dict, k, v); - } - Py_XDECREF(k); - Py_XDECREF(v); -} - -#define ADD_DEFINE(tok) add_define(dict,#tok,tok) +#define ADD_DEFINE(CONST) do { \ + if (PyModule_AddIntConstant(module, #CONST, CONST) < 0) { \ + goto error; \ + } \ +} while (0) static struct PyModuleDef winsoundmodule = { @@ -232,11 +224,10 @@ static struct PyModuleDef winsoundmodule = { PyMODINIT_FUNC PyInit_winsound(void) { - PyObject *dict; PyObject *module = PyModule_Create(&winsoundmodule); - if (module == NULL) + if (module == NULL) { return NULL; - dict = PyModule_GetDict(module); + } ADD_DEFINE(SND_ASYNC); ADD_DEFINE(SND_NODEFAULT); @@ -254,5 +245,12 @@ PyInit_winsound(void) ADD_DEFINE(MB_ICONEXCLAMATION); ADD_DEFINE(MB_ICONHAND); ADD_DEFINE(MB_ICONQUESTION); + +#undef ADD_DEFINE + return module; + +error: + Py_DECREF(module); + return NULL; } From ecad802e3f9ef7063e7d7fe9f0c037561396ef8e Mon Sep 17 00:00:00 2001 From: James Hilton-Balfe Date: Sun, 9 Apr 2023 22:55:32 +0100 Subject: [PATCH 127/349] Fix old behaviour in typing documentation (#103400) --- Doc/library/typing.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 03ff259bbdf75f..15bab7775eadd8 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -423,7 +423,7 @@ to this is that a list of types can be used to substitute a :class:`ParamSpec`:: >>> class Z(Generic[T, P]): ... ... >>> Z[int, [dict, float]] - __main__.Z[int, (, )] + __main__.Z[int, [dict, float]] Furthermore, a generic with only one parameter specification variable will accept @@ -434,9 +434,9 @@ to the former, so the following are equivalent:: >>> class X(Generic[P]): ... ... >>> X[int, str] - __main__.X[(, )] + __main__.X[[int, str]] >>> X[[int, str]] - __main__.X[(, )] + __main__.X[[int, str]] Do note that generics with :class:`ParamSpec` may not have correct ``__parameters__`` after substitution in some cases because they From a28e2ce3fbcc852959324879e0bbf5ba8ecf0105 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Mon, 10 Apr 2023 14:09:19 +0300 Subject: [PATCH 128/349] gh-103395: Improve `typing._GenericAlias.__dir__` coverage (#103396) --- Lib/test/test_typing.py | 63 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index b8eee9a570a301..f983efe956f902 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -855,6 +855,14 @@ def test_accepts_single_type(self): (*tuple[int],) Unpack[Tuple[int]] + def test_dir(self): + dir_items = set(dir(Unpack[Tuple[int]])) + for required_item in [ + '__args__', '__parameters__', '__origin__', + ]: + with self.subTest(required_item=required_item): + self.assertIn(required_item, dir_items) + def test_rejects_multiple_types(self): with self.assertRaises(TypeError): Unpack[Tuple[int], Tuple[str]] @@ -1699,6 +1707,14 @@ def test_repr(self): u = Optional[str] self.assertEqual(repr(u), 'typing.Optional[str]') + def test_dir(self): + dir_items = set(dir(Union[str, int])) + for required_item in [ + '__args__', '__parameters__', '__origin__', + ]: + with self.subTest(required_item=required_item): + self.assertIn(required_item, dir_items) + def test_cannot_subclass(self): with self.assertRaisesRegex(TypeError, r'Cannot subclass typing\.Union'): @@ -1839,6 +1855,15 @@ def test_eq_hash(self): self.assertNotEqual(C, Callable[..., int]) self.assertNotEqual(C, Callable) + def test_dir(self): + Callable = self.Callable + dir_items = set(dir(Callable[..., int])) + for required_item in [ + '__args__', '__parameters__', '__origin__', + ]: + with self.subTest(required_item=required_item): + self.assertIn(required_item, dir_items) + def test_cannot_instantiate(self): Callable = self.Callable with self.assertRaises(TypeError): @@ -2151,6 +2176,14 @@ def test_repr(self): self.assertEqual(repr(Literal[None]), "typing.Literal[None]") self.assertEqual(repr(Literal[1, 2, 3, 3]), "typing.Literal[1, 2, 3]") + def test_dir(self): + dir_items = set(dir(Literal[1, 2, 3])) + for required_item in [ + '__args__', '__parameters__', '__origin__', + ]: + with self.subTest(required_item=required_item): + self.assertIn(required_item, dir_items) + def test_cannot_init(self): with self.assertRaises(TypeError): Literal() @@ -7315,6 +7348,15 @@ def test_repr(self): "typing.Annotated[typing.List[int], 4, 5]" ) + def test_dir(self): + dir_items = set(dir(Annotated[int, 4])) + for required_item in [ + '__args__', '__parameters__', '__origin__', + '__metadata__', + ]: + with self.subTest(required_item=required_item): + self.assertIn(required_item, dir_items) + def test_flatten(self): A = Annotated[Annotated[int, 4], 5] self.assertEqual(A, Annotated[int, 4, 5]) @@ -8033,6 +8075,15 @@ class MyClass: ... c = Concatenate[MyClass, P] self.assertNotEqual(c, Concatenate) + def test_dir(self): + P = ParamSpec('P') + dir_items = set(dir(Concatenate[int, P])) + for required_item in [ + '__args__', '__parameters__', '__origin__', + ]: + with self.subTest(required_item=required_item): + self.assertIn(required_item, dir_items) + def test_valid_uses(self): P = ParamSpec('P') T = TypeVar('T') @@ -8310,10 +8361,18 @@ class Foo(Generic[T]): def bar(self): pass baz = 3 + __magic__ = 4 + # The class attributes of the original class should be visible even # in dir() of the GenericAlias. See bpo-45755. - self.assertIn('bar', dir(Foo[int])) - self.assertIn('baz', dir(Foo[int])) + dir_items = set(dir(Foo[int])) + for required_item in [ + 'bar', 'baz', + '__args__', '__parameters__', '__origin__', + ]: + with self.subTest(required_item=required_item): + self.assertIn(required_item, dir_items) + self.assertNotIn('__magic__', dir_items) class RevealTypeTests(BaseTestCase): From dc604a8c58af748ce25aee1af36b6521a3592fa5 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Mon, 10 Apr 2023 17:57:17 +0300 Subject: [PATCH 129/349] gh-97797: Mention `__metadata__` in docstrings of `typing.{_AnnotatedAlias, Annotated}` (#103405) Co-authored-by: Alex Waygood Co-authored-by: Kirill <80244920+Eclips4@users.noreply.github.com> --- Lib/typing.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Lib/typing.py b/Lib/typing.py index 1f1c4ffa2566ab..7c165562c2b53d 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -2154,6 +2154,8 @@ class _AnnotatedAlias(_NotIterable, _GenericAlias, _root=True): with extra annotations. The alias behaves like a normal typing alias, instantiating is the same as instantiating the underlying type, binding it to types is also the same. + + The metadata itself is stored in a '__metadata__' attribute as a tuple. """ def __init__(self, origin, metadata): if isinstance(origin, _AnnotatedAlias): @@ -2209,6 +2211,10 @@ class Annotated: Details: - It's an error to call `Annotated` with less than two arguments. + - Access the metadata via the ``__metadata__`` attribute:: + + Annotated[int, '$'].__metadata__ == ('$',) + - Nested Annotated are flattened:: Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3] From 40db5c65b7ca4e784613b6122106a92576aba2d6 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Mon, 10 Apr 2023 17:58:48 +0300 Subject: [PATCH 130/349] gh-103334: Ignore `Tools/c-analyzer/cpython/_parser.py` from `patchcheck` (GH-103335) I've also added a small comment to `Tools/c-analyzer/cpython/_parser.py` to trigger the `patchcheck` CI. It must pass now. Automerge-Triggered-By: GH:ericsnowcurrently --- Tools/c-analyzer/cpython/_parser.py | 1 + Tools/patchcheck/patchcheck.py | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Tools/c-analyzer/cpython/_parser.py b/Tools/c-analyzer/cpython/_parser.py index acf30e2c4020b3..d82fb967297cae 100644 --- a/Tools/c-analyzer/cpython/_parser.py +++ b/Tools/c-analyzer/cpython/_parser.py @@ -47,6 +47,7 @@ def clean_lines(text): ''' # XXX Handle these. +# Tab separated: EXCLUDED = clean_lines(''' # @begin=conf@ diff --git a/Tools/patchcheck/patchcheck.py b/Tools/patchcheck/patchcheck.py index 44a6fb8c660cd2..fa3a43af6e6048 100755 --- a/Tools/patchcheck/patchcheck.py +++ b/Tools/patchcheck/patchcheck.py @@ -170,12 +170,24 @@ def report_modified_files(file_paths): return "\n".join(lines) +#: Python files that have tabs by design: +_PYTHON_FILES_WITH_TABS = frozenset({ + 'Tools/c-analyzer/cpython/_parser.py', +}) + + @status("Fixing Python file whitespace", info=report_modified_files) def normalize_whitespace(file_paths): """Make sure that the whitespace for .py files have been normalized.""" reindent.makebackup = False # No need to create backups. - fixed = [path for path in file_paths if path.endswith('.py') and - reindent.check(os.path.join(SRCDIR, path))] + fixed = [ + path for path in file_paths + if ( + path.endswith('.py') + and path not in _PYTHON_FILES_WITH_TABS + and reindent.check(os.path.join(SRCDIR, path)) + ) + ] return fixed From 8b1b17134e2241a8cdff9e0c869013a7ff3ca2fe Mon Sep 17 00:00:00 2001 From: raylu Date: Mon, 10 Apr 2023 09:30:32 -0700 Subject: [PATCH 131/349] gh-103059: Clarify gc.freeze documentation (#103058) --- Doc/library/gc.rst | 17 +++++++++++------ Misc/ACKS | 1 + 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Doc/library/gc.rst b/Doc/library/gc.rst index 832ebaf497f37a..6d5c64df1a1f3f 100644 --- a/Doc/library/gc.rst +++ b/Doc/library/gc.rst @@ -206,12 +206,17 @@ The :mod:`gc` module provides the following functions: .. function:: freeze() - Freeze all the objects tracked by gc - move them to a permanent generation - and ignore all the future collections. This can be used before a POSIX - fork() call to make the gc copy-on-write friendly or to speed up collection. - Also collection before a POSIX fork() call may free pages for future - allocation which can cause copy-on-write too so it's advised to disable gc - in parent process and freeze before fork and enable gc in child process. + Freeze all the objects tracked by the garbage collector; move them to a + permanent generation and ignore them in all the future collections. + + If a process will ``fork()`` without ``exec()``, avoiding unnecessary + copy-on-write in child processes will maximize memory sharing and reduce + overall memory usage. This requires both avoiding creation of freed "holes" + in memory pages in the parent process and ensuring that GC collections in + child processes won't touch the ``gc_refs`` counter of long-lived objects + originating in the parent process. To accomplish both, call ``gc.disable()`` + early in the parent process, ``gc.freeze()`` right before ``fork()``, and + ``gc.enable()`` early in child processes. .. versionadded:: 3.7 diff --git a/Misc/ACKS b/Misc/ACKS index 49f3692dfd6b8f..1e94d33a665e4c 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1115,6 +1115,7 @@ Jason Lowe Tony Lownds Ray Loyzaga Kang-Hao (Kenny) Lu +Raymond Lu Lukas Lueg Loren Luke Fredrik Lundh From c3cd3d10788769558a4668e9e5cfff42fe377852 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Mon, 10 Apr 2023 19:09:33 +0200 Subject: [PATCH 132/349] gh-83004: Harden `msvcrt` init (#103383) --- PC/msvcrtmodule.c | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/PC/msvcrtmodule.c b/PC/msvcrtmodule.c index face4d03af9d4f..6e8b423c3839a9 100644 --- a/PC/msvcrtmodule.c +++ b/PC/msvcrtmodule.c @@ -609,11 +609,11 @@ PyMODINIT_FUNC PyInit_msvcrt(void) { int st; - PyObject *d, *version; PyObject *m = PyModule_Create(&msvcrtmodule); - if (m == NULL) + if (m == NULL) { return NULL; - d = PyModule_GetDict(m); + } + PyObject *d = PyModule_GetDict(m); // Borrowed ref. /* constants for the locking() function's mode argument */ insertint(d, "LK_LOCK", _LK_LOCK); @@ -644,30 +644,47 @@ PyInit_msvcrt(void) #ifdef _VC_ASSEMBLY_PUBLICKEYTOKEN st = PyModule_AddStringConstant(m, "VC_ASSEMBLY_PUBLICKEYTOKEN", _VC_ASSEMBLY_PUBLICKEYTOKEN); - if (st < 0) return NULL; + if (st < 0) { + goto error; + } #endif #ifdef _CRT_ASSEMBLY_VERSION st = PyModule_AddStringConstant(m, "CRT_ASSEMBLY_VERSION", _CRT_ASSEMBLY_VERSION); - if (st < 0) return NULL; + if (st < 0) { + goto error; + } #endif #ifdef __LIBRARIES_ASSEMBLY_NAME_PREFIX st = PyModule_AddStringConstant(m, "LIBRARIES_ASSEMBLY_NAME_PREFIX", __LIBRARIES_ASSEMBLY_NAME_PREFIX); - if (st < 0) return NULL; + if (st < 0) { + goto error; + } #endif /* constants for the 2010 crt versions */ #if defined(_VC_CRT_MAJOR_VERSION) && defined (_VC_CRT_MINOR_VERSION) && defined(_VC_CRT_BUILD_VERSION) && defined(_VC_CRT_RBUILD_VERSION) - version = PyUnicode_FromFormat("%d.%d.%d.%d", _VC_CRT_MAJOR_VERSION, - _VC_CRT_MINOR_VERSION, - _VC_CRT_BUILD_VERSION, - _VC_CRT_RBUILD_VERSION); - st = PyModule_AddObject(m, "CRT_ASSEMBLY_VERSION", version); - if (st < 0) return NULL; + PyObject *version = PyUnicode_FromFormat("%d.%d.%d.%d", + _VC_CRT_MAJOR_VERSION, + _VC_CRT_MINOR_VERSION, + _VC_CRT_BUILD_VERSION, + _VC_CRT_RBUILD_VERSION); + if (version == NULL) { + goto error; + } + st = PyModule_AddObjectRef(m, "CRT_ASSEMBLY_VERSION", version); + Py_DECREF(version); + if (st < 0) { + goto error; + } #endif /* make compiler warning quiet if st is unused */ (void)st; return m; + +error: + Py_DECREF(m); + return NULL; } From 5ed2f19b3985a0a94c16d8a0285c13e1fbde9e69 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Mon, 10 Apr 2023 22:58:25 +0200 Subject: [PATCH 133/349] gh-83004: Harden winreg init (#103386) --- PC/winreg.c | 65 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/PC/winreg.c b/PC/winreg.c index 073598a12a68aa..15d32e7fcb99c9 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -2059,27 +2059,29 @@ static struct PyMethodDef winreg_methods[] = { NULL, }; -static void -insint(PyObject * d, char * name, long value) -{ - PyObject *v = PyLong_FromLong(value); - if (!v || PyDict_SetItemString(d, name, v)) - PyErr_Clear(); - Py_XDECREF(v); -} - -#define ADD_INT(val) insint(d, #val, val) +#define ADD_INT(VAL) do { \ + if (PyModule_AddIntConstant(m, #VAL, VAL) < 0) { \ + goto error; \ + } \ +} while (0) -static void -inskey(PyObject * d, char * name, HKEY key) +static int +inskey(PyObject *mod, char *name, HKEY key) { PyObject *v = PyLong_FromVoidPtr(key); - if (!v || PyDict_SetItemString(d, name, v)) - PyErr_Clear(); - Py_XDECREF(v); + if (v == NULL) { + return -1; + } + int rc = PyModule_AddObjectRef(mod, name, v); + Py_DECREF(v); + return rc; } -#define ADD_KEY(val) inskey(d, #val, val) +#define ADD_KEY(VAL) do { \ + if (inskey(m, #VAL, VAL) < 0) { \ + goto error; \ + } \ +} while (0) static struct PyModuleDef winregmodule = { @@ -2096,20 +2098,20 @@ static struct PyModuleDef winregmodule = { PyMODINIT_FUNC PyInit_winreg(void) { - PyObject *m, *d; - m = PyModule_Create(&winregmodule); - if (m == NULL) + PyObject *m = PyModule_Create(&winregmodule); + if (m == NULL) { return NULL; - d = PyModule_GetDict(m); + } PyHKEY_Type.tp_doc = PyHKEY_doc; - if (PyType_Ready(&PyHKEY_Type) < 0) - return NULL; - if (PyDict_SetItemString(d, "HKEYType", - (PyObject *)&PyHKEY_Type) != 0) - return NULL; - if (PyDict_SetItemString(d, "error", - PyExc_OSError) != 0) - return NULL; + if (PyType_Ready(&PyHKEY_Type) < 0) { + goto error; + } + if (PyModule_AddObjectRef(m, "HKEYType", (PyObject *)&PyHKEY_Type) < 0) { + goto error; + } + if (PyModule_AddObjectRef(m, "error", PyExc_OSError) < 0) { + goto error; + } /* Add the relevant constants */ ADD_KEY(HKEY_CLASSES_ROOT); @@ -2170,7 +2172,14 @@ PyMODINIT_FUNC PyInit_winreg(void) ADD_INT(REG_RESOURCE_LIST); ADD_INT(REG_FULL_RESOURCE_DESCRIPTOR); ADD_INT(REG_RESOURCE_REQUIREMENTS_LIST); + +#undef ADD_INT + return m; + +error: + Py_DECREF(m); + return NULL; } #endif /* MS_WINDOWS_DESKTOP || MS_WINDOWS_SYSTEM || MS_WINDOWS_GAMES */ From f80014a9b0e8d00df3e65379070be1dfd2721682 Mon Sep 17 00:00:00 2001 From: AN Long Date: Tue, 11 Apr 2023 05:01:05 +0800 Subject: [PATCH 134/349] gh-103092: Isolate winsound (#103249) --- ...-04-04-21-27-51.gh-issue-103092.7s7Bzf.rst | 1 + PC/winsound.c | 47 +++++++++---------- 2 files changed, 23 insertions(+), 25 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-04-21-27-51.gh-issue-103092.7s7Bzf.rst diff --git a/Misc/NEWS.d/next/Library/2023-04-04-21-27-51.gh-issue-103092.7s7Bzf.rst b/Misc/NEWS.d/next/Library/2023-04-04-21-27-51.gh-issue-103092.7s7Bzf.rst new file mode 100644 index 00000000000000..39c62ffbe8c659 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-04-21-27-51.gh-issue-103092.7s7Bzf.rst @@ -0,0 +1 @@ +Adapt the :mod:`winsound` extension module to :pep:`687`. diff --git a/PC/winsound.c b/PC/winsound.c index bae8e449795733..17ce2ef423b1f9 100644 --- a/PC/winsound.c +++ b/PC/winsound.c @@ -204,31 +204,13 @@ static struct PyMethodDef sound_methods[] = #define ADD_DEFINE(CONST) do { \ if (PyModule_AddIntConstant(module, #CONST, CONST) < 0) { \ - goto error; \ + return -1; \ } \ } while (0) - -static struct PyModuleDef winsoundmodule = { - PyModuleDef_HEAD_INIT, - "winsound", - sound_module_doc, - -1, - sound_methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC -PyInit_winsound(void) +static int +exec_module(PyObject *module) { - PyObject *module = PyModule_Create(&winsoundmodule); - if (module == NULL) { - return NULL; - } - ADD_DEFINE(SND_ASYNC); ADD_DEFINE(SND_NODEFAULT); ADD_DEFINE(SND_NOSTOP); @@ -248,9 +230,24 @@ PyInit_winsound(void) #undef ADD_DEFINE - return module; + return 0; +} + +static PyModuleDef_Slot sound_slots[] = { + {Py_mod_exec, exec_module}, + {0, NULL} +}; -error: - Py_DECREF(module); - return NULL; +static struct PyModuleDef winsoundmodule = { + .m_base = PyModuleDef_HEAD_INIT, + .m_name = "winsound", + .m_doc = sound_module_doc, + .m_methods = sound_methods, + .m_slots = sound_slots, +}; + +PyMODINIT_FUNC +PyInit_winsound(void) +{ + return PyModuleDef_Init(&winsoundmodule); } From d034590294d4618880375a6db513c30bce3e126b Mon Sep 17 00:00:00 2001 From: David Ellis Date: Mon, 10 Apr 2023 22:50:58 +0100 Subject: [PATCH 135/349] gh-103000: Optimise dataclasses asdict/astuple for common types (#103005) Co-authored-by: Carl Meyer Co-authored-by: Alex Waygood --- Lib/dataclasses.py | 31 +++++++++++++++++-- ...-03-24-20-49-48.gh-issue-103000.6eVNZI.rst | 2 ++ 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-03-24-20-49-48.gh-issue-103000.6eVNZI.rst diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 7558287bad449e..4026c8b77975b7 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -222,6 +222,29 @@ def __repr__(self): # https://bugs.python.org/issue33453 for details. _MODULE_IDENTIFIER_RE = re.compile(r'^(?:\s*(\w+)\s*\.)?\s*(\w+)') +# Atomic immutable types which don't require any recursive handling and for which deepcopy +# returns the same object. We can provide a fast-path for these types in asdict and astuple. +_ATOMIC_TYPES = frozenset({ + # Common JSON Serializable types + types.NoneType, + bool, + int, + float, + str, + # Other common types + complex, + bytes, + # Other types that are also unaffected by deepcopy + types.EllipsisType, + types.NotImplementedType, + types.CodeType, + types.BuiltinFunctionType, + types.FunctionType, + type, + range, + property, +}) + # This function's logic is copied from "recursive_repr" function in # reprlib module to avoid dependency. def _recursive_repr(user_function): @@ -1291,7 +1314,9 @@ class C: def _asdict_inner(obj, dict_factory): - if _is_dataclass_instance(obj): + if type(obj) in _ATOMIC_TYPES: + return obj + elif _is_dataclass_instance(obj): result = [] for f in fields(obj): value = _asdict_inner(getattr(obj, f.name), dict_factory) @@ -1363,7 +1388,9 @@ class C: def _astuple_inner(obj, tuple_factory): - if _is_dataclass_instance(obj): + if type(obj) in _ATOMIC_TYPES: + return obj + elif _is_dataclass_instance(obj): result = [] for f in fields(obj): value = _astuple_inner(getattr(obj, f.name), tuple_factory) diff --git a/Misc/NEWS.d/next/Library/2023-03-24-20-49-48.gh-issue-103000.6eVNZI.rst b/Misc/NEWS.d/next/Library/2023-03-24-20-49-48.gh-issue-103000.6eVNZI.rst new file mode 100644 index 00000000000000..15f16d9eb4c1bf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-03-24-20-49-48.gh-issue-103000.6eVNZI.rst @@ -0,0 +1,2 @@ +Improve performance of :func:`dataclasses.astuple` and +:func:`dataclasses.asdict` in cases where the contents are common Python types. From 75b6ab80da95f7d731b0d69b8ee8adb095b24d27 Mon Sep 17 00:00:00 2001 From: "C.A.M. Gerlach" Date: Mon, 10 Apr 2023 22:57:36 -0500 Subject: [PATCH 136/349] Doc: Avoid error lexing multiprocessing docs code block on Pygments 2.15.0 (#103421) --- Doc/library/multiprocessing.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 8454296b815b41..84e309f1bc8326 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -452,7 +452,9 @@ process which created it. importable by the children. This is covered in :ref:`multiprocessing-programming` however it is worth pointing out here. This means that some examples, such as the :class:`multiprocessing.pool.Pool` examples will not work in the - interactive interpreter. For example:: + interactive interpreter. For example: + + .. code-block:: text >>> from multiprocessing import Pool >>> p = Pool(5) From 280bd536b58d3e844047cd132159cf9f6cb66708 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 11 Apr 2023 09:17:34 +0300 Subject: [PATCH 137/349] Docs: don't render files in includes/, they're for embedding only (#103313) --- Doc/conf.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Doc/conf.py b/Doc/conf.py index 29fb63cbcc8614..e99b801d0ae87a 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -68,8 +68,10 @@ # Minimum version of sphinx required needs_sphinx = '3.2' +# Ignore any .rst files in the includes/ directory; +# they're embedded in pages but not rendered individually. # Ignore any .rst files in the venv/ directory. -exclude_patterns = ['venv/*', 'README.rst'] +exclude_patterns = ['includes/*.rst', 'venv/*', 'README.rst'] venvdir = os.getenv('VENVDIR') if venvdir is not None: exclude_patterns.append(venvdir + '/*') From 4cd1cc843aa4ae77a543cdd882da687300762e9d Mon Sep 17 00:00:00 2001 From: Zac Hatfield-Dodds Date: Mon, 10 Apr 2023 23:44:53 -0700 Subject: [PATCH 138/349] gh-99553: add tests for ExceptionGroup wrapping (#99615) --- Lib/test/test_exception_group.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Lib/test/test_exception_group.py b/Lib/test/test_exception_group.py index b11524e778e665..fa159a76ec1aff 100644 --- a/Lib/test/test_exception_group.py +++ b/Lib/test/test_exception_group.py @@ -102,6 +102,20 @@ class MyEG(BaseExceptionGroup, ValueError): with self.assertRaisesRegex(TypeError, msg): MyEG("eg", [ValueError(12), KeyboardInterrupt(42)]) + def test_EG_and_specific_subclass_can_wrap_any_nonbase_exception(self): + class MyEG(ExceptionGroup, ValueError): + pass + + # The restriction is specific to Exception, not "the other base class" + MyEG("eg", [ValueError(12), Exception()]) + + def test_BEG_and_specific_subclass_can_wrap_any_nonbase_exception(self): + class MyEG(BaseExceptionGroup, ValueError): + pass + + # The restriction is specific to Exception, not "the other base class" + MyEG("eg", [ValueError(12), Exception()]) + def test_BEG_subclass_wraps_anything(self): class MyBEG(BaseExceptionGroup): From 8026cda10ccd3cbc7f7ff84dc6970266512961e4 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Tue, 11 Apr 2023 09:31:39 +0100 Subject: [PATCH 139/349] gh-102828: set stacklevel on deprecation warning (#103422) --- Lib/shutil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/shutil.py b/Lib/shutil.py index 8b378645a5a375..95b6c5299cab29 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -699,7 +699,7 @@ def rmtree(path, ignore_errors=False, onerror=None, *, onexc=None, dir_fd=None): if onerror is not None: warnings.warn("onerror argument is deprecated, use onexc instead", - DeprecationWarning) + DeprecationWarning, stacklevel=2) sys.audit("shutil.rmtree", path, dir_fd) if ignore_errors: From 78b763f63032a7185c0905c319ead9e9b35787b6 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Tue, 11 Apr 2023 09:38:37 +0100 Subject: [PATCH 140/349] gh-103176: sys._current_exceptions() returns mapping to exception instances instead of exc_info tuples (#103177) --- Doc/library/sys.rst | 4 ++++ Doc/whatsnew/3.12.rst | 8 ++++++++ Lib/test/test_sys.py | 6 +++--- .../2023-04-01-23-01-31.gh-issue-103176.FBsdxa.rst | 2 ++ Python/pystate.c | 13 ++++++------- 5 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-01-23-01-31.gh-issue-103176.FBsdxa.rst diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 00721efd1cf65e..e37d57edce515f 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -220,6 +220,10 @@ always available. .. audit-event:: sys._current_exceptions "" sys._current_exceptions + .. versionchanged:: 3.12 + Each value in the dictionary is now a single exception instance, rather + than a 3-tuple as returned from ``sys.exc_info()``. + .. function:: breakpointhook() This hook function is called by built-in :func:`breakpoint`. By default, diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 651caed864fef7..0eb16367267f1c 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -499,6 +499,10 @@ sys :data:`sys.last_type`, :data:`sys.last_value` and :data:`sys.last_traceback`. (Contributed by Irit Katriel in :gh:`102778`.) +* :func:`sys._current_exceptions` now returns a mapping from thread-id to an + exception instance, rather than to a ``(typ, exc, tb)`` tuple. + (Contributed by Irit Katriel in :gh:`103176`.) + Optimizations ============= @@ -940,6 +944,10 @@ Changes in the Python API synchronization is needed, implement locking within the cached property getter function or around multi-threaded access points. +* :func:`sys._current_exceptions` now returns a mapping from thread-id to an + exception instance, rather than to a ``(typ, exc, tb)`` tuple. + (Contributed by Irit Katriel in :gh:`103176`.) + Build Changes ============= diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index d7456d6d9480b2..890ffbf472c335 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -532,13 +532,13 @@ def g456(): main_id = threading.get_ident() self.assertIn(main_id, d) self.assertIn(thread_id, d) - self.assertEqual((None, None, None), d.pop(main_id)) + self.assertEqual(None, d.pop(main_id)) # Verify that the captured thread frame is blocked in g456, called # from f123. This is a little tricky, since various bits of # threading.py are also in the thread's call stack. - exc_type, exc_value, exc_tb = d.pop(thread_id) - stack = traceback.extract_stack(exc_tb.tb_frame) + exc_value = d.pop(thread_id) + stack = traceback.extract_stack(exc_value.__traceback__.tb_frame) for i, (filename, lineno, funcname, sourceline) in enumerate(stack): if funcname == "f123": break diff --git a/Misc/NEWS.d/next/Library/2023-04-01-23-01-31.gh-issue-103176.FBsdxa.rst b/Misc/NEWS.d/next/Library/2023-04-01-23-01-31.gh-issue-103176.FBsdxa.rst new file mode 100644 index 00000000000000..b89f9bae595457 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-01-23-01-31.gh-issue-103176.FBsdxa.rst @@ -0,0 +1,2 @@ +:func:`sys._current_exceptions` now returns a mapping from thread-id to an +exception instance, rather than to a ``(typ, exc, tb)`` tuple. diff --git a/Python/pystate.c b/Python/pystate.c index d09c1d5743a4c6..37cef972e0feb4 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1986,14 +1986,13 @@ _PyThread_CurrentExceptions(void) if (id == NULL) { goto fail; } - PyObject *exc_info = _PyErr_StackItemToExcInfoTuple(err_info); - if (exc_info == NULL) { - Py_DECREF(id); - goto fail; - } - int stat = PyDict_SetItem(result, id, exc_info); + PyObject *exc = err_info->exc_value; + assert(exc == NULL || + exc == Py_None || + PyExceptionInstance_Check(exc)); + + int stat = PyDict_SetItem(result, id, exc == NULL ? Py_None : exc); Py_DECREF(id); - Py_DECREF(exc_info); if (stat < 0) { goto fail; } From 33822d037a3381d239dcc532937138da6f3da669 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Tue, 11 Apr 2023 11:15:09 +0100 Subject: [PATCH 141/349] gh-87092: move assembler related code from compile.c to assemble.c (#103277) --- Include/internal/pycore_compile.h | 39 ++ Include/internal/pycore_flowgraph.h | 11 +- Makefile.pre.in | 3 +- PCbuild/_freeze_module.vcxproj | 3 +- PCbuild/_freeze_module.vcxproj.filters | 9 +- PCbuild/pythoncore.vcxproj | 3 +- PCbuild/pythoncore.vcxproj.filters | 9 +- Python/assemble.c | 602 +++++++++++++++++ Python/compile.c | 873 +++++-------------------- Python/flowgraph.c | 48 +- 10 files changed, 851 insertions(+), 749 deletions(-) create mode 100644 Python/assemble.c diff --git a/Include/internal/pycore_compile.h b/Include/internal/pycore_compile.h index 6a1e02c0b895d7..f85240c48a89b0 100644 --- a/Include/internal/pycore_compile.h +++ b/Include/internal/pycore_compile.h @@ -33,6 +33,45 @@ extern int _PyAST_Optimize( struct _arena *arena, _PyASTOptimizeState *state); + +typedef struct { + int i_opcode; + int i_oparg; + _PyCompilerSrcLocation i_loc; +} _PyCompilerInstruction; + +typedef struct { + _PyCompilerInstruction *s_instrs; + int s_allocated; + int s_used; + + int *s_labelmap; /* label id --> instr offset */ + int s_labelmap_size; + int s_next_free_label; /* next free label id */ +} _PyCompile_InstructionSequence; + +typedef struct { + PyObject *u_name; + PyObject *u_qualname; /* dot-separated qualified name (lazy) */ + + /* The following fields are dicts that map objects to + the index of them in co_XXX. The index is used as + the argument for opcodes that refer to those collections. + */ + PyObject *u_consts; /* all constants */ + PyObject *u_names; /* all names */ + PyObject *u_varnames; /* local variables */ + PyObject *u_cellvars; /* cell variables */ + PyObject *u_freevars; /* free variables */ + + Py_ssize_t u_argcount; /* number of arguments for block */ + Py_ssize_t u_posonlyargcount; /* number of positional only arguments for block */ + Py_ssize_t u_kwonlyargcount; /* number of keyword only arguments for block */ + + int u_firstlineno; /* the first lineno of the block */ +} _PyCompile_CodeUnitMetadata; + + /* Utility for a number of growing arrays used in the compiler */ int _PyCompile_EnsureArrayLargeEnough( int idx, diff --git a/Include/internal/pycore_flowgraph.h b/Include/internal/pycore_flowgraph.h index 7c0b8fe980c3c7..f470dad3aaa459 100644 --- a/Include/internal/pycore_flowgraph.h +++ b/Include/internal/pycore_flowgraph.h @@ -9,6 +9,7 @@ extern "C" { #endif #include "pycore_opcode_utils.h" +#include "pycore_compile.h" static const _PyCompilerSrcLocation NO_LOCATION = {-1, -1, -1, -1}; @@ -33,7 +34,8 @@ typedef struct { typedef struct _PyCfgBasicblock_ { /* Each basicblock in a compilation unit is linked via b_list in the reverse order that the block are allocated. b_list points to the next - block, not to be confused with b_next, which is next by control flow. */ + block in this list, not to be confused with b_next, which is next by + control flow. */ struct _PyCfgBasicblock_ *b_list; /* The label of this block if it is a jump target, -1 otherwise */ _PyCfgJumpTargetLabel b_label; @@ -91,10 +93,9 @@ void _PyCfgBuilder_Fini(_PyCfgBuilder *g); _PyCfgInstruction* _PyCfg_BasicblockLastInstr(const _PyCfgBasicblock *b); int _PyCfg_OptimizeCodeUnit(_PyCfgBuilder *g, PyObject *consts, PyObject *const_cache, - int code_flags, int nlocals, int nparams); + int code_flags, int nlocals, int nparams, int firstlineno); int _PyCfg_Stackdepth(_PyCfgBasicblock *entryblock, int code_flags); void _PyCfg_ConvertExceptionHandlersToNops(_PyCfgBasicblock *entryblock); -int _PyCfg_ResolveLineNumbers(_PyCfgBuilder *g, int firstlineno); int _PyCfg_ResolveJumps(_PyCfgBuilder *g); int _PyCfg_InstrSize(_PyCfgInstruction *instruction); @@ -110,6 +111,10 @@ basicblock_nofallthrough(const _PyCfgBasicblock *b) { #define BB_NO_FALLTHROUGH(B) (basicblock_nofallthrough(B)) #define BB_HAS_FALLTHROUGH(B) (!basicblock_nofallthrough(B)) +PyCodeObject * +_PyAssemble_MakeCodeObject(_PyCompile_CodeUnitMetadata *u, PyObject *const_cache, + PyObject *consts, int maxdepth, _PyCfgBasicblock *entryblock, + int nlocalsplus, int code_flags, PyObject *filename); #ifdef __cplusplus } diff --git a/Makefile.pre.in b/Makefile.pre.in index fefa5d4e8147bf..dc22683361d462 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -369,17 +369,18 @@ PYTHON_OBJS= \ Python/Python-ast.o \ Python/Python-tokenize.o \ Python/asdl.o \ + Python/assemble.o \ Python/ast.o \ Python/ast_opt.o \ Python/ast_unparse.o \ Python/bltinmodule.o \ Python/ceval.o \ - Python/flowgraph.o \ Python/codecs.o \ Python/compile.o \ Python/context.o \ Python/dynamic_annotations.o \ Python/errors.o \ + Python/flowgraph.o \ Python/frame.o \ Python/frozenmain.o \ Python/future.o \ diff --git a/PCbuild/_freeze_module.vcxproj b/PCbuild/_freeze_module.vcxproj index 28eced6d4b2862..70ca0787cfd601 100644 --- a/PCbuild/_freeze_module.vcxproj +++ b/PCbuild/_freeze_module.vcxproj @@ -177,13 +177,13 @@ + - @@ -192,6 +192,7 @@ + diff --git a/PCbuild/_freeze_module.vcxproj.filters b/PCbuild/_freeze_module.vcxproj.filters index e4faa89bb831d9..464cbec62a628b 100644 --- a/PCbuild/_freeze_module.vcxproj.filters +++ b/PCbuild/_freeze_module.vcxproj.filters @@ -28,6 +28,9 @@ Source Files + + Source Files + Source Files @@ -76,9 +79,6 @@ Source Files - - Source Files - Source Files @@ -142,6 +142,9 @@ Source Files + + Source Files + Source Files diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 29f32db579fa40..a465f99eca82d8 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -500,13 +500,13 @@ + - @@ -514,6 +514,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 6a622fd93930ad..52cd4bbb6fb18d 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -1094,6 +1094,9 @@ Python + + Python + Python @@ -1109,9 +1112,6 @@ Python - - Python - Python @@ -1130,6 +1130,9 @@ Python + + Python + Python diff --git a/Python/assemble.c b/Python/assemble.c new file mode 100644 index 00000000000000..e5a361b230cf1c --- /dev/null +++ b/Python/assemble.c @@ -0,0 +1,602 @@ +#include + +#include "Python.h" +#include "pycore_flowgraph.h" +#include "pycore_compile.h" +#include "pycore_pymem.h" // _PyMem_IsPtrFreed() +#include "pycore_code.h" // write_location_entry_start() + + +#define DEFAULT_CODE_SIZE 128 +#define DEFAULT_LNOTAB_SIZE 16 +#define DEFAULT_CNOTAB_SIZE 32 + +#undef SUCCESS +#undef ERROR +#define SUCCESS 0 +#define ERROR -1 + +#define RETURN_IF_ERROR(X) \ + if ((X) == -1) { \ + return ERROR; \ + } + +typedef _PyCompilerSrcLocation location; +typedef _PyCfgInstruction cfg_instr; +typedef _PyCfgBasicblock basicblock; + +static inline bool +same_location(location a, location b) +{ + return a.lineno == b.lineno && + a.end_lineno == b.end_lineno && + a.col_offset == b.col_offset && + a.end_col_offset == b.end_col_offset; +} + +struct assembler { + PyObject *a_bytecode; /* bytes containing bytecode */ + int a_offset; /* offset into bytecode */ + PyObject *a_except_table; /* bytes containing exception table */ + int a_except_table_off; /* offset into exception table */ + /* Location Info */ + int a_lineno; /* lineno of last emitted instruction */ + PyObject* a_linetable; /* bytes containing location info */ + int a_location_off; /* offset of last written location info frame */ +}; + +static int +assemble_init(struct assembler *a, int firstlineno) +{ + memset(a, 0, sizeof(struct assembler)); + a->a_lineno = firstlineno; + a->a_linetable = NULL; + a->a_location_off = 0; + a->a_except_table = NULL; + a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE); + if (a->a_bytecode == NULL) { + goto error; + } + a->a_linetable = PyBytes_FromStringAndSize(NULL, DEFAULT_CNOTAB_SIZE); + if (a->a_linetable == NULL) { + goto error; + } + a->a_except_table = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE); + if (a->a_except_table == NULL) { + goto error; + } + return SUCCESS; +error: + Py_XDECREF(a->a_bytecode); + Py_XDECREF(a->a_linetable); + Py_XDECREF(a->a_except_table); + return ERROR; +} + +static void +assemble_free(struct assembler *a) +{ + Py_XDECREF(a->a_bytecode); + Py_XDECREF(a->a_linetable); + Py_XDECREF(a->a_except_table); +} + +static inline void +write_except_byte(struct assembler *a, int byte) { + unsigned char *p = (unsigned char *) PyBytes_AS_STRING(a->a_except_table); + p[a->a_except_table_off++] = byte; +} + +#define CONTINUATION_BIT 64 + +static void +assemble_emit_exception_table_item(struct assembler *a, int value, int msb) +{ + assert ((msb | 128) == 128); + assert(value >= 0 && value < (1 << 30)); + if (value >= 1 << 24) { + write_except_byte(a, (value >> 24) | CONTINUATION_BIT | msb); + msb = 0; + } + if (value >= 1 << 18) { + write_except_byte(a, ((value >> 18)&0x3f) | CONTINUATION_BIT | msb); + msb = 0; + } + if (value >= 1 << 12) { + write_except_byte(a, ((value >> 12)&0x3f) | CONTINUATION_BIT | msb); + msb = 0; + } + if (value >= 1 << 6) { + write_except_byte(a, ((value >> 6)&0x3f) | CONTINUATION_BIT | msb); + msb = 0; + } + write_except_byte(a, (value&0x3f) | msb); +} + +/* See Objects/exception_handling_notes.txt for details of layout */ +#define MAX_SIZE_OF_ENTRY 20 + +static int +assemble_emit_exception_table_entry(struct assembler *a, int start, int end, basicblock *handler) +{ + Py_ssize_t len = PyBytes_GET_SIZE(a->a_except_table); + if (a->a_except_table_off + MAX_SIZE_OF_ENTRY >= len) { + RETURN_IF_ERROR(_PyBytes_Resize(&a->a_except_table, len * 2)); + } + int size = end-start; + assert(end > start); + int target = handler->b_offset; + int depth = handler->b_startdepth - 1; + if (handler->b_preserve_lasti) { + depth -= 1; + } + assert(depth >= 0); + int depth_lasti = (depth<<1) | handler->b_preserve_lasti; + assemble_emit_exception_table_item(a, start, (1<<7)); + assemble_emit_exception_table_item(a, size, 0); + assemble_emit_exception_table_item(a, target, 0); + assemble_emit_exception_table_item(a, depth_lasti, 0); + return SUCCESS; +} + +static int +assemble_exception_table(struct assembler *a, basicblock *entryblock) +{ + basicblock *b; + int ioffset = 0; + basicblock *handler = NULL; + int start = -1; + for (b = entryblock; b != NULL; b = b->b_next) { + ioffset = b->b_offset; + for (int i = 0; i < b->b_iused; i++) { + cfg_instr *instr = &b->b_instr[i]; + if (instr->i_except != handler) { + if (handler != NULL) { + RETURN_IF_ERROR( + assemble_emit_exception_table_entry(a, start, ioffset, handler)); + } + start = ioffset; + handler = instr->i_except; + } + ioffset += _PyCfg_InstrSize(instr); + } + } + if (handler != NULL) { + RETURN_IF_ERROR(assemble_emit_exception_table_entry(a, start, ioffset, handler)); + } + return SUCCESS; +} + + +/* Code location emitting code. See locations.md for a description of the format. */ + +#define MSB 0x80 + +static void +write_location_byte(struct assembler* a, int val) +{ + PyBytes_AS_STRING(a->a_linetable)[a->a_location_off] = val&255; + a->a_location_off++; +} + + +static uint8_t * +location_pointer(struct assembler* a) +{ + return (uint8_t *)PyBytes_AS_STRING(a->a_linetable) + + a->a_location_off; +} + +static void +write_location_first_byte(struct assembler* a, int code, int length) +{ + a->a_location_off += write_location_entry_start( + location_pointer(a), code, length); +} + +static void +write_location_varint(struct assembler* a, unsigned int val) +{ + uint8_t *ptr = location_pointer(a); + a->a_location_off += write_varint(ptr, val); +} + + +static void +write_location_signed_varint(struct assembler* a, int val) +{ + uint8_t *ptr = location_pointer(a); + a->a_location_off += write_signed_varint(ptr, val); +} + +static void +write_location_info_short_form(struct assembler* a, int length, int column, int end_column) +{ + assert(length > 0 && length <= 8); + int column_low_bits = column & 7; + int column_group = column >> 3; + assert(column < 80); + assert(end_column >= column); + assert(end_column - column < 16); + write_location_first_byte(a, PY_CODE_LOCATION_INFO_SHORT0 + column_group, length); + write_location_byte(a, (column_low_bits << 4) | (end_column - column)); +} + +static void +write_location_info_oneline_form(struct assembler* a, int length, int line_delta, int column, int end_column) +{ + assert(length > 0 && length <= 8); + assert(line_delta >= 0 && line_delta < 3); + assert(column < 128); + assert(end_column < 128); + write_location_first_byte(a, PY_CODE_LOCATION_INFO_ONE_LINE0 + line_delta, length); + write_location_byte(a, column); + write_location_byte(a, end_column); +} + +static void +write_location_info_long_form(struct assembler* a, location loc, int length) +{ + assert(length > 0 && length <= 8); + write_location_first_byte(a, PY_CODE_LOCATION_INFO_LONG, length); + write_location_signed_varint(a, loc.lineno - a->a_lineno); + assert(loc.end_lineno >= loc.lineno); + write_location_varint(a, loc.end_lineno - loc.lineno); + write_location_varint(a, loc.col_offset + 1); + write_location_varint(a, loc.end_col_offset + 1); +} + +static void +write_location_info_none(struct assembler* a, int length) +{ + write_location_first_byte(a, PY_CODE_LOCATION_INFO_NONE, length); +} + +static void +write_location_info_no_column(struct assembler* a, int length, int line_delta) +{ + write_location_first_byte(a, PY_CODE_LOCATION_INFO_NO_COLUMNS, length); + write_location_signed_varint(a, line_delta); +} + +#define THEORETICAL_MAX_ENTRY_SIZE 25 /* 1 + 6 + 6 + 6 + 6 */ + + +static int +write_location_info_entry(struct assembler* a, location loc, int isize) +{ + Py_ssize_t len = PyBytes_GET_SIZE(a->a_linetable); + if (a->a_location_off + THEORETICAL_MAX_ENTRY_SIZE >= len) { + assert(len > THEORETICAL_MAX_ENTRY_SIZE); + RETURN_IF_ERROR(_PyBytes_Resize(&a->a_linetable, len*2)); + } + if (loc.lineno < 0) { + write_location_info_none(a, isize); + return SUCCESS; + } + int line_delta = loc.lineno - a->a_lineno; + int column = loc.col_offset; + int end_column = loc.end_col_offset; + assert(column >= -1); + assert(end_column >= -1); + if (column < 0 || end_column < 0) { + if (loc.end_lineno == loc.lineno || loc.end_lineno == -1) { + write_location_info_no_column(a, isize, line_delta); + a->a_lineno = loc.lineno; + return SUCCESS; + } + } + else if (loc.end_lineno == loc.lineno) { + if (line_delta == 0 && column < 80 && end_column - column < 16 && end_column >= column) { + write_location_info_short_form(a, isize, column, end_column); + return SUCCESS; + } + if (line_delta >= 0 && line_delta < 3 && column < 128 && end_column < 128) { + write_location_info_oneline_form(a, isize, line_delta, column, end_column); + a->a_lineno = loc.lineno; + return SUCCESS; + } + } + write_location_info_long_form(a, loc, isize); + a->a_lineno = loc.lineno; + return SUCCESS; +} + +static int +assemble_emit_location(struct assembler* a, location loc, int isize) +{ + if (isize == 0) { + return SUCCESS; + } + while (isize > 8) { + RETURN_IF_ERROR(write_location_info_entry(a, loc, 8)); + isize -= 8; + } + return write_location_info_entry(a, loc, isize); +} + +static int +assemble_location_info(struct assembler *a, basicblock *entryblock, int firstlineno) +{ + a->a_lineno = firstlineno; + location loc = NO_LOCATION; + int size = 0; + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + for (int j = 0; j < b->b_iused; j++) { + if (!same_location(loc, b->b_instr[j].i_loc)) { + RETURN_IF_ERROR(assemble_emit_location(a, loc, size)); + loc = b->b_instr[j].i_loc; + size = 0; + } + size += _PyCfg_InstrSize(&b->b_instr[j]); + } + } + RETURN_IF_ERROR(assemble_emit_location(a, loc, size)); + return SUCCESS; +} + +static void +write_instr(_Py_CODEUNIT *codestr, cfg_instr *instruction, int ilen) +{ + int opcode = instruction->i_opcode; + assert(!IS_PSEUDO_OPCODE(opcode)); + int oparg = instruction->i_oparg; + assert(HAS_ARG(opcode) || oparg == 0); + int caches = _PyOpcode_Caches[opcode]; + switch (ilen - caches) { + case 4: + codestr->op.code = EXTENDED_ARG; + codestr->op.arg = (oparg >> 24) & 0xFF; + codestr++; + /* fall through */ + case 3: + codestr->op.code = EXTENDED_ARG; + codestr->op.arg = (oparg >> 16) & 0xFF; + codestr++; + /* fall through */ + case 2: + codestr->op.code = EXTENDED_ARG; + codestr->op.arg = (oparg >> 8) & 0xFF; + codestr++; + /* fall through */ + case 1: + codestr->op.code = opcode; + codestr->op.arg = oparg & 0xFF; + codestr++; + break; + default: + Py_UNREACHABLE(); + } + while (caches--) { + codestr->op.code = CACHE; + codestr->op.arg = 0; + codestr++; + } +} + +/* assemble_emit_instr() + Extend the bytecode with a new instruction. + Update lnotab if necessary. +*/ + +static int +assemble_emit_instr(struct assembler *a, cfg_instr *i) +{ + Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode); + _Py_CODEUNIT *code; + + int size = _PyCfg_InstrSize(i); + if (a->a_offset + size >= len / (int)sizeof(_Py_CODEUNIT)) { + if (len > PY_SSIZE_T_MAX / 2) { + return ERROR; + } + RETURN_IF_ERROR(_PyBytes_Resize(&a->a_bytecode, len * 2)); + } + code = (_Py_CODEUNIT *)PyBytes_AS_STRING(a->a_bytecode) + a->a_offset; + a->a_offset += size; + write_instr(code, i, size); + return SUCCESS; +} + +static int +assemble_emit(struct assembler *a, basicblock *entryblock, int first_lineno, + PyObject *const_cache) +{ + RETURN_IF_ERROR(assemble_init(a, first_lineno)); + + for (basicblock *b = entryblock; b != NULL; b = b->b_next) { + for (int j = 0; j < b->b_iused; j++) { + RETURN_IF_ERROR(assemble_emit_instr(a, &b->b_instr[j])); + } + } + + RETURN_IF_ERROR(assemble_location_info(a, entryblock, a->a_lineno)); + + RETURN_IF_ERROR(assemble_exception_table(a, entryblock)); + + RETURN_IF_ERROR(_PyBytes_Resize(&a->a_except_table, a->a_except_table_off)); + RETURN_IF_ERROR(_PyCompile_ConstCacheMergeOne(const_cache, &a->a_except_table)); + + RETURN_IF_ERROR(_PyBytes_Resize(&a->a_linetable, a->a_location_off)); + RETURN_IF_ERROR(_PyCompile_ConstCacheMergeOne(const_cache, &a->a_linetable)); + + RETURN_IF_ERROR(_PyBytes_Resize(&a->a_bytecode, a->a_offset * sizeof(_Py_CODEUNIT))); + RETURN_IF_ERROR(_PyCompile_ConstCacheMergeOne(const_cache, &a->a_bytecode)); + return SUCCESS; +} + +static PyObject * +dict_keys_inorder(PyObject *dict, Py_ssize_t offset) +{ + PyObject *tuple, *k, *v; + Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict); + + tuple = PyTuple_New(size); + if (tuple == NULL) + return NULL; + while (PyDict_Next(dict, &pos, &k, &v)) { + i = PyLong_AS_LONG(v); + assert((i - offset) < size); + assert((i - offset) >= 0); + PyTuple_SET_ITEM(tuple, i - offset, Py_NewRef(k)); + } + return tuple; +} + +// This is in codeobject.c. +extern void _Py_set_localsplus_info(int, PyObject *, unsigned char, + PyObject *, PyObject *); + +static void +compute_localsplus_info(_PyCompile_CodeUnitMetadata *umd, int nlocalsplus, + PyObject *names, PyObject *kinds) +{ + PyObject *k, *v; + Py_ssize_t pos = 0; + while (PyDict_Next(umd->u_varnames, &pos, &k, &v)) { + int offset = (int)PyLong_AS_LONG(v); + assert(offset >= 0); + assert(offset < nlocalsplus); + // For now we do not distinguish arg kinds. + _PyLocals_Kind kind = CO_FAST_LOCAL; + if (PyDict_GetItem(umd->u_cellvars, k) != NULL) { + kind |= CO_FAST_CELL; + } + _Py_set_localsplus_info(offset, k, kind, names, kinds); + } + int nlocals = (int)PyDict_GET_SIZE(umd->u_varnames); + + // This counter mirrors the fix done in fix_cell_offsets(). + int numdropped = 0; + pos = 0; + while (PyDict_Next(umd->u_cellvars, &pos, &k, &v)) { + if (PyDict_GetItem(umd->u_varnames, k) != NULL) { + // Skip cells that are already covered by locals. + numdropped += 1; + continue; + } + int offset = (int)PyLong_AS_LONG(v); + assert(offset >= 0); + offset += nlocals - numdropped; + assert(offset < nlocalsplus); + _Py_set_localsplus_info(offset, k, CO_FAST_CELL, names, kinds); + } + + pos = 0; + while (PyDict_Next(umd->u_freevars, &pos, &k, &v)) { + int offset = (int)PyLong_AS_LONG(v); + assert(offset >= 0); + offset += nlocals - numdropped; + assert(offset < nlocalsplus); + _Py_set_localsplus_info(offset, k, CO_FAST_FREE, names, kinds); + } +} + +static PyCodeObject * +makecode(_PyCompile_CodeUnitMetadata *umd, struct assembler *a, PyObject *const_cache, + PyObject *constslist, int maxdepth, int nlocalsplus, int code_flags, + PyObject *filename) +{ + PyCodeObject *co = NULL; + PyObject *names = NULL; + PyObject *consts = NULL; + PyObject *localsplusnames = NULL; + PyObject *localspluskinds = NULL; + names = dict_keys_inorder(umd->u_names, 0); + if (!names) { + goto error; + } + if (_PyCompile_ConstCacheMergeOne(const_cache, &names) < 0) { + goto error; + } + + consts = PyList_AsTuple(constslist); /* PyCode_New requires a tuple */ + if (consts == NULL) { + goto error; + } + if (_PyCompile_ConstCacheMergeOne(const_cache, &consts) < 0) { + goto error; + } + + assert(umd->u_posonlyargcount < INT_MAX); + assert(umd->u_argcount < INT_MAX); + assert(umd->u_kwonlyargcount < INT_MAX); + int posonlyargcount = (int)umd->u_posonlyargcount; + int posorkwargcount = (int)umd->u_argcount; + assert(INT_MAX - posonlyargcount - posorkwargcount > 0); + int kwonlyargcount = (int)umd->u_kwonlyargcount; + + localsplusnames = PyTuple_New(nlocalsplus); + if (localsplusnames == NULL) { + goto error; + } + localspluskinds = PyBytes_FromStringAndSize(NULL, nlocalsplus); + if (localspluskinds == NULL) { + goto error; + } + compute_localsplus_info(umd, nlocalsplus, localsplusnames, localspluskinds); + + struct _PyCodeConstructor con = { + .filename = filename, + .name = umd->u_name, + .qualname = umd->u_qualname ? umd->u_qualname : umd->u_name, + .flags = code_flags, + + .code = a->a_bytecode, + .firstlineno = umd->u_firstlineno, + .linetable = a->a_linetable, + + .consts = consts, + .names = names, + + .localsplusnames = localsplusnames, + .localspluskinds = localspluskinds, + + .argcount = posonlyargcount + posorkwargcount, + .posonlyargcount = posonlyargcount, + .kwonlyargcount = kwonlyargcount, + + .stacksize = maxdepth, + + .exceptiontable = a->a_except_table, + }; + + if (_PyCode_Validate(&con) < 0) { + goto error; + } + + if (_PyCompile_ConstCacheMergeOne(const_cache, &localsplusnames) < 0) { + goto error; + } + con.localsplusnames = localsplusnames; + + co = _PyCode_New(&con); + if (co == NULL) { + goto error; + } + +error: + Py_XDECREF(names); + Py_XDECREF(consts); + Py_XDECREF(localsplusnames); + Py_XDECREF(localspluskinds); + return co; +} + + +PyCodeObject * +_PyAssemble_MakeCodeObject(_PyCompile_CodeUnitMetadata *umd, PyObject *const_cache, + PyObject *consts, int maxdepth, basicblock *entryblock, + int nlocalsplus, int code_flags, PyObject *filename) +{ + PyCodeObject *co = NULL; + + struct assembler a; + int res = assemble_emit(&a, entryblock, umd->u_firstlineno, const_cache); + if (res == SUCCESS) { + co = makecode(umd, &a, const_cache, consts, maxdepth, nlocalsplus, + code_flags, filename); + } + assemble_free(&a); + return co; +} diff --git a/Python/compile.c b/Python/compile.c index fed9ae7066e4f0..15fca8296c69ec 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -6,10 +6,10 @@ * object: * 1. Checks for future statements. See future.c * 2. Builds a symbol table. See symtable.c. - * 3. Generate code for basic blocks. See compiler_mod() in this file. - * 4. Assemble the basic blocks into final code. See assemble() in - * this file. - * 5. Optimize the byte code (peephole optimizations). + * 3. Generate an instruction sequence. See compiler_mod() in this file. + * 4. Generate a control flow graph and run optimizations on it. See flowgraph.c. + * 5. Assemble the basic blocks into final code. See optimize_and_assemble() in + * this file, and assembler.c. * * Note that compiler_mod() suggests module, but the module ast type * (mod_ty) has cases for expressions and interactive statements. @@ -101,15 +101,6 @@ location_is_after(location loc1, location loc2) { (loc1.col_offset > loc2.end_col_offset)); } -static inline bool -same_location(location a, location b) -{ - return a.lineno == b.lineno && - a.end_lineno == b.end_lineno && - a.col_offset == b.col_offset && - a.end_col_offset == b.end_col_offset; -} - #define LOC(x) SRC_LOCATION_FROM_AST(x) typedef _PyCfgJumpTargetLabel jump_target_label; @@ -129,46 +120,6 @@ static jump_target_label NO_LABEL = {-1}; RETURN_IF_ERROR(instr_sequence_use_label(INSTR_SEQUENCE(C), (LBL).id)) -static void -write_instr(_Py_CODEUNIT *codestr, cfg_instr *instruction, int ilen) -{ - int opcode = instruction->i_opcode; - assert(!IS_PSEUDO_OPCODE(opcode)); - int oparg = instruction->i_oparg; - assert(HAS_ARG(opcode) || oparg == 0); - int caches = _PyOpcode_Caches[opcode]; - switch (ilen - caches) { - case 4: - codestr->op.code = EXTENDED_ARG; - codestr->op.arg = (oparg >> 24) & 0xFF; - codestr++; - /* fall through */ - case 3: - codestr->op.code = EXTENDED_ARG; - codestr->op.arg = (oparg >> 16) & 0xFF; - codestr++; - /* fall through */ - case 2: - codestr->op.code = EXTENDED_ARG; - codestr->op.arg = (oparg >> 8) & 0xFF; - codestr++; - /* fall through */ - case 1: - codestr->op.code = opcode; - codestr->op.arg = oparg & 0xFF; - codestr++; - break; - default: - Py_UNREACHABLE(); - } - while (caches--) { - codestr->op.code = CACHE; - codestr->op.arg = 0; - codestr++; - } -} - - /* fblockinfo tracks the current frame block. A frame block is used to handle loops, try/except, and try/finally. @@ -198,21 +149,8 @@ enum { COMPILER_SCOPE_COMPREHENSION, }; -typedef struct { - int i_opcode; - int i_oparg; - location i_loc; -} instruction; - -typedef struct instr_sequence_ { - instruction *s_instrs; - int s_allocated; - int s_used; - - int *s_labelmap; /* label id --> instr offset */ - int s_labelmap_size; - int s_next_free_label; /* next free label id */ -} instr_sequence; +typedef _PyCompilerInstruction instruction; +typedef _PyCompile_InstructionSequence instr_sequence; #define INITIAL_INSTR_SEQUENCE_SIZE 100 #define INITIAL_INSTR_SEQUENCE_LABELS_MAP_SIZE 10 @@ -314,7 +252,6 @@ static int instr_sequence_addop(instr_sequence *seq, int opcode, int oparg, location loc) { assert(IS_WITHIN_OPCODE_RANGE(opcode)); - assert(!IS_ASSEMBLER_OPCODE(opcode)); assert(HAS_ARG(opcode) || HAS_TARGET(opcode) || oparg == 0); assert(0 <= oparg && oparg < (1 << 30)); @@ -432,32 +369,17 @@ instr_sequence_to_cfg(instr_sequence *seq, cfg_builder *g) { struct compiler_unit { PySTEntryObject *u_ste; - PyObject *u_name; - PyObject *u_qualname; /* dot-separated qualified name (lazy) */ int u_scope_type; - /* The following fields are dicts that map objects to - the index of them in co_XXX. The index is used as - the argument for opcodes that refer to those collections. - */ - PyObject *u_consts; /* all constants */ - PyObject *u_names; /* all names */ - PyObject *u_varnames; /* local variables */ - PyObject *u_cellvars; /* cell variables */ - PyObject *u_freevars; /* free variables */ PyObject *u_private; /* for private name mangling */ - Py_ssize_t u_argcount; /* number of arguments for block */ - Py_ssize_t u_posonlyargcount; /* number of positional only arguments for block */ - Py_ssize_t u_kwonlyargcount; /* number of keyword only arguments for block */ - instr_sequence u_instr_sequence; /* codegen output */ int u_nfblocks; struct fblockinfo u_fblock[CO_MAXBLOCKS]; - int u_firstlineno; /* the first lineno of the block */ + _PyCompile_CodeUnitMetadata u_metadata; }; /* This struct captures the global state of a compilation. @@ -566,7 +488,7 @@ static int compiler_match(struct compiler *, stmt_ty); static int compiler_pattern_subpattern(struct compiler *, pattern_ty, pattern_context *); -static PyCodeObject *assemble(struct compiler *, int addNone); +static PyCodeObject *optimize_and_assemble(struct compiler *, int addNone); #define CAPSULE_NAME "compile.c compiler unit" @@ -750,13 +672,13 @@ compiler_unit_free(struct compiler_unit *u) { instr_sequence_fini(&u->u_instr_sequence); Py_CLEAR(u->u_ste); - Py_CLEAR(u->u_name); - Py_CLEAR(u->u_qualname); - Py_CLEAR(u->u_consts); - Py_CLEAR(u->u_names); - Py_CLEAR(u->u_varnames); - Py_CLEAR(u->u_freevars); - Py_CLEAR(u->u_cellvars); + Py_CLEAR(u->u_metadata.u_name); + Py_CLEAR(u->u_metadata.u_qualname); + Py_CLEAR(u->u_metadata.u_consts); + Py_CLEAR(u->u_metadata.u_names); + Py_CLEAR(u->u_metadata.u_varnames); + Py_CLEAR(u->u_metadata.u_freevars); + Py_CLEAR(u->u_metadata.u_cellvars); Py_CLEAR(u->u_private); PyObject_Free(u); } @@ -783,8 +705,8 @@ compiler_set_qualname(struct compiler *c) if (u->u_scope_type == COMPILER_SCOPE_FUNCTION || u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION || u->u_scope_type == COMPILER_SCOPE_CLASS) { - assert(u->u_name); - mangled = _Py_Mangle(parent->u_private, u->u_name); + assert(u->u_metadata.u_name); + mangled = _Py_Mangle(parent->u_private, u->u_metadata.u_name); if (!mangled) { return ERROR; } @@ -802,14 +724,14 @@ compiler_set_qualname(struct compiler *c) || parent->u_scope_type == COMPILER_SCOPE_LAMBDA) { _Py_DECLARE_STR(dot_locals, "."); - base = PyUnicode_Concat(parent->u_qualname, + base = PyUnicode_Concat(parent->u_metadata.u_qualname, &_Py_STR(dot_locals)); if (base == NULL) { return ERROR; } } else { - base = Py_NewRef(parent->u_qualname); + base = Py_NewRef(parent->u_metadata.u_qualname); } } } @@ -821,15 +743,15 @@ compiler_set_qualname(struct compiler *c) if (name == NULL) { return ERROR; } - PyUnicode_Append(&name, u->u_name); + PyUnicode_Append(&name, u->u_metadata.u_name); if (name == NULL) { return ERROR; } } else { - name = Py_NewRef(u->u_name); + name = Py_NewRef(u->u_metadata.u_name); } - u->u_qualname = name; + u->u_metadata.u_qualname = name; return SUCCESS; } @@ -930,6 +852,7 @@ static int codegen_addop_noarg(instr_sequence *seq, int opcode, location loc) { assert(!HAS_ARG(opcode)); + assert(!IS_ASSEMBLER_OPCODE(opcode)); return instr_sequence_addop(seq, opcode, 0, loc); } @@ -1077,7 +1000,7 @@ compiler_add_const(PyObject *const_cache, struct compiler_unit *u, PyObject *o) return ERROR; } - Py_ssize_t arg = dict_add_o(u->u_consts, key); + Py_ssize_t arg = dict_add_o(u->u_metadata.u_consts, key); Py_DECREF(key); return arg; } @@ -1140,6 +1063,7 @@ codegen_addop_i(instr_sequence *seq, int opcode, Py_ssize_t oparg, location loc) EXTENDED_ARG is used for 16, 24, and 32-bit arguments. */ int oparg_ = Py_SAFE_DOWNCAST(oparg, Py_ssize_t, int); + assert(!IS_ASSEMBLER_OPCODE(opcode)); return instr_sequence_addop(seq, opcode, oparg_, loc); } @@ -1149,6 +1073,7 @@ codegen_addop_j(instr_sequence *seq, location loc, { assert(IS_LABEL(target)); assert(IS_JUMP_OPCODE(opcode) || IS_BLOCK_PUSH_OPCODE(opcode)); + assert(!IS_ASSEMBLER_OPCODE(opcode)); return instr_sequence_addop(seq, opcode, target.id, loc); } @@ -1180,7 +1105,7 @@ codegen_addop_j(instr_sequence *seq, location loc, #define ADDOP_N(C, LOC, OP, O, TYPE) { \ assert(!HAS_CONST(OP)); /* use ADDOP_LOAD_CONST_NEW */ \ - if (compiler_addop_o((C)->u, (LOC), (OP), (C)->u->u_ ## TYPE, (O)) < 0) { \ + if (compiler_addop_o((C)->u, (LOC), (OP), (C)->u->u_metadata.u_ ## TYPE, (O)) < 0) { \ Py_DECREF((O)); \ return ERROR; \ } \ @@ -1188,7 +1113,7 @@ codegen_addop_j(instr_sequence *seq, location loc, } #define ADDOP_NAME(C, LOC, OP, O, TYPE) \ - RETURN_IF_ERROR(compiler_addop_name((C)->u, (LOC), (OP), (C)->u->u_ ## TYPE, (O))) + RETURN_IF_ERROR(compiler_addop_name((C)->u, (LOC), (OP), (C)->u->u_metadata.u_ ## TYPE, (O))) #define ADDOP_I(C, LOC, OP, O) \ RETURN_IF_ERROR(codegen_addop_i(INSTR_SEQUENCE(C), (OP), (O), (LOC))) @@ -1265,18 +1190,18 @@ compiler_enter_scope(struct compiler *c, identifier name, return ERROR; } u->u_scope_type = scope_type; - u->u_argcount = 0; - u->u_posonlyargcount = 0; - u->u_kwonlyargcount = 0; + u->u_metadata.u_argcount = 0; + u->u_metadata.u_posonlyargcount = 0; + u->u_metadata.u_kwonlyargcount = 0; u->u_ste = PySymtable_Lookup(c->c_st, key); if (!u->u_ste) { compiler_unit_free(u); return ERROR; } - u->u_name = Py_NewRef(name); - u->u_varnames = list2dict(u->u_ste->ste_varnames); - u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0); - if (!u->u_varnames || !u->u_cellvars) { + u->u_metadata.u_name = Py_NewRef(name); + u->u_metadata.u_varnames = list2dict(u->u_ste->ste_varnames); + u->u_metadata.u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0); + if (!u->u_metadata.u_varnames || !u->u_metadata.u_cellvars) { compiler_unit_free(u); return ERROR; } @@ -1284,8 +1209,8 @@ compiler_enter_scope(struct compiler *c, identifier name, /* Cook up an implicit __class__ cell. */ int res; assert(u->u_scope_type == COMPILER_SCOPE_CLASS); - assert(PyDict_GET_SIZE(u->u_cellvars) == 0); - res = PyDict_SetItem(u->u_cellvars, &_Py_ID(__class__), + assert(PyDict_GET_SIZE(u->u_metadata.u_cellvars) == 0); + res = PyDict_SetItem(u->u_metadata.u_cellvars, &_Py_ID(__class__), _PyLong_GetZero()); if (res < 0) { compiler_unit_free(u); @@ -1293,22 +1218,22 @@ compiler_enter_scope(struct compiler *c, identifier name, } } - u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS, - PyDict_GET_SIZE(u->u_cellvars)); - if (!u->u_freevars) { + u->u_metadata.u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS, + PyDict_GET_SIZE(u->u_metadata.u_cellvars)); + if (!u->u_metadata.u_freevars) { compiler_unit_free(u); return ERROR; } u->u_nfblocks = 0; - u->u_firstlineno = lineno; - u->u_consts = PyDict_New(); - if (!u->u_consts) { + u->u_metadata.u_firstlineno = lineno; + u->u_metadata.u_consts = PyDict_New(); + if (!u->u_metadata.u_consts) { compiler_unit_free(u); return ERROR; } - u->u_names = PyDict_New(); - if (!u->u_names) { + u->u_metadata.u_names = PyDict_New(); + if (!u->u_metadata.u_names) { compiler_unit_free(u); return ERROR; } @@ -1667,7 +1592,7 @@ compiler_body(struct compiler *c, location loc, asdl_stmt_seq *stmts) /* Set current line number to the line number of first statement. This way line number for SETUP_ANNOTATIONS will always coincide with the line number of first "real" statement in module. - If body is empty, then lineno will be set later in assemble. */ + If body is empty, then lineno will be set later in optimize_and_assemble. */ if (c->u->u_scope_type == COMPILER_SCOPE_MODULE && asdl_seq_LEN(stmts)) { st = (stmt_ty)asdl_seq_GET(stmts, 0); loc = LOC(st); @@ -1738,7 +1663,7 @@ compiler_mod(struct compiler *c, mod_ty mod) if (compiler_codegen(c, mod) < 0) { return NULL; } - PyCodeObject *co = assemble(c, addNone); + PyCodeObject *co = optimize_and_assemble(c, addNone); compiler_exit_scope(c); return co; } @@ -1762,8 +1687,8 @@ get_ref_type(struct compiler *c, PyObject *name) "unknown scope in unit %S (%R); " "symbols: %R; locals: %R; globals: %R", name, - c->u->u_name, c->u->u_ste->ste_id, - c->u->u_ste->ste_symbols, c->u->u_varnames, c->u->u_names); + c->u->u_metadata.u_name, c->u->u_ste->ste_id, + c->u->u_ste->ste_symbols, c->u->u_metadata.u_varnames, c->u->u_metadata.u_names); return ERROR; } return scope; @@ -1803,10 +1728,10 @@ compiler_make_closure(struct compiler *c, location loc, } int arg; if (reftype == CELL) { - arg = compiler_lookup_arg(c->u->u_cellvars, name); + arg = compiler_lookup_arg(c->u->u_metadata.u_cellvars, name); } else { - arg = compiler_lookup_arg(c->u->u_freevars, name); + arg = compiler_lookup_arg(c->u->u_metadata.u_freevars, name); } if (arg == -1) { PyObject *freevars = _PyCode_GetFreevars(co); @@ -1818,7 +1743,7 @@ compiler_make_closure(struct compiler *c, location loc, "freevars of code %S: %R", name, reftype, - c->u->u_name, + c->u->u_metadata.u_name, co->co_name, freevars); Py_DECREF(freevars); @@ -2187,9 +2112,9 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async) return ERROR; } - c->u->u_argcount = asdl_seq_LEN(args->args); - c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs); - c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs); + c->u->u_metadata.u_argcount = asdl_seq_LEN(args->args); + c->u->u_metadata.u_posonlyargcount = asdl_seq_LEN(args->posonlyargs); + c->u->u_metadata.u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs); for (i = docstring ? 1 : 0; i < asdl_seq_LEN(body); i++) { VISIT_IN_SCOPE(c, stmt, (stmt_ty)asdl_seq_GET(body, i)); } @@ -2199,7 +2124,7 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async) return ERROR; } } - co = assemble(c, 1); + co = optimize_and_assemble(c, 1); compiler_exit_scope(c); if (co == NULL) { Py_XDECREF(co); @@ -2259,8 +2184,8 @@ compiler_class(struct compiler *c, stmt_ty s) compiler_exit_scope(c); return ERROR; } - assert(c->u->u_qualname); - ADDOP_LOAD_CONST(c, loc, c->u->u_qualname); + assert(c->u->u_metadata.u_qualname); + ADDOP_LOAD_CONST(c, loc, c->u->u_metadata.u_qualname); if (compiler_nameop(c, loc, &_Py_ID(__qualname__), Store) < 0) { compiler_exit_scope(c); return ERROR; @@ -2274,7 +2199,7 @@ compiler_class(struct compiler *c, stmt_ty s) /* Return __classcell__ if it is referenced, otherwise return None */ if (c->u->u_ste->ste_needs_class_closure) { /* Store __classcell__ into class namespace & return it */ - i = compiler_lookup_arg(c->u->u_cellvars, &_Py_ID(__class__)); + i = compiler_lookup_arg(c->u->u_metadata.u_cellvars, &_Py_ID(__class__)); if (i < 0) { compiler_exit_scope(c); return ERROR; @@ -2289,12 +2214,12 @@ compiler_class(struct compiler *c, stmt_ty s) } else { /* No methods referenced __class__, so just return None */ - assert(PyDict_GET_SIZE(c->u->u_cellvars) == 0); + assert(PyDict_GET_SIZE(c->u->u_metadata.u_cellvars) == 0); ADDOP_LOAD_CONST(c, NO_LOCATION, Py_None); } ADDOP_IN_SCOPE(c, NO_LOCATION, RETURN_VALUE); /* create the code object */ - co = assemble(c, 1); + co = optimize_and_assemble(c, 1); } /* leave the new scope */ compiler_exit_scope(c); @@ -2561,17 +2486,17 @@ compiler_lambda(struct compiler *c, expr_ty e) docstring. */ RETURN_IF_ERROR(compiler_add_const(c->c_const_cache, c->u, Py_None)); - c->u->u_argcount = asdl_seq_LEN(args->args); - c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs); - c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs); + c->u->u_metadata.u_argcount = asdl_seq_LEN(args->args); + c->u->u_metadata.u_posonlyargcount = asdl_seq_LEN(args->posonlyargs); + c->u->u_metadata.u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs); VISIT_IN_SCOPE(c, expr, e->v.Lambda.body); if (c->u->u_ste->ste_generator) { - co = assemble(c, 0); + co = optimize_and_assemble(c, 0); } else { location loc = LOCATION(e->lineno, e->lineno, 0, 0); ADDOP_IN_SCOPE(c, loc, RETURN_VALUE); - co = assemble(c, 1); + co = optimize_and_assemble(c, 1); } compiler_exit_scope(c); if (co == NULL) { @@ -3717,7 +3642,7 @@ compiler_nameop(struct compiler *c, location loc, Py_ssize_t arg; enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype; - PyObject *dict = c->u->u_names; + PyObject *dict = c->u->u_metadata.u_names; PyObject *mangled; assert(!_PyUnicode_EqualToASCIIString(name, "None") && @@ -3738,11 +3663,11 @@ compiler_nameop(struct compiler *c, location loc, scope = _PyST_GetScope(c->u->u_ste, mangled); switch (scope) { case FREE: - dict = c->u->u_freevars; + dict = c->u->u_metadata.u_freevars; optype = OP_DEREF; break; case CELL: - dict = c->u->u_cellvars; + dict = c->u->u_metadata.u_cellvars; optype = OP_DEREF; break; case LOCAL: @@ -4708,7 +4633,7 @@ compiler_sync_comprehension_generator(struct compiler *c, location loc, if (gen_index == 0) { /* Receive outermost iter as an implicit argument */ - c->u->u_argcount = 1; + c->u->u_metadata.u_argcount = 1; ADDOP_I(c, loc, LOAD_FAST, 0); } else { @@ -4821,7 +4746,7 @@ compiler_async_comprehension_generator(struct compiler *c, location loc, if (gen_index == 0) { /* Receive outermost iter as an implicit argument */ - c->u->u_argcount = 1; + c->u->u_metadata.u_argcount = 1; ADDOP_I(c, loc, LOAD_FAST, 0); } else { @@ -4969,7 +4894,7 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, } } - co = assemble(c, 1); + co = optimize_and_assemble(c, 1); compiler_exit_scope(c); if (is_top_level_await && is_async_generator){ c->u->u_ste->ste_coroutine = 1; @@ -6592,378 +6517,6 @@ compiler_match(struct compiler *c, stmt_ty s) #undef WILDCARD_CHECK #undef WILDCARD_STAR_CHECK - -/* End of the compiler section, beginning of the assembler section */ - - -struct assembler { - PyObject *a_bytecode; /* bytes containing bytecode */ - int a_offset; /* offset into bytecode */ - PyObject *a_except_table; /* bytes containing exception table */ - int a_except_table_off; /* offset into exception table */ - /* Location Info */ - int a_lineno; /* lineno of last emitted instruction */ - PyObject* a_linetable; /* bytes containing location info */ - int a_location_off; /* offset of last written location info frame */ -}; - -static int -assemble_init(struct assembler *a, int firstlineno) -{ - memset(a, 0, sizeof(struct assembler)); - a->a_lineno = firstlineno; - a->a_linetable = NULL; - a->a_location_off = 0; - a->a_except_table = NULL; - a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE); - if (a->a_bytecode == NULL) { - goto error; - } - a->a_linetable = PyBytes_FromStringAndSize(NULL, DEFAULT_CNOTAB_SIZE); - if (a->a_linetable == NULL) { - goto error; - } - a->a_except_table = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE); - if (a->a_except_table == NULL) { - goto error; - } - return SUCCESS; -error: - Py_XDECREF(a->a_bytecode); - Py_XDECREF(a->a_linetable); - Py_XDECREF(a->a_except_table); - return ERROR; -} - -static void -assemble_free(struct assembler *a) -{ - Py_XDECREF(a->a_bytecode); - Py_XDECREF(a->a_linetable); - Py_XDECREF(a->a_except_table); -} - -static inline void -write_except_byte(struct assembler *a, int byte) { - unsigned char *p = (unsigned char *) PyBytes_AS_STRING(a->a_except_table); - p[a->a_except_table_off++] = byte; -} - -#define CONTINUATION_BIT 64 - -static void -assemble_emit_exception_table_item(struct assembler *a, int value, int msb) -{ - assert ((msb | 128) == 128); - assert(value >= 0 && value < (1 << 30)); - if (value >= 1 << 24) { - write_except_byte(a, (value >> 24) | CONTINUATION_BIT | msb); - msb = 0; - } - if (value >= 1 << 18) { - write_except_byte(a, ((value >> 18)&0x3f) | CONTINUATION_BIT | msb); - msb = 0; - } - if (value >= 1 << 12) { - write_except_byte(a, ((value >> 12)&0x3f) | CONTINUATION_BIT | msb); - msb = 0; - } - if (value >= 1 << 6) { - write_except_byte(a, ((value >> 6)&0x3f) | CONTINUATION_BIT | msb); - msb = 0; - } - write_except_byte(a, (value&0x3f) | msb); -} - -/* See Objects/exception_handling_notes.txt for details of layout */ -#define MAX_SIZE_OF_ENTRY 20 - -static int -assemble_emit_exception_table_entry(struct assembler *a, int start, int end, basicblock *handler) -{ - Py_ssize_t len = PyBytes_GET_SIZE(a->a_except_table); - if (a->a_except_table_off + MAX_SIZE_OF_ENTRY >= len) { - RETURN_IF_ERROR(_PyBytes_Resize(&a->a_except_table, len * 2)); - } - int size = end-start; - assert(end > start); - int target = handler->b_offset; - int depth = handler->b_startdepth - 1; - if (handler->b_preserve_lasti) { - depth -= 1; - } - assert(depth >= 0); - int depth_lasti = (depth<<1) | handler->b_preserve_lasti; - assemble_emit_exception_table_item(a, start, (1<<7)); - assemble_emit_exception_table_item(a, size, 0); - assemble_emit_exception_table_item(a, target, 0); - assemble_emit_exception_table_item(a, depth_lasti, 0); - return SUCCESS; -} - -static int -assemble_exception_table(struct assembler *a, basicblock *entryblock) -{ - basicblock *b; - int ioffset = 0; - basicblock *handler = NULL; - int start = -1; - for (b = entryblock; b != NULL; b = b->b_next) { - ioffset = b->b_offset; - for (int i = 0; i < b->b_iused; i++) { - cfg_instr *instr = &b->b_instr[i]; - if (instr->i_except != handler) { - if (handler != NULL) { - RETURN_IF_ERROR( - assemble_emit_exception_table_entry(a, start, ioffset, handler)); - } - start = ioffset; - handler = instr->i_except; - } - ioffset += _PyCfg_InstrSize(instr); - } - } - if (handler != NULL) { - RETURN_IF_ERROR(assemble_emit_exception_table_entry(a, start, ioffset, handler)); - } - return SUCCESS; -} - -/* Code location emitting code. See locations.md for a description of the format. */ - -#define MSB 0x80 - -static void -write_location_byte(struct assembler* a, int val) -{ - PyBytes_AS_STRING(a->a_linetable)[a->a_location_off] = val&255; - a->a_location_off++; -} - - -static uint8_t * -location_pointer(struct assembler* a) -{ - return (uint8_t *)PyBytes_AS_STRING(a->a_linetable) + - a->a_location_off; -} - -static void -write_location_first_byte(struct assembler* a, int code, int length) -{ - a->a_location_off += write_location_entry_start( - location_pointer(a), code, length); -} - -static void -write_location_varint(struct assembler* a, unsigned int val) -{ - uint8_t *ptr = location_pointer(a); - a->a_location_off += write_varint(ptr, val); -} - - -static void -write_location_signed_varint(struct assembler* a, int val) -{ - uint8_t *ptr = location_pointer(a); - a->a_location_off += write_signed_varint(ptr, val); -} - -static void -write_location_info_short_form(struct assembler* a, int length, int column, int end_column) -{ - assert(length > 0 && length <= 8); - int column_low_bits = column & 7; - int column_group = column >> 3; - assert(column < 80); - assert(end_column >= column); - assert(end_column - column < 16); - write_location_first_byte(a, PY_CODE_LOCATION_INFO_SHORT0 + column_group, length); - write_location_byte(a, (column_low_bits << 4) | (end_column - column)); -} - -static void -write_location_info_oneline_form(struct assembler* a, int length, int line_delta, int column, int end_column) -{ - assert(length > 0 && length <= 8); - assert(line_delta >= 0 && line_delta < 3); - assert(column < 128); - assert(end_column < 128); - write_location_first_byte(a, PY_CODE_LOCATION_INFO_ONE_LINE0 + line_delta, length); - write_location_byte(a, column); - write_location_byte(a, end_column); -} - -static void -write_location_info_long_form(struct assembler* a, location loc, int length) -{ - assert(length > 0 && length <= 8); - write_location_first_byte(a, PY_CODE_LOCATION_INFO_LONG, length); - write_location_signed_varint(a, loc.lineno - a->a_lineno); - assert(loc.end_lineno >= loc.lineno); - write_location_varint(a, loc.end_lineno - loc.lineno); - write_location_varint(a, loc.col_offset + 1); - write_location_varint(a, loc.end_col_offset + 1); -} - -static void -write_location_info_none(struct assembler* a, int length) -{ - write_location_first_byte(a, PY_CODE_LOCATION_INFO_NONE, length); -} - -static void -write_location_info_no_column(struct assembler* a, int length, int line_delta) -{ - write_location_first_byte(a, PY_CODE_LOCATION_INFO_NO_COLUMNS, length); - write_location_signed_varint(a, line_delta); -} - -#define THEORETICAL_MAX_ENTRY_SIZE 25 /* 1 + 6 + 6 + 6 + 6 */ - -static int -write_location_info_entry(struct assembler* a, location loc, int isize) -{ - Py_ssize_t len = PyBytes_GET_SIZE(a->a_linetable); - if (a->a_location_off + THEORETICAL_MAX_ENTRY_SIZE >= len) { - assert(len > THEORETICAL_MAX_ENTRY_SIZE); - RETURN_IF_ERROR(_PyBytes_Resize(&a->a_linetable, len*2)); - } - if (loc.lineno < 0) { - write_location_info_none(a, isize); - return SUCCESS; - } - int line_delta = loc.lineno - a->a_lineno; - int column = loc.col_offset; - int end_column = loc.end_col_offset; - assert(column >= -1); - assert(end_column >= -1); - if (column < 0 || end_column < 0) { - if (loc.end_lineno == loc.lineno || loc.end_lineno == -1) { - write_location_info_no_column(a, isize, line_delta); - a->a_lineno = loc.lineno; - return SUCCESS; - } - } - else if (loc.end_lineno == loc.lineno) { - if (line_delta == 0 && column < 80 && end_column - column < 16 && end_column >= column) { - write_location_info_short_form(a, isize, column, end_column); - return SUCCESS; - } - if (line_delta >= 0 && line_delta < 3 && column < 128 && end_column < 128) { - write_location_info_oneline_form(a, isize, line_delta, column, end_column); - a->a_lineno = loc.lineno; - return SUCCESS; - } - } - write_location_info_long_form(a, loc, isize); - a->a_lineno = loc.lineno; - return SUCCESS; -} - -static int -assemble_emit_location(struct assembler* a, location loc, int isize) -{ - if (isize == 0) { - return SUCCESS; - } - while (isize > 8) { - RETURN_IF_ERROR(write_location_info_entry(a, loc, 8)); - isize -= 8; - } - return write_location_info_entry(a, loc, isize); -} - -static int -assemble_location_info(struct assembler *a, basicblock *entryblock, int firstlineno) -{ - a->a_lineno = firstlineno; - location loc = NO_LOCATION; - int size = 0; - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - for (int j = 0; j < b->b_iused; j++) { - if (!same_location(loc, b->b_instr[j].i_loc)) { - RETURN_IF_ERROR(assemble_emit_location(a, loc, size)); - loc = b->b_instr[j].i_loc; - size = 0; - } - size += _PyCfg_InstrSize(&b->b_instr[j]); - } - } - RETURN_IF_ERROR(assemble_emit_location(a, loc, size)); - return SUCCESS; -} - -/* assemble_emit_instr() - Extend the bytecode with a new instruction. - Update lnotab if necessary. -*/ - -static int -assemble_emit_instr(struct assembler *a, cfg_instr *i) -{ - Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode); - _Py_CODEUNIT *code; - - int size = _PyCfg_InstrSize(i); - if (a->a_offset + size >= len / (int)sizeof(_Py_CODEUNIT)) { - if (len > PY_SSIZE_T_MAX / 2) { - return ERROR; - } - RETURN_IF_ERROR(_PyBytes_Resize(&a->a_bytecode, len * 2)); - } - code = (_Py_CODEUNIT *)PyBytes_AS_STRING(a->a_bytecode) + a->a_offset; - a->a_offset += size; - write_instr(code, i, size); - return SUCCESS; -} - -static int -assemble_emit(struct assembler *a, basicblock *entryblock, int first_lineno, - PyObject *const_cache) -{ - RETURN_IF_ERROR(assemble_init(a, first_lineno)); - - for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - for (int j = 0; j < b->b_iused; j++) { - RETURN_IF_ERROR(assemble_emit_instr(a, &b->b_instr[j])); - } - } - - RETURN_IF_ERROR(assemble_location_info(a, entryblock, a->a_lineno)); - - RETURN_IF_ERROR(assemble_exception_table(a, entryblock)); - - RETURN_IF_ERROR(_PyBytes_Resize(&a->a_except_table, a->a_except_table_off)); - RETURN_IF_ERROR(_PyCompile_ConstCacheMergeOne(const_cache, &a->a_except_table)); - - RETURN_IF_ERROR(_PyBytes_Resize(&a->a_linetable, a->a_location_off)); - RETURN_IF_ERROR(_PyCompile_ConstCacheMergeOne(const_cache, &a->a_linetable)); - - RETURN_IF_ERROR(_PyBytes_Resize(&a->a_bytecode, a->a_offset * sizeof(_Py_CODEUNIT))); - RETURN_IF_ERROR(_PyCompile_ConstCacheMergeOne(const_cache, &a->a_bytecode)); - return SUCCESS; -} - -static PyObject * -dict_keys_inorder(PyObject *dict, Py_ssize_t offset) -{ - PyObject *tuple, *k, *v; - Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict); - - tuple = PyTuple_New(size); - if (tuple == NULL) - return NULL; - while (PyDict_Next(dict, &pos, &k, &v)) { - i = PyLong_AS_LONG(v); - assert((i - offset) < size); - assert((i - offset) >= 0); - PyTuple_SET_ITEM(tuple, i - offset, Py_NewRef(k)); - } - return tuple; -} - static PyObject * consts_dict_keys_inorder(PyObject *dict) { @@ -7051,153 +6604,13 @@ _PyCompile_ConstCacheMergeOne(PyObject *const_cache, PyObject **obj) return SUCCESS; } -// This is in codeobject.c. -extern void _Py_set_localsplus_info(int, PyObject *, unsigned char, - PyObject *, PyObject *); - -static void -compute_localsplus_info(struct compiler_unit *u, int nlocalsplus, - PyObject *names, PyObject *kinds) -{ - PyObject *k, *v; - Py_ssize_t pos = 0; - while (PyDict_Next(u->u_varnames, &pos, &k, &v)) { - int offset = (int)PyLong_AS_LONG(v); - assert(offset >= 0); - assert(offset < nlocalsplus); - // For now we do not distinguish arg kinds. - _PyLocals_Kind kind = CO_FAST_LOCAL; - if (PyDict_GetItem(u->u_cellvars, k) != NULL) { - kind |= CO_FAST_CELL; - } - _Py_set_localsplus_info(offset, k, kind, names, kinds); - } - int nlocals = (int)PyDict_GET_SIZE(u->u_varnames); - - // This counter mirrors the fix done in fix_cell_offsets(). - int numdropped = 0; - pos = 0; - while (PyDict_Next(u->u_cellvars, &pos, &k, &v)) { - if (PyDict_GetItem(u->u_varnames, k) != NULL) { - // Skip cells that are already covered by locals. - numdropped += 1; - continue; - } - int offset = (int)PyLong_AS_LONG(v); - assert(offset >= 0); - offset += nlocals - numdropped; - assert(offset < nlocalsplus); - _Py_set_localsplus_info(offset, k, CO_FAST_CELL, names, kinds); - } - - pos = 0; - while (PyDict_Next(u->u_freevars, &pos, &k, &v)) { - int offset = (int)PyLong_AS_LONG(v); - assert(offset >= 0); - offset += nlocals - numdropped; - assert(offset < nlocalsplus); - _Py_set_localsplus_info(offset, k, CO_FAST_FREE, names, kinds); - } -} - -static PyCodeObject * -makecode(struct compiler_unit *u, struct assembler *a, PyObject *const_cache, - PyObject *constslist, int maxdepth, int nlocalsplus, int code_flags, - PyObject *filename) -{ - PyCodeObject *co = NULL; - PyObject *names = NULL; - PyObject *consts = NULL; - PyObject *localsplusnames = NULL; - PyObject *localspluskinds = NULL; - names = dict_keys_inorder(u->u_names, 0); - if (!names) { - goto error; - } - if (_PyCompile_ConstCacheMergeOne(const_cache, &names) < 0) { - goto error; - } - - consts = PyList_AsTuple(constslist); /* PyCode_New requires a tuple */ - if (consts == NULL) { - goto error; - } - if (_PyCompile_ConstCacheMergeOne(const_cache, &consts) < 0) { - goto error; - } - - assert(u->u_posonlyargcount < INT_MAX); - assert(u->u_argcount < INT_MAX); - assert(u->u_kwonlyargcount < INT_MAX); - int posonlyargcount = (int)u->u_posonlyargcount; - int posorkwargcount = (int)u->u_argcount; - assert(INT_MAX - posonlyargcount - posorkwargcount > 0); - int kwonlyargcount = (int)u->u_kwonlyargcount; - - localsplusnames = PyTuple_New(nlocalsplus); - if (localsplusnames == NULL) { - goto error; - } - localspluskinds = PyBytes_FromStringAndSize(NULL, nlocalsplus); - if (localspluskinds == NULL) { - goto error; - } - compute_localsplus_info(u, nlocalsplus, localsplusnames, localspluskinds); - - struct _PyCodeConstructor con = { - .filename = filename, - .name = u->u_name, - .qualname = u->u_qualname ? u->u_qualname : u->u_name, - .flags = code_flags, - - .code = a->a_bytecode, - .firstlineno = u->u_firstlineno, - .linetable = a->a_linetable, - - .consts = consts, - .names = names, - - .localsplusnames = localsplusnames, - .localspluskinds = localspluskinds, - - .argcount = posonlyargcount + posorkwargcount, - .posonlyargcount = posonlyargcount, - .kwonlyargcount = kwonlyargcount, - - .stacksize = maxdepth, - - .exceptiontable = a->a_except_table, - }; - - if (_PyCode_Validate(&con) < 0) { - goto error; - } - - if (_PyCompile_ConstCacheMergeOne(const_cache, &localsplusnames) < 0) { - goto error; - } - con.localsplusnames = localsplusnames; - - co = _PyCode_New(&con); - if (co == NULL) { - goto error; - } - - error: - Py_XDECREF(names); - Py_XDECREF(consts); - Py_XDECREF(localsplusnames); - Py_XDECREF(localspluskinds); - return co; -} - static int * build_cellfixedoffsets(struct compiler_unit *u) { - int nlocals = (int)PyDict_GET_SIZE(u->u_varnames); - int ncellvars = (int)PyDict_GET_SIZE(u->u_cellvars); - int nfreevars = (int)PyDict_GET_SIZE(u->u_freevars); + int nlocals = (int)PyDict_GET_SIZE(u->u_metadata.u_varnames); + int ncellvars = (int)PyDict_GET_SIZE(u->u_metadata.u_cellvars); + int nfreevars = (int)PyDict_GET_SIZE(u->u_metadata.u_freevars); int noffsets = ncellvars + nfreevars; int *fixed = PyMem_New(int, noffsets); @@ -7211,8 +6624,8 @@ build_cellfixedoffsets(struct compiler_unit *u) PyObject *varname, *cellindex; Py_ssize_t pos = 0; - while (PyDict_Next(u->u_cellvars, &pos, &varname, &cellindex)) { - PyObject *varindex = PyDict_GetItem(u->u_varnames, varname); + while (PyDict_Next(u->u_metadata.u_cellvars, &pos, &varname, &cellindex)) { + PyObject *varindex = PyDict_GetItem(u->u_metadata.u_varnames, varname); if (varindex != NULL) { assert(PyLong_AS_LONG(cellindex) < INT_MAX); assert(PyLong_AS_LONG(varindex) < INT_MAX); @@ -7229,14 +6642,14 @@ static int insert_prefix_instructions(struct compiler_unit *u, basicblock *entryblock, int *fixed, int nfreevars, int code_flags) { - assert(u->u_firstlineno > 0); + assert(u->u_metadata.u_firstlineno > 0); /* Add the generator prefix instructions. */ if (code_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) { cfg_instr make_gen = { .i_opcode = RETURN_GENERATOR, .i_oparg = 0, - .i_loc = LOCATION(u->u_firstlineno, u->u_firstlineno, -1, -1), + .i_loc = LOCATION(u->u_metadata.u_firstlineno, u->u_metadata.u_firstlineno, -1, -1), .i_target = NULL, }; RETURN_IF_ERROR(_PyBasicblock_InsertInstruction(entryblock, 0, &make_gen)); @@ -7250,12 +6663,12 @@ insert_prefix_instructions(struct compiler_unit *u, basicblock *entryblock, } /* Set up cells for any variable that escapes, to be put in a closure. */ - const int ncellvars = (int)PyDict_GET_SIZE(u->u_cellvars); + const int ncellvars = (int)PyDict_GET_SIZE(u->u_metadata.u_cellvars); if (ncellvars) { - // u->u_cellvars has the cells out of order so we sort them + // u->u_metadata.u_cellvars has the cells out of order so we sort them // before adding the MAKE_CELL instructions. Note that we // adjust for arg cells, which come first. - const int nvars = ncellvars + (int)PyDict_GET_SIZE(u->u_varnames); + const int nvars = ncellvars + (int)PyDict_GET_SIZE(u->u_metadata.u_varnames); int *sorted = PyMem_RawCalloc(nvars, sizeof(int)); if (sorted == NULL) { PyErr_NoMemory(); @@ -7298,9 +6711,9 @@ insert_prefix_instructions(struct compiler_unit *u, basicblock *entryblock, static int fix_cell_offsets(struct compiler_unit *u, basicblock *entryblock, int *fixedmap) { - int nlocals = (int)PyDict_GET_SIZE(u->u_varnames); - int ncellvars = (int)PyDict_GET_SIZE(u->u_cellvars); - int nfreevars = (int)PyDict_GET_SIZE(u->u_freevars); + int nlocals = (int)PyDict_GET_SIZE(u->u_metadata.u_varnames); + int ncellvars = (int)PyDict_GET_SIZE(u->u_metadata.u_cellvars); + int nfreevars = (int)PyDict_GET_SIZE(u->u_metadata.u_freevars); int noffsets = ncellvars + nfreevars; // First deal with duplicates (arg cells). @@ -7344,12 +6757,12 @@ fix_cell_offsets(struct compiler_unit *u, basicblock *entryblock, int *fixedmap) static int prepare_localsplus(struct compiler_unit* u, cfg_builder *g, int code_flags) { - assert(PyDict_GET_SIZE(u->u_varnames) < INT_MAX); - assert(PyDict_GET_SIZE(u->u_cellvars) < INT_MAX); - assert(PyDict_GET_SIZE(u->u_freevars) < INT_MAX); - int nlocals = (int)PyDict_GET_SIZE(u->u_varnames); - int ncellvars = (int)PyDict_GET_SIZE(u->u_cellvars); - int nfreevars = (int)PyDict_GET_SIZE(u->u_freevars); + assert(PyDict_GET_SIZE(u->u_metadata.u_varnames) < INT_MAX); + assert(PyDict_GET_SIZE(u->u_metadata.u_cellvars) < INT_MAX); + assert(PyDict_GET_SIZE(u->u_metadata.u_freevars) < INT_MAX); + int nlocals = (int)PyDict_GET_SIZE(u->u_metadata.u_varnames); + int ncellvars = (int)PyDict_GET_SIZE(u->u_metadata.u_cellvars); + int nfreevars = (int)PyDict_GET_SIZE(u->u_metadata.u_freevars); assert(INT_MAX - nlocals - ncellvars > 0); assert(INT_MAX - nlocals - ncellvars - nfreevars > 0); int nlocalsplus = nlocals + ncellvars + nfreevars; @@ -7389,13 +6802,17 @@ add_return_at_end(struct compiler *c, int addNone) return SUCCESS; } +static int cfg_to_instr_sequence(cfg_builder *g, instr_sequence *seq); static PyCodeObject * -assemble_code_unit(struct compiler_unit *u, PyObject *const_cache, +optimize_and_assemble_code_unit(struct compiler_unit *u, PyObject *const_cache, int code_flags, PyObject *filename) { + instr_sequence optimized_instrs; + memset(&optimized_instrs, 0, sizeof(instr_sequence)); + PyCodeObject *co = NULL; - PyObject *consts = consts_dict_keys_inorder(u->u_consts); + PyObject *consts = consts_dict_keys_inorder(u->u_metadata.u_consts); if (consts == NULL) { goto error; } @@ -7404,25 +6821,18 @@ assemble_code_unit(struct compiler_unit *u, PyObject *const_cache, goto error; } int nparams = (int)PyList_GET_SIZE(u->u_ste->ste_varnames); - int nlocals = (int)PyDict_GET_SIZE(u->u_varnames); - if (_PyCfg_OptimizeCodeUnit(&g, consts, const_cache, code_flags, nlocals, nparams) < 0) { + int nlocals = (int)PyDict_GET_SIZE(u->u_metadata.u_varnames); + assert(u->u_metadata.u_firstlineno); + if (_PyCfg_OptimizeCodeUnit(&g, consts, const_cache, code_flags, nlocals, + nparams, u->u_metadata.u_firstlineno) < 0) { goto error; } - /** Assembly **/ - /* Set firstlineno if it wasn't explicitly set. */ - if (!u->u_firstlineno) { - if (g.g_entryblock->b_instr && g.g_entryblock->b_instr->i_loc.lineno) { - u->u_firstlineno = g.g_entryblock->b_instr->i_loc.lineno; - } - else { - u->u_firstlineno = 1; - } - } - if (_PyCfg_ResolveLineNumbers(&g, u->u_firstlineno) < 0) { + if (cfg_to_instr_sequence(&g, &optimized_instrs) < 0) { goto error; } + /** Assembly **/ int nlocalsplus = prepare_localsplus(u, &g, code_flags); if (nlocalsplus < 0) { goto error; @@ -7432,7 +6842,6 @@ assemble_code_unit(struct compiler_unit *u, PyObject *const_cache, if (maxdepth < 0) { goto error; } - /* TO DO -- For 3.12, make sure that `maxdepth <= MAX_ALLOWED_STACK_USE` */ _PyCfg_ConvertExceptionHandlersToNops(g.g_entryblock); @@ -7441,25 +6850,26 @@ assemble_code_unit(struct compiler_unit *u, PyObject *const_cache, if (_PyCfg_ResolveJumps(&g) < 0) { goto error; } + if (cfg_to_instr_sequence(&g, &optimized_instrs) < 0) { + goto error; + } + /* Can't modify the bytecode after computing jump offsets. */ - struct assembler a; - int res = assemble_emit(&a, g.g_entryblock, u->u_firstlineno, const_cache); - if (res == SUCCESS) { - co = makecode(u, &a, const_cache, consts, maxdepth, nlocalsplus, - code_flags, filename); - } - assemble_free(&a); + co = _PyAssemble_MakeCodeObject(&u->u_metadata, const_cache, consts, + maxdepth, g.g_entryblock, nlocalsplus, + code_flags, filename); error: Py_XDECREF(consts); + instr_sequence_fini(&optimized_instrs); _PyCfgBuilder_Fini(&g); return co; } static PyCodeObject * -assemble(struct compiler *c, int addNone) +optimize_and_assemble(struct compiler *c, int addNone) { struct compiler_unit *u = c->u; PyObject *const_cache = c->c_const_cache; @@ -7474,9 +6884,32 @@ assemble(struct compiler *c, int addNone) return NULL; } - return assemble_code_unit(u, const_cache, code_flags, filename); + return optimize_and_assemble_code_unit(u, const_cache, code_flags, filename); } +static int +cfg_to_instr_sequence(cfg_builder *g, instr_sequence *seq) +{ + int lbl = 0; + for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { + b->b_label = (jump_target_label){lbl}; + lbl += b->b_iused; + } + for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { + RETURN_IF_ERROR(instr_sequence_use_label(seq, b->b_label.id)); + for (int i = 0; i < b->b_iused; i++) { + cfg_instr *instr = &b->b_instr[i]; + int arg = HAS_TARGET(instr->i_opcode) ? + instr->i_target->b_label.id : + instr->i_oparg; + RETURN_IF_ERROR( + instr_sequence_addop(seq, instr->i_opcode, arg, instr->i_loc)); + } + } + return SUCCESS; +} + + /* Access to compiler optimizations for unit tests. * * _PyCompile_CodeGen takes and AST, applies code-gen and @@ -7492,7 +6925,7 @@ assemble(struct compiler *c, int addNone) */ static int -instructions_to_cfg(PyObject *instructions, cfg_builder *g) +instructions_to_instr_sequence(PyObject *instructions, instr_sequence *seq) { assert(PyList_Check(instructions)); @@ -7526,8 +6959,7 @@ instructions_to_cfg(PyObject *instructions, cfg_builder *g) for (int i = 0; i < num_insts; i++) { if (is_target[i]) { - jump_target_label lbl = {i}; - RETURN_IF_ERROR(_PyCfgBuilder_UseLabel(g, lbl)); + RETURN_IF_ERROR(instr_sequence_use_label(seq, i)); } PyObject *item = PyList_GET_ITEM(instructions, i); if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 6) { @@ -7565,11 +6997,10 @@ instructions_to_cfg(PyObject *instructions, cfg_builder *g) if (PyErr_Occurred()) { goto error; } - RETURN_IF_ERROR(_PyCfgBuilder_Addop(g, opcode, oparg, loc)); + RETURN_IF_ERROR(instr_sequence_addop(seq, opcode, oparg, loc)); } - cfg_instr *last = _PyCfg_BasicblockLastInstr(g->g_curblock); - if (last && !IS_TERMINATOR_OPCODE(last->i_opcode)) { - RETURN_IF_ERROR(_PyCfgBuilder_Addop(g, RETURN_VALUE, 0, NO_LOCATION)); + if (seq->s_used && !IS_TERMINATOR_OPCODE(seq->s_instrs[seq->s_used-1].i_opcode)) { + RETURN_IF_ERROR(instr_sequence_addop(seq, RETURN_VALUE, 0, NO_LOCATION)); } PyMem_Free(is_target); return SUCCESS; @@ -7578,8 +7009,23 @@ instructions_to_cfg(PyObject *instructions, cfg_builder *g) return ERROR; } +static int +instructions_to_cfg(PyObject *instructions, cfg_builder *g) +{ + instr_sequence seq; + memset(&seq, 0, sizeof(instr_sequence)); + + RETURN_IF_ERROR( + instructions_to_instr_sequence(instructions, &seq)); + + RETURN_IF_ERROR(instr_sequence_to_cfg(&seq, g)); + instr_sequence_fini(&seq); + return SUCCESS; +} + static PyObject * -instr_sequence_to_instructions(instr_sequence *seq) { +instr_sequence_to_instructions(instr_sequence *seq) +{ PyObject *instructions = PyList_New(0); if (instructions == NULL) { return NULL; @@ -7709,8 +7155,9 @@ _PyCompile_OptimizeCfg(PyObject *instructions, PyObject *consts) if (instructions_to_cfg(instructions, &g) < 0) { goto error; } - int code_flags = 0, nlocals = 0, nparams = 0; - if (_PyCfg_OptimizeCodeUnit(&g, consts, const_cache, code_flags, nlocals, nparams) < 0) { + int code_flags = 0, nlocals = 0, nparams = 0, firstlineno = 1; + if (_PyCfg_OptimizeCodeUnit(&g, consts, const_cache, code_flags, nlocals, + nparams, firstlineno) < 0) { goto error; } res = cfg_to_instructions(&g); diff --git a/Python/flowgraph.c b/Python/flowgraph.c index cecddbd39c94b3..d97de0c5877178 100644 --- a/Python/flowgraph.c +++ b/Python/flowgraph.c @@ -1978,28 +1978,6 @@ push_cold_blocks_to_end(cfg_builder *g, int code_flags) { return SUCCESS; } -int -_PyCfg_OptimizeCodeUnit(cfg_builder *g, PyObject *consts, PyObject *const_cache, - int code_flags, int nlocals, int nparams) -{ - assert(cfg_builder_check(g)); - /** Preprocessing **/ - /* Map labels to targets and mark exception handlers */ - RETURN_IF_ERROR(translate_jump_labels_to_targets(g->g_entryblock)); - RETURN_IF_ERROR(mark_except_handlers(g->g_entryblock)); - RETURN_IF_ERROR(label_exception_targets(g->g_entryblock)); - - /** Optimization **/ - RETURN_IF_ERROR(optimize_cfg(g, consts, const_cache)); - RETURN_IF_ERROR(remove_unused_consts(g->g_entryblock, consts)); - RETURN_IF_ERROR( - add_checks_for_loads_of_uninitialized_variables( - g->g_entryblock, nlocals, nparams)); - - RETURN_IF_ERROR(push_cold_blocks_to_end(g, code_flags)); - return SUCCESS; -} - void _PyCfg_ConvertExceptionHandlersToNops(basicblock *entryblock) { @@ -2149,8 +2127,8 @@ guarantee_lineno_for_exits(basicblock *entryblock, int firstlineno) { } } -int -_PyCfg_ResolveLineNumbers(cfg_builder *g, int firstlineno) +static int +resolve_line_numbers(cfg_builder *g, int firstlineno) { RETURN_IF_ERROR(duplicate_exits_without_lineno(g)); propagate_line_numbers(g->g_entryblock); @@ -2158,3 +2136,25 @@ _PyCfg_ResolveLineNumbers(cfg_builder *g, int firstlineno) return SUCCESS; } +int +_PyCfg_OptimizeCodeUnit(cfg_builder *g, PyObject *consts, PyObject *const_cache, + int code_flags, int nlocals, int nparams, int firstlineno) +{ + assert(cfg_builder_check(g)); + /** Preprocessing **/ + /* Map labels to targets and mark exception handlers */ + RETURN_IF_ERROR(translate_jump_labels_to_targets(g->g_entryblock)); + RETURN_IF_ERROR(mark_except_handlers(g->g_entryblock)); + RETURN_IF_ERROR(label_exception_targets(g->g_entryblock)); + + /** Optimization **/ + RETURN_IF_ERROR(optimize_cfg(g, consts, const_cache)); + RETURN_IF_ERROR(remove_unused_consts(g->g_entryblock, consts)); + RETURN_IF_ERROR( + add_checks_for_loads_of_uninitialized_variables( + g->g_entryblock, nlocals, nparams)); + + RETURN_IF_ERROR(push_cold_blocks_to_end(g, code_flags)); + RETURN_IF_ERROR(resolve_line_numbers(g, firstlineno)); + return SUCCESS; +} From 21bea68e2e97369d808db7d053d4b51b3bc761b9 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Tue, 11 Apr 2023 11:20:39 +0100 Subject: [PATCH 142/349] gh-91276: remove unused _PyOpcode_RelativeJump (#103156) --- Include/internal/pycore_opcode.h | 13 ---------- Include/internal/pycore_opcode_utils.h | 5 +--- Python/flowgraph.c | 34 +++++++++----------------- Tools/build/generate_opcode_h.py | 2 -- 4 files changed, 12 insertions(+), 42 deletions(-) diff --git a/Include/internal/pycore_opcode.h b/Include/internal/pycore_opcode.h index 81ca91465950b7..f5e9176a3e66c7 100644 --- a/Include/internal/pycore_opcode.h +++ b/Include/internal/pycore_opcode.h @@ -12,8 +12,6 @@ extern "C" { #include "opcode.h" -extern const uint32_t _PyOpcode_RelativeJump[9]; - extern const uint32_t _PyOpcode_Jump[9]; extern const uint8_t _PyOpcode_Caches[256]; @@ -21,17 +19,6 @@ extern const uint8_t _PyOpcode_Caches[256]; extern const uint8_t _PyOpcode_Deopt[256]; #ifdef NEED_OPCODE_TABLES -const uint32_t _PyOpcode_RelativeJump[9] = { - 0U, - 0U, - 536870912U, - 135020544U, - 4163U, - 0U, - 0U, - 0U, - 48U, -}; const uint32_t _PyOpcode_Jump[9] = { 0U, 0U, diff --git a/Include/internal/pycore_opcode_utils.h b/Include/internal/pycore_opcode_utils.h index 96bb4d743bf29f..1d5ff988290bd4 100644 --- a/Include/internal/pycore_opcode_utils.h +++ b/Include/internal/pycore_opcode_utils.h @@ -8,7 +8,7 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_opcode.h" // _PyOpcode_RelativeJump +#include "pycore_opcode.h" // _PyOpcode_Jump #define MAX_REAL_OPCODE 254 @@ -85,9 +85,6 @@ is_bit_set_in_table(const uint32_t *table, int bitindex) { #undef LOG_BITS_PER_INT #undef MASK_LOW_LOG_BITS -#define IS_RELATIVE_JUMP(opcode) (is_bit_set_in_table(_PyOpcode_RelativeJump, opcode)) - - #ifdef __cplusplus } diff --git a/Python/flowgraph.c b/Python/flowgraph.c index d97de0c5877178..67cc5c5e88be10 100644 --- a/Python/flowgraph.c +++ b/Python/flowgraph.c @@ -42,12 +42,6 @@ is_block_push(cfg_instr *i) return IS_BLOCK_PUSH_OPCODE(i->i_opcode); } -static inline int -is_relative_jump(cfg_instr *i) -{ - return IS_RELATIVE_JUMP(i->i_opcode); -} - static inline int is_jump(cfg_instr *i) { @@ -199,8 +193,7 @@ blocksize(basicblock *b) static void dump_instr(cfg_instr *i) { - const char *jrel = (is_relative_jump(i)) ? "jrel " : ""; - const char *jabs = (is_jump(i) && !is_relative_jump(i))? "jabs " : ""; + const char *jump = is_jump(i) ? "jump " : ""; char arg[128]; @@ -211,8 +204,8 @@ dump_instr(cfg_instr *i) if (HAS_TARGET(i->i_opcode)) { sprintf(arg, "target: %p [%d] ", i->i_target, i->i_oparg); } - fprintf(stderr, "line: %d, opcode: %d %s%s%s\n", - i->i_loc.lineno, i->i_opcode, arg, jabs, jrel); + fprintf(stderr, "line: %d, opcode: %d %s%s\n", + i->i_loc.lineno, i->i_opcode, arg, jump); } static inline int @@ -500,25 +493,20 @@ resolve_jump_offsets(basicblock *entryblock) for (int i = 0; i < b->b_iused; i++) { cfg_instr *instr = &b->b_instr[i]; int isize = _PyCfg_InstrSize(instr); - /* Relative jumps are computed relative to - the instruction pointer after fetching - the jump instruction. - */ + /* jump offsets are computed relative to + * the instruction pointer after fetching + * the jump instruction. + */ bsize += isize; if (is_jump(instr)) { instr->i_oparg = instr->i_target->b_offset; - if (is_relative_jump(instr)) { - if (instr->i_oparg < bsize) { - assert(IS_BACKWARDS_JUMP_OPCODE(instr->i_opcode)); - instr->i_oparg = bsize - instr->i_oparg; - } - else { - assert(!IS_BACKWARDS_JUMP_OPCODE(instr->i_opcode)); - instr->i_oparg -= bsize; - } + if (instr->i_oparg < bsize) { + assert(IS_BACKWARDS_JUMP_OPCODE(instr->i_opcode)); + instr->i_oparg = bsize - instr->i_oparg; } else { assert(!IS_BACKWARDS_JUMP_OPCODE(instr->i_opcode)); + instr->i_oparg -= bsize; } if (_PyCfg_InstrSize(instr) != isize) { extended_arg_recompile = 1; diff --git a/Tools/build/generate_opcode_h.py b/Tools/build/generate_opcode_h.py index 614b17df740929..12fdd3ac84b346 100644 --- a/Tools/build/generate_opcode_h.py +++ b/Tools/build/generate_opcode_h.py @@ -130,12 +130,10 @@ def main(opcode_py, outfile='Include/opcode.h', internaloutfile='Include/interna for name, op in specialized_opmap.items(): fobj.write(DEFINE.format(name, op)) - iobj.write("\nextern const uint32_t _PyOpcode_RelativeJump[9];\n") iobj.write("\nextern const uint32_t _PyOpcode_Jump[9];\n") iobj.write("\nextern const uint8_t _PyOpcode_Caches[256];\n") iobj.write("\nextern const uint8_t _PyOpcode_Deopt[256];\n") iobj.write("\n#ifdef NEED_OPCODE_TABLES\n") - write_int_array_from_ops("_PyOpcode_RelativeJump", opcode['hasjrel'], iobj) write_int_array_from_ops("_PyOpcode_Jump", opcode['hasjrel'] + opcode['hasjabs'], iobj) iobj.write("\nconst uint8_t _PyOpcode_Caches[256] = {\n") From e071f00aaefae9eccf787d5c50396c26c8616483 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Tue, 11 Apr 2023 11:25:45 +0100 Subject: [PATCH 143/349] gh-103373: `__mro_entries__` docs: improve cross references (#103398) Co-authored-by: C.A.M. Gerlach --- Doc/library/types.rst | 4 ++-- Doc/reference/datamodel.rst | 15 ++++++++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 747ba58bb225d4..27b9846325914d 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -75,9 +75,9 @@ Dynamic Type Creation This function looks for items in *bases* that are not instances of :class:`type`, and returns a tuple where each such object that has - an ``__mro_entries__`` method is replaced with an unpacked result of + an :meth:`~object.__mro_entries__` method is replaced with an unpacked result of calling this method. If a *bases* item is an instance of :class:`type`, - or it doesn't have an ``__mro_entries__`` method, then it is included in + or it doesn't have an :meth:`!__mro_entries__` method, then it is included in the return tuple unchanged. .. versionadded:: 3.7 diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index ed9ebaba784bc2..9f91ade35e50dc 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -2089,16 +2089,21 @@ Resolving MRO entries .. method:: object.__mro_entries__(self, bases) If a base that appears in a class definition is not an instance of - :class:`type`, then an ``__mro_entries__`` method is searched on the base. - If an ``__mro_entries__`` method is found, the base is substituted with the - result of a call to ``__mro_entries__`` when creating the class. - The method is called with the original bases tuple, and must return a tuple + :class:`type`, then an :meth:`!__mro_entries__` method is searched on the base. + If an :meth:`!__mro_entries__` method is found, the base is substituted with the + result of a call to :meth:`!__mro_entries__` when creating the class. + The method is called with the original bases tuple + passed to the *bases* parameter, and must return a tuple of classes that will be used instead of the base. The returned tuple may be empty: in these cases, the original base is ignored. .. seealso:: - :pep:`560` - Core support for typing module and generic types + :func:`types.resolve_bases` + Dynamically resolve bases that are not instances of :class:`type`. + + :pep:`560` + Core support for typing module and generic types. Determining the appropriate metaclass From 55c99d97e14618dfce41472dd4446f763b0da13f Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Tue, 11 Apr 2023 11:53:06 +0100 Subject: [PATCH 144/349] gh-77757: replace exception wrapping by PEP-678 notes in typeobject's __set_name__ (#103402) --- Doc/whatsnew/3.12.rst | 4 +++ Include/internal/pycore_pyerrors.h | 2 ++ Lib/test/test_functools.py | 4 +-- Lib/test/test_subclassinit.py | 22 +++++++-------- ...3-04-09-22-21-57.gh-issue-77757._Ow-u2.rst | 3 ++ Objects/typeobject.c | 6 ++-- Python/codecs.c | 28 ++----------------- Python/errors.c | 27 ++++++++++++++++++ 8 files changed, 55 insertions(+), 41 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-04-09-22-21-57.gh-issue-77757._Ow-u2.rst diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 0eb16367267f1c..c7fc7d229cd753 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -192,6 +192,10 @@ Other Language Changes * :class:`slice` objects are now hashable, allowing them to be used as dict keys and set items. (Contributed by Will Bradshaw and Furkan Onder in :gh:`101264`.) +* Exceptions raised in a typeobject's ``__set_name__`` method are no longer + wrapped by a :exc:`RuntimeError`. Context information is added to the + exception as a :pep:`678` note. (Contributed by Irit Katriel in :gh:`77757`.) + New Modules =========== diff --git a/Include/internal/pycore_pyerrors.h b/Include/internal/pycore_pyerrors.h index 1bb4a9aa103898..4620a269644917 100644 --- a/Include/internal/pycore_pyerrors.h +++ b/Include/internal/pycore_pyerrors.h @@ -109,6 +109,8 @@ extern PyObject* _Py_Offer_Suggestions(PyObject* exception); PyAPI_FUNC(Py_ssize_t) _Py_UTF8_Edit_Cost(PyObject *str_a, PyObject *str_b, Py_ssize_t max_cost); +void _PyErr_FormatNote(const char *format, ...); + #ifdef __cplusplus } #endif diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index 57db96d37ee369..af286052a7d560 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -2980,7 +2980,7 @@ class MyClass(metaclass=MyMeta): def test_reuse_different_names(self): """Disallow this case because decorated function a would not be cached.""" - with self.assertRaises(RuntimeError) as ctx: + with self.assertRaises(TypeError) as ctx: class ReusedCachedProperty: @py_functools.cached_property def a(self): @@ -2989,7 +2989,7 @@ def a(self): b = a self.assertEqual( - str(ctx.exception.__context__), + str(ctx.exception), str(TypeError("Cannot assign the same cached_property to two different names ('a' and 'b').")) ) diff --git a/Lib/test/test_subclassinit.py b/Lib/test/test_subclassinit.py index 0ad7d17fbd4ddd..310473a4a2fe58 100644 --- a/Lib/test/test_subclassinit.py +++ b/Lib/test/test_subclassinit.py @@ -134,30 +134,28 @@ class Descriptor: def __set_name__(self, owner, name): 1/0 - with self.assertRaises(RuntimeError) as cm: + with self.assertRaises(ZeroDivisionError) as cm: class NotGoingToWork: attr = Descriptor() - exc = cm.exception - self.assertRegex(str(exc), r'\bNotGoingToWork\b') - self.assertRegex(str(exc), r'\battr\b') - self.assertRegex(str(exc), r'\bDescriptor\b') - self.assertIsInstance(exc.__cause__, ZeroDivisionError) + notes = cm.exception.__notes__ + self.assertRegex(str(notes), r'\bNotGoingToWork\b') + self.assertRegex(str(notes), r'\battr\b') + self.assertRegex(str(notes), r'\bDescriptor\b') def test_set_name_wrong(self): class Descriptor: def __set_name__(self): pass - with self.assertRaises(RuntimeError) as cm: + with self.assertRaises(TypeError) as cm: class NotGoingToWork: attr = Descriptor() - exc = cm.exception - self.assertRegex(str(exc), r'\bNotGoingToWork\b') - self.assertRegex(str(exc), r'\battr\b') - self.assertRegex(str(exc), r'\bDescriptor\b') - self.assertIsInstance(exc.__cause__, TypeError) + notes = cm.exception.__notes__ + self.assertRegex(str(notes), r'\bNotGoingToWork\b') + self.assertRegex(str(notes), r'\battr\b') + self.assertRegex(str(notes), r'\bDescriptor\b') def test_set_name_lookup(self): resolved = [] diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-04-09-22-21-57.gh-issue-77757._Ow-u2.rst b/Misc/NEWS.d/next/Core and Builtins/2023-04-09-22-21-57.gh-issue-77757._Ow-u2.rst new file mode 100644 index 00000000000000..85c8ecf7de8d1b --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-04-09-22-21-57.gh-issue-77757._Ow-u2.rst @@ -0,0 +1,3 @@ +Exceptions raised in a typeobject's ``__set_name__`` method are no longer +wrapped by a :exc:`RuntimeError`. Context information is added to the +exception as a :pep:`678` note. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 995547e7915f77..9ea458f30394e3 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -9137,13 +9137,15 @@ type_new_set_names(PyTypeObject *type) Py_DECREF(set_name); if (res == NULL) { - _PyErr_FormatFromCause(PyExc_RuntimeError, + _PyErr_FormatNote( "Error calling __set_name__ on '%.100s' instance %R " "in '%.100s'", Py_TYPE(value)->tp_name, key, type->tp_name); goto error; } - Py_DECREF(res); + else { + Py_DECREF(res); + } } Py_DECREF(names_to_set); diff --git a/Python/codecs.c b/Python/codecs.c index 9d800f9856c2f7..1983f56ba204c1 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -11,6 +11,7 @@ Copyright (c) Corporation for National Research Initiatives. #include "Python.h" #include "pycore_call.h" // _PyObject_CallNoArgs() #include "pycore_interp.h" // PyInterpreterState.codec_search_path +#include "pycore_pyerrors.h" // _PyErr_FormatNote() #include "pycore_pystate.h" // _PyInterpreterState_GET() #include "pycore_ucnhash.h" // _PyUnicode_Name_CAPI #include @@ -382,29 +383,6 @@ PyObject *PyCodec_StreamWriter(const char *encoding, return codec_getstreamcodec(encoding, stream, errors, 3); } -static void -add_note_to_codec_error(const char *operation, - const char *encoding) -{ - PyObject *exc = PyErr_GetRaisedException(); - if (exc == NULL) { - return; - } - PyObject *note = PyUnicode_FromFormat("%s with '%s' codec failed", - operation, encoding); - if (note == NULL) { - _PyErr_ChainExceptions1(exc); - return; - } - int res = _PyException_AddNote(exc, note); - Py_DECREF(note); - if (res < 0) { - _PyErr_ChainExceptions1(exc); - return; - } - PyErr_SetRaisedException(exc); -} - /* Encode an object (e.g. a Unicode object) using the given encoding and return the resulting encoded object (usually a Python string). @@ -425,7 +403,7 @@ _PyCodec_EncodeInternal(PyObject *object, result = PyObject_Call(encoder, args, NULL); if (result == NULL) { - add_note_to_codec_error("encoding", encoding); + _PyErr_FormatNote("%s with '%s' codec failed", "encoding", encoding); goto onError; } @@ -470,7 +448,7 @@ _PyCodec_DecodeInternal(PyObject *object, result = PyObject_Call(decoder, args, NULL); if (result == NULL) { - add_note_to_codec_error("decoding", encoding); + _PyErr_FormatNote("%s with '%s' codec failed", "decoding", encoding); goto onError; } if (!PyTuple_Check(result) || diff --git a/Python/errors.c b/Python/errors.c index ab14770c6e810c..0ff6a0d5985f0f 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -1200,6 +1200,33 @@ PyErr_Format(PyObject *exception, const char *format, ...) } +/* Adds a note to the current exception (if any) */ +void +_PyErr_FormatNote(const char *format, ...) +{ + PyObject *exc = PyErr_GetRaisedException(); + if (exc == NULL) { + return; + } + va_list vargs; + va_start(vargs, format); + PyObject *note = PyUnicode_FromFormatV(format, vargs); + va_end(vargs); + if (note == NULL) { + goto error; + } + int res = _PyException_AddNote(exc, note); + Py_DECREF(note); + if (res < 0) { + goto error; + } + PyErr_SetRaisedException(exc); + return; +error: + _PyErr_ChainExceptions1(exc); +} + + PyObject * PyErr_NewException(const char *name, PyObject *base, PyObject *dict) { From 50b4b1598411ed393f47ce7f4fffbe5b9063cd42 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Tue, 11 Apr 2023 16:50:25 +0300 Subject: [PATCH 145/349] gh-87864: Use correct function definition syntax in the docs (#103312) --- Doc/glossary.rst | 2 +- Doc/library/functions.rst | 2 +- Lib/abc.py | 2 +- Objects/funcobject.c | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 3d74d550dc345a..53e8cdcae1cd66 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -214,7 +214,7 @@ Glossary A callable is an object that can be called, possibly with a set of arguments (see :term:`argument`), with the following syntax:: - callable(argument1, argument2, ...) + callable(argument1, argument2, argumentN) A :term:`function`, and by extension a :term:`method`, is a callable. An instance of a class that implements the :meth:`~object.__call__` diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 8797485cd05d83..7792e598c1155c 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1681,7 +1681,7 @@ are always available. They are listed here in alphabetical order. class C: @staticmethod - def f(arg1, arg2, ...): ... + def f(arg1, arg2, argN): ... The ``@staticmethod`` form is a function :term:`decorator` -- see :ref:`function` for details. diff --git a/Lib/abc.py b/Lib/abc.py index 42048ddb855381..f8a4e11ce9c3b1 100644 --- a/Lib/abc.py +++ b/Lib/abc.py @@ -18,7 +18,7 @@ class that has a metaclass derived from ABCMeta cannot be class C(metaclass=ABCMeta): @abstractmethod - def my_abstract_method(self, ...): + def my_abstract_method(self, arg1, arg2, argN): ... """ funcobj.__isabstractmethod__ = True diff --git a/Objects/funcobject.c b/Objects/funcobject.c index ce5d7bda32c032..78c1144afca2eb 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -942,7 +942,7 @@ functools_wraps(PyObject *wrapper, PyObject *wrapped) class C: @classmethod - def f(cls, arg1, arg2, ...): + def f(cls, arg1, arg2, argN): ... It can be called either on the class (e.g. C.f()) or on an instance @@ -1066,7 +1066,7 @@ To declare a class method, use this idiom:\n\ \n\ class C:\n\ @classmethod\n\ - def f(cls, arg1, arg2, ...):\n\ + def f(cls, arg1, arg2, argN):\n\ ...\n\ \n\ It can be called either on the class (e.g. C.f()) or on an instance\n\ @@ -1138,7 +1138,7 @@ PyClassMethod_New(PyObject *callable) class C: @staticmethod - def f(arg1, arg2, ...): + def f(arg1, arg2, argN): ... It can be called either on the class (e.g. C.f()) or on an instance @@ -1260,7 +1260,7 @@ To declare a static method, use this idiom:\n\ \n\ class C:\n\ @staticmethod\n\ - def f(arg1, arg2, ...):\n\ + def f(arg1, arg2, argN):\n\ ...\n\ \n\ It can be called either on the class (e.g. C.f()) or on an instance\n\ From b57105ae33e1f61e6bdf0eec45c4135d067b9b22 Mon Sep 17 00:00:00 2001 From: Barney Gale Date: Tue, 11 Apr 2023 17:26:45 +0100 Subject: [PATCH 146/349] GH-103220: Fix `ntpath.join()` of partial UNC drive with trailing slash (GH-103221) --- Lib/ntpath.py | 2 +- Lib/test/test_ntpath.py | 5 +++++ .../Library/2023-04-03-21-08-53.gh-issue-103220.OW_Bj5.rst | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-03-21-08-53.gh-issue-103220.OW_Bj5.rst diff --git a/Lib/ntpath.py b/Lib/ntpath.py index 6e2da79c85d3f0..0f3674fe11eecd 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -142,7 +142,7 @@ def join(path, *paths): result_path = result_path + p_path ## add separator between UNC and non-absolute path if (result_path and not result_root and - result_drive and result_drive[-1:] != colon): + result_drive and result_drive[-1:] not in colon + seps): return result_drive + sep + result_path return result_drive + result_root + result_path except (TypeError, AttributeError, BytesWarning): diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py index 4e755d15403916..42b9587ca18107 100644 --- a/Lib/test/test_ntpath.py +++ b/Lib/test/test_ntpath.py @@ -300,6 +300,11 @@ def test_join(self): tester("ntpath.join('//computer/share', 'a', 'b')", '//computer/share\\a\\b') tester("ntpath.join('//computer/share', 'a/b')", '//computer/share\\a/b') + tester("ntpath.join('\\\\', 'computer')", '\\\\computer') + tester("ntpath.join('\\\\computer\\', 'share')", '\\\\computer\\share') + tester("ntpath.join('\\\\computer\\share\\', 'a')", '\\\\computer\\share\\a') + tester("ntpath.join('\\\\computer\\share\\a\\', 'b')", '\\\\computer\\share\\a\\b') + def test_normpath(self): tester("ntpath.normpath('A//////././//.//B')", r'A\B') tester("ntpath.normpath('A/./B')", r'A\B') diff --git a/Misc/NEWS.d/next/Library/2023-04-03-21-08-53.gh-issue-103220.OW_Bj5.rst b/Misc/NEWS.d/next/Library/2023-04-03-21-08-53.gh-issue-103220.OW_Bj5.rst new file mode 100644 index 00000000000000..9cf26c26873b2a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-03-21-08-53.gh-issue-103220.OW_Bj5.rst @@ -0,0 +1,2 @@ +Fix issue where :func:`os.path.join` added a slash when joining onto an +incomplete UNC drive with a trailing slash on Windows. From ebc81034278ea186b4110c7dbf6d1c2a0ada9398 Mon Sep 17 00:00:00 2001 From: Stanislav Syekirin Date: Tue, 11 Apr 2023 21:20:46 +0200 Subject: [PATCH 147/349] gh-103088: Sanitize venv paths when using MSYS or Cygwin Bash (GH-103325) --- Lib/venv/scripts/common/activate | 11 +++++++++-- .../2023-04-11-09-22-22.gh-issue-103088.6AJEuR.rst | 1 + PCbuild/find_python.bat | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2023-04-11-09-22-22.gh-issue-103088.6AJEuR.rst diff --git a/Lib/venv/scripts/common/activate b/Lib/venv/scripts/common/activate index 6fbc2b8801da04..cb898b39670c47 100644 --- a/Lib/venv/scripts/common/activate +++ b/Lib/venv/scripts/common/activate @@ -38,8 +38,15 @@ deactivate () { # unset irrelevant variables deactivate nondestructive -VIRTUAL_ENV="__VENV_DIR__" -export VIRTUAL_ENV +# on Windows, a path can contain colons and backslashes and has to be converted: +if [ "$OSTYPE" = "cygwin" ] || [ "$OSTYPE" = "msys" ] ; then + # transform D:\path\to\venv to /d/path/to/venv on MSYS + # and to /cygdrive/d/path/to/venv on Cygwin + export VIRTUAL_ENV=$(cygpath "__VENV_DIR__") +else + # use the path as-is + export VIRTUAL_ENV="__VENV_DIR__" +fi _OLD_VIRTUAL_PATH="$PATH" PATH="$VIRTUAL_ENV/__VENV_BIN_NAME__:$PATH" diff --git a/Misc/NEWS.d/next/Windows/2023-04-11-09-22-22.gh-issue-103088.6AJEuR.rst b/Misc/NEWS.d/next/Windows/2023-04-11-09-22-22.gh-issue-103088.6AJEuR.rst new file mode 100644 index 00000000000000..f9f5343f4210dc --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2023-04-11-09-22-22.gh-issue-103088.6AJEuR.rst @@ -0,0 +1 @@ +Fixes venvs not working in bash on Windows across different disks diff --git a/PCbuild/find_python.bat b/PCbuild/find_python.bat index 11d6cba7a172c9..7af5503d80a0fc 100644 --- a/PCbuild/find_python.bat +++ b/PCbuild/find_python.bat @@ -42,7 +42,7 @@ @if NOT "%HOST_PYTHON%"=="" @%HOST_PYTHON% -Ec "import sys; assert sys.version_info[:2] >= (3, 9)" >nul 2>nul && (set PYTHON="%HOST_PYTHON%") && (set _Py_Python_Source=found as HOST_PYTHON) && goto :found @rem If py.exe finds a recent enough version, use that one -@for %%p in (3.10 3.9) do @py -%%p -EV >nul 2>&1 && (set PYTHON=py -%%p) && (set _Py_Python_Source=found %%p with py.exe) && goto :found +@for %%p in (3.11 3.10 3.9) do @py -%%p -EV >nul 2>&1 && (set PYTHON=py -%%p) && (set _Py_Python_Source=found %%p with py.exe) && goto :found @if NOT exist "%_Py_EXTERNALS_DIR%" mkdir "%_Py_EXTERNALS_DIR%" @set _Py_NUGET=%NUGET% From 9db2db4fa4bc2a955170f727fde68ff4a4de3080 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Tue, 11 Apr 2023 21:08:29 +0100 Subject: [PATCH 148/349] gh-87092: fix refleak in peepholer test harness (#103448) --- Python/compile.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Python/compile.c b/Python/compile.c index 15fca8296c69ec..3e152060d2f1c2 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -7148,10 +7148,6 @@ _PyCompile_OptimizeCfg(PyObject *instructions, PyObject *consts) } cfg_builder g; - memset(&g, 0, sizeof(cfg_builder)); - if (_PyCfgBuilder_Init(&g) < 0) { - goto error; - } if (instructions_to_cfg(instructions, &g) < 0) { goto error; } From 96663875b2ea55c65e83551cdb741bbcdcaa7f21 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Tue, 11 Apr 2023 15:30:05 -0500 Subject: [PATCH 149/349] Remove redundant words from interpreter_definition.md. (GH-103455) --- Tools/cases_generator/interpreter_definition.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tools/cases_generator/interpreter_definition.md b/Tools/cases_generator/interpreter_definition.md index c7bd38d32ff411..6f902f60c68ee7 100644 --- a/Tools/cases_generator/interpreter_definition.md +++ b/Tools/cases_generator/interpreter_definition.md @@ -137,9 +137,9 @@ The following definitions may occur: `foo_1` is legal. `$` is not legal, nor is `struct` or `class`. The optional `type` in an `object` is the C type. It defaults to `PyObject *`. -The objects before the "--" are the objects on top of the the stack at the start -of the instruction. Those after the "--" are the objects on top of the the stack -at the end of the instruction. +The objects before the "--" are the objects on top of the stack at the start of +the instruction. Those after the "--" are the objects on top of the stack at the +end of the instruction. An `inst` without `stack_effect` is a transitional form to allow the original C code definitions to be copied. It lacks information to generate anything other than the From 2f41a009b7311a4b44bae5b3583cde3d6d10d8d1 Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Tue, 11 Apr 2023 15:40:30 -0700 Subject: [PATCH 150/349] gh-103143: Polish pdb help messages and doc strings (GH-103144) * Made all the command part of the docstring match the official documentation * Always have a space between the command and the description in docstring * Added a helper function to format the help message Before: ``` (Pdb) h a a(rgs) Print the argument list of the current function. (Pdb) h commands commands [bpnumber] (com) ... (com) end (Pdb) ... (Pdb) h interact interact Start an interactive interpreter whose global namespace contains all the (global and local) names found in the current scope. ``` After ``` (Pdb) h a Usage: a(rgs) Print the argument list of the current function. (Pdb) h commands Usage: (Pdb) commands [bpnumber] (com) ... (com) end (Pdb) ... (Pdb) h interact Usage: interact Start an interactive interpreter whose global namespace contains all the (global and local) names found in the current scope. ``` Automerge-Triggered-By: GH:brandtbucher --- Doc/library/pdb.rst | 4 +- Lib/pdb.py | 67 ++++++++++++++++--- ...-03-31-01-13-00.gh-issue-103143.6eMluy.rst | 1 + 3 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-03-31-01-13-00.gh-issue-103143.6eMluy.rst diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst index d80c5eebbf27a7..4170882efef194 100644 --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -315,14 +315,14 @@ can be overridden by the local file. With a space separated list of breakpoint numbers, clear those breakpoints. Without argument, clear all breaks (but first ask confirmation). -.. pdbcommand:: disable [bpnumber ...] +.. pdbcommand:: disable bpnumber [bpnumber ...] Disable the breakpoints given as a space separated list of breakpoint numbers. Disabling a breakpoint means it cannot cause the program to stop execution, but unlike clearing a breakpoint, it remains in the list of breakpoints and can be (re-)enabled. -.. pdbcommand:: enable [bpnumber ...] +.. pdbcommand:: enable bpnumber [bpnumber ...] Enable the breakpoints specified. diff --git a/Lib/pdb.py b/Lib/pdb.py index e03142e9b5d85c..a3553b345a8dd3 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -586,7 +586,7 @@ def _complete_expression(self, text, line, begidx, endidx): # Return true to exit from the command loop def do_commands(self, arg): - """commands [bpnumber] + """(Pdb) commands [bpnumber] (com) ... (com) end (Pdb) @@ -672,6 +672,7 @@ def do_commands(self, arg): def do_break(self, arg, temporary = 0): """b(reak) [ ([filename:]lineno | function) [, condition] ] + Without argument, list all breaks. With a line number argument, set a break at this line in the @@ -780,6 +781,7 @@ def defaultFile(self): def do_tbreak(self, arg): """tbreak [ ([filename:]lineno | function) [, condition] ] + Same arguments as break, but sets a temporary breakpoint: it is automatically deleted when first hit. """ @@ -844,6 +846,7 @@ def checkline(self, filename, lineno): def do_enable(self, arg): """enable bpnumber [bpnumber ...] + Enables the breakpoints given as a space separated list of breakpoint numbers. """ @@ -861,6 +864,7 @@ def do_enable(self, arg): def do_disable(self, arg): """disable bpnumber [bpnumber ...] + Disables the breakpoints given as a space separated list of breakpoint numbers. Disabling a breakpoint means it cannot cause the program to stop execution, but unlike clearing a @@ -881,6 +885,7 @@ def do_disable(self, arg): def do_condition(self, arg): """condition bpnumber [condition] + Set a new condition for the breakpoint, an expression which must evaluate to true before the breakpoint is honored. If condition is absent, any existing condition is removed; i.e., @@ -911,6 +916,7 @@ def do_condition(self, arg): def do_ignore(self, arg): """ignore bpnumber [count] + Set the ignore count for the given breakpoint number. If count is omitted, the ignore count is set to 0. A breakpoint becomes active when the ignore count is zero. When non-zero, @@ -945,7 +951,8 @@ def do_ignore(self, arg): complete_ignore = _complete_bpnumber def do_clear(self, arg): - """cl(ear) filename:lineno\ncl(ear) [bpnumber [bpnumber...]] + """cl(ear) [filename:lineno | bpnumber ...] + With a space separated list of breakpoint numbers, clear those breakpoints. Without argument, clear all breaks (but first ask confirmation). With a filename:lineno argument, @@ -997,6 +1004,7 @@ def do_clear(self, arg): def do_where(self, arg): """w(here) + Print a stack trace, with the most recent frame at the bottom. An arrow indicates the "current frame", which determines the context of most commands. 'bt' is an alias for this command. @@ -1015,6 +1023,7 @@ def _select_frame(self, number): def do_up(self, arg): """u(p) [count] + Move the current frame count (default one) levels up in the stack trace (to an older frame). """ @@ -1035,6 +1044,7 @@ def do_up(self, arg): def do_down(self, arg): """d(own) [count] + Move the current frame count (default one) levels down in the stack trace (to a newer frame). """ @@ -1055,6 +1065,7 @@ def do_down(self, arg): def do_until(self, arg): """unt(il) [lineno] + Without argument, continue execution until the line with a number greater than the current one is reached. With a line number, continue execution until a line with a number greater @@ -1079,6 +1090,7 @@ def do_until(self, arg): def do_step(self, arg): """s(tep) + Execute the current line, stop at the first possible occasion (either in a function that is called or in the current function). @@ -1089,6 +1101,7 @@ def do_step(self, arg): def do_next(self, arg): """n(ext) + Continue execution until the next line in the current function is reached or it returns. """ @@ -1098,6 +1111,7 @@ def do_next(self, arg): def do_run(self, arg): """run [args...] + Restart the debugged python program. If a string is supplied it is split with "shlex", and the result is used as the new sys.argv. History, breakpoints, actions and debugger options @@ -1119,6 +1133,7 @@ def do_run(self, arg): def do_return(self, arg): """r(eturn) + Continue execution until the current function returns. """ self.set_return(self.curframe) @@ -1127,6 +1142,7 @@ def do_return(self, arg): def do_continue(self, arg): """c(ont(inue)) + Continue execution, only stop when a breakpoint is encountered. """ if not self.nosigint: @@ -1145,6 +1161,7 @@ def do_continue(self, arg): def do_jump(self, arg): """j(ump) lineno + Set the next line that will be executed. Only available in the bottom-most frame. This lets you jump back and execute code again, or jump forward to skip code that you don't want @@ -1174,6 +1191,7 @@ def do_jump(self, arg): def do_debug(self, arg): """debug code + Enter a recursive debugger that steps through the code argument (which is an arbitrary expression or statement to be executed in the current environment). @@ -1195,7 +1213,8 @@ def do_debug(self, arg): complete_debug = _complete_expression def do_quit(self, arg): - """q(uit)\nexit + """q(uit) | exit + Quit from the debugger. The program being executed is aborted. """ self._user_requested_quit = True @@ -1207,6 +1226,7 @@ def do_quit(self, arg): def do_EOF(self, arg): """EOF + Handles the receipt of EOF as a command. """ self.message('') @@ -1216,6 +1236,7 @@ def do_EOF(self, arg): def do_args(self, arg): """a(rgs) + Print the argument list of the current function. """ co = self.curframe.f_code @@ -1233,6 +1254,7 @@ def do_args(self, arg): def do_retval(self, arg): """retval + Print the return value for the last return of a function. """ if '__return__' in self.curframe_locals: @@ -1273,12 +1295,14 @@ def _msg_val_func(self, arg, func): def do_p(self, arg): """p expression + Print the value of the expression. """ self._msg_val_func(arg, repr) def do_pp(self, arg): """pp expression + Pretty-print the value of the expression. """ self._msg_val_func(arg, pprint.pformat) @@ -1288,7 +1312,7 @@ def do_pp(self, arg): complete_pp = _complete_expression def do_list(self, arg): - """l(ist) [first [,last] | .] + """l(ist) [first[, last] | .] List source code for the current file. Without arguments, list 11 lines around the current line or continue the previous @@ -1345,7 +1369,8 @@ def do_list(self, arg): do_l = do_list def do_longlist(self, arg): - """longlist | ll + """ll | longlist + List the whole source code for the current function or frame. """ filename = self.curframe.f_code.co_filename @@ -1360,6 +1385,7 @@ def do_longlist(self, arg): def do_source(self, arg): """source expression + Try to get source code for the given object and display it. """ try: @@ -1397,7 +1423,8 @@ def _print_lines(self, lines, start, breaks=(), frame=None): self.message(s + '\t' + line.rstrip()) def do_whatis(self, arg): - """whatis arg + """whatis expression + Print the type of the argument. """ try: @@ -1485,7 +1512,8 @@ def do_interact(self, arg): code.interact("*interactive*", local=ns) def do_alias(self, arg): - """alias [name [command [parameter parameter ...] ]] + """alias [name [command]] + Create an alias called 'name' that executes 'command'. The command must *not* be enclosed in quotes. Replaceable parameters can be indicated by %1, %2, and so on, while %* is @@ -1521,6 +1549,7 @@ def do_alias(self, arg): def do_unalias(self, arg): """unalias name + Delete the specified alias. """ args = arg.split() @@ -1563,6 +1592,7 @@ def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix): def do_help(self, arg): """h(elp) + Without argument, print the list of available commands. With a command name as argument, print help about that command. "help pdb" shows the full pdb documentation. @@ -1586,12 +1616,13 @@ def do_help(self, arg): if command.__doc__ is None: self.error('No help for %r; __doc__ string missing' % arg) return - self.message(command.__doc__.rstrip()) + self.message(self._help_message_from_doc(command.__doc__)) do_h = do_help def help_exec(self): """(!) statement + Execute the (one-line) statement in the context of the current stack frame. The exclamation point can be omitted unless the first word of the statement resembles a debugger command. To @@ -1672,6 +1703,26 @@ def _getsourcelines(self, obj): lineno = max(1, lineno) return lines, lineno + def _help_message_from_doc(self, doc): + lines = [line.strip() for line in doc.rstrip().splitlines()] + if not lines: + return "No help message found." + if "" in lines: + usage_end = lines.index("") + else: + usage_end = 1 + formatted = [] + indent = " " * len(self.prompt) + for i, line in enumerate(lines): + if i == 0: + prefix = "Usage: " + elif i < usage_end: + prefix = " " + else: + prefix = "" + formatted.append(indent + prefix + line) + return "\n".join(formatted) + # Collect all command help into docstring, if not run with -OO if __doc__ is not None: diff --git a/Misc/NEWS.d/next/Library/2023-03-31-01-13-00.gh-issue-103143.6eMluy.rst b/Misc/NEWS.d/next/Library/2023-03-31-01-13-00.gh-issue-103143.6eMluy.rst new file mode 100644 index 00000000000000..32bd62d27c7c6d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-03-31-01-13-00.gh-issue-103143.6eMluy.rst @@ -0,0 +1 @@ +Polish the help messages and docstrings of :mod:`pdb`. From 449bf2a76b23b97a38158d506bc30d3ebe006321 Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Tue, 11 Apr 2023 23:18:34 -0700 Subject: [PATCH 151/349] gh-103237: Polish pdb docs (#103238) --- Doc/library/pdb.rst | 138 ++++++++++++++++++++++++++++++++------------ 1 file changed, 100 insertions(+), 38 deletions(-) diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst index 4170882efef194..5bc48a6d5f77fd 100644 --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -36,73 +36,91 @@ extension interface uses the modules :mod:`bdb` and :mod:`cmd`. Module :mod:`traceback` Standard interface to extract, format and print stack traces of Python programs. -The debugger's prompt is ``(Pdb)``. Typical usage to run a program under control -of the debugger is:: +The typical usage to break into the debugger is to insert:: - >>> import pdb - >>> import mymodule - >>> pdb.run('mymodule.test()') - > (0)?() - (Pdb) continue - > (1)?() + import pdb; pdb.set_trace() + +Or:: + + breakpoint() + +at the location you want to break into the debugger, and then run the program. +You can then step through the code following this statement, and continue +running without the debugger using the :pdbcmd:`continue` command. + +.. versionadded:: 3.7 + The built-in :func:`breakpoint()`, when called with defaults, can be used + instead of ``import pdb; pdb.set_trace()``. + +:: + + def double(x): + breakpoint() + return x * 2 + val = 3 + print(f"{val} * 2 is {double(val)}") + +The debugger's prompt is ``(Pdb)``, which is the indicator that you are in debug mode:: + + > ...(3)double() + -> return x * 2 + (Pdb) p x + 3 (Pdb) continue - NameError: 'spam' - > (1)?() - (Pdb) + 3 * 2 is 6 .. versionchanged:: 3.3 Tab-completion via the :mod:`readline` module is available for commands and command arguments, e.g. the current global and local names are offered as arguments of the ``p`` command. -:file:`pdb.py` can also be invoked as a script to debug other scripts. For + +You can also invoke :mod:`pdb` from the command line to debug other scripts. For example:: python -m pdb myscript.py -When invoked as a script, pdb will automatically enter post-mortem debugging if +When invoked as a module, pdb will automatically enter post-mortem debugging if the program being debugged exits abnormally. After post-mortem debugging (or after normal exit of the program), pdb will restart the program. Automatic restarting preserves pdb's state (such as breakpoints) and in most cases is more useful than quitting the debugger upon program's exit. .. versionadded:: 3.2 - :file:`pdb.py` now accepts a ``-c`` option that executes commands as if given + ``-c`` option is introduced to execute commands as if given in a :file:`.pdbrc` file, see :ref:`debugger-commands`. .. versionadded:: 3.7 - :file:`pdb.py` now accepts a ``-m`` option that execute modules similar to the way + ``-m`` option is introduced to execute modules similar to the way ``python -m`` does. As with a script, the debugger will pause execution just before the first line of the module. +Typical usage to execute a statement under control of the debugger is:: -The typical usage to break into the debugger is to insert:: - - import pdb; pdb.set_trace() - -at the location you want to break into the debugger, and then run the program. -You can then step through the code following this statement, and continue -running without the debugger using the :pdbcmd:`continue` command. - -.. versionadded:: 3.7 - The built-in :func:`breakpoint()`, when called with defaults, can be used - instead of ``import pdb; pdb.set_trace()``. + >>> import pdb + >>> def f(x): + ... print(1 / x) + >>> pdb.run("f(2)") + > (1)() + (Pdb) continue + 0.5 + >>> The typical usage to inspect a crashed program is:: >>> import pdb - >>> import mymodule - >>> mymodule.test() + >>> def f(x): + ... print(1 / x) + ... + >>> f(0) Traceback (most recent call last): File "", line 1, in - File "./mymodule.py", line 4, in test - test2() - File "./mymodule.py", line 3, in test2 - print(spam) - NameError: spam + File "", line 2, in f + ZeroDivisionError: division by zero >>> pdb.pm() - > ./mymodule.py(3)test2() - -> print(spam) + > (2)f() + (Pdb) p x + 0 (Pdb) @@ -275,7 +293,7 @@ can be overridden by the local file. .. pdbcommand:: w(here) - Print a stack trace, with the most recent frame at the bottom. An arrow + Print a stack trace, with the most recent frame at the bottom. An arrow (``>``) indicates the current frame, which determines the context of most commands. .. pdbcommand:: d(own) [count] @@ -442,7 +460,7 @@ can be overridden by the local file. .. pdbcommand:: a(rgs) - Print the argument list of the current function. + Print the arguments of the current function and their current values. .. pdbcommand:: p expression @@ -476,6 +494,50 @@ can be overridden by the local file. Without *expression*, list all display expressions for the current frame. + .. note:: + + Display evaluates *expression* and compares to the result of the previous + evaluation of *expression*, so when the result is mutable, display may not + be able to pick up the changes. + + Example:: + + lst = [] + breakpoint() + pass + lst.append(1) + print(lst) + + Display won't realize ``lst`` has been changed because the result of evaluation + is modified in place by ``lst.append(1)`` before being compared:: + + > example.py(3)() + -> pass + (Pdb) display lst + display lst: [] + (Pdb) n + > example.py(4)() + -> lst.append(1) + (Pdb) n + > example.py(5)() + -> print(lst) + (Pdb) + + You can do some tricks with copy mechanism to make it work:: + + > example.py(3)() + -> pass + (Pdb) display lst[:] + display lst[:]: [] + (Pdb) n + > example.py(4)() + -> lst.append(1) + (Pdb) n + > example.py(5)() + -> print(lst) + display lst[:]: [1] [old: []] + (Pdb) + .. versionadded:: 3.2 .. pdbcommand:: undisplay [expression] @@ -552,7 +614,7 @@ can be overridden by the local file. .. pdbcommand:: retval - Print the return value for the last return of a function. + Print the return value for the last return of the current function. .. rubric:: Footnotes From 8f54302ab49a07e857843f1a551db5ddb536ce56 Mon Sep 17 00:00:00 2001 From: Bar Harel Date: Wed, 12 Apr 2023 08:35:56 +0100 Subject: [PATCH 152/349] gh-103357: Add logging.Formatter defaults support to logging.config fileConfig and dictConfig (GH-103359) --- Doc/library/logging.config.rst | 9 +- Lib/logging/config.py | 22 +++- Lib/test/test_logging.py | 108 +++++++++++++++++- ...-04-08-01-33-12.gh-issue-103357.vjin28.rst | 3 + 4 files changed, 137 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-08-01-33-12.gh-issue-103357.vjin28.rst diff --git a/Doc/library/logging.config.rst b/Doc/library/logging.config.rst index 2daf2422ebd5b4..250246b5cd9adc 100644 --- a/Doc/library/logging.config.rst +++ b/Doc/library/logging.config.rst @@ -253,6 +253,7 @@ otherwise, the context is used to determine what to instantiate. * ``datefmt`` * ``style`` * ``validate`` (since version >=3.8) + * ``defaults`` (since version >=3.12) An optional ``class`` key indicates the name of the formatter's class (as a dotted module and class name). The instantiation @@ -953,16 +954,22 @@ Sections which specify formatter configuration are typified by the following. .. code-block:: ini [formatter_form01] - format=F1 %(asctime)s %(levelname)s %(message)s + format=F1 %(asctime)s %(levelname)s %(message)s %(customfield)s datefmt= style=% validate=True + defaults={'customfield': 'defaultvalue'} class=logging.Formatter The arguments for the formatter configuration are the same as the keys in the dictionary schema :ref:`formatters section `. +The ``defaults`` entry, when :ref:`evaluated ` in the context of +the ``logging`` package's namespace, is a dictionary of default values for +custom formatting fields. If not provided, it defaults to ``None``. + + .. note:: Due to the use of :func:`eval` as described above, there are diff --git a/Lib/logging/config.py b/Lib/logging/config.py index 7cd16c643e9dad..16c54a6a4f7a2f 100644 --- a/Lib/logging/config.py +++ b/Lib/logging/config.py @@ -114,11 +114,18 @@ def _create_formatters(cp): fs = cp.get(sectname, "format", raw=True, fallback=None) dfs = cp.get(sectname, "datefmt", raw=True, fallback=None) stl = cp.get(sectname, "style", raw=True, fallback='%') + defaults = cp.get(sectname, "defaults", raw=True, fallback=None) + c = logging.Formatter class_name = cp[sectname].get("class") if class_name: c = _resolve(class_name) - f = c(fs, dfs, stl) + + if defaults is not None: + defaults = eval(defaults, vars(logging)) + f = c(fs, dfs, stl, defaults=defaults) + else: + f = c(fs, dfs, stl) formatters[form] = f return formatters @@ -668,18 +675,27 @@ def configure_formatter(self, config): dfmt = config.get('datefmt', None) style = config.get('style', '%') cname = config.get('class', None) + defaults = config.get('defaults', None) if not cname: c = logging.Formatter else: c = _resolve(cname) + kwargs = {} + + # Add defaults only if it exists. + # Prevents TypeError in custom formatter callables that do not + # accept it. + if defaults is not None: + kwargs['defaults'] = defaults + # A TypeError would be raised if "validate" key is passed in with a formatter callable # that does not accept "validate" as a parameter if 'validate' in config: # if user hasn't mentioned it, the default will be fine - result = c(fmt, dfmt, style, config['validate']) + result = c(fmt, dfmt, style, config['validate'], **kwargs) else: - result = c(fmt, dfmt, style) + result = c(fmt, dfmt, style, **kwargs) return result diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index c6de34e9dbdc8f..9176d8eeb56d01 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -1524,6 +1524,32 @@ class ConfigFileTest(BaseTest): kwargs={{"encoding": "utf-8"}} """ + + config9 = """ + [loggers] + keys=root + + [handlers] + keys=hand1 + + [formatters] + keys=form1 + + [logger_root] + level=WARNING + handlers=hand1 + + [handler_hand1] + class=StreamHandler + level=NOTSET + formatter=form1 + args=(sys.stdout,) + + [formatter_form1] + format=%(message)s ++ %(customfield)s + defaults={"customfield": "defaultvalue"} + """ + disable_test = """ [loggers] keys=root @@ -1687,6 +1713,16 @@ def test_config8_ok(self): handler = logging.root.handlers[0] self.addCleanup(closeFileHandler, handler, fn) + def test_config9_ok(self): + self.apply_config(self.config9) + formatter = logging.root.handlers[0].formatter + result = formatter.format(logging.makeLogRecord({'msg': 'test'})) + self.assertEqual(result, 'test ++ defaultvalue') + result = formatter.format(logging.makeLogRecord( + {'msg': 'test', 'customfield': "customvalue"})) + self.assertEqual(result, 'test ++ customvalue') + + def test_logger_disabling(self): self.apply_config(self.disable_test) logger = logging.getLogger('some_pristine_logger') @@ -2909,6 +2945,30 @@ class ConfigDictTest(BaseTest): }, } + # config0 but with default values for formatter. Skipped 15, it is defined + # in the test code. + config16 = { + 'version': 1, + 'formatters': { + 'form1' : { + 'format' : '%(message)s ++ %(customfield)s', + 'defaults': {"customfield": "defaultvalue"} + }, + }, + 'handlers' : { + 'hand1' : { + 'class' : 'logging.StreamHandler', + 'formatter' : 'form1', + 'level' : 'NOTSET', + 'stream' : 'ext://sys.stdout', + }, + }, + 'root' : { + 'level' : 'WARNING', + 'handlers' : ['hand1'], + }, + } + bad_format = { "version": 1, "formatters": { @@ -3021,7 +3081,7 @@ class ConfigDictTest(BaseTest): } } - # Configuration with custom function and 'validate' set to False + # Configuration with custom function, 'validate' set to False and no defaults custom_formatter_with_function = { 'version': 1, 'formatters': { @@ -3048,6 +3108,33 @@ class ConfigDictTest(BaseTest): } } + # Configuration with custom function, and defaults + custom_formatter_with_defaults = { + 'version': 1, + 'formatters': { + 'form1': { + '()': formatFunc, + 'format': '%(levelname)s:%(name)s:%(message)s:%(customfield)s', + 'defaults': {"customfield": "myvalue"} + }, + }, + 'handlers' : { + 'hand1' : { + 'class': 'logging.StreamHandler', + 'formatter': 'form1', + 'level': 'NOTSET', + 'stream': 'ext://sys.stdout', + }, + }, + "loggers": { + "my_test_logger_custom_formatter": { + "level": "DEBUG", + "handlers": ["hand1"], + "propagate": "true" + } + } + } + config_queue_handler = { 'version': 1, 'handlers' : { @@ -3349,6 +3436,22 @@ def test_config15_ok(self): handler = logging.root.handlers[0] self.addCleanup(closeFileHandler, handler, fn) + def test_config16_ok(self): + self.apply_config(self.config16) + h = logging._handlers['hand1'] + + # Custom value + result = h.formatter.format(logging.makeLogRecord( + {'msg': 'Hello', 'customfield': 'customvalue'})) + self.assertEqual(result, 'Hello ++ customvalue') + + # Default value + result = h.formatter.format(logging.makeLogRecord( + {'msg': 'Hello'})) + self.assertEqual(result, 'Hello ++ defaultvalue') + + + def setup_via_listener(self, text, verify=None): text = text.encode("utf-8") # Ask for a randomly assigned port (by using port 0) @@ -3516,6 +3619,9 @@ def test_custom_formatter_class_with_validate3(self): def test_custom_formatter_function_with_validate(self): self.assertRaises(ValueError, self.apply_config, self.custom_formatter_with_function) + def test_custom_formatter_function_with_defaults(self): + self.assertRaises(ValueError, self.apply_config, self.custom_formatter_with_defaults) + def test_baseconfig(self): d = { 'atuple': (1, 2, 3), diff --git a/Misc/NEWS.d/next/Library/2023-04-08-01-33-12.gh-issue-103357.vjin28.rst b/Misc/NEWS.d/next/Library/2023-04-08-01-33-12.gh-issue-103357.vjin28.rst new file mode 100644 index 00000000000000..83dce56ed0b7c5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-08-01-33-12.gh-issue-103357.vjin28.rst @@ -0,0 +1,3 @@ +Added support for :class:`logging.Formatter` ``defaults`` parameter to +:func:`logging.config.dictConfig` and :func:`logging.config.fileConfig`. +Patch by Bar Harel. From d65ed693a8a13a2a7f9b201bda1224d6ae5fcf0e Mon Sep 17 00:00:00 2001 From: Furkan Onder Date: Wed, 12 Apr 2023 11:44:35 +0300 Subject: [PATCH 153/349] GH-83893: Cross reference env. vars and -X command line options (GH-103414) Co-authored-by: Erlend E. Aasland --- Doc/using/cmdline.rst | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index 2a4d070ec057df..b35e8454fa2a1a 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -495,7 +495,8 @@ Miscellaneous options Reserved for various implementation-specific options. CPython currently defines the following possible values: - * ``-X faulthandler`` to enable :mod:`faulthandler`; + * ``-X faulthandler`` to enable :mod:`faulthandler`. + See also :envvar:`PYTHONFAULTHANDLER`. * ``-X showrefcount`` to output the total reference count and number of used memory blocks when the program finishes or after each statement in the interactive interpreter. This only works on :ref:`debug builds @@ -503,8 +504,9 @@ Miscellaneous options * ``-X tracemalloc`` to start tracing Python memory allocations using the :mod:`tracemalloc` module. By default, only the most recent frame is stored in a traceback of a trace. Use ``-X tracemalloc=NFRAME`` to start - tracing with a traceback limit of *NFRAME* frames. See the - :func:`tracemalloc.start` for more information. + tracing with a traceback limit of *NFRAME* frames. + See :func:`tracemalloc.start` and :envvar:`PYTHONTRACEMALLOC` + for more information. * ``-X int_max_str_digits`` configures the :ref:`integer string conversion length limitation `. See also :envvar:`PYTHONINTMAXSTRDIGITS`. @@ -519,6 +521,7 @@ Miscellaneous options * ``-X utf8`` enables the :ref:`Python UTF-8 Mode `. ``-X utf8=0`` explicitly disables :ref:`Python UTF-8 Mode ` (even when it would otherwise activate automatically). + See also :envvar:`PYTHONUTF8`. * ``-X pycache_prefix=PATH`` enables writing ``.pyc`` files to a parallel tree rooted at the given directory instead of to the code tree. See also :envvar:`PYTHONPYCACHEPREFIX`. @@ -861,7 +864,9 @@ conflict. Python memory allocations using the :mod:`tracemalloc` module. The value of the variable is the maximum number of frames stored in a traceback of a trace. For example, ``PYTHONTRACEMALLOC=1`` stores only the most recent - frame. See the :func:`tracemalloc.start` for more information. + frame. + See the :func:`tracemalloc.start` function for more information. + This is equivalent to setting the :option:`-X` ``tracemalloc`` option. .. versionadded:: 3.4 @@ -869,8 +874,8 @@ conflict. .. envvar:: PYTHONPROFILEIMPORTTIME If this environment variable is set to a non-empty string, Python will - show how long each import takes. This is exactly equivalent to setting - ``-X importtime`` on the command line. + show how long each import takes. + This is equivalent to setting the :option:`-X` ``importtime`` option. .. versionadded:: 3.7 @@ -1012,6 +1017,7 @@ conflict. If this environment variable is set to a non-empty string, enable :ref:`Python Development Mode `, introducing additional runtime checks that are too expensive to be enabled by default. + This is equivalent to setting the :option:`-X` ``dev`` option. .. versionadded:: 3.7 From f2b7ecb7783299c4555e89125ca9ba8e89854643 Mon Sep 17 00:00:00 2001 From: Nick Burns Date: Wed, 12 Apr 2023 01:59:21 -0700 Subject: [PATCH 154/349] gh-103417: use time.monotonic in the example for sched.scheduler (#103418) --- Doc/library/sched.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/sched.rst b/Doc/library/sched.rst index a051c65b97b05e..04215d31ba10ca 100644 --- a/Doc/library/sched.rst +++ b/Doc/library/sched.rst @@ -36,7 +36,7 @@ scheduler: Example:: >>> import sched, time - >>> s = sched.scheduler(time.time, time.sleep) + >>> s = sched.scheduler(time.monotonic, time.sleep) >>> def print_time(a='default'): ... print("From print_time", time.time(), a) ... From dce2d38cb04b541bad477ccc1040a68fa70a9a69 Mon Sep 17 00:00:00 2001 From: AN Long Date: Wed, 12 Apr 2023 18:41:21 +0800 Subject: [PATCH 155/349] gh-103092: Isolate msvcrt (#103248) --- ...-04-04-21-44-25.gh-issue-103092.Dz0_Xn.rst | 1 + PC/msvcrtmodule.c | 53 +++++++++---------- 2 files changed, 26 insertions(+), 28 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-04-21-44-25.gh-issue-103092.Dz0_Xn.rst diff --git a/Misc/NEWS.d/next/Library/2023-04-04-21-44-25.gh-issue-103092.Dz0_Xn.rst b/Misc/NEWS.d/next/Library/2023-04-04-21-44-25.gh-issue-103092.Dz0_Xn.rst new file mode 100644 index 00000000000000..7bd191e3c22b2b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-04-21-44-25.gh-issue-103092.Dz0_Xn.rst @@ -0,0 +1 @@ +Adapt the :mod:`msvcrt` extension module to :pep:`687`. diff --git a/PC/msvcrtmodule.c b/PC/msvcrtmodule.c index 6e8b423c3839a9..de9a88946aff3e 100644 --- a/PC/msvcrtmodule.c +++ b/PC/msvcrtmodule.c @@ -564,19 +564,6 @@ static struct PyMethodDef msvcrt_functions[] = { {NULL, NULL} }; - -static struct PyModuleDef msvcrtmodule = { - PyModuleDef_HEAD_INIT, - "msvcrt", - NULL, - -1, - msvcrt_functions, - NULL, - NULL, - NULL, - NULL -}; - static void insertint(PyObject *d, char *name, int value) { @@ -605,14 +592,10 @@ insertptr(PyObject *d, char *name, void *value) } } -PyMODINIT_FUNC -PyInit_msvcrt(void) +static int +exec_module(PyObject* m) { int st; - PyObject *m = PyModule_Create(&msvcrtmodule); - if (m == NULL) { - return NULL; - } PyObject *d = PyModule_GetDict(m); // Borrowed ref. /* constants for the locking() function's mode argument */ @@ -645,21 +628,21 @@ PyInit_msvcrt(void) st = PyModule_AddStringConstant(m, "VC_ASSEMBLY_PUBLICKEYTOKEN", _VC_ASSEMBLY_PUBLICKEYTOKEN); if (st < 0) { - goto error; + return -1; } #endif #ifdef _CRT_ASSEMBLY_VERSION st = PyModule_AddStringConstant(m, "CRT_ASSEMBLY_VERSION", _CRT_ASSEMBLY_VERSION); if (st < 0) { - goto error; + return -1; } #endif #ifdef __LIBRARIES_ASSEMBLY_NAME_PREFIX st = PyModule_AddStringConstant(m, "LIBRARIES_ASSEMBLY_NAME_PREFIX", __LIBRARIES_ASSEMBLY_NAME_PREFIX); if (st < 0) { - goto error; + return -1; } #endif @@ -671,20 +654,34 @@ PyInit_msvcrt(void) _VC_CRT_BUILD_VERSION, _VC_CRT_RBUILD_VERSION); if (version == NULL) { - goto error; + return -1; } st = PyModule_AddObjectRef(m, "CRT_ASSEMBLY_VERSION", version); Py_DECREF(version); if (st < 0) { - goto error; + return -1; } #endif /* make compiler warning quiet if st is unused */ (void)st; - return m; + return 0; +} + +static PyModuleDef_Slot msvcrt_slots[] = { + {Py_mod_exec, exec_module}, + {0, NULL} +}; -error: - Py_DECREF(m); - return NULL; +static struct PyModuleDef msvcrtmodule = { + .m_base = PyModuleDef_HEAD_INIT, + .m_name = "msvcrt", + .m_methods = msvcrt_functions, + .m_slots = msvcrt_slots, +}; + +PyMODINIT_FUNC +PyInit_msvcrt(void) +{ + return PyModuleDef_Init(&msvcrtmodule); } From 411b1692811b2ecac59cb0df0f920861c7cf179a Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Wed, 12 Apr 2023 12:04:55 +0100 Subject: [PATCH 156/349] GH-103082: Implementation of PEP 669: Low Impact Monitoring for CPython (GH-103083) * The majority of the monitoring code is in instrumentation.c * The new instrumentation bytecodes are in bytecodes.c * legacy_tracing.c adapts the new API to the old sys.setrace and sys.setprofile APIs --- Include/cpython/code.h | 45 +- Include/cpython/pystate.h | 11 +- Include/internal/pycore_code.h | 30 +- Include/internal/pycore_frame.h | 9 +- Include/internal/pycore_instruments.h | 107 + Include/internal/pycore_interp.h | 14 +- Include/internal/pycore_opcode.h | 133 +- Include/internal/pycore_pystate.h | 10 - Include/opcode.h | 145 +- Lib/importlib/_bootstrap_external.py | 3 +- Lib/opcode.py | 27 + Lib/test/test__opcode.py | 4 + Lib/test/test_bdb.py | 3 +- Lib/test/test_code.py | 10 +- Lib/test/test_dis.py | 26 +- Lib/test/test_monitoring.py | 1044 +++++++++ Lib/test/test_sys.py | 2 +- Lib/test/test_sys_settrace.py | 60 + Makefile.pre.in | 2 + ...-03-31-17-24-03.gh-issue-103082.isRUcV.rst | 1 + Objects/codeobject.c | 107 +- Objects/frameobject.c | 170 +- Objects/object.c | 2 + PCbuild/_freeze_module.vcxproj | 2 + PCbuild/_freeze_module.vcxproj.filters | 6 + PCbuild/pythoncore.vcxproj | 2 + PCbuild/pythoncore.vcxproj.filters | 6 + Python/bytecodes.c | 442 +++- Python/ceval.c | 635 +----- Python/ceval_macros.h | 61 +- Python/clinic/instrumentation.c.h | 311 +++ Python/compile.c | 3 +- Python/generated_cases.c.h | 1394 +++++++----- Python/instrumentation.c | 2021 +++++++++++++++++ Python/legacy_tracing.c | 528 +++++ Python/makeopcodetargets.py | 1 - Python/opcode_metadata.h | 95 + Python/opcode_targets.h | 94 +- Python/pystate.c | 40 +- Python/specialize.c | 8 +- Python/sysmodule.c | 11 + Tools/build/deepfreeze.py | 2 - Tools/build/generate_opcode_h.py | 6 +- Tools/c-analyzer/cpython/globals-to-fix.tsv | 5 + 44 files changed, 6021 insertions(+), 1617 deletions(-) create mode 100644 Include/internal/pycore_instruments.h create mode 100644 Lib/test/test_monitoring.py create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-31-17-24-03.gh-issue-103082.isRUcV.rst create mode 100644 Python/clinic/instrumentation.c.h create mode 100644 Python/instrumentation.c create mode 100644 Python/legacy_tracing.c diff --git a/Include/cpython/code.h b/Include/cpython/code.h index abcf1250603dfe..6bead361c79245 100644 --- a/Include/cpython/code.h +++ b/Include/cpython/code.h @@ -3,10 +3,22 @@ #ifndef Py_LIMITED_API #ifndef Py_CODE_H #define Py_CODE_H + #ifdef __cplusplus extern "C" { #endif + +/* Count of all "real" monitoring events (not derived from other events) */ +#define PY_MONITORING_UNGROUPED_EVENTS 14 +/* Count of all monitoring events */ +#define PY_MONITORING_EVENTS 16 + +/* Table of which tools are active for each monitored event. */ +typedef struct _Py_Monitors { + uint8_t tools[PY_MONITORING_UNGROUPED_EVENTS]; +} _Py_Monitors; + /* Each instruction in a code object is a fixed-width value, * currently 2 bytes: 1-byte opcode + 1-byte oparg. The EXTENDED_ARG * opcode allows for larger values but the current limit is 3 uses @@ -56,6 +68,35 @@ typedef struct { PyObject *_co_freevars; } _PyCoCached; +/* Ancilliary data structure used for instrumentation. + Line instrumentation creates an array of + these. One entry per code unit.*/ +typedef struct { + uint8_t original_opcode; + int8_t line_delta; +} _PyCoLineInstrumentationData; + +/* Main data structure used for instrumentation. + * This is allocated when needed for instrumentation + */ +typedef struct { + /* Monitoring specific to this code object */ + _Py_Monitors local_monitors; + /* Monitoring that is active on this code object */ + _Py_Monitors active_monitors; + /* The tools that are to be notified for events for the matching code unit */ + uint8_t *tools; + /* Information to support line events */ + _PyCoLineInstrumentationData *lines; + /* The tools that are to be notified for line events for the matching code unit */ + uint8_t *line_tools; + /* Information to support instruction events */ + /* The underlying instructions, which can themselves be instrumented */ + uint8_t *per_instruction_opcodes; + /* The tools that are to be notified for instruction events for the matching code unit */ + uint8_t *per_instruction_tools; +} _PyCoMonitoringData; + // To avoid repeating ourselves in deepfreeze.py, all PyCodeObject members are // defined in this macro: #define _PyCode_DEF(SIZE) { \ @@ -87,7 +128,6 @@ typedef struct { PyObject *co_exceptiontable; /* Byte string encoding exception handling \ table */ \ int co_flags; /* CO_..., see below */ \ - short _co_linearray_entry_size; /* Size of each entry in _co_linearray */ \ \ /* The rest are not so impactful on performance. */ \ int co_argcount; /* #arguments, except *args */ \ @@ -114,8 +154,9 @@ typedef struct { PyObject *co_linetable; /* bytes object that holds location info */ \ PyObject *co_weakreflist; /* to support weakrefs to code objects */ \ _PyCoCached *_co_cached; /* cached co_* attributes */ \ + uint64_t _co_instrumentation_version; /* current instrumentation version */ \ + _PyCoMonitoringData *_co_monitoring; /* Monitoring data */ \ int _co_firsttraceable; /* index of first traceable instruction */ \ - char *_co_linearray; /* array of line offsets */ \ /* Scratch space for extra data relating to the code object. \ Type is a void* to keep the format private in codeobject.c to force \ people to go through the proper APIs. */ \ diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 3efb241e8237e7..ea6ed8d2bc4a4c 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -58,12 +58,6 @@ typedef int (*Py_tracefunc)(PyObject *, PyFrameObject *, int, PyObject *); #define PyTrace_C_RETURN 6 #define PyTrace_OPCODE 7 - -typedef struct { - PyCodeObject *code; // The code object for the bounds. May be NULL. - PyCodeAddressRange bounds; // Only valid if code != NULL. -} PyTraceInfo; - // Internal structure: you should not use it directly, but use public functions // like PyThreadState_EnterTracing() and PyThreadState_LeaveTracing(). typedef struct _PyCFrame { @@ -77,7 +71,6 @@ typedef struct _PyCFrame { * discipline and make sure that instances of this struct cannot * accessed outside of their lifetime. */ - uint8_t use_tracing; // 0 or 255 (or'ed into opcode, hence 8-bit type) /* Pointer to the currently executing frame (it can be NULL) */ struct _PyInterpreterFrame *current_frame; struct _PyCFrame *previous; @@ -157,7 +150,7 @@ struct _ts { This is to prevent the actual trace/profile code from being recorded in the trace/profile. */ int tracing; - int tracing_what; /* The event currently being traced, if any. */ + int what_event; /* The event currently being monitored, if any. */ /* Pointer to current _PyCFrame in the C stack frame of the currently, * or most recently, executing _PyEval_EvalFrameDefault. */ @@ -228,8 +221,6 @@ struct _ts { /* Unique thread state id. */ uint64_t id; - PyTraceInfo trace_info; - _PyStackChunk *datastack_chunk; PyObject **datastack_top; PyObject **datastack_limit; diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index faf1be585e17ef..d32f37ac44d83c 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -441,32 +441,6 @@ adaptive_counter_backoff(uint16_t counter) { /* Line array cache for tracing */ -extern int _PyCode_CreateLineArray(PyCodeObject *co); - -static inline int -_PyCode_InitLineArray(PyCodeObject *co) -{ - if (co->_co_linearray) { - return 0; - } - return _PyCode_CreateLineArray(co); -} - -static inline int -_PyCode_LineNumberFromArray(PyCodeObject *co, int index) -{ - assert(co->_co_linearray != NULL); - assert(index >= 0); - assert(index < Py_SIZE(co)); - if (co->_co_linearray_entry_size == 2) { - return ((int16_t *)co->_co_linearray)[index]; - } - else { - assert(co->_co_linearray_entry_size == 4); - return ((int32_t *)co->_co_linearray)[index]; - } -} - typedef struct _PyShimCodeDef { const uint8_t *code; int codelen; @@ -500,6 +474,10 @@ extern uint32_t _Py_next_func_version; #define COMPARISON_NOT_EQUALS (COMPARISON_UNORDERED | COMPARISON_LESS_THAN | COMPARISON_GREATER_THAN) +extern int _Py_Instrument(PyCodeObject *co, PyInterpreterState *interp); + +extern int _Py_GetBaseOpcode(PyCodeObject *code, int offset); + #ifdef __cplusplus } diff --git a/Include/internal/pycore_frame.h b/Include/internal/pycore_frame.h index 5806cf05f174a9..856297aaea8ab4 100644 --- a/Include/internal/pycore_frame.h +++ b/Include/internal/pycore_frame.h @@ -19,6 +19,7 @@ struct _frame { struct _PyInterpreterFrame *f_frame; /* points to the frame data */ PyObject *f_trace; /* Trace function */ int f_lineno; /* Current line number. Only valid if non-zero */ + int f_last_traced_line; /* The last line traced for this frame */ char f_trace_lines; /* Emit per-line trace events? */ char f_trace_opcodes; /* Emit per-opcode trace events? */ char f_fast_as_locals; /* Have the fast locals of this frame been converted to a dict? */ @@ -137,10 +138,16 @@ _PyFrame_GetLocalsArray(_PyInterpreterFrame *frame) return frame->localsplus; } +/* Fetches the stack pointer, and sets stacktop to -1. + Having stacktop <= 0 ensures that invalid + values are not visible to the cycle GC. + We choose -1 rather than 0 to assist debugging. */ static inline PyObject** _PyFrame_GetStackPointer(_PyInterpreterFrame *frame) { - return frame->localsplus+frame->stacktop; + PyObject **sp = frame->localsplus + frame->stacktop; + frame->stacktop = -1; + return sp; } static inline void diff --git a/Include/internal/pycore_instruments.h b/Include/internal/pycore_instruments.h new file mode 100644 index 00000000000000..e94d8755546efd --- /dev/null +++ b/Include/internal/pycore_instruments.h @@ -0,0 +1,107 @@ + +#ifndef Py_INTERNAL_INSTRUMENT_H +#define Py_INTERNAL_INSTRUMENT_H + + +#include "pycore_bitutils.h" // _Py_popcount32 +#include "pycore_frame.h" + +#include "cpython/code.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define PY_MONITORING_TOOL_IDS 8 + +/* Local events. + * These require bytecode instrumentation */ + +#define PY_MONITORING_EVENT_PY_START 0 +#define PY_MONITORING_EVENT_PY_RESUME 1 +#define PY_MONITORING_EVENT_PY_RETURN 2 +#define PY_MONITORING_EVENT_PY_YIELD 3 +#define PY_MONITORING_EVENT_CALL 4 +#define PY_MONITORING_EVENT_LINE 5 +#define PY_MONITORING_EVENT_INSTRUCTION 6 +#define PY_MONITORING_EVENT_JUMP 7 +#define PY_MONITORING_EVENT_BRANCH 8 +#define PY_MONITORING_EVENT_STOP_ITERATION 9 + +#define PY_MONITORING_INSTRUMENTED_EVENTS 10 + +/* Other events, mainly exceptions */ + +#define PY_MONITORING_EVENT_RAISE 10 +#define PY_MONITORING_EVENT_EXCEPTION_HANDLED 11 +#define PY_MONITORING_EVENT_PY_UNWIND 12 +#define PY_MONITORING_EVENT_PY_THROW 13 + + +/* Ancilliary events */ + +#define PY_MONITORING_EVENT_C_RETURN 14 +#define PY_MONITORING_EVENT_C_RAISE 15 + + +typedef uint32_t _PyMonitoringEventSet; + +/* Tool IDs */ + +/* These are defined in PEP 669 for convenience to avoid clashes */ +#define PY_MONITORING_DEBUGGER_ID 0 +#define PY_MONITORING_COVERAGE_ID 1 +#define PY_MONITORING_PROFILER_ID 2 +#define PY_MONITORING_OPTIMIZER_ID 5 + +/* Internal IDs used to suuport sys.setprofile() and sys.settrace() */ +#define PY_MONITORING_SYS_PROFILE_ID 6 +#define PY_MONITORING_SYS_TRACE_ID 7 + + +PyObject *_PyMonitoring_RegisterCallback(int tool_id, int event_id, PyObject *obj); + +int _PyMonitoring_SetEvents(int tool_id, _PyMonitoringEventSet events); + +extern int +_Py_call_instrumentation(PyThreadState *tstate, int event, + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr); + +extern int +_Py_call_instrumentation_line(PyThreadState *tstate, _PyInterpreterFrame* frame, + _Py_CODEUNIT *instr); + +extern int +_Py_call_instrumentation_instruction( + PyThreadState *tstate, _PyInterpreterFrame* frame, _Py_CODEUNIT *instr); + +int +_Py_call_instrumentation_jump( + PyThreadState *tstate, int event, + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr, _Py_CODEUNIT *target); + +extern int +_Py_call_instrumentation_arg(PyThreadState *tstate, int event, + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg); + +extern int +_Py_call_instrumentation_2args(PyThreadState *tstate, int event, + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg0, PyObject *arg1); + +extern void +_Py_call_instrumentation_exc0(PyThreadState *tstate, int event, + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr); + +extern void +_Py_call_instrumentation_exc2(PyThreadState *tstate, int event, + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg0, PyObject *arg1); + +extern int +_Py_Instrumentation_GetLine(PyCodeObject *code, int index); + +extern PyObject _PyInstrumentation_MISSING; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_INSTRUMENT_H */ diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index d64a68cd2da54e..86ae3d8dfc1860 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -24,6 +24,7 @@ extern "C" { #include "pycore_genobject.h" // struct _Py_async_gen_state #include "pycore_gc.h" // struct _gc_runtime_state #include "pycore_import.h" // struct _import_state +#include "pycore_instruments.h" // PY_MONITORING_EVENTS #include "pycore_list.h" // struct _Py_list_state #include "pycore_global_objects.h" // struct _Py_interp_static_objects #include "pycore_object_state.h" // struct _py_object_state @@ -37,7 +38,6 @@ struct _Py_long_state { int max_str_digits; }; - /* interpreter state */ /* PyInterpreterState holds the global state for one of the runtime's @@ -49,6 +49,9 @@ struct _is { PyInterpreterState *next; + uint64_t monitoring_version; + uint64_t last_restart_version; + struct pythreads { uint64_t next_unique_id; /* The linked list of threads, newest first. */ @@ -148,6 +151,15 @@ struct _is { struct callable_cache callable_cache; PyCodeObject *interpreter_trampoline; + _Py_Monitors monitors; + bool f_opcode_trace_set; + bool sys_profile_initialized; + bool sys_trace_initialized; + Py_ssize_t sys_profiling_threads; /* Count of threads with c_profilefunc set */ + Py_ssize_t sys_tracing_threads; /* Count of threads with c_tracefunc set */ + PyObject *monitoring_callables[PY_MONITORING_TOOL_IDS][PY_MONITORING_EVENTS]; + PyObject *monitoring_tool_names[PY_MONITORING_TOOL_IDS]; + struct _Py_interp_cached_objects cached_objects; struct _Py_interp_static_objects static_objects; diff --git a/Include/internal/pycore_opcode.h b/Include/internal/pycore_opcode.h index f5e9176a3e66c7..c039d712dc0ba1 100644 --- a/Include/internal/pycore_opcode.h +++ b/Include/internal/pycore_opcode.h @@ -112,6 +112,7 @@ const uint8_t _PyOpcode_Deopt[256] = { [DICT_UPDATE] = DICT_UPDATE, [END_ASYNC_FOR] = END_ASYNC_FOR, [END_FOR] = END_FOR, + [END_SEND] = END_SEND, [EXTENDED_ARG] = EXTENDED_ARG, [FORMAT_VALUE] = FORMAT_VALUE, [FOR_ITER] = FOR_ITER, @@ -127,6 +128,23 @@ const uint8_t _PyOpcode_Deopt[256] = { [GET_YIELD_FROM_ITER] = GET_YIELD_FROM_ITER, [IMPORT_FROM] = IMPORT_FROM, [IMPORT_NAME] = IMPORT_NAME, + [INSTRUMENTED_CALL] = INSTRUMENTED_CALL, + [INSTRUMENTED_CALL_FUNCTION_EX] = INSTRUMENTED_CALL_FUNCTION_EX, + [INSTRUMENTED_END_FOR] = INSTRUMENTED_END_FOR, + [INSTRUMENTED_END_SEND] = INSTRUMENTED_END_SEND, + [INSTRUMENTED_FOR_ITER] = INSTRUMENTED_FOR_ITER, + [INSTRUMENTED_INSTRUCTION] = INSTRUMENTED_INSTRUCTION, + [INSTRUMENTED_JUMP_BACKWARD] = INSTRUMENTED_JUMP_BACKWARD, + [INSTRUMENTED_JUMP_FORWARD] = INSTRUMENTED_JUMP_FORWARD, + [INSTRUMENTED_LINE] = INSTRUMENTED_LINE, + [INSTRUMENTED_POP_JUMP_IF_FALSE] = INSTRUMENTED_POP_JUMP_IF_FALSE, + [INSTRUMENTED_POP_JUMP_IF_NONE] = INSTRUMENTED_POP_JUMP_IF_NONE, + [INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = INSTRUMENTED_POP_JUMP_IF_NOT_NONE, + [INSTRUMENTED_POP_JUMP_IF_TRUE] = INSTRUMENTED_POP_JUMP_IF_TRUE, + [INSTRUMENTED_RESUME] = INSTRUMENTED_RESUME, + [INSTRUMENTED_RETURN_CONST] = INSTRUMENTED_RETURN_CONST, + [INSTRUMENTED_RETURN_VALUE] = INSTRUMENTED_RETURN_VALUE, + [INSTRUMENTED_YIELD_VALUE] = INSTRUMENTED_YIELD_VALUE, [INTERPRETER_EXIT] = INTERPRETER_EXIT, [IS_OP] = IS_OP, [JUMP_BACKWARD] = JUMP_BACKWARD, @@ -179,6 +197,7 @@ const uint8_t _PyOpcode_Deopt[256] = { [PUSH_NULL] = PUSH_NULL, [RAISE_VARARGS] = RAISE_VARARGS, [RERAISE] = RERAISE, + [RESERVED] = RESERVED, [RESUME] = RESUME, [RETURN_CONST] = RETURN_CONST, [RETURN_GENERATOR] = RETURN_GENERATOR, @@ -223,17 +242,19 @@ static const char *const _PyOpcode_OpName[263] = { [PUSH_NULL] = "PUSH_NULL", [INTERPRETER_EXIT] = "INTERPRETER_EXIT", [END_FOR] = "END_FOR", + [END_SEND] = "END_SEND", [BINARY_OP_ADD_FLOAT] = "BINARY_OP_ADD_FLOAT", [BINARY_OP_ADD_INT] = "BINARY_OP_ADD_INT", [BINARY_OP_ADD_UNICODE] = "BINARY_OP_ADD_UNICODE", - [BINARY_OP_INPLACE_ADD_UNICODE] = "BINARY_OP_INPLACE_ADD_UNICODE", [NOP] = "NOP", - [BINARY_OP_MULTIPLY_FLOAT] = "BINARY_OP_MULTIPLY_FLOAT", + [BINARY_OP_INPLACE_ADD_UNICODE] = "BINARY_OP_INPLACE_ADD_UNICODE", [UNARY_NEGATIVE] = "UNARY_NEGATIVE", [UNARY_NOT] = "UNARY_NOT", + [BINARY_OP_MULTIPLY_FLOAT] = "BINARY_OP_MULTIPLY_FLOAT", [BINARY_OP_MULTIPLY_INT] = "BINARY_OP_MULTIPLY_INT", - [BINARY_OP_SUBTRACT_FLOAT] = "BINARY_OP_SUBTRACT_FLOAT", [UNARY_INVERT] = "UNARY_INVERT", + [BINARY_OP_SUBTRACT_FLOAT] = "BINARY_OP_SUBTRACT_FLOAT", + [RESERVED] = "RESERVED", [BINARY_OP_SUBTRACT_INT] = "BINARY_OP_SUBTRACT_INT", [BINARY_SUBSCR_DICT] = "BINARY_SUBSCR_DICT", [BINARY_SUBSCR_GETITEM] = "BINARY_SUBSCR_GETITEM", @@ -241,21 +262,21 @@ static const char *const _PyOpcode_OpName[263] = { [BINARY_SUBSCR_TUPLE_INT] = "BINARY_SUBSCR_TUPLE_INT", [CALL_PY_EXACT_ARGS] = "CALL_PY_EXACT_ARGS", [CALL_PY_WITH_DEFAULTS] = "CALL_PY_WITH_DEFAULTS", - [CALL_BOUND_METHOD_EXACT_ARGS] = "CALL_BOUND_METHOD_EXACT_ARGS", - [CALL_BUILTIN_CLASS] = "CALL_BUILTIN_CLASS", [BINARY_SUBSCR] = "BINARY_SUBSCR", [BINARY_SLICE] = "BINARY_SLICE", [STORE_SLICE] = "STORE_SLICE", - [CALL_BUILTIN_FAST_WITH_KEYWORDS] = "CALL_BUILTIN_FAST_WITH_KEYWORDS", - [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS", + [CALL_BOUND_METHOD_EXACT_ARGS] = "CALL_BOUND_METHOD_EXACT_ARGS", + [CALL_BUILTIN_CLASS] = "CALL_BUILTIN_CLASS", [GET_LEN] = "GET_LEN", [MATCH_MAPPING] = "MATCH_MAPPING", [MATCH_SEQUENCE] = "MATCH_SEQUENCE", [MATCH_KEYS] = "MATCH_KEYS", - [CALL_NO_KW_BUILTIN_FAST] = "CALL_NO_KW_BUILTIN_FAST", + [CALL_BUILTIN_FAST_WITH_KEYWORDS] = "CALL_BUILTIN_FAST_WITH_KEYWORDS", [PUSH_EXC_INFO] = "PUSH_EXC_INFO", [CHECK_EXC_MATCH] = "CHECK_EXC_MATCH", [CHECK_EG_MATCH] = "CHECK_EG_MATCH", + [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS", + [CALL_NO_KW_BUILTIN_FAST] = "CALL_NO_KW_BUILTIN_FAST", [CALL_NO_KW_BUILTIN_O] = "CALL_NO_KW_BUILTIN_O", [CALL_NO_KW_ISINSTANCE] = "CALL_NO_KW_ISINSTANCE", [CALL_NO_KW_LEN] = "CALL_NO_KW_LEN", @@ -265,8 +286,6 @@ static const char *const _PyOpcode_OpName[263] = { [CALL_NO_KW_METHOD_DESCRIPTOR_O] = "CALL_NO_KW_METHOD_DESCRIPTOR_O", [CALL_NO_KW_STR_1] = "CALL_NO_KW_STR_1", [CALL_NO_KW_TUPLE_1] = "CALL_NO_KW_TUPLE_1", - [CALL_NO_KW_TYPE_1] = "CALL_NO_KW_TYPE_1", - [COMPARE_OP_FLOAT] = "COMPARE_OP_FLOAT", [WITH_EXCEPT_START] = "WITH_EXCEPT_START", [GET_AITER] = "GET_AITER", [GET_ANEXT] = "GET_ANEXT", @@ -274,39 +293,39 @@ static const char *const _PyOpcode_OpName[263] = { [BEFORE_WITH] = "BEFORE_WITH", [END_ASYNC_FOR] = "END_ASYNC_FOR", [CLEANUP_THROW] = "CLEANUP_THROW", + [CALL_NO_KW_TYPE_1] = "CALL_NO_KW_TYPE_1", + [COMPARE_OP_FLOAT] = "COMPARE_OP_FLOAT", [COMPARE_OP_INT] = "COMPARE_OP_INT", [COMPARE_OP_STR] = "COMPARE_OP_STR", - [FOR_ITER_LIST] = "FOR_ITER_LIST", - [FOR_ITER_TUPLE] = "FOR_ITER_TUPLE", [STORE_SUBSCR] = "STORE_SUBSCR", [DELETE_SUBSCR] = "DELETE_SUBSCR", + [FOR_ITER_LIST] = "FOR_ITER_LIST", + [FOR_ITER_TUPLE] = "FOR_ITER_TUPLE", [FOR_ITER_RANGE] = "FOR_ITER_RANGE", [FOR_ITER_GEN] = "FOR_ITER_GEN", [LOAD_ATTR_CLASS] = "LOAD_ATTR_CLASS", [LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = "LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN", - [LOAD_ATTR_INSTANCE_VALUE] = "LOAD_ATTR_INSTANCE_VALUE", - [LOAD_ATTR_MODULE] = "LOAD_ATTR_MODULE", [GET_ITER] = "GET_ITER", [GET_YIELD_FROM_ITER] = "GET_YIELD_FROM_ITER", - [LOAD_ATTR_PROPERTY] = "LOAD_ATTR_PROPERTY", + [LOAD_ATTR_INSTANCE_VALUE] = "LOAD_ATTR_INSTANCE_VALUE", [LOAD_BUILD_CLASS] = "LOAD_BUILD_CLASS", - [LOAD_ATTR_SLOT] = "LOAD_ATTR_SLOT", - [LOAD_ATTR_WITH_HINT] = "LOAD_ATTR_WITH_HINT", + [LOAD_ATTR_MODULE] = "LOAD_ATTR_MODULE", + [LOAD_ATTR_PROPERTY] = "LOAD_ATTR_PROPERTY", [LOAD_ASSERTION_ERROR] = "LOAD_ASSERTION_ERROR", [RETURN_GENERATOR] = "RETURN_GENERATOR", + [LOAD_ATTR_SLOT] = "LOAD_ATTR_SLOT", + [LOAD_ATTR_WITH_HINT] = "LOAD_ATTR_WITH_HINT", [LOAD_ATTR_METHOD_LAZY_DICT] = "LOAD_ATTR_METHOD_LAZY_DICT", [LOAD_ATTR_METHOD_NO_DICT] = "LOAD_ATTR_METHOD_NO_DICT", [LOAD_ATTR_METHOD_WITH_VALUES] = "LOAD_ATTR_METHOD_WITH_VALUES", [LOAD_CONST__LOAD_FAST] = "LOAD_CONST__LOAD_FAST", [LOAD_FAST__LOAD_CONST] = "LOAD_FAST__LOAD_CONST", + [RETURN_VALUE] = "RETURN_VALUE", [LOAD_FAST__LOAD_FAST] = "LOAD_FAST__LOAD_FAST", + [SETUP_ANNOTATIONS] = "SETUP_ANNOTATIONS", [LOAD_GLOBAL_BUILTIN] = "LOAD_GLOBAL_BUILTIN", - [RETURN_VALUE] = "RETURN_VALUE", [LOAD_GLOBAL_MODULE] = "LOAD_GLOBAL_MODULE", - [SETUP_ANNOTATIONS] = "SETUP_ANNOTATIONS", [STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE", - [STORE_ATTR_SLOT] = "STORE_ATTR_SLOT", - [STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT", [POP_EXCEPT] = "POP_EXCEPT", [STORE_NAME] = "STORE_NAME", [DELETE_NAME] = "DELETE_NAME", @@ -329,9 +348,9 @@ static const char *const _PyOpcode_OpName[263] = { [IMPORT_NAME] = "IMPORT_NAME", [IMPORT_FROM] = "IMPORT_FROM", [JUMP_FORWARD] = "JUMP_FORWARD", + [STORE_ATTR_SLOT] = "STORE_ATTR_SLOT", + [STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT", [STORE_FAST__LOAD_FAST] = "STORE_FAST__LOAD_FAST", - [STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST", - [STORE_SUBSCR_DICT] = "STORE_SUBSCR_DICT", [POP_JUMP_IF_FALSE] = "POP_JUMP_IF_FALSE", [POP_JUMP_IF_TRUE] = "POP_JUMP_IF_TRUE", [LOAD_GLOBAL] = "LOAD_GLOBAL", @@ -359,9 +378,9 @@ static const char *const _PyOpcode_OpName[263] = { [STORE_DEREF] = "STORE_DEREF", [DELETE_DEREF] = "DELETE_DEREF", [JUMP_BACKWARD] = "JUMP_BACKWARD", - [STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT", + [STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST", [CALL_FUNCTION_EX] = "CALL_FUNCTION_EX", - [UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST", + [STORE_SUBSCR_DICT] = "STORE_SUBSCR_DICT", [EXTENDED_ARG] = "EXTENDED_ARG", [LIST_APPEND] = "LIST_APPEND", [SET_ADD] = "SET_ADD", @@ -371,14 +390,14 @@ static const char *const _PyOpcode_OpName[263] = { [YIELD_VALUE] = "YIELD_VALUE", [RESUME] = "RESUME", [MATCH_CLASS] = "MATCH_CLASS", - [UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE", - [UNPACK_SEQUENCE_TWO_TUPLE] = "UNPACK_SEQUENCE_TWO_TUPLE", + [STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT", + [UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST", [FORMAT_VALUE] = "FORMAT_VALUE", [BUILD_CONST_KEY_MAP] = "BUILD_CONST_KEY_MAP", [BUILD_STRING] = "BUILD_STRING", + [UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE", + [UNPACK_SEQUENCE_TWO_TUPLE] = "UNPACK_SEQUENCE_TWO_TUPLE", [SEND_GEN] = "SEND_GEN", - [159] = "<159>", - [160] = "<160>", [161] = "<161>", [LIST_EXTEND] = "LIST_EXTEND", [SET_UPDATE] = "SET_UPDATE", @@ -456,24 +475,24 @@ static const char *const _PyOpcode_OpName[263] = { [235] = "<235>", [236] = "<236>", [237] = "<237>", - [238] = "<238>", - [239] = "<239>", - [240] = "<240>", - [241] = "<241>", - [242] = "<242>", - [243] = "<243>", - [244] = "<244>", - [245] = "<245>", - [246] = "<246>", - [247] = "<247>", - [248] = "<248>", - [249] = "<249>", - [250] = "<250>", - [251] = "<251>", - [252] = "<252>", - [253] = "<253>", - [254] = "<254>", - [DO_TRACING] = "DO_TRACING", + [INSTRUMENTED_POP_JUMP_IF_NONE] = "INSTRUMENTED_POP_JUMP_IF_NONE", + [INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = "INSTRUMENTED_POP_JUMP_IF_NOT_NONE", + [INSTRUMENTED_RESUME] = "INSTRUMENTED_RESUME", + [INSTRUMENTED_CALL] = "INSTRUMENTED_CALL", + [INSTRUMENTED_RETURN_VALUE] = "INSTRUMENTED_RETURN_VALUE", + [INSTRUMENTED_YIELD_VALUE] = "INSTRUMENTED_YIELD_VALUE", + [INSTRUMENTED_CALL_FUNCTION_EX] = "INSTRUMENTED_CALL_FUNCTION_EX", + [INSTRUMENTED_JUMP_FORWARD] = "INSTRUMENTED_JUMP_FORWARD", + [INSTRUMENTED_JUMP_BACKWARD] = "INSTRUMENTED_JUMP_BACKWARD", + [INSTRUMENTED_RETURN_CONST] = "INSTRUMENTED_RETURN_CONST", + [INSTRUMENTED_FOR_ITER] = "INSTRUMENTED_FOR_ITER", + [INSTRUMENTED_POP_JUMP_IF_FALSE] = "INSTRUMENTED_POP_JUMP_IF_FALSE", + [INSTRUMENTED_POP_JUMP_IF_TRUE] = "INSTRUMENTED_POP_JUMP_IF_TRUE", + [INSTRUMENTED_END_FOR] = "INSTRUMENTED_END_FOR", + [INSTRUMENTED_END_SEND] = "INSTRUMENTED_END_SEND", + [INSTRUMENTED_INSTRUCTION] = "INSTRUMENTED_INSTRUCTION", + [INSTRUMENTED_LINE] = "INSTRUMENTED_LINE", + [255] = "<255>", [SETUP_FINALLY] = "SETUP_FINALLY", [SETUP_CLEANUP] = "SETUP_CLEANUP", [SETUP_WITH] = "SETUP_WITH", @@ -485,8 +504,6 @@ static const char *const _PyOpcode_OpName[263] = { #endif #define EXTRA_CASES \ - case 159: \ - case 160: \ case 161: \ case 166: \ case 167: \ @@ -556,23 +573,7 @@ static const char *const _PyOpcode_OpName[263] = { case 235: \ case 236: \ case 237: \ - case 238: \ - case 239: \ - case 240: \ - case 241: \ - case 242: \ - case 243: \ - case 244: \ - case 245: \ - case 246: \ - case 247: \ - case 248: \ - case 249: \ - case 250: \ - case 251: \ - case 252: \ - case 253: \ - case 254: \ + case 255: \ ; #ifdef __cplusplus diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index b5408622d9d4b2..6e5f2289cb6b95 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -133,16 +133,6 @@ extern void _PyThreadState_BindDetached(PyThreadState *); extern void _PyThreadState_UnbindDetached(PyThreadState *); -static inline void -_PyThreadState_UpdateTracingState(PyThreadState *tstate) -{ - bool use_tracing = - (tstate->tracing == 0) && - (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL); - tstate->cframe->use_tracing = (use_tracing ? 255 : 0); -} - - /* Other */ PyAPI_FUNC(PyThreadState *) _PyThreadState_Swap( diff --git a/Include/opcode.h b/Include/opcode.h index 0ff84dc5a551a0..aa8716ef5b4030 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -13,10 +13,12 @@ extern "C" { #define PUSH_NULL 2 #define INTERPRETER_EXIT 3 #define END_FOR 4 +#define END_SEND 5 #define NOP 9 #define UNARY_NEGATIVE 11 #define UNARY_NOT 12 #define UNARY_INVERT 15 +#define RESERVED 17 #define BINARY_SUBSCR 25 #define BINARY_SLICE 26 #define STORE_SLICE 27 @@ -114,6 +116,24 @@ extern "C" { #define KW_NAMES 172 #define CALL_INTRINSIC_1 173 #define CALL_INTRINSIC_2 174 +#define MIN_INSTRUMENTED_OPCODE 238 +#define INSTRUMENTED_POP_JUMP_IF_NONE 238 +#define INSTRUMENTED_POP_JUMP_IF_NOT_NONE 239 +#define INSTRUMENTED_RESUME 240 +#define INSTRUMENTED_CALL 241 +#define INSTRUMENTED_RETURN_VALUE 242 +#define INSTRUMENTED_YIELD_VALUE 243 +#define INSTRUMENTED_CALL_FUNCTION_EX 244 +#define INSTRUMENTED_JUMP_FORWARD 245 +#define INSTRUMENTED_JUMP_BACKWARD 246 +#define INSTRUMENTED_RETURN_CONST 247 +#define INSTRUMENTED_FOR_ITER 248 +#define INSTRUMENTED_POP_JUMP_IF_FALSE 249 +#define INSTRUMENTED_POP_JUMP_IF_TRUE 250 +#define INSTRUMENTED_END_FOR 251 +#define INSTRUMENTED_END_SEND 252 +#define INSTRUMENTED_INSTRUCTION 253 +#define INSTRUMENTED_LINE 254 #define MIN_PSEUDO_OPCODE 256 #define SETUP_FINALLY 256 #define SETUP_CLEANUP 257 @@ -123,69 +143,68 @@ extern "C" { #define JUMP_NO_INTERRUPT 261 #define LOAD_METHOD 262 #define MAX_PSEUDO_OPCODE 262 -#define BINARY_OP_ADD_FLOAT 5 -#define BINARY_OP_ADD_INT 6 -#define BINARY_OP_ADD_UNICODE 7 -#define BINARY_OP_INPLACE_ADD_UNICODE 8 -#define BINARY_OP_MULTIPLY_FLOAT 10 -#define BINARY_OP_MULTIPLY_INT 13 -#define BINARY_OP_SUBTRACT_FLOAT 14 -#define BINARY_OP_SUBTRACT_INT 16 -#define BINARY_SUBSCR_DICT 17 -#define BINARY_SUBSCR_GETITEM 18 -#define BINARY_SUBSCR_LIST_INT 19 -#define BINARY_SUBSCR_TUPLE_INT 20 -#define CALL_PY_EXACT_ARGS 21 -#define CALL_PY_WITH_DEFAULTS 22 -#define CALL_BOUND_METHOD_EXACT_ARGS 23 -#define CALL_BUILTIN_CLASS 24 -#define CALL_BUILTIN_FAST_WITH_KEYWORDS 28 -#define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 29 -#define CALL_NO_KW_BUILTIN_FAST 34 -#define CALL_NO_KW_BUILTIN_O 38 -#define CALL_NO_KW_ISINSTANCE 39 -#define CALL_NO_KW_LEN 40 -#define CALL_NO_KW_LIST_APPEND 41 -#define CALL_NO_KW_METHOD_DESCRIPTOR_FAST 42 -#define CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS 43 -#define CALL_NO_KW_METHOD_DESCRIPTOR_O 44 -#define CALL_NO_KW_STR_1 45 -#define CALL_NO_KW_TUPLE_1 46 -#define CALL_NO_KW_TYPE_1 47 -#define COMPARE_OP_FLOAT 48 -#define COMPARE_OP_INT 56 -#define COMPARE_OP_STR 57 -#define FOR_ITER_LIST 58 -#define FOR_ITER_TUPLE 59 -#define FOR_ITER_RANGE 62 -#define FOR_ITER_GEN 63 -#define LOAD_ATTR_CLASS 64 -#define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 65 -#define LOAD_ATTR_INSTANCE_VALUE 66 -#define LOAD_ATTR_MODULE 67 -#define LOAD_ATTR_PROPERTY 70 -#define LOAD_ATTR_SLOT 72 -#define LOAD_ATTR_WITH_HINT 73 -#define LOAD_ATTR_METHOD_LAZY_DICT 76 -#define LOAD_ATTR_METHOD_NO_DICT 77 -#define LOAD_ATTR_METHOD_WITH_VALUES 78 -#define LOAD_CONST__LOAD_FAST 79 -#define LOAD_FAST__LOAD_CONST 80 -#define LOAD_FAST__LOAD_FAST 81 -#define LOAD_GLOBAL_BUILTIN 82 -#define LOAD_GLOBAL_MODULE 84 -#define STORE_ATTR_INSTANCE_VALUE 86 -#define STORE_ATTR_SLOT 87 -#define STORE_ATTR_WITH_HINT 88 -#define STORE_FAST__LOAD_FAST 111 -#define STORE_FAST__STORE_FAST 112 -#define STORE_SUBSCR_DICT 113 -#define STORE_SUBSCR_LIST_INT 141 -#define UNPACK_SEQUENCE_LIST 143 -#define UNPACK_SEQUENCE_TUPLE 153 -#define UNPACK_SEQUENCE_TWO_TUPLE 154 -#define SEND_GEN 158 -#define DO_TRACING 255 +#define BINARY_OP_ADD_FLOAT 6 +#define BINARY_OP_ADD_INT 7 +#define BINARY_OP_ADD_UNICODE 8 +#define BINARY_OP_INPLACE_ADD_UNICODE 10 +#define BINARY_OP_MULTIPLY_FLOAT 13 +#define BINARY_OP_MULTIPLY_INT 14 +#define BINARY_OP_SUBTRACT_FLOAT 16 +#define BINARY_OP_SUBTRACT_INT 18 +#define BINARY_SUBSCR_DICT 19 +#define BINARY_SUBSCR_GETITEM 20 +#define BINARY_SUBSCR_LIST_INT 21 +#define BINARY_SUBSCR_TUPLE_INT 22 +#define CALL_PY_EXACT_ARGS 23 +#define CALL_PY_WITH_DEFAULTS 24 +#define CALL_BOUND_METHOD_EXACT_ARGS 28 +#define CALL_BUILTIN_CLASS 29 +#define CALL_BUILTIN_FAST_WITH_KEYWORDS 34 +#define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 38 +#define CALL_NO_KW_BUILTIN_FAST 39 +#define CALL_NO_KW_BUILTIN_O 40 +#define CALL_NO_KW_ISINSTANCE 41 +#define CALL_NO_KW_LEN 42 +#define CALL_NO_KW_LIST_APPEND 43 +#define CALL_NO_KW_METHOD_DESCRIPTOR_FAST 44 +#define CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS 45 +#define CALL_NO_KW_METHOD_DESCRIPTOR_O 46 +#define CALL_NO_KW_STR_1 47 +#define CALL_NO_KW_TUPLE_1 48 +#define CALL_NO_KW_TYPE_1 56 +#define COMPARE_OP_FLOAT 57 +#define COMPARE_OP_INT 58 +#define COMPARE_OP_STR 59 +#define FOR_ITER_LIST 62 +#define FOR_ITER_TUPLE 63 +#define FOR_ITER_RANGE 64 +#define FOR_ITER_GEN 65 +#define LOAD_ATTR_CLASS 66 +#define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 67 +#define LOAD_ATTR_INSTANCE_VALUE 70 +#define LOAD_ATTR_MODULE 72 +#define LOAD_ATTR_PROPERTY 73 +#define LOAD_ATTR_SLOT 76 +#define LOAD_ATTR_WITH_HINT 77 +#define LOAD_ATTR_METHOD_LAZY_DICT 78 +#define LOAD_ATTR_METHOD_NO_DICT 79 +#define LOAD_ATTR_METHOD_WITH_VALUES 80 +#define LOAD_CONST__LOAD_FAST 81 +#define LOAD_FAST__LOAD_CONST 82 +#define LOAD_FAST__LOAD_FAST 84 +#define LOAD_GLOBAL_BUILTIN 86 +#define LOAD_GLOBAL_MODULE 87 +#define STORE_ATTR_INSTANCE_VALUE 88 +#define STORE_ATTR_SLOT 111 +#define STORE_ATTR_WITH_HINT 112 +#define STORE_FAST__LOAD_FAST 113 +#define STORE_FAST__STORE_FAST 141 +#define STORE_SUBSCR_DICT 143 +#define STORE_SUBSCR_LIST_INT 153 +#define UNPACK_SEQUENCE_LIST 154 +#define UNPACK_SEQUENCE_TUPLE 158 +#define UNPACK_SEQUENCE_TWO_TUPLE 159 +#define SEND_GEN 160 #define HAS_ARG(op) ((((op) >= HAVE_ARGUMENT) && (!IS_PSEUDO_OPCODE(op)))\ || ((op) == JUMP) \ diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index de6c434450fc82..c0c757d94d8781 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -439,6 +439,7 @@ def _write_atomic(path, data, mode=0o666): # Python 3.12a7 3523 (Convert COMPARE_AND_BRANCH back to COMPARE_OP) # Python 3.12a7 3524 (Shrink the BINARY_SUBSCR caches) # Python 3.12b1 3525 (Shrink the CALL caches) +# Python 3.12a7 3526 (Add instrumentation support) # Python 3.13 will start with 3550 @@ -455,7 +456,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3525).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3526).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c diff --git a/Lib/opcode.py b/Lib/opcode.py index b62dfa1bcb42c5..dd739e5dd3f6f8 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -83,6 +83,7 @@ def pseudo_op(name, op, real_ops): def_op('INTERPRETER_EXIT', 3) def_op('END_FOR', 4) +def_op('END_SEND', 5) def_op('NOP', 9) @@ -91,6 +92,10 @@ def pseudo_op(name, op, real_ops): def_op('UNARY_INVERT', 15) +# We reserve 17 as it is the initial value for the specializing counter +# This helps us catch cases where we attempt to execute a cache. +def_op('RESERVED', 17) + def_op('BINARY_SUBSCR', 25) def_op('BINARY_SLICE', 26) def_op('STORE_SLICE', 27) @@ -221,6 +226,28 @@ def pseudo_op(name, op, real_ops): def_op('CALL_INTRINSIC_1', 173) def_op('CALL_INTRINSIC_2', 174) +# Instrumented instructions +MIN_INSTRUMENTED_OPCODE = 238 + +def_op('INSTRUMENTED_POP_JUMP_IF_NONE', 238) +def_op('INSTRUMENTED_POP_JUMP_IF_NOT_NONE', 239) +def_op('INSTRUMENTED_RESUME', 240) +def_op('INSTRUMENTED_CALL', 241) +def_op('INSTRUMENTED_RETURN_VALUE', 242) +def_op('INSTRUMENTED_YIELD_VALUE', 243) +def_op('INSTRUMENTED_CALL_FUNCTION_EX', 244) +def_op('INSTRUMENTED_JUMP_FORWARD', 245) +def_op('INSTRUMENTED_JUMP_BACKWARD', 246) +def_op('INSTRUMENTED_RETURN_CONST', 247) +def_op('INSTRUMENTED_FOR_ITER', 248) +def_op('INSTRUMENTED_POP_JUMP_IF_FALSE', 249) +def_op('INSTRUMENTED_POP_JUMP_IF_TRUE', 250) +def_op('INSTRUMENTED_END_FOR', 251) +def_op('INSTRUMENTED_END_SEND', 252) +def_op('INSTRUMENTED_INSTRUCTION', 253) +def_op('INSTRUMENTED_LINE', 254) +# 255 is reserved + hasarg.extend([op for op in opmap.values() if op >= HAVE_ARGUMENT]) MIN_PSEUDO_OPCODE = 256 diff --git a/Lib/test/test__opcode.py b/Lib/test/test__opcode.py index 31f3c53992db13..7640c6fb57d4f3 100644 --- a/Lib/test/test__opcode.py +++ b/Lib/test/test__opcode.py @@ -20,6 +20,8 @@ def test_stack_effect(self): # All defined opcodes has_arg = dis.hasarg for name, code in filter(lambda item: item[0] not in dis.deoptmap, dis.opmap.items()): + if code >= opcode.MIN_INSTRUMENTED_OPCODE: + continue with self.subTest(opname=name): if code not in has_arg: stack_effect(code) @@ -47,6 +49,8 @@ def test_stack_effect_jump(self): has_exc = dis.hasexc has_jump = dis.hasjabs + dis.hasjrel for name, code in filter(lambda item: item[0] not in dis.deoptmap, dis.opmap.items()): + if code >= opcode.MIN_INSTRUMENTED_OPCODE: + continue with self.subTest(opname=name): if code not in has_arg: common = stack_effect(code) diff --git a/Lib/test/test_bdb.py b/Lib/test/test_bdb.py index 042c2daea7f797..fc4b8094316332 100644 --- a/Lib/test/test_bdb.py +++ b/Lib/test/test_bdb.py @@ -433,8 +433,9 @@ def __exit__(self, type_=None, value=None, traceback=None): not_empty = '' if self.tracer.set_list: not_empty += 'All paired tuples have not been processed, ' - not_empty += ('the last one was number %d' % + not_empty += ('the last one was number %d\n' % self.tracer.expect_set_no) + not_empty += repr(self.tracer.set_list) # Make a BdbNotExpectedError a unittest failure. if type_ is not None and issubclass(BdbNotExpectedError, type_): diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 7543c9ab342119..ecb3525a928468 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -349,14 +349,14 @@ def test_invalid_bytecode(self): def foo(): pass - # assert that opcode 238 is invalid - self.assertEqual(opname[238], '<238>') + # assert that opcode 229 is invalid + self.assertEqual(opname[229], '<229>') - # change first opcode to 0xee (=238) + # change first opcode to 0xeb (=229) foo.__code__ = foo.__code__.replace( - co_code=b'\xee' + foo.__code__.co_code[1:]) + co_code=b'\xe5' + foo.__code__.co_code[1:]) - msg = f"unknown opcode 238" + msg = f"unknown opcode 229" with self.assertRaisesRegex(SystemError, msg): foo() diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 4a2144743f6567..0a60a979614d52 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -479,8 +479,7 @@ async def _asyncwith(c): YIELD_VALUE 2 RESUME 3 JUMP_BACKWARD_NO_INTERRUPT 5 (to 14) - >> SWAP 2 - POP_TOP + >> END_SEND POP_TOP %3d LOAD_CONST 1 (1) @@ -492,11 +491,11 @@ async def _asyncwith(c): CALL 2 GET_AWAITABLE 2 LOAD_CONST 0 (None) - >> SEND 3 (to 62) + >> SEND 3 (to 60) YIELD_VALUE 2 RESUME 3 - JUMP_BACKWARD_NO_INTERRUPT 5 (to 52) - >> POP_TOP + JUMP_BACKWARD_NO_INTERRUPT 5 (to 50) + >> END_SEND POP_TOP %3d LOAD_CONST 2 (2) @@ -504,21 +503,20 @@ async def _asyncwith(c): RETURN_CONST 0 (None) %3d >> CLEANUP_THROW - JUMP_BACKWARD 26 (to 24) + JUMP_BACKWARD 25 (to 24) >> CLEANUP_THROW - JUMP_BACKWARD 9 (to 62) + JUMP_BACKWARD 9 (to 60) >> PUSH_EXC_INFO WITH_EXCEPT_START GET_AWAITABLE 2 LOAD_CONST 0 (None) - >> SEND 4 (to 100) + >> SEND 4 (to 98) YIELD_VALUE 3 RESUME 3 - JUMP_BACKWARD_NO_INTERRUPT 5 (to 88) + JUMP_BACKWARD_NO_INTERRUPT 5 (to 86) >> CLEANUP_THROW - >> SWAP 2 - POP_TOP - POP_JUMP_IF_TRUE 1 (to 108) + >> END_SEND + POP_JUMP_IF_TRUE 1 (to 104) RERAISE 2 >> POP_TOP POP_EXCEPT @@ -878,9 +876,9 @@ def test_boundaries(self): def test_widths(self): long_opcodes = set(['JUMP_BACKWARD_NO_INTERRUPT', - ]) + 'INSTRUMENTED_CALL_FUNCTION_EX']) for opcode, opname in enumerate(dis.opname): - if opname in long_opcodes: + if opname in long_opcodes or opname.startswith("INSTRUMENTED"): continue with self.subTest(opname=opname): width = dis._OPNAME_WIDTH diff --git a/Lib/test/test_monitoring.py b/Lib/test/test_monitoring.py new file mode 100644 index 00000000000000..4aad3da61b6bee --- /dev/null +++ b/Lib/test/test_monitoring.py @@ -0,0 +1,1044 @@ +"""Test suite for the sys.monitoring.""" + +import collections +import functools +import operator +import sys +import types +import unittest + + +PAIR = (0,1) + +def f1(): + pass + +def f2(): + len([]) + sys.getsizeof(0) + +def floop(): + for item in PAIR: + pass + +def gen(): + yield + yield + +def g1(): + for _ in gen(): + pass + +TEST_TOOL = 2 +TEST_TOOL2 = 3 +TEST_TOOL3 = 4 + +class MonitoringBasicTest(unittest.TestCase): + + def test_has_objects(self): + m = sys.monitoring + m.events + m.use_tool_id + m.free_tool_id + m.get_tool + m.get_events + m.set_events + m.get_local_events + m.set_local_events + m.register_callback + m.restart_events + m.DISABLE + m.MISSING + m.events.NO_EVENTS + + def test_tool(self): + sys.monitoring.use_tool_id(TEST_TOOL, "MonitoringTest.Tool") + self.assertEqual(sys.monitoring.get_tool(TEST_TOOL), "MonitoringTest.Tool") + sys.monitoring.set_events(TEST_TOOL, 15) + self.assertEqual(sys.monitoring.get_events(TEST_TOOL), 15) + sys.monitoring.set_events(TEST_TOOL, 0) + with self.assertRaises(ValueError): + sys.monitoring.set_events(TEST_TOOL, sys.monitoring.events.C_RETURN) + with self.assertRaises(ValueError): + sys.monitoring.set_events(TEST_TOOL, sys.monitoring.events.C_RAISE) + sys.monitoring.free_tool_id(TEST_TOOL) + self.assertEqual(sys.monitoring.get_tool(TEST_TOOL), None) + with self.assertRaises(ValueError): + sys.monitoring.set_events(TEST_TOOL, sys.monitoring.events.CALL) + + +class MonitoringTestBase: + + def setUp(self): + # Check that a previous test hasn't left monitoring on. + for tool in range(6): + self.assertEqual(sys.monitoring.get_events(tool), 0) + self.assertIs(sys.monitoring.get_tool(TEST_TOOL), None) + self.assertIs(sys.monitoring.get_tool(TEST_TOOL2), None) + self.assertIs(sys.monitoring.get_tool(TEST_TOOL3), None) + sys.monitoring.use_tool_id(TEST_TOOL, "test " + self.__class__.__name__) + sys.monitoring.use_tool_id(TEST_TOOL2, "test2 " + self.__class__.__name__) + sys.monitoring.use_tool_id(TEST_TOOL3, "test3 " + self.__class__.__name__) + + def tearDown(self): + # Check that test hasn't left monitoring on. + for tool in range(6): + self.assertEqual(sys.monitoring.get_events(tool), 0) + sys.monitoring.free_tool_id(TEST_TOOL) + sys.monitoring.free_tool_id(TEST_TOOL2) + sys.monitoring.free_tool_id(TEST_TOOL3) + + +class MonitoringCountTest(MonitoringTestBase, unittest.TestCase): + + def check_event_count(self, func, event, expected): + + class Counter: + def __init__(self): + self.count = 0 + def __call__(self, *args): + self.count += 1 + + counter = Counter() + sys.monitoring.register_callback(TEST_TOOL, event, counter) + if event == E.C_RETURN or event == E.C_RAISE: + sys.monitoring.set_events(TEST_TOOL, E.CALL) + else: + sys.monitoring.set_events(TEST_TOOL, event) + self.assertEqual(counter.count, 0) + counter.count = 0 + func() + self.assertEqual(counter.count, expected) + prev = sys.monitoring.register_callback(TEST_TOOL, event, None) + counter.count = 0 + func() + self.assertEqual(counter.count, 0) + self.assertEqual(prev, counter) + sys.monitoring.set_events(TEST_TOOL, 0) + + def test_start_count(self): + self.check_event_count(f1, E.PY_START, 1) + + def test_resume_count(self): + self.check_event_count(g1, E.PY_RESUME, 2) + + def test_return_count(self): + self.check_event_count(f1, E.PY_RETURN, 1) + + def test_call_count(self): + self.check_event_count(f2, E.CALL, 3) + + def test_c_return_count(self): + self.check_event_count(f2, E.C_RETURN, 2) + + +E = sys.monitoring.events + +SIMPLE_EVENTS = [ + (E.PY_START, "start"), + (E.PY_RESUME, "resume"), + (E.PY_RETURN, "return"), + (E.PY_YIELD, "yield"), + (E.JUMP, "jump"), + (E.BRANCH, "branch"), + (E.RAISE, "raise"), + (E.PY_UNWIND, "unwind"), + (E.EXCEPTION_HANDLED, "exception_handled"), + (E.C_RAISE, "c_raise"), + (E.C_RETURN, "c_return"), +] + +SIMPLE_EVENT_SET = functools.reduce(operator.or_, [ev for (ev, _) in SIMPLE_EVENTS], 0) | E.CALL + + +def just_pass(): + pass + +just_pass.events = [ + "py_call", + "start", + "return", +] + +def just_raise(): + raise Exception + +just_raise.events = [ + 'py_call', + "start", + "raise", + "unwind", +] + +def just_call(): + len([]) + +just_call.events = [ + 'py_call', + "start", + "c_call", + "c_return", + "return", +] + +def caught(): + try: + 1/0 + except Exception: + pass + +caught.events = [ + 'py_call', + "start", + "raise", + "exception_handled", + "branch", + "return", +] + +def nested_call(): + just_pass() + +nested_call.events = [ + "py_call", + "start", + "py_call", + "start", + "return", + "return", +] + +PY_CALLABLES = (types.FunctionType, types.MethodType) + +class MonitoringEventsBase(MonitoringTestBase): + + def gather_events(self, func): + events = [] + for event, event_name in SIMPLE_EVENTS: + def record(*args, event_name=event_name): + events.append(event_name) + sys.monitoring.register_callback(TEST_TOOL, event, record) + def record_call(code, offset, obj, arg): + if isinstance(obj, PY_CALLABLES): + events.append("py_call") + else: + events.append("c_call") + sys.monitoring.register_callback(TEST_TOOL, E.CALL, record_call) + sys.monitoring.set_events(TEST_TOOL, SIMPLE_EVENT_SET) + events = [] + try: + func() + except: + pass + sys.monitoring.set_events(TEST_TOOL, 0) + #Remove the final event, the call to `sys.monitoring.set_events` + events = events[:-1] + return events + + def check_events(self, func, expected=None): + events = self.gather_events(func) + if expected is None: + expected = func.events + self.assertEqual(events, expected) + + +class MonitoringEventsTest(MonitoringEventsBase, unittest.TestCase): + + def test_just_pass(self): + self.check_events(just_pass) + + def test_just_raise(self): + try: + self.check_events(just_raise) + except Exception: + pass + self.assertEqual(sys.monitoring.get_events(TEST_TOOL), 0) + + def test_just_call(self): + self.check_events(just_call) + + def test_caught(self): + self.check_events(caught) + + def test_nested_call(self): + self.check_events(nested_call) + +UP_EVENTS = (E.C_RETURN, E.C_RAISE, E.PY_RETURN, E.PY_UNWIND, E.PY_YIELD) +DOWN_EVENTS = (E.PY_START, E.PY_RESUME) + +from test.profilee import testfunc + +class SimulateProfileTest(MonitoringEventsBase, unittest.TestCase): + + def test_balanced(self): + events = self.gather_events(testfunc) + c = collections.Counter(events) + self.assertEqual(c["c_call"], c["c_return"]) + self.assertEqual(c["start"], c["return"] + c["unwind"]) + self.assertEqual(c["raise"], c["exception_handled"] + c["unwind"]) + + def test_frame_stack(self): + self.maxDiff = None + stack = [] + errors = [] + seen = set() + def up(*args): + frame = sys._getframe(1) + if not stack: + errors.append("empty") + else: + expected = stack.pop() + if frame != expected: + errors.append(f" Popping {frame} expected {expected}") + def down(*args): + frame = sys._getframe(1) + stack.append(frame) + seen.add(frame.f_code) + def call(code, offset, callable, arg): + if not isinstance(callable, PY_CALLABLES): + stack.append(sys._getframe(1)) + for event in UP_EVENTS: + sys.monitoring.register_callback(TEST_TOOL, event, up) + for event in DOWN_EVENTS: + sys.monitoring.register_callback(TEST_TOOL, event, down) + sys.monitoring.register_callback(TEST_TOOL, E.CALL, call) + sys.monitoring.set_events(TEST_TOOL, SIMPLE_EVENT_SET) + testfunc() + sys.monitoring.set_events(TEST_TOOL, 0) + self.assertEqual(errors, []) + self.assertEqual(stack, [sys._getframe()]) + self.assertEqual(len(seen), 9) + + +class CounterWithDisable: + + def __init__(self): + self.disable = False + self.count = 0 + + def __call__(self, *args): + self.count += 1 + if self.disable: + return sys.monitoring.DISABLE + + +class RecorderWithDisable: + + def __init__(self, events): + self.disable = False + self.events = events + + def __call__(self, code, event): + self.events.append(event) + if self.disable: + return sys.monitoring.DISABLE + + +class MontoringDisableAndRestartTest(MonitoringTestBase, unittest.TestCase): + + def test_disable(self): + try: + counter = CounterWithDisable() + sys.monitoring.register_callback(TEST_TOOL, E.PY_START, counter) + sys.monitoring.set_events(TEST_TOOL, E.PY_START) + self.assertEqual(counter.count, 0) + counter.count = 0 + f1() + self.assertEqual(counter.count, 1) + counter.disable = True + counter.count = 0 + f1() + self.assertEqual(counter.count, 1) + counter.count = 0 + f1() + self.assertEqual(counter.count, 0) + sys.monitoring.set_events(TEST_TOOL, 0) + finally: + sys.monitoring.restart_events() + + def test_restart(self): + try: + counter = CounterWithDisable() + sys.monitoring.register_callback(TEST_TOOL, E.PY_START, counter) + sys.monitoring.set_events(TEST_TOOL, E.PY_START) + counter.disable = True + f1() + counter.count = 0 + f1() + self.assertEqual(counter.count, 0) + sys.monitoring.restart_events() + counter.count = 0 + f1() + self.assertEqual(counter.count, 1) + sys.monitoring.set_events(TEST_TOOL, 0) + finally: + sys.monitoring.restart_events() + + +class MultipleMonitorsTest(MonitoringTestBase, unittest.TestCase): + + def test_two_same(self): + try: + self.assertEqual(sys.monitoring._all_events(), {}) + counter1 = CounterWithDisable() + counter2 = CounterWithDisable() + sys.monitoring.register_callback(TEST_TOOL, E.PY_START, counter1) + sys.monitoring.register_callback(TEST_TOOL2, E.PY_START, counter2) + sys.monitoring.set_events(TEST_TOOL, E.PY_START) + sys.monitoring.set_events(TEST_TOOL2, E.PY_START) + self.assertEqual(sys.monitoring.get_events(TEST_TOOL), E.PY_START) + self.assertEqual(sys.monitoring.get_events(TEST_TOOL2), E.PY_START) + self.assertEqual(sys.monitoring._all_events(), {'PY_START': (1 << TEST_TOOL) | (1 << TEST_TOOL2)}) + counter1.count = 0 + counter2.count = 0 + f1() + count1 = counter1.count + count2 = counter2.count + self.assertEqual((count1, count2), (1, 1)) + finally: + sys.monitoring.set_events(TEST_TOOL, 0) + sys.monitoring.set_events(TEST_TOOL2, 0) + sys.monitoring.register_callback(TEST_TOOL, E.PY_START, None) + sys.monitoring.register_callback(TEST_TOOL2, E.PY_START, None) + self.assertEqual(sys.monitoring._all_events(), {}) + + def test_three_same(self): + try: + self.assertEqual(sys.monitoring._all_events(), {}) + counter1 = CounterWithDisable() + counter2 = CounterWithDisable() + counter3 = CounterWithDisable() + sys.monitoring.register_callback(TEST_TOOL, E.PY_START, counter1) + sys.monitoring.register_callback(TEST_TOOL2, E.PY_START, counter2) + sys.monitoring.register_callback(TEST_TOOL3, E.PY_START, counter3) + sys.monitoring.set_events(TEST_TOOL, E.PY_START) + sys.monitoring.set_events(TEST_TOOL2, E.PY_START) + sys.monitoring.set_events(TEST_TOOL3, E.PY_START) + self.assertEqual(sys.monitoring.get_events(TEST_TOOL), E.PY_START) + self.assertEqual(sys.monitoring.get_events(TEST_TOOL2), E.PY_START) + self.assertEqual(sys.monitoring.get_events(TEST_TOOL3), E.PY_START) + self.assertEqual(sys.monitoring._all_events(), {'PY_START': (1 << TEST_TOOL) | (1 << TEST_TOOL2) | (1 << TEST_TOOL3)}) + counter1.count = 0 + counter2.count = 0 + counter3.count = 0 + f1() + count1 = counter1.count + count2 = counter2.count + count3 = counter3.count + self.assertEqual((count1, count2, count3), (1, 1, 1)) + finally: + sys.monitoring.set_events(TEST_TOOL, 0) + sys.monitoring.set_events(TEST_TOOL2, 0) + sys.monitoring.set_events(TEST_TOOL3, 0) + sys.monitoring.register_callback(TEST_TOOL, E.PY_START, None) + sys.monitoring.register_callback(TEST_TOOL2, E.PY_START, None) + sys.monitoring.register_callback(TEST_TOOL3, E.PY_START, None) + self.assertEqual(sys.monitoring._all_events(), {}) + + def test_two_different(self): + try: + self.assertEqual(sys.monitoring._all_events(), {}) + counter1 = CounterWithDisable() + counter2 = CounterWithDisable() + sys.monitoring.register_callback(TEST_TOOL, E.PY_START, counter1) + sys.monitoring.register_callback(TEST_TOOL2, E.PY_RETURN, counter2) + sys.monitoring.set_events(TEST_TOOL, E.PY_START) + sys.monitoring.set_events(TEST_TOOL2, E.PY_RETURN) + self.assertEqual(sys.monitoring.get_events(TEST_TOOL), E.PY_START) + self.assertEqual(sys.monitoring.get_events(TEST_TOOL2), E.PY_RETURN) + self.assertEqual(sys.monitoring._all_events(), {'PY_START': 1 << TEST_TOOL, 'PY_RETURN': 1 << TEST_TOOL2}) + counter1.count = 0 + counter2.count = 0 + f1() + count1 = counter1.count + count2 = counter2.count + self.assertEqual((count1, count2), (1, 1)) + finally: + sys.monitoring.set_events(TEST_TOOL, 0) + sys.monitoring.set_events(TEST_TOOL2, 0) + sys.monitoring.register_callback(TEST_TOOL, E.PY_START, None) + sys.monitoring.register_callback(TEST_TOOL2, E.PY_RETURN, None) + self.assertEqual(sys.monitoring._all_events(), {}) + + def test_two_with_disable(self): + try: + self.assertEqual(sys.monitoring._all_events(), {}) + counter1 = CounterWithDisable() + counter2 = CounterWithDisable() + sys.monitoring.register_callback(TEST_TOOL, E.PY_START, counter1) + sys.monitoring.register_callback(TEST_TOOL2, E.PY_START, counter2) + sys.monitoring.set_events(TEST_TOOL, E.PY_START) + sys.monitoring.set_events(TEST_TOOL2, E.PY_START) + self.assertEqual(sys.monitoring.get_events(TEST_TOOL), E.PY_START) + self.assertEqual(sys.monitoring.get_events(TEST_TOOL2), E.PY_START) + self.assertEqual(sys.monitoring._all_events(), {'PY_START': (1 << TEST_TOOL) | (1 << TEST_TOOL2)}) + counter1.count = 0 + counter2.count = 0 + counter1.disable = True + f1() + count1 = counter1.count + count2 = counter2.count + self.assertEqual((count1, count2), (1, 1)) + counter1.count = 0 + counter2.count = 0 + f1() + count1 = counter1.count + count2 = counter2.count + self.assertEqual((count1, count2), (0, 1)) + finally: + sys.monitoring.set_events(TEST_TOOL, 0) + sys.monitoring.set_events(TEST_TOOL2, 0) + sys.monitoring.register_callback(TEST_TOOL, E.PY_START, None) + sys.monitoring.register_callback(TEST_TOOL2, E.PY_START, None) + self.assertEqual(sys.monitoring._all_events(), {}) + sys.monitoring.restart_events() + +class LineMonitoringTest(MonitoringTestBase, unittest.TestCase): + + def test_lines_single(self): + try: + self.assertEqual(sys.monitoring._all_events(), {}) + events = [] + recorder = RecorderWithDisable(events) + sys.monitoring.register_callback(TEST_TOOL, E.LINE, recorder) + sys.monitoring.set_events(TEST_TOOL, E.LINE) + f1() + sys.monitoring.set_events(TEST_TOOL, 0) + sys.monitoring.register_callback(TEST_TOOL, E.LINE, None) + start = LineMonitoringTest.test_lines_single.__code__.co_firstlineno + self.assertEqual(events, [start+7, 14, start+8]) + finally: + sys.monitoring.set_events(TEST_TOOL, 0) + sys.monitoring.register_callback(TEST_TOOL, E.LINE, None) + self.assertEqual(sys.monitoring._all_events(), {}) + sys.monitoring.restart_events() + + def test_lines_loop(self): + try: + self.assertEqual(sys.monitoring._all_events(), {}) + events = [] + recorder = RecorderWithDisable(events) + sys.monitoring.register_callback(TEST_TOOL, E.LINE, recorder) + sys.monitoring.set_events(TEST_TOOL, E.LINE) + floop() + sys.monitoring.set_events(TEST_TOOL, 0) + sys.monitoring.register_callback(TEST_TOOL, E.LINE, None) + start = LineMonitoringTest.test_lines_loop.__code__.co_firstlineno + self.assertEqual(events, [start+7, 21, 22, 22, 21, start+8]) + finally: + sys.monitoring.set_events(TEST_TOOL, 0) + sys.monitoring.register_callback(TEST_TOOL, E.LINE, None) + self.assertEqual(sys.monitoring._all_events(), {}) + sys.monitoring.restart_events() + + def test_lines_two(self): + try: + self.assertEqual(sys.monitoring._all_events(), {}) + events = [] + recorder = RecorderWithDisable(events) + events2 = [] + recorder2 = RecorderWithDisable(events2) + sys.monitoring.register_callback(TEST_TOOL, E.LINE, recorder) + sys.monitoring.register_callback(TEST_TOOL2, E.LINE, recorder2) + sys.monitoring.set_events(TEST_TOOL, E.LINE); sys.monitoring.set_events(TEST_TOOL2, E.LINE) + f1() + sys.monitoring.set_events(TEST_TOOL, 0); sys.monitoring.set_events(TEST_TOOL2, 0) + sys.monitoring.register_callback(TEST_TOOL, E.LINE, None) + sys.monitoring.register_callback(TEST_TOOL2, E.LINE, None) + start = LineMonitoringTest.test_lines_two.__code__.co_firstlineno + expected = [start+10, 14, start+11] + self.assertEqual(events, expected) + self.assertEqual(events2, expected) + finally: + sys.monitoring.set_events(TEST_TOOL, 0) + sys.monitoring.set_events(TEST_TOOL2, 0) + sys.monitoring.register_callback(TEST_TOOL, E.LINE, None) + sys.monitoring.register_callback(TEST_TOOL2, E.LINE, None) + self.assertEqual(sys.monitoring._all_events(), {}) + sys.monitoring.restart_events() + + def check_lines(self, func, expected, tool=TEST_TOOL): + try: + self.assertEqual(sys.monitoring._all_events(), {}) + events = [] + recorder = RecorderWithDisable(events) + sys.monitoring.register_callback(tool, E.LINE, recorder) + sys.monitoring.set_events(tool, E.LINE) + func() + sys.monitoring.set_events(tool, 0) + sys.monitoring.register_callback(tool, E.LINE, None) + lines = [ line - func.__code__.co_firstlineno for line in events[1:-1] ] + self.assertEqual(lines, expected) + finally: + sys.monitoring.set_events(tool, 0) + + + def test_linear(self): + + def func(): + line = 1 + line = 2 + line = 3 + line = 4 + line = 5 + + self.check_lines(func, [1,2,3,4,5]) + + def test_branch(self): + def func(): + if "true".startswith("t"): + line = 2 + line = 3 + else: + line = 5 + line = 6 + + self.check_lines(func, [1,2,3,6]) + + def test_try_except(self): + + def func1(): + try: + line = 2 + line = 3 + except: + line = 5 + line = 6 + + self.check_lines(func1, [1,2,3,6]) + + def func2(): + try: + line = 2 + raise 3 + except: + line = 5 + line = 6 + + self.check_lines(func2, [1,2,3,4,5,6]) + + +class ExceptionRecorder: + + event_type = E.RAISE + + def __init__(self, events): + self.events = events + + def __call__(self, code, offset, exc): + self.events.append(("raise", type(exc))) + +class CheckEvents(MonitoringTestBase, unittest.TestCase): + + def check_events(self, func, expected, tool=TEST_TOOL, recorders=(ExceptionRecorder,)): + try: + self.assertEqual(sys.monitoring._all_events(), {}) + event_list = [] + all_events = 0 + for recorder in recorders: + ev = recorder.event_type + sys.monitoring.register_callback(tool, ev, recorder(event_list)) + all_events |= ev + sys.monitoring.set_events(tool, all_events) + func() + sys.monitoring.set_events(tool, 0) + for recorder in recorders: + sys.monitoring.register_callback(tool, recorder.event_type, None) + self.assertEqual(event_list, expected) + finally: + sys.monitoring.set_events(tool, 0) + for recorder in recorders: + sys.monitoring.register_callback(tool, recorder.event_type, None) + +class StopiterationRecorder(ExceptionRecorder): + + event_type = E.STOP_ITERATION + +class ExceptionMontoringTest(CheckEvents): + + recorder = ExceptionRecorder + + def test_simple_try_except(self): + + def func1(): + try: + line = 2 + raise KeyError + except: + line = 5 + line = 6 + + self.check_events(func1, [("raise", KeyError)]) + + def gen(): + yield 1 + return 2 + + def implicit_stop_iteration(): + for _ in gen(): + pass + + self.check_events(implicit_stop_iteration, [("raise", StopIteration)], recorders=(StopiterationRecorder,)) + +class LineRecorder: + + event_type = E.LINE + + + def __init__(self, events): + self.events = events + + def __call__(self, code, line): + self.events.append(("line", code.co_name, line - code.co_firstlineno)) + +class CallRecorder: + + event_type = E.CALL + + def __init__(self, events): + self.events = events + + def __call__(self, code, offset, func, arg): + self.events.append(("call", func.__name__, arg)) + +class CEventRecorder: + + def __init__(self, events): + self.events = events + + def __call__(self, code, offset, func, arg): + self.events.append((self.event_name, func.__name__, arg)) + +class CReturnRecorder(CEventRecorder): + + event_type = E.C_RETURN + event_name = "C return" + +class CRaiseRecorder(CEventRecorder): + + event_type = E.C_RAISE + event_name = "C raise" + +MANY_RECORDERS = ExceptionRecorder, CallRecorder, LineRecorder, CReturnRecorder, CRaiseRecorder + +class TestManyEvents(CheckEvents): + + def test_simple(self): + + def func1(): + line1 = 1 + line2 = 2 + line3 = 3 + + self.check_events(func1, recorders = MANY_RECORDERS, expected = [ + ('line', 'check_events', 10), + ('call', 'func1', sys.monitoring.MISSING), + ('line', 'func1', 1), + ('line', 'func1', 2), + ('line', 'func1', 3), + ('line', 'check_events', 11), + ('call', 'set_events', 2)]) + + def test_c_call(self): + + def func2(): + line1 = 1 + [].append(2) + line3 = 3 + + self.check_events(func2, recorders = MANY_RECORDERS, expected = [ + ('line', 'check_events', 10), + ('call', 'func2', sys.monitoring.MISSING), + ('line', 'func2', 1), + ('line', 'func2', 2), + ('call', 'append', [2]), + ('C return', 'append', [2]), + ('line', 'func2', 3), + ('line', 'check_events', 11), + ('call', 'set_events', 2)]) + + def test_try_except(self): + + def func3(): + try: + line = 2 + raise KeyError + except: + line = 5 + line = 6 + + self.check_events(func3, recorders = MANY_RECORDERS, expected = [ + ('line', 'check_events', 10), + ('call', 'func3', sys.monitoring.MISSING), + ('line', 'func3', 1), + ('line', 'func3', 2), + ('line', 'func3', 3), + ('raise', KeyError), + ('line', 'func3', 4), + ('line', 'func3', 5), + ('line', 'func3', 6), + ('line', 'check_events', 11), + ('call', 'set_events', 2)]) + +class InstructionRecorder: + + event_type = E.INSTRUCTION + + def __init__(self, events): + self.events = events + + def __call__(self, code, offset): + # Filter out instructions in check_events to lower noise + if code.co_name != "check_events": + self.events.append(("instruction", code.co_name, offset)) + + +LINE_AND_INSTRUCTION_RECORDERS = InstructionRecorder, LineRecorder + +class TestLineAndInstructionEvents(CheckEvents): + maxDiff = None + + def test_simple(self): + + def func1(): + line1 = 1 + line2 = 2 + line3 = 3 + + self.check_events(func1, recorders = LINE_AND_INSTRUCTION_RECORDERS, expected = [ + ('line', 'check_events', 10), + ('line', 'func1', 1), + ('instruction', 'func1', 2), + ('instruction', 'func1', 4), + ('line', 'func1', 2), + ('instruction', 'func1', 6), + ('instruction', 'func1', 8), + ('line', 'func1', 3), + ('instruction', 'func1', 10), + ('instruction', 'func1', 12), + ('instruction', 'func1', 14), + ('line', 'check_events', 11)]) + + def test_c_call(self): + + def func2(): + line1 = 1 + [].append(2) + line3 = 3 + + self.check_events(func2, recorders = LINE_AND_INSTRUCTION_RECORDERS, expected = [ + ('line', 'check_events', 10), + ('line', 'func2', 1), + ('instruction', 'func2', 2), + ('instruction', 'func2', 4), + ('line', 'func2', 2), + ('instruction', 'func2', 6), + ('instruction', 'func2', 8), + ('instruction', 'func2', 28), + ('instruction', 'func2', 30), + ('instruction', 'func2', 38), + ('line', 'func2', 3), + ('instruction', 'func2', 40), + ('instruction', 'func2', 42), + ('instruction', 'func2', 44), + ('line', 'check_events', 11)]) + + def test_try_except(self): + + def func3(): + try: + line = 2 + raise KeyError + except: + line = 5 + line = 6 + + self.check_events(func3, recorders = LINE_AND_INSTRUCTION_RECORDERS, expected = [ + ('line', 'check_events', 10), + ('line', 'func3', 1), + ('instruction', 'func3', 2), + ('line', 'func3', 2), + ('instruction', 'func3', 4), + ('instruction', 'func3', 6), + ('line', 'func3', 3), + ('instruction', 'func3', 8), + ('instruction', 'func3', 18), + ('instruction', 'func3', 20), + ('line', 'func3', 4), + ('instruction', 'func3', 22), + ('line', 'func3', 5), + ('instruction', 'func3', 24), + ('instruction', 'func3', 26), + ('instruction', 'func3', 28), + ('line', 'func3', 6), + ('instruction', 'func3', 30), + ('instruction', 'func3', 32), + ('instruction', 'func3', 34), + ('line', 'check_events', 11)]) + +class TestInstallIncrementallly(MonitoringTestBase, unittest.TestCase): + + def check_events(self, func, must_include, tool=TEST_TOOL, recorders=(ExceptionRecorder,)): + try: + self.assertEqual(sys.monitoring._all_events(), {}) + event_list = [] + all_events = 0 + for recorder in recorders: + all_events |= recorder.event_type + sys.monitoring.set_events(tool, all_events) + for recorder in recorders: + sys.monitoring.register_callback(tool, recorder.event_type, recorder(event_list)) + func() + sys.monitoring.set_events(tool, 0) + for recorder in recorders: + sys.monitoring.register_callback(tool, recorder.event_type, None) + for line in must_include: + self.assertIn(line, event_list) + finally: + sys.monitoring.set_events(tool, 0) + for recorder in recorders: + sys.monitoring.register_callback(tool, recorder.event_type, None) + + @staticmethod + def func1(): + line1 = 1 + + MUST_INCLUDE_LI = [ + ('instruction', 'func1', 2), + ('line', 'func1', 1), + ('instruction', 'func1', 4), + ('instruction', 'func1', 6)] + + def test_line_then_instruction(self): + recorders = [ LineRecorder, InstructionRecorder ] + self.check_events(self.func1, + recorders = recorders, must_include = self.EXPECTED_LI) + + def test_instruction_then_line(self): + recorders = [ InstructionRecorder, LineRecorderLowNoise ] + self.check_events(self.func1, + recorders = recorders, must_include = self.EXPECTED_LI) + + @staticmethod + def func2(): + len(()) + + MUST_INCLUDE_CI = [ + ('instruction', 'func2', 2), + ('call', 'func2', sys.monitoring.MISSING), + ('call', 'len', ()), + ('instruction', 'func2', 12), + ('instruction', 'func2', 14)] + + + + def test_line_then_instruction(self): + recorders = [ CallRecorder, InstructionRecorder ] + self.check_events(self.func2, + recorders = recorders, must_include = self.MUST_INCLUDE_CI) + + def test_instruction_then_line(self): + recorders = [ InstructionRecorder, CallRecorder ] + self.check_events(self.func2, + recorders = recorders, must_include = self.MUST_INCLUDE_CI) + +class TestLocalEvents(MonitoringTestBase, unittest.TestCase): + + def check_events(self, func, expected, tool=TEST_TOOL, recorders=(ExceptionRecorder,)): + try: + self.assertEqual(sys.monitoring._all_events(), {}) + event_list = [] + all_events = 0 + for recorder in recorders: + ev = recorder.event_type + sys.monitoring.register_callback(tool, ev, recorder(event_list)) + all_events |= ev + sys.monitoring.set_local_events(tool, func.__code__, all_events) + func() + sys.monitoring.set_local_events(tool, func.__code__, 0) + for recorder in recorders: + sys.monitoring.register_callback(tool, recorder.event_type, None) + self.assertEqual(event_list, expected) + finally: + sys.monitoring.set_local_events(tool, func.__code__, 0) + for recorder in recorders: + sys.monitoring.register_callback(tool, recorder.event_type, None) + + + def test_simple(self): + + def func1(): + line1 = 1 + line2 = 2 + line3 = 3 + + self.check_events(func1, recorders = MANY_RECORDERS, expected = [ + ('line', 'func1', 1), + ('line', 'func1', 2), + ('line', 'func1', 3)]) + + def test_c_call(self): + + def func2(): + line1 = 1 + [].append(2) + line3 = 3 + + self.check_events(func2, recorders = MANY_RECORDERS, expected = [ + ('line', 'func2', 1), + ('line', 'func2', 2), + ('call', 'append', [2]), + ('C return', 'append', [2]), + ('line', 'func2', 3)]) + + def test_try_except(self): + + def func3(): + try: + line = 2 + raise KeyError + except: + line = 5 + line = 6 + + self.check_events(func3, recorders = MANY_RECORDERS, expected = [ + ('line', 'func3', 1), + ('line', 'func3', 2), + ('line', 'func3', 3), + ('raise', KeyError), + ('line', 'func3', 4), + ('line', 'func3', 5), + ('line', 'func3', 6)]) + + +class TestSetGetEvents(MonitoringTestBase, unittest.TestCase): + + def test_global(self): + sys.monitoring.set_events(TEST_TOOL, E.PY_START) + self.assertEqual(sys.monitoring.get_events(TEST_TOOL), E.PY_START) + sys.monitoring.set_events(TEST_TOOL2, E.PY_START) + self.assertEqual(sys.monitoring.get_events(TEST_TOOL2), E.PY_START) + sys.monitoring.set_events(TEST_TOOL, 0) + self.assertEqual(sys.monitoring.get_events(TEST_TOOL), 0) + sys.monitoring.set_events(TEST_TOOL2,0) + self.assertEqual(sys.monitoring.get_events(TEST_TOOL2), 0) + + def test_local(self): + code = f1.__code__ + sys.monitoring.set_local_events(TEST_TOOL, code, E.PY_START) + self.assertEqual(sys.monitoring.get_local_events(TEST_TOOL, code), E.PY_START) + sys.monitoring.set_local_events(TEST_TOOL2, code, E.PY_START) + self.assertEqual(sys.monitoring.get_local_events(TEST_TOOL2, code), E.PY_START) + sys.monitoring.set_local_events(TEST_TOOL, code, 0) + self.assertEqual(sys.monitoring.get_local_events(TEST_TOOL, code), 0) + sys.monitoring.set_local_events(TEST_TOOL2, code, 0) + self.assertEqual(sys.monitoring.get_local_events(TEST_TOOL2, code), 0) + +class TestUninitialized(unittest.TestCase, MonitoringTestBase): + + @staticmethod + def f(): + pass + + def test_get_local_events_uninitialized(self): + self.assertEqual(sys.monitoring.get_local_events(TEST_TOOL, self.f.__code__), 0) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 890ffbf472c335..1aebe1b111f2e9 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -1445,7 +1445,7 @@ class C(object): pass def func(): return sys._getframe() x = func() - check(x, size('3Pi3c7P2ic??2P')) + check(x, size('3Pii3c7P2ic??2P')) # function def func(): pass check(func, size('14Pi')) diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 4907c930e143d5..980321e169b9e5 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -2808,5 +2808,65 @@ def foo(*args): sys.settrace(sys.gettrace()) +class TestLinesAfterTraceStarted(TraceTestCase): + + def test_events(self): + tracer = Tracer() + sys._getframe().f_trace = tracer.trace + sys.settrace(tracer.trace) + line = 4 + line = 5 + sys.settrace(None) + self.compare_events( + TestLinesAfterTraceStarted.test_events.__code__.co_firstlineno, + tracer.events, [ + (4, 'line'), + (5, 'line'), + (6, 'line')]) + + +class TestSetLocalTrace(TraceTestCase): + + def test_with_branches(self): + + def tracefunc(frame, event, arg): + if frame.f_code.co_name == "func": + frame.f_trace = tracefunc + line = frame.f_lineno - frame.f_code.co_firstlineno + events.append((line, event)) + return tracefunc + + def func(arg = 1): + N = 1 + if arg >= 2: + not_reached = 3 + else: + reached = 5 + if arg >= 3: + not_reached = 7 + else: + reached = 9 + the_end = 10 + + EXPECTED_EVENTS = [ + (0, 'call'), + (1, 'line'), + (2, 'line'), + (5, 'line'), + (6, 'line'), + (9, 'line'), + (10, 'line'), + (10, 'return'), + ] + + events = [] + sys.settrace(tracefunc) + sys._getframe().f_trace = tracefunc + func() + self.assertEqual(events, EXPECTED_EVENTS) + sys.settrace(None) + + + if __name__ == "__main__": unittest.main() diff --git a/Makefile.pre.in b/Makefile.pre.in index dc22683361d462..afd503ef126339 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -395,7 +395,9 @@ PYTHON_OBJS= \ Python/import.o \ Python/importdl.o \ Python/initconfig.o \ + Python/instrumentation.o \ Python/intrinsics.o \ + Python/legacy_tracing.o \ Python/marshal.o \ Python/modsupport.o \ Python/mysnprintf.o \ diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-31-17-24-03.gh-issue-103082.isRUcV.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-31-17-24-03.gh-issue-103082.isRUcV.rst new file mode 100644 index 00000000000000..631ef4c7890450 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-03-31-17-24-03.gh-issue-103082.isRUcV.rst @@ -0,0 +1 @@ +Implement :pep:`669` Low Impact Monitoring for CPython. diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 755d0b85e7cf30..9b54c610581174 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -431,13 +431,13 @@ init_code(PyCodeObject *co, struct _PyCodeConstructor *con) if (_Py_next_func_version != 0) { _Py_next_func_version++; } + co->_co_monitoring = NULL; + co->_co_instrumentation_version = 0; /* not set */ co->co_weakreflist = NULL; co->co_extra = NULL; co->_co_cached = NULL; - co->_co_linearray_entry_size = 0; - co->_co_linearray = NULL; memcpy(_PyCode_CODE(co), PyBytes_AS_STRING(con->code), PyBytes_GET_SIZE(con->code)); int entry_point = 0; @@ -816,54 +816,6 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) * source location tracking (co_lines/co_positions) ******************/ -/* Use co_linetable to compute the line number from a bytecode index, addrq. See - lnotab_notes.txt for the details of the lnotab representation. -*/ - -int -_PyCode_CreateLineArray(PyCodeObject *co) -{ - assert(co->_co_linearray == NULL); - PyCodeAddressRange bounds; - int size; - int max_line = 0; - _PyCode_InitAddressRange(co, &bounds); - while(_PyLineTable_NextAddressRange(&bounds)) { - if (bounds.ar_line > max_line) { - max_line = bounds.ar_line; - } - } - if (max_line < (1 << 15)) { - size = 2; - } - else { - size = 4; - } - co->_co_linearray = PyMem_Malloc(Py_SIZE(co)*size); - if (co->_co_linearray == NULL) { - PyErr_NoMemory(); - return -1; - } - co->_co_linearray_entry_size = size; - _PyCode_InitAddressRange(co, &bounds); - while(_PyLineTable_NextAddressRange(&bounds)) { - int start = bounds.ar_start / sizeof(_Py_CODEUNIT); - int end = bounds.ar_end / sizeof(_Py_CODEUNIT); - for (int index = start; index < end; index++) { - assert(index < (int)Py_SIZE(co)); - if (size == 2) { - assert(((int16_t)bounds.ar_line) == bounds.ar_line); - ((int16_t *)co->_co_linearray)[index] = bounds.ar_line; - } - else { - assert(size == 4); - ((int32_t *)co->_co_linearray)[index] = bounds.ar_line; - } - } - } - return 0; -} - int PyCode_Addr2Line(PyCodeObject *co, int addrq) { @@ -871,9 +823,6 @@ PyCode_Addr2Line(PyCodeObject *co, int addrq) return co->co_firstlineno; } assert(addrq >= 0 && addrq < _PyCode_NBYTES(co)); - if (co->_co_linearray) { - return _PyCode_LineNumberFromArray(co, addrq / sizeof(_Py_CODEUNIT)); - } PyCodeAddressRange bounds; _PyCode_InitAddressRange(co, &bounds); return _PyCode_CheckLineNumber(addrq, &bounds); @@ -1531,17 +1480,17 @@ PyCode_GetFreevars(PyCodeObject *code) } static void -deopt_code(_Py_CODEUNIT *instructions, Py_ssize_t len) +deopt_code(PyCodeObject *code, _Py_CODEUNIT *instructions) { + Py_ssize_t len = Py_SIZE(code); for (int i = 0; i < len; i++) { - _Py_CODEUNIT instruction = instructions[i]; - int opcode = _PyOpcode_Deopt[instruction.op.code]; + int opcode = _Py_GetBaseOpcode(code, i); int caches = _PyOpcode_Caches[opcode]; instructions[i].op.code = opcode; - while (caches--) { - instructions[++i].op.code = CACHE; - instructions[i].op.arg = 0; + for (int j = 1; j <= caches; j++) { + instructions[i+j].cache = 0; } + i += caches; } } @@ -1559,7 +1508,7 @@ _PyCode_GetCode(PyCodeObject *co) if (code == NULL) { return NULL; } - deopt_code((_Py_CODEUNIT *)PyBytes_AS_STRING(code), Py_SIZE(co)); + deopt_code(co, (_Py_CODEUNIT *)PyBytes_AS_STRING(code)); assert(co->_co_cached->_co_code == NULL); co->_co_cached->_co_code = Py_NewRef(code); return code; @@ -1693,6 +1642,30 @@ code_new_impl(PyTypeObject *type, int argcount, int posonlyargcount, return co; } +static void +free_monitoring_data(_PyCoMonitoringData *data) +{ + if (data == NULL) { + return; + } + if (data->tools) { + PyMem_Free(data->tools); + } + if (data->lines) { + PyMem_Free(data->lines); + } + if (data->line_tools) { + PyMem_Free(data->line_tools); + } + if (data->per_instruction_opcodes) { + PyMem_Free(data->per_instruction_opcodes); + } + if (data->per_instruction_tools) { + PyMem_Free(data->per_instruction_tools); + } + PyMem_Free(data); +} + static void code_dealloc(PyCodeObject *co) { @@ -1739,9 +1712,7 @@ code_dealloc(PyCodeObject *co) if (co->co_weakreflist != NULL) { PyObject_ClearWeakRefs((PyObject*)co); } - if (co->_co_linearray) { - PyMem_Free(co->_co_linearray); - } + free_monitoring_data(co->_co_monitoring); PyObject_Free(co); } @@ -1885,7 +1856,7 @@ code_hash(PyCodeObject *co) SCRAMBLE_IN(co->co_firstlineno); SCRAMBLE_IN(Py_SIZE(co)); for (int i = 0; i < Py_SIZE(co); i++) { - int deop = _PyOpcode_Deopt[_PyCode_CODE(co)[i].op.code]; + int deop = _Py_GetBaseOpcode(co, i); SCRAMBLE_IN(deop); SCRAMBLE_IN(_PyCode_CODE(co)[i].op.arg); i += _PyOpcode_Caches[deop]; @@ -2314,7 +2285,7 @@ _PyCode_ConstantKey(PyObject *op) void _PyStaticCode_Fini(PyCodeObject *co) { - deopt_code(_PyCode_CODE(co), Py_SIZE(co)); + deopt_code(co, _PyCode_CODE(co)); PyMem_Free(co->co_extra); if (co->_co_cached != NULL) { Py_CLEAR(co->_co_cached->_co_code); @@ -2329,10 +2300,8 @@ _PyStaticCode_Fini(PyCodeObject *co) PyObject_ClearWeakRefs((PyObject *)co); co->co_weakreflist = NULL; } - if (co->_co_linearray) { - PyMem_Free(co->_co_linearray); - co->_co_linearray = NULL; - } + free_monitoring_data(co->_co_monitoring); + co->_co_monitoring = NULL; } int diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 63590d58809e3e..ef0070199ab2c0 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -17,7 +17,6 @@ static PyMemberDef frame_memberlist[] = { {"f_trace_lines", T_BOOL, OFF(f_trace_lines), 0}, - {"f_trace_opcodes", T_BOOL, OFF(f_trace_opcodes), 0}, {NULL} /* Sentinel */ }; @@ -104,24 +103,29 @@ frame_getback(PyFrameObject *f, void *closure) return res; } -// Given the index of the effective opcode, scan back to construct the oparg -// with EXTENDED_ARG. This only works correctly with *unquickened* code, -// obtained via a call to _PyCode_GetCode! -static unsigned int -get_arg(const _Py_CODEUNIT *codestr, Py_ssize_t i) +static PyObject * +frame_gettrace_opcodes(PyFrameObject *f, void *closure) { - _Py_CODEUNIT word; - unsigned int oparg = codestr[i].op.arg; - if (i >= 1 && (word = codestr[i-1]).op.code == EXTENDED_ARG) { - oparg |= word.op.arg << 8; - if (i >= 2 && (word = codestr[i-2]).op.code == EXTENDED_ARG) { - oparg |= word.op.arg << 16; - if (i >= 3 && (word = codestr[i-3]).op.code == EXTENDED_ARG) { - oparg |= word.op.arg << 24; - } - } + PyObject *result = f->f_trace_opcodes ? Py_True : Py_False; + return Py_NewRef(result); +} + +static int +frame_settrace_opcodes(PyFrameObject *f, PyObject* value, void *Py_UNUSED(ignored)) +{ + if (!PyBool_Check(value)) { + PyErr_SetString(PyExc_TypeError, + "attribute value type must be bool"); + return -1; + } + if (value == Py_True) { + f->f_trace_opcodes = 1; + _PyInterpreterState_GET()->f_opcode_trace_set = true; } - return oparg; + else { + f->f_trace_opcodes = 0; + } + return 0; } /* Model the evaluation stack, to determine which jumps @@ -299,46 +303,52 @@ mark_stacks(PyCodeObject *code_obj, int len) while (todo) { todo = 0; /* Scan instructions */ - for (i = 0; i < len; i++) { + for (i = 0; i < len;) { int64_t next_stack = stacks[i]; + opcode = _Py_GetBaseOpcode(code_obj, i); + int oparg = 0; + while (opcode == EXTENDED_ARG) { + oparg = (oparg << 8) | code[i].op.arg; + i++; + opcode = _Py_GetBaseOpcode(code_obj, i); + stacks[i] = next_stack; + } + int next_i = i + _PyOpcode_Caches[opcode] + 1; if (next_stack == UNINITIALIZED) { + i = next_i; continue; } - opcode = code[i].op.code; + oparg = (oparg << 8) | code[i].op.arg; switch (opcode) { case POP_JUMP_IF_FALSE: case POP_JUMP_IF_TRUE: { int64_t target_stack; - int j = get_arg(code, i); - j += i + 1; + int j = next_i + oparg; assert(j < len); - if (stacks[j] == UNINITIALIZED && j < i) { - todo = 1; - } next_stack = pop_value(next_stack); target_stack = next_stack; assert(stacks[j] == UNINITIALIZED || stacks[j] == target_stack); stacks[j] = target_stack; - stacks[i+1] = next_stack; + stacks[next_i] = next_stack; break; } case SEND: - j = get_arg(code, i) + i + INLINE_CACHE_ENTRIES_SEND + 1; + j = oparg + i + INLINE_CACHE_ENTRIES_SEND + 1; assert(j < len); assert(stacks[j] == UNINITIALIZED || stacks[j] == next_stack); stacks[j] = next_stack; - stacks[i+1] = next_stack; + stacks[next_i] = next_stack; break; case JUMP_FORWARD: - j = get_arg(code, i) + i + 1; + j = oparg + i + 1; assert(j < len); assert(stacks[j] == UNINITIALIZED || stacks[j] == next_stack); stacks[j] = next_stack; break; case JUMP_BACKWARD: case JUMP_BACKWARD_NO_INTERRUPT: - j = i + 1 - get_arg(code, i); + j = i + 1 - oparg; assert(j >= 0); assert(j < len); if (stacks[j] == UNINITIALIZED && j < i) { @@ -350,13 +360,13 @@ mark_stacks(PyCodeObject *code_obj, int len) case GET_ITER: case GET_AITER: next_stack = push_value(pop_value(next_stack), Iterator); - stacks[i+1] = next_stack; + stacks[next_i] = next_stack; break; case FOR_ITER: { int64_t target_stack = push_value(next_stack, Object); - stacks[i+1] = target_stack; - j = get_arg(code, i) + 1 + INLINE_CACHE_ENTRIES_FOR_ITER + i; + stacks[next_i] = target_stack; + j = oparg + 1 + INLINE_CACHE_ENTRIES_FOR_ITER + i; assert(j < len); assert(stacks[j] == UNINITIALIZED || stacks[j] == target_stack); stacks[j] = target_stack; @@ -364,16 +374,16 @@ mark_stacks(PyCodeObject *code_obj, int len) } case END_ASYNC_FOR: next_stack = pop_value(pop_value(next_stack)); - stacks[i+1] = next_stack; + stacks[next_i] = next_stack; break; case PUSH_EXC_INFO: next_stack = push_value(next_stack, Except); - stacks[i+1] = next_stack; + stacks[next_i] = next_stack; break; case POP_EXCEPT: assert(top_of_stack(next_stack) == Except); next_stack = pop_value(next_stack); - stacks[i+1] = next_stack; + stacks[next_i] = next_stack; break; case RETURN_VALUE: assert(pop_value(next_stack) == EMPTY_STACK); @@ -389,57 +399,62 @@ mark_stacks(PyCodeObject *code_obj, int len) break; case PUSH_NULL: next_stack = push_value(next_stack, Null); - stacks[i+1] = next_stack; + stacks[next_i] = next_stack; break; case LOAD_GLOBAL: { - int j = get_arg(code, i); + int j = oparg; if (j & 1) { next_stack = push_value(next_stack, Null); } next_stack = push_value(next_stack, Object); - stacks[i+1] = next_stack; + stacks[next_i] = next_stack; break; } case LOAD_ATTR: { assert(top_of_stack(next_stack) == Object); - int j = get_arg(code, i); + int j = oparg; if (j & 1) { next_stack = pop_value(next_stack); next_stack = push_value(next_stack, Null); next_stack = push_value(next_stack, Object); } - stacks[i+1] = next_stack; + stacks[next_i] = next_stack; break; } case CALL: { - int args = get_arg(code, i); + int args = oparg; for (int j = 0; j < args+2; j++) { next_stack = pop_value(next_stack); } next_stack = push_value(next_stack, Object); - stacks[i+1] = next_stack; + stacks[next_i] = next_stack; break; } case SWAP: { - int n = get_arg(code, i); + int n = oparg; next_stack = stack_swap(next_stack, n); - stacks[i+1] = next_stack; + stacks[next_i] = next_stack; break; } case COPY: { - int n = get_arg(code, i); + int n = oparg; next_stack = push_value(next_stack, peek(next_stack, n)); - stacks[i+1] = next_stack; + stacks[next_i] = next_stack; break; } + case CACHE: + case RESERVED: + { + assert(0); + } default: { - int delta = PyCompile_OpcodeStackEffect(opcode, get_arg(code, i)); + int delta = PyCompile_OpcodeStackEffect(opcode, oparg); assert(delta != PY_INVALID_STACK_EFFECT); while (delta < 0) { next_stack = pop_value(next_stack); @@ -449,9 +464,10 @@ mark_stacks(PyCodeObject *code_obj, int len) next_stack = push_value(next_stack, Object); delta--; } - stacks[i+1] = next_stack; + stacks[next_i] = next_stack; } } + i = next_i; } /* Scan exception table */ unsigned char *start = (unsigned char *)PyBytes_AS_STRING(code_obj->co_exceptiontable); @@ -646,31 +662,43 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore * In addition, jumps are forbidden when not tracing, * as this is a debugging feature. */ - switch(PyThreadState_GET()->tracing_what) { - case PyTrace_EXCEPTION: - PyErr_SetString(PyExc_ValueError, - "can only jump from a 'line' trace event"); - return -1; - case PyTrace_CALL: + int what_event = PyThreadState_GET()->what_event; + if (what_event < 0) { + PyErr_Format(PyExc_ValueError, + "f_lineno can only be set in a trace function"); + return -1; + } + switch (what_event) { + case PY_MONITORING_EVENT_PY_RESUME: + case PY_MONITORING_EVENT_JUMP: + case PY_MONITORING_EVENT_BRANCH: + case PY_MONITORING_EVENT_LINE: + case PY_MONITORING_EVENT_PY_YIELD: + /* Setting f_lineno is allowed for the above events */ + break; + case PY_MONITORING_EVENT_PY_START: PyErr_Format(PyExc_ValueError, "can't jump from the 'call' trace event of a new frame"); return -1; - case PyTrace_LINE: - break; - case PyTrace_RETURN: - if (state == FRAME_SUSPENDED) { - break; - } - /* fall through */ - default: + case PY_MONITORING_EVENT_CALL: + case PY_MONITORING_EVENT_C_RETURN: PyErr_SetString(PyExc_ValueError, + "can't jump during a call"); + return -1; + case PY_MONITORING_EVENT_PY_RETURN: + case PY_MONITORING_EVENT_PY_UNWIND: + case PY_MONITORING_EVENT_PY_THROW: + case PY_MONITORING_EVENT_RAISE: + case PY_MONITORING_EVENT_C_RAISE: + case PY_MONITORING_EVENT_INSTRUCTION: + case PY_MONITORING_EVENT_EXCEPTION_HANDLED: + PyErr_Format(PyExc_ValueError, "can only jump from a 'line' trace event"); return -1; - } - if (!f->f_trace) { - PyErr_Format(PyExc_ValueError, - "f_lineno can only be set by a trace function"); - return -1; + default: + PyErr_SetString(PyExc_SystemError, + "unexpected event type"); + return -1; } int new_lineno; @@ -803,6 +831,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore start_stack = pop_value(start_stack); } /* Finally set the new lasti and return OK. */ + f->f_last_traced_line = new_lineno; f->f_lineno = 0; f->f_frame->prev_instr = _PyCode_CODE(f->f_frame->f_code) + best_addr; return 0; @@ -823,7 +852,10 @@ frame_settrace(PyFrameObject *f, PyObject* v, void *closure) if (v == Py_None) { v = NULL; } - Py_XSETREF(f->f_trace, Py_XNewRef(v)); + if (v != f->f_trace) { + Py_XSETREF(f->f_trace, Py_XNewRef(v)); + f->f_last_traced_line = -1; + } return 0; } @@ -838,6 +870,7 @@ static PyGetSetDef frame_getsetlist[] = { {"f_globals", (getter)frame_getglobals, NULL, NULL}, {"f_builtins", (getter)frame_getbuiltins, NULL, NULL}, {"f_code", (getter)frame_getcode, NULL, NULL}, + {"f_trace_opcodes", (getter)frame_gettrace_opcodes, (setter)frame_settrace_opcodes, NULL}, {0} }; @@ -1023,6 +1056,7 @@ _PyFrame_New_NoTrack(PyCodeObject *code) f->f_trace_opcodes = 0; f->f_fast_as_locals = 0; f->f_lineno = 0; + f->f_last_traced_line = -1; return f; } diff --git a/Objects/object.c b/Objects/object.c index 71f098eed37f51..56747fa193e178 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1972,6 +1972,7 @@ extern PyTypeObject _Py_GenericAliasIterType; extern PyTypeObject _PyMemoryIter_Type; extern PyTypeObject _PyLineIterator; extern PyTypeObject _PyPositionsIterator; +extern PyTypeObject _PyLegacyEventHandler_Type; static PyTypeObject* static_types[] = { // The two most important base types: must be initialized first and @@ -2069,6 +2070,7 @@ static PyTypeObject* static_types[] = { &_PyHamt_BitmapNode_Type, &_PyHamt_CollisionNode_Type, &_PyHamt_Type, + &_PyLegacyEventHandler_Type, &_PyInterpreterID_Type, &_PyLineIterator, &_PyManagedBuffer_Type, diff --git a/PCbuild/_freeze_module.vcxproj b/PCbuild/_freeze_module.vcxproj index 70ca0787cfd601..d897925f58c0de 100644 --- a/PCbuild/_freeze_module.vcxproj +++ b/PCbuild/_freeze_module.vcxproj @@ -209,6 +209,8 @@ + + diff --git a/PCbuild/_freeze_module.vcxproj.filters b/PCbuild/_freeze_module.vcxproj.filters index 464cbec62a628b..176935a63c4852 100644 --- a/PCbuild/_freeze_module.vcxproj.filters +++ b/PCbuild/_freeze_module.vcxproj.filters @@ -214,6 +214,12 @@ Source Files + + Source Files + + + Source Files + Source Files diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index a465f99eca82d8..8aafcb786a6064 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -532,6 +532,8 @@ + + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 52cd4bbb6fb18d..07476f30833372 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -1178,6 +1178,12 @@ Source Files + + Source Files + + + Source Files + Python diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 72f85cc92b0c92..5c6398aba198f9 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -14,6 +14,7 @@ #include "pycore_function.h" #include "pycore_intrinsics.h" #include "pycore_long.h" // _PyLong_GetZero() +#include "pycore_instruments.h" #include "pycore_object.h" // _PyObject_GC_TRACK() #include "pycore_moduleobject.h" // PyModuleObject #include "pycore_opcode.h" // EXTRA_CASES @@ -134,11 +135,45 @@ dummy_func( inst(RESUME, (--)) { assert(tstate->cframe == &cframe); assert(frame == cframe.current_frame); - if (_Py_atomic_load_relaxed_int32(eval_breaker) && oparg < 2) { + /* Possibly combine this with eval breaker */ + if (frame->f_code->_co_instrumentation_version != tstate->interp->monitoring_version) { + int err = _Py_Instrument(frame->f_code, tstate->interp); + ERROR_IF(err, error); + next_instr--; + } + else if (_Py_atomic_load_relaxed_int32(eval_breaker) && oparg < 2) { goto handle_eval_breaker; } } + inst(INSTRUMENTED_RESUME, (--)) { + /* Possible performance enhancement: + * We need to check the eval breaker anyway, can we + * combine the instrument verison check and the eval breaker test? + */ + if (frame->f_code->_co_instrumentation_version != tstate->interp->monitoring_version) { + if (_Py_Instrument(frame->f_code, tstate->interp)) { + goto error; + } + next_instr--; + } + else { + _PyFrame_SetStackPointer(frame, stack_pointer); + int err = _Py_call_instrumentation( + tstate, oparg > 0, frame, next_instr-1); + stack_pointer = _PyFrame_GetStackPointer(frame); + ERROR_IF(err, error); + if (frame->prev_instr != next_instr-1) { + /* Instrumentation has jumped */ + next_instr = frame->prev_instr; + DISPATCH(); + } + if (_Py_atomic_load_relaxed_int32(eval_breaker) && oparg < 2) { + goto handle_eval_breaker; + } + } + } + inst(LOAD_CLOSURE, (-- value)) { /* We keep LOAD_CLOSURE so that the bytecode stays more readable. */ value = GETLOCAL(oparg); @@ -183,6 +218,34 @@ dummy_func( macro(END_FOR) = POP_TOP + POP_TOP; + inst(INSTRUMENTED_END_FOR, (receiver, value --)) { + /* Need to create a fake StopIteration error here, + * to conform to PEP 380 */ + if (PyGen_Check(receiver)) { + PyErr_SetObject(PyExc_StopIteration, value); + if (monitor_stop_iteration(tstate, frame, next_instr-1)) { + goto error; + } + PyErr_SetRaisedException(NULL); + } + DECREF_INPUTS(); + } + + inst(END_SEND, (receiver, value -- value)) { + Py_DECREF(receiver); + } + + inst(INSTRUMENTED_END_SEND, (receiver, value -- value)) { + if (PyGen_Check(receiver) || PyCoro_CheckExact(receiver)) { + PyErr_SetObject(PyExc_StopIteration, value); + if (monitor_stop_iteration(tstate, frame, next_instr-1)) { + goto error; + } + PyErr_SetRaisedException(NULL); + } + Py_DECREF(receiver); + } + inst(UNARY_NEGATIVE, (value -- res)) { res = PyNumber_Negative(value); DECREF_INPUTS(); @@ -222,7 +285,6 @@ dummy_func( inst(BINARY_OP_MULTIPLY_INT, (unused/1, left, right -- prod)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(left), BINARY_OP); DEOPT_IF(!PyLong_CheckExact(right), BINARY_OP); STAT_INC(BINARY_OP, hit); @@ -233,7 +295,6 @@ dummy_func( } inst(BINARY_OP_MULTIPLY_FLOAT, (unused/1, left, right -- prod)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyFloat_CheckExact(left), BINARY_OP); DEOPT_IF(!PyFloat_CheckExact(right), BINARY_OP); STAT_INC(BINARY_OP, hit); @@ -243,7 +304,6 @@ dummy_func( } inst(BINARY_OP_SUBTRACT_INT, (unused/1, left, right -- sub)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(left), BINARY_OP); DEOPT_IF(!PyLong_CheckExact(right), BINARY_OP); STAT_INC(BINARY_OP, hit); @@ -254,7 +314,6 @@ dummy_func( } inst(BINARY_OP_SUBTRACT_FLOAT, (unused/1, left, right -- sub)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyFloat_CheckExact(left), BINARY_OP); DEOPT_IF(!PyFloat_CheckExact(right), BINARY_OP); STAT_INC(BINARY_OP, hit); @@ -263,7 +322,6 @@ dummy_func( } inst(BINARY_OP_ADD_UNICODE, (unused/1, left, right -- res)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyUnicode_CheckExact(left), BINARY_OP); DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP); STAT_INC(BINARY_OP, hit); @@ -280,7 +338,6 @@ dummy_func( // specializations, but there is no output. // At the end we just skip over the STORE_FAST. inst(BINARY_OP_INPLACE_ADD_UNICODE, (left, right --)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyUnicode_CheckExact(left), BINARY_OP); DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP); _Py_CODEUNIT true_next = next_instr[INLINE_CACHE_ENTRIES_BINARY_OP]; @@ -310,7 +367,6 @@ dummy_func( } inst(BINARY_OP_ADD_FLOAT, (unused/1, left, right -- sum)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyFloat_CheckExact(left), BINARY_OP); DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP); STAT_INC(BINARY_OP, hit); @@ -320,7 +376,6 @@ dummy_func( } inst(BINARY_OP_ADD_INT, (unused/1, left, right -- sum)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(left), BINARY_OP); DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP); STAT_INC(BINARY_OP, hit); @@ -342,7 +397,6 @@ dummy_func( #if ENABLE_SPECIALIZATION _PyBinarySubscrCache *cache = (_PyBinarySubscrCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); next_instr--; _Py_Specialize_BinarySubscr(container, sub, next_instr); DISPATCH_SAME_OPARG(); @@ -386,7 +440,6 @@ dummy_func( } inst(BINARY_SUBSCR_LIST_INT, (unused/1, list, sub -- res)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR); DEOPT_IF(!PyList_CheckExact(list), BINARY_SUBSCR); @@ -403,7 +456,6 @@ dummy_func( } inst(BINARY_SUBSCR_TUPLE_INT, (unused/1, tuple, sub -- res)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR); DEOPT_IF(!PyTuple_CheckExact(tuple), BINARY_SUBSCR); @@ -420,7 +472,6 @@ dummy_func( } inst(BINARY_SUBSCR_DICT, (unused/1, dict, sub -- res)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyDict_CheckExact(dict), BINARY_SUBSCR); STAT_INC(BINARY_SUBSCR, hit); res = PyDict_GetItemWithError(dict, sub); @@ -479,7 +530,6 @@ dummy_func( inst(STORE_SUBSCR, (counter/1, v, container, sub -- )) { #if ENABLE_SPECIALIZATION if (ADAPTIVE_COUNTER_IS_ZERO(counter)) { - assert(cframe.use_tracing == 0); next_instr--; _Py_Specialize_StoreSubscr(container, sub, next_instr); DISPATCH_SAME_OPARG(); @@ -497,7 +547,6 @@ dummy_func( } inst(STORE_SUBSCR_LIST_INT, (unused/1, value, list, sub -- )) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(sub), STORE_SUBSCR); DEOPT_IF(!PyList_CheckExact(list), STORE_SUBSCR); @@ -517,7 +566,6 @@ dummy_func( } inst(STORE_SUBSCR_DICT, (unused/1, value, dict, sub -- )) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyDict_CheckExact(dict), STORE_SUBSCR); STAT_INC(STORE_SUBSCR, hit); int err = _PyDict_SetItem_Take2((PyDictObject *)dict, sub, value); @@ -573,7 +621,6 @@ dummy_func( assert(EMPTY()); /* Restore previous cframe and return. */ tstate->cframe = cframe.previous; - tstate->cframe->use_tracing = cframe.use_tracing; assert(tstate->cframe->current_frame == frame->previous); assert(!_PyErr_Occurred(tstate)); _Py_LeaveRecursiveCallTstate(tstate); @@ -584,8 +631,24 @@ dummy_func( STACK_SHRINK(1); assert(EMPTY()); _PyFrame_SetStackPointer(frame, stack_pointer); - TRACE_FUNCTION_EXIT(); - DTRACE_FUNCTION_EXIT(); + _Py_LeaveRecursiveCallPy(tstate); + assert(frame != &entry_frame); + // GH-99729: We need to unlink the frame *before* clearing it: + _PyInterpreterFrame *dying = frame; + frame = cframe.current_frame = dying->previous; + _PyEvalFrameClearAndPop(tstate, dying); + _PyFrame_StackPush(frame, retval); + goto resume_frame; + } + + inst(INSTRUMENTED_RETURN_VALUE, (retval --)) { + int err = _Py_call_instrumentation_arg( + tstate, PY_MONITORING_EVENT_PY_RETURN, + frame, next_instr-1, retval); + if (err) goto error; + STACK_SHRINK(1); + assert(EMPTY()); + _PyFrame_SetStackPointer(frame, stack_pointer); _Py_LeaveRecursiveCallPy(tstate); assert(frame != &entry_frame); // GH-99729: We need to unlink the frame *before* clearing it: @@ -601,8 +664,25 @@ dummy_func( Py_INCREF(retval); assert(EMPTY()); _PyFrame_SetStackPointer(frame, stack_pointer); - TRACE_FUNCTION_EXIT(); - DTRACE_FUNCTION_EXIT(); + _Py_LeaveRecursiveCallPy(tstate); + assert(frame != &entry_frame); + // GH-99729: We need to unlink the frame *before* clearing it: + _PyInterpreterFrame *dying = frame; + frame = cframe.current_frame = dying->previous; + _PyEvalFrameClearAndPop(tstate, dying); + _PyFrame_StackPush(frame, retval); + goto resume_frame; + } + + inst(INSTRUMENTED_RETURN_CONST, (--)) { + PyObject *retval = GETITEM(frame->f_code->co_consts, oparg); + int err = _Py_call_instrumentation_arg( + tstate, PY_MONITORING_EVENT_PY_RETURN, + frame, next_instr-1, retval); + if (err) goto error; + Py_INCREF(retval); + assert(EMPTY()); + _PyFrame_SetStackPointer(frame, stack_pointer); _Py_LeaveRecursiveCallPy(tstate); assert(frame != &entry_frame); // GH-99729: We need to unlink the frame *before* clearing it: @@ -730,7 +810,6 @@ dummy_func( #if ENABLE_SPECIALIZATION _PySendCache *cache = (_PySendCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); next_instr--; _Py_Specialize_Send(receiver, next_instr); DISPATCH_SAME_OPARG(); @@ -739,6 +818,20 @@ dummy_func( DECREMENT_ADAPTIVE_COUNTER(cache->counter); #endif /* ENABLE_SPECIALIZATION */ assert(frame != &entry_frame); + if ((Py_TYPE(receiver) == &PyGen_Type || + Py_TYPE(receiver) == &PyCoro_Type) && ((PyGenObject *)receiver)->gi_frame_state < FRAME_EXECUTING) + { + PyGenObject *gen = (PyGenObject *)receiver; + _PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; + frame->yield_offset = oparg; + STACK_SHRINK(1); + _PyFrame_StackPush(gen_frame, v); + gen->gi_frame_state = FRAME_EXECUTING; + gen->gi_exc_state.previous_item = tstate->exc_info; + tstate->exc_info = &gen->gi_exc_state; + JUMPBY(INLINE_CACHE_ENTRIES_SEND + oparg); + DISPATCH_INLINED(gen_frame); + } if (Py_IsNone(v) && PyIter_Check(receiver)) { retval = Py_TYPE(receiver)->tp_iternext(receiver); } @@ -746,26 +839,22 @@ dummy_func( retval = PyObject_CallMethodOneArg(receiver, &_Py_ID(send), v); } if (retval == NULL) { - if (tstate->c_tracefunc != NULL - && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) - call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, frame); + if (_PyErr_ExceptionMatches(tstate, PyExc_StopIteration) + ) { + monitor_raise(tstate, frame, next_instr-1); + } if (_PyGen_FetchStopIterationValue(&retval) == 0) { assert(retval != NULL); JUMPBY(oparg); } else { - assert(retval == NULL); goto error; } } - else { - assert(retval != NULL); - } Py_DECREF(v); } inst(SEND_GEN, (unused/1, receiver, v -- receiver)) { - assert(cframe.use_tracing == 0); PyGenObject *gen = (PyGenObject *)receiver; DEOPT_IF(Py_TYPE(gen) != &PyGen_Type && Py_TYPE(gen) != &PyCoro_Type, SEND); @@ -782,6 +871,26 @@ dummy_func( DISPATCH_INLINED(gen_frame); } + inst(INSTRUMENTED_YIELD_VALUE, (retval -- unused)) { + assert(frame != &entry_frame); + PyGenObject *gen = _PyFrame_GetGenerator(frame); + gen->gi_frame_state = FRAME_SUSPENDED; + _PyFrame_SetStackPointer(frame, stack_pointer - 1); + int err = _Py_call_instrumentation_arg( + tstate, PY_MONITORING_EVENT_PY_YIELD, + frame, next_instr-1, retval); + if (err) goto error; + tstate->exc_info = gen->gi_exc_state.previous_item; + gen->gi_exc_state.previous_item = NULL; + _Py_LeaveRecursiveCallPy(tstate); + _PyInterpreterFrame *gen_frame = frame; + frame = cframe.current_frame = frame->previous; + gen_frame->previous = NULL; + frame->prev_instr -= frame->yield_offset; + _PyFrame_StackPush(frame, retval); + goto resume_frame; + } + inst(YIELD_VALUE, (retval -- unused)) { // NOTE: It's important that YIELD_VALUE never raises an exception! // The compiler treats any exception raised here as a failed close() @@ -790,8 +899,6 @@ dummy_func( PyGenObject *gen = _PyFrame_GetGenerator(frame); gen->gi_frame_state = FRAME_SUSPENDED; _PyFrame_SetStackPointer(frame, stack_pointer - 1); - TRACE_FUNCTION_EXIT(); - DTRACE_FUNCTION_EXIT(); tstate->exc_info = gen->gi_exc_state.previous_item; gen->gi_exc_state.previous_item = NULL; _Py_LeaveRecursiveCallPy(tstate); @@ -930,7 +1037,6 @@ dummy_func( #if ENABLE_SPECIALIZATION _PyUnpackSequenceCache *cache = (_PyUnpackSequenceCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); next_instr--; _Py_Specialize_UnpackSequence(seq, next_instr, oparg); DISPATCH_SAME_OPARG(); @@ -994,7 +1100,6 @@ dummy_func( inst(STORE_ATTR, (counter/1, unused/3, v, owner --)) { #if ENABLE_SPECIALIZATION if (ADAPTIVE_COUNTER_IS_ZERO(counter)) { - assert(cframe.use_tracing == 0); PyObject *name = GETITEM(frame->f_code->co_names, oparg); next_instr--; _Py_Specialize_StoreAttr(owner, next_instr, name); @@ -1111,7 +1216,6 @@ dummy_func( #if ENABLE_SPECIALIZATION _PyLoadGlobalCache *cache = (_PyLoadGlobalCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); PyObject *name = GETITEM(frame->f_code->co_names, oparg>>1); next_instr--; _Py_Specialize_LoadGlobal(GLOBALS(), BUILTINS(), next_instr, name); @@ -1163,7 +1267,6 @@ dummy_func( } inst(LOAD_GLOBAL_MODULE, (unused/1, index/1, version/1, unused/1 -- null if (oparg & 1), res)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyDict_CheckExact(GLOBALS()), LOAD_GLOBAL); PyDictObject *dict = (PyDictObject *)GLOBALS(); DEOPT_IF(dict->ma_keys->dk_version != version, LOAD_GLOBAL); @@ -1177,11 +1280,11 @@ dummy_func( } inst(LOAD_GLOBAL_BUILTIN, (unused/1, index/1, mod_version/1, bltn_version/1 -- null if (oparg & 1), res)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyDict_CheckExact(GLOBALS()), LOAD_GLOBAL); DEOPT_IF(!PyDict_CheckExact(BUILTINS()), LOAD_GLOBAL); PyDictObject *mdict = (PyDictObject *)GLOBALS(); PyDictObject *bdict = (PyDictObject *)BUILTINS(); + assert(opcode == LOAD_GLOBAL_BUILTIN); DEOPT_IF(mdict->ma_keys->dk_version != mod_version, LOAD_GLOBAL); DEOPT_IF(bdict->ma_keys->dk_version != bltn_version, LOAD_GLOBAL); assert(DK_IS_UNICODE(bdict->ma_keys)); @@ -1465,7 +1568,6 @@ dummy_func( #if ENABLE_SPECIALIZATION _PyAttrCache *cache = (_PyAttrCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); PyObject *name = GETITEM(frame->f_code->co_names, oparg>>1); next_instr--; _Py_Specialize_LoadAttr(owner, next_instr, name); @@ -1511,7 +1613,6 @@ dummy_func( } inst(LOAD_ATTR_INSTANCE_VALUE, (unused/1, type_version/2, index/1, unused/5, owner -- res2 if (oparg & 1), res)) { - assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, LOAD_ATTR); @@ -1528,7 +1629,6 @@ dummy_func( } inst(LOAD_ATTR_MODULE, (unused/1, type_version/2, index/1, unused/5, owner -- res2 if (oparg & 1), res)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyModule_CheckExact(owner), LOAD_ATTR); PyDictObject *dict = (PyDictObject *)((PyModuleObject *)owner)->md_dict; assert(dict != NULL); @@ -1545,7 +1645,6 @@ dummy_func( } inst(LOAD_ATTR_WITH_HINT, (unused/1, type_version/2, index/1, unused/5, owner -- res2 if (oparg & 1), res)) { - assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, LOAD_ATTR); @@ -1576,7 +1675,6 @@ dummy_func( } inst(LOAD_ATTR_SLOT, (unused/1, type_version/2, index/1, unused/5, owner -- res2 if (oparg & 1), res)) { - assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, LOAD_ATTR); @@ -1590,7 +1688,6 @@ dummy_func( } inst(LOAD_ATTR_CLASS, (unused/1, type_version/2, unused/2, descr/4, cls -- res2 if (oparg & 1), res)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyType_Check(cls), LOAD_ATTR); DEOPT_IF(((PyTypeObject *)cls)->tp_version_tag != type_version, @@ -1606,7 +1703,6 @@ dummy_func( } inst(LOAD_ATTR_PROPERTY, (unused/1, type_version/2, func_version/2, fget/4, owner -- unused if (oparg & 1), unused)) { - assert(cframe.use_tracing == 0); DEOPT_IF(tstate->interp->eval_frame, LOAD_ATTR); PyTypeObject *cls = Py_TYPE(owner); @@ -1632,7 +1728,6 @@ dummy_func( } inst(LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN, (unused/1, type_version/2, func_version/2, getattribute/4, owner -- unused if (oparg & 1), unused)) { - assert(cframe.use_tracing == 0); DEOPT_IF(tstate->interp->eval_frame, LOAD_ATTR); PyTypeObject *cls = Py_TYPE(owner); DEOPT_IF(cls->tp_version_tag != type_version, LOAD_ATTR); @@ -1660,7 +1755,6 @@ dummy_func( } inst(STORE_ATTR_INSTANCE_VALUE, (unused/1, type_version/2, index/1, value, owner --)) { - assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, STORE_ATTR); @@ -1681,7 +1775,6 @@ dummy_func( } inst(STORE_ATTR_WITH_HINT, (unused/1, type_version/2, hint/1, value, owner --)) { - assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, STORE_ATTR); @@ -1723,7 +1816,6 @@ dummy_func( } inst(STORE_ATTR_SLOT, (unused/1, type_version/2, index/1, value, owner --)) { - assert(cframe.use_tracing == 0); PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, STORE_ATTR); @@ -1746,7 +1838,6 @@ dummy_func( #if ENABLE_SPECIALIZATION _PyCompareOpCache *cache = (_PyCompareOpCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); next_instr--; _Py_Specialize_CompareOp(left, right, next_instr, oparg); DISPATCH_SAME_OPARG(); @@ -1761,7 +1852,6 @@ dummy_func( } inst(COMPARE_OP_FLOAT, (unused/1, left, right -- res)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyFloat_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyFloat_CheckExact(right), COMPARE_OP); STAT_INC(COMPARE_OP, hit); @@ -1777,7 +1867,6 @@ dummy_func( // Similar to COMPARE_OP_FLOAT inst(COMPARE_OP_INT, (unused/1, left, right -- res)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyLong_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyLong_CheckExact(right), COMPARE_OP); DEOPT_IF(!_PyLong_IsCompact((PyLongObject *)left), COMPARE_OP); @@ -1797,7 +1886,6 @@ dummy_func( // Similar to COMPARE_OP_FLOAT, but for ==, != only inst(COMPARE_OP_STR, (unused/1, left, right -- res)) { - assert(cframe.use_tracing == 0); DEOPT_IF(!PyUnicode_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyUnicode_CheckExact(right), COMPARE_OP); STAT_INC(COMPARE_OP, hit); @@ -2044,7 +2132,6 @@ dummy_func( #if ENABLE_SPECIALIZATION _PyForIterCache *cache = (_PyForIterCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); next_instr--; _Py_Specialize_ForIter(iter, next_instr, oparg); DISPATCH_SAME_OPARG(); @@ -2059,13 +2146,12 @@ dummy_func( if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) { goto error; } - else if (tstate->c_tracefunc != NULL) { - call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, frame); - } + monitor_raise(tstate, frame, next_instr-1); _PyErr_Clear(tstate); } /* iterator ended normally */ - assert(next_instr[INLINE_CACHE_ENTRIES_FOR_ITER + oparg].op.code == END_FOR); + assert(next_instr[INLINE_CACHE_ENTRIES_FOR_ITER + oparg].op.code == END_FOR || + next_instr[INLINE_CACHE_ENTRIES_FOR_ITER + oparg].op.code == INSTRUMENTED_END_FOR); Py_DECREF(iter); STACK_SHRINK(1); /* Jump forward oparg, then skip following END_FOR instruction */ @@ -2075,8 +2161,35 @@ dummy_func( // Common case: no jump, leave it to the code generator } + inst(INSTRUMENTED_FOR_ITER, ( -- )) { + _Py_CODEUNIT *here = next_instr-1; + _Py_CODEUNIT *target; + PyObject *iter = TOP(); + PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter); + if (next != NULL) { + PUSH(next); + target = next_instr + INLINE_CACHE_ENTRIES_FOR_ITER; + } + else { + if (_PyErr_Occurred(tstate)) { + if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) { + goto error; + } + monitor_raise(tstate, frame, here); + _PyErr_Clear(tstate); + } + /* iterator ended normally */ + assert(next_instr[INLINE_CACHE_ENTRIES_FOR_ITER + oparg].op.code == END_FOR || + next_instr[INLINE_CACHE_ENTRIES_FOR_ITER + oparg].op.code == INSTRUMENTED_END_FOR); + STACK_SHRINK(1); + Py_DECREF(iter); + /* Skip END_FOR */ + target = next_instr + INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1; + } + INSTRUMENTED_JUMP(here, target, PY_MONITORING_EVENT_BRANCH); + } + inst(FOR_ITER_LIST, (unused/1, iter -- iter, next)) { - assert(cframe.use_tracing == 0); DEOPT_IF(Py_TYPE(iter) != &PyListIter_Type, FOR_ITER); _PyListIterObject *it = (_PyListIterObject *)iter; STAT_INC(FOR_ITER, hit); @@ -2099,7 +2212,6 @@ dummy_func( } inst(FOR_ITER_TUPLE, (unused/1, iter -- iter, next)) { - assert(cframe.use_tracing == 0); _PyTupleIterObject *it = (_PyTupleIterObject *)iter; DEOPT_IF(Py_TYPE(it) != &PyTupleIter_Type, FOR_ITER); STAT_INC(FOR_ITER, hit); @@ -2122,7 +2234,6 @@ dummy_func( } inst(FOR_ITER_RANGE, (unused/1, iter -- iter, next)) { - assert(cframe.use_tracing == 0); _PyRangeIterObject *r = (_PyRangeIterObject *)iter; DEOPT_IF(Py_TYPE(r) != &PyRangeIter_Type, FOR_ITER); STAT_INC(FOR_ITER, hit); @@ -2143,7 +2254,6 @@ dummy_func( } inst(FOR_ITER_GEN, (unused/1, iter -- iter, unused)) { - assert(cframe.use_tracing == 0); PyGenObject *gen = (PyGenObject *)iter; DEOPT_IF(Py_TYPE(gen) != &PyGen_Type, FOR_ITER); DEOPT_IF(gen->gi_frame_state >= FRAME_EXECUTING, FOR_ITER); @@ -2155,7 +2265,8 @@ dummy_func( gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg); - assert(next_instr->op.code == END_FOR); + assert(next_instr->op.code == END_FOR || + next_instr->op.code == INSTRUMENTED_END_FOR); DISPATCH_INLINED(gen_frame); } @@ -2264,7 +2375,6 @@ dummy_func( inst(LOAD_ATTR_METHOD_WITH_VALUES, (unused/1, type_version/2, keys_version/2, descr/4, self -- res2 if (oparg & 1), res)) { /* Cached method object */ - assert(cframe.use_tracing == 0); PyTypeObject *self_cls = Py_TYPE(self); assert(type_version != 0); DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR); @@ -2283,7 +2393,6 @@ dummy_func( } inst(LOAD_ATTR_METHOD_NO_DICT, (unused/1, type_version/2, unused/2, descr/4, self -- res2 if (oparg & 1), res)) { - assert(cframe.use_tracing == 0); PyTypeObject *self_cls = Py_TYPE(self); DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR); assert(self_cls->tp_dictoffset == 0); @@ -2296,7 +2405,6 @@ dummy_func( } inst(LOAD_ATTR_METHOD_LAZY_DICT, (unused/1, type_version/2, unused/2, descr/4, self -- res2 if (oparg & 1), res)) { - assert(cframe.use_tracing == 0); PyTypeObject *self_cls = Py_TYPE(self); DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR); Py_ssize_t dictoffset = self_cls->tp_dictoffset; @@ -2318,6 +2426,21 @@ dummy_func( kwnames = GETITEM(frame->f_code->co_consts, oparg); } + inst(INSTRUMENTED_CALL, ( -- )) { + int is_meth = PEEK(oparg+2) != NULL; + int total_args = oparg + is_meth; + PyObject *function = PEEK(total_args + 1); + PyObject *arg = total_args == 0 ? + &_PyInstrumentation_MISSING : PEEK(total_args); + int err = _Py_call_instrumentation_2args( + tstate, PY_MONITORING_EVENT_CALL, + frame, next_instr-1, function, arg); + ERROR_IF(err, error); + _PyCallCache *cache = (_PyCallCache *)next_instr; + INCREMENT_ADAPTIVE_COUNTER(cache->counter); + GO_TO_INSTRUCTION(CALL); + } + // Cache layout: counter/1, func_version/2 // Neither CALL_INTRINSIC_1/2 nor CALL_FUNCTION_EX are members! family(call, INLINE_CACHE_ENTRIES_CALL) = { @@ -2359,7 +2482,6 @@ dummy_func( #if ENABLE_SPECIALIZATION _PyCallCache *cache = (_PyCallCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); next_instr--; _Py_Specialize_Call(callable, next_instr, total_args, kwnames); DISPATCH_SAME_OPARG(); @@ -2402,16 +2524,26 @@ dummy_func( DISPATCH_INLINED(new_frame); } /* Callable is not a normal Python function */ - if (cframe.use_tracing) { - res = trace_call_function( - tstate, callable, args, - positional_args, kwnames); - } - else { - res = PyObject_Vectorcall( - callable, args, - positional_args | PY_VECTORCALL_ARGUMENTS_OFFSET, - kwnames); + res = PyObject_Vectorcall( + callable, args, + positional_args | PY_VECTORCALL_ARGUMENTS_OFFSET, + kwnames); + if (opcode == INSTRUMENTED_CALL) { + PyObject *arg = total_args == 0 ? + &_PyInstrumentation_MISSING : PEEK(total_args); + if (res == NULL) { + _Py_call_instrumentation_exc2( + tstate, PY_MONITORING_EVENT_C_RAISE, + frame, next_instr-1, callable, arg); + } + else { + int err = _Py_call_instrumentation_2args( + tstate, PY_MONITORING_EVENT_C_RETURN, + frame, next_instr-1, callable, arg); + if (err < 0) { + Py_CLEAR(res); + } + } } kwnames = NULL; assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); @@ -2504,7 +2636,6 @@ dummy_func( inst(CALL_NO_KW_TYPE_1, (unused/1, unused/2, null, callable, args[oparg] -- res)) { assert(kwnames == NULL); - assert(cframe.use_tracing == 0); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); PyObject *obj = args[0]; @@ -2517,7 +2648,6 @@ dummy_func( inst(CALL_NO_KW_STR_1, (unused/1, unused/2, null, callable, args[oparg] -- res)) { assert(kwnames == NULL); - assert(cframe.use_tracing == 0); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); DEOPT_IF(callable != (PyObject *)&PyUnicode_Type, CALL); @@ -2570,7 +2700,6 @@ dummy_func( } inst(CALL_NO_KW_BUILTIN_O, (unused/1, unused/2, method, callable, args[oparg] -- res)) { - assert(cframe.use_tracing == 0); /* Builtin METH_O functions */ assert(kwnames == NULL); int is_meth = method != NULL; @@ -2602,7 +2731,6 @@ dummy_func( } inst(CALL_NO_KW_BUILTIN_FAST, (unused/1, unused/2, method, callable, args[oparg] -- res)) { - assert(cframe.use_tracing == 0); /* Builtin METH_FASTCALL functions, without keywords */ assert(kwnames == NULL); int is_meth = method != NULL; @@ -2638,7 +2766,6 @@ dummy_func( } inst(CALL_BUILTIN_FAST_WITH_KEYWORDS, (unused/1, unused/2, method, callable, args[oparg] -- res)) { - assert(cframe.use_tracing == 0); /* Builtin METH_FASTCALL | METH_KEYWORDS functions */ int is_meth = method != NULL; int total_args = oparg; @@ -2674,7 +2801,6 @@ dummy_func( } inst(CALL_NO_KW_LEN, (unused/1, unused/2, method, callable, args[oparg] -- res)) { - assert(cframe.use_tracing == 0); assert(kwnames == NULL); /* len(o) */ int is_meth = method != NULL; @@ -2702,7 +2828,6 @@ dummy_func( } inst(CALL_NO_KW_ISINSTANCE, (unused/1, unused/2, method, callable, args[oparg] -- res)) { - assert(cframe.use_tracing == 0); assert(kwnames == NULL); /* isinstance(o, o2) */ int is_meth = method != NULL; @@ -2733,7 +2858,6 @@ dummy_func( // This is secretly a super-instruction inst(CALL_NO_KW_LIST_APPEND, (unused/1, unused/2, method, self, args[oparg] -- unused)) { - assert(cframe.use_tracing == 0); assert(kwnames == NULL); assert(oparg == 1); assert(method != NULL); @@ -2882,12 +3006,14 @@ dummy_func( CHECK_EVAL_BREAKER(); } + inst(INSTRUMENTED_CALL_FUNCTION_EX, ( -- )) { + GO_TO_INSTRUCTION(CALL_FUNCTION_EX); + } + inst(CALL_FUNCTION_EX, (unused, func, callargs, kwargs if (oparg & 1) -- result)) { - if (oparg & 1) { - // DICT_MERGE is called before this opcode if there are kwargs. - // It converts all dict subtypes in kwargs into regular dicts. - assert(PyDict_CheckExact(kwargs)); - } + // DICT_MERGE is called before this opcode if there are kwargs. + // It converts all dict subtypes in kwargs into regular dicts. + assert(kwargs == NULL || PyDict_CheckExact(kwargs)); if (!PyTuple_CheckExact(callargs)) { if (check_args_iterable(tstate, func, callargs) < 0) { goto error; @@ -2899,10 +3025,35 @@ dummy_func( Py_SETREF(callargs, tuple); } assert(PyTuple_CheckExact(callargs)); - - result = do_call_core(tstate, func, callargs, kwargs, cframe.use_tracing); + EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_FUNCTION_EX, func); + if (opcode == INSTRUMENTED_CALL_FUNCTION_EX && + !PyFunction_Check(func) && !PyMethod_Check(func) + ) { + PyObject *arg = PyTuple_GET_SIZE(callargs) > 0 ? + PyTuple_GET_ITEM(callargs, 0) : Py_None; + int err = _Py_call_instrumentation_2args( + tstate, PY_MONITORING_EVENT_CALL, + frame, next_instr-1, func, arg); + if (err) goto error; + result = PyObject_Call(func, callargs, kwargs); + if (result == NULL) { + _Py_call_instrumentation_exc2( + tstate, PY_MONITORING_EVENT_C_RAISE, + frame, next_instr-1, func, arg); + } + else { + int err = _Py_call_instrumentation_2args( + tstate, PY_MONITORING_EVENT_C_RETURN, + frame, next_instr-1, func, arg); + if (err < 0) { + Py_CLEAR(result); + } + } + } + else { + result = PyObject_Call(func, callargs, kwargs); + } DECREF_INPUTS(); - assert(PEEK(3 + (oparg & 1)) == NULL); ERROR_IF(result == NULL, error); CHECK_EVAL_BREAKER(); @@ -3018,7 +3169,6 @@ dummy_func( #if ENABLE_SPECIALIZATION _PyBinaryOpCache *cache = (_PyBinaryOpCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); next_instr--; _Py_Specialize_BinaryOp(lhs, rhs, next_instr, oparg, &GETLOCAL(0)); DISPATCH_SAME_OPARG(); @@ -3039,9 +3189,105 @@ dummy_func( assert(oparg >= 2); } - inst(EXTENDED_ARG, (--)) { + inst(INSTRUMENTED_LINE, ( -- )) { + _Py_CODEUNIT *here = next_instr-1; + _PyFrame_SetStackPointer(frame, stack_pointer); + int original_opcode = _Py_call_instrumentation_line( + tstate, frame, here); + stack_pointer = _PyFrame_GetStackPointer(frame); + if (original_opcode < 0) { + next_instr = here+1; + goto error; + } + next_instr = frame->prev_instr; + if (next_instr != here) { + DISPATCH(); + } + if (_PyOpcode_Caches[original_opcode]) { + _PyBinaryOpCache *cache = (_PyBinaryOpCache *)(next_instr+1); + INCREMENT_ADAPTIVE_COUNTER(cache->counter); + } + opcode = original_opcode; + DISPATCH_GOTO(); + } + + inst(INSTRUMENTED_INSTRUCTION, ( -- )) { + int next_opcode = _Py_call_instrumentation_instruction( + tstate, frame, next_instr-1); + ERROR_IF(next_opcode < 0, error); + next_instr--; + if (_PyOpcode_Caches[next_opcode]) { + _PyBinaryOpCache *cache = (_PyBinaryOpCache *)(next_instr+1); + INCREMENT_ADAPTIVE_COUNTER(cache->counter); + } + assert(next_opcode > 0 && next_opcode < 256); + opcode = next_opcode; + DISPATCH_GOTO(); + } + + inst(INSTRUMENTED_JUMP_FORWARD, ( -- )) { + INSTRUMENTED_JUMP(next_instr-1, next_instr+oparg, PY_MONITORING_EVENT_JUMP); + } + + inst(INSTRUMENTED_JUMP_BACKWARD, ( -- )) { + INSTRUMENTED_JUMP(next_instr-1, next_instr-oparg, PY_MONITORING_EVENT_JUMP); + CHECK_EVAL_BREAKER(); + } + + inst(INSTRUMENTED_POP_JUMP_IF_TRUE, ( -- )) { + PyObject *cond = POP(); + int err = PyObject_IsTrue(cond); + Py_DECREF(cond); + ERROR_IF(err < 0, error); + _Py_CODEUNIT *here = next_instr-1; + assert(err == 0 || err == 1); + int offset = err*oparg; + INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); + } + + inst(INSTRUMENTED_POP_JUMP_IF_FALSE, ( -- )) { + PyObject *cond = POP(); + int err = PyObject_IsTrue(cond); + Py_DECREF(cond); + ERROR_IF(err < 0, error); + _Py_CODEUNIT *here = next_instr-1; + assert(err == 0 || err == 1); + int offset = (1-err)*oparg; + INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); + } + + inst(INSTRUMENTED_POP_JUMP_IF_NONE, ( -- )) { + PyObject *value = POP(); + _Py_CODEUNIT *here = next_instr-1; + int offset; + if (Py_IsNone(value)) { + _Py_DECREF_NO_DEALLOC(value); + offset = oparg; + } + else { + Py_DECREF(value); + offset = 0; + } + INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); + } + + inst(INSTRUMENTED_POP_JUMP_IF_NOT_NONE, ( -- )) { + PyObject *value = POP(); + _Py_CODEUNIT *here = next_instr-1; + int offset; + if (Py_IsNone(value)) { + _Py_DECREF_NO_DEALLOC(value); + offset = 0; + } + else { + Py_DECREF(value); + offset = oparg; + } + INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); + } + + inst(EXTENDED_ARG, ( -- )) { assert(oparg); - assert(cframe.use_tracing == 0); opcode = next_instr->op.code; oparg = oparg << 8 | next_instr->op.arg; PRE_DISPATCH_GOTO(); @@ -3049,6 +3295,12 @@ dummy_func( } inst(CACHE, (--)) { + assert(0 && "Executing a cache."); + Py_UNREACHABLE(); + } + + inst(RESERVED, (--)) { + assert(0 && "Executing RESERVED instruction."); Py_UNREACHABLE(); } diff --git a/Python/ceval.c b/Python/ceval.c index 7d60cf987e9c47..a38c9ec9ad5f9c 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -10,6 +10,7 @@ #include "pycore_function.h" #include "pycore_intrinsics.h" #include "pycore_long.h" // _PyLong_GetZero() +#include "pycore_instruments.h" #include "pycore_object.h" // _PyObject_GC_TRACK() #include "pycore_moduleobject.h" // PyModuleObject #include "pycore_opcode.h" // EXTRA_CASES @@ -92,13 +93,6 @@ #define _Py_atomic_load_relaxed_int32(ATOMIC_VAL) _Py_atomic_load_relaxed(ATOMIC_VAL) #endif -/* Forward declarations */ -static PyObject *trace_call_function( - PyThreadState *tstate, PyObject *callable, PyObject **stack, - Py_ssize_t oparg, PyObject *kwnames); -static PyObject * do_call_core( - PyThreadState *tstate, PyObject *func, - PyObject *callargs, PyObject *kwdict, int use_tracing); #ifdef LLTRACE static void @@ -179,19 +173,22 @@ lltrace_resume_frame(_PyInterpreterFrame *frame) PyErr_SetRaisedException(exc); } #endif -static int call_trace(Py_tracefunc, PyObject *, - PyThreadState *, _PyInterpreterFrame *, - int, PyObject *); -static int call_trace_protected(Py_tracefunc, PyObject *, - PyThreadState *, _PyInterpreterFrame *, - int, PyObject *); -static void call_exc_trace(Py_tracefunc, PyObject *, - PyThreadState *, _PyInterpreterFrame *); -static int maybe_call_line_trace(Py_tracefunc, PyObject *, - PyThreadState *, _PyInterpreterFrame *, int); -static void maybe_dtrace_line(_PyInterpreterFrame *, PyTraceInfo *, int); -static void dtrace_function_entry(_PyInterpreterFrame *); -static void dtrace_function_return(_PyInterpreterFrame *); + +static void monitor_raise(PyThreadState *tstate, + _PyInterpreterFrame *frame, + _Py_CODEUNIT *instr); +static int monitor_stop_iteration(PyThreadState *tstate, + _PyInterpreterFrame *frame, + _Py_CODEUNIT *instr); +static void monitor_unwind(PyThreadState *tstate, + _PyInterpreterFrame *frame, + _Py_CODEUNIT *instr); +static void monitor_handled(PyThreadState *tstate, + _PyInterpreterFrame *frame, + _Py_CODEUNIT *instr, PyObject *exc); +static void monitor_throw(PyThreadState *tstate, + _PyInterpreterFrame *frame, + _Py_CODEUNIT *instr); static PyObject * import_name(PyThreadState *, _PyInterpreterFrame *, PyObject *, PyObject *, PyObject *); @@ -217,21 +214,6 @@ _PyEvalFrameClearAndPop(PyThreadState *tstate, _PyInterpreterFrame *frame); "cannot access free variable '%s' where it is not associated with a" \ " value in enclosing scope" -#ifndef NDEBUG -/* Ensure that tstate is valid: sanity check for PyEval_AcquireThread() and - PyEval_RestoreThread(). Detect if tstate memory was freed. It can happen - when a thread continues to run after Python finalization, especially - daemon threads. */ -static int -is_tstate_valid(PyThreadState *tstate) -{ - assert(!_PyMem_IsPtrFreed(tstate)); - assert(!_PyMem_IsPtrFreed(tstate->interp)); - return 1; -} -#endif - - #ifdef HAVE_ERRNO_H #include #endif @@ -596,63 +578,6 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) #include "ceval_macros.h" -static int -trace_function_entry(PyThreadState *tstate, _PyInterpreterFrame *frame) -{ - if (tstate->c_tracefunc != NULL) { - /* tstate->c_tracefunc, if defined, is a - function that will be called on *every* entry - to a code block. Its return value, if not - None, is a function that will be called at - the start of each executed line of code. - (Actually, the function must return itself - in order to continue tracing.) The trace - functions are called with three arguments: - a pointer to the current frame, a string - indicating why the function is called, and - an argument which depends on the situation. - The global trace function is also called - whenever an exception is detected. */ - if (call_trace_protected(tstate->c_tracefunc, - tstate->c_traceobj, - tstate, frame, - PyTrace_CALL, Py_None)) { - /* Trace function raised an error */ - return -1; - } - } - if (tstate->c_profilefunc != NULL) { - /* Similar for c_profilefunc, except it needn't - return itself and isn't called for "line" events */ - if (call_trace_protected(tstate->c_profilefunc, - tstate->c_profileobj, - tstate, frame, - PyTrace_CALL, Py_None)) { - /* Profile function raised an error */ - return -1; - } - } - return 0; -} - -static int -trace_function_exit(PyThreadState *tstate, _PyInterpreterFrame *frame, PyObject *retval) -{ - if (tstate->c_tracefunc) { - if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj, - tstate, frame, PyTrace_RETURN, retval)) { - return -1; - } - } - if (tstate->c_profilefunc) { - if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj, - tstate, frame, PyTrace_RETURN, retval)) { - return -1; - } - } - return 0; -} - int _Py_CheckRecursiveCallPy( PyThreadState *tstate) @@ -730,7 +655,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int * strict stack discipline must be maintained. */ _PyCFrame *prev_cframe = tstate->cframe; - cframe.use_tracing = prev_cframe->use_tracing; cframe.previous = prev_cframe; tstate->cframe = &cframe; @@ -765,8 +689,11 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int if (_Py_EnterRecursivePy(tstate)) { goto exit_unwind; } - TRACE_FUNCTION_THROW_ENTRY(); - DTRACE_FUNCTION_ENTRY(); + /* Because this avoids the RESUME, + * we need to update instrumentation */ + _Py_Instrument(frame->f_code, tstate->interp); + monitor_throw(tstate, frame, frame->prev_instr); + /* TO DO -- Monitor throw entry. */ goto resume_with_error; } @@ -781,15 +708,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int assert(_PyInterpreterFrame_LASTI(frame) >= -1); \ /* Jump back to the last instruction executed... */ \ next_instr = frame->prev_instr + 1; \ - stack_pointer = _PyFrame_GetStackPointer(frame); \ - /* Set stackdepth to -1. \ - Update when returning or calling trace function. \ - Having stackdepth <= 0 ensures that invalid \ - values are not visible to the cycle GC. \ - We choose -1 rather than 0 to assist debugging. \ - */ \ - frame->stacktop = -1; - + stack_pointer = _PyFrame_GetStackPointer(frame); start_frame: if (_Py_EnterRecursivePy(tstate)) { @@ -845,91 +764,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int #include "generated_cases.c.h" -#if USE_COMPUTED_GOTOS - TARGET_DO_TRACING: -#else - case DO_TRACING: -#endif - { - assert(cframe.use_tracing); - assert(tstate->tracing == 0); - if (INSTR_OFFSET() >= frame->f_code->_co_firsttraceable) { - int instr_prev = _PyInterpreterFrame_LASTI(frame); - frame->prev_instr = next_instr; - NEXTOPARG(); - // No _PyOpcode_Deopt here, since RESUME has no optimized forms: - if (opcode == RESUME) { - if (oparg < 2) { - CHECK_EVAL_BREAKER(); - } - /* Call tracing */ - TRACE_FUNCTION_ENTRY(); - DTRACE_FUNCTION_ENTRY(); - } - else { - /* line-by-line tracing support */ - if (PyDTrace_LINE_ENABLED()) { - maybe_dtrace_line(frame, &tstate->trace_info, instr_prev); - } - - 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); - // Reload possibly changed frame fields: - stack_pointer = _PyFrame_GetStackPointer(frame); - frame->stacktop = -1; - // next_instr is only reloaded if tracing *does not* raise. - // This is consistent with the behavior of older Python - // versions. If a trace function sets a new f_lineno and - // *then* raises, we use the *old* location when searching - // for an exception handler, displaying the traceback, and - // so on: - if (err) { - // next_instr wasn't incremented at the start of this - // instruction. Increment it before handling the error, - // so that it looks the same as a "normal" instruction: - next_instr++; - goto error; - } - // Reload next_instr. Don't increment it, though, since - // we're going to re-dispatch to the "true" instruction now: - next_instr = frame->prev_instr; - } - } - } - NEXTOPARG(); - PRE_DISPATCH_GOTO(); - // No _PyOpcode_Deopt here, since EXTENDED_ARG has no optimized forms: - while (opcode == EXTENDED_ARG) { - // CPython hasn't ever traced the instruction after an EXTENDED_ARG. - // Inline the EXTENDED_ARG here, so we can avoid branching there: - INSTRUCTION_START(EXTENDED_ARG); - opcode = next_instr->op.code; - oparg = oparg << 8 | next_instr->op.arg; - // Make sure the next instruction isn't a RESUME, since that needs - // to trace properly (and shouldn't have an EXTENDED_ARG, anyways): - assert(opcode != RESUME); - PRE_DISPATCH_GOTO(); - } - opcode = _PyOpcode_Deopt[opcode]; - if (_PyOpcode_Caches[opcode]) { - uint16_t *counter = &next_instr[1].cache; - // The instruction is going to decrement the counter, so we need to - // increment it here to make sure it doesn't try to specialize: - if (!ADAPTIVE_COUNTER_IS_MAX(*counter)) { - INCREMENT_ADAPTIVE_COUNTER(*counter); - } - } - DISPATCH_GOTO(); - } - #if USE_COMPUTED_GOTOS _unknown_opcode: #else @@ -988,12 +822,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int PyTraceBack_Here(f); } } - - if (tstate->c_tracefunc != NULL) { - /* Make sure state is set to FRAME_UNWINDING for tracing */ - call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, - tstate, frame); - } + monitor_raise(tstate, frame, next_instr-1); exception_unwind: { @@ -1012,8 +841,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int } assert(STACK_LEVEL() == 0); _PyFrame_SetStackPointer(frame, stack_pointer); - TRACE_FUNCTION_UNWIND(); - DTRACE_FUNCTION_EXIT(); + monitor_unwind(tstate, frame, next_instr-1); goto exit_unwind; } @@ -1036,8 +864,10 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int available to the handler, so a program can emulate the Python main loop. */ - PUSH(_PyErr_GetRaisedException(tstate)); + PyObject *exc = _PyErr_GetRaisedException(tstate); + PUSH(exc); JUMPTO(handler); + monitor_handled(tstate, frame, next_instr, exc); /* Resume normal execution */ DISPATCH(); } @@ -1054,7 +884,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int if (frame == &entry_frame) { /* Restore previous cframe and exit */ tstate->cframe = cframe.previous; - tstate->cframe->use_tracing = cframe.use_tracing; assert(tstate->cframe->current_frame == frame->previous); _Py_LeaveRecursiveCallTstate(tstate); return NULL; @@ -2020,105 +1849,108 @@ unpack_iterable(PyThreadState *tstate, PyObject *v, return 0; } -static void -call_exc_trace(Py_tracefunc func, PyObject *self, - PyThreadState *tstate, - _PyInterpreterFrame *f) +static int +do_monitor_exc(PyThreadState *tstate, _PyInterpreterFrame *frame, + _Py_CODEUNIT *instr, int event) { - PyObject *exc = _PyErr_GetRaisedException(tstate); - assert(exc && PyExceptionInstance_Check(exc)); - PyObject *type = PyExceptionInstance_Class(exc); - PyObject *traceback = PyException_GetTraceback(exc); - if (traceback == NULL) { - traceback = Py_NewRef(Py_None); + assert(event < PY_MONITORING_UNGROUPED_EVENTS); + PyObject *exc = PyErr_GetRaisedException(); + assert(exc != NULL); + int err = _Py_call_instrumentation_arg(tstate, event, frame, instr, exc); + if (err == 0) { + PyErr_SetRaisedException(exc); } - PyObject *arg = PyTuple_Pack(3, type, exc, traceback); - Py_XDECREF(traceback); - - if (arg == NULL) { - _PyErr_SetRaisedException(tstate, exc); - return; + else { + Py_DECREF(exc); } - int err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg); - Py_DECREF(arg); - if (err == 0) { - _PyErr_SetRaisedException(tstate, exc); + return err; +} + +static inline int +no_tools_for_event(PyThreadState *tstate, _PyInterpreterFrame *frame, int event) +{ + _PyCoMonitoringData *data = frame->f_code->_co_monitoring; + if (data) { + if (data->active_monitors.tools[event] == 0) { + return 1; + } } else { - Py_XDECREF(exc); + if (tstate->interp->monitors.tools[event] == 0) { + return 1; + } + } + return 0; +} + +static void +monitor_raise(PyThreadState *tstate, _PyInterpreterFrame *frame, + _Py_CODEUNIT *instr) +{ + if (no_tools_for_event(tstate, frame, PY_MONITORING_EVENT_RAISE)) { + return; } + do_monitor_exc(tstate, frame, instr, PY_MONITORING_EVENT_RAISE); } static int -call_trace_protected(Py_tracefunc func, PyObject *obj, - PyThreadState *tstate, _PyInterpreterFrame *frame, - int what, PyObject *arg) +monitor_stop_iteration(PyThreadState *tstate, _PyInterpreterFrame *frame, + _Py_CODEUNIT *instr) { - PyObject *exc = _PyErr_GetRaisedException(tstate); - int err = call_trace(func, obj, tstate, frame, what, arg); - if (err == 0) - { - _PyErr_SetRaisedException(tstate, exc); + if (no_tools_for_event(tstate, frame, PY_MONITORING_EVENT_STOP_ITERATION)) { return 0; } - else { - Py_XDECREF(exc); - return -1; + return do_monitor_exc(tstate, frame, instr, PY_MONITORING_EVENT_STOP_ITERATION); +} + +static void +monitor_unwind(PyThreadState *tstate, + _PyInterpreterFrame *frame, + _Py_CODEUNIT *instr) +{ + if (no_tools_for_event(tstate, frame, PY_MONITORING_EVENT_PY_UNWIND)) { + return; } + _Py_call_instrumentation_exc0(tstate, PY_MONITORING_EVENT_PY_UNWIND, frame, instr); } + static void -initialize_trace_info(PyTraceInfo *trace_info, _PyInterpreterFrame *frame) +monitor_handled(PyThreadState *tstate, + _PyInterpreterFrame *frame, + _Py_CODEUNIT *instr, PyObject *exc) { - PyCodeObject *code = frame->f_code; - if (trace_info->code != code) { - trace_info->code = code; - _PyCode_InitAddressRange(code, &trace_info->bounds); + if (no_tools_for_event(tstate, frame, PY_MONITORING_EVENT_EXCEPTION_HANDLED)) { + return; } + _Py_call_instrumentation_arg(tstate, PY_MONITORING_EVENT_EXCEPTION_HANDLED, frame, instr, exc); +} + +static void +monitor_throw(PyThreadState *tstate, + _PyInterpreterFrame *frame, + _Py_CODEUNIT *instr) +{ + if (no_tools_for_event(tstate, frame, PY_MONITORING_EVENT_PY_THROW)) { + return; + } + _Py_call_instrumentation_exc0(tstate, PY_MONITORING_EVENT_PY_THROW, frame, instr); } void PyThreadState_EnterTracing(PyThreadState *tstate) { + assert(tstate->tracing >= 0); tstate->tracing++; - tstate->cframe->use_tracing = 0; } void PyThreadState_LeaveTracing(PyThreadState *tstate) { - assert(tstate->tracing > 0 && tstate->cframe->use_tracing == 0); + assert(tstate->tracing > 0); tstate->tracing--; - _PyThreadState_UpdateTracingState(tstate); } -static int -call_trace(Py_tracefunc func, PyObject *obj, - PyThreadState *tstate, _PyInterpreterFrame *frame, - int what, PyObject *arg) -{ - int result; - if (tstate->tracing) { - return 0; - } - PyFrameObject *f = _PyFrame_GetFrameObject(frame); - if (f == NULL) { - return -1; - } - int old_what = tstate->tracing_what; - tstate->tracing_what = what; - PyThreadState_EnterTracing(tstate); - assert(_PyInterpreterFrame_LASTI(frame) >= 0); - if (_PyCode_InitLineArray(frame->f_code)) { - return -1; - } - f->f_lineno = _PyCode_LineNumberFromArray(frame->f_code, _PyInterpreterFrame_LASTI(frame)); - result = func(obj, f, what, arg); - f->f_lineno = 0; - PyThreadState_LeaveTracing(tstate); - tstate->tracing_what = old_what; - return result; -} PyObject* _PyEval_CallTracing(PyObject *func, PyObject *args) @@ -2126,7 +1958,6 @@ _PyEval_CallTracing(PyObject *func, PyObject *args) // Save and disable tracing PyThreadState *tstate = _PyThreadState_GET(); int save_tracing = tstate->tracing; - int save_use_tracing = tstate->cframe->use_tracing; tstate->tracing = 0; // Call the tracing function @@ -2134,81 +1965,9 @@ _PyEval_CallTracing(PyObject *func, PyObject *args) // Restore tracing tstate->tracing = save_tracing; - tstate->cframe->use_tracing = save_use_tracing; return result; } -/* See Objects/lnotab_notes.txt for a description of how tracing works. */ -static int -maybe_call_line_trace(Py_tracefunc func, PyObject *obj, - PyThreadState *tstate, _PyInterpreterFrame *frame, int instr_prev) -{ - int result = 0; - - /* If the last instruction falls at the start of a line or if it - represents a jump backwards, update the frame's line number and - then call the trace function if we're tracing source lines. - */ - if (_PyCode_InitLineArray(frame->f_code)) { - return -1; - } - int lastline; - if (instr_prev <= frame->f_code->_co_firsttraceable) { - lastline = -1; - } - else { - lastline = _PyCode_LineNumberFromArray(frame->f_code, instr_prev); - } - int line = _PyCode_LineNumberFromArray(frame->f_code, _PyInterpreterFrame_LASTI(frame)); - PyFrameObject *f = _PyFrame_GetFrameObject(frame); - if (f == NULL) { - return -1; - } - if (line != -1 && f->f_trace_lines) { - /* Trace backward edges (except in 'yield from') or if line number has changed */ - int trace = line != lastline || - (_PyInterpreterFrame_LASTI(frame) < instr_prev && - // SEND has no quickened forms, so no need to use _PyOpcode_Deopt - // here: - frame->prev_instr->op.code != SEND); - if (trace) { - result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None); - } - } - /* Always emit an opcode event if we're tracing all opcodes. */ - if (f->f_trace_opcodes && result == 0) { - result = call_trace(func, obj, tstate, frame, PyTrace_OPCODE, Py_None); - } - return result; -} - -int -_PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) -{ - assert(is_tstate_valid(tstate)); - /* The caller must hold the GIL */ - assert(PyGILState_Check()); - - /* Call _PySys_Audit() in the context of the current thread state, - even if tstate is not the current thread state. */ - PyThreadState *current_tstate = _PyThreadState_GET(); - if (_PySys_Audit(current_tstate, "sys.setprofile", NULL) < 0) { - return -1; - } - - tstate->c_profilefunc = func; - PyObject *old_profileobj = tstate->c_profileobj; - tstate->c_profileobj = Py_XNewRef(arg); - /* Flag that tracing or profiling is turned on */ - _PyThreadState_UpdateTracingState(tstate); - - // gh-98257: Only call Py_XDECREF() once the new profile function is fully - // set, so it's safe to call sys.setprofile() again (reentrant call). - Py_XDECREF(old_profileobj); - - return 0; -} - void PyEval_SetProfile(Py_tracefunc func, PyObject *arg) { @@ -2240,33 +1999,6 @@ PyEval_SetProfileAllThreads(Py_tracefunc func, PyObject *arg) } } -int -_PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) -{ - assert(is_tstate_valid(tstate)); - /* The caller must hold the GIL */ - assert(PyGILState_Check()); - - /* Call _PySys_Audit() in the context of the current thread state, - even if tstate is not the current thread state. */ - PyThreadState *current_tstate = _PyThreadState_GET(); - if (_PySys_Audit(current_tstate, "sys.settrace", NULL) < 0) { - return -1; - } - - tstate->c_tracefunc = func; - PyObject *old_traceobj = tstate->c_traceobj; - tstate->c_traceobj = Py_XNewRef(arg); - /* Flag that tracing or profiling is turned on */ - _PyThreadState_UpdateTracingState(tstate); - - // gh-98257: Only call Py_XDECREF() once the new trace function is fully - // set, so it's safe to call sys.settrace() again (reentrant call). - Py_XDECREF(old_traceobj); - - return 0; -} - void PyEval_SetTrace(Py_tracefunc func, PyObject *arg) { @@ -2492,114 +2224,6 @@ PyEval_GetFuncDesc(PyObject *func) return " object"; } -#define C_TRACE(x, call) \ -if (use_tracing && tstate->c_profilefunc) { \ - if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \ - tstate, tstate->cframe->current_frame, \ - PyTrace_C_CALL, func)) { \ - x = NULL; \ - } \ - else { \ - x = call; \ - if (tstate->c_profilefunc != NULL) { \ - if (x == NULL) { \ - call_trace_protected(tstate->c_profilefunc, \ - tstate->c_profileobj, \ - tstate, tstate->cframe->current_frame, \ - PyTrace_C_EXCEPTION, func); \ - /* XXX should pass (type, value, tb) */ \ - } else { \ - if (call_trace(tstate->c_profilefunc, \ - tstate->c_profileobj, \ - tstate, tstate->cframe->current_frame, \ - PyTrace_C_RETURN, func)) { \ - Py_DECREF(x); \ - x = NULL; \ - } \ - } \ - } \ - } \ -} else { \ - x = call; \ - } - - -static PyObject * -trace_call_function(PyThreadState *tstate, - PyObject *func, - PyObject **args, Py_ssize_t nargs, - PyObject *kwnames) -{ - int use_tracing = 1; - PyObject *x; - if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) { - C_TRACE(x, PyObject_Vectorcall(func, args, nargs, kwnames)); - return x; - } - else if (Py_IS_TYPE(func, &PyMethodDescr_Type) && nargs > 0) { - /* We need to create a temporary bound method as argument - for profiling. - - If nargs == 0, then this cannot work because we have no - "self". In any case, the call itself would raise - TypeError (foo needs an argument), so we just skip - profiling. */ - PyObject *self = args[0]; - func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self)); - if (func == NULL) { - return NULL; - } - C_TRACE(x, PyObject_Vectorcall(func, - args+1, nargs-1, - kwnames)); - Py_DECREF(func); - return x; - } - return PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); -} - -static PyObject * -do_call_core(PyThreadState *tstate, - PyObject *func, - PyObject *callargs, - PyObject *kwdict, - int use_tracing - ) -{ - PyObject *result; - if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) { - C_TRACE(result, PyObject_Call(func, callargs, kwdict)); - return result; - } - else if (Py_IS_TYPE(func, &PyMethodDescr_Type)) { - Py_ssize_t nargs = PyTuple_GET_SIZE(callargs); - if (nargs > 0 && use_tracing) { - /* We need to create a temporary bound method as argument - for profiling. - - If nargs == 0, then this cannot work because we have no - "self". In any case, the call itself would raise - TypeError (foo needs an argument), so we just skip - profiling. */ - PyObject *self = PyTuple_GET_ITEM(callargs, 0); - func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self)); - if (func == NULL) { - return NULL; - } - - C_TRACE(result, _PyObject_FastCallDictTstate( - tstate, func, - &_PyTuple_ITEMS(callargs)[1], - nargs - 1, - kwdict)); - Py_DECREF(func); - return result; - } - } - EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_FUNCTION_EX, func); - return PyObject_Call(func, callargs, kwdict); -} - /* Extract a slice index from a PyLong or an object with the nb_index slot defined, and store in *pi. Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX, @@ -2973,69 +2597,6 @@ PyUnstable_Eval_RequestCodeExtraIndex(freefunc free) return new_index; } -static void -dtrace_function_entry(_PyInterpreterFrame *frame) -{ - const char *filename; - const char *funcname; - int lineno; - - PyCodeObject *code = frame->f_code; - filename = PyUnicode_AsUTF8(code->co_filename); - funcname = PyUnicode_AsUTF8(code->co_name); - lineno = _PyInterpreterFrame_GetLine(frame); - - PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno); -} - -static void -dtrace_function_return(_PyInterpreterFrame *frame) -{ - const char *filename; - const char *funcname; - int lineno; - - PyCodeObject *code = frame->f_code; - filename = PyUnicode_AsUTF8(code->co_filename); - funcname = PyUnicode_AsUTF8(code->co_name); - lineno = _PyInterpreterFrame_GetLine(frame); - - PyDTrace_FUNCTION_RETURN(filename, funcname, lineno); -} - -/* DTrace equivalent of maybe_call_line_trace. */ -static void -maybe_dtrace_line(_PyInterpreterFrame *frame, - PyTraceInfo *trace_info, - int instr_prev) -{ - const char *co_filename, *co_name; - - /* If the last instruction executed isn't in the current - instruction window, reset the window. - */ - initialize_trace_info(trace_info, frame); - int lastline = _PyCode_CheckLineNumber(instr_prev*sizeof(_Py_CODEUNIT), &trace_info->bounds); - int addr = _PyInterpreterFrame_LASTI(frame) * sizeof(_Py_CODEUNIT); - int line = _PyCode_CheckLineNumber(addr, &trace_info->bounds); - if (line != -1) { - /* Trace backward edges or first instruction of a new line */ - if (_PyInterpreterFrame_LASTI(frame) < instr_prev || - (line != lastline && addr == trace_info->bounds.ar_start)) - { - co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename); - if (!co_filename) { - co_filename = "?"; - } - co_name = PyUnicode_AsUTF8(frame->f_code->co_name); - if (!co_name) { - co_name = "?"; - } - PyDTrace_LINE(co_filename, co_name, line); - } - } -} - /* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions for the limited API. */ diff --git a/Python/ceval_macros.h b/Python/ceval_macros.h index c2257515a30599..485771ac65a767 100644 --- a/Python/ceval_macros.h +++ b/Python/ceval_macros.h @@ -93,8 +93,6 @@ { \ NEXTOPARG(); \ PRE_DISPATCH_GOTO(); \ - assert(cframe.use_tracing == 0 || cframe.use_tracing == 255); \ - opcode |= cframe.use_tracing OR_DTRACE_LINE; \ DISPATCH_GOTO(); \ } @@ -102,7 +100,6 @@ { \ opcode = next_instr->op.code; \ PRE_DISPATCH_GOTO(); \ - opcode |= cframe.use_tracing OR_DTRACE_LINE; \ DISPATCH_GOTO(); \ } @@ -183,7 +180,7 @@ GETITEM(PyObject *v, Py_ssize_t i) { #define PREDICT(next_op) \ do { \ _Py_CODEUNIT word = *next_instr; \ - opcode = word.op.code | cframe.use_tracing OR_DTRACE_LINE; \ + opcode = word.op.code; \ if (opcode == next_op) { \ oparg = word.op.arg; \ INSTRUCTION_START(next_op); \ @@ -283,47 +280,6 @@ GETITEM(PyObject *v, Py_ssize_t i) { #define BUILTINS() frame->f_builtins #define LOCALS() frame->f_locals -/* Shared opcode macros */ - -#define TRACE_FUNCTION_EXIT() \ - if (cframe.use_tracing) { \ - if (trace_function_exit(tstate, frame, retval)) { \ - Py_DECREF(retval); \ - goto exit_unwind; \ - } \ - } - -#define DTRACE_FUNCTION_EXIT() \ - if (PyDTrace_FUNCTION_RETURN_ENABLED()) { \ - dtrace_function_return(frame); \ - } - -#define TRACE_FUNCTION_UNWIND() \ - if (cframe.use_tracing) { \ - /* Since we are already unwinding, \ - * we don't care if this raises */ \ - trace_function_exit(tstate, frame, NULL); \ - } - -#define TRACE_FUNCTION_ENTRY() \ - if (cframe.use_tracing) { \ - _PyFrame_SetStackPointer(frame, stack_pointer); \ - int err = trace_function_entry(tstate, frame); \ - stack_pointer = _PyFrame_GetStackPointer(frame); \ - frame->stacktop = -1; \ - if (err) { \ - goto error; \ - } \ - } - -#define TRACE_FUNCTION_THROW_ENTRY() \ - if (cframe.use_tracing) { \ - assert(frame->stacktop >= 0); \ - if (trace_function_entry(tstate, frame)) { \ - goto exit_unwind; \ - } \ - } - #define DTRACE_FUNCTION_ENTRY() \ if (PyDTrace_FUNCTION_ENTRY_ENABLED()) { \ dtrace_function_entry(frame); \ @@ -371,3 +327,18 @@ do { \ _Py_DECREF_NO_DEALLOC(right); \ } \ } while (0) + +// If a trace function sets a new f_lineno and +// *then* raises, we use the destination when searching +// for an exception handler, displaying the traceback, and so on +#define INSTRUMENTED_JUMP(src, dest, event) \ +do { \ + _PyFrame_SetStackPointer(frame, stack_pointer); \ + int err = _Py_call_instrumentation_jump(tstate, event, frame, src, dest); \ + stack_pointer = _PyFrame_GetStackPointer(frame); \ + if (err) { \ + next_instr = (dest)+1; \ + goto error; \ + } \ + next_instr = frame->prev_instr; \ +} while (0); diff --git a/Python/clinic/instrumentation.c.h b/Python/clinic/instrumentation.c.h new file mode 100644 index 00000000000000..cf3984ca24bbfe --- /dev/null +++ b/Python/clinic/instrumentation.c.h @@ -0,0 +1,311 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) +# include "pycore_gc.h" // PyGC_Head +# include "pycore_runtime.h" // _Py_ID() +#endif + + +PyDoc_STRVAR(monitoring_use_tool_id__doc__, +"use_tool_id($module, tool_id, name, /)\n" +"--\n" +"\n"); + +#define MONITORING_USE_TOOL_ID_METHODDEF \ + {"use_tool_id", _PyCFunction_CAST(monitoring_use_tool_id), METH_FASTCALL, monitoring_use_tool_id__doc__}, + +static PyObject * +monitoring_use_tool_id_impl(PyObject *module, int tool_id, PyObject *name); + +static PyObject * +monitoring_use_tool_id(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + int tool_id; + PyObject *name; + + if (!_PyArg_CheckPositional("use_tool_id", nargs, 2, 2)) { + goto exit; + } + tool_id = _PyLong_AsInt(args[0]); + if (tool_id == -1 && PyErr_Occurred()) { + goto exit; + } + name = args[1]; + return_value = monitoring_use_tool_id_impl(module, tool_id, name); + +exit: + return return_value; +} + +PyDoc_STRVAR(monitoring_free_tool_id__doc__, +"free_tool_id($module, tool_id, /)\n" +"--\n" +"\n"); + +#define MONITORING_FREE_TOOL_ID_METHODDEF \ + {"free_tool_id", (PyCFunction)monitoring_free_tool_id, METH_O, monitoring_free_tool_id__doc__}, + +static PyObject * +monitoring_free_tool_id_impl(PyObject *module, int tool_id); + +static PyObject * +monitoring_free_tool_id(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + int tool_id; + + tool_id = _PyLong_AsInt(arg); + if (tool_id == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = monitoring_free_tool_id_impl(module, tool_id); + +exit: + return return_value; +} + +PyDoc_STRVAR(monitoring_get_tool__doc__, +"get_tool($module, tool_id, /)\n" +"--\n" +"\n"); + +#define MONITORING_GET_TOOL_METHODDEF \ + {"get_tool", (PyCFunction)monitoring_get_tool, METH_O, monitoring_get_tool__doc__}, + +static PyObject * +monitoring_get_tool_impl(PyObject *module, int tool_id); + +static PyObject * +monitoring_get_tool(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + int tool_id; + + tool_id = _PyLong_AsInt(arg); + if (tool_id == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = monitoring_get_tool_impl(module, tool_id); + +exit: + return return_value; +} + +PyDoc_STRVAR(monitoring_register_callback__doc__, +"register_callback($module, tool_id, event, func, /)\n" +"--\n" +"\n"); + +#define MONITORING_REGISTER_CALLBACK_METHODDEF \ + {"register_callback", _PyCFunction_CAST(monitoring_register_callback), METH_FASTCALL, monitoring_register_callback__doc__}, + +static PyObject * +monitoring_register_callback_impl(PyObject *module, int tool_id, int event, + PyObject *func); + +static PyObject * +monitoring_register_callback(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + int tool_id; + int event; + PyObject *func; + + if (!_PyArg_CheckPositional("register_callback", nargs, 3, 3)) { + goto exit; + } + tool_id = _PyLong_AsInt(args[0]); + if (tool_id == -1 && PyErr_Occurred()) { + goto exit; + } + event = _PyLong_AsInt(args[1]); + if (event == -1 && PyErr_Occurred()) { + goto exit; + } + func = args[2]; + return_value = monitoring_register_callback_impl(module, tool_id, event, func); + +exit: + return return_value; +} + +PyDoc_STRVAR(monitoring_get_events__doc__, +"get_events($module, tool_id, /)\n" +"--\n" +"\n"); + +#define MONITORING_GET_EVENTS_METHODDEF \ + {"get_events", (PyCFunction)monitoring_get_events, METH_O, monitoring_get_events__doc__}, + +static int +monitoring_get_events_impl(PyObject *module, int tool_id); + +static PyObject * +monitoring_get_events(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + int tool_id; + int _return_value; + + tool_id = _PyLong_AsInt(arg); + if (tool_id == -1 && PyErr_Occurred()) { + goto exit; + } + _return_value = monitoring_get_events_impl(module, tool_id); + if ((_return_value == -1) && PyErr_Occurred()) { + goto exit; + } + return_value = PyLong_FromLong((long)_return_value); + +exit: + return return_value; +} + +PyDoc_STRVAR(monitoring_set_events__doc__, +"set_events($module, tool_id, event_set, /)\n" +"--\n" +"\n"); + +#define MONITORING_SET_EVENTS_METHODDEF \ + {"set_events", _PyCFunction_CAST(monitoring_set_events), METH_FASTCALL, monitoring_set_events__doc__}, + +static PyObject * +monitoring_set_events_impl(PyObject *module, int tool_id, int event_set); + +static PyObject * +monitoring_set_events(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + int tool_id; + int event_set; + + if (!_PyArg_CheckPositional("set_events", nargs, 2, 2)) { + goto exit; + } + tool_id = _PyLong_AsInt(args[0]); + if (tool_id == -1 && PyErr_Occurred()) { + goto exit; + } + event_set = _PyLong_AsInt(args[1]); + if (event_set == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = monitoring_set_events_impl(module, tool_id, event_set); + +exit: + return return_value; +} + +PyDoc_STRVAR(monitoring_get_local_events__doc__, +"get_local_events($module, tool_id, code, /)\n" +"--\n" +"\n"); + +#define MONITORING_GET_LOCAL_EVENTS_METHODDEF \ + {"get_local_events", _PyCFunction_CAST(monitoring_get_local_events), METH_FASTCALL, monitoring_get_local_events__doc__}, + +static int +monitoring_get_local_events_impl(PyObject *module, int tool_id, + PyObject *code); + +static PyObject * +monitoring_get_local_events(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + int tool_id; + PyObject *code; + int _return_value; + + if (!_PyArg_CheckPositional("get_local_events", nargs, 2, 2)) { + goto exit; + } + tool_id = _PyLong_AsInt(args[0]); + if (tool_id == -1 && PyErr_Occurred()) { + goto exit; + } + code = args[1]; + _return_value = monitoring_get_local_events_impl(module, tool_id, code); + if ((_return_value == -1) && PyErr_Occurred()) { + goto exit; + } + return_value = PyLong_FromLong((long)_return_value); + +exit: + return return_value; +} + +PyDoc_STRVAR(monitoring_set_local_events__doc__, +"set_local_events($module, tool_id, code, event_set, /)\n" +"--\n" +"\n"); + +#define MONITORING_SET_LOCAL_EVENTS_METHODDEF \ + {"set_local_events", _PyCFunction_CAST(monitoring_set_local_events), METH_FASTCALL, monitoring_set_local_events__doc__}, + +static PyObject * +monitoring_set_local_events_impl(PyObject *module, int tool_id, + PyObject *code, int event_set); + +static PyObject * +monitoring_set_local_events(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + int tool_id; + PyObject *code; + int event_set; + + if (!_PyArg_CheckPositional("set_local_events", nargs, 3, 3)) { + goto exit; + } + tool_id = _PyLong_AsInt(args[0]); + if (tool_id == -1 && PyErr_Occurred()) { + goto exit; + } + code = args[1]; + event_set = _PyLong_AsInt(args[2]); + if (event_set == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = monitoring_set_local_events_impl(module, tool_id, code, event_set); + +exit: + return return_value; +} + +PyDoc_STRVAR(monitoring_restart_events__doc__, +"restart_events($module, /)\n" +"--\n" +"\n"); + +#define MONITORING_RESTART_EVENTS_METHODDEF \ + {"restart_events", (PyCFunction)monitoring_restart_events, METH_NOARGS, monitoring_restart_events__doc__}, + +static PyObject * +monitoring_restart_events_impl(PyObject *module); + +static PyObject * +monitoring_restart_events(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + return monitoring_restart_events_impl(module); +} + +PyDoc_STRVAR(monitoring__all_events__doc__, +"_all_events($module, /)\n" +"--\n" +"\n"); + +#define MONITORING__ALL_EVENTS_METHODDEF \ + {"_all_events", (PyCFunction)monitoring__all_events, METH_NOARGS, monitoring__all_events__doc__}, + +static PyObject * +monitoring__all_events_impl(PyObject *module); + +static PyObject * +monitoring__all_events(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + return monitoring__all_events_impl(module); +} +/*[clinic end generated code: output=11cc0803875b3ffa input=a9049054013a1b77]*/ diff --git a/Python/compile.c b/Python/compile.c index 3e152060d2f1c2..d6882c31d6437e 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1427,8 +1427,7 @@ compiler_add_yield_from(struct compiler *c, location loc, int await) ADDOP(c, loc, CLEANUP_THROW); USE_LABEL(c, exit); - ADDOP_I(c, loc, SWAP, 2); - ADDOP(c, loc, POP_TOP); + ADDOP(c, loc, END_SEND); return SUCCESS; } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 420d136bb98158..4d52e95dc04a27 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -8,24 +8,61 @@ } TARGET(RESUME) { - #line 135 "Python/bytecodes.c" + #line 136 "Python/bytecodes.c" assert(tstate->cframe == &cframe); assert(frame == cframe.current_frame); - if (_Py_atomic_load_relaxed_int32(eval_breaker) && oparg < 2) { + /* Possibly combine this with eval breaker */ + if (frame->f_code->_co_instrumentation_version != tstate->interp->monitoring_version) { + int err = _Py_Instrument(frame->f_code, tstate->interp); + if (err) goto error; + next_instr--; + } + else if (_Py_atomic_load_relaxed_int32(eval_breaker) && oparg < 2) { goto handle_eval_breaker; } - #line 18 "Python/generated_cases.c.h" + #line 24 "Python/generated_cases.c.h" + DISPATCH(); + } + + TARGET(INSTRUMENTED_RESUME) { + #line 150 "Python/bytecodes.c" + /* Possible performance enhancement: + * We need to check the eval breaker anyway, can we + * combine the instrument verison check and the eval breaker test? + */ + if (frame->f_code->_co_instrumentation_version != tstate->interp->monitoring_version) { + if (_Py_Instrument(frame->f_code, tstate->interp)) { + goto error; + } + next_instr--; + } + else { + _PyFrame_SetStackPointer(frame, stack_pointer); + int err = _Py_call_instrumentation( + tstate, oparg > 0, frame, next_instr-1); + stack_pointer = _PyFrame_GetStackPointer(frame); + if (err) goto error; + if (frame->prev_instr != next_instr-1) { + /* Instrumentation has jumped */ + next_instr = frame->prev_instr; + DISPATCH(); + } + if (_Py_atomic_load_relaxed_int32(eval_breaker) && oparg < 2) { + goto handle_eval_breaker; + } + } + #line 55 "Python/generated_cases.c.h" DISPATCH(); } TARGET(LOAD_CLOSURE) { PyObject *value; - #line 143 "Python/bytecodes.c" + #line 178 "Python/bytecodes.c" /* We keep LOAD_CLOSURE so that the bytecode stays more readable. */ value = GETLOCAL(oparg); if (value == NULL) goto unbound_local_error; Py_INCREF(value); - #line 29 "Python/generated_cases.c.h" + #line 66 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = value; DISPATCH(); @@ -33,11 +70,11 @@ TARGET(LOAD_FAST_CHECK) { PyObject *value; - #line 150 "Python/bytecodes.c" + #line 185 "Python/bytecodes.c" value = GETLOCAL(oparg); if (value == NULL) goto unbound_local_error; Py_INCREF(value); - #line 41 "Python/generated_cases.c.h" + #line 78 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = value; DISPATCH(); @@ -45,11 +82,11 @@ TARGET(LOAD_FAST) { PyObject *value; - #line 156 "Python/bytecodes.c" + #line 191 "Python/bytecodes.c" value = GETLOCAL(oparg); assert(value != NULL); Py_INCREF(value); - #line 53 "Python/generated_cases.c.h" + #line 90 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = value; DISPATCH(); @@ -58,10 +95,10 @@ TARGET(LOAD_CONST) { PREDICTED(LOAD_CONST); PyObject *value; - #line 162 "Python/bytecodes.c" + #line 197 "Python/bytecodes.c" value = GETITEM(frame->f_code->co_consts, oparg); Py_INCREF(value); - #line 65 "Python/generated_cases.c.h" + #line 102 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = value; DISPATCH(); @@ -69,9 +106,9 @@ TARGET(STORE_FAST) { PyObject *value = stack_pointer[-1]; - #line 167 "Python/bytecodes.c" + #line 202 "Python/bytecodes.c" SETLOCAL(oparg, value); - #line 75 "Python/generated_cases.c.h" + #line 112 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } @@ -81,21 +118,21 @@ PyObject *_tmp_2; { PyObject *value; - #line 156 "Python/bytecodes.c" + #line 191 "Python/bytecodes.c" value = GETLOCAL(oparg); assert(value != NULL); Py_INCREF(value); - #line 89 "Python/generated_cases.c.h" + #line 126 "Python/generated_cases.c.h" _tmp_2 = value; } oparg = (next_instr++)->op.arg; { PyObject *value; - #line 156 "Python/bytecodes.c" + #line 191 "Python/bytecodes.c" value = GETLOCAL(oparg); assert(value != NULL); Py_INCREF(value); - #line 99 "Python/generated_cases.c.h" + #line 136 "Python/generated_cases.c.h" _tmp_1 = value; } STACK_GROW(2); @@ -109,20 +146,20 @@ PyObject *_tmp_2; { PyObject *value; - #line 156 "Python/bytecodes.c" + #line 191 "Python/bytecodes.c" value = GETLOCAL(oparg); assert(value != NULL); Py_INCREF(value); - #line 117 "Python/generated_cases.c.h" + #line 154 "Python/generated_cases.c.h" _tmp_2 = value; } oparg = (next_instr++)->op.arg; { PyObject *value; - #line 162 "Python/bytecodes.c" + #line 197 "Python/bytecodes.c" value = GETITEM(frame->f_code->co_consts, oparg); Py_INCREF(value); - #line 126 "Python/generated_cases.c.h" + #line 163 "Python/generated_cases.c.h" _tmp_1 = value; } STACK_GROW(2); @@ -135,18 +172,18 @@ PyObject *_tmp_1 = stack_pointer[-1]; { PyObject *value = _tmp_1; - #line 167 "Python/bytecodes.c" + #line 202 "Python/bytecodes.c" SETLOCAL(oparg, value); - #line 141 "Python/generated_cases.c.h" + #line 178 "Python/generated_cases.c.h" } oparg = (next_instr++)->op.arg; { PyObject *value; - #line 156 "Python/bytecodes.c" + #line 191 "Python/bytecodes.c" value = GETLOCAL(oparg); assert(value != NULL); Py_INCREF(value); - #line 150 "Python/generated_cases.c.h" + #line 187 "Python/generated_cases.c.h" _tmp_1 = value; } stack_pointer[-1] = _tmp_1; @@ -158,16 +195,16 @@ PyObject *_tmp_2 = stack_pointer[-2]; { PyObject *value = _tmp_1; - #line 167 "Python/bytecodes.c" + #line 202 "Python/bytecodes.c" SETLOCAL(oparg, value); - #line 164 "Python/generated_cases.c.h" + #line 201 "Python/generated_cases.c.h" } oparg = (next_instr++)->op.arg; { PyObject *value = _tmp_2; - #line 167 "Python/bytecodes.c" + #line 202 "Python/bytecodes.c" SETLOCAL(oparg, value); - #line 171 "Python/generated_cases.c.h" + #line 208 "Python/generated_cases.c.h" } STACK_SHRINK(2); DISPATCH(); @@ -178,20 +215,20 @@ PyObject *_tmp_2; { PyObject *value; - #line 162 "Python/bytecodes.c" + #line 197 "Python/bytecodes.c" value = GETITEM(frame->f_code->co_consts, oparg); Py_INCREF(value); - #line 185 "Python/generated_cases.c.h" + #line 222 "Python/generated_cases.c.h" _tmp_2 = value; } oparg = (next_instr++)->op.arg; { PyObject *value; - #line 156 "Python/bytecodes.c" + #line 191 "Python/bytecodes.c" value = GETLOCAL(oparg); assert(value != NULL); Py_INCREF(value); - #line 195 "Python/generated_cases.c.h" + #line 232 "Python/generated_cases.c.h" _tmp_1 = value; } STACK_GROW(2); @@ -202,8 +239,8 @@ TARGET(POP_TOP) { PyObject *value = stack_pointer[-1]; - #line 177 "Python/bytecodes.c" - #line 207 "Python/generated_cases.c.h" + #line 212 "Python/bytecodes.c" + #line 244 "Python/generated_cases.c.h" Py_DECREF(value); STACK_SHRINK(1); DISPATCH(); @@ -211,9 +248,9 @@ TARGET(PUSH_NULL) { PyObject *res; - #line 181 "Python/bytecodes.c" + #line 216 "Python/bytecodes.c" res = NULL; - #line 217 "Python/generated_cases.c.h" + #line 254 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; DISPATCH(); @@ -224,30 +261,79 @@ PyObject *_tmp_2 = stack_pointer[-2]; { PyObject *value = _tmp_1; - #line 177 "Python/bytecodes.c" - #line 229 "Python/generated_cases.c.h" + #line 212 "Python/bytecodes.c" + #line 266 "Python/generated_cases.c.h" Py_DECREF(value); } { PyObject *value = _tmp_2; - #line 177 "Python/bytecodes.c" - #line 235 "Python/generated_cases.c.h" + #line 212 "Python/bytecodes.c" + #line 272 "Python/generated_cases.c.h" Py_DECREF(value); } STACK_SHRINK(2); DISPATCH(); } + TARGET(INSTRUMENTED_END_FOR) { + PyObject *value = stack_pointer[-1]; + PyObject *receiver = stack_pointer[-2]; + #line 222 "Python/bytecodes.c" + /* Need to create a fake StopIteration error here, + * to conform to PEP 380 */ + if (PyGen_Check(receiver)) { + PyErr_SetObject(PyExc_StopIteration, value); + if (monitor_stop_iteration(tstate, frame, next_instr-1)) { + goto error; + } + PyErr_SetRaisedException(NULL); + } + #line 292 "Python/generated_cases.c.h" + Py_DECREF(receiver); + Py_DECREF(value); + STACK_SHRINK(2); + DISPATCH(); + } + + TARGET(END_SEND) { + PyObject *value = stack_pointer[-1]; + PyObject *receiver = stack_pointer[-2]; + #line 235 "Python/bytecodes.c" + Py_DECREF(receiver); + #line 304 "Python/generated_cases.c.h" + STACK_SHRINK(1); + stack_pointer[-1] = value; + DISPATCH(); + } + + TARGET(INSTRUMENTED_END_SEND) { + PyObject *value = stack_pointer[-1]; + PyObject *receiver = stack_pointer[-2]; + #line 239 "Python/bytecodes.c" + if (PyGen_Check(receiver) || PyCoro_CheckExact(receiver)) { + PyErr_SetObject(PyExc_StopIteration, value); + if (monitor_stop_iteration(tstate, frame, next_instr-1)) { + goto error; + } + PyErr_SetRaisedException(NULL); + } + Py_DECREF(receiver); + #line 322 "Python/generated_cases.c.h" + STACK_SHRINK(1); + stack_pointer[-1] = value; + DISPATCH(); + } + TARGET(UNARY_NEGATIVE) { PyObject *value = stack_pointer[-1]; PyObject *res; - #line 187 "Python/bytecodes.c" + #line 250 "Python/bytecodes.c" res = PyNumber_Negative(value); - #line 247 "Python/generated_cases.c.h" + #line 333 "Python/generated_cases.c.h" Py_DECREF(value); - #line 189 "Python/bytecodes.c" + #line 252 "Python/bytecodes.c" if (res == NULL) goto pop_1_error; - #line 251 "Python/generated_cases.c.h" + #line 337 "Python/generated_cases.c.h" stack_pointer[-1] = res; DISPATCH(); } @@ -255,11 +341,11 @@ TARGET(UNARY_NOT) { PyObject *value = stack_pointer[-1]; PyObject *res; - #line 193 "Python/bytecodes.c" + #line 256 "Python/bytecodes.c" int err = PyObject_IsTrue(value); - #line 261 "Python/generated_cases.c.h" + #line 347 "Python/generated_cases.c.h" Py_DECREF(value); - #line 195 "Python/bytecodes.c" + #line 258 "Python/bytecodes.c" if (err < 0) goto pop_1_error; if (err == 0) { res = Py_True; @@ -268,7 +354,7 @@ res = Py_False; } Py_INCREF(res); - #line 272 "Python/generated_cases.c.h" + #line 358 "Python/generated_cases.c.h" stack_pointer[-1] = res; DISPATCH(); } @@ -276,13 +362,13 @@ TARGET(UNARY_INVERT) { PyObject *value = stack_pointer[-1]; PyObject *res; - #line 206 "Python/bytecodes.c" + #line 269 "Python/bytecodes.c" res = PyNumber_Invert(value); - #line 282 "Python/generated_cases.c.h" + #line 368 "Python/generated_cases.c.h" Py_DECREF(value); - #line 208 "Python/bytecodes.c" + #line 271 "Python/bytecodes.c" if (res == NULL) goto pop_1_error; - #line 286 "Python/generated_cases.c.h" + #line 372 "Python/generated_cases.c.h" stack_pointer[-1] = res; DISPATCH(); } @@ -291,8 +377,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *prod; - #line 225 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 288 "Python/bytecodes.c" DEOPT_IF(!PyLong_CheckExact(left), BINARY_OP); DEOPT_IF(!PyLong_CheckExact(right), BINARY_OP); STAT_INC(BINARY_OP, hit); @@ -300,7 +385,7 @@ _Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free); _Py_DECREF_SPECIALIZED(left, (destructor)PyObject_Free); if (prod == NULL) goto pop_2_error; - #line 304 "Python/generated_cases.c.h" + #line 389 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = prod; next_instr += 1; @@ -311,15 +396,14 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *prod; - #line 236 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 298 "Python/bytecodes.c" DEOPT_IF(!PyFloat_CheckExact(left), BINARY_OP); DEOPT_IF(!PyFloat_CheckExact(right), BINARY_OP); STAT_INC(BINARY_OP, hit); double dprod = ((PyFloatObject *)left)->ob_fval * ((PyFloatObject *)right)->ob_fval; DECREF_INPUTS_AND_REUSE_FLOAT(left, right, dprod, prod); - #line 323 "Python/generated_cases.c.h" + #line 407 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = prod; next_instr += 1; @@ -330,8 +414,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *sub; - #line 246 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 307 "Python/bytecodes.c" DEOPT_IF(!PyLong_CheckExact(left), BINARY_OP); DEOPT_IF(!PyLong_CheckExact(right), BINARY_OP); STAT_INC(BINARY_OP, hit); @@ -339,7 +422,7 @@ _Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free); _Py_DECREF_SPECIALIZED(left, (destructor)PyObject_Free); if (sub == NULL) goto pop_2_error; - #line 343 "Python/generated_cases.c.h" + #line 426 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = sub; next_instr += 1; @@ -350,14 +433,13 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *sub; - #line 257 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 317 "Python/bytecodes.c" DEOPT_IF(!PyFloat_CheckExact(left), BINARY_OP); DEOPT_IF(!PyFloat_CheckExact(right), BINARY_OP); STAT_INC(BINARY_OP, hit); double dsub = ((PyFloatObject *)left)->ob_fval - ((PyFloatObject *)right)->ob_fval; DECREF_INPUTS_AND_REUSE_FLOAT(left, right, dsub, sub); - #line 361 "Python/generated_cases.c.h" + #line 443 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = sub; next_instr += 1; @@ -368,8 +450,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 266 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 325 "Python/bytecodes.c" DEOPT_IF(!PyUnicode_CheckExact(left), BINARY_OP); DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP); STAT_INC(BINARY_OP, hit); @@ -377,7 +458,7 @@ _Py_DECREF_SPECIALIZED(left, _PyUnicode_ExactDealloc); _Py_DECREF_SPECIALIZED(right, _PyUnicode_ExactDealloc); if (res == NULL) goto pop_2_error; - #line 381 "Python/generated_cases.c.h" + #line 462 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -387,8 +468,7 @@ TARGET(BINARY_OP_INPLACE_ADD_UNICODE) { PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; - #line 283 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 341 "Python/bytecodes.c" DEOPT_IF(!PyUnicode_CheckExact(left), BINARY_OP); DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP); _Py_CODEUNIT true_next = next_instr[INLINE_CACHE_ENTRIES_BINARY_OP]; @@ -415,7 +495,7 @@ if (*target_local == NULL) goto pop_2_error; // The STORE_FAST is already done. JUMPBY(INLINE_CACHE_ENTRIES_BINARY_OP + 1); - #line 419 "Python/generated_cases.c.h" + #line 499 "Python/generated_cases.c.h" STACK_SHRINK(2); DISPATCH(); } @@ -424,15 +504,14 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *sum; - #line 313 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 370 "Python/bytecodes.c" DEOPT_IF(!PyFloat_CheckExact(left), BINARY_OP); DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP); STAT_INC(BINARY_OP, hit); double dsum = ((PyFloatObject *)left)->ob_fval + ((PyFloatObject *)right)->ob_fval; DECREF_INPUTS_AND_REUSE_FLOAT(left, right, dsum, sum); - #line 436 "Python/generated_cases.c.h" + #line 515 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = sum; next_instr += 1; @@ -443,8 +522,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *sum; - #line 323 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 379 "Python/bytecodes.c" DEOPT_IF(!PyLong_CheckExact(left), BINARY_OP); DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP); STAT_INC(BINARY_OP, hit); @@ -452,7 +530,7 @@ _Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free); _Py_DECREF_SPECIALIZED(left, (destructor)PyObject_Free); if (sum == NULL) goto pop_2_error; - #line 456 "Python/generated_cases.c.h" + #line 534 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = sum; next_instr += 1; @@ -465,11 +543,10 @@ PyObject *sub = stack_pointer[-1]; PyObject *container = stack_pointer[-2]; PyObject *res; - #line 342 "Python/bytecodes.c" + #line 397 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyBinarySubscrCache *cache = (_PyBinarySubscrCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); next_instr--; _Py_Specialize_BinarySubscr(container, sub, next_instr); DISPATCH_SAME_OPARG(); @@ -478,12 +555,12 @@ DECREMENT_ADAPTIVE_COUNTER(cache->counter); #endif /* ENABLE_SPECIALIZATION */ res = PyObject_GetItem(container, sub); - #line 482 "Python/generated_cases.c.h" + #line 559 "Python/generated_cases.c.h" Py_DECREF(container); Py_DECREF(sub); - #line 355 "Python/bytecodes.c" + #line 409 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; - #line 487 "Python/generated_cases.c.h" + #line 564 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -495,7 +572,7 @@ PyObject *start = stack_pointer[-2]; PyObject *container = stack_pointer[-3]; PyObject *res; - #line 359 "Python/bytecodes.c" + #line 413 "Python/bytecodes.c" PyObject *slice = _PyBuildSlice_ConsumeRefs(start, stop); // Can't use ERROR_IF() here, because we haven't // DECREF'ed container yet, and we still own slice. @@ -508,7 +585,7 @@ } Py_DECREF(container); if (res == NULL) goto pop_3_error; - #line 512 "Python/generated_cases.c.h" + #line 589 "Python/generated_cases.c.h" STACK_SHRINK(2); stack_pointer[-1] = res; DISPATCH(); @@ -519,7 +596,7 @@ PyObject *start = stack_pointer[-2]; PyObject *container = stack_pointer[-3]; PyObject *v = stack_pointer[-4]; - #line 374 "Python/bytecodes.c" + #line 428 "Python/bytecodes.c" PyObject *slice = _PyBuildSlice_ConsumeRefs(start, stop); int err; if (slice == NULL) { @@ -532,7 +609,7 @@ Py_DECREF(v); Py_DECREF(container); if (err) goto pop_4_error; - #line 536 "Python/generated_cases.c.h" + #line 613 "Python/generated_cases.c.h" STACK_SHRINK(4); DISPATCH(); } @@ -541,8 +618,7 @@ PyObject *sub = stack_pointer[-1]; PyObject *list = stack_pointer[-2]; PyObject *res; - #line 389 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 443 "Python/bytecodes.c" DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR); DEOPT_IF(!PyList_CheckExact(list), BINARY_SUBSCR); @@ -556,7 +632,7 @@ Py_INCREF(res); _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); Py_DECREF(list); - #line 560 "Python/generated_cases.c.h" + #line 636 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -567,8 +643,7 @@ PyObject *sub = stack_pointer[-1]; PyObject *tuple = stack_pointer[-2]; PyObject *res; - #line 406 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 459 "Python/bytecodes.c" DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR); DEOPT_IF(!PyTuple_CheckExact(tuple), BINARY_SUBSCR); @@ -582,7 +657,7 @@ Py_INCREF(res); _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); Py_DECREF(tuple); - #line 586 "Python/generated_cases.c.h" + #line 661 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -593,8 +668,7 @@ PyObject *sub = stack_pointer[-1]; PyObject *dict = stack_pointer[-2]; PyObject *res; - #line 423 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 475 "Python/bytecodes.c" DEOPT_IF(!PyDict_CheckExact(dict), BINARY_SUBSCR); STAT_INC(BINARY_SUBSCR, hit); res = PyDict_GetItemWithError(dict, sub); @@ -602,14 +676,14 @@ if (!_PyErr_Occurred(tstate)) { _PyErr_SetKeyError(sub); } - #line 606 "Python/generated_cases.c.h" + #line 680 "Python/generated_cases.c.h" Py_DECREF(dict); Py_DECREF(sub); - #line 432 "Python/bytecodes.c" + #line 483 "Python/bytecodes.c" if (true) goto pop_2_error; } Py_INCREF(res); // Do this before DECREF'ing dict, sub - #line 613 "Python/generated_cases.c.h" + #line 687 "Python/generated_cases.c.h" Py_DECREF(dict); Py_DECREF(sub); STACK_SHRINK(1); @@ -621,7 +695,7 @@ TARGET(BINARY_SUBSCR_GETITEM) { PyObject *sub = stack_pointer[-1]; PyObject *container = stack_pointer[-2]; - #line 439 "Python/bytecodes.c" + #line 490 "Python/bytecodes.c" PyTypeObject *tp = Py_TYPE(container); DEOPT_IF(!PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE), BINARY_SUBSCR); PyHeapTypeObject *ht = (PyHeapTypeObject *)tp; @@ -642,15 +716,15 @@ new_frame->localsplus[1] = sub; JUMPBY(INLINE_CACHE_ENTRIES_BINARY_SUBSCR); DISPATCH_INLINED(new_frame); - #line 646 "Python/generated_cases.c.h" + #line 720 "Python/generated_cases.c.h" } TARGET(LIST_APPEND) { PyObject *v = stack_pointer[-1]; PyObject *list = stack_pointer[-(2 + (oparg-1))]; - #line 462 "Python/bytecodes.c" + #line 513 "Python/bytecodes.c" if (_PyList_AppendTakeRef((PyListObject *)list, v) < 0) goto pop_1_error; - #line 654 "Python/generated_cases.c.h" + #line 728 "Python/generated_cases.c.h" STACK_SHRINK(1); PREDICT(JUMP_BACKWARD); DISPATCH(); @@ -659,13 +733,13 @@ TARGET(SET_ADD) { PyObject *v = stack_pointer[-1]; PyObject *set = stack_pointer[-(2 + (oparg-1))]; - #line 467 "Python/bytecodes.c" + #line 518 "Python/bytecodes.c" int err = PySet_Add(set, v); - #line 665 "Python/generated_cases.c.h" + #line 739 "Python/generated_cases.c.h" Py_DECREF(v); - #line 469 "Python/bytecodes.c" + #line 520 "Python/bytecodes.c" if (err) goto pop_1_error; - #line 669 "Python/generated_cases.c.h" + #line 743 "Python/generated_cases.c.h" STACK_SHRINK(1); PREDICT(JUMP_BACKWARD); DISPATCH(); @@ -678,10 +752,9 @@ PyObject *container = stack_pointer[-2]; PyObject *v = stack_pointer[-3]; uint16_t counter = read_u16(&next_instr[0].cache); - #line 480 "Python/bytecodes.c" + #line 531 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION if (ADAPTIVE_COUNTER_IS_ZERO(counter)) { - assert(cframe.use_tracing == 0); next_instr--; _Py_Specialize_StoreSubscr(container, sub, next_instr); DISPATCH_SAME_OPARG(); @@ -694,13 +767,13 @@ #endif /* ENABLE_SPECIALIZATION */ /* container[sub] = v */ int err = PyObject_SetItem(container, sub, v); - #line 698 "Python/generated_cases.c.h" + #line 771 "Python/generated_cases.c.h" Py_DECREF(v); Py_DECREF(container); Py_DECREF(sub); - #line 496 "Python/bytecodes.c" + #line 546 "Python/bytecodes.c" if (err) goto pop_3_error; - #line 704 "Python/generated_cases.c.h" + #line 777 "Python/generated_cases.c.h" STACK_SHRINK(3); next_instr += 1; DISPATCH(); @@ -710,8 +783,7 @@ PyObject *sub = stack_pointer[-1]; PyObject *list = stack_pointer[-2]; PyObject *value = stack_pointer[-3]; - #line 500 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 550 "Python/bytecodes.c" DEOPT_IF(!PyLong_CheckExact(sub), STORE_SUBSCR); DEOPT_IF(!PyList_CheckExact(list), STORE_SUBSCR); @@ -728,7 +800,7 @@ Py_DECREF(old_value); _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); Py_DECREF(list); - #line 732 "Python/generated_cases.c.h" + #line 804 "Python/generated_cases.c.h" STACK_SHRINK(3); next_instr += 1; DISPATCH(); @@ -738,14 +810,13 @@ PyObject *sub = stack_pointer[-1]; PyObject *dict = stack_pointer[-2]; PyObject *value = stack_pointer[-3]; - #line 520 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 569 "Python/bytecodes.c" DEOPT_IF(!PyDict_CheckExact(dict), STORE_SUBSCR); STAT_INC(STORE_SUBSCR, hit); int err = _PyDict_SetItem_Take2((PyDictObject *)dict, sub, value); Py_DECREF(dict); if (err) goto pop_3_error; - #line 749 "Python/generated_cases.c.h" + #line 820 "Python/generated_cases.c.h" STACK_SHRINK(3); next_instr += 1; DISPATCH(); @@ -754,15 +825,15 @@ TARGET(DELETE_SUBSCR) { PyObject *sub = stack_pointer[-1]; PyObject *container = stack_pointer[-2]; - #line 529 "Python/bytecodes.c" + #line 577 "Python/bytecodes.c" /* del container[sub] */ int err = PyObject_DelItem(container, sub); - #line 761 "Python/generated_cases.c.h" + #line 832 "Python/generated_cases.c.h" Py_DECREF(container); Py_DECREF(sub); - #line 532 "Python/bytecodes.c" + #line 580 "Python/bytecodes.c" if (err) goto pop_2_error; - #line 766 "Python/generated_cases.c.h" + #line 837 "Python/generated_cases.c.h" STACK_SHRINK(2); DISPATCH(); } @@ -770,14 +841,14 @@ TARGET(CALL_INTRINSIC_1) { PyObject *value = stack_pointer[-1]; PyObject *res; - #line 536 "Python/bytecodes.c" + #line 584 "Python/bytecodes.c" assert(oparg <= MAX_INTRINSIC_1); res = _PyIntrinsics_UnaryFunctions[oparg](tstate, value); - #line 777 "Python/generated_cases.c.h" + #line 848 "Python/generated_cases.c.h" Py_DECREF(value); - #line 539 "Python/bytecodes.c" + #line 587 "Python/bytecodes.c" if (res == NULL) goto pop_1_error; - #line 781 "Python/generated_cases.c.h" + #line 852 "Python/generated_cases.c.h" stack_pointer[-1] = res; DISPATCH(); } @@ -786,15 +857,15 @@ PyObject *value1 = stack_pointer[-1]; PyObject *value2 = stack_pointer[-2]; PyObject *res; - #line 543 "Python/bytecodes.c" + #line 591 "Python/bytecodes.c" assert(oparg <= MAX_INTRINSIC_2); res = _PyIntrinsics_BinaryFunctions[oparg](tstate, value2, value1); - #line 793 "Python/generated_cases.c.h" + #line 864 "Python/generated_cases.c.h" Py_DECREF(value2); Py_DECREF(value1); - #line 546 "Python/bytecodes.c" + #line 594 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; - #line 798 "Python/generated_cases.c.h" + #line 869 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; DISPATCH(); @@ -802,7 +873,7 @@ TARGET(RAISE_VARARGS) { PyObject **args = (stack_pointer - oparg); - #line 550 "Python/bytecodes.c" + #line 598 "Python/bytecodes.c" PyObject *cause = NULL, *exc = NULL; switch (oparg) { case 2: @@ -820,34 +891,31 @@ break; } if (true) { STACK_SHRINK(oparg); goto error; } - #line 824 "Python/generated_cases.c.h" + #line 895 "Python/generated_cases.c.h" } TARGET(INTERPRETER_EXIT) { PyObject *retval = stack_pointer[-1]; - #line 570 "Python/bytecodes.c" + #line 618 "Python/bytecodes.c" assert(frame == &entry_frame); assert(_PyFrame_IsIncomplete(frame)); STACK_SHRINK(1); // Since we're not going to DISPATCH() assert(EMPTY()); /* Restore previous cframe and return. */ tstate->cframe = cframe.previous; - tstate->cframe->use_tracing = cframe.use_tracing; assert(tstate->cframe->current_frame == frame->previous); assert(!_PyErr_Occurred(tstate)); _Py_LeaveRecursiveCallTstate(tstate); return retval; - #line 841 "Python/generated_cases.c.h" + #line 911 "Python/generated_cases.c.h" } TARGET(RETURN_VALUE) { PyObject *retval = stack_pointer[-1]; - #line 584 "Python/bytecodes.c" + #line 631 "Python/bytecodes.c" STACK_SHRINK(1); assert(EMPTY()); _PyFrame_SetStackPointer(frame, stack_pointer); - TRACE_FUNCTION_EXIT(); - DTRACE_FUNCTION_EXIT(); _Py_LeaveRecursiveCallPy(tstate); assert(frame != &entry_frame); // GH-99729: We need to unlink the frame *before* clearing it: @@ -856,17 +924,36 @@ _PyEvalFrameClearAndPop(tstate, dying); _PyFrame_StackPush(frame, retval); goto resume_frame; - #line 860 "Python/generated_cases.c.h" + #line 928 "Python/generated_cases.c.h" + } + + TARGET(INSTRUMENTED_RETURN_VALUE) { + PyObject *retval = stack_pointer[-1]; + #line 645 "Python/bytecodes.c" + int err = _Py_call_instrumentation_arg( + tstate, PY_MONITORING_EVENT_PY_RETURN, + frame, next_instr-1, retval); + if (err) goto error; + STACK_SHRINK(1); + assert(EMPTY()); + _PyFrame_SetStackPointer(frame, stack_pointer); + _Py_LeaveRecursiveCallPy(tstate); + assert(frame != &entry_frame); + // GH-99729: We need to unlink the frame *before* clearing it: + _PyInterpreterFrame *dying = frame; + frame = cframe.current_frame = dying->previous; + _PyEvalFrameClearAndPop(tstate, dying); + _PyFrame_StackPush(frame, retval); + goto resume_frame; + #line 949 "Python/generated_cases.c.h" } TARGET(RETURN_CONST) { - #line 600 "Python/bytecodes.c" + #line 663 "Python/bytecodes.c" PyObject *retval = GETITEM(frame->f_code->co_consts, oparg); Py_INCREF(retval); assert(EMPTY()); _PyFrame_SetStackPointer(frame, stack_pointer); - TRACE_FUNCTION_EXIT(); - DTRACE_FUNCTION_EXIT(); _Py_LeaveRecursiveCallPy(tstate); assert(frame != &entry_frame); // GH-99729: We need to unlink the frame *before* clearing it: @@ -875,13 +962,34 @@ _PyEvalFrameClearAndPop(tstate, dying); _PyFrame_StackPush(frame, retval); goto resume_frame; - #line 879 "Python/generated_cases.c.h" + #line 966 "Python/generated_cases.c.h" + } + + TARGET(INSTRUMENTED_RETURN_CONST) { + #line 678 "Python/bytecodes.c" + PyObject *retval = GETITEM(frame->f_code->co_consts, oparg); + int err = _Py_call_instrumentation_arg( + tstate, PY_MONITORING_EVENT_PY_RETURN, + frame, next_instr-1, retval); + if (err) goto error; + Py_INCREF(retval); + assert(EMPTY()); + _PyFrame_SetStackPointer(frame, stack_pointer); + _Py_LeaveRecursiveCallPy(tstate); + assert(frame != &entry_frame); + // GH-99729: We need to unlink the frame *before* clearing it: + _PyInterpreterFrame *dying = frame; + frame = cframe.current_frame = dying->previous; + _PyEvalFrameClearAndPop(tstate, dying); + _PyFrame_StackPush(frame, retval); + goto resume_frame; + #line 987 "Python/generated_cases.c.h" } TARGET(GET_AITER) { PyObject *obj = stack_pointer[-1]; PyObject *iter; - #line 617 "Python/bytecodes.c" + #line 697 "Python/bytecodes.c" unaryfunc getter = NULL; PyTypeObject *type = Py_TYPE(obj); @@ -894,16 +1002,16 @@ "'async for' requires an object with " "__aiter__ method, got %.100s", type->tp_name); - #line 898 "Python/generated_cases.c.h" + #line 1006 "Python/generated_cases.c.h" Py_DECREF(obj); - #line 630 "Python/bytecodes.c" + #line 710 "Python/bytecodes.c" if (true) goto pop_1_error; } iter = (*getter)(obj); - #line 905 "Python/generated_cases.c.h" + #line 1013 "Python/generated_cases.c.h" Py_DECREF(obj); - #line 635 "Python/bytecodes.c" + #line 715 "Python/bytecodes.c" if (iter == NULL) goto pop_1_error; if (Py_TYPE(iter)->tp_as_async == NULL || @@ -916,7 +1024,7 @@ Py_DECREF(iter); if (true) goto pop_1_error; } - #line 920 "Python/generated_cases.c.h" + #line 1028 "Python/generated_cases.c.h" stack_pointer[-1] = iter; DISPATCH(); } @@ -924,7 +1032,7 @@ TARGET(GET_ANEXT) { PyObject *aiter = stack_pointer[-1]; PyObject *awaitable; - #line 650 "Python/bytecodes.c" + #line 730 "Python/bytecodes.c" unaryfunc getter = NULL; PyObject *next_iter = NULL; PyTypeObject *type = Py_TYPE(aiter); @@ -968,7 +1076,7 @@ } } - #line 972 "Python/generated_cases.c.h" + #line 1080 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = awaitable; PREDICT(LOAD_CONST); @@ -979,16 +1087,16 @@ PREDICTED(GET_AWAITABLE); PyObject *iterable = stack_pointer[-1]; PyObject *iter; - #line 697 "Python/bytecodes.c" + #line 777 "Python/bytecodes.c" iter = _PyCoro_GetAwaitableIter(iterable); if (iter == NULL) { format_awaitable_error(tstate, Py_TYPE(iterable), oparg); } - #line 990 "Python/generated_cases.c.h" + #line 1098 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 704 "Python/bytecodes.c" + #line 784 "Python/bytecodes.c" if (iter != NULL && PyCoro_CheckExact(iter)) { PyObject *yf = _PyGen_yf((PyGenObject*)iter); @@ -1006,7 +1114,7 @@ if (iter == NULL) goto pop_1_error; - #line 1010 "Python/generated_cases.c.h" + #line 1118 "Python/generated_cases.c.h" stack_pointer[-1] = iter; PREDICT(LOAD_CONST); DISPATCH(); @@ -1017,11 +1125,10 @@ PyObject *v = stack_pointer[-1]; PyObject *receiver = stack_pointer[-2]; PyObject *retval; - #line 730 "Python/bytecodes.c" + #line 810 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PySendCache *cache = (_PySendCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); next_instr--; _Py_Specialize_Send(receiver, next_instr); DISPATCH_SAME_OPARG(); @@ -1030,6 +1137,20 @@ DECREMENT_ADAPTIVE_COUNTER(cache->counter); #endif /* ENABLE_SPECIALIZATION */ assert(frame != &entry_frame); + if ((Py_TYPE(receiver) == &PyGen_Type || + Py_TYPE(receiver) == &PyCoro_Type) && ((PyGenObject *)receiver)->gi_frame_state < FRAME_EXECUTING) + { + PyGenObject *gen = (PyGenObject *)receiver; + _PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; + frame->yield_offset = oparg; + STACK_SHRINK(1); + _PyFrame_StackPush(gen_frame, v); + gen->gi_frame_state = FRAME_EXECUTING; + gen->gi_exc_state.previous_item = tstate->exc_info; + tstate->exc_info = &gen->gi_exc_state; + JUMPBY(INLINE_CACHE_ENTRIES_SEND + oparg); + DISPATCH_INLINED(gen_frame); + } if (Py_IsNone(v) && PyIter_Check(receiver)) { retval = Py_TYPE(receiver)->tp_iternext(receiver); } @@ -1037,23 +1158,20 @@ retval = PyObject_CallMethodOneArg(receiver, &_Py_ID(send), v); } if (retval == NULL) { - if (tstate->c_tracefunc != NULL - && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) - call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, frame); + if (_PyErr_ExceptionMatches(tstate, PyExc_StopIteration) + ) { + monitor_raise(tstate, frame, next_instr-1); + } if (_PyGen_FetchStopIterationValue(&retval) == 0) { assert(retval != NULL); JUMPBY(oparg); } else { - assert(retval == NULL); goto error; } } - else { - assert(retval != NULL); - } Py_DECREF(v); - #line 1057 "Python/generated_cases.c.h" + #line 1175 "Python/generated_cases.c.h" stack_pointer[-1] = retval; next_instr += 1; DISPATCH(); @@ -1062,8 +1180,7 @@ TARGET(SEND_GEN) { PyObject *v = stack_pointer[-1]; PyObject *receiver = stack_pointer[-2]; - #line 768 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 858 "Python/bytecodes.c" PyGenObject *gen = (PyGenObject *)receiver; DEOPT_IF(Py_TYPE(gen) != &PyGen_Type && Py_TYPE(gen) != &PyCoro_Type, SEND); @@ -1078,12 +1195,35 @@ tstate->exc_info = &gen->gi_exc_state; JUMPBY(INLINE_CACHE_ENTRIES_SEND + oparg); DISPATCH_INLINED(gen_frame); - #line 1082 "Python/generated_cases.c.h" + #line 1199 "Python/generated_cases.c.h" + } + + TARGET(INSTRUMENTED_YIELD_VALUE) { + PyObject *retval = stack_pointer[-1]; + #line 875 "Python/bytecodes.c" + assert(frame != &entry_frame); + PyGenObject *gen = _PyFrame_GetGenerator(frame); + gen->gi_frame_state = FRAME_SUSPENDED; + _PyFrame_SetStackPointer(frame, stack_pointer - 1); + int err = _Py_call_instrumentation_arg( + tstate, PY_MONITORING_EVENT_PY_YIELD, + frame, next_instr-1, retval); + if (err) goto error; + tstate->exc_info = gen->gi_exc_state.previous_item; + gen->gi_exc_state.previous_item = NULL; + _Py_LeaveRecursiveCallPy(tstate); + _PyInterpreterFrame *gen_frame = frame; + frame = cframe.current_frame = frame->previous; + gen_frame->previous = NULL; + frame->prev_instr -= frame->yield_offset; + _PyFrame_StackPush(frame, retval); + goto resume_frame; + #line 1222 "Python/generated_cases.c.h" } TARGET(YIELD_VALUE) { PyObject *retval = stack_pointer[-1]; - #line 786 "Python/bytecodes.c" + #line 895 "Python/bytecodes.c" // NOTE: It's important that YIELD_VALUE never raises an exception! // The compiler treats any exception raised here as a failed close() // or throw() call. @@ -1091,8 +1231,6 @@ PyGenObject *gen = _PyFrame_GetGenerator(frame); gen->gi_frame_state = FRAME_SUSPENDED; _PyFrame_SetStackPointer(frame, stack_pointer - 1); - TRACE_FUNCTION_EXIT(); - DTRACE_FUNCTION_EXIT(); tstate->exc_info = gen->gi_exc_state.previous_item; gen->gi_exc_state.previous_item = NULL; _Py_LeaveRecursiveCallPy(tstate); @@ -1102,15 +1240,15 @@ frame->prev_instr -= frame->yield_offset; _PyFrame_StackPush(frame, retval); goto resume_frame; - #line 1106 "Python/generated_cases.c.h" + #line 1244 "Python/generated_cases.c.h" } TARGET(POP_EXCEPT) { PyObject *exc_value = stack_pointer[-1]; - #line 807 "Python/bytecodes.c" + #line 914 "Python/bytecodes.c" _PyErr_StackItem *exc_info = tstate->exc_info; Py_XSETREF(exc_info->exc_value, exc_value); - #line 1114 "Python/generated_cases.c.h" + #line 1252 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } @@ -1118,7 +1256,7 @@ TARGET(RERAISE) { PyObject *exc = stack_pointer[-1]; PyObject **values = (stack_pointer - (1 + oparg)); - #line 812 "Python/bytecodes.c" + #line 919 "Python/bytecodes.c" assert(oparg >= 0 && oparg <= 2); if (oparg) { PyObject *lasti = values[0]; @@ -1136,26 +1274,26 @@ Py_INCREF(exc); _PyErr_SetRaisedException(tstate, exc); goto exception_unwind; - #line 1140 "Python/generated_cases.c.h" + #line 1278 "Python/generated_cases.c.h" } TARGET(END_ASYNC_FOR) { PyObject *exc = stack_pointer[-1]; PyObject *awaitable = stack_pointer[-2]; - #line 832 "Python/bytecodes.c" + #line 939 "Python/bytecodes.c" assert(exc && PyExceptionInstance_Check(exc)); if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) { - #line 1149 "Python/generated_cases.c.h" + #line 1287 "Python/generated_cases.c.h" Py_DECREF(awaitable); Py_DECREF(exc); - #line 835 "Python/bytecodes.c" + #line 942 "Python/bytecodes.c" } else { Py_INCREF(exc); _PyErr_SetRaisedException(tstate, exc); goto exception_unwind; } - #line 1159 "Python/generated_cases.c.h" + #line 1297 "Python/generated_cases.c.h" STACK_SHRINK(2); DISPATCH(); } @@ -1166,23 +1304,23 @@ PyObject *sub_iter = stack_pointer[-3]; PyObject *none; PyObject *value; - #line 844 "Python/bytecodes.c" + #line 951 "Python/bytecodes.c" assert(throwflag); assert(exc_value && PyExceptionInstance_Check(exc_value)); if (PyErr_GivenExceptionMatches(exc_value, PyExc_StopIteration)) { value = Py_NewRef(((PyStopIterationObject *)exc_value)->value); - #line 1175 "Python/generated_cases.c.h" + #line 1313 "Python/generated_cases.c.h" Py_DECREF(sub_iter); Py_DECREF(last_sent_val); Py_DECREF(exc_value); - #line 849 "Python/bytecodes.c" + #line 956 "Python/bytecodes.c" none = Py_NewRef(Py_None); } else { _PyErr_SetRaisedException(tstate, Py_NewRef(exc_value)); goto exception_unwind; } - #line 1186 "Python/generated_cases.c.h" + #line 1324 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = value; stack_pointer[-2] = none; @@ -1191,9 +1329,9 @@ TARGET(LOAD_ASSERTION_ERROR) { PyObject *value; - #line 858 "Python/bytecodes.c" + #line 965 "Python/bytecodes.c" value = Py_NewRef(PyExc_AssertionError); - #line 1197 "Python/generated_cases.c.h" + #line 1335 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = value; DISPATCH(); @@ -1201,7 +1339,7 @@ TARGET(LOAD_BUILD_CLASS) { PyObject *bc; - #line 862 "Python/bytecodes.c" + #line 969 "Python/bytecodes.c" if (PyDict_CheckExact(BUILTINS())) { bc = _PyDict_GetItemWithError(BUILTINS(), &_Py_ID(__build_class__)); @@ -1223,7 +1361,7 @@ if (true) goto error; } } - #line 1227 "Python/generated_cases.c.h" + #line 1365 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = bc; DISPATCH(); @@ -1231,33 +1369,33 @@ TARGET(STORE_NAME) { PyObject *v = stack_pointer[-1]; - #line 886 "Python/bytecodes.c" + #line 993 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); PyObject *ns = LOCALS(); int err; if (ns == NULL) { _PyErr_Format(tstate, PyExc_SystemError, "no locals found when storing %R", name); - #line 1242 "Python/generated_cases.c.h" + #line 1380 "Python/generated_cases.c.h" Py_DECREF(v); - #line 893 "Python/bytecodes.c" + #line 1000 "Python/bytecodes.c" if (true) goto pop_1_error; } if (PyDict_CheckExact(ns)) err = PyDict_SetItem(ns, name, v); else err = PyObject_SetItem(ns, name, v); - #line 1251 "Python/generated_cases.c.h" + #line 1389 "Python/generated_cases.c.h" Py_DECREF(v); - #line 900 "Python/bytecodes.c" + #line 1007 "Python/bytecodes.c" if (err) goto pop_1_error; - #line 1255 "Python/generated_cases.c.h" + #line 1393 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(DELETE_NAME) { - #line 904 "Python/bytecodes.c" + #line 1011 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); PyObject *ns = LOCALS(); int err; @@ -1274,7 +1412,7 @@ name); goto error; } - #line 1278 "Python/generated_cases.c.h" + #line 1416 "Python/generated_cases.c.h" DISPATCH(); } @@ -1282,11 +1420,10 @@ PREDICTED(UNPACK_SEQUENCE); static_assert(INLINE_CACHE_ENTRIES_UNPACK_SEQUENCE == 1, "incorrect cache size"); PyObject *seq = stack_pointer[-1]; - #line 930 "Python/bytecodes.c" + #line 1037 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyUnpackSequenceCache *cache = (_PyUnpackSequenceCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); next_instr--; _Py_Specialize_UnpackSequence(seq, next_instr, oparg); DISPATCH_SAME_OPARG(); @@ -1296,11 +1433,11 @@ #endif /* ENABLE_SPECIALIZATION */ PyObject **top = stack_pointer + oparg - 1; int res = unpack_iterable(tstate, seq, oparg, -1, top); - #line 1300 "Python/generated_cases.c.h" + #line 1437 "Python/generated_cases.c.h" Py_DECREF(seq); - #line 944 "Python/bytecodes.c" + #line 1050 "Python/bytecodes.c" if (res == 0) goto pop_1_error; - #line 1304 "Python/generated_cases.c.h" + #line 1441 "Python/generated_cases.c.h" STACK_SHRINK(1); STACK_GROW(oparg); next_instr += 1; @@ -1310,14 +1447,14 @@ TARGET(UNPACK_SEQUENCE_TWO_TUPLE) { PyObject *seq = stack_pointer[-1]; PyObject **values = stack_pointer - (1); - #line 948 "Python/bytecodes.c" + #line 1054 "Python/bytecodes.c" DEOPT_IF(!PyTuple_CheckExact(seq), UNPACK_SEQUENCE); DEOPT_IF(PyTuple_GET_SIZE(seq) != 2, UNPACK_SEQUENCE); assert(oparg == 2); STAT_INC(UNPACK_SEQUENCE, hit); values[0] = Py_NewRef(PyTuple_GET_ITEM(seq, 1)); values[1] = Py_NewRef(PyTuple_GET_ITEM(seq, 0)); - #line 1321 "Python/generated_cases.c.h" + #line 1458 "Python/generated_cases.c.h" Py_DECREF(seq); STACK_SHRINK(1); STACK_GROW(oparg); @@ -1328,7 +1465,7 @@ TARGET(UNPACK_SEQUENCE_TUPLE) { PyObject *seq = stack_pointer[-1]; PyObject **values = stack_pointer - (1); - #line 958 "Python/bytecodes.c" + #line 1064 "Python/bytecodes.c" DEOPT_IF(!PyTuple_CheckExact(seq), UNPACK_SEQUENCE); DEOPT_IF(PyTuple_GET_SIZE(seq) != oparg, UNPACK_SEQUENCE); STAT_INC(UNPACK_SEQUENCE, hit); @@ -1336,7 +1473,7 @@ for (int i = oparg; --i >= 0; ) { *values++ = Py_NewRef(items[i]); } - #line 1340 "Python/generated_cases.c.h" + #line 1477 "Python/generated_cases.c.h" Py_DECREF(seq); STACK_SHRINK(1); STACK_GROW(oparg); @@ -1347,7 +1484,7 @@ TARGET(UNPACK_SEQUENCE_LIST) { PyObject *seq = stack_pointer[-1]; PyObject **values = stack_pointer - (1); - #line 969 "Python/bytecodes.c" + #line 1075 "Python/bytecodes.c" DEOPT_IF(!PyList_CheckExact(seq), UNPACK_SEQUENCE); DEOPT_IF(PyList_GET_SIZE(seq) != oparg, UNPACK_SEQUENCE); STAT_INC(UNPACK_SEQUENCE, hit); @@ -1355,7 +1492,7 @@ for (int i = oparg; --i >= 0; ) { *values++ = Py_NewRef(items[i]); } - #line 1359 "Python/generated_cases.c.h" + #line 1496 "Python/generated_cases.c.h" Py_DECREF(seq); STACK_SHRINK(1); STACK_GROW(oparg); @@ -1365,15 +1502,15 @@ TARGET(UNPACK_EX) { PyObject *seq = stack_pointer[-1]; - #line 980 "Python/bytecodes.c" + #line 1086 "Python/bytecodes.c" int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8); PyObject **top = stack_pointer + totalargs - 1; int res = unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8, top); - #line 1373 "Python/generated_cases.c.h" + #line 1510 "Python/generated_cases.c.h" Py_DECREF(seq); - #line 984 "Python/bytecodes.c" + #line 1090 "Python/bytecodes.c" if (res == 0) goto pop_1_error; - #line 1377 "Python/generated_cases.c.h" + #line 1514 "Python/generated_cases.c.h" STACK_GROW((oparg & 0xFF) + (oparg >> 8)); DISPATCH(); } @@ -1384,10 +1521,9 @@ PyObject *owner = stack_pointer[-1]; PyObject *v = stack_pointer[-2]; uint16_t counter = read_u16(&next_instr[0].cache); - #line 995 "Python/bytecodes.c" + #line 1101 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION if (ADAPTIVE_COUNTER_IS_ZERO(counter)) { - assert(cframe.use_tracing == 0); PyObject *name = GETITEM(frame->f_code->co_names, oparg); next_instr--; _Py_Specialize_StoreAttr(owner, next_instr, name); @@ -1401,12 +1537,12 @@ #endif /* ENABLE_SPECIALIZATION */ PyObject *name = GETITEM(frame->f_code->co_names, oparg); int err = PyObject_SetAttr(owner, name, v); - #line 1405 "Python/generated_cases.c.h" + #line 1541 "Python/generated_cases.c.h" Py_DECREF(v); Py_DECREF(owner); - #line 1012 "Python/bytecodes.c" + #line 1117 "Python/bytecodes.c" if (err) goto pop_2_error; - #line 1410 "Python/generated_cases.c.h" + #line 1546 "Python/generated_cases.c.h" STACK_SHRINK(2); next_instr += 4; DISPATCH(); @@ -1414,34 +1550,34 @@ TARGET(DELETE_ATTR) { PyObject *owner = stack_pointer[-1]; - #line 1016 "Python/bytecodes.c" + #line 1121 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); int err = PyObject_SetAttr(owner, name, (PyObject *)NULL); - #line 1421 "Python/generated_cases.c.h" + #line 1557 "Python/generated_cases.c.h" Py_DECREF(owner); - #line 1019 "Python/bytecodes.c" + #line 1124 "Python/bytecodes.c" if (err) goto pop_1_error; - #line 1425 "Python/generated_cases.c.h" + #line 1561 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(STORE_GLOBAL) { PyObject *v = stack_pointer[-1]; - #line 1023 "Python/bytecodes.c" + #line 1128 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); int err = PyDict_SetItem(GLOBALS(), name, v); - #line 1435 "Python/generated_cases.c.h" + #line 1571 "Python/generated_cases.c.h" Py_DECREF(v); - #line 1026 "Python/bytecodes.c" + #line 1131 "Python/bytecodes.c" if (err) goto pop_1_error; - #line 1439 "Python/generated_cases.c.h" + #line 1575 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(DELETE_GLOBAL) { - #line 1030 "Python/bytecodes.c" + #line 1135 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); int err; err = PyDict_DelItem(GLOBALS(), name); @@ -1453,13 +1589,13 @@ } goto error; } - #line 1457 "Python/generated_cases.c.h" + #line 1593 "Python/generated_cases.c.h" DISPATCH(); } TARGET(LOAD_NAME) { PyObject *v; - #line 1044 "Python/bytecodes.c" + #line 1149 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); PyObject *locals = LOCALS(); if (locals == NULL) { @@ -1518,7 +1654,7 @@ } } } - #line 1522 "Python/generated_cases.c.h" + #line 1658 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = v; DISPATCH(); @@ -1529,11 +1665,10 @@ static_assert(INLINE_CACHE_ENTRIES_LOAD_GLOBAL == 4, "incorrect cache size"); PyObject *null = NULL; PyObject *v; - #line 1111 "Python/bytecodes.c" + #line 1216 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyLoadGlobalCache *cache = (_PyLoadGlobalCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); PyObject *name = GETITEM(frame->f_code->co_names, oparg>>1); next_instr--; _Py_Specialize_LoadGlobal(GLOBALS(), BUILTINS(), next_instr, name); @@ -1582,7 +1717,7 @@ } } null = NULL; - #line 1586 "Python/generated_cases.c.h" + #line 1721 "Python/generated_cases.c.h" STACK_GROW(1); STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = v; @@ -1596,8 +1731,7 @@ PyObject *res; uint16_t index = read_u16(&next_instr[1].cache); uint16_t version = read_u16(&next_instr[2].cache); - #line 1166 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 1270 "Python/bytecodes.c" DEOPT_IF(!PyDict_CheckExact(GLOBALS()), LOAD_GLOBAL); PyDictObject *dict = (PyDictObject *)GLOBALS(); DEOPT_IF(dict->ma_keys->dk_version != version, LOAD_GLOBAL); @@ -1608,7 +1742,7 @@ Py_INCREF(res); STAT_INC(LOAD_GLOBAL, hit); null = NULL; - #line 1612 "Python/generated_cases.c.h" + #line 1746 "Python/generated_cases.c.h" STACK_GROW(1); STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; @@ -1623,12 +1757,12 @@ uint16_t index = read_u16(&next_instr[1].cache); uint16_t mod_version = read_u16(&next_instr[2].cache); uint16_t bltn_version = read_u16(&next_instr[3].cache); - #line 1180 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 1283 "Python/bytecodes.c" DEOPT_IF(!PyDict_CheckExact(GLOBALS()), LOAD_GLOBAL); DEOPT_IF(!PyDict_CheckExact(BUILTINS()), LOAD_GLOBAL); PyDictObject *mdict = (PyDictObject *)GLOBALS(); PyDictObject *bdict = (PyDictObject *)BUILTINS(); + assert(opcode == LOAD_GLOBAL_BUILTIN); DEOPT_IF(mdict->ma_keys->dk_version != mod_version, LOAD_GLOBAL); DEOPT_IF(bdict->ma_keys->dk_version != bltn_version, LOAD_GLOBAL); assert(DK_IS_UNICODE(bdict->ma_keys)); @@ -1638,7 +1772,7 @@ Py_INCREF(res); STAT_INC(LOAD_GLOBAL, hit); null = NULL; - #line 1642 "Python/generated_cases.c.h" + #line 1776 "Python/generated_cases.c.h" STACK_GROW(1); STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; @@ -1648,16 +1782,16 @@ } TARGET(DELETE_FAST) { - #line 1197 "Python/bytecodes.c" + #line 1300 "Python/bytecodes.c" PyObject *v = GETLOCAL(oparg); if (v == NULL) goto unbound_local_error; SETLOCAL(oparg, NULL); - #line 1656 "Python/generated_cases.c.h" + #line 1790 "Python/generated_cases.c.h" DISPATCH(); } TARGET(MAKE_CELL) { - #line 1203 "Python/bytecodes.c" + #line 1306 "Python/bytecodes.c" // "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); @@ -1666,12 +1800,12 @@ goto resume_with_error; } SETLOCAL(oparg, cell); - #line 1670 "Python/generated_cases.c.h" + #line 1804 "Python/generated_cases.c.h" DISPATCH(); } TARGET(DELETE_DEREF) { - #line 1214 "Python/bytecodes.c" + #line 1317 "Python/bytecodes.c" PyObject *cell = GETLOCAL(oparg); PyObject *oldobj = PyCell_GET(cell); // Can't use ERROR_IF here. @@ -1682,13 +1816,13 @@ } PyCell_SET(cell, NULL); Py_DECREF(oldobj); - #line 1686 "Python/generated_cases.c.h" + #line 1820 "Python/generated_cases.c.h" DISPATCH(); } TARGET(LOAD_CLASSDEREF) { PyObject *value; - #line 1227 "Python/bytecodes.c" + #line 1330 "Python/bytecodes.c" PyObject *name, *locals = LOCALS(); assert(locals); assert(oparg >= 0 && oparg < frame->f_code->co_nlocalsplus); @@ -1720,7 +1854,7 @@ } Py_INCREF(value); } - #line 1724 "Python/generated_cases.c.h" + #line 1858 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = value; DISPATCH(); @@ -1728,7 +1862,7 @@ TARGET(LOAD_DEREF) { PyObject *value; - #line 1261 "Python/bytecodes.c" + #line 1364 "Python/bytecodes.c" PyObject *cell = GETLOCAL(oparg); value = PyCell_GET(cell); if (value == NULL) { @@ -1736,7 +1870,7 @@ if (true) goto error; } Py_INCREF(value); - #line 1740 "Python/generated_cases.c.h" + #line 1874 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = value; DISPATCH(); @@ -1744,18 +1878,18 @@ TARGET(STORE_DEREF) { PyObject *v = stack_pointer[-1]; - #line 1271 "Python/bytecodes.c" + #line 1374 "Python/bytecodes.c" PyObject *cell = GETLOCAL(oparg); PyObject *oldobj = PyCell_GET(cell); PyCell_SET(cell, v); Py_XDECREF(oldobj); - #line 1753 "Python/generated_cases.c.h" + #line 1887 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(COPY_FREE_VARS) { - #line 1278 "Python/bytecodes.c" + #line 1381 "Python/bytecodes.c" /* Copy closure variables to free variables */ PyCodeObject *co = frame->f_code; assert(PyFunction_Check(frame->f_funcobj)); @@ -1766,22 +1900,22 @@ PyObject *o = PyTuple_GET_ITEM(closure, i); frame->localsplus[offset + i] = Py_NewRef(o); } - #line 1770 "Python/generated_cases.c.h" + #line 1904 "Python/generated_cases.c.h" DISPATCH(); } TARGET(BUILD_STRING) { PyObject **pieces = (stack_pointer - oparg); PyObject *str; - #line 1291 "Python/bytecodes.c" + #line 1394 "Python/bytecodes.c" str = _PyUnicode_JoinArray(&_Py_STR(empty), pieces, oparg); - #line 1779 "Python/generated_cases.c.h" + #line 1913 "Python/generated_cases.c.h" for (int _i = oparg; --_i >= 0;) { Py_DECREF(pieces[_i]); } - #line 1293 "Python/bytecodes.c" + #line 1396 "Python/bytecodes.c" if (str == NULL) { STACK_SHRINK(oparg); goto error; } - #line 1785 "Python/generated_cases.c.h" + #line 1919 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_GROW(1); stack_pointer[-1] = str; @@ -1791,10 +1925,10 @@ TARGET(BUILD_TUPLE) { PyObject **values = (stack_pointer - oparg); PyObject *tup; - #line 1297 "Python/bytecodes.c" + #line 1400 "Python/bytecodes.c" tup = _PyTuple_FromArraySteal(values, oparg); if (tup == NULL) { STACK_SHRINK(oparg); goto error; } - #line 1798 "Python/generated_cases.c.h" + #line 1932 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_GROW(1); stack_pointer[-1] = tup; @@ -1804,10 +1938,10 @@ TARGET(BUILD_LIST) { PyObject **values = (stack_pointer - oparg); PyObject *list; - #line 1302 "Python/bytecodes.c" + #line 1405 "Python/bytecodes.c" list = _PyList_FromArraySteal(values, oparg); if (list == NULL) { STACK_SHRINK(oparg); goto error; } - #line 1811 "Python/generated_cases.c.h" + #line 1945 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_GROW(1); stack_pointer[-1] = list; @@ -1817,7 +1951,7 @@ TARGET(LIST_EXTEND) { PyObject *iterable = stack_pointer[-1]; PyObject *list = stack_pointer[-(2 + (oparg-1))]; - #line 1307 "Python/bytecodes.c" + #line 1410 "Python/bytecodes.c" PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable); if (none_val == NULL) { if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) && @@ -1828,13 +1962,13 @@ "Value after * must be an iterable, not %.200s", Py_TYPE(iterable)->tp_name); } - #line 1832 "Python/generated_cases.c.h" + #line 1966 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 1318 "Python/bytecodes.c" + #line 1421 "Python/bytecodes.c" if (true) goto pop_1_error; } Py_DECREF(none_val); - #line 1838 "Python/generated_cases.c.h" + #line 1972 "Python/generated_cases.c.h" Py_DECREF(iterable); STACK_SHRINK(1); DISPATCH(); @@ -1843,13 +1977,13 @@ TARGET(SET_UPDATE) { PyObject *iterable = stack_pointer[-1]; PyObject *set = stack_pointer[-(2 + (oparg-1))]; - #line 1325 "Python/bytecodes.c" + #line 1428 "Python/bytecodes.c" int err = _PySet_Update(set, iterable); - #line 1849 "Python/generated_cases.c.h" + #line 1983 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 1327 "Python/bytecodes.c" + #line 1430 "Python/bytecodes.c" if (err < 0) goto pop_1_error; - #line 1853 "Python/generated_cases.c.h" + #line 1987 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } @@ -1857,7 +1991,7 @@ TARGET(BUILD_SET) { PyObject **values = (stack_pointer - oparg); PyObject *set; - #line 1331 "Python/bytecodes.c" + #line 1434 "Python/bytecodes.c" set = PySet_New(NULL); if (set == NULL) goto error; @@ -1872,7 +2006,7 @@ Py_DECREF(set); if (true) { STACK_SHRINK(oparg); goto error; } } - #line 1876 "Python/generated_cases.c.h" + #line 2010 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_GROW(1); stack_pointer[-1] = set; @@ -1882,7 +2016,7 @@ TARGET(BUILD_MAP) { PyObject **values = (stack_pointer - oparg*2); PyObject *map; - #line 1348 "Python/bytecodes.c" + #line 1451 "Python/bytecodes.c" map = _PyDict_FromItems( values, 2, values+1, 2, @@ -1890,13 +2024,13 @@ if (map == NULL) goto error; - #line 1894 "Python/generated_cases.c.h" + #line 2028 "Python/generated_cases.c.h" for (int _i = oparg*2; --_i >= 0;) { Py_DECREF(values[_i]); } - #line 1356 "Python/bytecodes.c" + #line 1459 "Python/bytecodes.c" if (map == NULL) { STACK_SHRINK(oparg*2); goto error; } - #line 1900 "Python/generated_cases.c.h" + #line 2034 "Python/generated_cases.c.h" STACK_SHRINK(oparg*2); STACK_GROW(1); stack_pointer[-1] = map; @@ -1904,7 +2038,7 @@ } TARGET(SETUP_ANNOTATIONS) { - #line 1360 "Python/bytecodes.c" + #line 1463 "Python/bytecodes.c" int err; PyObject *ann_dict; if (LOCALS() == NULL) { @@ -1944,7 +2078,7 @@ Py_DECREF(ann_dict); } } - #line 1948 "Python/generated_cases.c.h" + #line 2082 "Python/generated_cases.c.h" DISPATCH(); } @@ -1952,7 +2086,7 @@ PyObject *keys = stack_pointer[-1]; PyObject **values = (stack_pointer - (1 + oparg)); PyObject *map; - #line 1402 "Python/bytecodes.c" + #line 1505 "Python/bytecodes.c" if (!PyTuple_CheckExact(keys) || PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) { _PyErr_SetString(tstate, PyExc_SystemError, @@ -1962,14 +2096,14 @@ map = _PyDict_FromItems( &PyTuple_GET_ITEM(keys, 0), 1, values, 1, oparg); - #line 1966 "Python/generated_cases.c.h" + #line 2100 "Python/generated_cases.c.h" for (int _i = oparg; --_i >= 0;) { Py_DECREF(values[_i]); } Py_DECREF(keys); - #line 1412 "Python/bytecodes.c" + #line 1515 "Python/bytecodes.c" if (map == NULL) { STACK_SHRINK(oparg); goto pop_1_error; } - #line 1973 "Python/generated_cases.c.h" + #line 2107 "Python/generated_cases.c.h" STACK_SHRINK(oparg); stack_pointer[-1] = map; DISPATCH(); @@ -1977,7 +2111,7 @@ TARGET(DICT_UPDATE) { PyObject *update = stack_pointer[-1]; - #line 1416 "Python/bytecodes.c" + #line 1519 "Python/bytecodes.c" PyObject *dict = PEEK(oparg + 1); // update is still on the stack if (PyDict_Update(dict, update) < 0) { if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { @@ -1985,12 +2119,12 @@ "'%.200s' object is not a mapping", Py_TYPE(update)->tp_name); } - #line 1989 "Python/generated_cases.c.h" + #line 2123 "Python/generated_cases.c.h" Py_DECREF(update); - #line 1424 "Python/bytecodes.c" + #line 1527 "Python/bytecodes.c" if (true) goto pop_1_error; } - #line 1994 "Python/generated_cases.c.h" + #line 2128 "Python/generated_cases.c.h" Py_DECREF(update); STACK_SHRINK(1); DISPATCH(); @@ -1998,17 +2132,17 @@ TARGET(DICT_MERGE) { PyObject *update = stack_pointer[-1]; - #line 1430 "Python/bytecodes.c" + #line 1533 "Python/bytecodes.c" PyObject *dict = PEEK(oparg + 1); // update is still on the stack if (_PyDict_MergeEx(dict, update, 2) < 0) { format_kwargs_error(tstate, PEEK(3 + oparg), update); - #line 2007 "Python/generated_cases.c.h" + #line 2141 "Python/generated_cases.c.h" Py_DECREF(update); - #line 1435 "Python/bytecodes.c" + #line 1538 "Python/bytecodes.c" if (true) goto pop_1_error; } - #line 2012 "Python/generated_cases.c.h" + #line 2146 "Python/generated_cases.c.h" Py_DECREF(update); STACK_SHRINK(1); PREDICT(CALL_FUNCTION_EX); @@ -2018,13 +2152,13 @@ TARGET(MAP_ADD) { PyObject *value = stack_pointer[-1]; PyObject *key = stack_pointer[-2]; - #line 1442 "Python/bytecodes.c" + #line 1545 "Python/bytecodes.c" PyObject *dict = PEEK(oparg + 2); // key, value are still on the stack assert(PyDict_CheckExact(dict)); /* dict[key] = value */ // Do not DECREF INPUTS because the function steals the references if (_PyDict_SetItem_Take2((PyDictObject *)dict, key, value) != 0) goto pop_2_error; - #line 2028 "Python/generated_cases.c.h" + #line 2162 "Python/generated_cases.c.h" STACK_SHRINK(2); PREDICT(JUMP_BACKWARD); DISPATCH(); @@ -2036,11 +2170,10 @@ PyObject *owner = stack_pointer[-1]; PyObject *res2 = NULL; PyObject *res; - #line 1465 "Python/bytecodes.c" + #line 1568 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyAttrCache *cache = (_PyAttrCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); PyObject *name = GETITEM(frame->f_code->co_names, oparg>>1); next_instr--; _Py_Specialize_LoadAttr(owner, next_instr, name); @@ -2071,9 +2204,9 @@ NULL | meth | arg1 | ... | argN */ - #line 2075 "Python/generated_cases.c.h" + #line 2208 "Python/generated_cases.c.h" Py_DECREF(owner); - #line 1500 "Python/bytecodes.c" + #line 1602 "Python/bytecodes.c" if (meth == NULL) goto pop_1_error; res2 = NULL; res = meth; @@ -2082,12 +2215,12 @@ else { /* Classic, pushes one value. */ res = PyObject_GetAttr(owner, name); - #line 2086 "Python/generated_cases.c.h" + #line 2219 "Python/generated_cases.c.h" Py_DECREF(owner); - #line 1509 "Python/bytecodes.c" + #line 1611 "Python/bytecodes.c" if (res == NULL) goto pop_1_error; } - #line 2091 "Python/generated_cases.c.h" + #line 2224 "Python/generated_cases.c.h" STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; if (oparg & 1) { stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))] = res2; } @@ -2101,8 +2234,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1514 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 1616 "Python/bytecodes.c" PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, LOAD_ATTR); @@ -2115,7 +2247,7 @@ STAT_INC(LOAD_ATTR, hit); Py_INCREF(res); res2 = NULL; - #line 2119 "Python/generated_cases.c.h" + #line 2251 "Python/generated_cases.c.h" Py_DECREF(owner); STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; @@ -2130,8 +2262,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1531 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 1632 "Python/bytecodes.c" DEOPT_IF(!PyModule_CheckExact(owner), LOAD_ATTR); PyDictObject *dict = (PyDictObject *)((PyModuleObject *)owner)->md_dict; assert(dict != NULL); @@ -2144,7 +2275,7 @@ STAT_INC(LOAD_ATTR, hit); Py_INCREF(res); res2 = NULL; - #line 2148 "Python/generated_cases.c.h" + #line 2279 "Python/generated_cases.c.h" Py_DECREF(owner); STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; @@ -2159,8 +2290,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1548 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 1648 "Python/bytecodes.c" PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, LOAD_ATTR); @@ -2187,7 +2317,7 @@ STAT_INC(LOAD_ATTR, hit); Py_INCREF(res); res2 = NULL; - #line 2191 "Python/generated_cases.c.h" + #line 2321 "Python/generated_cases.c.h" Py_DECREF(owner); STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; @@ -2202,8 +2332,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1579 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 1678 "Python/bytecodes.c" PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, LOAD_ATTR); @@ -2213,7 +2342,7 @@ STAT_INC(LOAD_ATTR, hit); Py_INCREF(res); res2 = NULL; - #line 2217 "Python/generated_cases.c.h" + #line 2346 "Python/generated_cases.c.h" Py_DECREF(owner); STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; @@ -2228,8 +2357,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 1593 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 1691 "Python/bytecodes.c" DEOPT_IF(!PyType_Check(cls), LOAD_ATTR); DEOPT_IF(((PyTypeObject *)cls)->tp_version_tag != type_version, @@ -2241,7 +2369,7 @@ res = descr; assert(res != NULL); Py_INCREF(res); - #line 2245 "Python/generated_cases.c.h" + #line 2373 "Python/generated_cases.c.h" Py_DECREF(cls); STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; @@ -2255,8 +2383,7 @@ uint32_t type_version = read_u32(&next_instr[1].cache); uint32_t func_version = read_u32(&next_instr[3].cache); PyObject *fget = read_obj(&next_instr[5].cache); - #line 1609 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 1706 "Python/bytecodes.c" DEOPT_IF(tstate->interp->eval_frame, LOAD_ATTR); PyTypeObject *cls = Py_TYPE(owner); @@ -2279,7 +2406,7 @@ new_frame->localsplus[0] = owner; JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); DISPATCH_INLINED(new_frame); - #line 2283 "Python/generated_cases.c.h" + #line 2410 "Python/generated_cases.c.h" } TARGET(LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN) { @@ -2287,8 +2414,7 @@ uint32_t type_version = read_u32(&next_instr[1].cache); uint32_t func_version = read_u32(&next_instr[3].cache); PyObject *getattribute = read_obj(&next_instr[5].cache); - #line 1635 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 1731 "Python/bytecodes.c" DEOPT_IF(tstate->interp->eval_frame, LOAD_ATTR); PyTypeObject *cls = Py_TYPE(owner); DEOPT_IF(cls->tp_version_tag != type_version, LOAD_ATTR); @@ -2313,7 +2439,7 @@ new_frame->localsplus[1] = Py_NewRef(name); JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); DISPATCH_INLINED(new_frame); - #line 2317 "Python/generated_cases.c.h" + #line 2443 "Python/generated_cases.c.h" } TARGET(STORE_ATTR_INSTANCE_VALUE) { @@ -2321,8 +2447,7 @@ PyObject *value = stack_pointer[-2]; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1663 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 1758 "Python/bytecodes.c" PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, STORE_ATTR); @@ -2340,7 +2465,7 @@ Py_DECREF(old_value); } Py_DECREF(owner); - #line 2344 "Python/generated_cases.c.h" + #line 2469 "Python/generated_cases.c.h" STACK_SHRINK(2); next_instr += 4; DISPATCH(); @@ -2351,8 +2476,7 @@ PyObject *value = stack_pointer[-2]; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t hint = read_u16(&next_instr[3].cache); - #line 1684 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 1778 "Python/bytecodes.c" PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, STORE_ATTR); @@ -2391,7 +2515,7 @@ /* PEP 509 */ dict->ma_version_tag = new_version; Py_DECREF(owner); - #line 2395 "Python/generated_cases.c.h" + #line 2519 "Python/generated_cases.c.h" STACK_SHRINK(2); next_instr += 4; DISPATCH(); @@ -2402,8 +2526,7 @@ PyObject *value = stack_pointer[-2]; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1726 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 1819 "Python/bytecodes.c" PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, STORE_ATTR); @@ -2413,7 +2536,7 @@ *(PyObject **)addr = value; Py_XDECREF(old_value); Py_DECREF(owner); - #line 2417 "Python/generated_cases.c.h" + #line 2540 "Python/generated_cases.c.h" STACK_SHRINK(2); next_instr += 4; DISPATCH(); @@ -2425,11 +2548,10 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 1746 "Python/bytecodes.c" + #line 1838 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyCompareOpCache *cache = (_PyCompareOpCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); next_instr--; _Py_Specialize_CompareOp(left, right, next_instr, oparg); DISPATCH_SAME_OPARG(); @@ -2439,12 +2561,12 @@ #endif /* ENABLE_SPECIALIZATION */ assert((oparg >> 4) <= Py_GE); res = PyObject_RichCompare(left, right, oparg>>4); - #line 2443 "Python/generated_cases.c.h" + #line 2565 "Python/generated_cases.c.h" Py_DECREF(left); Py_DECREF(right); - #line 1760 "Python/bytecodes.c" + #line 1851 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; - #line 2448 "Python/generated_cases.c.h" + #line 2570 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -2455,8 +2577,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 1764 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 1855 "Python/bytecodes.c" DEOPT_IF(!PyFloat_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyFloat_CheckExact(right), COMPARE_OP); STAT_INC(COMPARE_OP, hit); @@ -2468,7 +2589,7 @@ _Py_DECREF_SPECIALIZED(right, _PyFloat_ExactDealloc); res = (sign_ish & oparg) ? Py_True : Py_False; Py_INCREF(res); - #line 2472 "Python/generated_cases.c.h" + #line 2593 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -2479,8 +2600,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 1780 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 1870 "Python/bytecodes.c" DEOPT_IF(!PyLong_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyLong_CheckExact(right), COMPARE_OP); DEOPT_IF(!_PyLong_IsCompact((PyLongObject *)left), COMPARE_OP); @@ -2496,7 +2616,7 @@ _Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free); res = (sign_ish & oparg) ? Py_True : Py_False; Py_INCREF(res); - #line 2500 "Python/generated_cases.c.h" + #line 2620 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -2507,8 +2627,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 1800 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 1889 "Python/bytecodes.c" DEOPT_IF(!PyUnicode_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyUnicode_CheckExact(right), COMPARE_OP); STAT_INC(COMPARE_OP, hit); @@ -2521,7 +2640,7 @@ assert(COMPARISON_NOT_EQUALS + 1 == COMPARISON_EQUALS); res = ((COMPARISON_NOT_EQUALS + eq) & oparg) ? Py_True : Py_False; Py_INCREF(res); - #line 2525 "Python/generated_cases.c.h" + #line 2644 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -2532,14 +2651,14 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *b; - #line 1816 "Python/bytecodes.c" + #line 1904 "Python/bytecodes.c" int res = Py_Is(left, right) ^ oparg; - #line 2538 "Python/generated_cases.c.h" + #line 2657 "Python/generated_cases.c.h" Py_DECREF(left); Py_DECREF(right); - #line 1818 "Python/bytecodes.c" + #line 1906 "Python/bytecodes.c" b = Py_NewRef(res ? Py_True : Py_False); - #line 2543 "Python/generated_cases.c.h" + #line 2662 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = b; DISPATCH(); @@ -2549,15 +2668,15 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *b; - #line 1822 "Python/bytecodes.c" + #line 1910 "Python/bytecodes.c" int res = PySequence_Contains(right, left); - #line 2555 "Python/generated_cases.c.h" + #line 2674 "Python/generated_cases.c.h" Py_DECREF(left); Py_DECREF(right); - #line 1824 "Python/bytecodes.c" + #line 1912 "Python/bytecodes.c" if (res < 0) goto pop_2_error; b = Py_NewRef((res^oparg) ? Py_True : Py_False); - #line 2561 "Python/generated_cases.c.h" + #line 2680 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = b; DISPATCH(); @@ -2568,12 +2687,12 @@ PyObject *exc_value = stack_pointer[-2]; PyObject *rest; PyObject *match; - #line 1829 "Python/bytecodes.c" + #line 1917 "Python/bytecodes.c" if (check_except_star_type_valid(tstate, match_type) < 0) { - #line 2574 "Python/generated_cases.c.h" + #line 2693 "Python/generated_cases.c.h" Py_DECREF(exc_value); Py_DECREF(match_type); - #line 1831 "Python/bytecodes.c" + #line 1919 "Python/bytecodes.c" if (true) goto pop_2_error; } @@ -2581,10 +2700,10 @@ rest = NULL; int res = exception_group_match(exc_value, match_type, &match, &rest); - #line 2585 "Python/generated_cases.c.h" + #line 2704 "Python/generated_cases.c.h" Py_DECREF(exc_value); Py_DECREF(match_type); - #line 1839 "Python/bytecodes.c" + #line 1927 "Python/bytecodes.c" if (res < 0) goto pop_2_error; assert((match == NULL) == (rest == NULL)); @@ -2593,7 +2712,7 @@ if (!Py_IsNone(match)) { PyErr_SetHandledException(match); } - #line 2597 "Python/generated_cases.c.h" + #line 2716 "Python/generated_cases.c.h" stack_pointer[-1] = match; stack_pointer[-2] = rest; DISPATCH(); @@ -2603,21 +2722,21 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *b; - #line 1850 "Python/bytecodes.c" + #line 1938 "Python/bytecodes.c" assert(PyExceptionInstance_Check(left)); if (check_except_type_valid(tstate, right) < 0) { - #line 2610 "Python/generated_cases.c.h" + #line 2729 "Python/generated_cases.c.h" Py_DECREF(right); - #line 1853 "Python/bytecodes.c" + #line 1941 "Python/bytecodes.c" if (true) goto pop_1_error; } int res = PyErr_GivenExceptionMatches(left, right); - #line 2617 "Python/generated_cases.c.h" + #line 2736 "Python/generated_cases.c.h" Py_DECREF(right); - #line 1858 "Python/bytecodes.c" + #line 1946 "Python/bytecodes.c" b = Py_NewRef(res ? Py_True : Py_False); - #line 2621 "Python/generated_cases.c.h" + #line 2740 "Python/generated_cases.c.h" stack_pointer[-1] = b; DISPATCH(); } @@ -2626,15 +2745,15 @@ PyObject *fromlist = stack_pointer[-1]; PyObject *level = stack_pointer[-2]; PyObject *res; - #line 1862 "Python/bytecodes.c" + #line 1950 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); res = import_name(tstate, frame, name, fromlist, level); - #line 2633 "Python/generated_cases.c.h" + #line 2752 "Python/generated_cases.c.h" Py_DECREF(level); Py_DECREF(fromlist); - #line 1865 "Python/bytecodes.c" + #line 1953 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; - #line 2638 "Python/generated_cases.c.h" + #line 2757 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; DISPATCH(); @@ -2643,29 +2762,29 @@ TARGET(IMPORT_FROM) { PyObject *from = stack_pointer[-1]; PyObject *res; - #line 1869 "Python/bytecodes.c" + #line 1957 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); res = import_from(tstate, from, name); if (res == NULL) goto error; - #line 2651 "Python/generated_cases.c.h" + #line 2770 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; DISPATCH(); } TARGET(JUMP_FORWARD) { - #line 1875 "Python/bytecodes.c" + #line 1963 "Python/bytecodes.c" JUMPBY(oparg); - #line 2660 "Python/generated_cases.c.h" + #line 2779 "Python/generated_cases.c.h" DISPATCH(); } TARGET(JUMP_BACKWARD) { PREDICTED(JUMP_BACKWARD); - #line 1879 "Python/bytecodes.c" + #line 1967 "Python/bytecodes.c" assert(oparg < INSTR_OFFSET()); JUMPBY(-oparg); - #line 2669 "Python/generated_cases.c.h" + #line 2788 "Python/generated_cases.c.h" CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -2673,7 +2792,7 @@ TARGET(POP_JUMP_IF_FALSE) { PREDICTED(POP_JUMP_IF_FALSE); PyObject *cond = stack_pointer[-1]; - #line 1885 "Python/bytecodes.c" + #line 1973 "Python/bytecodes.c" if (Py_IsTrue(cond)) { _Py_DECREF_NO_DEALLOC(cond); } @@ -2683,9 +2802,9 @@ } else { int err = PyObject_IsTrue(cond); - #line 2687 "Python/generated_cases.c.h" + #line 2806 "Python/generated_cases.c.h" Py_DECREF(cond); - #line 1895 "Python/bytecodes.c" + #line 1983 "Python/bytecodes.c" if (err == 0) { JUMPBY(oparg); } @@ -2693,14 +2812,14 @@ if (err < 0) goto pop_1_error; } } - #line 2697 "Python/generated_cases.c.h" + #line 2816 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(POP_JUMP_IF_TRUE) { PyObject *cond = stack_pointer[-1]; - #line 1905 "Python/bytecodes.c" + #line 1993 "Python/bytecodes.c" if (Py_IsFalse(cond)) { _Py_DECREF_NO_DEALLOC(cond); } @@ -2710,9 +2829,9 @@ } else { int err = PyObject_IsTrue(cond); - #line 2714 "Python/generated_cases.c.h" + #line 2833 "Python/generated_cases.c.h" Py_DECREF(cond); - #line 1915 "Python/bytecodes.c" + #line 2003 "Python/bytecodes.c" if (err > 0) { JUMPBY(oparg); } @@ -2720,67 +2839,67 @@ if (err < 0) goto pop_1_error; } } - #line 2724 "Python/generated_cases.c.h" + #line 2843 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(POP_JUMP_IF_NOT_NONE) { PyObject *value = stack_pointer[-1]; - #line 1925 "Python/bytecodes.c" + #line 2013 "Python/bytecodes.c" if (!Py_IsNone(value)) { - #line 2733 "Python/generated_cases.c.h" + #line 2852 "Python/generated_cases.c.h" Py_DECREF(value); - #line 1927 "Python/bytecodes.c" + #line 2015 "Python/bytecodes.c" JUMPBY(oparg); } else { _Py_DECREF_NO_DEALLOC(value); } - #line 2741 "Python/generated_cases.c.h" + #line 2860 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(POP_JUMP_IF_NONE) { PyObject *value = stack_pointer[-1]; - #line 1935 "Python/bytecodes.c" + #line 2023 "Python/bytecodes.c" if (Py_IsNone(value)) { _Py_DECREF_NO_DEALLOC(value); JUMPBY(oparg); } else { - #line 2754 "Python/generated_cases.c.h" + #line 2873 "Python/generated_cases.c.h" Py_DECREF(value); - #line 1941 "Python/bytecodes.c" + #line 2029 "Python/bytecodes.c" } - #line 2758 "Python/generated_cases.c.h" + #line 2877 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(JUMP_BACKWARD_NO_INTERRUPT) { - #line 1945 "Python/bytecodes.c" + #line 2033 "Python/bytecodes.c" /* This bytecode is used in the `yield from` or `await` loop. * If there is an interrupt, we want it handled in the innermost * generator or coroutine, so we deliberately do not check it here. * (see bpo-30039). */ JUMPBY(-oparg); - #line 2771 "Python/generated_cases.c.h" + #line 2890 "Python/generated_cases.c.h" DISPATCH(); } TARGET(GET_LEN) { PyObject *obj = stack_pointer[-1]; PyObject *len_o; - #line 1954 "Python/bytecodes.c" + #line 2042 "Python/bytecodes.c" // PUSH(len(TOS)) Py_ssize_t len_i = PyObject_Length(obj); if (len_i < 0) goto error; len_o = PyLong_FromSsize_t(len_i); if (len_o == NULL) goto error; - #line 2784 "Python/generated_cases.c.h" + #line 2903 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = len_o; DISPATCH(); @@ -2791,16 +2910,16 @@ PyObject *type = stack_pointer[-2]; PyObject *subject = stack_pointer[-3]; PyObject *attrs; - #line 1962 "Python/bytecodes.c" + #line 2050 "Python/bytecodes.c" // Pop TOS and TOS1. Set TOS to a tuple of attributes on success, or // None on failure. assert(PyTuple_CheckExact(names)); attrs = match_class(tstate, subject, type, oparg, names); - #line 2800 "Python/generated_cases.c.h" + #line 2919 "Python/generated_cases.c.h" Py_DECREF(subject); Py_DECREF(type); Py_DECREF(names); - #line 1967 "Python/bytecodes.c" + #line 2055 "Python/bytecodes.c" if (attrs) { assert(PyTuple_CheckExact(attrs)); // Success! } @@ -2808,7 +2927,7 @@ if (_PyErr_Occurred(tstate)) goto pop_3_error; attrs = Py_NewRef(Py_None); // Failure! } - #line 2812 "Python/generated_cases.c.h" + #line 2931 "Python/generated_cases.c.h" STACK_SHRINK(2); stack_pointer[-1] = attrs; DISPATCH(); @@ -2817,10 +2936,10 @@ TARGET(MATCH_MAPPING) { PyObject *subject = stack_pointer[-1]; PyObject *res; - #line 1977 "Python/bytecodes.c" + #line 2065 "Python/bytecodes.c" int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING; res = Py_NewRef(match ? Py_True : Py_False); - #line 2824 "Python/generated_cases.c.h" + #line 2943 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; PREDICT(POP_JUMP_IF_FALSE); @@ -2830,10 +2949,10 @@ TARGET(MATCH_SEQUENCE) { PyObject *subject = stack_pointer[-1]; PyObject *res; - #line 1983 "Python/bytecodes.c" + #line 2071 "Python/bytecodes.c" int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE; res = Py_NewRef(match ? Py_True : Py_False); - #line 2837 "Python/generated_cases.c.h" + #line 2956 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; PREDICT(POP_JUMP_IF_FALSE); @@ -2844,11 +2963,11 @@ PyObject *keys = stack_pointer[-1]; PyObject *subject = stack_pointer[-2]; PyObject *values_or_none; - #line 1989 "Python/bytecodes.c" + #line 2077 "Python/bytecodes.c" // On successful match, PUSH(values). Otherwise, PUSH(None). values_or_none = match_keys(tstate, subject, keys); if (values_or_none == NULL) goto error; - #line 2852 "Python/generated_cases.c.h" + #line 2971 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = values_or_none; DISPATCH(); @@ -2857,14 +2976,14 @@ TARGET(GET_ITER) { PyObject *iterable = stack_pointer[-1]; PyObject *iter; - #line 1995 "Python/bytecodes.c" + #line 2083 "Python/bytecodes.c" /* before: [obj]; after [getiter(obj)] */ iter = PyObject_GetIter(iterable); - #line 2864 "Python/generated_cases.c.h" + #line 2983 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 1998 "Python/bytecodes.c" + #line 2086 "Python/bytecodes.c" if (iter == NULL) goto pop_1_error; - #line 2868 "Python/generated_cases.c.h" + #line 2987 "Python/generated_cases.c.h" stack_pointer[-1] = iter; DISPATCH(); } @@ -2872,7 +2991,7 @@ TARGET(GET_YIELD_FROM_ITER) { PyObject *iterable = stack_pointer[-1]; PyObject *iter; - #line 2002 "Python/bytecodes.c" + #line 2090 "Python/bytecodes.c" /* before: [obj]; after [getiter(obj)] */ if (PyCoro_CheckExact(iterable)) { /* `iterable` is a coroutine */ @@ -2895,11 +3014,11 @@ if (iter == NULL) { goto error; } - #line 2899 "Python/generated_cases.c.h" + #line 3018 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 2025 "Python/bytecodes.c" + #line 2113 "Python/bytecodes.c" } - #line 2903 "Python/generated_cases.c.h" + #line 3022 "Python/generated_cases.c.h" stack_pointer[-1] = iter; PREDICT(LOAD_CONST); DISPATCH(); @@ -2910,11 +3029,10 @@ static_assert(INLINE_CACHE_ENTRIES_FOR_ITER == 1, "incorrect cache size"); PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2044 "Python/bytecodes.c" + #line 2132 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyForIterCache *cache = (_PyForIterCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); next_instr--; _Py_Specialize_ForIter(iter, next_instr, oparg); DISPATCH_SAME_OPARG(); @@ -2929,13 +3047,12 @@ if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) { goto error; } - else if (tstate->c_tracefunc != NULL) { - call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, frame); - } + monitor_raise(tstate, frame, next_instr-1); _PyErr_Clear(tstate); } /* iterator ended normally */ - assert(next_instr[INLINE_CACHE_ENTRIES_FOR_ITER + oparg].op.code == END_FOR); + assert(next_instr[INLINE_CACHE_ENTRIES_FOR_ITER + oparg].op.code == END_FOR || + next_instr[INLINE_CACHE_ENTRIES_FOR_ITER + oparg].op.code == INSTRUMENTED_END_FOR); Py_DECREF(iter); STACK_SHRINK(1); /* Jump forward oparg, then skip following END_FOR instruction */ @@ -2943,18 +3060,48 @@ DISPATCH(); } // Common case: no jump, leave it to the code generator - #line 2947 "Python/generated_cases.c.h" + #line 3064 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = next; next_instr += 1; DISPATCH(); } + TARGET(INSTRUMENTED_FOR_ITER) { + #line 2165 "Python/bytecodes.c" + _Py_CODEUNIT *here = next_instr-1; + _Py_CODEUNIT *target; + PyObject *iter = TOP(); + PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter); + if (next != NULL) { + PUSH(next); + target = next_instr + INLINE_CACHE_ENTRIES_FOR_ITER; + } + else { + if (_PyErr_Occurred(tstate)) { + if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) { + goto error; + } + monitor_raise(tstate, frame, here); + _PyErr_Clear(tstate); + } + /* iterator ended normally */ + assert(next_instr[INLINE_CACHE_ENTRIES_FOR_ITER + oparg].op.code == END_FOR || + next_instr[INLINE_CACHE_ENTRIES_FOR_ITER + oparg].op.code == INSTRUMENTED_END_FOR); + STACK_SHRINK(1); + Py_DECREF(iter); + /* Skip END_FOR */ + target = next_instr + INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1; + } + INSTRUMENTED_JUMP(here, target, PY_MONITORING_EVENT_BRANCH); + #line 3098 "Python/generated_cases.c.h" + DISPATCH(); + } + TARGET(FOR_ITER_LIST) { PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2079 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 2193 "Python/bytecodes.c" DEOPT_IF(Py_TYPE(iter) != &PyListIter_Type, FOR_ITER); _PyListIterObject *it = (_PyListIterObject *)iter; STAT_INC(FOR_ITER, hit); @@ -2974,7 +3121,7 @@ DISPATCH(); end_for_iter_list: // Common case: no jump, leave it to the code generator - #line 2978 "Python/generated_cases.c.h" + #line 3125 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = next; next_instr += 1; @@ -2984,8 +3131,7 @@ TARGET(FOR_ITER_TUPLE) { PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2102 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 2215 "Python/bytecodes.c" _PyTupleIterObject *it = (_PyTupleIterObject *)iter; DEOPT_IF(Py_TYPE(it) != &PyTupleIter_Type, FOR_ITER); STAT_INC(FOR_ITER, hit); @@ -3005,7 +3151,7 @@ DISPATCH(); end_for_iter_tuple: // Common case: no jump, leave it to the code generator - #line 3009 "Python/generated_cases.c.h" + #line 3155 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = next; next_instr += 1; @@ -3015,8 +3161,7 @@ TARGET(FOR_ITER_RANGE) { PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2125 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 2237 "Python/bytecodes.c" _PyRangeIterObject *r = (_PyRangeIterObject *)iter; DEOPT_IF(Py_TYPE(r) != &PyRangeIter_Type, FOR_ITER); STAT_INC(FOR_ITER, hit); @@ -3034,7 +3179,7 @@ if (next == NULL) { goto error; } - #line 3038 "Python/generated_cases.c.h" + #line 3183 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = next; next_instr += 1; @@ -3043,8 +3188,7 @@ TARGET(FOR_ITER_GEN) { PyObject *iter = stack_pointer[-1]; - #line 2146 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 2257 "Python/bytecodes.c" PyGenObject *gen = (PyGenObject *)iter; DEOPT_IF(Py_TYPE(gen) != &PyGen_Type, FOR_ITER); DEOPT_IF(gen->gi_frame_state >= FRAME_EXECUTING, FOR_ITER); @@ -3056,16 +3200,17 @@ gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg); - assert(next_instr->op.code == END_FOR); + assert(next_instr->op.code == END_FOR || + next_instr->op.code == INSTRUMENTED_END_FOR); DISPATCH_INLINED(gen_frame); - #line 3062 "Python/generated_cases.c.h" + #line 3207 "Python/generated_cases.c.h" } TARGET(BEFORE_ASYNC_WITH) { PyObject *mgr = stack_pointer[-1]; PyObject *exit; PyObject *res; - #line 2163 "Python/bytecodes.c" + #line 2274 "Python/bytecodes.c" PyObject *enter = _PyObject_LookupSpecial(mgr, &_Py_ID(__aenter__)); if (enter == NULL) { if (!_PyErr_Occurred(tstate)) { @@ -3088,16 +3233,16 @@ Py_DECREF(enter); goto error; } - #line 3092 "Python/generated_cases.c.h" + #line 3237 "Python/generated_cases.c.h" Py_DECREF(mgr); - #line 2186 "Python/bytecodes.c" + #line 2297 "Python/bytecodes.c" res = _PyObject_CallNoArgs(enter); Py_DECREF(enter); if (res == NULL) { Py_DECREF(exit); if (true) goto pop_1_error; } - #line 3101 "Python/generated_cases.c.h" + #line 3246 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; stack_pointer[-2] = exit; @@ -3109,7 +3254,7 @@ PyObject *mgr = stack_pointer[-1]; PyObject *exit; PyObject *res; - #line 2196 "Python/bytecodes.c" + #line 2307 "Python/bytecodes.c" /* pop the context manager, push its __exit__ and the * value returned from calling its __enter__ */ @@ -3135,16 +3280,16 @@ Py_DECREF(enter); goto error; } - #line 3139 "Python/generated_cases.c.h" + #line 3284 "Python/generated_cases.c.h" Py_DECREF(mgr); - #line 2222 "Python/bytecodes.c" + #line 2333 "Python/bytecodes.c" res = _PyObject_CallNoArgs(enter); Py_DECREF(enter); if (res == NULL) { Py_DECREF(exit); if (true) goto pop_1_error; } - #line 3148 "Python/generated_cases.c.h" + #line 3293 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; stack_pointer[-2] = exit; @@ -3156,7 +3301,7 @@ PyObject *lasti = stack_pointer[-3]; PyObject *exit_func = stack_pointer[-4]; PyObject *res; - #line 2231 "Python/bytecodes.c" + #line 2342 "Python/bytecodes.c" /* At the top of the stack are 4 values: - val: TOP = exc_info() - unused: SECOND = previous exception @@ -3177,7 +3322,7 @@ res = PyObject_Vectorcall(exit_func, stack + 1, 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); if (res == NULL) goto error; - #line 3181 "Python/generated_cases.c.h" + #line 3326 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; DISPATCH(); @@ -3186,7 +3331,7 @@ TARGET(PUSH_EXC_INFO) { PyObject *new_exc = stack_pointer[-1]; PyObject *prev_exc; - #line 2254 "Python/bytecodes.c" + #line 2365 "Python/bytecodes.c" _PyErr_StackItem *exc_info = tstate->exc_info; if (exc_info->exc_value != NULL) { prev_exc = exc_info->exc_value; @@ -3196,7 +3341,7 @@ } assert(PyExceptionInstance_Check(new_exc)); exc_info->exc_value = Py_NewRef(new_exc); - #line 3200 "Python/generated_cases.c.h" + #line 3345 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = new_exc; stack_pointer[-2] = prev_exc; @@ -3210,9 +3355,8 @@ uint32_t type_version = read_u32(&next_instr[1].cache); uint32_t keys_version = read_u32(&next_instr[3].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 2266 "Python/bytecodes.c" + #line 2377 "Python/bytecodes.c" /* Cached method object */ - assert(cframe.use_tracing == 0); PyTypeObject *self_cls = Py_TYPE(self); assert(type_version != 0); DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR); @@ -3228,7 +3372,7 @@ assert(_PyType_HasFeature(Py_TYPE(res2), Py_TPFLAGS_METHOD_DESCRIPTOR)); res = self; assert(oparg & 1); - #line 3232 "Python/generated_cases.c.h" + #line 3376 "Python/generated_cases.c.h" STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; if (oparg & 1) { stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))] = res2; } @@ -3242,8 +3386,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 2286 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 2396 "Python/bytecodes.c" PyTypeObject *self_cls = Py_TYPE(self); DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR); assert(self_cls->tp_dictoffset == 0); @@ -3253,7 +3396,7 @@ res2 = Py_NewRef(descr); res = self; assert(oparg & 1); - #line 3257 "Python/generated_cases.c.h" + #line 3400 "Python/generated_cases.c.h" STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; if (oparg & 1) { stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))] = res2; } @@ -3267,8 +3410,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 2299 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 2408 "Python/bytecodes.c" PyTypeObject *self_cls = Py_TYPE(self); DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR); Py_ssize_t dictoffset = self_cls->tp_dictoffset; @@ -3282,7 +3424,7 @@ res2 = Py_NewRef(descr); res = self; assert(oparg & 1); - #line 3286 "Python/generated_cases.c.h" + #line 3428 "Python/generated_cases.c.h" STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; if (oparg & 1) { stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))] = res2; } @@ -3291,14 +3433,31 @@ } TARGET(KW_NAMES) { - #line 2316 "Python/bytecodes.c" + #line 2424 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg < PyTuple_GET_SIZE(frame->f_code->co_consts)); kwnames = GETITEM(frame->f_code->co_consts, oparg); - #line 3299 "Python/generated_cases.c.h" + #line 3441 "Python/generated_cases.c.h" DISPATCH(); } + TARGET(INSTRUMENTED_CALL) { + #line 2430 "Python/bytecodes.c" + int is_meth = PEEK(oparg+2) != NULL; + int total_args = oparg + is_meth; + PyObject *function = PEEK(total_args + 1); + PyObject *arg = total_args == 0 ? + &_PyInstrumentation_MISSING : PEEK(total_args); + int err = _Py_call_instrumentation_2args( + tstate, PY_MONITORING_EVENT_CALL, + frame, next_instr-1, function, arg); + if (err) goto error; + _PyCallCache *cache = (_PyCallCache *)next_instr; + INCREMENT_ADAPTIVE_COUNTER(cache->counter); + GO_TO_INSTRUCTION(CALL); + #line 3459 "Python/generated_cases.c.h" + } + TARGET(CALL) { PREDICTED(CALL); static_assert(INLINE_CACHE_ENTRIES_CALL == 3, "incorrect cache size"); @@ -3306,7 +3465,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2352 "Python/bytecodes.c" + #line 2475 "Python/bytecodes.c" int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -3317,7 +3476,6 @@ #if ENABLE_SPECIALIZATION _PyCallCache *cache = (_PyCallCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); next_instr--; _Py_Specialize_Call(callable, next_instr, total_args, kwnames); DISPATCH_SAME_OPARG(); @@ -3360,16 +3518,26 @@ DISPATCH_INLINED(new_frame); } /* Callable is not a normal Python function */ - if (cframe.use_tracing) { - res = trace_call_function( - tstate, callable, args, - positional_args, kwnames); - } - else { - res = PyObject_Vectorcall( - callable, args, - positional_args | PY_VECTORCALL_ARGUMENTS_OFFSET, - kwnames); + res = PyObject_Vectorcall( + callable, args, + positional_args | PY_VECTORCALL_ARGUMENTS_OFFSET, + kwnames); + if (opcode == INSTRUMENTED_CALL) { + PyObject *arg = total_args == 0 ? + &_PyInstrumentation_MISSING : PEEK(total_args); + if (res == NULL) { + _Py_call_instrumentation_exc2( + tstate, PY_MONITORING_EVENT_C_RAISE, + frame, next_instr-1, callable, arg); + } + else { + int err = _Py_call_instrumentation_2args( + tstate, PY_MONITORING_EVENT_C_RETURN, + frame, next_instr-1, callable, arg); + if (err < 0) { + Py_CLEAR(res); + } + } } kwnames = NULL; assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); @@ -3378,7 +3546,7 @@ Py_DECREF(args[i]); } if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3382 "Python/generated_cases.c.h" + #line 3550 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3390,7 +3558,7 @@ TARGET(CALL_BOUND_METHOD_EXACT_ARGS) { PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; - #line 2430 "Python/bytecodes.c" + #line 2562 "Python/bytecodes.c" DEOPT_IF(method != NULL, CALL); DEOPT_IF(Py_TYPE(callable) != &PyMethod_Type, CALL); STAT_INC(CALL, hit); @@ -3400,7 +3568,7 @@ PEEK(oparg + 2) = Py_NewRef(meth); // method Py_DECREF(callable); GO_TO_INSTRUCTION(CALL_PY_EXACT_ARGS); - #line 3404 "Python/generated_cases.c.h" + #line 3572 "Python/generated_cases.c.h" } TARGET(CALL_PY_EXACT_ARGS) { @@ -3409,7 +3577,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; uint32_t func_version = read_u32(&next_instr[1].cache); - #line 2442 "Python/bytecodes.c" + #line 2574 "Python/bytecodes.c" assert(kwnames == NULL); DEOPT_IF(tstate->interp->eval_frame, CALL); int is_meth = method != NULL; @@ -3434,7 +3602,7 @@ STACK_SHRINK(oparg + 2); JUMPBY(INLINE_CACHE_ENTRIES_CALL); DISPATCH_INLINED(new_frame); - #line 3438 "Python/generated_cases.c.h" + #line 3606 "Python/generated_cases.c.h" } TARGET(CALL_PY_WITH_DEFAULTS) { @@ -3442,7 +3610,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; uint32_t func_version = read_u32(&next_instr[1].cache); - #line 2469 "Python/bytecodes.c" + #line 2601 "Python/bytecodes.c" assert(kwnames == NULL); DEOPT_IF(tstate->interp->eval_frame, CALL); int is_meth = method != NULL; @@ -3477,7 +3645,7 @@ STACK_SHRINK(oparg + 2); JUMPBY(INLINE_CACHE_ENTRIES_CALL); DISPATCH_INLINED(new_frame); - #line 3481 "Python/generated_cases.c.h" + #line 3649 "Python/generated_cases.c.h" } TARGET(CALL_NO_KW_TYPE_1) { @@ -3485,9 +3653,8 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2506 "Python/bytecodes.c" + #line 2638 "Python/bytecodes.c" assert(kwnames == NULL); - assert(cframe.use_tracing == 0); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); PyObject *obj = args[0]; @@ -3496,7 +3663,7 @@ res = Py_NewRef(Py_TYPE(obj)); Py_DECREF(obj); Py_DECREF(&PyType_Type); // I.e., callable - #line 3500 "Python/generated_cases.c.h" + #line 3667 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3509,9 +3676,8 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2519 "Python/bytecodes.c" + #line 2650 "Python/bytecodes.c" assert(kwnames == NULL); - assert(cframe.use_tracing == 0); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); DEOPT_IF(callable != (PyObject *)&PyUnicode_Type, CALL); @@ -3521,7 +3687,7 @@ Py_DECREF(arg); Py_DECREF(&PyUnicode_Type); // I.e., callable if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3525 "Python/generated_cases.c.h" + #line 3691 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3535,7 +3701,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2534 "Python/bytecodes.c" + #line 2664 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); @@ -3546,7 +3712,7 @@ Py_DECREF(arg); Py_DECREF(&PyTuple_Type); // I.e., tuple if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3550 "Python/generated_cases.c.h" + #line 3716 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3560,7 +3726,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2548 "Python/bytecodes.c" + #line 2678 "Python/bytecodes.c" int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -3582,7 +3748,7 @@ } Py_DECREF(tp); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3586 "Python/generated_cases.c.h" + #line 3752 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3596,8 +3762,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2573 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 2703 "Python/bytecodes.c" /* Builtin METH_O functions */ assert(kwnames == NULL); int is_meth = method != NULL; @@ -3625,7 +3790,7 @@ Py_DECREF(arg); Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3629 "Python/generated_cases.c.h" + #line 3794 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3639,8 +3804,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2605 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 2734 "Python/bytecodes.c" /* Builtin METH_FASTCALL functions, without keywords */ assert(kwnames == NULL); int is_meth = method != NULL; @@ -3672,7 +3836,7 @@ 'invalid'). In those cases an exception is set, so we must handle it. */ - #line 3676 "Python/generated_cases.c.h" + #line 3840 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3686,8 +3850,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2641 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 2769 "Python/bytecodes.c" /* Builtin METH_FASTCALL | METH_KEYWORDS functions */ int is_meth = method != NULL; int total_args = oparg; @@ -3719,7 +3882,7 @@ } Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3723 "Python/generated_cases.c.h" + #line 3886 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3733,8 +3896,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2677 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 2804 "Python/bytecodes.c" assert(kwnames == NULL); /* len(o) */ int is_meth = method != NULL; @@ -3759,7 +3921,7 @@ Py_DECREF(callable); Py_DECREF(arg); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3763 "Python/generated_cases.c.h" + #line 3925 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3772,8 +3934,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2705 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 2831 "Python/bytecodes.c" assert(kwnames == NULL); /* isinstance(o, o2) */ int is_meth = method != NULL; @@ -3800,7 +3961,7 @@ Py_DECREF(cls); Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3804 "Python/generated_cases.c.h" + #line 3965 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3812,8 +3973,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *self = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; - #line 2736 "Python/bytecodes.c" - assert(cframe.use_tracing == 0); + #line 2861 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 1); assert(method != NULL); @@ -3831,14 +3991,14 @@ JUMPBY(INLINE_CACHE_ENTRIES_CALL + 1); assert(next_instr[-1].op.code == POP_TOP); DISPATCH(); - #line 3835 "Python/generated_cases.c.h" + #line 3995 "Python/generated_cases.c.h" } TARGET(CALL_NO_KW_METHOD_DESCRIPTOR_O) { PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2757 "Python/bytecodes.c" + #line 2881 "Python/bytecodes.c" assert(kwnames == NULL); int is_meth = method != NULL; int total_args = oparg; @@ -3869,7 +4029,7 @@ Py_DECREF(arg); Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3873 "Python/generated_cases.c.h" + #line 4033 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3882,7 +4042,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2791 "Python/bytecodes.c" + #line 2915 "Python/bytecodes.c" int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -3911,7 +4071,7 @@ } Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3915 "Python/generated_cases.c.h" + #line 4075 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3924,7 +4084,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2823 "Python/bytecodes.c" + #line 2947 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 0 || oparg == 1); int is_meth = method != NULL; @@ -3953,7 +4113,7 @@ Py_DECREF(self); Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3957 "Python/generated_cases.c.h" + #line 4117 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3966,7 +4126,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2855 "Python/bytecodes.c" + #line 2979 "Python/bytecodes.c" assert(kwnames == NULL); int is_meth = method != NULL; int total_args = oparg; @@ -3994,7 +4154,7 @@ } Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3998 "Python/generated_cases.c.h" + #line 4158 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -4003,18 +4163,22 @@ DISPATCH(); } + TARGET(INSTRUMENTED_CALL_FUNCTION_EX) { + #line 3010 "Python/bytecodes.c" + GO_TO_INSTRUCTION(CALL_FUNCTION_EX); + #line 4170 "Python/generated_cases.c.h" + } + TARGET(CALL_FUNCTION_EX) { PREDICTED(CALL_FUNCTION_EX); PyObject *kwargs = (oparg & 1) ? stack_pointer[-(((oparg & 1) ? 1 : 0))] : NULL; PyObject *callargs = stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))]; PyObject *func = stack_pointer[-(2 + ((oparg & 1) ? 1 : 0))]; PyObject *result; - #line 2886 "Python/bytecodes.c" - if (oparg & 1) { - // DICT_MERGE is called before this opcode if there are kwargs. - // It converts all dict subtypes in kwargs into regular dicts. - assert(PyDict_CheckExact(kwargs)); - } + #line 3014 "Python/bytecodes.c" + // DICT_MERGE is called before this opcode if there are kwargs. + // It converts all dict subtypes in kwargs into regular dicts. + assert(kwargs == NULL || PyDict_CheckExact(kwargs)); if (!PyTuple_CheckExact(callargs)) { if (check_args_iterable(tstate, func, callargs) < 0) { goto error; @@ -4026,17 +4190,42 @@ Py_SETREF(callargs, tuple); } assert(PyTuple_CheckExact(callargs)); - - result = do_call_core(tstate, func, callargs, kwargs, cframe.use_tracing); - #line 4032 "Python/generated_cases.c.h" + EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_FUNCTION_EX, func); + if (opcode == INSTRUMENTED_CALL_FUNCTION_EX && + !PyFunction_Check(func) && !PyMethod_Check(func) + ) { + PyObject *arg = PyTuple_GET_SIZE(callargs) > 0 ? + PyTuple_GET_ITEM(callargs, 0) : Py_None; + int err = _Py_call_instrumentation_2args( + tstate, PY_MONITORING_EVENT_CALL, + frame, next_instr-1, func, arg); + if (err) goto error; + result = PyObject_Call(func, callargs, kwargs); + if (result == NULL) { + _Py_call_instrumentation_exc2( + tstate, PY_MONITORING_EVENT_C_RAISE, + frame, next_instr-1, func, arg); + } + else { + int err = _Py_call_instrumentation_2args( + tstate, PY_MONITORING_EVENT_C_RETURN, + frame, next_instr-1, func, arg); + if (err < 0) { + Py_CLEAR(result); + } + } + } + else { + result = PyObject_Call(func, callargs, kwargs); + } + #line 4222 "Python/generated_cases.c.h" Py_DECREF(func); Py_DECREF(callargs); Py_XDECREF(kwargs); - #line 2905 "Python/bytecodes.c" - + #line 3057 "Python/bytecodes.c" assert(PEEK(3 + (oparg & 1)) == NULL); if (result == NULL) { STACK_SHRINK(((oparg & 1) ? 1 : 0)); goto pop_3_error; } - #line 4040 "Python/generated_cases.c.h" + #line 4229 "Python/generated_cases.c.h" STACK_SHRINK(((oparg & 1) ? 1 : 0)); STACK_SHRINK(2); stack_pointer[-1] = result; @@ -4051,7 +4240,7 @@ PyObject *kwdefaults = (oparg & 0x02) ? stack_pointer[-(1 + ((oparg & 0x08) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0))] : NULL; PyObject *defaults = (oparg & 0x01) ? stack_pointer[-(1 + ((oparg & 0x08) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0) + ((oparg & 0x01) ? 1 : 0))] : NULL; PyObject *func; - #line 2916 "Python/bytecodes.c" + #line 3067 "Python/bytecodes.c" PyFunctionObject *func_obj = (PyFunctionObject *) PyFunction_New(codeobj, GLOBALS()); @@ -4080,14 +4269,14 @@ func_obj->func_version = ((PyCodeObject *)codeobj)->co_version; func = (PyObject *)func_obj; - #line 4084 "Python/generated_cases.c.h" + #line 4273 "Python/generated_cases.c.h" STACK_SHRINK(((oparg & 0x01) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x08) ? 1 : 0)); stack_pointer[-1] = func; DISPATCH(); } TARGET(RETURN_GENERATOR) { - #line 2947 "Python/bytecodes.c" + #line 3098 "Python/bytecodes.c" assert(PyFunction_Check(frame->f_funcobj)); PyFunctionObject *func = (PyFunctionObject *)frame->f_funcobj; PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func); @@ -4108,7 +4297,7 @@ frame = cframe.current_frame = prev; _PyFrame_StackPush(frame, (PyObject *)gen); goto resume_frame; - #line 4112 "Python/generated_cases.c.h" + #line 4301 "Python/generated_cases.c.h" } TARGET(BUILD_SLICE) { @@ -4116,15 +4305,15 @@ PyObject *stop = stack_pointer[-(1 + ((oparg == 3) ? 1 : 0))]; PyObject *start = stack_pointer[-(2 + ((oparg == 3) ? 1 : 0))]; PyObject *slice; - #line 2970 "Python/bytecodes.c" + #line 3121 "Python/bytecodes.c" slice = PySlice_New(start, stop, step); - #line 4122 "Python/generated_cases.c.h" + #line 4311 "Python/generated_cases.c.h" Py_DECREF(start); Py_DECREF(stop); Py_XDECREF(step); - #line 2972 "Python/bytecodes.c" + #line 3123 "Python/bytecodes.c" if (slice == NULL) { STACK_SHRINK(((oparg == 3) ? 1 : 0)); goto pop_2_error; } - #line 4128 "Python/generated_cases.c.h" + #line 4317 "Python/generated_cases.c.h" STACK_SHRINK(((oparg == 3) ? 1 : 0)); STACK_SHRINK(1); stack_pointer[-1] = slice; @@ -4135,7 +4324,7 @@ PyObject *fmt_spec = ((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? stack_pointer[-((((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0))] : NULL; PyObject *value = stack_pointer[-(1 + (((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0))]; PyObject *result; - #line 2976 "Python/bytecodes.c" + #line 3127 "Python/bytecodes.c" /* Handles f-string value formatting. */ PyObject *(*conv_fn)(PyObject *); int which_conversion = oparg & FVC_MASK; @@ -4170,7 +4359,7 @@ Py_DECREF(value); Py_XDECREF(fmt_spec); if (result == NULL) { STACK_SHRINK((((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0)); goto pop_1_error; } - #line 4174 "Python/generated_cases.c.h" + #line 4363 "Python/generated_cases.c.h" STACK_SHRINK((((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0)); stack_pointer[-1] = result; DISPATCH(); @@ -4179,10 +4368,10 @@ TARGET(COPY) { PyObject *bottom = stack_pointer[-(1 + (oparg-1))]; PyObject *top; - #line 3013 "Python/bytecodes.c" + #line 3164 "Python/bytecodes.c" assert(oparg > 0); top = Py_NewRef(bottom); - #line 4186 "Python/generated_cases.c.h" + #line 4375 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = top; DISPATCH(); @@ -4194,11 +4383,10 @@ PyObject *rhs = stack_pointer[-1]; PyObject *lhs = stack_pointer[-2]; PyObject *res; - #line 3018 "Python/bytecodes.c" + #line 3169 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyBinaryOpCache *cache = (_PyBinaryOpCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { - assert(cframe.use_tracing == 0); next_instr--; _Py_Specialize_BinaryOp(lhs, rhs, next_instr, oparg, &GETLOCAL(0)); DISPATCH_SAME_OPARG(); @@ -4210,12 +4398,12 @@ assert((unsigned)oparg < Py_ARRAY_LENGTH(binary_ops)); assert(binary_ops[oparg]); res = binary_ops[oparg](lhs, rhs); - #line 4214 "Python/generated_cases.c.h" + #line 4402 "Python/generated_cases.c.h" Py_DECREF(lhs); Py_DECREF(rhs); - #line 3034 "Python/bytecodes.c" + #line 3184 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; - #line 4219 "Python/generated_cases.c.h" + #line 4407 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -4225,27 +4413,153 @@ TARGET(SWAP) { PyObject *top = stack_pointer[-1]; PyObject *bottom = stack_pointer[-(2 + (oparg-2))]; - #line 3039 "Python/bytecodes.c" + #line 3189 "Python/bytecodes.c" assert(oparg >= 2); - #line 4231 "Python/generated_cases.c.h" + #line 4419 "Python/generated_cases.c.h" stack_pointer[-1] = bottom; stack_pointer[-(2 + (oparg-2))] = top; DISPATCH(); } + TARGET(INSTRUMENTED_LINE) { + #line 3193 "Python/bytecodes.c" + _Py_CODEUNIT *here = next_instr-1; + _PyFrame_SetStackPointer(frame, stack_pointer); + int original_opcode = _Py_call_instrumentation_line( + tstate, frame, here); + stack_pointer = _PyFrame_GetStackPointer(frame); + if (original_opcode < 0) { + next_instr = here+1; + goto error; + } + next_instr = frame->prev_instr; + if (next_instr != here) { + DISPATCH(); + } + if (_PyOpcode_Caches[original_opcode]) { + _PyBinaryOpCache *cache = (_PyBinaryOpCache *)(next_instr+1); + INCREMENT_ADAPTIVE_COUNTER(cache->counter); + } + opcode = original_opcode; + DISPATCH_GOTO(); + #line 4446 "Python/generated_cases.c.h" + } + + TARGET(INSTRUMENTED_INSTRUCTION) { + #line 3215 "Python/bytecodes.c" + int next_opcode = _Py_call_instrumentation_instruction( + tstate, frame, next_instr-1); + if (next_opcode < 0) goto error; + next_instr--; + if (_PyOpcode_Caches[next_opcode]) { + _PyBinaryOpCache *cache = (_PyBinaryOpCache *)(next_instr+1); + INCREMENT_ADAPTIVE_COUNTER(cache->counter); + } + assert(next_opcode > 0 && next_opcode < 256); + opcode = next_opcode; + DISPATCH_GOTO(); + #line 4462 "Python/generated_cases.c.h" + } + + TARGET(INSTRUMENTED_JUMP_FORWARD) { + #line 3229 "Python/bytecodes.c" + INSTRUMENTED_JUMP(next_instr-1, next_instr+oparg, PY_MONITORING_EVENT_JUMP); + #line 4468 "Python/generated_cases.c.h" + DISPATCH(); + } + + TARGET(INSTRUMENTED_JUMP_BACKWARD) { + #line 3233 "Python/bytecodes.c" + INSTRUMENTED_JUMP(next_instr-1, next_instr-oparg, PY_MONITORING_EVENT_JUMP); + #line 4475 "Python/generated_cases.c.h" + CHECK_EVAL_BREAKER(); + DISPATCH(); + } + + TARGET(INSTRUMENTED_POP_JUMP_IF_TRUE) { + #line 3238 "Python/bytecodes.c" + PyObject *cond = POP(); + int err = PyObject_IsTrue(cond); + Py_DECREF(cond); + if (err < 0) goto error; + _Py_CODEUNIT *here = next_instr-1; + assert(err == 0 || err == 1); + int offset = err*oparg; + INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); + #line 4490 "Python/generated_cases.c.h" + DISPATCH(); + } + + TARGET(INSTRUMENTED_POP_JUMP_IF_FALSE) { + #line 3249 "Python/bytecodes.c" + PyObject *cond = POP(); + int err = PyObject_IsTrue(cond); + Py_DECREF(cond); + if (err < 0) goto error; + _Py_CODEUNIT *here = next_instr-1; + assert(err == 0 || err == 1); + int offset = (1-err)*oparg; + INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); + #line 4504 "Python/generated_cases.c.h" + DISPATCH(); + } + + TARGET(INSTRUMENTED_POP_JUMP_IF_NONE) { + #line 3260 "Python/bytecodes.c" + PyObject *value = POP(); + _Py_CODEUNIT *here = next_instr-1; + int offset; + if (Py_IsNone(value)) { + _Py_DECREF_NO_DEALLOC(value); + offset = oparg; + } + else { + Py_DECREF(value); + offset = 0; + } + INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); + #line 4522 "Python/generated_cases.c.h" + DISPATCH(); + } + + TARGET(INSTRUMENTED_POP_JUMP_IF_NOT_NONE) { + #line 3275 "Python/bytecodes.c" + PyObject *value = POP(); + _Py_CODEUNIT *here = next_instr-1; + int offset; + if (Py_IsNone(value)) { + _Py_DECREF_NO_DEALLOC(value); + offset = 0; + } + else { + Py_DECREF(value); + offset = oparg; + } + INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); + #line 4540 "Python/generated_cases.c.h" + DISPATCH(); + } + TARGET(EXTENDED_ARG) { - #line 3043 "Python/bytecodes.c" + #line 3290 "Python/bytecodes.c" assert(oparg); - assert(cframe.use_tracing == 0); opcode = next_instr->op.code; oparg = oparg << 8 | next_instr->op.arg; PRE_DISPATCH_GOTO(); DISPATCH_GOTO(); - #line 4245 "Python/generated_cases.c.h" + #line 4551 "Python/generated_cases.c.h" } TARGET(CACHE) { - #line 3052 "Python/bytecodes.c" + #line 3298 "Python/bytecodes.c" + assert(0 && "Executing a cache."); + Py_UNREACHABLE(); + #line 4558 "Python/generated_cases.c.h" + } + + TARGET(RESERVED) { + #line 3303 "Python/bytecodes.c" + assert(0 && "Executing RESERVED instruction."); Py_UNREACHABLE(); - #line 4251 "Python/generated_cases.c.h" + #line 4565 "Python/generated_cases.c.h" } diff --git a/Python/instrumentation.c b/Python/instrumentation.c new file mode 100644 index 00000000000000..39a7eaa3bd2d42 --- /dev/null +++ b/Python/instrumentation.c @@ -0,0 +1,2021 @@ + + +#include "Python.h" +#include "pycore_call.h" +#include "pycore_frame.h" +#include "pycore_interp.h" +#include "pycore_long.h" +#include "pycore_namespace.h" +#include "pycore_object.h" +#include "pycore_opcode.h" +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" + +/* Uncomment this to dump debugging output when assertions fail */ +// #define INSTRUMENT_DEBUG 1 + +static PyObject DISABLE = +{ + _PyObject_IMMORTAL_REFCNT, + &PyBaseObject_Type +}; + +PyObject _PyInstrumentation_MISSING = +{ + _PyObject_IMMORTAL_REFCNT, + &PyBaseObject_Type +}; + +static const int8_t EVENT_FOR_OPCODE[256] = { + [RETURN_CONST] = PY_MONITORING_EVENT_PY_RETURN, + [INSTRUMENTED_RETURN_CONST] = PY_MONITORING_EVENT_PY_RETURN, + [RETURN_VALUE] = PY_MONITORING_EVENT_PY_RETURN, + [INSTRUMENTED_RETURN_VALUE] = PY_MONITORING_EVENT_PY_RETURN, + [CALL] = PY_MONITORING_EVENT_CALL, + [INSTRUMENTED_CALL] = PY_MONITORING_EVENT_CALL, + [CALL_FUNCTION_EX] = PY_MONITORING_EVENT_CALL, + [INSTRUMENTED_CALL_FUNCTION_EX] = PY_MONITORING_EVENT_CALL, + [RESUME] = -1, + [YIELD_VALUE] = PY_MONITORING_EVENT_PY_YIELD, + [INSTRUMENTED_YIELD_VALUE] = PY_MONITORING_EVENT_PY_YIELD, + [JUMP_FORWARD] = PY_MONITORING_EVENT_JUMP, + [JUMP_BACKWARD] = PY_MONITORING_EVENT_JUMP, + [POP_JUMP_IF_FALSE] = PY_MONITORING_EVENT_BRANCH, + [POP_JUMP_IF_TRUE] = PY_MONITORING_EVENT_BRANCH, + [POP_JUMP_IF_NONE] = PY_MONITORING_EVENT_BRANCH, + [POP_JUMP_IF_NOT_NONE] = PY_MONITORING_EVENT_BRANCH, + [INSTRUMENTED_JUMP_FORWARD] = PY_MONITORING_EVENT_JUMP, + [INSTRUMENTED_JUMP_BACKWARD] = PY_MONITORING_EVENT_JUMP, + [INSTRUMENTED_POP_JUMP_IF_FALSE] = PY_MONITORING_EVENT_BRANCH, + [INSTRUMENTED_POP_JUMP_IF_TRUE] = PY_MONITORING_EVENT_BRANCH, + [INSTRUMENTED_POP_JUMP_IF_NONE] = PY_MONITORING_EVENT_BRANCH, + [INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = PY_MONITORING_EVENT_BRANCH, + [FOR_ITER] = PY_MONITORING_EVENT_BRANCH, + [INSTRUMENTED_FOR_ITER] = PY_MONITORING_EVENT_BRANCH, + [END_FOR] = PY_MONITORING_EVENT_STOP_ITERATION, + [INSTRUMENTED_END_FOR] = PY_MONITORING_EVENT_STOP_ITERATION, + [END_SEND] = PY_MONITORING_EVENT_STOP_ITERATION, + [INSTRUMENTED_END_SEND] = PY_MONITORING_EVENT_STOP_ITERATION, +}; + +static const uint8_t DE_INSTRUMENT[256] = { + [INSTRUMENTED_RESUME] = RESUME, + [INSTRUMENTED_RETURN_VALUE] = RETURN_VALUE, + [INSTRUMENTED_RETURN_CONST] = RETURN_CONST, + [INSTRUMENTED_CALL] = CALL, + [INSTRUMENTED_CALL_FUNCTION_EX] = CALL_FUNCTION_EX, + [INSTRUMENTED_YIELD_VALUE] = YIELD_VALUE, + [INSTRUMENTED_JUMP_FORWARD] = JUMP_FORWARD, + [INSTRUMENTED_JUMP_BACKWARD] = JUMP_BACKWARD, + [INSTRUMENTED_POP_JUMP_IF_FALSE] = POP_JUMP_IF_FALSE, + [INSTRUMENTED_POP_JUMP_IF_TRUE] = POP_JUMP_IF_TRUE, + [INSTRUMENTED_POP_JUMP_IF_NONE] = POP_JUMP_IF_NONE, + [INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = POP_JUMP_IF_NOT_NONE, + [INSTRUMENTED_FOR_ITER] = FOR_ITER, + [INSTRUMENTED_END_FOR] = END_FOR, + [INSTRUMENTED_END_SEND] = END_SEND, +}; + +static const uint8_t INSTRUMENTED_OPCODES[256] = { + [RETURN_CONST] = INSTRUMENTED_RETURN_CONST, + [INSTRUMENTED_RETURN_CONST] = INSTRUMENTED_RETURN_CONST, + [RETURN_VALUE] = INSTRUMENTED_RETURN_VALUE, + [INSTRUMENTED_RETURN_VALUE] = INSTRUMENTED_RETURN_VALUE, + [CALL] = INSTRUMENTED_CALL, + [INSTRUMENTED_CALL] = INSTRUMENTED_CALL, + [CALL_FUNCTION_EX] = INSTRUMENTED_CALL_FUNCTION_EX, + [INSTRUMENTED_CALL_FUNCTION_EX] = INSTRUMENTED_CALL_FUNCTION_EX, + [YIELD_VALUE] = INSTRUMENTED_YIELD_VALUE, + [INSTRUMENTED_YIELD_VALUE] = INSTRUMENTED_YIELD_VALUE, + [RESUME] = INSTRUMENTED_RESUME, + [INSTRUMENTED_RESUME] = INSTRUMENTED_RESUME, + [JUMP_FORWARD] = INSTRUMENTED_JUMP_FORWARD, + [INSTRUMENTED_JUMP_FORWARD] = INSTRUMENTED_JUMP_FORWARD, + [JUMP_BACKWARD] = INSTRUMENTED_JUMP_BACKWARD, + [INSTRUMENTED_JUMP_BACKWARD] = INSTRUMENTED_JUMP_BACKWARD, + [POP_JUMP_IF_FALSE] = INSTRUMENTED_POP_JUMP_IF_FALSE, + [INSTRUMENTED_POP_JUMP_IF_FALSE] = INSTRUMENTED_POP_JUMP_IF_FALSE, + [POP_JUMP_IF_TRUE] = INSTRUMENTED_POP_JUMP_IF_TRUE, + [INSTRUMENTED_POP_JUMP_IF_TRUE] = INSTRUMENTED_POP_JUMP_IF_TRUE, + [POP_JUMP_IF_NONE] = INSTRUMENTED_POP_JUMP_IF_NONE, + [INSTRUMENTED_POP_JUMP_IF_NONE] = INSTRUMENTED_POP_JUMP_IF_NONE, + [POP_JUMP_IF_NOT_NONE] = INSTRUMENTED_POP_JUMP_IF_NOT_NONE, + [INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = INSTRUMENTED_POP_JUMP_IF_NOT_NONE, + [END_FOR] = INSTRUMENTED_END_FOR, + [INSTRUMENTED_END_FOR] = INSTRUMENTED_END_FOR, + [END_SEND] = INSTRUMENTED_END_SEND, + [INSTRUMENTED_END_SEND] = INSTRUMENTED_END_SEND, + + [INSTRUMENTED_LINE] = INSTRUMENTED_LINE, + [INSTRUMENTED_INSTRUCTION] = INSTRUMENTED_INSTRUCTION, +}; + +static inline bool +opcode_has_event(int opcode) { + return opcode < INSTRUMENTED_LINE && + INSTRUMENTED_OPCODES[opcode] > 0; +} + +static inline bool +is_instrumented(int opcode) { + assert(opcode != 0); + assert(opcode != RESERVED); + return opcode >= MIN_INSTRUMENTED_OPCODE; +} + +static inline bool +monitors_equals(_Py_Monitors a, _Py_Monitors b) +{ + for (int i = 0; i < PY_MONITORING_UNGROUPED_EVENTS; i++) { + if (a.tools[i] != b.tools[i]) { + return false; + } + } + return true; +} + +static inline _Py_Monitors +monitors_sub(_Py_Monitors a, _Py_Monitors b) +{ + _Py_Monitors res; + for (int i = 0; i < PY_MONITORING_UNGROUPED_EVENTS; i++) { + res.tools[i] = a.tools[i] & ~b.tools[i]; + } + return res; +} + +static inline _Py_Monitors +monitors_and(_Py_Monitors a, _Py_Monitors b) +{ + _Py_Monitors res; + for (int i = 0; i < PY_MONITORING_UNGROUPED_EVENTS; i++) { + res.tools[i] = a.tools[i] & b.tools[i]; + } + return res; +} + +static inline _Py_Monitors +monitors_or(_Py_Monitors a, _Py_Monitors b) +{ + _Py_Monitors res; + for (int i = 0; i < PY_MONITORING_UNGROUPED_EVENTS; i++) { + res.tools[i] = a.tools[i] | b.tools[i]; + } + return res; +} + +static inline bool +monitors_are_empty(_Py_Monitors m) +{ + for (int i = 0; i < PY_MONITORING_UNGROUPED_EVENTS; i++) { + if (m.tools[i]) { + return false; + } + } + return true; +} + +static inline bool +multiple_tools(_Py_Monitors *m) +{ + for (int i = 0; i < PY_MONITORING_UNGROUPED_EVENTS; i++) { + if (_Py_popcount32(m->tools[i]) > 1) { + return true; + } + } + return false; +} + +static inline _PyMonitoringEventSet +get_events(_Py_Monitors *m, int tool_id) +{ + _PyMonitoringEventSet result = 0; + for (int e = 0; e < PY_MONITORING_UNGROUPED_EVENTS; e++) { + if ((m->tools[e] >> tool_id) & 1) { + result |= (1 << e); + } + } + return result; +} + +/* Line delta. + * 8 bit value. + * if line_delta == -128: + * line = None # represented as -1 + * elif line_delta == -127: + * line = PyCode_Addr2Line(code, offset * sizeof(_Py_CODEUNIT)); + * else: + * line = first_line + (offset >> OFFSET_SHIFT) + line_delta; + */ + +#define NO_LINE -128 +#define COMPUTED_LINE -127 + +#define OFFSET_SHIFT 4 + +static int8_t +compute_line_delta(PyCodeObject *code, int offset, int line) +{ + if (line < 0) { + return NO_LINE; + } + int delta = line - code->co_firstlineno - (offset >> OFFSET_SHIFT); + if (delta <= INT8_MAX && delta > COMPUTED_LINE) { + return delta; + } + return COMPUTED_LINE; +} + +static int +compute_line(PyCodeObject *code, int offset, int8_t line_delta) +{ + if (line_delta > COMPUTED_LINE) { + return code->co_firstlineno + (offset >> OFFSET_SHIFT) + line_delta; + } + if (line_delta == NO_LINE) { + + return -1; + } + assert(line_delta == COMPUTED_LINE); + /* Look it up */ + return PyCode_Addr2Line(code, offset * sizeof(_Py_CODEUNIT)); +} + +static int +instruction_length(PyCodeObject *code, int offset) +{ + int opcode = _PyCode_CODE(code)[offset].op.code; + assert(opcode != 0); + assert(opcode != RESERVED); + if (opcode == INSTRUMENTED_LINE) { + opcode = code->_co_monitoring->lines[offset].original_opcode; + } + if (opcode == INSTRUMENTED_INSTRUCTION) { + opcode = code->_co_monitoring->per_instruction_opcodes[offset]; + } + int deinstrumented = DE_INSTRUMENT[opcode]; + if (deinstrumented) { + opcode = deinstrumented; + } + else { + opcode = _PyOpcode_Deopt[opcode]; + } + assert(opcode != 0); + assert(!is_instrumented(opcode)); + assert(opcode == _PyOpcode_Deopt[opcode]); + return 1 + _PyOpcode_Caches[opcode]; +} + +#ifdef INSTRUMENT_DEBUG + +static void +dump_instrumentation_data_tools(PyCodeObject *code, uint8_t *tools, int i, FILE*out) +{ + if (tools == NULL) { + fprintf(out, "tools = NULL"); + } + else { + fprintf(out, "tools = %d", tools[i]); + } +} + +static void +dump_instrumentation_data_lines(PyCodeObject *code, _PyCoLineInstrumentationData *lines, int i, FILE*out) +{ + if (lines == NULL) { + fprintf(out, ", lines = NULL"); + } + else if (lines[i].original_opcode == 0) { + fprintf(out, ", lines = {original_opcode = No LINE (0), line_delta = %d)", lines[i].line_delta); + } + else { + fprintf(out, ", lines = {original_opcode = %s, line_delta = %d)", _PyOpcode_OpName[lines[i].original_opcode], lines[i].line_delta); + } +} + +static void +dump_instrumentation_data_line_tools(PyCodeObject *code, uint8_t *line_tools, int i, FILE*out) +{ + if (line_tools == NULL) { + fprintf(out, ", line_tools = NULL"); + } + else { + fprintf(out, ", line_tools = %d", line_tools[i]); + } +} + +static void +dump_instrumentation_data_per_instruction(PyCodeObject *code, _PyCoMonitoringData *data, int i, FILE*out) +{ + if (data->per_instruction_opcodes == NULL) { + fprintf(out, ", per-inst opcode = NULL"); + } + else { + fprintf(out, ", per-inst opcode = %s", _PyOpcode_OpName[data->per_instruction_opcodes[i]]); + } + if (data->per_instruction_tools == NULL) { + fprintf(out, ", per-inst tools = NULL"); + } + else { + fprintf(out, ", per-inst tools = %d", data->per_instruction_tools[i]); + } +} + +static void +dump_monitors(const char *prefix, _Py_Monitors monitors, FILE*out) +{ + fprintf(out, "%s monitors:\n", prefix); + for (int event = 0; event < PY_MONITORING_UNGROUPED_EVENTS; event++) { + fprintf(out, " Event %d: Tools %x\n", event, monitors.tools[event]); + } +} + +/* Like _Py_GetBaseOpcode but without asserts. + * Does its best to give the right answer, but won't abort + * if something is wrong */ +int get_base_opcode_best_attempt(PyCodeObject *code, int offset) +{ + int opcode = _Py_OPCODE(_PyCode_CODE(code)[offset]); + if (INSTRUMENTED_OPCODES[opcode] != opcode) { + /* Not instrumented */ + return _PyOpcode_Deopt[opcode] == 0 ? opcode : _PyOpcode_Deopt[opcode]; + } + if (opcode == INSTRUMENTED_INSTRUCTION) { + if (code->_co_monitoring->per_instruction_opcodes[offset] == 0) { + return opcode; + } + opcode = code->_co_monitoring->per_instruction_opcodes[offset]; + } + if (opcode == INSTRUMENTED_LINE) { + if (code->_co_monitoring->lines[offset].original_opcode == 0) { + return opcode; + } + opcode = code->_co_monitoring->lines[offset].original_opcode; + } + int deinstrumented = DE_INSTRUMENT[opcode]; + if (deinstrumented) { + return deinstrumented; + } + if (_PyOpcode_Deopt[opcode] == 0) { + return opcode; + } + return _PyOpcode_Deopt[opcode]; +} + +/* No error checking -- Don't use this for anything but experimental debugging */ +static void +dump_instrumentation_data(PyCodeObject *code, int star, FILE*out) +{ + _PyCoMonitoringData *data = code->_co_monitoring; + fprintf(out, "\n"); + PyObject_Print(code->co_name, out, Py_PRINT_RAW); + fprintf(out, "\n"); + if (data == NULL) { + fprintf(out, "NULL\n"); + return; + } + dump_monitors("Global", PyInterpreterState_Get()->monitors, out); + dump_monitors("Code", data->local_monitors, out); + dump_monitors("Active", data->active_monitors, out); + int code_len = (int)Py_SIZE(code); + bool starred = false; + for (int i = 0; i < code_len; i += instruction_length(code, i)) { + _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; + int opcode = instr->op.code; + if (i == star) { + fprintf(out, "** "); + starred = true; + } + fprintf(out, "Offset: %d, line: %d %s: ", i, PyCode_Addr2Line(code, i*2), _PyOpcode_OpName[opcode]); + dump_instrumentation_data_tools(code, data->tools, i, out); + dump_instrumentation_data_lines(code, data->lines, i, out); + dump_instrumentation_data_line_tools(code, data->line_tools, i, out); + dump_instrumentation_data_per_instruction(code, data, i, out); + fprintf(out, "\n"); + ; + } + if (!starred && star >= 0) { + fprintf(out, "Error offset not at valid instruction offset: %d\n", star); + fprintf(out, " "); + dump_instrumentation_data_tools(code, data->tools, star, out); + dump_instrumentation_data_lines(code, data->lines, star, out); + dump_instrumentation_data_line_tools(code, data->line_tools, star, out); + dump_instrumentation_data_per_instruction(code, data, star, out); + fprintf(out, "\n"); + } +} + +#define CHECK(test) do { \ + if (!(test)) { \ + dump_instrumentation_data(code, i, stderr); \ + } \ + assert(test); \ +} while (0) + +bool valid_opcode(int opcode) { + if (opcode > 0 && + opcode != RESERVED && + opcode < 255 && + _PyOpcode_OpName[opcode] && + _PyOpcode_OpName[opcode][0] != '<' + ) { + return true; + } + return false; +} + +static void +sanity_check_instrumentation(PyCodeObject *code) +{ + _PyCoMonitoringData *data = code->_co_monitoring; + if (data == NULL) { + return; + } + _Py_Monitors active_monitors = PyInterpreterState_Get()->monitors; + if (code->_co_monitoring) { + _Py_Monitors local_monitors = code->_co_monitoring->local_monitors; + active_monitors = monitors_or(active_monitors, local_monitors); + } + assert(monitors_equals( + code->_co_monitoring->active_monitors, + active_monitors) + ); + int code_len = (int)Py_SIZE(code); + for (int i = 0; i < code_len;) { + int opcode = _PyCode_CODE(code)[i].op.code; + int base_opcode = _Py_GetBaseOpcode(code, i); + CHECK(valid_opcode(opcode)); + CHECK(valid_opcode(base_opcode)); + if (opcode == INSTRUMENTED_INSTRUCTION) { + opcode = data->per_instruction_opcodes[i]; + if (!is_instrumented(opcode)) { + CHECK(_PyOpcode_Deopt[opcode] == opcode); + } + if (data->per_instruction_tools) { + uint8_t tools = active_monitors.tools[PY_MONITORING_EVENT_INSTRUCTION]; + CHECK((tools & data->per_instruction_tools[i]) == data->per_instruction_tools[i]); + } + } + if (opcode == INSTRUMENTED_LINE) { + CHECK(data->lines); + CHECK(valid_opcode(data->lines[i].original_opcode)); + opcode = data->lines[i].original_opcode; + CHECK(opcode != END_FOR); + CHECK(opcode != RESUME); + CHECK(opcode != INSTRUMENTED_RESUME); + if (!is_instrumented(opcode)) { + CHECK(_PyOpcode_Deopt[opcode] == opcode); + } + CHECK(opcode != INSTRUMENTED_LINE); + } + else if (data->lines && !is_instrumented(opcode)) { + CHECK(data->lines[i].original_opcode == 0 || + data->lines[i].original_opcode == base_opcode || + DE_INSTRUMENT[data->lines[i].original_opcode] == base_opcode); + } + if (is_instrumented(opcode)) { + CHECK(DE_INSTRUMENT[opcode] == base_opcode); + int event = EVENT_FOR_OPCODE[DE_INSTRUMENT[opcode]]; + if (event < 0) { + /* RESUME fixup */ + event = _PyCode_CODE(code)[i].op.arg; + } + CHECK(active_monitors.tools[event] != 0); + } + if (data->lines && base_opcode != END_FOR) { + int line1 = compute_line(code, i, data->lines[i].line_delta); + int line2 = PyCode_Addr2Line(code, i*sizeof(_Py_CODEUNIT)); + CHECK(line1 == line2); + } + CHECK(valid_opcode(opcode)); + if (data->tools) { + uint8_t local_tools = data->tools[i]; + if (opcode_has_event(base_opcode)) { + int event = EVENT_FOR_OPCODE[base_opcode]; + if (event == -1) { + /* RESUME fixup */ + event = _PyCode_CODE(code)[i].op.arg; + } + CHECK((active_monitors.tools[event] & local_tools) == local_tools); + } + else { + CHECK(local_tools == 0xff); + } + } + i += instruction_length(code, i); + assert(i <= code_len); + } +} +#else + +#define CHECK(test) assert(test) + +#endif + +/* Get the underlying opcode, stripping instrumentation */ +int _Py_GetBaseOpcode(PyCodeObject *code, int i) +{ + int opcode = _PyCode_CODE(code)[i].op.code; + if (opcode == INSTRUMENTED_LINE) { + opcode = code->_co_monitoring->lines[i].original_opcode; + } + if (opcode == INSTRUMENTED_INSTRUCTION) { + opcode = code->_co_monitoring->per_instruction_opcodes[i]; + } + CHECK(opcode != INSTRUMENTED_INSTRUCTION); + CHECK(opcode != INSTRUMENTED_LINE); + int deinstrumented = DE_INSTRUMENT[opcode]; + if (deinstrumented) { + return deinstrumented; + } + return _PyOpcode_Deopt[opcode]; +} + +static void +de_instrument(PyCodeObject *code, int i, int event) +{ + assert(event != PY_MONITORING_EVENT_INSTRUCTION); + assert(event != PY_MONITORING_EVENT_LINE); + + _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; + uint8_t *opcode_ptr = &instr->op.code; + int opcode = *opcode_ptr; + if (opcode == INSTRUMENTED_LINE) { + opcode_ptr = &code->_co_monitoring->lines[i].original_opcode; + opcode = *opcode_ptr; + } + if (opcode == INSTRUMENTED_INSTRUCTION) { + opcode_ptr = &code->_co_monitoring->per_instruction_opcodes[i]; + opcode = *opcode_ptr; + } + int deinstrumented = DE_INSTRUMENT[opcode]; + if (deinstrumented == 0) { + return; + } + CHECK(_PyOpcode_Deopt[deinstrumented] == deinstrumented); + *opcode_ptr = deinstrumented; + if (_PyOpcode_Caches[deinstrumented]) { + instr[1].cache = adaptive_counter_warmup(); + } +} + +static void +de_instrument_line(PyCodeObject *code, int i) +{ + _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; + uint8_t *opcode_ptr = &instr->op.code; + int opcode =*opcode_ptr; + if (opcode != INSTRUMENTED_LINE) { + return; + } + _PyCoLineInstrumentationData *lines = &code->_co_monitoring->lines[i]; + int original_opcode = lines->original_opcode; + CHECK(original_opcode != 0); + CHECK(original_opcode == _PyOpcode_Deopt[original_opcode]); + *opcode_ptr = instr->op.code = original_opcode; + if (_PyOpcode_Caches[original_opcode]) { + instr[1].cache = adaptive_counter_warmup(); + } + assert(*opcode_ptr != INSTRUMENTED_LINE); + assert(instr->op.code != INSTRUMENTED_LINE); +} + + +static void +de_instrument_per_instruction(PyCodeObject *code, int i) +{ + _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; + uint8_t *opcode_ptr = &instr->op.code; + int opcode =*opcode_ptr; + if (opcode == INSTRUMENTED_LINE) { + opcode_ptr = &code->_co_monitoring->lines[i].original_opcode; + opcode = *opcode_ptr; + } + if (opcode != INSTRUMENTED_INSTRUCTION) { + return; + } + int original_opcode = code->_co_monitoring->per_instruction_opcodes[i]; + CHECK(original_opcode != 0); + CHECK(original_opcode == _PyOpcode_Deopt[original_opcode]); + instr->op.code = original_opcode; + if (_PyOpcode_Caches[original_opcode]) { + instr[1].cache = adaptive_counter_warmup(); + } + assert(instr->op.code != INSTRUMENTED_INSTRUCTION); + /* Keep things clean for sanity check */ + code->_co_monitoring->per_instruction_opcodes[i] = 0; +} + + +static void +instrument(PyCodeObject *code, int i) +{ + _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; + uint8_t *opcode_ptr = &instr->op.code; + int opcode =*opcode_ptr; + if (opcode == INSTRUMENTED_LINE) { + _PyCoLineInstrumentationData *lines = &code->_co_monitoring->lines[i]; + opcode_ptr = &lines->original_opcode; + opcode = *opcode_ptr; + } + if (opcode == INSTRUMENTED_INSTRUCTION) { + opcode_ptr = &code->_co_monitoring->per_instruction_opcodes[i]; + opcode = *opcode_ptr; + CHECK(!is_instrumented(opcode)); + CHECK(opcode == _PyOpcode_Deopt[opcode]); + } + CHECK(opcode != 0); + if (!is_instrumented(opcode)) { + int deopt = _PyOpcode_Deopt[opcode]; + int instrumented = INSTRUMENTED_OPCODES[deopt]; + assert(instrumented); + *opcode_ptr = instrumented; + if (_PyOpcode_Caches[deopt]) { + instr[1].cache = adaptive_counter_warmup(); + } + } +} + +static void +instrument_line(PyCodeObject *code, int i) +{ + uint8_t *opcode_ptr = &_PyCode_CODE(code)[i].op.code; + int opcode =*opcode_ptr; + if (opcode == INSTRUMENTED_LINE) { + return; + } + _PyCoLineInstrumentationData *lines = &code->_co_monitoring->lines[i]; + lines->original_opcode = _PyOpcode_Deopt[opcode]; + CHECK(lines->original_opcode > 0); + *opcode_ptr = INSTRUMENTED_LINE; +} + +static void +instrument_per_instruction(PyCodeObject *code, int i) +{ + _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; + uint8_t *opcode_ptr = &instr->op.code; + int opcode =*opcode_ptr; + if (opcode == INSTRUMENTED_LINE) { + _PyCoLineInstrumentationData *lines = &code->_co_monitoring->lines[i]; + opcode_ptr = &lines->original_opcode; + opcode = *opcode_ptr; + } + if (opcode == INSTRUMENTED_INSTRUCTION) { + return; + } + CHECK(opcode != 0); + if (is_instrumented(opcode)) { + code->_co_monitoring->per_instruction_opcodes[i] = opcode; + } + else { + assert(opcode != 0); + assert(_PyOpcode_Deopt[opcode] != 0); + assert(_PyOpcode_Deopt[opcode] != RESUME); + code->_co_monitoring->per_instruction_opcodes[i] = _PyOpcode_Deopt[opcode]; + } + assert(code->_co_monitoring->per_instruction_opcodes[i] > 0); + *opcode_ptr = INSTRUMENTED_INSTRUCTION; +} + +#ifndef NDEBUG +static bool +instruction_has_event(PyCodeObject *code, int offset) +{ + _Py_CODEUNIT instr = _PyCode_CODE(code)[offset]; + int opcode = instr.op.code; + if (opcode == INSTRUMENTED_LINE) { + opcode = code->_co_monitoring->lines[offset].original_opcode; + } + if (opcode == INSTRUMENTED_INSTRUCTION) { + opcode = code->_co_monitoring->per_instruction_opcodes[offset]; + } + return opcode_has_event(opcode); +} +#endif + +static void +remove_tools(PyCodeObject * code, int offset, int event, int tools) +{ + assert(event != PY_MONITORING_EVENT_LINE); + assert(event != PY_MONITORING_EVENT_INSTRUCTION); + assert(event < PY_MONITORING_INSTRUMENTED_EVENTS); + assert(instruction_has_event(code, offset)); + _PyCoMonitoringData *monitoring = code->_co_monitoring; + if (monitoring && monitoring->tools) { + monitoring->tools[offset] &= ~tools; + if (monitoring->tools[offset] == 0) { + de_instrument(code, offset, event); + } + } + else { + /* Single tool */ + uint8_t single_tool = code->_co_monitoring->active_monitors.tools[event]; + assert(_Py_popcount32(single_tool) <= 1); + if (((single_tool & tools) == single_tool)) { + de_instrument(code, offset, event); + } + } +} + +#ifndef NDEBUG +static bool +tools_is_subset_for_event(PyCodeObject * code, int event, int tools) +{ + int global_tools = PyInterpreterState_Get()->monitors.tools[event]; + int local_tools = code->_co_monitoring->local_monitors.tools[event]; + return tools == ((global_tools | local_tools) & tools); +} +#endif + +static void +remove_line_tools(PyCodeObject * code, int offset, int tools) +{ + assert(code->_co_monitoring); + if (code->_co_monitoring->line_tools) + { + uint8_t *toolsptr = &code->_co_monitoring->line_tools[offset]; + *toolsptr &= ~tools; + if (*toolsptr == 0 ) { + de_instrument_line(code, offset); + } + } + else { + /* Single tool */ + uint8_t single_tool = code->_co_monitoring->active_monitors.tools[PY_MONITORING_EVENT_LINE]; + assert(_Py_popcount32(single_tool) <= 1); + if (((single_tool & tools) == single_tool)) { + de_instrument_line(code, offset); + } + } +} + +static void +add_tools(PyCodeObject * code, int offset, int event, int tools) +{ + assert(event != PY_MONITORING_EVENT_LINE); + assert(event != PY_MONITORING_EVENT_INSTRUCTION); + assert(event < PY_MONITORING_INSTRUMENTED_EVENTS); + assert(code->_co_monitoring); + if (code->_co_monitoring && + code->_co_monitoring->tools + ) { + code->_co_monitoring->tools[offset] |= tools; + } + else { + /* Single tool */ + assert(_Py_popcount32(tools) == 1); + assert(tools_is_subset_for_event(code, event, tools)); + } + instrument(code, offset); +} + +static void +add_line_tools(PyCodeObject * code, int offset, int tools) +{ + assert(tools_is_subset_for_event(code, PY_MONITORING_EVENT_LINE, tools)); + assert(code->_co_monitoring); + if (code->_co_monitoring->line_tools + ) { + code->_co_monitoring->line_tools[offset] |= tools; + } + else { + /* Single tool */ + assert(_Py_popcount32(tools) == 1); + } + instrument_line(code, offset); +} + + +static void +add_per_instruction_tools(PyCodeObject * code, int offset, int tools) +{ + assert(tools_is_subset_for_event(code, PY_MONITORING_EVENT_INSTRUCTION, tools)); + assert(code->_co_monitoring); + if (code->_co_monitoring->per_instruction_tools + ) { + code->_co_monitoring->per_instruction_tools[offset] |= tools; + } + else { + /* Single tool */ + assert(_Py_popcount32(tools) == 1); + } + instrument_per_instruction(code, offset); +} + + +static void +remove_per_instruction_tools(PyCodeObject * code, int offset, int tools) +{ + assert(code->_co_monitoring); + if (code->_co_monitoring->per_instruction_tools) + { + uint8_t *toolsptr = &code->_co_monitoring->per_instruction_tools[offset]; + *toolsptr &= ~tools; + if (*toolsptr == 0 ) { + de_instrument_per_instruction(code, offset); + } + } + else { + /* Single tool */ + uint8_t single_tool = code->_co_monitoring->active_monitors.tools[PY_MONITORING_EVENT_INSTRUCTION]; + assert(_Py_popcount32(single_tool) <= 1); + if (((single_tool & tools) == single_tool)) { + de_instrument_per_instruction(code, offset); + } + } +} + + +/* Return 1 if DISABLE returned, -1 if error, 0 otherwise */ +static int +call_one_instrument( + PyInterpreterState *interp, PyThreadState *tstate, PyObject **args, + Py_ssize_t nargsf, int8_t tool, int event) +{ + assert(0 <= tool && tool < 8); + assert(tstate->tracing == 0); + PyObject *instrument = interp->monitoring_callables[tool][event]; + if (instrument == NULL) { + return 0; + } + int old_what = tstate->what_event; + tstate->what_event = event; + tstate->tracing++; + PyObject *res = _PyObject_VectorcallTstate(tstate, instrument, args, nargsf, NULL); + tstate->tracing--; + tstate->what_event = old_what; + if (res == NULL) { + return -1; + } + Py_DECREF(res); + return (res == &DISABLE); +} + +static const int8_t MOST_SIGNIFICANT_BITS[16] = { + -1, 0, 1, 1, + 2, 2, 2, 2, + 3, 3, 3, 3, + 3, 3, 3, 3, +}; + +/* We could use _Py_bit_length here, but that is designed for larger (32/64) bit ints, + and can perform relatively poorly on platforms without the necessary intrinsics. */ +static inline int most_significant_bit(uint8_t bits) { + assert(bits != 0); + if (bits > 15) { + return MOST_SIGNIFICANT_BITS[bits>>4]+4; + } + else { + return MOST_SIGNIFICANT_BITS[bits]; + } +} + +static bool +is_version_up_to_date(PyCodeObject *code, PyInterpreterState *interp) +{ + return interp->monitoring_version == code->_co_instrumentation_version; +} + +#ifndef NDEBUG +static bool +instrumentation_cross_checks(PyInterpreterState *interp, PyCodeObject *code) +{ + _Py_Monitors expected = monitors_or( + interp->monitors, + code->_co_monitoring->local_monitors); + return monitors_equals(code->_co_monitoring->active_monitors, expected); +} +#endif + +static inline uint8_t +get_tools_for_instruction(PyCodeObject * code, int i, int event) +{ + uint8_t tools; + assert(event != PY_MONITORING_EVENT_LINE); + assert(event != PY_MONITORING_EVENT_INSTRUCTION); + assert(instrumentation_cross_checks(PyThreadState_GET()->interp, code)); + _PyCoMonitoringData *monitoring = code->_co_monitoring; + if (event >= PY_MONITORING_UNGROUPED_EVENTS) { + assert(event == PY_MONITORING_EVENT_C_RAISE || + event == PY_MONITORING_EVENT_C_RETURN); + event = PY_MONITORING_EVENT_CALL; + } + if (event < PY_MONITORING_INSTRUMENTED_EVENTS && monitoring->tools) { + tools = monitoring->tools[i]; + } + else { + tools = code->_co_monitoring->active_monitors.tools[event]; + } + CHECK(tools_is_subset_for_event(code, event, tools)); + CHECK((tools & code->_co_monitoring->active_monitors.tools[event]) == tools); + return tools; +} + +static int +call_instrumentation_vector( + PyThreadState *tstate, int event, + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr, Py_ssize_t nargs, PyObject *args[]) +{ + if (tstate->tracing) { + return 0; + } + assert(!_PyErr_Occurred(tstate)); + assert(args[0] == NULL); + PyCodeObject *code = frame->f_code; + assert(code->_co_instrumentation_version == tstate->interp->monitoring_version); + assert(is_version_up_to_date(code, tstate->interp)); + assert(instrumentation_cross_checks(tstate->interp, code)); + assert(args[1] == NULL); + args[1] = (PyObject *)code; + int offset = (int)(instr - _PyCode_CODE(code)); + /* Offset visible to user should be the offset in bytes, as that is the + * convention for APIs involving code offsets. */ + int bytes_offset = offset * (int)sizeof(_Py_CODEUNIT); + PyObject *offset_obj = PyLong_FromSsize_t(bytes_offset); + if (offset_obj == NULL) { + return -1; + } + assert(args[2] == NULL); + args[2] = offset_obj; + uint8_t tools = get_tools_for_instruction(code, offset, event); + Py_ssize_t nargsf = nargs | PY_VECTORCALL_ARGUMENTS_OFFSET; + PyObject **callargs = &args[1]; + int err = 0; + PyInterpreterState *interp = tstate->interp; + while (tools) { + int tool = most_significant_bit(tools); + assert(tool >= 0 && tool < 8); + assert(tools & (1 << tool)); + tools ^= (1 << tool); + int res = call_one_instrument(interp, tstate, callargs, nargsf, tool, event); + if (res == 0) { + /* Nothing to do */ + } + else if (res < 0) { + /* error */ + err = -1; + break; + } + else { + /* DISABLE */ + remove_tools(code, offset, event, 1 << tool); + } + } + Py_DECREF(offset_obj); + return err; +} + +int +_Py_call_instrumentation( + PyThreadState *tstate, int event, + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr) +{ + PyObject *args[3] = { NULL, NULL, NULL }; + return call_instrumentation_vector(tstate, event, frame, instr, 2, args); +} + +int +_Py_call_instrumentation_arg( + PyThreadState *tstate, int event, + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg) +{ + PyObject *args[4] = { NULL, NULL, NULL, arg }; + return call_instrumentation_vector(tstate, event, frame, instr, 3, args); +} + +int +_Py_call_instrumentation_2args( + PyThreadState *tstate, int event, + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg0, PyObject *arg1) +{ + PyObject *args[5] = { NULL, NULL, NULL, arg0, arg1 }; + return call_instrumentation_vector(tstate, event, frame, instr, 4, args); +} + +int +_Py_call_instrumentation_jump( + PyThreadState *tstate, int event, + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr, _Py_CODEUNIT *target +) { + assert(event == PY_MONITORING_EVENT_JUMP || + event == PY_MONITORING_EVENT_BRANCH); + assert(frame->prev_instr == instr); + frame->prev_instr = target; + PyCodeObject *code = frame->f_code; + int to = (int)(target - _PyCode_CODE(code)); + PyObject *to_obj = PyLong_FromLong(to * (int)sizeof(_Py_CODEUNIT)); + if (to_obj == NULL) { + return -1; + } + PyObject *args[4] = { NULL, NULL, NULL, to_obj }; + int err = call_instrumentation_vector(tstate, event, frame, instr, 3, args); + Py_DECREF(to_obj); + return err; +} + +static void +call_instrumentation_vector_protected( + PyThreadState *tstate, int event, + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr, Py_ssize_t nargs, PyObject *args[]) +{ + assert(_PyErr_Occurred(tstate)); + PyObject *exc = _PyErr_GetRaisedException(tstate); + int err = call_instrumentation_vector(tstate, event, frame, instr, nargs, args); + if (err) { + Py_XDECREF(exc); + } + else { + _PyErr_SetRaisedException(tstate, exc); + } + assert(_PyErr_Occurred(tstate)); +} + +void +_Py_call_instrumentation_exc0( + PyThreadState *tstate, int event, + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr) +{ + assert(_PyErr_Occurred(tstate)); + PyObject *args[3] = { NULL, NULL, NULL }; + call_instrumentation_vector_protected(tstate, event, frame, instr, 2, args); +} + +void +_Py_call_instrumentation_exc2( + PyThreadState *tstate, int event, + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg0, PyObject *arg1) +{ + assert(_PyErr_Occurred(tstate)); + PyObject *args[5] = { NULL, NULL, NULL, arg0, arg1 }; + call_instrumentation_vector_protected(tstate, event, frame, instr, 4, args); +} + + +int +_Py_Instrumentation_GetLine(PyCodeObject *code, int index) +{ + _PyCoMonitoringData *monitoring = code->_co_monitoring; + assert(monitoring != NULL); + assert(monitoring->lines != NULL); + assert(index >= code->_co_firsttraceable); + assert(index < Py_SIZE(code)); + _PyCoLineInstrumentationData *line_data = &monitoring->lines[index]; + int8_t line_delta = line_data->line_delta; + int line = compute_line(code, index, line_delta); + return line; +} + +int +_Py_call_instrumentation_line(PyThreadState *tstate, _PyInterpreterFrame* frame, _Py_CODEUNIT *instr) +{ + frame->prev_instr = instr; + PyCodeObject *code = frame->f_code; + assert(is_version_up_to_date(code, tstate->interp)); + assert(instrumentation_cross_checks(tstate->interp, code)); + int i = (int)(instr - _PyCode_CODE(code)); + _PyCoMonitoringData *monitoring = code->_co_monitoring; + _PyCoLineInstrumentationData *line_data = &monitoring->lines[i]; + uint8_t original_opcode = line_data->original_opcode; + if (tstate->tracing) { + goto done; + } + PyInterpreterState *interp = tstate->interp; + int8_t line_delta = line_data->line_delta; + int line = compute_line(code, i, line_delta); + uint8_t tools = code->_co_monitoring->line_tools != NULL ? + code->_co_monitoring->line_tools[i] : + (interp->monitors.tools[PY_MONITORING_EVENT_LINE] | + code->_co_monitoring->local_monitors.tools[PY_MONITORING_EVENT_LINE] + ); + PyObject *line_obj = PyLong_FromSsize_t(line); + if (line_obj == NULL) { + return -1; + } + PyObject *args[3] = { NULL, (PyObject *)code, line_obj }; + while (tools) { + int tool = most_significant_bit(tools); + assert(tool >= 0 && tool < 8); + assert(tools & (1 << tool)); + tools &= ~(1 << tool); + int res = call_one_instrument(interp, tstate, &args[1], + 2 | PY_VECTORCALL_ARGUMENTS_OFFSET, + tool, PY_MONITORING_EVENT_LINE); + if (res == 0) { + /* Nothing to do */ + } + else if (res < 0) { + /* error */ + Py_DECREF(line_obj); + return -1; + } + else { + /* DISABLE */ + remove_line_tools(code, i, 1 << tool); + } + } + Py_DECREF(line_obj); +done: + assert(original_opcode != 0); + assert(original_opcode < INSTRUMENTED_LINE); + assert(_PyOpcode_Deopt[original_opcode] == original_opcode); + return original_opcode; +} + +int +_Py_call_instrumentation_instruction(PyThreadState *tstate, _PyInterpreterFrame* frame, _Py_CODEUNIT *instr) +{ + PyCodeObject *code = frame->f_code; + assert(is_version_up_to_date(code, tstate->interp)); + assert(instrumentation_cross_checks(tstate->interp, code)); + int offset = (int)(instr - _PyCode_CODE(code)); + _PyCoMonitoringData *instrumentation_data = code->_co_monitoring; + assert(instrumentation_data->per_instruction_opcodes); + int next_opcode = instrumentation_data->per_instruction_opcodes[offset]; + if (tstate->tracing) { + return next_opcode; + } + PyInterpreterState *interp = tstate->interp; + uint8_t tools = instrumentation_data->per_instruction_tools != NULL ? + instrumentation_data->per_instruction_tools[offset] : + (interp->monitors.tools[PY_MONITORING_EVENT_INSTRUCTION] | + code->_co_monitoring->local_monitors.tools[PY_MONITORING_EVENT_INSTRUCTION] + ); + int bytes_offset = offset * (int)sizeof(_Py_CODEUNIT); + PyObject *offset_obj = PyLong_FromSsize_t(bytes_offset); + if (offset_obj == NULL) { + return -1; + } + PyObject *args[3] = { NULL, (PyObject *)code, offset_obj }; + while (tools) { + int tool = most_significant_bit(tools); + assert(tool >= 0 && tool < 8); + assert(tools & (1 << tool)); + tools &= ~(1 << tool); + int res = call_one_instrument(interp, tstate, &args[1], + 2 | PY_VECTORCALL_ARGUMENTS_OFFSET, + tool, PY_MONITORING_EVENT_INSTRUCTION); + if (res == 0) { + /* Nothing to do */ + } + else if (res < 0) { + /* error */ + Py_DECREF(offset_obj); + return -1; + } + else { + /* DISABLE */ + remove_per_instruction_tools(code, offset, 1 << tool); + } + } + Py_DECREF(offset_obj); + assert(next_opcode != 0); + return next_opcode; +} + + +PyObject * +_PyMonitoring_RegisterCallback(int tool_id, int event_id, PyObject *obj) +{ + PyInterpreterState *is = _PyInterpreterState_Get(); + assert(0 <= tool_id && tool_id < PY_MONITORING_TOOL_IDS); + assert(0 <= event_id && event_id < PY_MONITORING_EVENTS); + PyObject *callback = is->monitoring_callables[tool_id][event_id]; + is->monitoring_callables[tool_id][event_id] = Py_XNewRef(obj); + return callback; +} + +static void +initialize_tools(PyCodeObject *code) +{ + uint8_t* tools = code->_co_monitoring->tools; + assert(tools != NULL); + int code_len = (int)Py_SIZE(code); + for (int i = 0; i < code_len; i++) { + _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; + int opcode = instr->op.code; + if (opcode == INSTRUMENTED_LINE) { + opcode = code->_co_monitoring->lines[i].original_opcode; + } + bool instrumented = is_instrumented(opcode); + if (instrumented) { + opcode = DE_INSTRUMENT[opcode]; + assert(opcode != 0); + } + opcode = _PyOpcode_Deopt[opcode]; + if (opcode_has_event(opcode)) { + if (instrumented) { + int8_t event; + if (opcode == RESUME) { + event = instr->op.arg != 0; + } + else { + event = EVENT_FOR_OPCODE[opcode]; + assert(event > 0); + } + assert(event >= 0); + assert(event < PY_MONITORING_INSTRUMENTED_EVENTS); + tools[i] = code->_co_monitoring->active_monitors.tools[event]; + CHECK(tools[i] != 0); + } + else { + tools[i] = 0; + } + } +#ifdef Py_DEBUG + /* Initialize tools for invalid locations to all ones to try to catch errors */ + else { + tools[i] = 0xff; + } + for (int j = 1; j <= _PyOpcode_Caches[opcode]; j++) { + tools[i+j] = 0xff; + } +#endif + i += _PyOpcode_Caches[opcode]; + } +} + +#define NO_LINE -128 + +static void +initialize_lines(PyCodeObject *code) +{ + _PyCoLineInstrumentationData *line_data = code->_co_monitoring->lines; + assert(line_data != NULL); + int code_len = (int)Py_SIZE(code); + PyCodeAddressRange range; + _PyCode_InitAddressRange(code, &range); + for (int i = 0; i < code->_co_firsttraceable && i < code_len; i++) { + line_data[i].original_opcode = 0; + line_data[i].line_delta = -127; + } + int current_line = -1; + for (int i = code->_co_firsttraceable; i < code_len; ) { + int opcode = _Py_GetBaseOpcode(code, i); + int line = _PyCode_CheckLineNumber(i*(int)sizeof(_Py_CODEUNIT), &range); + line_data[i].line_delta = compute_line_delta(code, i, line); + int length = instruction_length(code, i); + switch (opcode) { + case END_ASYNC_FOR: + case END_FOR: + case END_SEND: + case RESUME: + /* END_FOR cannot start a line, as it is skipped by FOR_ITER + * END_SEND cannot start a line, as it is skipped by SEND + * RESUME must not be instrumented with INSTRUMENT_LINE */ + line_data[i].original_opcode = 0; + break; + default: + if (line != current_line && line >= 0) { + line_data[i].original_opcode = opcode; + } + else { + line_data[i].original_opcode = 0; + } + if (line >= 0) { + current_line = line; + } + } + for (int j = 1; j < length; j++) { + line_data[i+j].original_opcode = 0; + line_data[i+j].line_delta = NO_LINE; + } + switch (opcode) { + case RETURN_VALUE: + case RAISE_VARARGS: + case RERAISE: + /* Blocks of code after these terminators + * should be treated as different lines */ + current_line = -1; + } + i += length; + } +} + +static void +initialize_line_tools(PyCodeObject *code, _Py_Monitors *all_events) +{ + uint8_t *line_tools = code->_co_monitoring->line_tools; + assert(line_tools != NULL); + int code_len = (int)Py_SIZE(code); + for (int i = 0; i < code_len; i++) { + line_tools[i] = all_events->tools[PY_MONITORING_EVENT_LINE]; + } +} + +static +int allocate_instrumentation_data(PyCodeObject *code) +{ + + if (code->_co_monitoring == NULL) { + code->_co_monitoring = PyMem_Malloc(sizeof(_PyCoMonitoringData)); + if (code->_co_monitoring == NULL) { + PyErr_NoMemory(); + return -1; + } + code->_co_monitoring->local_monitors = (_Py_Monitors){ 0 }; + code->_co_monitoring->active_monitors = (_Py_Monitors){ 0 }; + code->_co_monitoring->tools = NULL; + code->_co_monitoring->lines = NULL; + code->_co_monitoring->line_tools = NULL; + code->_co_monitoring->per_instruction_opcodes = NULL; + code->_co_monitoring->per_instruction_tools = NULL; + } + return 0; +} + +static int +update_instrumentation_data(PyCodeObject *code, PyInterpreterState *interp) +{ + int code_len = (int)Py_SIZE(code); + if (allocate_instrumentation_data(code)) { + return -1; + } + _Py_Monitors all_events = monitors_or( + interp->monitors, + code->_co_monitoring->local_monitors); + bool multitools = multiple_tools(&all_events); + if (code->_co_monitoring->tools == NULL && multitools) { + code->_co_monitoring->tools = PyMem_Malloc(code_len); + if (code->_co_monitoring->tools == NULL) { + PyErr_NoMemory(); + return -1; + } + initialize_tools(code); + } + if (all_events.tools[PY_MONITORING_EVENT_LINE]) { + if (code->_co_monitoring->lines == NULL) { + code->_co_monitoring->lines = PyMem_Malloc(code_len * sizeof(_PyCoLineInstrumentationData)); + if (code->_co_monitoring->lines == NULL) { + PyErr_NoMemory(); + return -1; + } + initialize_lines(code); + } + if (multitools && code->_co_monitoring->line_tools == NULL) { + code->_co_monitoring->line_tools = PyMem_Malloc(code_len); + if (code->_co_monitoring->line_tools == NULL) { + PyErr_NoMemory(); + return -1; + } + initialize_line_tools(code, &all_events); + } + } + if (all_events.tools[PY_MONITORING_EVENT_INSTRUCTION]) { + if (code->_co_monitoring->per_instruction_opcodes == NULL) { + code->_co_monitoring->per_instruction_opcodes = PyMem_Malloc(code_len * sizeof(_PyCoLineInstrumentationData)); + if (code->_co_monitoring->per_instruction_opcodes == NULL) { + PyErr_NoMemory(); + return -1; + } + /* This may not be necessary, as we can initialize this memory lazily, but it helps catch errors. */ + for (int i = 0; i < code_len; i++) { + code->_co_monitoring->per_instruction_opcodes[i] = 0; + } + } + if (multitools && code->_co_monitoring->per_instruction_tools == NULL) { + code->_co_monitoring->per_instruction_tools = PyMem_Malloc(code_len); + if (code->_co_monitoring->per_instruction_tools == NULL) { + PyErr_NoMemory(); + return -1; + } + /* This may not be necessary, as we can initialize this memory lazily, but it helps catch errors. */ + for (int i = 0; i < code_len; i++) { + code->_co_monitoring->per_instruction_tools[i] = 0; + } + } + } + return 0; +} + +static const uint8_t super_instructions[256] = { + [LOAD_FAST__LOAD_FAST] = 1, + [LOAD_FAST__LOAD_CONST] = 1, + [STORE_FAST__LOAD_FAST] = 1, + [STORE_FAST__STORE_FAST] = 1, + [LOAD_CONST__LOAD_FAST] = 1, +}; + +/* Should use instruction metadata for this */ +static bool +is_super_instruction(int opcode) { + return super_instructions[opcode] != 0; +} + +int +_Py_Instrument(PyCodeObject *code, PyInterpreterState *interp) +{ + + if (is_version_up_to_date(code, interp)) { + assert( + interp->monitoring_version == 0 || + instrumentation_cross_checks(interp, code) + ); + return 0; + } + int code_len = (int)Py_SIZE(code); + if (update_instrumentation_data(code, interp)) { + return -1; + } + _Py_Monitors active_events = monitors_or( + interp->monitors, + code->_co_monitoring->local_monitors); + _Py_Monitors new_events; + _Py_Monitors removed_events; + + bool restarted = interp->last_restart_version > code->_co_instrumentation_version; + if (restarted) { + removed_events = code->_co_monitoring->active_monitors; + new_events = active_events; + } + else { + removed_events = monitors_sub(code->_co_monitoring->active_monitors, active_events); + new_events = monitors_sub(active_events, code->_co_monitoring->active_monitors); + assert(monitors_are_empty(monitors_and(new_events, removed_events))); + } + code->_co_monitoring->active_monitors = active_events; + code->_co_instrumentation_version = interp->monitoring_version; + if (monitors_are_empty(new_events) && monitors_are_empty(removed_events)) { +#ifdef INSTRUMENT_DEBUG + sanity_check_instrumentation(code); +#endif + return 0; + } + /* Insert instrumentation */ + for (int i = 0; i < code_len; i+= instruction_length(code, i)) { + _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; + if (is_super_instruction(instr->op.code)) { + instr->op.code = _PyOpcode_Deopt[instr->op.code]; + } + CHECK(instr->op.code != 0); + int base_opcode = _Py_GetBaseOpcode(code, i); + if (opcode_has_event(base_opcode)) { + int8_t event; + if (base_opcode == RESUME) { + event = instr->op.arg > 0; + } + else { + event = EVENT_FOR_OPCODE[base_opcode]; + assert(event > 0); + } + uint8_t removed_tools = removed_events.tools[event]; + if (removed_tools) { + remove_tools(code, i, event, removed_tools); + } + uint8_t new_tools = new_events.tools[event]; + if (new_tools) { + add_tools(code, i, event, new_tools); + } + } + } + uint8_t new_line_tools = new_events.tools[PY_MONITORING_EVENT_LINE]; + uint8_t removed_line_tools = removed_events.tools[PY_MONITORING_EVENT_LINE]; + if (new_line_tools | removed_line_tools) { + _PyCoLineInstrumentationData *line_data = code->_co_monitoring->lines; + for (int i = code->_co_firsttraceable; i < code_len;) { + if (line_data[i].original_opcode) { + if (removed_line_tools) { + remove_line_tools(code, i, removed_line_tools); + } + if (new_line_tools) { + add_line_tools(code, i, new_line_tools); + } + } + i += instruction_length(code, i); + } + } + uint8_t new_per_instruction_tools = new_events.tools[PY_MONITORING_EVENT_INSTRUCTION]; + uint8_t removed_per_instruction_tools = removed_events.tools[PY_MONITORING_EVENT_INSTRUCTION]; + if (new_per_instruction_tools | removed_per_instruction_tools) { + for (int i = code->_co_firsttraceable; i < code_len;) { + int opcode = _Py_GetBaseOpcode(code, i); + if (opcode == RESUME || opcode == END_FOR) { + i += instruction_length(code, i); + continue; + } + if (removed_per_instruction_tools) { + remove_per_instruction_tools(code, i, removed_per_instruction_tools); + } + if (new_per_instruction_tools) { + add_per_instruction_tools(code, i, new_per_instruction_tools); + } + i += instruction_length(code, i); + } + } +#ifdef INSTRUMENT_DEBUG + sanity_check_instrumentation(code); +#endif + return 0; +} + +#define C_RETURN_EVENTS \ + ((1 << PY_MONITORING_EVENT_C_RETURN) | \ + (1 << PY_MONITORING_EVENT_C_RAISE)) + +#define C_CALL_EVENTS \ + (C_RETURN_EVENTS | (1 << PY_MONITORING_EVENT_CALL)) + + +static int +instrument_all_executing_code_objects(PyInterpreterState *interp) { + _PyRuntimeState *runtime = &_PyRuntime; + HEAD_LOCK(runtime); + PyThreadState* ts = PyInterpreterState_ThreadHead(interp); + HEAD_UNLOCK(runtime); + while (ts) { + _PyInterpreterFrame *frame = ts->cframe->current_frame; + while (frame) { + if (frame->owner != FRAME_OWNED_BY_CSTACK) { + if (_Py_Instrument(frame->f_code, interp)) { + return -1; + } + } + frame = frame->previous; + } + HEAD_LOCK(runtime); + ts = PyThreadState_Next(ts); + HEAD_UNLOCK(runtime); + } + return 0; +} + +static void +set_events(_Py_Monitors *m, int tool_id, _PyMonitoringEventSet events) +{ + assert(0 <= tool_id && tool_id < PY_MONITORING_TOOL_IDS); + for (int e = 0; e < PY_MONITORING_UNGROUPED_EVENTS; e++) { + uint8_t *tools = &m->tools[e]; + int val = (events >> e) & 1; + *tools &= ~(1 << tool_id); + *tools |= (val << tool_id); + } +} + +static int +check_tool(PyInterpreterState *interp, int tool_id) +{ + if (tool_id < PY_MONITORING_SYS_PROFILE_ID && + interp->monitoring_tool_names[tool_id] == NULL + ) { + PyErr_Format(PyExc_ValueError, "tool %d is not in use", tool_id); + return -1; + } + return 0; +} + +int +_PyMonitoring_SetEvents(int tool_id, _PyMonitoringEventSet events) +{ + assert(0 <= tool_id && tool_id < PY_MONITORING_TOOL_IDS); + PyInterpreterState *interp = _PyInterpreterState_Get(); + assert(events < (1 << PY_MONITORING_UNGROUPED_EVENTS)); + if (check_tool(interp, tool_id)) { + return -1; + } + uint32_t existing_events = get_events(&interp->monitors, tool_id); + if (existing_events == events) { + return 0; + } + set_events(&interp->monitors, tool_id, events); + interp->monitoring_version++; + return instrument_all_executing_code_objects(interp); +} + +int +_PyMonitoring_SetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEventSet events) +{ + assert(0 <= tool_id && tool_id < PY_MONITORING_TOOL_IDS); + PyInterpreterState *interp = _PyInterpreterState_Get(); + assert(events < (1 << PY_MONITORING_UNGROUPED_EVENTS)); + if (check_tool(interp, tool_id)) { + return -1; + } + if (allocate_instrumentation_data(code)) { + return -1; + } + _Py_Monitors *local = &code->_co_monitoring->local_monitors; + uint32_t existing_events = get_events(local, tool_id); + if (existing_events == events) { + return 0; + } + set_events(local, tool_id, events); + if (is_version_up_to_date(code, interp)) { + /* Force instrumentation update */ + code->_co_instrumentation_version = UINT64_MAX; + } + if (_Py_Instrument(code, interp)) { + return -1; + } + return 0; +} + +/*[clinic input] +module monitoring +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=37257f5987a360cf]*/ +/*[clinic end generated code]*/ + +#include "clinic/instrumentation.c.h" + +static int +check_valid_tool(int tool_id) +{ + if (tool_id < 0 || tool_id >= PY_MONITORING_SYS_PROFILE_ID) { + PyErr_Format(PyExc_ValueError, "invalid tool %d (must be between 0 and 5)", tool_id); + return -1; + } + return 0; +} + +/*[clinic input] +monitoring.use_tool_id + + tool_id: int + name: object + / + +[clinic start generated code]*/ + +static PyObject * +monitoring_use_tool_id_impl(PyObject *module, int tool_id, PyObject *name) +/*[clinic end generated code: output=30d76dc92b7cd653 input=ebc453761c621be1]*/ +{ + if (check_valid_tool(tool_id)) { + return NULL; + } + if (!PyUnicode_Check(name)) { + PyErr_SetString(PyExc_ValueError, "tool name must be a str"); + return NULL; + } + PyInterpreterState *interp = _PyInterpreterState_Get(); + if (interp->monitoring_tool_names[tool_id] != NULL) { + PyErr_Format(PyExc_ValueError, "tool %d is already in use", tool_id); + return NULL; + } + interp->monitoring_tool_names[tool_id] = Py_NewRef(name); + Py_RETURN_NONE; +} + +/*[clinic input] +monitoring.free_tool_id + + tool_id: int + / + +[clinic start generated code]*/ + +static PyObject * +monitoring_free_tool_id_impl(PyObject *module, int tool_id) +/*[clinic end generated code: output=86c2d2a1219a8591 input=a23fb6be3a8618e9]*/ +{ + if (check_valid_tool(tool_id)) { + return NULL; + } + PyInterpreterState *interp = _PyInterpreterState_Get(); + Py_CLEAR(interp->monitoring_tool_names[tool_id]); + Py_RETURN_NONE; +} + +/*[clinic input] +monitoring.get_tool + + tool_id: int + / + +[clinic start generated code]*/ + +static PyObject * +monitoring_get_tool_impl(PyObject *module, int tool_id) +/*[clinic end generated code: output=1c05a98b404a9a16 input=eeee9bebd0bcae9d]*/ + +/*[clinic end generated code]*/ +{ + if (check_valid_tool(tool_id)) { + return NULL; + } + PyInterpreterState *interp = _PyInterpreterState_Get(); + PyObject *name = interp->monitoring_tool_names[tool_id]; + if (name == NULL) { + Py_RETURN_NONE; + } + return Py_NewRef(name); +} + +/*[clinic input] +monitoring.register_callback + + + tool_id: int + event: int + func: object + / + +[clinic start generated code]*/ + +static PyObject * +monitoring_register_callback_impl(PyObject *module, int tool_id, int event, + PyObject *func) +/*[clinic end generated code: output=e64daa363004030c input=df6d70ea4cf81007]*/ +{ + if (check_valid_tool(tool_id)) { + return NULL; + } + if (_Py_popcount32(event) != 1) { + PyErr_SetString(PyExc_ValueError, "The callback can only be set for one event at a time"); + return NULL; + } + int event_id = _Py_bit_length(event)-1; + if (event_id < 0 || event_id >= PY_MONITORING_EVENTS) { + PyErr_Format(PyExc_ValueError, "invalid event %d", event); + return NULL; + } + if (func == Py_None) { + func = NULL; + } + func = _PyMonitoring_RegisterCallback(tool_id, event_id, func); + if (func == NULL) { + Py_RETURN_NONE; + } + return func; +} + +/*[clinic input] +monitoring.get_events -> int + + tool_id: int + / + +[clinic start generated code]*/ + +static int +monitoring_get_events_impl(PyObject *module, int tool_id) +/*[clinic end generated code: output=4450cc13f826c8c0 input=a64b238f76c4b2f7]*/ +{ + if (check_valid_tool(tool_id)) { + return -1; + } + _Py_Monitors *m = &_PyInterpreterState_Get()->monitors; + _PyMonitoringEventSet event_set = get_events(m, tool_id); + return event_set; +} + +/*[clinic input] +monitoring.set_events + + tool_id: int + event_set: int + / + +[clinic start generated code]*/ + +static PyObject * +monitoring_set_events_impl(PyObject *module, int tool_id, int event_set) +/*[clinic end generated code: output=1916c1e49cfb5bdb input=a77ba729a242142b]*/ +{ + if (check_valid_tool(tool_id)) { + return NULL; + } + if (event_set < 0 || event_set >= (1 << PY_MONITORING_EVENTS)) { + PyErr_Format(PyExc_ValueError, "invalid event set 0x%x", event_set); + return NULL; + } + if ((event_set & C_RETURN_EVENTS) && (event_set & C_CALL_EVENTS) != C_CALL_EVENTS) { + PyErr_Format(PyExc_ValueError, "cannot set C_RETURN or C_RAISE events independently"); + return NULL; + } + event_set &= ~C_RETURN_EVENTS; + if (_PyMonitoring_SetEvents(tool_id, event_set)) { + return NULL; + } + Py_RETURN_NONE; +} + +/*[clinic input] +monitoring.get_local_events -> int + + tool_id: int + code: object + / + +[clinic start generated code]*/ + +static int +monitoring_get_local_events_impl(PyObject *module, int tool_id, + PyObject *code) +/*[clinic end generated code: output=d3e92c1c9c1de8f9 input=bb0f927530386a94]*/ +{ + if (!PyCode_Check(code)) { + PyErr_Format( + PyExc_TypeError, + "code must be a code object" + ); + return -1; + } + if (check_valid_tool(tool_id)) { + return -1; + } + _PyMonitoringEventSet event_set = 0; + _PyCoMonitoringData *data = ((PyCodeObject *)code)->_co_monitoring; + if (data != NULL) { + for (int e = 0; e < PY_MONITORING_UNGROUPED_EVENTS; e++) { + if ((data->local_monitors.tools[e] >> tool_id) & 1) { + event_set |= (1 << e); + } + } + } + return event_set; +} + +/*[clinic input] +monitoring.set_local_events + + tool_id: int + code: object + event_set: int + / + +[clinic start generated code]*/ + +static PyObject * +monitoring_set_local_events_impl(PyObject *module, int tool_id, + PyObject *code, int event_set) +/*[clinic end generated code: output=68cc755a65dfea99 input=5655ecd78d937a29]*/ +{ + if (!PyCode_Check(code)) { + PyErr_Format( + PyExc_TypeError, + "code must be a code object" + ); + return NULL; + } + if (check_valid_tool(tool_id)) { + return NULL; + } + if (event_set < 0 || event_set >= (1 << PY_MONITORING_EVENTS)) { + PyErr_Format(PyExc_ValueError, "invalid event set 0x%x", event_set); + return NULL; + } + if ((event_set & C_RETURN_EVENTS) && (event_set & C_CALL_EVENTS) != C_CALL_EVENTS) { + PyErr_Format(PyExc_ValueError, "cannot set C_RETURN or C_RAISE events independently"); + return NULL; + } + event_set &= ~C_RETURN_EVENTS; + if (_PyMonitoring_SetLocalEvents((PyCodeObject*)code, tool_id, event_set)) { + return NULL; + } + Py_RETURN_NONE; +} + +/*[clinic input] +monitoring.restart_events + +[clinic start generated code]*/ + +static PyObject * +monitoring_restart_events_impl(PyObject *module) +/*[clinic end generated code: output=e025dd5ba33314c4 input=add8a855063c8008]*/ +{ + /* We want to ensure that: + * last restart version > instrumented version for all code objects + * last restart version < current version + */ + PyInterpreterState *interp = _PyInterpreterState_Get(); + interp->last_restart_version = interp->monitoring_version + 1; + interp->monitoring_version = interp->last_restart_version + 1; + if (instrument_all_executing_code_objects(interp)) { + return NULL; + } + Py_RETURN_NONE; +} + +static int +add_power2_constant(PyObject *obj, const char *name, int i) +{ + PyObject *val = PyLong_FromLong(1<monitors.tools[e]; + if (tools == 0) { + continue; + } + PyObject *tools_obj = PyLong_FromLong(tools); + assert(tools_obj != NULL); + int err = PyDict_SetItemString(res, event_names[e], tools_obj); + Py_DECREF(tools_obj); + if (err < 0) { + Py_DECREF(res); + return NULL; + } + } + return res; +} + +static PyMethodDef methods[] = { + MONITORING_USE_TOOL_ID_METHODDEF + MONITORING_FREE_TOOL_ID_METHODDEF + MONITORING_GET_TOOL_METHODDEF + MONITORING_REGISTER_CALLBACK_METHODDEF + MONITORING_GET_EVENTS_METHODDEF + MONITORING_SET_EVENTS_METHODDEF + MONITORING_GET_LOCAL_EVENTS_METHODDEF + MONITORING_SET_LOCAL_EVENTS_METHODDEF + MONITORING_RESTART_EVENTS_METHODDEF + MONITORING__ALL_EVENTS_METHODDEF + {NULL, NULL} // sentinel +}; + +static struct PyModuleDef monitoring_module = { + PyModuleDef_HEAD_INIT, + .m_name = "sys.monitoring", + .m_size = -1, /* multiple "initialization" just copies the module dict. */ + .m_methods = methods, +}; + +PyObject *_Py_CreateMonitoringObject(void) +{ + PyObject *mod = _PyModule_CreateInitialized(&monitoring_module, PYTHON_API_VERSION); + if (mod == NULL) { + return NULL; + } + if (PyObject_SetAttrString(mod, "DISABLE", &DISABLE)) { + goto error; + } + if (PyObject_SetAttrString(mod, "MISSING", &_PyInstrumentation_MISSING)) { + goto error; + } + PyObject *events = _PyNamespace_New(NULL); + if (events == NULL) { + goto error; + } + int err = PyObject_SetAttrString(mod, "events", events); + Py_DECREF(events); + if (err) { + goto error; + } + for (int i = 0; i < PY_MONITORING_EVENTS; i++) { + if (add_power2_constant(events, event_names[i], i)) { + goto error; + } + } + err = PyObject_SetAttrString(events, "NO_EVENTS", _PyLong_GetZero()); + if (err) goto error; + PyObject *val = PyLong_FromLong(PY_MONITORING_DEBUGGER_ID); + err = PyObject_SetAttrString(mod, "DEBUGGER_ID", val); + Py_DECREF(val); + if (err) goto error; + val = PyLong_FromLong(PY_MONITORING_COVERAGE_ID); + err = PyObject_SetAttrString(mod, "COVERAGE_ID", val); + Py_DECREF(val); + if (err) goto error; + val = PyLong_FromLong(PY_MONITORING_PROFILER_ID); + err = PyObject_SetAttrString(mod, "PROFILER_ID", val); + Py_DECREF(val); + if (err) goto error; + val = PyLong_FromLong(PY_MONITORING_OPTIMIZER_ID); + err = PyObject_SetAttrString(mod, "OPTIMIZER_ID", val); + Py_DECREF(val); + if (err) goto error; + return mod; +error: + Py_DECREF(mod); + return NULL; +} diff --git a/Python/legacy_tracing.c b/Python/legacy_tracing.c new file mode 100644 index 00000000000000..cf345bddda79b0 --- /dev/null +++ b/Python/legacy_tracing.c @@ -0,0 +1,528 @@ +/* Support for legacy tracing on top of PEP 669 instrumentation + * Provides callables to forward PEP 669 events to legacy events. + */ + +#include +#include "Python.h" +#include "pycore_ceval.h" +#include "pycore_object.h" +#include "pycore_sysmodule.h" + +typedef struct _PyLegacyEventHandler { + PyObject_HEAD + vectorcallfunc vectorcall; + int event; +} _PyLegacyEventHandler; + +/* The Py_tracefunc function expects the following arguments: + * obj: the trace object (PyObject *) + * frame: the current frame (PyFrameObject *) + * kind: the kind of event, see PyTrace_XXX #defines (int) + * arg: The arg (a PyObject *) + */ + +static PyObject * +call_profile_func(_PyLegacyEventHandler *self, PyObject *arg) +{ + PyThreadState *tstate = _PyThreadState_GET(); + if (tstate->c_profilefunc == NULL) { + Py_RETURN_NONE; + } + PyFrameObject *frame = PyEval_GetFrame(); + if (frame == NULL) { + PyErr_SetString(PyExc_SystemError, + "Missing frame when calling profile function."); + return NULL; + } + Py_INCREF(frame); + int err = tstate->c_profilefunc(tstate->c_profileobj, frame, self->event, arg); + Py_DECREF(frame); + if (err) { + return NULL; + } + Py_RETURN_NONE; +} + +static PyObject * +sys_profile_func2( + _PyLegacyEventHandler *self, PyObject *const *args, + size_t nargsf, PyObject *kwnames +) { + assert(kwnames == NULL); + assert(PyVectorcall_NARGS(nargsf) == 2); + return call_profile_func(self, Py_None); +} + +static PyObject * +sys_profile_func3( + _PyLegacyEventHandler *self, PyObject *const *args, + size_t nargsf, PyObject *kwnames +) { + assert(kwnames == NULL); + assert(PyVectorcall_NARGS(nargsf) == 3); + return call_profile_func(self, args[2]); +} + +static PyObject * +sys_profile_call_or_return( + _PyLegacyEventHandler *self, PyObject *const *args, + size_t nargsf, PyObject *kwnames +) { + assert(kwnames == NULL); + assert(PyVectorcall_NARGS(nargsf) == 4); + PyObject *callable = args[2]; + if (PyCFunction_Check(callable)) { + return call_profile_func(self, callable); + } + if (Py_TYPE(callable) == &PyMethodDescr_Type) { + PyObject *self_arg = args[3]; + /* For backwards compatibility need to + * convert to builtin method */ + + /* If no arg, skip */ + if (self_arg == &_PyInstrumentation_MISSING) { + Py_RETURN_NONE; + } + PyObject *meth = Py_TYPE(callable)->tp_descr_get( + callable, self_arg, (PyObject*)Py_TYPE(self_arg)); + if (meth == NULL) { + return NULL; + } + PyObject *res = call_profile_func(self, meth); + Py_DECREF(meth); + return res; + } + Py_RETURN_NONE; +} + +static PyObject * +call_trace_func(_PyLegacyEventHandler *self, PyObject *arg) +{ + PyThreadState *tstate = _PyThreadState_GET(); + if (tstate->c_tracefunc == NULL) { + Py_RETURN_NONE; + } + PyFrameObject *frame = PyEval_GetFrame(); + if (frame == NULL) { + PyErr_SetString(PyExc_SystemError, + "Missing frame when calling trace function."); + return NULL; + } + Py_INCREF(frame); + int err = tstate->c_tracefunc(tstate->c_traceobj, frame, self->event, arg); + Py_DECREF(frame); + if (err) { + return NULL; + } + Py_RETURN_NONE; +} + +static PyObject * +sys_trace_exception_func( + _PyLegacyEventHandler *self, PyObject *const *args, + size_t nargsf, PyObject *kwnames +) { + assert(kwnames == NULL); + assert(PyVectorcall_NARGS(nargsf) == 3); + PyObject *exc = args[2]; + assert(PyExceptionInstance_Check(exc)); + PyObject *type = (PyObject *)Py_TYPE(exc); + PyObject *tb = PyException_GetTraceback(exc); + if (tb == NULL) { + tb = Py_NewRef(Py_None); + } + PyObject *tuple = PyTuple_Pack(3, type, exc, tb); + Py_DECREF(tb); + if (tuple == NULL) { + return NULL; + } + PyObject *res = call_trace_func(self, tuple); + Py_DECREF(tuple); + return res; +} + +static PyObject * +sys_trace_func2( + _PyLegacyEventHandler *self, PyObject *const *args, + size_t nargsf, PyObject *kwnames +) { + assert(kwnames == NULL); + assert(PyVectorcall_NARGS(nargsf) == 2); + return call_trace_func(self, Py_None); +} + +static PyObject * +sys_trace_return( + _PyLegacyEventHandler *self, PyObject *const *args, + size_t nargsf, PyObject *kwnames +) { + assert(!PyErr_Occurred()); + assert(kwnames == NULL); + assert(PyVectorcall_NARGS(nargsf) == 3); + assert(PyCode_Check(args[0])); + PyObject *val = args[2]; + PyObject *res = call_trace_func(self, val); + return res; +} + +static PyObject * +sys_trace_yield( + _PyLegacyEventHandler *self, PyObject *const *args, + size_t nargsf, PyObject *kwnames +) { + assert(kwnames == NULL); + assert(PyVectorcall_NARGS(nargsf) == 3); + return call_trace_func(self, args[2]); +} + +static PyObject * +sys_trace_instruction_func( + _PyLegacyEventHandler *self, PyObject *const *args, + size_t nargsf, PyObject *kwnames +) { + assert(kwnames == NULL); + assert(PyVectorcall_NARGS(nargsf) == 2); + PyFrameObject *frame = PyEval_GetFrame(); + if (frame == NULL) { + PyErr_SetString(PyExc_SystemError, + "Missing frame when calling trace function."); + return NULL; + } + if (!frame->f_trace_opcodes) { + Py_RETURN_NONE; + } + Py_INCREF(frame); + PyThreadState *tstate = _PyThreadState_GET(); + int err = tstate->c_tracefunc(tstate->c_traceobj, frame, self->event, Py_None); + frame->f_lineno = 0; + Py_DECREF(frame); + if (err) { + return NULL; + } + Py_RETURN_NONE; +} + +static PyObject * +trace_line( + PyThreadState *tstate, _PyLegacyEventHandler *self, + PyFrameObject *frame, int line +) { + if (!frame->f_trace_lines) { + Py_RETURN_NONE; + } + if (line < 0) { + Py_RETURN_NONE; + } + frame ->f_last_traced_line = line; + Py_INCREF(frame); + frame->f_lineno = line; + int err = tstate->c_tracefunc(tstate->c_traceobj, frame, self->event, Py_None); + frame->f_lineno = 0; + Py_DECREF(frame); + if (err) { + return NULL; + } + Py_RETURN_NONE; +} + +static PyObject * +sys_trace_line_func( + _PyLegacyEventHandler *self, PyObject *const *args, + size_t nargsf, PyObject *kwnames +) { + assert(kwnames == NULL); + PyThreadState *tstate = _PyThreadState_GET(); + if (tstate->c_tracefunc == NULL) { + Py_RETURN_NONE; + } + assert(PyVectorcall_NARGS(nargsf) == 2); + int line = _PyLong_AsInt(args[1]); + assert(line >= 0); + PyFrameObject *frame = PyEval_GetFrame(); + if (frame == NULL) { + PyErr_SetString(PyExc_SystemError, + "Missing frame when calling trace function."); + return NULL; + } + assert(args[0] == (PyObject *)frame->f_frame->f_code); + if (frame ->f_last_traced_line == line) { + /* Already traced this line */ + Py_RETURN_NONE; + } + return trace_line(tstate, self, frame, line); +} + + +static PyObject * +sys_trace_jump_func( + _PyLegacyEventHandler *self, PyObject *const *args, + size_t nargsf, PyObject *kwnames +) { + assert(kwnames == NULL); + PyThreadState *tstate = _PyThreadState_GET(); + if (tstate->c_tracefunc == NULL) { + Py_RETURN_NONE; + } + assert(PyVectorcall_NARGS(nargsf) == 3); + int from = _PyLong_AsInt(args[1])/sizeof(_Py_CODEUNIT); + assert(from >= 0); + int to = _PyLong_AsInt(args[2])/sizeof(_Py_CODEUNIT); + assert(to >= 0); + PyFrameObject *frame = PyEval_GetFrame(); + if (frame == NULL) { + PyErr_SetString(PyExc_SystemError, + "Missing frame when calling trace function."); + return NULL; + } + if (!frame->f_trace_lines) { + Py_RETURN_NONE; + } + PyCodeObject *code = (PyCodeObject *)args[0]; + assert(PyCode_Check(code)); + assert(code == frame->f_frame->f_code); + /* We can call _Py_Instrumentation_GetLine because we always set + * line events for tracing */ + int to_line = _Py_Instrumentation_GetLine(code, to); + /* Backward jump: Always generate event + * Forward jump: Only generate event if jumping to different line. */ + if (to > from && frame->f_last_traced_line == to_line) { + /* Already traced this line */ + Py_RETURN_NONE; + } + return trace_line(tstate, self, frame, to_line); +} + +/* We don't care about the exception here, + * we just treat it as a possible new line + */ +static PyObject * +sys_trace_exception_handled( + _PyLegacyEventHandler *self, PyObject *const *args, + size_t nargsf, PyObject *kwnames +) { + assert(kwnames == NULL); + PyThreadState *tstate = _PyThreadState_GET(); + if (tstate->c_tracefunc == NULL) { + Py_RETURN_NONE; + } + assert(PyVectorcall_NARGS(nargsf) == 3); + PyFrameObject *frame = PyEval_GetFrame(); + PyCodeObject *code = (PyCodeObject *)args[0]; + assert(PyCode_Check(code)); + assert(code == frame->f_frame->f_code); + assert(PyLong_Check(args[1])); + int offset = _PyLong_AsInt(args[1])/sizeof(_Py_CODEUNIT); + /* We can call _Py_Instrumentation_GetLine because we always set + * line events for tracing */ + int line = _Py_Instrumentation_GetLine(code, offset); + if (frame->f_last_traced_line == line) { + /* Already traced this line */ + Py_RETURN_NONE; + } + return trace_line(tstate, self, frame, line); +} + + +PyTypeObject _PyLegacyEventHandler_Type = { + _PyVarObject_IMMORTAL_INIT(&PyType_Type, 0), + "sys.legacy_event_handler", + sizeof(_PyLegacyEventHandler), + .tp_dealloc = (destructor)PyObject_Free, + .tp_vectorcall_offset = offsetof(_PyLegacyEventHandler, vectorcall), + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_HAVE_VECTORCALL | Py_TPFLAGS_DISALLOW_INSTANTIATION, + .tp_call = PyVectorcall_Call, +}; + +static int +set_callbacks(int tool, vectorcallfunc vectorcall, int legacy_event, int event1, int event2) +{ + _PyLegacyEventHandler *callback = + PyObject_NEW(_PyLegacyEventHandler, &_PyLegacyEventHandler_Type); + if (callback == NULL) { + return -1; + } + callback->vectorcall = vectorcall; + callback->event = legacy_event; + Py_XDECREF(_PyMonitoring_RegisterCallback(tool, event1, (PyObject *)callback)); + if (event2 >= 0) { + Py_XDECREF(_PyMonitoring_RegisterCallback(tool, event2, (PyObject *)callback)); + } + Py_DECREF(callback); + return 0; +} + +#ifndef NDEBUG +/* Ensure that tstate is valid: sanity check for PyEval_AcquireThread() and + PyEval_RestoreThread(). Detect if tstate memory was freed. It can happen + when a thread continues to run after Python finalization, especially + daemon threads. */ +static int +is_tstate_valid(PyThreadState *tstate) +{ + assert(!_PyMem_IsPtrFreed(tstate)); + assert(!_PyMem_IsPtrFreed(tstate->interp)); + return 1; +} +#endif + +int +_PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) +{ + assert(is_tstate_valid(tstate)); + /* The caller must hold the GIL */ + assert(PyGILState_Check()); + + /* Call _PySys_Audit() in the context of the current thread state, + even if tstate is not the current thread state. */ + PyThreadState *current_tstate = _PyThreadState_GET(); + if (_PySys_Audit(current_tstate, "sys.setprofile", NULL) < 0) { + return -1; + } + /* Setup PEP 669 monitoring callbacks and events. */ + if (!tstate->interp->sys_profile_initialized) { + tstate->interp->sys_profile_initialized = true; + if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, + (vectorcallfunc)sys_profile_func2, PyTrace_CALL, + PY_MONITORING_EVENT_PY_START, PY_MONITORING_EVENT_PY_RESUME)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, + (vectorcallfunc)sys_profile_func3, PyTrace_RETURN, + PY_MONITORING_EVENT_PY_RETURN, PY_MONITORING_EVENT_PY_YIELD)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, + (vectorcallfunc)sys_profile_func2, PyTrace_RETURN, + PY_MONITORING_EVENT_PY_UNWIND, -1)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, + (vectorcallfunc)sys_profile_call_or_return, PyTrace_C_CALL, + PY_MONITORING_EVENT_CALL, -1)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, + (vectorcallfunc)sys_profile_call_or_return, PyTrace_C_RETURN, + PY_MONITORING_EVENT_C_RETURN, -1)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, + (vectorcallfunc)sys_profile_call_or_return, PyTrace_C_EXCEPTION, + PY_MONITORING_EVENT_C_RAISE, -1)) { + return -1; + } + } + + int delta = (func != NULL) - (tstate->c_profilefunc != NULL); + tstate->c_profilefunc = func; + PyObject *old_profileobj = tstate->c_profileobj; + tstate->c_profileobj = Py_XNewRef(arg); + Py_XDECREF(old_profileobj); + tstate->interp->sys_profiling_threads += delta; + assert(tstate->interp->sys_profiling_threads >= 0); + + uint32_t events = 0; + if (tstate->interp->sys_profiling_threads) { + events = + (1 << PY_MONITORING_EVENT_PY_START) | (1 << PY_MONITORING_EVENT_PY_RESUME) | + (1 << PY_MONITORING_EVENT_PY_RETURN) | (1 << PY_MONITORING_EVENT_PY_YIELD) | + (1 << PY_MONITORING_EVENT_CALL) | (1 << PY_MONITORING_EVENT_PY_UNWIND); + } + return _PyMonitoring_SetEvents(PY_MONITORING_SYS_PROFILE_ID, events); +} + +int +_PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) +{ + assert(is_tstate_valid(tstate)); + /* The caller must hold the GIL */ + assert(PyGILState_Check()); + + /* Call _PySys_Audit() in the context of the current thread state, + even if tstate is not the current thread state. */ + PyThreadState *current_tstate = _PyThreadState_GET(); + if (_PySys_Audit(current_tstate, "sys.settrace", NULL) < 0) { + return -1; + } + + assert(tstate->interp->sys_tracing_threads >= 0); + /* Setup PEP 669 monitoring callbacks and events. */ + if (!tstate->interp->sys_trace_initialized) { + tstate->interp->sys_trace_initialized = true; + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + (vectorcallfunc)sys_trace_func2, PyTrace_CALL, + PY_MONITORING_EVENT_PY_START, PY_MONITORING_EVENT_PY_RESUME)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + (vectorcallfunc)sys_trace_func2, PyTrace_CALL, + PY_MONITORING_EVENT_PY_THROW, -1)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + (vectorcallfunc)sys_trace_return, PyTrace_RETURN, + PY_MONITORING_EVENT_PY_RETURN, -1)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + (vectorcallfunc)sys_trace_yield, PyTrace_RETURN, + PY_MONITORING_EVENT_PY_YIELD, -1)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + (vectorcallfunc)sys_trace_exception_func, PyTrace_EXCEPTION, + PY_MONITORING_EVENT_RAISE, PY_MONITORING_EVENT_STOP_ITERATION)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + (vectorcallfunc)sys_trace_line_func, PyTrace_LINE, + PY_MONITORING_EVENT_LINE, -1)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + (vectorcallfunc)sys_trace_func2, PyTrace_RETURN, + PY_MONITORING_EVENT_PY_UNWIND, -1)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + (vectorcallfunc)sys_trace_jump_func, PyTrace_LINE, + PY_MONITORING_EVENT_JUMP, PY_MONITORING_EVENT_BRANCH)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + (vectorcallfunc)sys_trace_instruction_func, PyTrace_OPCODE, + PY_MONITORING_EVENT_INSTRUCTION, -1)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + (vectorcallfunc)sys_trace_exception_handled, PyTrace_LINE, + PY_MONITORING_EVENT_EXCEPTION_HANDLED, -1)) { + return -1; + } + } + + int delta = (func != NULL) - (tstate->c_tracefunc != NULL); + tstate->c_tracefunc = func; + PyObject *old_traceobj = tstate->c_traceobj; + tstate->c_traceobj = Py_XNewRef(arg); + Py_XDECREF(old_traceobj); + tstate->interp->sys_tracing_threads += delta; + assert(tstate->interp->sys_tracing_threads >= 0); + + uint32_t events = 0; + if (tstate->interp->sys_tracing_threads) { + events = + (1 << PY_MONITORING_EVENT_PY_START) | (1 << PY_MONITORING_EVENT_PY_RESUME) | + (1 << PY_MONITORING_EVENT_PY_RETURN) | (1 << PY_MONITORING_EVENT_PY_YIELD) | + (1 << PY_MONITORING_EVENT_RAISE) | (1 << PY_MONITORING_EVENT_LINE) | + (1 << PY_MONITORING_EVENT_JUMP) | (1 << PY_MONITORING_EVENT_BRANCH) | + (1 << PY_MONITORING_EVENT_PY_UNWIND) | (1 << PY_MONITORING_EVENT_PY_THROW) | + (1 << PY_MONITORING_EVENT_STOP_ITERATION) | + (1 << PY_MONITORING_EVENT_EXCEPTION_HANDLED); + if (tstate->interp->f_opcode_trace_set) { + events |= (1 << PY_MONITORING_EVENT_INSTRUCTION); + } + } + return _PyMonitoring_SetEvents(PY_MONITORING_SYS_TRACE_ID, events); +} diff --git a/Python/makeopcodetargets.py b/Python/makeopcodetargets.py index 33a4b4a76a1253..5aa31803397ce4 100755 --- a/Python/makeopcodetargets.py +++ b/Python/makeopcodetargets.py @@ -32,7 +32,6 @@ def write_contents(f): """ opcode = find_module('opcode') targets = ['_unknown_opcode'] * 256 - targets[255] = "TARGET_DO_TRACING" for opname, op in opcode.opmap.items(): if not opcode.is_pseudo(op): targets[op] = "TARGET_%s" % opname diff --git a/Python/opcode_metadata.h b/Python/opcode_metadata.h index f57b76aeb31050..4681ed03aff582 100644 --- a/Python/opcode_metadata.h +++ b/Python/opcode_metadata.h @@ -13,6 +13,8 @@ _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return 0; case RESUME: return 0; + case INSTRUMENTED_RESUME: + return 0; case LOAD_CLOSURE: return 0; case LOAD_FAST_CHECK: @@ -39,6 +41,12 @@ _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return 0; case END_FOR: return 1+1; + case INSTRUMENTED_END_FOR: + return 2; + case END_SEND: + return 2; + case INSTRUMENTED_END_SEND: + return 2; case UNARY_NEGATIVE: return 1; case UNARY_NOT: @@ -97,8 +105,12 @@ _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return 1; case RETURN_VALUE: return 1; + case INSTRUMENTED_RETURN_VALUE: + return 1; case RETURN_CONST: return 0; + case INSTRUMENTED_RETURN_CONST: + return 0; case GET_AITER: return 1; case GET_ANEXT: @@ -109,6 +121,8 @@ _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return 2; case SEND_GEN: return 2; + case INSTRUMENTED_YIELD_VALUE: + return 1; case YIELD_VALUE: return 1; case POP_EXCEPT: @@ -263,6 +277,8 @@ _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return 1; case FOR_ITER: return 1; + case INSTRUMENTED_FOR_ITER: + return 0; case FOR_ITER_LIST: return 1; case FOR_ITER_TUPLE: @@ -287,6 +303,8 @@ _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return 1; case KW_NAMES: return 0; + case INSTRUMENTED_CALL: + return 0; case CALL: return oparg + 2; case CALL_BOUND_METHOD_EXACT_ARGS: @@ -323,6 +341,8 @@ _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return oparg + 2; case CALL_NO_KW_METHOD_DESCRIPTOR_FAST: return oparg + 2; + case INSTRUMENTED_CALL_FUNCTION_EX: + return 0; case CALL_FUNCTION_EX: return ((oparg & 1) ? 1 : 0) + 3; case MAKE_FUNCTION: @@ -339,10 +359,28 @@ _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return 2; case SWAP: return (oparg-2) + 2; + case INSTRUMENTED_LINE: + return 0; + case INSTRUMENTED_INSTRUCTION: + return 0; + case INSTRUMENTED_JUMP_FORWARD: + return 0; + case INSTRUMENTED_JUMP_BACKWARD: + return 0; + case INSTRUMENTED_POP_JUMP_IF_TRUE: + return 0; + case INSTRUMENTED_POP_JUMP_IF_FALSE: + return 0; + case INSTRUMENTED_POP_JUMP_IF_NONE: + return 0; + case INSTRUMENTED_POP_JUMP_IF_NOT_NONE: + return 0; case EXTENDED_ARG: return 0; case CACHE: return 0; + case RESERVED: + return 0; default: return -1; } @@ -359,6 +397,8 @@ _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return 0; case RESUME: return 0; + case INSTRUMENTED_RESUME: + return 0; case LOAD_CLOSURE: return 1; case LOAD_FAST_CHECK: @@ -385,6 +425,12 @@ _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return 1; case END_FOR: return 0+0; + case INSTRUMENTED_END_FOR: + return 0; + case END_SEND: + return 1; + case INSTRUMENTED_END_SEND: + return 1; case UNARY_NEGATIVE: return 1; case UNARY_NOT: @@ -443,8 +489,12 @@ _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return 0; case RETURN_VALUE: return 0; + case INSTRUMENTED_RETURN_VALUE: + return 0; case RETURN_CONST: return 0; + case INSTRUMENTED_RETURN_CONST: + return 0; case GET_AITER: return 1; case GET_ANEXT: @@ -455,6 +505,8 @@ _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return 2; case SEND_GEN: return 1; + case INSTRUMENTED_YIELD_VALUE: + return 1; case YIELD_VALUE: return 1; case POP_EXCEPT: @@ -609,6 +661,8 @@ _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return 1; case FOR_ITER: return 2; + case INSTRUMENTED_FOR_ITER: + return 0; case FOR_ITER_LIST: return 2; case FOR_ITER_TUPLE: @@ -633,6 +687,8 @@ _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return ((oparg & 1) ? 1 : 0) + 1; case KW_NAMES: return 0; + case INSTRUMENTED_CALL: + return 0; case CALL: return 1; case CALL_BOUND_METHOD_EXACT_ARGS: @@ -669,6 +725,8 @@ _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return 1; case CALL_NO_KW_METHOD_DESCRIPTOR_FAST: return 1; + case INSTRUMENTED_CALL_FUNCTION_EX: + return 0; case CALL_FUNCTION_EX: return 1; case MAKE_FUNCTION: @@ -685,10 +743,28 @@ _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return 1; case SWAP: return (oparg-2) + 2; + case INSTRUMENTED_LINE: + return 0; + case INSTRUMENTED_INSTRUCTION: + return 0; + case INSTRUMENTED_JUMP_FORWARD: + return 0; + case INSTRUMENTED_JUMP_BACKWARD: + return 0; + case INSTRUMENTED_POP_JUMP_IF_TRUE: + return 0; + case INSTRUMENTED_POP_JUMP_IF_FALSE: + return 0; + case INSTRUMENTED_POP_JUMP_IF_NONE: + return 0; + case INSTRUMENTED_POP_JUMP_IF_NOT_NONE: + return 0; case EXTENDED_ARG: return 0; case CACHE: return 0; + case RESERVED: + return 0; default: return -1; } @@ -707,6 +783,7 @@ extern const struct opcode_metadata _PyOpcode_opcode_metadata[256]; const struct opcode_metadata _PyOpcode_opcode_metadata[256] = { [NOP] = { true, INSTR_FMT_IX }, [RESUME] = { true, INSTR_FMT_IB }, + [INSTRUMENTED_RESUME] = { true, INSTR_FMT_IB }, [LOAD_CLOSURE] = { true, INSTR_FMT_IB }, [LOAD_FAST_CHECK] = { true, INSTR_FMT_IB }, [LOAD_FAST] = { true, INSTR_FMT_IB }, @@ -720,6 +797,9 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[256] = { [POP_TOP] = { true, INSTR_FMT_IX }, [PUSH_NULL] = { true, INSTR_FMT_IX }, [END_FOR] = { true, INSTR_FMT_IB }, + [INSTRUMENTED_END_FOR] = { true, INSTR_FMT_IX }, + [END_SEND] = { true, INSTR_FMT_IX }, + [INSTRUMENTED_END_SEND] = { true, INSTR_FMT_IX }, [UNARY_NEGATIVE] = { true, INSTR_FMT_IX }, [UNARY_NOT] = { true, INSTR_FMT_IX }, [UNARY_INVERT] = { true, INSTR_FMT_IX }, @@ -749,12 +829,15 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[256] = { [RAISE_VARARGS] = { true, INSTR_FMT_IB }, [INTERPRETER_EXIT] = { true, INSTR_FMT_IX }, [RETURN_VALUE] = { true, INSTR_FMT_IX }, + [INSTRUMENTED_RETURN_VALUE] = { true, INSTR_FMT_IX }, [RETURN_CONST] = { true, INSTR_FMT_IB }, + [INSTRUMENTED_RETURN_CONST] = { true, INSTR_FMT_IB }, [GET_AITER] = { true, INSTR_FMT_IX }, [GET_ANEXT] = { true, INSTR_FMT_IX }, [GET_AWAITABLE] = { true, INSTR_FMT_IB }, [SEND] = { true, INSTR_FMT_IBC }, [SEND_GEN] = { true, INSTR_FMT_IBC }, + [INSTRUMENTED_YIELD_VALUE] = { true, INSTR_FMT_IX }, [YIELD_VALUE] = { true, INSTR_FMT_IX }, [POP_EXCEPT] = { true, INSTR_FMT_IX }, [RERAISE] = { true, INSTR_FMT_IB }, @@ -832,6 +915,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[256] = { [GET_ITER] = { true, INSTR_FMT_IX }, [GET_YIELD_FROM_ITER] = { true, INSTR_FMT_IX }, [FOR_ITER] = { true, INSTR_FMT_IBC }, + [INSTRUMENTED_FOR_ITER] = { true, INSTR_FMT_IB }, [FOR_ITER_LIST] = { true, INSTR_FMT_IBC }, [FOR_ITER_TUPLE] = { true, INSTR_FMT_IBC }, [FOR_ITER_RANGE] = { true, INSTR_FMT_IBC }, @@ -844,6 +928,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[256] = { [LOAD_ATTR_METHOD_NO_DICT] = { true, INSTR_FMT_IBC00000000 }, [LOAD_ATTR_METHOD_LAZY_DICT] = { true, INSTR_FMT_IBC00000000 }, [KW_NAMES] = { true, INSTR_FMT_IB }, + [INSTRUMENTED_CALL] = { true, INSTR_FMT_IB }, [CALL] = { true, INSTR_FMT_IBC00 }, [CALL_BOUND_METHOD_EXACT_ARGS] = { true, INSTR_FMT_IBC00 }, [CALL_PY_EXACT_ARGS] = { true, INSTR_FMT_IBC00 }, @@ -862,6 +947,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[256] = { [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC00 }, [CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = { true, INSTR_FMT_IBC00 }, [CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = { true, INSTR_FMT_IBC00 }, + [INSTRUMENTED_CALL_FUNCTION_EX] = { true, INSTR_FMT_IX }, [CALL_FUNCTION_EX] = { true, INSTR_FMT_IB }, [MAKE_FUNCTION] = { true, INSTR_FMT_IB }, [RETURN_GENERATOR] = { true, INSTR_FMT_IX }, @@ -870,7 +956,16 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[256] = { [COPY] = { true, INSTR_FMT_IB }, [BINARY_OP] = { true, INSTR_FMT_IBC }, [SWAP] = { true, INSTR_FMT_IB }, + [INSTRUMENTED_LINE] = { true, INSTR_FMT_IX }, + [INSTRUMENTED_INSTRUCTION] = { true, INSTR_FMT_IX }, + [INSTRUMENTED_JUMP_FORWARD] = { true, INSTR_FMT_IB }, + [INSTRUMENTED_JUMP_BACKWARD] = { true, INSTR_FMT_IB }, + [INSTRUMENTED_POP_JUMP_IF_TRUE] = { true, INSTR_FMT_IB }, + [INSTRUMENTED_POP_JUMP_IF_FALSE] = { true, INSTR_FMT_IB }, + [INSTRUMENTED_POP_JUMP_IF_NONE] = { true, INSTR_FMT_IB }, + [INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = { true, INSTR_FMT_IB }, [EXTENDED_ARG] = { true, INSTR_FMT_IB }, [CACHE] = { true, INSTR_FMT_IX }, + [RESERVED] = { true, INSTR_FMT_IX }, }; #endif diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index c502471bcd17b6..9d6616666f7ac1 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -4,17 +4,19 @@ static void *opcode_targets[256] = { &&TARGET_PUSH_NULL, &&TARGET_INTERPRETER_EXIT, &&TARGET_END_FOR, + &&TARGET_END_SEND, &&TARGET_BINARY_OP_ADD_FLOAT, &&TARGET_BINARY_OP_ADD_INT, &&TARGET_BINARY_OP_ADD_UNICODE, - &&TARGET_BINARY_OP_INPLACE_ADD_UNICODE, &&TARGET_NOP, - &&TARGET_BINARY_OP_MULTIPLY_FLOAT, + &&TARGET_BINARY_OP_INPLACE_ADD_UNICODE, &&TARGET_UNARY_NEGATIVE, &&TARGET_UNARY_NOT, + &&TARGET_BINARY_OP_MULTIPLY_FLOAT, &&TARGET_BINARY_OP_MULTIPLY_INT, - &&TARGET_BINARY_OP_SUBTRACT_FLOAT, &&TARGET_UNARY_INVERT, + &&TARGET_BINARY_OP_SUBTRACT_FLOAT, + &&TARGET_RESERVED, &&TARGET_BINARY_OP_SUBTRACT_INT, &&TARGET_BINARY_SUBSCR_DICT, &&TARGET_BINARY_SUBSCR_GETITEM, @@ -22,21 +24,21 @@ static void *opcode_targets[256] = { &&TARGET_BINARY_SUBSCR_TUPLE_INT, &&TARGET_CALL_PY_EXACT_ARGS, &&TARGET_CALL_PY_WITH_DEFAULTS, - &&TARGET_CALL_BOUND_METHOD_EXACT_ARGS, - &&TARGET_CALL_BUILTIN_CLASS, &&TARGET_BINARY_SUBSCR, &&TARGET_BINARY_SLICE, &&TARGET_STORE_SLICE, - &&TARGET_CALL_BUILTIN_FAST_WITH_KEYWORDS, - &&TARGET_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, + &&TARGET_CALL_BOUND_METHOD_EXACT_ARGS, + &&TARGET_CALL_BUILTIN_CLASS, &&TARGET_GET_LEN, &&TARGET_MATCH_MAPPING, &&TARGET_MATCH_SEQUENCE, &&TARGET_MATCH_KEYS, - &&TARGET_CALL_NO_KW_BUILTIN_FAST, + &&TARGET_CALL_BUILTIN_FAST_WITH_KEYWORDS, &&TARGET_PUSH_EXC_INFO, &&TARGET_CHECK_EXC_MATCH, &&TARGET_CHECK_EG_MATCH, + &&TARGET_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, + &&TARGET_CALL_NO_KW_BUILTIN_FAST, &&TARGET_CALL_NO_KW_BUILTIN_O, &&TARGET_CALL_NO_KW_ISINSTANCE, &&TARGET_CALL_NO_KW_LEN, @@ -46,8 +48,6 @@ static void *opcode_targets[256] = { &&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_O, &&TARGET_CALL_NO_KW_STR_1, &&TARGET_CALL_NO_KW_TUPLE_1, - &&TARGET_CALL_NO_KW_TYPE_1, - &&TARGET_COMPARE_OP_FLOAT, &&TARGET_WITH_EXCEPT_START, &&TARGET_GET_AITER, &&TARGET_GET_ANEXT, @@ -55,39 +55,39 @@ static void *opcode_targets[256] = { &&TARGET_BEFORE_WITH, &&TARGET_END_ASYNC_FOR, &&TARGET_CLEANUP_THROW, + &&TARGET_CALL_NO_KW_TYPE_1, + &&TARGET_COMPARE_OP_FLOAT, &&TARGET_COMPARE_OP_INT, &&TARGET_COMPARE_OP_STR, - &&TARGET_FOR_ITER_LIST, - &&TARGET_FOR_ITER_TUPLE, &&TARGET_STORE_SUBSCR, &&TARGET_DELETE_SUBSCR, + &&TARGET_FOR_ITER_LIST, + &&TARGET_FOR_ITER_TUPLE, &&TARGET_FOR_ITER_RANGE, &&TARGET_FOR_ITER_GEN, &&TARGET_LOAD_ATTR_CLASS, &&TARGET_LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN, - &&TARGET_LOAD_ATTR_INSTANCE_VALUE, - &&TARGET_LOAD_ATTR_MODULE, &&TARGET_GET_ITER, &&TARGET_GET_YIELD_FROM_ITER, - &&TARGET_LOAD_ATTR_PROPERTY, + &&TARGET_LOAD_ATTR_INSTANCE_VALUE, &&TARGET_LOAD_BUILD_CLASS, - &&TARGET_LOAD_ATTR_SLOT, - &&TARGET_LOAD_ATTR_WITH_HINT, + &&TARGET_LOAD_ATTR_MODULE, + &&TARGET_LOAD_ATTR_PROPERTY, &&TARGET_LOAD_ASSERTION_ERROR, &&TARGET_RETURN_GENERATOR, + &&TARGET_LOAD_ATTR_SLOT, + &&TARGET_LOAD_ATTR_WITH_HINT, &&TARGET_LOAD_ATTR_METHOD_LAZY_DICT, &&TARGET_LOAD_ATTR_METHOD_NO_DICT, &&TARGET_LOAD_ATTR_METHOD_WITH_VALUES, &&TARGET_LOAD_CONST__LOAD_FAST, &&TARGET_LOAD_FAST__LOAD_CONST, + &&TARGET_RETURN_VALUE, &&TARGET_LOAD_FAST__LOAD_FAST, + &&TARGET_SETUP_ANNOTATIONS, &&TARGET_LOAD_GLOBAL_BUILTIN, - &&TARGET_RETURN_VALUE, &&TARGET_LOAD_GLOBAL_MODULE, - &&TARGET_SETUP_ANNOTATIONS, &&TARGET_STORE_ATTR_INSTANCE_VALUE, - &&TARGET_STORE_ATTR_SLOT, - &&TARGET_STORE_ATTR_WITH_HINT, &&TARGET_POP_EXCEPT, &&TARGET_STORE_NAME, &&TARGET_DELETE_NAME, @@ -110,9 +110,9 @@ static void *opcode_targets[256] = { &&TARGET_IMPORT_NAME, &&TARGET_IMPORT_FROM, &&TARGET_JUMP_FORWARD, + &&TARGET_STORE_ATTR_SLOT, + &&TARGET_STORE_ATTR_WITH_HINT, &&TARGET_STORE_FAST__LOAD_FAST, - &&TARGET_STORE_FAST__STORE_FAST, - &&TARGET_STORE_SUBSCR_DICT, &&TARGET_POP_JUMP_IF_FALSE, &&TARGET_POP_JUMP_IF_TRUE, &&TARGET_LOAD_GLOBAL, @@ -140,9 +140,9 @@ static void *opcode_targets[256] = { &&TARGET_STORE_DEREF, &&TARGET_DELETE_DEREF, &&TARGET_JUMP_BACKWARD, - &&TARGET_STORE_SUBSCR_LIST_INT, + &&TARGET_STORE_FAST__STORE_FAST, &&TARGET_CALL_FUNCTION_EX, - &&TARGET_UNPACK_SEQUENCE_LIST, + &&TARGET_STORE_SUBSCR_DICT, &&TARGET_EXTENDED_ARG, &&TARGET_LIST_APPEND, &&TARGET_SET_ADD, @@ -152,15 +152,15 @@ static void *opcode_targets[256] = { &&TARGET_YIELD_VALUE, &&TARGET_RESUME, &&TARGET_MATCH_CLASS, - &&TARGET_UNPACK_SEQUENCE_TUPLE, - &&TARGET_UNPACK_SEQUENCE_TWO_TUPLE, + &&TARGET_STORE_SUBSCR_LIST_INT, + &&TARGET_UNPACK_SEQUENCE_LIST, &&TARGET_FORMAT_VALUE, &&TARGET_BUILD_CONST_KEY_MAP, &&TARGET_BUILD_STRING, + &&TARGET_UNPACK_SEQUENCE_TUPLE, + &&TARGET_UNPACK_SEQUENCE_TWO_TUPLE, &&TARGET_SEND_GEN, &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, &&TARGET_LIST_EXTEND, &&TARGET_SET_UPDATE, &&TARGET_DICT_MERGE, @@ -237,22 +237,22 @@ static void *opcode_targets[256] = { &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&TARGET_DO_TRACING + &&TARGET_INSTRUMENTED_POP_JUMP_IF_NONE, + &&TARGET_INSTRUMENTED_POP_JUMP_IF_NOT_NONE, + &&TARGET_INSTRUMENTED_RESUME, + &&TARGET_INSTRUMENTED_CALL, + &&TARGET_INSTRUMENTED_RETURN_VALUE, + &&TARGET_INSTRUMENTED_YIELD_VALUE, + &&TARGET_INSTRUMENTED_CALL_FUNCTION_EX, + &&TARGET_INSTRUMENTED_JUMP_FORWARD, + &&TARGET_INSTRUMENTED_JUMP_BACKWARD, + &&TARGET_INSTRUMENTED_RETURN_CONST, + &&TARGET_INSTRUMENTED_FOR_ITER, + &&TARGET_INSTRUMENTED_POP_JUMP_IF_FALSE, + &&TARGET_INSTRUMENTED_POP_JUMP_IF_TRUE, + &&TARGET_INSTRUMENTED_END_FOR, + &&TARGET_INSTRUMENTED_END_SEND, + &&TARGET_INSTRUMENTED_INSTRUCTION, + &&TARGET_INSTRUMENTED_LINE, + &&_unknown_opcode }; diff --git a/Python/pystate.c b/Python/pystate.c index 37cef972e0feb4..1e04887ef04a2c 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -625,7 +625,6 @@ free_interpreter(PyInterpreterState *interp) main interpreter. We fix those fields here, in addition to the other dynamically initialized fields. */ - static void init_interpreter(PyInterpreterState *interp, _PyRuntimeState *runtime, int64_t id, @@ -650,12 +649,22 @@ init_interpreter(PyInterpreterState *interp, _PyGC_InitState(&interp->gc); PyConfig_InitPythonConfig(&interp->config); _PyType_InitCache(interp); + for(int i = 0; i < PY_MONITORING_UNGROUPED_EVENTS; i++) { + interp->monitors.tools[i] = 0; + } + for (int t = 0; t < PY_MONITORING_TOOL_IDS; t++) { + for(int e = 0; e < PY_MONITORING_EVENTS; e++) { + interp->monitoring_callables[t][e] = NULL; + } + } + interp->sys_profile_initialized = false; + interp->sys_trace_initialized = false; if (interp != &runtime->_main_interpreter) { /* Fix the self-referential, statically initialized fields. */ interp->dtoa = (struct _dtoa_state)_dtoa_state_INIT(interp); } - + interp->f_opcode_trace_set = false; interp->_initialized = 1; } @@ -788,6 +797,20 @@ interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate) Py_CLEAR(interp->audit_hooks); + for(int i = 0; i < PY_MONITORING_UNGROUPED_EVENTS; i++) { + interp->monitors.tools[i] = 0; + } + for (int t = 0; t < PY_MONITORING_TOOL_IDS; t++) { + for(int e = 0; e < PY_MONITORING_EVENTS; e++) { + Py_CLEAR(interp->monitoring_callables[t][e]); + } + } + interp->sys_profile_initialized = false; + interp->sys_trace_initialized = false; + for (int t = 0; t < PY_MONITORING_TOOL_IDS; t++) { + Py_CLEAR(interp->monitoring_tool_names[t]); + } + PyConfig_Clear(&interp->config); Py_CLEAR(interp->codec_search_path); Py_CLEAR(interp->codec_search_cache); @@ -845,7 +868,7 @@ interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate) interp->code_watchers[i] = NULL; } interp->active_code_watchers = 0; - + interp->f_opcode_trace_set = false; // XXX Once we have one allocator per interpreter (i.e. // per-interpreter GC) we must ensure that all of the interpreter's // objects have been cleaned up at the point. @@ -1237,6 +1260,7 @@ init_threadstate(PyThreadState *tstate, tstate->datastack_chunk = NULL; tstate->datastack_top = NULL; tstate->datastack_limit = NULL; + tstate->what_event = -1; tstate->_status.initialized = 1; } @@ -1412,8 +1436,14 @@ PyThreadState_Clear(PyThreadState *tstate) "PyThreadState_Clear: warning: thread still has a generator\n"); } - tstate->c_profilefunc = NULL; - tstate->c_tracefunc = NULL; + if (tstate->c_profilefunc != NULL) { + tstate->interp->sys_profiling_threads--; + tstate->c_profilefunc = NULL; + } + if (tstate->c_tracefunc != NULL) { + tstate->interp->sys_tracing_threads--; + tstate->c_tracefunc = NULL; + } Py_CLEAR(tstate->c_profileobj); Py_CLEAR(tstate->c_traceobj); diff --git a/Python/specialize.c b/Python/specialize.c index a9d3226ee39f5f..3fa28f409892dc 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -273,7 +273,8 @@ _PyCode_Quicken(PyCodeObject *code) _Py_CODEUNIT *instructions = _PyCode_CODE(code); for (int i = 0; i < Py_SIZE(code); i++) { int previous_opcode = opcode; - opcode = _PyOpcode_Deopt[instructions[i].op.code]; + opcode = _Py_GetBaseOpcode(code, i); + assert(opcode < MIN_INSTRUMENTED_OPCODE); int caches = _PyOpcode_Caches[opcode]; if (caches) { instructions[i + 1].cache = adaptive_counter_warmup(); @@ -1737,6 +1738,7 @@ _Py_Specialize_Call(PyObject *callable, _Py_CODEUNIT *instr, int nargs, { assert(ENABLE_SPECIALIZATION); assert(_PyOpcode_Caches[CALL] == INLINE_CACHE_ENTRIES_CALL); + assert(_Py_OPCODE(*instr) != INSTRUMENTED_CALL); _PyCallCache *cache = (_PyCallCache *)(instr + 1); int fail; if (PyCFunction_CheckExact(callable)) { @@ -2149,7 +2151,9 @@ _Py_Specialize_ForIter(PyObject *iter, _Py_CODEUNIT *instr, int oparg) goto success; } else if (tp == &PyGen_Type && oparg <= SHRT_MAX) { - assert(instr[oparg + INLINE_CACHE_ENTRIES_FOR_ITER + 1].op.code == END_FOR); + assert(instr[oparg + INLINE_CACHE_ENTRIES_FOR_ITER + 1].op.code == END_FOR || + instr[oparg + INLINE_CACHE_ENTRIES_FOR_ITER + 1].op.code == INSTRUMENTED_END_FOR + ); instr->op.code = FOR_ITER_GEN; goto success; } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index f1a294de598420..4d693a1be1f89e 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -3409,6 +3409,7 @@ _PySys_SetPreliminaryStderr(PyObject *sysdict) return _PyStatus_ERR("can't set preliminary stderr"); } +PyObject *_Py_CreateMonitoringObject(void); /* Create sys module without all attributes. _PySys_UpdateConfig() should be called later to add remaining attributes. */ @@ -3458,6 +3459,16 @@ _PySys_Create(PyThreadState *tstate, PyObject **sysmod_p) goto error; } + PyObject *monitoring = _Py_CreateMonitoringObject(); + if (monitoring == NULL) { + goto error; + } + int err = PyDict_SetItemString(sysdict, "monitoring", monitoring); + Py_DECREF(monitoring); + if (err < 0) { + goto error; + } + assert(!_PyErr_Occurred(tstate)); *sysmod_p = sysmod; diff --git a/Tools/build/deepfreeze.py b/Tools/build/deepfreeze.py index ec808526b7bbb7..aba5fecd8b1a99 100644 --- a/Tools/build/deepfreeze.py +++ b/Tools/build/deepfreeze.py @@ -255,7 +255,6 @@ def generate_code(self, name: str, code: types.CodeType) -> str: self.write(f".co_names = {co_names},") self.write(f".co_exceptiontable = {co_exceptiontable},") self.field(code, "co_flags") - self.write("._co_linearray_entry_size = 0,") self.field(code, "co_argcount") self.field(code, "co_posonlyargcount") self.field(code, "co_kwonlyargcount") @@ -276,7 +275,6 @@ def generate_code(self, name: str, code: types.CodeType) -> str: self.write(f".co_qualname = {co_qualname},") self.write(f".co_linetable = {co_linetable},") self.write(f"._co_cached = NULL,") - self.write("._co_linearray = NULL,") self.write(f".co_code_adaptive = {co_code_adaptive},") for i, op in enumerate(code.co_code[::2]): if op == RESUME: diff --git a/Tools/build/generate_opcode_h.py b/Tools/build/generate_opcode_h.py index 12fdd3ac84b346..645b9f1de1170b 100644 --- a/Tools/build/generate_opcode_h.py +++ b/Tools/build/generate_opcode_h.py @@ -89,6 +89,7 @@ def main(opcode_py, outfile='Include/opcode.h', internaloutfile='Include/interna HAVE_ARGUMENT = opcode["HAVE_ARGUMENT"] MIN_PSEUDO_OPCODE = opcode["MIN_PSEUDO_OPCODE"] MAX_PSEUDO_OPCODE = opcode["MAX_PSEUDO_OPCODE"] + MIN_INSTRUMENTED_OPCODE = opcode["MIN_INSTRUMENTED_OPCODE"] NUM_OPCODES = len(opname) used = [ False ] * len(opname) @@ -105,9 +106,6 @@ def main(opcode_py, outfile='Include/opcode.h', internaloutfile='Include/interna specialized_opmap[name] = next_op opname_including_specialized[next_op] = name used[next_op] = True - specialized_opmap['DO_TRACING'] = 255 - opname_including_specialized[255] = 'DO_TRACING' - used[255] = True with open(outfile, 'w') as fobj, open(internaloutfile, 'w') as iobj: fobj.write(header) @@ -120,6 +118,8 @@ def main(opcode_py, outfile='Include/opcode.h', internaloutfile='Include/interna fobj.write(DEFINE.format("HAVE_ARGUMENT", HAVE_ARGUMENT)) if op == MIN_PSEUDO_OPCODE: fobj.write(DEFINE.format("MIN_PSEUDO_OPCODE", MIN_PSEUDO_OPCODE)) + if op == MIN_INSTRUMENTED_OPCODE: + fobj.write(DEFINE.format("MIN_INSTRUMENTED_OPCODE", MIN_INSTRUMENTED_OPCODE)) fobj.write(DEFINE.format(name, op)) diff --git a/Tools/c-analyzer/cpython/globals-to-fix.tsv b/Tools/c-analyzer/cpython/globals-to-fix.tsv index e36024ad16c271..823340ecc49188 100644 --- a/Tools/c-analyzer/cpython/globals-to-fix.tsv +++ b/Tools/c-analyzer/cpython/globals-to-fix.tsv @@ -135,6 +135,9 @@ Objects/stringlib/unicode_format.h - PyFieldNameIter_Type - Objects/unicodeobject.c - EncodingMapType - #Objects/unicodeobject.c - PyFieldNameIter_Type - #Objects/unicodeobject.c - PyFormatterIter_Type - +Python/legacy_tracing.c - _PyLegacyEventHandler_Type - +Objects/object.c - _PyLegacyEventHandler_Type - + ##----------------------- ## static builtin structseq @@ -297,6 +300,8 @@ Objects/object.c - _Py_NotImplementedStruct - Objects/setobject.c - _dummy_struct - Objects/setobject.c - _PySet_Dummy - Objects/sliceobject.c - _Py_EllipsisObject - +Python/instrumentation.c - DISABLE - +Python/instrumentation.c - _PyInstrumentation_MISSING - ################################## From 52f96d3ea39fea4c16e26b7b10bd2db09726bd7c Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Wed, 12 Apr 2023 14:51:28 +0200 Subject: [PATCH 157/349] gh-103092: Isolate `_collections` (#103093) Co-authored-by: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> --- Lib/collections/__init__.py | 5 + ...-04-09-06-59-36.gh-issue-103092.vskbro.rst | 1 + Modules/_collectionsmodule.c | 555 +++++++++--------- Modules/clinic/_collectionsmodule.c.h | 4 +- Tools/c-analyzer/cpython/globals-to-fix.tsv | 5 - 5 files changed, 287 insertions(+), 283 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-09-06-59-36.gh-issue-103092.vskbro.rst diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index a5393aad4249c0..03ca2d7e18f6f0 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -45,6 +45,11 @@ else: _collections_abc.MutableSequence.register(deque) +try: + from _collections import _deque_iterator +except ImportError: + pass + try: from _collections import defaultdict except ImportError: diff --git a/Misc/NEWS.d/next/Library/2023-04-09-06-59-36.gh-issue-103092.vskbro.rst b/Misc/NEWS.d/next/Library/2023-04-09-06-59-36.gh-issue-103092.vskbro.rst new file mode 100644 index 00000000000000..6977c1489a29cb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-09-06-59-36.gh-issue-103092.vskbro.rst @@ -0,0 +1 @@ +Isolate :mod:`!_collections` (apply :pep:`687`). Patch by Erlend E. Aasland. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 9d8aef1e677157..a9b1425177c3d7 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1,17 +1,56 @@ #include "Python.h" #include "pycore_call.h" // _PyObject_CallNoArgs() #include "pycore_long.h" // _PyLong_GetZero() +#include "pycore_moduleobject.h" // _PyModule_GetState() +#include "pycore_typeobject.h" // _PyType_GetModuleState() #include "structmember.h" // PyMemberDef #include +typedef struct { + PyTypeObject *deque_type; + PyTypeObject *defdict_type; + PyTypeObject *dequeiter_type; + PyTypeObject *dequereviter_type; + PyTypeObject *tuplegetter_type; +} collections_state; + +static inline collections_state * +get_module_state(PyObject *mod) +{ + void *state = _PyModule_GetState(mod); + assert(state != NULL); + return (collections_state *)state; +} + +static inline collections_state * +get_module_state_by_cls(PyTypeObject *cls) +{ + void *state = _PyType_GetModuleState(cls); + assert(state != NULL); + return (collections_state *)state; +} + +static struct PyModuleDef _collectionsmodule; + +static inline collections_state * +find_module_state_by_def(PyTypeObject *type) +{ + PyObject *mod = PyType_GetModuleByDef(type, &_collectionsmodule); + assert(mod != NULL); + return get_module_state(mod); +} + /*[clinic input] module _collections -class _tuplegetter "_tuplegetterobject *" "&tuplegetter_type" +class _tuplegetter "_tuplegetterobject *" "clinic_state()->tuplegetter_type" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=a8ece4ccad7e30ac]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=7356042a89862e0e]*/ -static PyTypeObject tuplegetter_type; +/* We can safely assume type to be the defining class, + * since tuplegetter is not a base type */ +#define clinic_state() (get_module_state_by_cls(type)) #include "clinic/_collectionsmodule.c.h" +#undef clinic_state /* collections module implementation of a deque() datatype Written and maintained by Raymond D. Hettinger @@ -94,8 +133,6 @@ typedef struct { PyObject *weakreflist; } dequeobject; -static PyTypeObject deque_type; - /* For debug builds, add error checking to track the endpoints * in the chain of links. The goal is to make sure that link * assignments only take place at endpoints so that links already @@ -484,11 +521,13 @@ deque_copy(PyObject *deque, PyObject *Py_UNUSED(ignored)) { PyObject *result; dequeobject *old_deque = (dequeobject *)deque; - if (Py_IS_TYPE(deque, &deque_type)) { + collections_state *state = find_module_state_by_def(Py_TYPE(deque)); + if (Py_IS_TYPE(deque, state->deque_type)) { dequeobject *new_deque; PyObject *rv; - new_deque = (dequeobject *)deque_new(&deque_type, (PyObject *)NULL, (PyObject *)NULL); + new_deque = (dequeobject *)deque_new(state->deque_type, + (PyObject *)NULL, (PyObject *)NULL); if (new_deque == NULL) return NULL; new_deque->maxlen = old_deque->maxlen; @@ -511,7 +550,7 @@ deque_copy(PyObject *deque, PyObject *Py_UNUSED(ignored)) else result = PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi", deque, old_deque->maxlen, NULL); - if (result != NULL && !PyObject_TypeCheck(result, &deque_type)) { + if (result != NULL && !PyObject_TypeCheck(result, state->deque_type)) { PyErr_Format(PyExc_TypeError, "%.200s() must return a deque, not %.200s", Py_TYPE(deque)->tp_name, Py_TYPE(result)->tp_name); @@ -529,7 +568,8 @@ deque_concat(dequeobject *deque, PyObject *other) PyObject *new_deque, *result; int rv; - rv = PyObject_IsInstance(other, (PyObject *)&deque_type); + collections_state *state = find_module_state_by_def(Py_TYPE(deque)); + rv = PyObject_IsInstance(other, (PyObject *)state->deque_type); if (rv <= 0) { if (rv == 0) { PyErr_Format(PyExc_TypeError, @@ -1288,6 +1328,7 @@ deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v) static void deque_dealloc(dequeobject *deque) { + PyTypeObject *tp = Py_TYPE(deque); Py_ssize_t i; PyObject_GC_UnTrack(deque); @@ -1303,12 +1344,15 @@ deque_dealloc(dequeobject *deque) for (i=0 ; i < deque->numfreeblocks ; i++) { PyMem_Free(deque->freeblocks[i]); } - Py_TYPE(deque)->tp_free(deque); + tp->tp_free(deque); + Py_DECREF(tp); } static int deque_traverse(dequeobject *deque, visitproc visit, void *arg) { + Py_VISIT(Py_TYPE(deque)); + block *b; PyObject *item; Py_ssize_t index; @@ -1393,8 +1437,9 @@ deque_richcompare(PyObject *v, PyObject *w, int op) Py_ssize_t vs, ws; int b, cmp=-1; - if (!PyObject_TypeCheck(v, &deque_type) || - !PyObject_TypeCheck(w, &deque_type)) { + collections_state *state = find_module_state_by_def(Py_TYPE(v)); + if (!PyObject_TypeCheck(v, state->deque_type) || + !PyObject_TypeCheck(w, state->deque_type)) { Py_RETURN_NOTIMPLEMENTED; } @@ -1537,19 +1582,6 @@ static PyGetSetDef deque_getset[] = { {0} }; -static PySequenceMethods deque_as_sequence = { - (lenfunc)deque_len, /* sq_length */ - (binaryfunc)deque_concat, /* sq_concat */ - (ssizeargfunc)deque_repeat, /* sq_repeat */ - (ssizeargfunc)deque_item, /* sq_item */ - 0, /* sq_slice */ - (ssizeobjargproc)deque_ass_item, /* sq_ass_item */ - 0, /* sq_ass_slice */ - (objobjproc)deque_contains, /* sq_contains */ - (binaryfunc)deque_inplace_concat, /* sq_inplace_concat */ - (ssizeargfunc)deque_inplace_repeat, /* sq_inplace_repeat */ -}; - static PyObject *deque_iter(dequeobject *deque); static PyObject *deque_reviter(dequeobject *deque, PyObject *Py_UNUSED(ignored)); PyDoc_STRVAR(reversed_doc, @@ -1597,54 +1629,53 @@ static PyMethodDef deque_methods[] = { {NULL, NULL} /* sentinel */ }; +static PyMemberDef deque_members[] = { + {"__weaklistoffset__", T_PYSSIZET, offsetof(dequeobject, weakreflist), READONLY}, + {NULL}, +}; + PyDoc_STRVAR(deque_doc, "deque([iterable[, maxlen]]) --> deque object\n\ \n\ A list-like sequence optimized for data accesses near its endpoints."); -static PyTypeObject deque_type = { - PyVarObject_HEAD_INIT(NULL, 0) - "collections.deque", /* tp_name */ - sizeof(dequeobject), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - (destructor)deque_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - deque_repr, /* tp_repr */ - 0, /* tp_as_number */ - &deque_as_sequence, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - PyObject_HashNotImplemented, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_SEQUENCE, - /* tp_flags */ - deque_doc, /* tp_doc */ - (traverseproc)deque_traverse, /* tp_traverse */ - (inquiry)deque_clear, /* tp_clear */ - (richcmpfunc)deque_richcompare, /* tp_richcompare */ - offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/ - (getiterfunc)deque_iter, /* tp_iter */ - 0, /* tp_iternext */ - deque_methods, /* tp_methods */ - 0, /* tp_members */ - deque_getset, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)deque_init, /* tp_init */ - PyType_GenericAlloc, /* tp_alloc */ - deque_new, /* tp_new */ - PyObject_GC_Del, /* tp_free */ +static PyType_Slot deque_slots[] = { + {Py_tp_dealloc, deque_dealloc}, + {Py_tp_repr, deque_repr}, + {Py_tp_hash, PyObject_HashNotImplemented}, + {Py_tp_getattro, PyObject_GenericGetAttr}, + {Py_tp_doc, (void *)deque_doc}, + {Py_tp_traverse, deque_traverse}, + {Py_tp_clear, deque_clear}, + {Py_tp_richcompare, deque_richcompare}, + {Py_tp_iter, deque_iter}, + {Py_tp_getset, deque_getset}, + {Py_tp_init, deque_init}, + {Py_tp_alloc, PyType_GenericAlloc}, + {Py_tp_new, deque_new}, + {Py_tp_free, PyObject_GC_Del}, + {Py_tp_methods, deque_methods}, + {Py_tp_members, deque_members}, + + // Sequence protocol + {Py_sq_length, deque_len}, + {Py_sq_concat, deque_concat}, + {Py_sq_repeat, deque_repeat}, + {Py_sq_item, deque_item}, + {Py_sq_ass_item, deque_ass_item}, + {Py_sq_contains, deque_contains}, + {Py_sq_inplace_concat, deque_inplace_concat}, + {Py_sq_inplace_repeat, deque_inplace_repeat}, + {0, NULL}, +}; + +static PyType_Spec deque_spec = { + .name = "collections.deque", + .basicsize = sizeof(dequeobject), + .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_SEQUENCE | + Py_TPFLAGS_IMMUTABLETYPE), + .slots = deque_slots, }; /*********************** Deque Iterator **************************/ @@ -1658,14 +1689,13 @@ typedef struct { Py_ssize_t counter; /* number of items remaining for iteration */ } dequeiterobject; -static PyTypeObject dequeiter_type; - static PyObject * deque_iter(dequeobject *deque) { dequeiterobject *it; - it = PyObject_GC_New(dequeiterobject, &dequeiter_type); + collections_state *state = find_module_state_by_def(Py_TYPE(deque)); + it = PyObject_GC_New(dequeiterobject, state->dequeiter_type); if (it == NULL) return NULL; it->b = deque->leftblock; @@ -1680,17 +1710,27 @@ deque_iter(dequeobject *deque) static int dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg) { + Py_VISIT(Py_TYPE(dio)); Py_VISIT(dio->deque); return 0; } +static int +dequeiter_clear(dequeiterobject *dio) +{ + Py_CLEAR(dio->deque); + return 0; +} + static void dequeiter_dealloc(dequeiterobject *dio) { /* bpo-31095: UnTrack is needed before calling any callbacks */ + PyTypeObject *tp = Py_TYPE(dio); PyObject_GC_UnTrack(dio); - Py_XDECREF(dio->deque); + (void)dequeiter_clear(dio); PyObject_GC_Del(dio); + Py_DECREF(tp); } static PyObject * @@ -1726,9 +1766,10 @@ dequeiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) Py_ssize_t i, index=0; PyObject *deque; dequeiterobject *it; - if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index)) + collections_state *state = get_module_state_by_cls(type); + if (!PyArg_ParseTuple(args, "O!|n", state->deque_type, &deque, &index)) return NULL; - assert(type == &dequeiter_type); + assert(type == state->dequeiter_type); it = (dequeiterobject*)deque_iter((dequeobject *)deque); if (!it) @@ -1769,59 +1810,35 @@ static PyMethodDef dequeiter_methods[] = { {NULL, NULL} /* sentinel */ }; -static PyTypeObject dequeiter_type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_collections._deque_iterator", /* tp_name */ - sizeof(dequeiterobject), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - (destructor)dequeiter_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - 0, /* tp_doc */ - (traverseproc)dequeiter_traverse, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - PyObject_SelfIter, /* tp_iter */ - (iternextfunc)dequeiter_next, /* tp_iternext */ - dequeiter_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - dequeiter_new, /* tp_new */ - 0, +static PyType_Slot dequeiter_slots[] = { + {Py_tp_dealloc, dequeiter_dealloc}, + {Py_tp_getattro, PyObject_GenericGetAttr}, + {Py_tp_traverse, dequeiter_traverse}, + {Py_tp_clear, dequeiter_clear}, + {Py_tp_iter, PyObject_SelfIter}, + {Py_tp_iternext, dequeiter_next}, + {Py_tp_methods, dequeiter_methods}, + {Py_tp_new, dequeiter_new}, + {0, NULL}, }; -/*********************** Deque Reverse Iterator **************************/ +static PyType_Spec dequeiter_spec = { + .name = "collections._deque_iterator", + .basicsize = sizeof(dequeiterobject), + .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_IMMUTABLETYPE), + .slots = dequeiter_slots, +}; -static PyTypeObject dequereviter_type; +/*********************** Deque Reverse Iterator **************************/ static PyObject * deque_reviter(dequeobject *deque, PyObject *Py_UNUSED(ignored)) { dequeiterobject *it; + collections_state *state = find_module_state_by_def(Py_TYPE(deque)); - it = PyObject_GC_New(dequeiterobject, &dequereviter_type); + it = PyObject_GC_New(dequeiterobject, state->dequereviter_type); if (it == NULL) return NULL; it->b = deque->rightblock; @@ -1866,9 +1883,10 @@ dequereviter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) Py_ssize_t i, index=0; PyObject *deque; dequeiterobject *it; - if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index)) + collections_state *state = get_module_state_by_cls(type); + if (!PyArg_ParseTuple(args, "O!|n", state->deque_type, &deque, &index)) return NULL; - assert(type == &dequereviter_type); + assert(type == state->dequereviter_type); it = (dequeiterobject*)deque_reviter((dequeobject *)deque, NULL); if (!it) @@ -1889,47 +1907,24 @@ dequereviter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return (PyObject*)it; } -static PyTypeObject dequereviter_type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_collections._deque_reverse_iterator", /* tp_name */ - sizeof(dequeiterobject), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - (destructor)dequeiter_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - 0, /* tp_doc */ - (traverseproc)dequeiter_traverse, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - PyObject_SelfIter, /* tp_iter */ - (iternextfunc)dequereviter_next, /* tp_iternext */ - dequeiter_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - dequereviter_new, /* tp_new */ - 0, +static PyType_Slot dequereviter_slots[] = { + {Py_tp_dealloc, dequeiter_dealloc}, + {Py_tp_getattro, PyObject_GenericGetAttr}, + {Py_tp_traverse, dequeiter_traverse}, + {Py_tp_clear, dequeiter_clear}, + {Py_tp_iter, PyObject_SelfIter}, + {Py_tp_iternext, dequereviter_next}, + {Py_tp_methods, dequeiter_methods}, + {Py_tp_new, dequereviter_new}, + {0, NULL}, +}; + +static PyType_Spec dequereviter_spec = { + .name = "collections._deque_reverse_iterator", + .basicsize = sizeof(dequeiterobject), + .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_IMMUTABLETYPE), + .slots = dequereviter_slots, }; /* defaultdict type *********************************************************/ @@ -1939,8 +1934,6 @@ typedef struct { PyObject *default_factory; } defdictobject; -static PyTypeObject defdict_type; /* Forward */ - PyDoc_STRVAR(defdict_missing_doc, "__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\ if self.default_factory is None: raise KeyError((key,))\n\ @@ -2071,9 +2064,11 @@ static void defdict_dealloc(defdictobject *dd) { /* bpo-31095: UnTrack is needed before calling any callbacks */ + PyTypeObject *tp = Py_TYPE(dd); PyObject_GC_UnTrack(dd); Py_CLEAR(dd->default_factory); PyDict_Type.tp_dealloc((PyObject *)dd); + Py_DECREF(tp); } static PyObject * @@ -2117,11 +2112,24 @@ static PyObject* defdict_or(PyObject* left, PyObject* right) { PyObject *self, *other; - if (PyObject_TypeCheck(left, &defdict_type)) { + + // Find module state + PyTypeObject *tp = Py_TYPE(left); + PyObject *mod = PyType_GetModuleByDef(tp, &_collectionsmodule); + if (mod == NULL) { + PyErr_Clear(); + tp = Py_TYPE(right); + mod = PyType_GetModuleByDef(tp, &_collectionsmodule); + } + assert(mod != NULL); + collections_state *state = get_module_state(mod); + + if (PyObject_TypeCheck(left, state->defdict_type)) { self = left; other = right; } else { + assert(PyObject_TypeCheck(right, state->defdict_type)); self = right; other = left; } @@ -2141,13 +2149,10 @@ defdict_or(PyObject* left, PyObject* right) return new; } -static PyNumberMethods defdict_as_number = { - .nb_or = defdict_or, -}; - static int defdict_traverse(PyObject *self, visitproc visit, void *arg) { + Py_VISIT(Py_TYPE(self)); Py_VISIT(((defdictobject *)self)->default_factory); return PyDict_Type.tp_traverse(self, visit, arg); } @@ -2203,48 +2208,28 @@ passed to the dict constructor, including keyword arguments.\n\ /* See comment in xxsubtype.c */ #define DEFERRED_ADDRESS(ADDR) 0 -static PyTypeObject defdict_type = { - PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0) - "collections.defaultdict", /* tp_name */ - sizeof(defdictobject), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - (destructor)defdict_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - (reprfunc)defdict_repr, /* tp_repr */ - &defdict_as_number, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, - /* tp_flags */ - defdict_doc, /* tp_doc */ - defdict_traverse, /* tp_traverse */ - (inquiry)defdict_tp_clear, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset*/ - 0, /* tp_iter */ - 0, /* tp_iternext */ - defdict_methods, /* tp_methods */ - defdict_members, /* tp_members */ - 0, /* tp_getset */ - DEFERRED_ADDRESS(&PyDict_Type), /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - defdict_init, /* tp_init */ - PyType_GenericAlloc, /* tp_alloc */ - 0, /* tp_new */ - PyObject_GC_Del, /* tp_free */ +static PyType_Slot defdict_slots[] = { + {Py_tp_dealloc, defdict_dealloc}, + {Py_tp_repr, defdict_repr}, + {Py_nb_or, defdict_or}, + {Py_tp_getattro, PyObject_GenericGetAttr}, + {Py_tp_doc, (void *)defdict_doc}, + {Py_tp_traverse, defdict_traverse}, + {Py_tp_clear, defdict_tp_clear}, + {Py_tp_methods, defdict_methods}, + {Py_tp_members, defdict_members}, + {Py_tp_init, defdict_init}, + {Py_tp_alloc, PyType_GenericAlloc}, + {Py_tp_free, PyObject_GC_Del}, + {0, NULL}, +}; + +static PyType_Spec defdict_spec = { + .name = "collections.defaultdict", + .basicsize = sizeof(defdictobject), + .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_IMMUTABLETYPE), + .slots = defdict_slots, }; /* helper function for Counter *********************************************/ @@ -2442,6 +2427,7 @@ static int tuplegetter_traverse(PyObject *self, visitproc visit, void *arg) { _tuplegetterobject *tuplegetter = (_tuplegetterobject *)self; + Py_VISIT(Py_TYPE(tuplegetter)); Py_VISIT(tuplegetter->doc); return 0; } @@ -2457,9 +2443,11 @@ tuplegetter_clear(PyObject *self) static void tuplegetter_dealloc(_tuplegetterobject *self) { + PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); tuplegetter_clear((PyObject*)self); - Py_TYPE(self)->tp_free((PyObject*)self); + tp->tp_free((PyObject*)self); + Py_DECREF(tp); } static PyObject* @@ -2487,52 +2475,60 @@ static PyMethodDef tuplegetter_methods[] = { {NULL}, }; -static PyTypeObject tuplegetter_type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_collections._tuplegetter", /* tp_name */ - sizeof(_tuplegetterobject), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - (destructor)tuplegetter_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - (reprfunc)tuplegetter_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - 0, /* tp_doc */ - (traverseproc)tuplegetter_traverse, /* tp_traverse */ - (inquiry)tuplegetter_clear, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - tuplegetter_methods, /* tp_methods */ - tuplegetter_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - tuplegetter_descr_get, /* tp_descr_get */ - tuplegetter_descr_set, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - tuplegetter_new, /* tp_new */ - 0, +static PyType_Slot tuplegetter_slots[] = { + {Py_tp_dealloc, tuplegetter_dealloc}, + {Py_tp_repr, tuplegetter_repr}, + {Py_tp_traverse, tuplegetter_traverse}, + {Py_tp_clear, tuplegetter_clear}, + {Py_tp_methods, tuplegetter_methods}, + {Py_tp_members, tuplegetter_members}, + {Py_tp_descr_get, tuplegetter_descr_get}, + {Py_tp_descr_set, tuplegetter_descr_set}, + {Py_tp_new, tuplegetter_new}, + {0, NULL}, +}; + +static PyType_Spec tuplegetter_spec = { + .name = "collections._tuplegetter", + .basicsize = sizeof(_tuplegetterobject), + .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_IMMUTABLETYPE), + .slots = tuplegetter_slots, }; /* module level code ********************************************************/ +static int +collections_traverse(PyObject *mod, visitproc visit, void *arg) +{ + collections_state *state = get_module_state(mod); + Py_VISIT(state->deque_type); + Py_VISIT(state->defdict_type); + Py_VISIT(state->dequeiter_type); + Py_VISIT(state->dequereviter_type); + Py_VISIT(state->tuplegetter_type); + return 0; +} + +static int +collections_clear(PyObject *mod) +{ + collections_state *state = get_module_state(mod); + Py_CLEAR(state->deque_type); + Py_CLEAR(state->defdict_type); + Py_CLEAR(state->dequeiter_type); + Py_CLEAR(state->dequereviter_type); + Py_CLEAR(state->tuplegetter_type); + return 0; +} + +static void +collections_free(void *module) +{ + collections_clear((PyObject *)module); +} + PyDoc_STRVAR(collections_doc, "High performance data structures.\n\ - deque: ordered collection accessible from endpoints only\n\ @@ -2544,43 +2540,50 @@ static struct PyMethodDef collections_methods[] = { {NULL, NULL} /* sentinel */ }; +#define ADD_TYPE(MOD, SPEC, TYPE, BASE) do { \ + TYPE = (PyTypeObject *)PyType_FromMetaclass(NULL, MOD, SPEC, \ + (PyObject *)BASE); \ + if (TYPE == NULL) { \ + return -1; \ + } \ + if (PyModule_AddType(MOD, TYPE) < 0) { \ + return -1; \ + } \ +} while (0) + static int collections_exec(PyObject *module) { - PyTypeObject *typelist[] = { - &deque_type, - &defdict_type, - &PyODict_Type, - &dequeiter_type, - &dequereviter_type, - &tuplegetter_type - }; - - defdict_type.tp_base = &PyDict_Type; - - for (size_t i = 0; i < Py_ARRAY_LENGTH(typelist); i++) { - if (PyModule_AddType(module, typelist[i]) < 0) { - return -1; - } + collections_state *state = get_module_state(module); + ADD_TYPE(module, &deque_spec, state->deque_type, NULL); + ADD_TYPE(module, &defdict_spec, state->defdict_type, &PyDict_Type); + ADD_TYPE(module, &dequeiter_spec, state->dequeiter_type, NULL); + ADD_TYPE(module, &dequereviter_spec, state->dequereviter_type, NULL); + ADD_TYPE(module, &tuplegetter_spec, state->tuplegetter_type, NULL); + + if (PyModule_AddType(module, &PyODict_Type) < 0) { + return -1; } return 0; } +#undef ADD_TYPE + static struct PyModuleDef_Slot collections_slots[] = { {Py_mod_exec, collections_exec}, {0, NULL} }; static struct PyModuleDef _collectionsmodule = { - PyModuleDef_HEAD_INIT, - "_collections", - collections_doc, - 0, - collections_methods, - collections_slots, - NULL, - NULL, - NULL + .m_base = PyModuleDef_HEAD_INIT, + .m_name = "_collections", + .m_doc = collections_doc, + .m_size = sizeof(collections_state), + .m_methods = collections_methods, + .m_slots = collections_slots, + .m_traverse = collections_traverse, + .m_clear = collections_clear, + .m_free = collections_free, }; PyMODINIT_FUNC diff --git a/Modules/clinic/_collectionsmodule.c.h b/Modules/clinic/_collectionsmodule.c.h index 8ea0255b061070..3882d069216e28 100644 --- a/Modules/clinic/_collectionsmodule.c.h +++ b/Modules/clinic/_collectionsmodule.c.h @@ -46,7 +46,7 @@ static PyObject * tuplegetter_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; - PyTypeObject *base_tp = &tuplegetter_type; + PyTypeObject *base_tp = clinic_state()->tuplegetter_type; Py_ssize_t index; PyObject *doc; @@ -75,4 +75,4 @@ tuplegetter_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=91a0f221c7b1f96c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=00e516317d2b8bed input=a9049054013a1b77]*/ diff --git a/Tools/c-analyzer/cpython/globals-to-fix.tsv b/Tools/c-analyzer/cpython/globals-to-fix.tsv index 823340ecc49188..5c173b1041e3e4 100644 --- a/Tools/c-analyzer/cpython/globals-to-fix.tsv +++ b/Tools/c-analyzer/cpython/globals-to-fix.tsv @@ -316,11 +316,6 @@ Python/instrumentation.c - _PyInstrumentation_MISSING - ##----------------------- ## static types -Modules/_collectionsmodule.c - defdict_type - -Modules/_collectionsmodule.c - deque_type - -Modules/_collectionsmodule.c - dequeiter_type - -Modules/_collectionsmodule.c - dequereviter_type - -Modules/_collectionsmodule.c - tuplegetter_type - Modules/_io/bufferedio.c - PyBufferedIOBase_Type - Modules/_io/bytesio.c - _PyBytesIOBuffer_Type - Modules/_io/iobase.c - PyIOBase_Type - From 7f3c10650385907b5a2234edb2b1334cafd47a0a Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Wed, 12 Apr 2023 21:27:14 +0300 Subject: [PATCH 158/349] gh-103326: Remove `Python/importlib.h` (GH-103331) Co-authored-by: Brett Cannon Co-authored-by: Hugo van Kemenade --- .github/CODEOWNERS | 6 +- Programs/_freeze_module.c | 3 +- Python/importlib.h | 1783 --------------------------- Tools/c-analyzer/cpython/_parser.py | 1 - configure | 1 - configure.ac | 1 - 6 files changed, 2 insertions(+), 1793 deletions(-) delete mode 100644 Python/importlib.h diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 60af0519cdb743..9149b38d87601c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -61,11 +61,7 @@ Python/traceback.c @iritkatriel /Tools/build/parse_html5_entities.py @ezio-melotti # Import (including importlib). -# Ignoring importlib.h so as to not get flagged on -# all pull requests that change the emitted -# bytecode. -**/*import*.c @brettcannon @encukou @ericsnowcurrently @ncoghlan @warsaw -**/*import*.py @brettcannon @encukou @ericsnowcurrently @ncoghlan @warsaw +**/*import* @brettcannon @encukou @ericsnowcurrently @ncoghlan @warsaw **/*importlib/resources/* @jaraco @warsaw @FFY00 **/importlib/metadata/* @jaraco @warsaw diff --git a/Programs/_freeze_module.c b/Programs/_freeze_module.c index 90fc2dc6e87da8..e55f1d56745c4d 100644 --- a/Programs/_freeze_module.c +++ b/Programs/_freeze_module.c @@ -1,6 +1,5 @@ /* This is built as a stand-alone executable by the Makefile, and helps turn - modules into frozen modules (like Lib/importlib/_bootstrap.py - into Python/importlib.h). + modules into frozen modules. This is used directly by Tools/build/freeze_modules.py, and indirectly by "make regen-frozen". diff --git a/Python/importlib.h b/Python/importlib.h deleted file mode 100644 index 586f3b21f46246..00000000000000 --- a/Python/importlib.h +++ /dev/null @@ -1,1783 +0,0 @@ -/* Auto-generated by Programs/_freeze_importlib.c */ -const unsigned char _Py_M__importlib_bootstrap[] = { - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,64,0,0,0,115,194,1,0,0,100,0, - 90,0,100,1,97,1,100,2,100,3,132,0,90,2,100,4, - 100,5,132,0,90,3,105,0,90,4,105,0,90,5,71,0, - 100,6,100,7,132,0,100,7,101,6,131,3,90,7,71,0, - 100,8,100,9,132,0,100,9,131,2,90,8,71,0,100,10, - 100,11,132,0,100,11,131,2,90,9,71,0,100,12,100,13, - 132,0,100,13,131,2,90,10,100,14,100,15,132,0,90,11, - 100,16,100,17,132,0,90,12,100,18,100,19,132,0,90,13, - 100,20,100,21,156,1,100,22,100,23,132,2,90,14,100,24, - 100,25,132,0,90,15,100,26,100,27,132,0,90,16,100,28, - 100,29,132,0,90,17,100,30,100,31,132,0,90,18,71,0, - 100,32,100,33,132,0,100,33,131,2,90,19,100,1,100,1, - 100,34,156,2,100,35,100,36,132,2,90,20,100,94,100,37, - 100,38,132,1,90,21,100,39,100,40,156,1,100,41,100,42, - 132,2,90,22,100,43,100,44,132,0,90,23,100,45,100,46, - 132,0,90,24,100,47,100,48,132,0,90,25,100,49,100,50, - 132,0,90,26,100,51,100,52,132,0,90,27,100,53,100,54, - 132,0,90,28,71,0,100,55,100,56,132,0,100,56,131,2, - 90,29,71,0,100,57,100,58,132,0,100,58,131,2,90,30, - 71,0,100,59,100,60,132,0,100,60,131,2,90,31,100,61, - 100,62,132,0,90,32,100,63,100,64,132,0,90,33,100,95, - 100,65,100,66,132,1,90,34,100,67,100,68,132,0,90,35, - 100,69,90,36,101,36,100,70,23,0,90,37,100,71,100,72, - 132,0,90,38,101,39,131,0,90,40,100,73,100,74,132,0, - 90,41,100,96,100,76,100,77,132,1,90,42,100,39,100,78, - 156,1,100,79,100,80,132,2,90,43,100,81,100,82,132,0, - 90,44,100,97,100,84,100,85,132,1,90,45,100,86,100,87, - 132,0,90,46,100,88,100,89,132,0,90,47,100,90,100,91, - 132,0,90,48,100,92,100,93,132,0,90,49,100,1,83,0, - 41,98,97,83,1,0,0,67,111,114,101,32,105,109,112,108, - 101,109,101,110,116,97,116,105,111,110,32,111,102,32,105,109, - 112,111,114,116,46,10,10,84,104,105,115,32,109,111,100,117, - 108,101,32,105,115,32,78,79,84,32,109,101,97,110,116,32, - 116,111,32,98,101,32,100,105,114,101,99,116,108,121,32,105, - 109,112,111,114,116,101,100,33,32,73,116,32,104,97,115,32, - 98,101,101,110,32,100,101,115,105,103,110,101,100,32,115,117, - 99,104,10,116,104,97,116,32,105,116,32,99,97,110,32,98, - 101,32,98,111,111,116,115,116,114,97,112,112,101,100,32,105, - 110,116,111,32,80,121,116,104,111,110,32,97,115,32,116,104, - 101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110, - 32,111,102,32,105,109,112,111,114,116,46,32,65,115,10,115, - 117,99,104,32,105,116,32,114,101,113,117,105,114,101,115,32, - 116,104,101,32,105,110,106,101,99,116,105,111,110,32,111,102, - 32,115,112,101,99,105,102,105,99,32,109,111,100,117,108,101, - 115,32,97,110,100,32,97,116,116,114,105,98,117,116,101,115, - 32,105,110,32,111,114,100,101,114,32,116,111,10,119,111,114, - 107,46,32,79,110,101,32,115,104,111,117,108,100,32,117,115, - 101,32,105,109,112,111,114,116,108,105,98,32,97,115,32,116, - 104,101,32,112,117,98,108,105,99,45,102,97,99,105,110,103, - 32,118,101,114,115,105,111,110,32,111,102,32,116,104,105,115, - 32,109,111,100,117,108,101,46,10,10,78,99,2,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,7,0,0,0, - 67,0,0,0,115,56,0,0,0,100,1,68,0,93,32,125, - 2,116,0,124,1,124,2,131,2,114,4,116,1,124,0,124, - 2,116,2,124,1,124,2,131,2,131,3,1,0,113,4,124, - 0,106,3,160,4,124,1,106,3,161,1,1,0,100,2,83, - 0,41,3,122,47,83,105,109,112,108,101,32,115,117,98,115, - 116,105,116,117,116,101,32,102,111,114,32,102,117,110,99,116, - 111,111,108,115,46,117,112,100,97,116,101,95,119,114,97,112, - 112,101,114,46,41,4,218,10,95,95,109,111,100,117,108,101, - 95,95,218,8,95,95,110,97,109,101,95,95,218,12,95,95, - 113,117,97,108,110,97,109,101,95,95,218,7,95,95,100,111, - 99,95,95,78,41,5,218,7,104,97,115,97,116,116,114,218, - 7,115,101,116,97,116,116,114,218,7,103,101,116,97,116,116, - 114,218,8,95,95,100,105,99,116,95,95,218,6,117,112,100, - 97,116,101,41,3,90,3,110,101,119,90,3,111,108,100,218, - 7,114,101,112,108,97,99,101,169,0,114,10,0,0,0,250, - 29,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, - 105,98,46,95,98,111,111,116,115,116,114,97,112,62,218,5, - 95,119,114,97,112,27,0,0,0,115,8,0,0,0,0,2, - 8,1,10,1,20,1,114,12,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0, - 67,0,0,0,115,12,0,0,0,116,0,116,1,131,1,124, - 0,131,1,83,0,169,1,78,41,2,218,4,116,121,112,101, - 218,3,115,121,115,169,1,218,4,110,97,109,101,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,11,95,110, - 101,119,95,109,111,100,117,108,101,35,0,0,0,115,2,0, - 0,0,0,1,114,18,0,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,64,0, - 0,0,115,12,0,0,0,101,0,90,1,100,0,90,2,100, - 1,83,0,41,2,218,14,95,68,101,97,100,108,111,99,107, - 69,114,114,111,114,78,41,3,114,1,0,0,0,114,0,0, - 0,0,114,2,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,19,0,0,0, - 48,0,0,0,115,2,0,0,0,8,1,114,19,0,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,64,0,0,0,115,56,0,0,0,101,0, - 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, - 90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,0, - 90,6,100,8,100,9,132,0,90,7,100,10,100,11,132,0, - 90,8,100,12,83,0,41,13,218,11,95,77,111,100,117,108, - 101,76,111,99,107,122,169,65,32,114,101,99,117,114,115,105, - 118,101,32,108,111,99,107,32,105,109,112,108,101,109,101,110, - 116,97,116,105,111,110,32,119,104,105,99,104,32,105,115,32, - 97,98,108,101,32,116,111,32,100,101,116,101,99,116,32,100, - 101,97,100,108,111,99,107,115,10,32,32,32,32,40,101,46, - 103,46,32,116,104,114,101,97,100,32,49,32,116,114,121,105, - 110,103,32,116,111,32,116,97,107,101,32,108,111,99,107,115, - 32,65,32,116,104,101,110,32,66,44,32,97,110,100,32,116, - 104,114,101,97,100,32,50,32,116,114,121,105,110,103,32,116, - 111,10,32,32,32,32,116,97,107,101,32,108,111,99,107,115, - 32,66,32,116,104,101,110,32,65,41,46,10,32,32,32,32, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,2,0,0,0,67,0,0,0,115,48,0,0,0,116,0, - 160,1,161,0,124,0,95,2,116,0,160,1,161,0,124,0, - 95,3,124,1,124,0,95,4,100,0,124,0,95,5,100,1, - 124,0,95,6,100,1,124,0,95,7,100,0,83,0,169,2, - 78,233,0,0,0,0,41,8,218,7,95,116,104,114,101,97, - 100,90,13,97,108,108,111,99,97,116,101,95,108,111,99,107, - 218,4,108,111,99,107,218,6,119,97,107,101,117,112,114,17, - 0,0,0,218,5,111,119,110,101,114,218,5,99,111,117,110, - 116,218,7,119,97,105,116,101,114,115,169,2,218,4,115,101, - 108,102,114,17,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,8,95,95,105,110,105,116,95,95, - 58,0,0,0,115,12,0,0,0,0,1,10,1,10,1,6, - 1,6,1,6,1,122,20,95,77,111,100,117,108,101,76,111, - 99,107,46,95,95,105,110,105,116,95,95,99,1,0,0,0, - 0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0, - 67,0,0,0,115,60,0,0,0,116,0,160,1,161,0,125, - 1,124,0,106,2,125,2,116,3,160,4,124,2,161,1,125, - 3,124,3,100,0,107,8,114,36,100,1,83,0,124,3,106, - 2,125,2,124,2,124,1,107,2,114,14,100,2,83,0,113, - 14,100,0,83,0,41,3,78,70,84,41,5,114,23,0,0, - 0,218,9,103,101,116,95,105,100,101,110,116,114,26,0,0, - 0,218,12,95,98,108,111,99,107,105,110,103,95,111,110,218, - 3,103,101,116,41,4,114,30,0,0,0,90,2,109,101,218, - 3,116,105,100,114,24,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,12,104,97,115,95,100,101, - 97,100,108,111,99,107,66,0,0,0,115,16,0,0,0,0, - 2,8,1,6,2,10,1,8,1,4,1,6,1,8,1,122, - 24,95,77,111,100,117,108,101,76,111,99,107,46,104,97,115, - 95,100,101,97,100,108,111,99,107,99,1,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,9,0,0,0,67,0, - 0,0,115,178,0,0,0,116,0,160,1,161,0,125,1,124, - 0,116,2,124,1,60,0,122,148,124,0,106,3,143,110,1, - 0,124,0,106,4,100,1,107,2,115,46,124,0,106,5,124, - 1,107,2,114,84,124,1,124,0,95,5,124,0,4,0,106, - 4,100,2,55,0,2,0,95,4,87,0,53,0,81,0,82, - 0,163,0,87,0,162,86,100,3,83,0,124,0,160,6,161, - 0,114,104,116,7,100,4,124,0,22,0,131,1,130,1,124, - 0,106,8,160,9,100,5,161,1,114,130,124,0,4,0,106, - 10,100,2,55,0,2,0,95,10,87,0,53,0,81,0,82, - 0,88,0,124,0,106,8,160,9,161,0,1,0,124,0,106, - 8,160,11,161,0,1,0,113,18,87,0,53,0,116,2,124, - 1,61,0,88,0,100,6,83,0,41,7,122,185,10,32,32, - 32,32,32,32,32,32,65,99,113,117,105,114,101,32,116,104, - 101,32,109,111,100,117,108,101,32,108,111,99,107,46,32,32, - 73,102,32,97,32,112,111,116,101,110,116,105,97,108,32,100, - 101,97,100,108,111,99,107,32,105,115,32,100,101,116,101,99, - 116,101,100,44,10,32,32,32,32,32,32,32,32,97,32,95, - 68,101,97,100,108,111,99,107,69,114,114,111,114,32,105,115, - 32,114,97,105,115,101,100,46,10,32,32,32,32,32,32,32, - 32,79,116,104,101,114,119,105,115,101,44,32,116,104,101,32, - 108,111,99,107,32,105,115,32,97,108,119,97,121,115,32,97, - 99,113,117,105,114,101,100,32,97,110,100,32,84,114,117,101, - 32,105,115,32,114,101,116,117,114,110,101,100,46,10,32,32, - 32,32,32,32,32,32,114,22,0,0,0,233,1,0,0,0, - 84,122,23,100,101,97,100,108,111,99,107,32,100,101,116,101, - 99,116,101,100,32,98,121,32,37,114,70,78,41,12,114,23, - 0,0,0,114,32,0,0,0,114,33,0,0,0,114,24,0, - 0,0,114,27,0,0,0,114,26,0,0,0,114,36,0,0, - 0,114,19,0,0,0,114,25,0,0,0,218,7,97,99,113, - 117,105,114,101,114,28,0,0,0,218,7,114,101,108,101,97, - 115,101,169,2,114,30,0,0,0,114,35,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,38,0, - 0,0,78,0,0,0,115,30,0,0,0,0,6,8,1,8, - 1,2,2,8,1,20,1,6,1,14,1,18,1,8,1,12, - 1,12,1,24,2,10,1,16,2,122,19,95,77,111,100,117, - 108,101,76,111,99,107,46,97,99,113,117,105,114,101,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,9, - 0,0,0,67,0,0,0,115,122,0,0,0,116,0,160,1, - 161,0,125,1,124,0,106,2,143,98,1,0,124,0,106,3, - 124,1,107,3,114,34,116,4,100,1,131,1,130,1,124,0, - 106,5,100,2,107,4,115,48,74,0,130,1,124,0,4,0, - 106,5,100,3,56,0,2,0,95,5,124,0,106,5,100,2, - 107,2,114,108,100,0,124,0,95,3,124,0,106,6,114,108, - 124,0,4,0,106,6,100,3,56,0,2,0,95,6,124,0, - 106,7,160,8,161,0,1,0,87,0,53,0,81,0,82,0, - 88,0,100,0,83,0,41,4,78,250,31,99,97,110,110,111, - 116,32,114,101,108,101,97,115,101,32,117,110,45,97,99,113, - 117,105,114,101,100,32,108,111,99,107,114,22,0,0,0,114, - 37,0,0,0,41,9,114,23,0,0,0,114,32,0,0,0, - 114,24,0,0,0,114,26,0,0,0,218,12,82,117,110,116, - 105,109,101,69,114,114,111,114,114,27,0,0,0,114,28,0, - 0,0,114,25,0,0,0,114,39,0,0,0,114,40,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,39,0,0,0,103,0,0,0,115,22,0,0,0,0,1, - 8,1,8,1,10,1,8,1,14,1,14,1,10,1,6,1, - 6,1,14,1,122,19,95,77,111,100,117,108,101,76,111,99, - 107,46,114,101,108,101,97,115,101,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,5,0,0,0,67,0, - 0,0,115,22,0,0,0,100,1,124,0,106,0,155,2,100, - 2,116,1,124,0,131,1,155,0,157,4,83,0,41,3,78, - 122,12,95,77,111,100,117,108,101,76,111,99,107,40,250,5, - 41,32,97,116,32,169,2,114,17,0,0,0,218,2,105,100, - 169,1,114,30,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,8,95,95,114,101,112,114,95,95, - 116,0,0,0,115,2,0,0,0,0,1,122,20,95,77,111, - 100,117,108,101,76,111,99,107,46,95,95,114,101,112,114,95, - 95,78,41,9,114,1,0,0,0,114,0,0,0,0,114,2, - 0,0,0,114,3,0,0,0,114,31,0,0,0,114,36,0, - 0,0,114,38,0,0,0,114,39,0,0,0,114,47,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,20,0,0,0,52,0,0,0,115,12, - 0,0,0,8,1,4,5,8,8,8,12,8,25,8,13,114, - 20,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,64,0,0,0,115,48,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6, - 100,7,132,0,90,6,100,8,100,9,132,0,90,7,100,10, - 83,0,41,11,218,16,95,68,117,109,109,121,77,111,100,117, - 108,101,76,111,99,107,122,86,65,32,115,105,109,112,108,101, - 32,95,77,111,100,117,108,101,76,111,99,107,32,101,113,117, - 105,118,97,108,101,110,116,32,102,111,114,32,80,121,116,104, - 111,110,32,98,117,105,108,100,115,32,119,105,116,104,111,117, - 116,10,32,32,32,32,109,117,108,116,105,45,116,104,114,101, - 97,100,105,110,103,32,115,117,112,112,111,114,116,46,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2, - 0,0,0,67,0,0,0,115,16,0,0,0,124,1,124,0, - 95,0,100,1,124,0,95,1,100,0,83,0,114,21,0,0, - 0,41,2,114,17,0,0,0,114,27,0,0,0,114,29,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,31,0,0,0,124,0,0,0,115,4,0,0,0,0, - 1,6,1,122,25,95,68,117,109,109,121,77,111,100,117,108, - 101,76,111,99,107,46,95,95,105,110,105,116,95,95,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, - 0,0,0,67,0,0,0,115,18,0,0,0,124,0,4,0, - 106,0,100,1,55,0,2,0,95,0,100,2,83,0,41,3, - 78,114,37,0,0,0,84,41,1,114,27,0,0,0,114,46, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,38,0,0,0,128,0,0,0,115,4,0,0,0, - 0,1,14,1,122,24,95,68,117,109,109,121,77,111,100,117, - 108,101,76,111,99,107,46,97,99,113,117,105,114,101,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, - 0,0,0,67,0,0,0,115,36,0,0,0,124,0,106,0, - 100,1,107,2,114,18,116,1,100,2,131,1,130,1,124,0, - 4,0,106,0,100,3,56,0,2,0,95,0,100,0,83,0, - 41,4,78,114,22,0,0,0,114,41,0,0,0,114,37,0, - 0,0,41,2,114,27,0,0,0,114,42,0,0,0,114,46, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,39,0,0,0,132,0,0,0,115,6,0,0,0, - 0,1,10,1,8,1,122,24,95,68,117,109,109,121,77,111, - 100,117,108,101,76,111,99,107,46,114,101,108,101,97,115,101, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,5,0,0,0,67,0,0,0,115,22,0,0,0,100,1, - 124,0,106,0,155,2,100,2,116,1,124,0,131,1,155,0, - 157,4,83,0,41,3,78,122,17,95,68,117,109,109,121,77, - 111,100,117,108,101,76,111,99,107,40,114,43,0,0,0,114, - 44,0,0,0,114,46,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,47,0,0,0,137,0,0, - 0,115,2,0,0,0,0,1,122,25,95,68,117,109,109,121, - 77,111,100,117,108,101,76,111,99,107,46,95,95,114,101,112, - 114,95,95,78,41,8,114,1,0,0,0,114,0,0,0,0, - 114,2,0,0,0,114,3,0,0,0,114,31,0,0,0,114, - 38,0,0,0,114,39,0,0,0,114,47,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,48,0,0,0,120,0,0,0,115,10,0,0,0, - 8,1,4,3,8,4,8,4,8,5,114,48,0,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,64,0,0,0,115,36,0,0,0,101,0,90, - 1,100,0,90,2,100,1,100,2,132,0,90,3,100,3,100, - 4,132,0,90,4,100,5,100,6,132,0,90,5,100,7,83, - 0,41,8,218,18,95,77,111,100,117,108,101,76,111,99,107, - 77,97,110,97,103,101,114,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, - 115,16,0,0,0,124,1,124,0,95,0,100,0,124,0,95, - 1,100,0,83,0,114,13,0,0,0,41,2,218,5,95,110, - 97,109,101,218,5,95,108,111,99,107,114,29,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,31, - 0,0,0,143,0,0,0,115,4,0,0,0,0,1,6,1, - 122,27,95,77,111,100,117,108,101,76,111,99,107,77,97,110, - 97,103,101,114,46,95,95,105,110,105,116,95,95,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0, - 0,0,67,0,0,0,115,26,0,0,0,116,0,124,0,106, - 1,131,1,124,0,95,2,124,0,106,2,160,3,161,0,1, - 0,100,0,83,0,114,13,0,0,0,41,4,218,16,95,103, - 101,116,95,109,111,100,117,108,101,95,108,111,99,107,114,50, - 0,0,0,114,51,0,0,0,114,38,0,0,0,114,46,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,9,95,95,101,110,116,101,114,95,95,147,0,0,0, - 115,4,0,0,0,0,1,12,1,122,28,95,77,111,100,117, - 108,101,76,111,99,107,77,97,110,97,103,101,114,46,95,95, - 101,110,116,101,114,95,95,99,1,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,2,0,0,0,79,0,0,0, - 115,14,0,0,0,124,0,106,0,160,1,161,0,1,0,100, - 0,83,0,114,13,0,0,0,41,2,114,51,0,0,0,114, - 39,0,0,0,41,3,114,30,0,0,0,218,4,97,114,103, - 115,90,6,107,119,97,114,103,115,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,8,95,95,101,120,105,116, - 95,95,151,0,0,0,115,2,0,0,0,0,1,122,27,95, - 77,111,100,117,108,101,76,111,99,107,77,97,110,97,103,101, - 114,46,95,95,101,120,105,116,95,95,78,41,6,114,1,0, - 0,0,114,0,0,0,0,114,2,0,0,0,114,31,0,0, - 0,114,53,0,0,0,114,55,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 49,0,0,0,141,0,0,0,115,6,0,0,0,8,2,8, - 4,8,4,114,49,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, - 0,115,130,0,0,0,116,0,160,1,161,0,1,0,122,106, - 122,14,116,3,124,0,25,0,131,0,125,1,87,0,110,24, - 4,0,116,4,107,10,114,48,1,0,1,0,1,0,100,1, - 125,1,89,0,110,2,88,0,124,1,100,1,107,8,114,112, - 116,5,100,1,107,8,114,76,116,6,124,0,131,1,125,1, - 110,8,116,7,124,0,131,1,125,1,124,0,102,1,100,2, - 100,3,132,1,125,2,116,8,160,9,124,1,124,2,161,2, - 116,3,124,0,60,0,87,0,53,0,116,0,160,2,161,0, - 1,0,88,0,124,1,83,0,41,4,122,139,71,101,116,32, - 111,114,32,99,114,101,97,116,101,32,116,104,101,32,109,111, - 100,117,108,101,32,108,111,99,107,32,102,111,114,32,97,32, - 103,105,118,101,110,32,109,111,100,117,108,101,32,110,97,109, - 101,46,10,10,32,32,32,32,65,99,113,117,105,114,101,47, - 114,101,108,101,97,115,101,32,105,110,116,101,114,110,97,108, - 108,121,32,116,104,101,32,103,108,111,98,97,108,32,105,109, - 112,111,114,116,32,108,111,99,107,32,116,111,32,112,114,111, - 116,101,99,116,10,32,32,32,32,95,109,111,100,117,108,101, - 95,108,111,99,107,115,46,78,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,8,0,0,0,83,0,0, - 0,115,48,0,0,0,116,0,160,1,161,0,1,0,122,24, - 116,3,160,4,124,1,161,1,124,0,107,8,114,30,116,3, - 124,1,61,0,87,0,53,0,116,0,160,2,161,0,1,0, - 88,0,100,0,83,0,114,13,0,0,0,41,5,218,4,95, - 105,109,112,218,12,97,99,113,117,105,114,101,95,108,111,99, - 107,218,12,114,101,108,101,97,115,101,95,108,111,99,107,218, - 13,95,109,111,100,117,108,101,95,108,111,99,107,115,114,34, - 0,0,0,41,2,218,3,114,101,102,114,17,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,2, - 99,98,176,0,0,0,115,10,0,0,0,0,1,8,1,2, - 4,14,1,10,2,122,28,95,103,101,116,95,109,111,100,117, - 108,101,95,108,111,99,107,46,60,108,111,99,97,108,115,62, - 46,99,98,41,10,114,56,0,0,0,114,57,0,0,0,114, - 58,0,0,0,114,59,0,0,0,218,8,75,101,121,69,114, - 114,111,114,114,23,0,0,0,114,48,0,0,0,114,20,0, - 0,0,218,8,95,119,101,97,107,114,101,102,114,60,0,0, - 0,41,3,114,17,0,0,0,114,24,0,0,0,114,61,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,52,0,0,0,157,0,0,0,115,28,0,0,0,0, - 6,8,1,2,1,2,1,14,1,14,1,10,2,8,1,8, - 1,10,2,8,2,12,11,20,2,10,2,114,52,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,8,0,0,0,67,0,0,0,115,54,0,0,0,116,0, - 124,0,131,1,125,1,122,12,124,1,160,1,161,0,1,0, - 87,0,110,20,4,0,116,2,107,10,114,40,1,0,1,0, - 1,0,89,0,110,10,88,0,124,1,160,3,161,0,1,0, - 100,1,83,0,41,2,122,189,65,99,113,117,105,114,101,115, - 32,116,104,101,110,32,114,101,108,101,97,115,101,115,32,116, - 104,101,32,109,111,100,117,108,101,32,108,111,99,107,32,102, - 111,114,32,97,32,103,105,118,101,110,32,109,111,100,117,108, - 101,32,110,97,109,101,46,10,10,32,32,32,32,84,104,105, - 115,32,105,115,32,117,115,101,100,32,116,111,32,101,110,115, - 117,114,101,32,97,32,109,111,100,117,108,101,32,105,115,32, - 99,111,109,112,108,101,116,101,108,121,32,105,110,105,116,105, - 97,108,105,122,101,100,44,32,105,110,32,116,104,101,10,32, - 32,32,32,101,118,101,110,116,32,105,116,32,105,115,32,98, - 101,105,110,103,32,105,109,112,111,114,116,101,100,32,98,121, - 32,97,110,111,116,104,101,114,32,116,104,114,101,97,100,46, - 10,32,32,32,32,78,41,4,114,52,0,0,0,114,38,0, - 0,0,114,19,0,0,0,114,39,0,0,0,41,2,114,17, - 0,0,0,114,24,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,19,95,108,111,99,107,95,117, - 110,108,111,99,107,95,109,111,100,117,108,101,194,0,0,0, - 115,12,0,0,0,0,6,8,1,2,1,12,1,14,3,6, - 2,114,64,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,3,0,0,0,79,0,0,0,115, - 10,0,0,0,124,0,124,1,124,2,142,1,83,0,41,1, - 97,46,1,0,0,114,101,109,111,118,101,95,105,109,112,111, - 114,116,108,105,98,95,102,114,97,109,101,115,32,105,110,32, - 105,109,112,111,114,116,46,99,32,119,105,108,108,32,97,108, - 119,97,121,115,32,114,101,109,111,118,101,32,115,101,113,117, - 101,110,99,101,115,10,32,32,32,32,111,102,32,105,109,112, - 111,114,116,108,105,98,32,102,114,97,109,101,115,32,116,104, - 97,116,32,101,110,100,32,119,105,116,104,32,97,32,99,97, - 108,108,32,116,111,32,116,104,105,115,32,102,117,110,99,116, - 105,111,110,10,10,32,32,32,32,85,115,101,32,105,116,32, - 105,110,115,116,101,97,100,32,111,102,32,97,32,110,111,114, - 109,97,108,32,99,97,108,108,32,105,110,32,112,108,97,99, - 101,115,32,119,104,101,114,101,32,105,110,99,108,117,100,105, - 110,103,32,116,104,101,32,105,109,112,111,114,116,108,105,98, - 10,32,32,32,32,102,114,97,109,101,115,32,105,110,116,114, - 111,100,117,99,101,115,32,117,110,119,97,110,116,101,100,32, - 110,111,105,115,101,32,105,110,116,111,32,116,104,101,32,116, - 114,97,99,101,98,97,99,107,32,40,101,46,103,46,32,119, - 104,101,110,32,101,120,101,99,117,116,105,110,103,10,32,32, - 32,32,109,111,100,117,108,101,32,99,111,100,101,41,10,32, - 32,32,32,114,10,0,0,0,41,3,218,1,102,114,54,0, - 0,0,90,4,107,119,100,115,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,25,95,99,97,108,108,95,119, - 105,116,104,95,102,114,97,109,101,115,95,114,101,109,111,118, - 101,100,211,0,0,0,115,2,0,0,0,0,8,114,66,0, - 0,0,114,37,0,0,0,41,1,218,9,118,101,114,98,111, - 115,105,116,121,99,1,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,4,0,0,0,71,0,0,0,115,54,0, - 0,0,116,0,106,1,106,2,124,1,107,5,114,50,124,0, - 160,3,100,1,161,1,115,30,100,2,124,0,23,0,125,0, - 116,4,124,0,106,5,124,2,142,0,116,0,106,6,100,3, - 141,2,1,0,100,4,83,0,41,5,122,61,80,114,105,110, - 116,32,116,104,101,32,109,101,115,115,97,103,101,32,116,111, - 32,115,116,100,101,114,114,32,105,102,32,45,118,47,80,89, - 84,72,79,78,86,69,82,66,79,83,69,32,105,115,32,116, - 117,114,110,101,100,32,111,110,46,41,2,250,1,35,122,7, - 105,109,112,111,114,116,32,122,2,35,32,41,1,90,4,102, - 105,108,101,78,41,7,114,15,0,0,0,218,5,102,108,97, - 103,115,218,7,118,101,114,98,111,115,101,218,10,115,116,97, - 114,116,115,119,105,116,104,218,5,112,114,105,110,116,218,6, - 102,111,114,109,97,116,218,6,115,116,100,101,114,114,41,3, - 218,7,109,101,115,115,97,103,101,114,67,0,0,0,114,54, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,16,95,118,101,114,98,111,115,101,95,109,101,115, - 115,97,103,101,222,0,0,0,115,8,0,0,0,0,2,12, - 1,10,1,8,1,114,76,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,3, - 0,0,0,115,26,0,0,0,135,0,102,1,100,1,100,2, - 132,8,125,1,116,0,124,1,136,0,131,2,1,0,124,1, - 83,0,41,3,122,49,68,101,99,111,114,97,116,111,114,32, - 116,111,32,118,101,114,105,102,121,32,116,104,101,32,110,97, - 109,101,100,32,109,111,100,117,108,101,32,105,115,32,98,117, - 105,108,116,45,105,110,46,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,4,0,0,0,19,0,0,0, - 115,38,0,0,0,124,1,116,0,106,1,107,7,114,28,116, - 2,124,1,155,2,100,1,157,2,124,1,100,2,141,2,130, - 1,136,0,124,0,124,1,131,2,83,0,41,3,78,250,25, - 32,105,115,32,110,111,116,32,97,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,114,16,0,0,0,41,3, - 114,15,0,0,0,218,20,98,117,105,108,116,105,110,95,109, - 111,100,117,108,101,95,110,97,109,101,115,218,11,73,109,112, - 111,114,116,69,114,114,111,114,169,2,114,30,0,0,0,218, - 8,102,117,108,108,110,97,109,101,169,1,218,3,102,120,110, - 114,10,0,0,0,114,11,0,0,0,218,25,95,114,101,113, - 117,105,114,101,115,95,98,117,105,108,116,105,110,95,119,114, - 97,112,112,101,114,232,0,0,0,115,10,0,0,0,0,1, - 10,1,10,1,2,255,6,2,122,52,95,114,101,113,117,105, - 114,101,115,95,98,117,105,108,116,105,110,46,60,108,111,99, - 97,108,115,62,46,95,114,101,113,117,105,114,101,115,95,98, - 117,105,108,116,105,110,95,119,114,97,112,112,101,114,169,1, - 114,12,0,0,0,41,2,114,83,0,0,0,114,84,0,0, - 0,114,10,0,0,0,114,82,0,0,0,114,11,0,0,0, - 218,17,95,114,101,113,117,105,114,101,115,95,98,117,105,108, - 116,105,110,230,0,0,0,115,6,0,0,0,0,2,12,5, - 10,1,114,86,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0, - 115,26,0,0,0,135,0,102,1,100,1,100,2,132,8,125, - 1,116,0,124,1,136,0,131,2,1,0,124,1,83,0,41, - 3,122,47,68,101,99,111,114,97,116,111,114,32,116,111,32, - 118,101,114,105,102,121,32,116,104,101,32,110,97,109,101,100, - 32,109,111,100,117,108,101,32,105,115,32,102,114,111,122,101, - 110,46,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,4,0,0,0,19,0,0,0,115,38,0,0,0, - 116,0,160,1,124,1,161,1,115,28,116,2,124,1,155,2, - 100,1,157,2,124,1,100,2,141,2,130,1,136,0,124,0, - 124,1,131,2,83,0,169,3,78,122,23,32,105,115,32,110, - 111,116,32,97,32,102,114,111,122,101,110,32,109,111,100,117, - 108,101,114,16,0,0,0,41,3,114,56,0,0,0,218,9, - 105,115,95,102,114,111,122,101,110,114,79,0,0,0,114,80, - 0,0,0,114,82,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,24,95,114,101,113,117,105,114,101,115,95,102,114, - 111,122,101,110,95,119,114,97,112,112,101,114,243,0,0,0, - 115,10,0,0,0,0,1,10,1,10,1,2,255,6,2,122, - 50,95,114,101,113,117,105,114,101,115,95,102,114,111,122,101, - 110,46,60,108,111,99,97,108,115,62,46,95,114,101,113,117, - 105,114,101,115,95,102,114,111,122,101,110,95,119,114,97,112, - 112,101,114,114,85,0,0,0,41,2,114,83,0,0,0,114, - 89,0,0,0,114,10,0,0,0,114,82,0,0,0,114,11, - 0,0,0,218,16,95,114,101,113,117,105,114,101,115,95,102, - 114,111,122,101,110,241,0,0,0,115,6,0,0,0,0,2, - 12,5,10,1,114,90,0,0,0,99,2,0,0,0,0,0, - 0,0,0,0,0,0,4,0,0,0,3,0,0,0,67,0, - 0,0,115,62,0,0,0,116,0,124,1,124,0,131,2,125, - 2,124,1,116,1,106,2,107,6,114,50,116,1,106,2,124, - 1,25,0,125,3,116,3,124,2,124,3,131,2,1,0,116, - 1,106,2,124,1,25,0,83,0,116,4,124,2,131,1,83, - 0,100,1,83,0,41,2,122,128,76,111,97,100,32,116,104, - 101,32,115,112,101,99,105,102,105,101,100,32,109,111,100,117, - 108,101,32,105,110,116,111,32,115,121,115,46,109,111,100,117, - 108,101,115,32,97,110,100,32,114,101,116,117,114,110,32,105, - 116,46,10,10,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,108,111,97,100,101,114,46,101, - 120,101,99,95,109,111,100,117,108,101,32,105,110,115,116,101, - 97,100,46,10,10,32,32,32,32,78,41,5,218,16,115,112, - 101,99,95,102,114,111,109,95,108,111,97,100,101,114,114,15, - 0,0,0,218,7,109,111,100,117,108,101,115,218,5,95,101, - 120,101,99,218,5,95,108,111,97,100,41,4,114,30,0,0, - 0,114,81,0,0,0,218,4,115,112,101,99,218,6,109,111, - 100,117,108,101,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,17,95,108,111,97,100,95,109,111,100,117,108, - 101,95,115,104,105,109,253,0,0,0,115,12,0,0,0,0, - 6,10,1,10,1,10,1,10,1,10,2,114,97,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,8,0,0,0,67,0,0,0,115,240,0,0,0,116,0, - 124,0,100,1,100,0,131,3,125,1,116,1,124,1,100,2, - 131,2,114,56,122,12,124,1,160,2,124,0,161,1,87,0, - 83,0,4,0,116,3,107,10,114,54,1,0,1,0,1,0, - 89,0,110,2,88,0,122,10,124,0,106,4,125,2,87,0, - 110,20,4,0,116,5,107,10,114,86,1,0,1,0,1,0, - 89,0,110,18,88,0,124,2,100,0,107,9,114,104,116,6, - 124,2,131,1,83,0,122,10,124,0,106,7,125,3,87,0, - 110,24,4,0,116,5,107,10,114,138,1,0,1,0,1,0, - 100,3,125,3,89,0,110,2,88,0,122,10,124,0,106,8, - 125,4,87,0,110,66,4,0,116,5,107,10,114,216,1,0, - 1,0,1,0,124,1,100,0,107,8,114,190,100,4,124,3, - 155,2,100,5,157,3,6,0,89,0,83,0,100,4,124,3, - 155,2,100,6,124,1,155,2,100,7,157,5,6,0,89,0, - 83,0,89,0,110,20,88,0,100,4,124,3,155,2,100,8, - 124,4,155,2,100,5,157,5,83,0,100,0,83,0,41,9, - 78,218,10,95,95,108,111,97,100,101,114,95,95,218,11,109, - 111,100,117,108,101,95,114,101,112,114,250,1,63,250,8,60, - 109,111,100,117,108,101,32,250,1,62,250,2,32,40,250,2, - 41,62,250,6,32,102,114,111,109,32,41,9,114,6,0,0, - 0,114,4,0,0,0,114,99,0,0,0,218,9,69,120,99, - 101,112,116,105,111,110,218,8,95,95,115,112,101,99,95,95, - 218,14,65,116,116,114,105,98,117,116,101,69,114,114,111,114, - 218,22,95,109,111,100,117,108,101,95,114,101,112,114,95,102, - 114,111,109,95,115,112,101,99,114,1,0,0,0,218,8,95, - 95,102,105,108,101,95,95,41,5,114,96,0,0,0,218,6, - 108,111,97,100,101,114,114,95,0,0,0,114,17,0,0,0, - 218,8,102,105,108,101,110,97,109,101,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,12,95,109,111,100,117, - 108,101,95,114,101,112,114,13,1,0,0,115,46,0,0,0, - 0,2,12,1,10,4,2,1,12,1,14,1,6,1,2,1, - 10,1,14,1,6,2,8,1,8,4,2,1,10,1,14,1, - 10,1,2,1,10,1,14,1,8,1,16,2,28,2,114,113, - 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,64,0,0,0,115,114,0,0, - 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100, - 2,100,2,100,3,156,3,100,4,100,5,132,2,90,4,100, - 6,100,7,132,0,90,5,100,8,100,9,132,0,90,6,101, - 7,100,10,100,11,132,0,131,1,90,8,101,8,106,9,100, - 12,100,11,132,0,131,1,90,8,101,7,100,13,100,14,132, - 0,131,1,90,10,101,7,100,15,100,16,132,0,131,1,90, - 11,101,11,106,9,100,17,100,16,132,0,131,1,90,11,100, - 2,83,0,41,18,218,10,77,111,100,117,108,101,83,112,101, - 99,97,208,5,0,0,84,104,101,32,115,112,101,99,105,102, - 105,99,97,116,105,111,110,32,102,111,114,32,97,32,109,111, - 100,117,108,101,44,32,117,115,101,100,32,102,111,114,32,108, - 111,97,100,105,110,103,46,10,10,32,32,32,32,65,32,109, - 111,100,117,108,101,39,115,32,115,112,101,99,32,105,115,32, - 116,104,101,32,115,111,117,114,99,101,32,102,111,114,32,105, - 110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116, - 32,116,104,101,32,109,111,100,117,108,101,46,32,32,70,111, - 114,10,32,32,32,32,100,97,116,97,32,97,115,115,111,99, - 105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,109, - 111,100,117,108,101,44,32,105,110,99,108,117,100,105,110,103, - 32,115,111,117,114,99,101,44,32,117,115,101,32,116,104,101, - 32,115,112,101,99,39,115,10,32,32,32,32,108,111,97,100, - 101,114,46,10,10,32,32,32,32,96,110,97,109,101,96,32, - 105,115,32,116,104,101,32,97,98,115,111,108,117,116,101,32, - 110,97,109,101,32,111,102,32,116,104,101,32,109,111,100,117, - 108,101,46,32,32,96,108,111,97,100,101,114,96,32,105,115, - 32,116,104,101,32,108,111,97,100,101,114,10,32,32,32,32, - 116,111,32,117,115,101,32,119,104,101,110,32,108,111,97,100, - 105,110,103,32,116,104,101,32,109,111,100,117,108,101,46,32, - 32,96,112,97,114,101,110,116,96,32,105,115,32,116,104,101, - 32,110,97,109,101,32,111,102,32,116,104,101,10,32,32,32, - 32,112,97,99,107,97,103,101,32,116,104,101,32,109,111,100, - 117,108,101,32,105,115,32,105,110,46,32,32,84,104,101,32, - 112,97,114,101,110,116,32,105,115,32,100,101,114,105,118,101, - 100,32,102,114,111,109,32,116,104,101,32,110,97,109,101,46, - 10,10,32,32,32,32,96,105,115,95,112,97,99,107,97,103, - 101,96,32,100,101,116,101,114,109,105,110,101,115,32,105,102, - 32,116,104,101,32,109,111,100,117,108,101,32,105,115,32,99, - 111,110,115,105,100,101,114,101,100,32,97,32,112,97,99,107, - 97,103,101,32,111,114,10,32,32,32,32,110,111,116,46,32, - 32,79,110,32,109,111,100,117,108,101,115,32,116,104,105,115, - 32,105,115,32,114,101,102,108,101,99,116,101,100,32,98,121, - 32,116,104,101,32,96,95,95,112,97,116,104,95,95,96,32, - 97,116,116,114,105,98,117,116,101,46,10,10,32,32,32,32, - 96,111,114,105,103,105,110,96,32,105,115,32,116,104,101,32, - 115,112,101,99,105,102,105,99,32,108,111,99,97,116,105,111, - 110,32,117,115,101,100,32,98,121,32,116,104,101,32,108,111, - 97,100,101,114,32,102,114,111,109,32,119,104,105,99,104,32, - 116,111,10,32,32,32,32,108,111,97,100,32,116,104,101,32, - 109,111,100,117,108,101,44,32,105,102,32,116,104,97,116,32, - 105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,97, - 118,97,105,108,97,98,108,101,46,32,32,87,104,101,110,32, - 102,105,108,101,110,97,109,101,32,105,115,10,32,32,32,32, - 115,101,116,44,32,111,114,105,103,105,110,32,119,105,108,108, - 32,109,97,116,99,104,46,10,10,32,32,32,32,96,104,97, - 115,95,108,111,99,97,116,105,111,110,96,32,105,110,100,105, - 99,97,116,101,115,32,116,104,97,116,32,97,32,115,112,101, - 99,39,115,32,34,111,114,105,103,105,110,34,32,114,101,102, - 108,101,99,116,115,32,97,32,108,111,99,97,116,105,111,110, - 46,10,32,32,32,32,87,104,101,110,32,116,104,105,115,32, - 105,115,32,84,114,117,101,44,32,96,95,95,102,105,108,101, - 95,95,96,32,97,116,116,114,105,98,117,116,101,32,111,102, - 32,116,104,101,32,109,111,100,117,108,101,32,105,115,32,115, - 101,116,46,10,10,32,32,32,32,96,99,97,99,104,101,100, - 96,32,105,115,32,116,104,101,32,108,111,99,97,116,105,111, - 110,32,111,102,32,116,104,101,32,99,97,99,104,101,100,32, - 98,121,116,101,99,111,100,101,32,102,105,108,101,44,32,105, - 102,32,97,110,121,46,32,32,73,116,10,32,32,32,32,99, - 111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104, - 101,32,96,95,95,99,97,99,104,101,100,95,95,96,32,97, - 116,116,114,105,98,117,116,101,46,10,10,32,32,32,32,96, - 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104, - 95,108,111,99,97,116,105,111,110,115,96,32,105,115,32,116, - 104,101,32,115,101,113,117,101,110,99,101,32,111,102,32,112, - 97,116,104,32,101,110,116,114,105,101,115,32,116,111,10,32, - 32,32,32,115,101,97,114,99,104,32,119,104,101,110,32,105, - 109,112,111,114,116,105,110,103,32,115,117,98,109,111,100,117, - 108,101,115,46,32,32,73,102,32,115,101,116,44,32,105,115, - 95,112,97,99,107,97,103,101,32,115,104,111,117,108,100,32, - 98,101,10,32,32,32,32,84,114,117,101,45,45,97,110,100, - 32,70,97,108,115,101,32,111,116,104,101,114,119,105,115,101, - 46,10,10,32,32,32,32,80,97,99,107,97,103,101,115,32, - 97,114,101,32,115,105,109,112,108,121,32,109,111,100,117,108, - 101,115,32,116,104,97,116,32,40,109,97,121,41,32,104,97, - 118,101,32,115,117,98,109,111,100,117,108,101,115,46,32,32, - 73,102,32,97,32,115,112,101,99,10,32,32,32,32,104,97, - 115,32,97,32,110,111,110,45,78,111,110,101,32,118,97,108, - 117,101,32,105,110,32,96,115,117,98,109,111,100,117,108,101, - 95,115,101,97,114,99,104,95,108,111,99,97,116,105,111,110, - 115,96,44,32,116,104,101,32,105,109,112,111,114,116,10,32, - 32,32,32,115,121,115,116,101,109,32,119,105,108,108,32,99, - 111,110,115,105,100,101,114,32,109,111,100,117,108,101,115,32, - 108,111,97,100,101,100,32,102,114,111,109,32,116,104,101,32, - 115,112,101,99,32,97,115,32,112,97,99,107,97,103,101,115, - 46,10,10,32,32,32,32,79,110,108,121,32,102,105,110,100, - 101,114,115,32,40,115,101,101,32,105,109,112,111,114,116,108, - 105,98,46,97,98,99,46,77,101,116,97,80,97,116,104,70, - 105,110,100,101,114,32,97,110,100,10,32,32,32,32,105,109, - 112,111,114,116,108,105,98,46,97,98,99,46,80,97,116,104, - 69,110,116,114,121,70,105,110,100,101,114,41,32,115,104,111, - 117,108,100,32,109,111,100,105,102,121,32,77,111,100,117,108, - 101,83,112,101,99,32,105,110,115,116,97,110,99,101,115,46, - 10,10,32,32,32,32,78,41,3,218,6,111,114,105,103,105, - 110,218,12,108,111,97,100,101,114,95,115,116,97,116,101,218, - 10,105,115,95,112,97,99,107,97,103,101,99,3,0,0,0, - 0,0,0,0,3,0,0,0,6,0,0,0,2,0,0,0, - 67,0,0,0,115,54,0,0,0,124,1,124,0,95,0,124, - 2,124,0,95,1,124,3,124,0,95,2,124,4,124,0,95, - 3,124,5,114,32,103,0,110,2,100,0,124,0,95,4,100, - 1,124,0,95,5,100,0,124,0,95,6,100,0,83,0,41, - 2,78,70,41,7,114,17,0,0,0,114,111,0,0,0,114, - 115,0,0,0,114,116,0,0,0,218,26,115,117,98,109,111, - 100,117,108,101,95,115,101,97,114,99,104,95,108,111,99,97, - 116,105,111,110,115,218,13,95,115,101,116,95,102,105,108,101, - 97,116,116,114,218,7,95,99,97,99,104,101,100,41,6,114, - 30,0,0,0,114,17,0,0,0,114,111,0,0,0,114,115, - 0,0,0,114,116,0,0,0,114,117,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,31,0,0, - 0,86,1,0,0,115,14,0,0,0,0,2,6,1,6,1, - 6,1,6,1,14,3,6,1,122,19,77,111,100,117,108,101, - 83,112,101,99,46,95,95,105,110,105,116,95,95,99,1,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,5,0, - 0,0,67,0,0,0,115,106,0,0,0,100,1,124,0,106, - 0,155,2,157,2,100,2,124,0,106,1,155,2,157,2,103, - 2,125,1,124,0,106,2,100,0,107,9,114,52,124,1,160, - 3,100,3,124,0,106,2,155,2,157,2,161,1,1,0,124, - 0,106,4,100,0,107,9,114,80,124,1,160,3,100,4,124, - 0,106,4,155,0,157,2,161,1,1,0,124,0,106,5,106, - 6,155,0,100,5,100,6,160,7,124,1,161,1,155,0,100, - 7,157,4,83,0,41,8,78,122,5,110,97,109,101,61,122, - 7,108,111,97,100,101,114,61,122,7,111,114,105,103,105,110, - 61,122,27,115,117,98,109,111,100,117,108,101,95,115,101,97, - 114,99,104,95,108,111,99,97,116,105,111,110,115,61,250,1, - 40,122,2,44,32,250,1,41,41,8,114,17,0,0,0,114, - 111,0,0,0,114,115,0,0,0,218,6,97,112,112,101,110, - 100,114,118,0,0,0,218,9,95,95,99,108,97,115,115,95, - 95,114,1,0,0,0,218,4,106,111,105,110,41,2,114,30, - 0,0,0,114,54,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,47,0,0,0,98,1,0,0, - 115,16,0,0,0,0,1,10,1,10,255,4,2,10,1,18, - 1,10,1,18,1,122,19,77,111,100,117,108,101,83,112,101, - 99,46,95,95,114,101,112,114,95,95,99,2,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,67, - 0,0,0,115,108,0,0,0,124,0,106,0,125,2,122,72, - 124,0,106,1,124,1,106,1,107,2,111,76,124,0,106,2, - 124,1,106,2,107,2,111,76,124,0,106,3,124,1,106,3, - 107,2,111,76,124,2,124,1,106,0,107,2,111,76,124,0, - 106,4,124,1,106,4,107,2,111,76,124,0,106,5,124,1, - 106,5,107,2,87,0,83,0,4,0,116,6,107,10,114,102, - 1,0,1,0,1,0,116,7,6,0,89,0,83,0,88,0, - 100,0,83,0,114,13,0,0,0,41,8,114,118,0,0,0, - 114,17,0,0,0,114,111,0,0,0,114,115,0,0,0,218, - 6,99,97,99,104,101,100,218,12,104,97,115,95,108,111,99, - 97,116,105,111,110,114,108,0,0,0,218,14,78,111,116,73, - 109,112,108,101,109,101,110,116,101,100,41,3,114,30,0,0, - 0,90,5,111,116,104,101,114,90,4,115,109,115,108,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,6,95, - 95,101,113,95,95,107,1,0,0,115,30,0,0,0,0,1, - 6,1,2,1,12,1,10,255,2,2,10,254,2,3,8,253, - 2,4,10,252,2,5,10,251,4,6,14,1,122,17,77,111, - 100,117,108,101,83,112,101,99,46,95,95,101,113,95,95,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,115,58,0,0,0,124,0,106, - 0,100,0,107,8,114,52,124,0,106,1,100,0,107,9,114, - 52,124,0,106,2,114,52,116,3,100,0,107,8,114,38,116, - 4,130,1,116,3,160,5,124,0,106,1,161,1,124,0,95, - 0,124,0,106,0,83,0,114,13,0,0,0,41,6,114,120, - 0,0,0,114,115,0,0,0,114,119,0,0,0,218,19,95, - 98,111,111,116,115,116,114,97,112,95,101,120,116,101,114,110, - 97,108,218,19,78,111,116,73,109,112,108,101,109,101,110,116, - 101,100,69,114,114,111,114,90,11,95,103,101,116,95,99,97, - 99,104,101,100,114,46,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,126,0,0,0,119,1,0, - 0,115,12,0,0,0,0,2,10,1,16,1,8,1,4,1, - 14,1,122,17,77,111,100,117,108,101,83,112,101,99,46,99, - 97,99,104,101,100,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,10, - 0,0,0,124,1,124,0,95,0,100,0,83,0,114,13,0, - 0,0,41,1,114,120,0,0,0,41,2,114,30,0,0,0, - 114,126,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,126,0,0,0,128,1,0,0,115,2,0, - 0,0,0,2,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,3,0,0,0,67,0,0,0,115,36,0, - 0,0,124,0,106,0,100,1,107,8,114,26,124,0,106,1, - 160,2,100,2,161,1,100,3,25,0,83,0,124,0,106,1, - 83,0,100,1,83,0,41,4,122,32,84,104,101,32,110,97, - 109,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101, - 39,115,32,112,97,114,101,110,116,46,78,218,1,46,114,22, - 0,0,0,41,3,114,118,0,0,0,114,17,0,0,0,218, - 10,114,112,97,114,116,105,116,105,111,110,114,46,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 6,112,97,114,101,110,116,132,1,0,0,115,6,0,0,0, - 0,3,10,1,16,2,122,17,77,111,100,117,108,101,83,112, - 101,99,46,112,97,114,101,110,116,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,1,0,0,0,67,0, - 0,0,115,6,0,0,0,124,0,106,0,83,0,114,13,0, - 0,0,41,1,114,119,0,0,0,114,46,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,127,0, - 0,0,140,1,0,0,115,2,0,0,0,0,2,122,23,77, - 111,100,117,108,101,83,112,101,99,46,104,97,115,95,108,111, - 99,97,116,105,111,110,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, - 14,0,0,0,116,0,124,1,131,1,124,0,95,1,100,0, - 83,0,114,13,0,0,0,41,2,218,4,98,111,111,108,114, - 119,0,0,0,41,2,114,30,0,0,0,218,5,118,97,108, - 117,101,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,127,0,0,0,144,1,0,0,115,2,0,0,0,0, - 2,41,12,114,1,0,0,0,114,0,0,0,0,114,2,0, - 0,0,114,3,0,0,0,114,31,0,0,0,114,47,0,0, - 0,114,129,0,0,0,218,8,112,114,111,112,101,114,116,121, - 114,126,0,0,0,218,6,115,101,116,116,101,114,114,134,0, - 0,0,114,127,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,114,0,0,0, - 49,1,0,0,115,32,0,0,0,8,1,4,36,4,1,2, - 255,12,12,8,9,8,12,2,1,10,8,4,1,10,3,2, - 1,10,7,2,1,10,3,4,1,114,114,0,0,0,169,2, - 114,115,0,0,0,114,117,0,0,0,99,2,0,0,0,0, - 0,0,0,2,0,0,0,6,0,0,0,8,0,0,0,67, - 0,0,0,115,154,0,0,0,116,0,124,1,100,1,131,2, - 114,74,116,1,100,2,107,8,114,22,116,2,130,1,116,1, - 106,3,125,4,124,3,100,2,107,8,114,48,124,4,124,0, - 124,1,100,3,141,2,83,0,124,3,114,56,103,0,110,2, - 100,2,125,5,124,4,124,0,124,1,124,5,100,4,141,3, - 83,0,124,3,100,2,107,8,114,138,116,0,124,1,100,5, - 131,2,114,134,122,14,124,1,160,4,124,0,161,1,125,3, - 87,0,113,138,4,0,116,5,107,10,114,130,1,0,1,0, - 1,0,100,2,125,3,89,0,113,138,88,0,110,4,100,6, - 125,3,116,6,124,0,124,1,124,2,124,3,100,7,141,4, - 83,0,41,8,122,53,82,101,116,117,114,110,32,97,32,109, - 111,100,117,108,101,32,115,112,101,99,32,98,97,115,101,100, - 32,111,110,32,118,97,114,105,111,117,115,32,108,111,97,100, - 101,114,32,109,101,116,104,111,100,115,46,90,12,103,101,116, - 95,102,105,108,101,110,97,109,101,78,41,1,114,111,0,0, - 0,41,2,114,111,0,0,0,114,118,0,0,0,114,117,0, - 0,0,70,114,139,0,0,0,41,7,114,4,0,0,0,114, - 130,0,0,0,114,131,0,0,0,218,23,115,112,101,99,95, - 102,114,111,109,95,102,105,108,101,95,108,111,99,97,116,105, - 111,110,114,117,0,0,0,114,79,0,0,0,114,114,0,0, - 0,41,6,114,17,0,0,0,114,111,0,0,0,114,115,0, - 0,0,114,117,0,0,0,114,140,0,0,0,90,6,115,101, - 97,114,99,104,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,91,0,0,0,149,1,0,0,115,36,0,0, - 0,0,2,10,1,8,1,4,1,6,2,8,1,12,1,12, - 1,6,1,2,255,6,3,8,1,10,1,2,1,14,1,14, - 1,12,3,4,2,114,91,0,0,0,99,3,0,0,0,0, - 0,0,0,0,0,0,0,8,0,0,0,8,0,0,0,67, - 0,0,0,115,56,1,0,0,122,10,124,0,106,0,125,3, - 87,0,110,20,4,0,116,1,107,10,114,30,1,0,1,0, - 1,0,89,0,110,14,88,0,124,3,100,0,107,9,114,44, - 124,3,83,0,124,0,106,2,125,4,124,1,100,0,107,8, - 114,90,122,10,124,0,106,3,125,1,87,0,110,20,4,0, - 116,1,107,10,114,88,1,0,1,0,1,0,89,0,110,2, - 88,0,122,10,124,0,106,4,125,5,87,0,110,24,4,0, - 116,1,107,10,114,124,1,0,1,0,1,0,100,0,125,5, - 89,0,110,2,88,0,124,2,100,0,107,8,114,184,124,5, - 100,0,107,8,114,180,122,10,124,1,106,5,125,2,87,0, - 113,184,4,0,116,1,107,10,114,176,1,0,1,0,1,0, - 100,0,125,2,89,0,113,184,88,0,110,4,124,5,125,2, - 122,10,124,0,106,6,125,6,87,0,110,24,4,0,116,1, - 107,10,114,218,1,0,1,0,1,0,100,0,125,6,89,0, - 110,2,88,0,122,14,116,7,124,0,106,8,131,1,125,7, - 87,0,110,26,4,0,116,1,107,10,144,1,114,4,1,0, - 1,0,1,0,100,0,125,7,89,0,110,2,88,0,116,9, - 124,4,124,1,124,2,100,1,141,3,125,3,124,5,100,0, - 107,8,144,1,114,34,100,2,110,2,100,3,124,3,95,10, - 124,6,124,3,95,11,124,7,124,3,95,12,124,3,83,0, - 41,4,78,169,1,114,115,0,0,0,70,84,41,13,114,107, - 0,0,0,114,108,0,0,0,114,1,0,0,0,114,98,0, - 0,0,114,110,0,0,0,218,7,95,79,82,73,71,73,78, - 218,10,95,95,99,97,99,104,101,100,95,95,218,4,108,105, - 115,116,218,8,95,95,112,97,116,104,95,95,114,114,0,0, - 0,114,119,0,0,0,114,126,0,0,0,114,118,0,0,0, - 41,8,114,96,0,0,0,114,111,0,0,0,114,115,0,0, - 0,114,95,0,0,0,114,17,0,0,0,90,8,108,111,99, - 97,116,105,111,110,114,126,0,0,0,114,118,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,17, - 95,115,112,101,99,95,102,114,111,109,95,109,111,100,117,108, - 101,175,1,0,0,115,72,0,0,0,0,2,2,1,10,1, - 14,1,6,2,8,1,4,2,6,1,8,1,2,1,10,1, - 14,2,6,1,2,1,10,1,14,1,10,1,8,1,8,1, - 2,1,10,1,14,1,12,2,4,1,2,1,10,1,14,1, - 10,1,2,1,14,1,16,1,10,2,14,1,20,1,6,1, - 6,1,114,146,0,0,0,70,169,1,218,8,111,118,101,114, - 114,105,100,101,99,2,0,0,0,0,0,0,0,1,0,0, - 0,5,0,0,0,8,0,0,0,67,0,0,0,115,226,1, - 0,0,124,2,115,20,116,0,124,1,100,1,100,0,131,3, - 100,0,107,8,114,54,122,12,124,0,106,1,124,1,95,2, - 87,0,110,20,4,0,116,3,107,10,114,52,1,0,1,0, - 1,0,89,0,110,2,88,0,124,2,115,74,116,0,124,1, - 100,2,100,0,131,3,100,0,107,8,114,178,124,0,106,4, - 125,3,124,3,100,0,107,8,114,146,124,0,106,5,100,0, - 107,9,114,146,116,6,100,0,107,8,114,110,116,7,130,1, - 116,6,106,8,125,4,124,4,160,9,124,4,161,1,125,3, - 124,0,106,5,124,3,95,10,124,3,124,0,95,4,100,0, - 124,1,95,11,122,10,124,3,124,1,95,12,87,0,110,20, - 4,0,116,3,107,10,114,176,1,0,1,0,1,0,89,0, - 110,2,88,0,124,2,115,198,116,0,124,1,100,3,100,0, - 131,3,100,0,107,8,114,232,122,12,124,0,106,13,124,1, - 95,14,87,0,110,20,4,0,116,3,107,10,114,230,1,0, - 1,0,1,0,89,0,110,2,88,0,122,10,124,0,124,1, - 95,15,87,0,110,22,4,0,116,3,107,10,144,1,114,8, - 1,0,1,0,1,0,89,0,110,2,88,0,124,2,144,1, - 115,34,116,0,124,1,100,4,100,0,131,3,100,0,107,8, - 144,1,114,82,124,0,106,5,100,0,107,9,144,1,114,82, - 122,12,124,0,106,5,124,1,95,16,87,0,110,22,4,0, - 116,3,107,10,144,1,114,80,1,0,1,0,1,0,89,0, - 110,2,88,0,124,0,106,17,144,1,114,222,124,2,144,1, - 115,114,116,0,124,1,100,5,100,0,131,3,100,0,107,8, - 144,1,114,150,122,12,124,0,106,18,124,1,95,11,87,0, - 110,22,4,0,116,3,107,10,144,1,114,148,1,0,1,0, - 1,0,89,0,110,2,88,0,124,2,144,1,115,174,116,0, - 124,1,100,6,100,0,131,3,100,0,107,8,144,1,114,222, - 124,0,106,19,100,0,107,9,144,1,114,222,122,12,124,0, - 106,19,124,1,95,20,87,0,110,22,4,0,116,3,107,10, - 144,1,114,220,1,0,1,0,1,0,89,0,110,2,88,0, - 124,1,83,0,41,7,78,114,1,0,0,0,114,98,0,0, - 0,218,11,95,95,112,97,99,107,97,103,101,95,95,114,145, - 0,0,0,114,110,0,0,0,114,143,0,0,0,41,21,114, - 6,0,0,0,114,17,0,0,0,114,1,0,0,0,114,108, - 0,0,0,114,111,0,0,0,114,118,0,0,0,114,130,0, - 0,0,114,131,0,0,0,218,16,95,78,97,109,101,115,112, - 97,99,101,76,111,97,100,101,114,218,7,95,95,110,101,119, - 95,95,90,5,95,112,97,116,104,114,110,0,0,0,114,98, - 0,0,0,114,134,0,0,0,114,149,0,0,0,114,107,0, - 0,0,114,145,0,0,0,114,127,0,0,0,114,115,0,0, - 0,114,126,0,0,0,114,143,0,0,0,41,5,114,95,0, - 0,0,114,96,0,0,0,114,148,0,0,0,114,111,0,0, - 0,114,150,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,18,95,105,110,105,116,95,109,111,100, - 117,108,101,95,97,116,116,114,115,220,1,0,0,115,96,0, - 0,0,0,4,20,1,2,1,12,1,14,1,6,2,20,1, - 6,1,8,2,10,1,8,1,4,1,6,2,10,1,8,1, - 6,11,6,1,2,1,10,1,14,1,6,2,20,1,2,1, - 12,1,14,1,6,2,2,1,10,1,16,1,6,2,24,1, - 12,1,2,1,12,1,16,1,6,2,8,1,24,1,2,1, - 12,1,16,1,6,2,24,1,12,1,2,1,12,1,16,1, - 6,1,114,152,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, - 115,82,0,0,0,100,1,125,1,116,0,124,0,106,1,100, - 2,131,2,114,30,124,0,106,1,160,2,124,0,161,1,125, - 1,110,20,116,0,124,0,106,1,100,3,131,2,114,50,116, - 3,100,4,131,1,130,1,124,1,100,1,107,8,114,68,116, - 4,124,0,106,5,131,1,125,1,116,6,124,0,124,1,131, - 2,1,0,124,1,83,0,41,5,122,43,67,114,101,97,116, - 101,32,97,32,109,111,100,117,108,101,32,98,97,115,101,100, - 32,111,110,32,116,104,101,32,112,114,111,118,105,100,101,100, - 32,115,112,101,99,46,78,218,13,99,114,101,97,116,101,95, - 109,111,100,117,108,101,218,11,101,120,101,99,95,109,111,100, - 117,108,101,122,66,108,111,97,100,101,114,115,32,116,104,97, - 116,32,100,101,102,105,110,101,32,101,120,101,99,95,109,111, - 100,117,108,101,40,41,32,109,117,115,116,32,97,108,115,111, - 32,100,101,102,105,110,101,32,99,114,101,97,116,101,95,109, - 111,100,117,108,101,40,41,41,7,114,4,0,0,0,114,111, - 0,0,0,114,153,0,0,0,114,79,0,0,0,114,18,0, - 0,0,114,17,0,0,0,114,152,0,0,0,169,2,114,95, - 0,0,0,114,96,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,16,109,111,100,117,108,101,95, - 102,114,111,109,95,115,112,101,99,36,2,0,0,115,18,0, - 0,0,0,3,4,1,12,3,14,1,12,1,8,2,8,1, - 10,1,10,1,114,156,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,5,0,0,0,67,0, - 0,0,115,126,0,0,0,124,0,106,0,100,1,107,8,114, - 14,100,2,110,4,124,0,106,0,125,1,124,0,106,1,100, - 1,107,8,114,74,124,0,106,2,100,1,107,8,114,52,100, - 3,124,1,155,2,100,4,157,3,83,0,100,3,124,1,155, - 2,100,5,124,0,106,2,155,2,100,6,157,5,83,0,110, - 48,124,0,106,3,114,100,100,3,124,1,155,2,100,7,124, - 0,106,1,155,2,100,4,157,5,83,0,100,3,124,0,106, - 0,155,2,100,5,124,0,106,1,155,0,100,6,157,5,83, - 0,100,1,83,0,41,8,122,38,82,101,116,117,114,110,32, - 116,104,101,32,114,101,112,114,32,116,111,32,117,115,101,32, - 102,111,114,32,116,104,101,32,109,111,100,117,108,101,46,78, - 114,100,0,0,0,114,101,0,0,0,114,102,0,0,0,114, - 103,0,0,0,114,104,0,0,0,114,105,0,0,0,41,4, - 114,17,0,0,0,114,115,0,0,0,114,111,0,0,0,114, - 127,0,0,0,41,2,114,95,0,0,0,114,17,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 109,0,0,0,53,2,0,0,115,16,0,0,0,0,3,20, - 1,10,1,10,1,12,2,22,2,6,1,20,2,114,109,0, - 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,10,0,0,0,67,0,0,0,115,206,0,0,0, - 124,0,106,0,125,2,116,1,124,2,131,1,143,182,1,0, - 116,2,106,3,160,4,124,2,161,1,124,1,107,9,114,56, - 100,1,124,2,155,2,100,2,157,3,125,3,116,5,124,3, - 124,2,100,3,141,2,130,1,122,106,124,0,106,7,100,4, - 107,8,114,108,124,0,106,8,100,4,107,8,114,92,116,5, - 100,5,124,0,106,0,100,3,141,2,130,1,116,9,124,0, - 124,1,100,6,100,7,141,3,1,0,110,52,116,9,124,0, - 124,1,100,6,100,7,141,3,1,0,116,10,124,0,106,7, - 100,8,131,2,115,148,124,0,106,7,160,11,124,2,161,1, - 1,0,110,12,124,0,106,7,160,12,124,1,161,1,1,0, - 87,0,53,0,116,2,106,3,160,6,124,0,106,0,161,1, - 125,1,124,1,116,2,106,3,124,0,106,0,60,0,88,0, - 87,0,53,0,81,0,82,0,88,0,124,1,83,0,41,9, - 122,70,69,120,101,99,117,116,101,32,116,104,101,32,115,112, - 101,99,39,115,32,115,112,101,99,105,102,105,101,100,32,109, - 111,100,117,108,101,32,105,110,32,97,110,32,101,120,105,115, - 116,105,110,103,32,109,111,100,117,108,101,39,115,32,110,97, - 109,101,115,112,97,99,101,46,122,7,109,111,100,117,108,101, - 32,122,19,32,110,111,116,32,105,110,32,115,121,115,46,109, - 111,100,117,108,101,115,114,16,0,0,0,78,250,14,109,105, - 115,115,105,110,103,32,108,111,97,100,101,114,84,114,147,0, - 0,0,114,154,0,0,0,41,13,114,17,0,0,0,114,49, - 0,0,0,114,15,0,0,0,114,92,0,0,0,114,34,0, - 0,0,114,79,0,0,0,218,3,112,111,112,114,111,0,0, - 0,114,118,0,0,0,114,152,0,0,0,114,4,0,0,0, - 218,11,108,111,97,100,95,109,111,100,117,108,101,114,154,0, - 0,0,41,4,114,95,0,0,0,114,96,0,0,0,114,17, - 0,0,0,218,3,109,115,103,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,93,0,0,0,70,2,0,0, - 115,34,0,0,0,0,2,6,1,10,1,16,1,12,1,12, - 1,2,1,10,1,10,1,14,2,16,2,14,1,12,4,14, - 2,16,4,14,1,24,1,114,93,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,8,0,0, - 0,67,0,0,0,115,26,1,0,0,122,18,124,0,106,0, - 160,1,124,0,106,2,161,1,1,0,87,0,110,52,1,0, - 1,0,1,0,124,0,106,2,116,3,106,4,107,6,114,64, - 116,3,106,4,160,5,124,0,106,2,161,1,125,1,124,1, - 116,3,106,4,124,0,106,2,60,0,130,0,89,0,110,2, - 88,0,116,3,106,4,160,5,124,0,106,2,161,1,125,1, - 124,1,116,3,106,4,124,0,106,2,60,0,116,6,124,1, - 100,1,100,0,131,3,100,0,107,8,114,148,122,12,124,0, - 106,0,124,1,95,7,87,0,110,20,4,0,116,8,107,10, - 114,146,1,0,1,0,1,0,89,0,110,2,88,0,116,6, - 124,1,100,2,100,0,131,3,100,0,107,8,114,226,122,40, - 124,1,106,9,124,1,95,10,116,11,124,1,100,3,131,2, - 115,202,124,0,106,2,160,12,100,4,161,1,100,5,25,0, - 124,1,95,10,87,0,110,20,4,0,116,8,107,10,114,224, - 1,0,1,0,1,0,89,0,110,2,88,0,116,6,124,1, - 100,6,100,0,131,3,100,0,107,8,144,1,114,22,122,10, - 124,0,124,1,95,13,87,0,110,22,4,0,116,8,107,10, - 144,1,114,20,1,0,1,0,1,0,89,0,110,2,88,0, - 124,1,83,0,41,7,78,114,98,0,0,0,114,149,0,0, - 0,114,145,0,0,0,114,132,0,0,0,114,22,0,0,0, - 114,107,0,0,0,41,14,114,111,0,0,0,114,159,0,0, - 0,114,17,0,0,0,114,15,0,0,0,114,92,0,0,0, - 114,158,0,0,0,114,6,0,0,0,114,98,0,0,0,114, - 108,0,0,0,114,1,0,0,0,114,149,0,0,0,114,4, - 0,0,0,114,133,0,0,0,114,107,0,0,0,114,155,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,25,95,108,111,97,100,95,98,97,99,107,119,97,114, - 100,95,99,111,109,112,97,116,105,98,108,101,100,2,0,0, - 115,54,0,0,0,0,4,2,1,18,1,6,1,12,1,14, - 1,12,1,8,3,14,1,12,1,16,1,2,1,12,1,14, - 1,6,1,16,1,2,4,8,1,10,1,22,1,14,1,6, - 1,18,1,2,1,10,1,16,1,6,1,114,161,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,11,0,0,0,67,0,0,0,115,220,0,0,0,124,0, - 106,0,100,0,107,9,114,30,116,1,124,0,106,0,100,1, - 131,2,115,30,116,2,124,0,131,1,83,0,116,3,124,0, - 131,1,125,1,100,2,124,0,95,4,122,162,124,1,116,5, - 106,6,124,0,106,7,60,0,122,52,124,0,106,0,100,0, - 107,8,114,96,124,0,106,8,100,0,107,8,114,108,116,9, - 100,4,124,0,106,7,100,5,141,2,130,1,110,12,124,0, - 106,0,160,10,124,1,161,1,1,0,87,0,110,50,1,0, - 1,0,1,0,122,14,116,5,106,6,124,0,106,7,61,0, - 87,0,110,20,4,0,116,11,107,10,114,152,1,0,1,0, - 1,0,89,0,110,2,88,0,130,0,89,0,110,2,88,0, - 116,5,106,6,160,12,124,0,106,7,161,1,125,1,124,1, - 116,5,106,6,124,0,106,7,60,0,116,13,100,6,124,0, - 106,7,124,0,106,0,131,3,1,0,87,0,53,0,100,3, - 124,0,95,4,88,0,124,1,83,0,41,7,78,114,154,0, - 0,0,84,70,114,157,0,0,0,114,16,0,0,0,122,18, - 105,109,112,111,114,116,32,123,33,114,125,32,35,32,123,33, - 114,125,41,14,114,111,0,0,0,114,4,0,0,0,114,161, - 0,0,0,114,156,0,0,0,90,13,95,105,110,105,116,105, - 97,108,105,122,105,110,103,114,15,0,0,0,114,92,0,0, - 0,114,17,0,0,0,114,118,0,0,0,114,79,0,0,0, - 114,154,0,0,0,114,62,0,0,0,114,158,0,0,0,114, - 76,0,0,0,114,155,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,14,95,108,111,97,100,95, - 117,110,108,111,99,107,101,100,137,2,0,0,115,46,0,0, - 0,0,2,10,2,12,1,8,2,8,5,6,1,2,1,12, - 1,2,1,10,1,10,1,16,3,16,1,6,1,2,1,14, - 1,14,1,6,1,8,5,14,1,12,1,20,2,8,2,114, - 162,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,10,0,0,0,67,0,0,0,115,42,0, - 0,0,116,0,124,0,106,1,131,1,143,22,1,0,116,2, - 124,0,131,1,87,0,2,0,53,0,81,0,82,0,163,0, - 83,0,81,0,82,0,88,0,100,1,83,0,41,2,122,191, - 82,101,116,117,114,110,32,97,32,110,101,119,32,109,111,100, - 117,108,101,32,111,98,106,101,99,116,44,32,108,111,97,100, - 101,100,32,98,121,32,116,104,101,32,115,112,101,99,39,115, - 32,108,111,97,100,101,114,46,10,10,32,32,32,32,84,104, - 101,32,109,111,100,117,108,101,32,105,115,32,110,111,116,32, - 97,100,100,101,100,32,116,111,32,105,116,115,32,112,97,114, - 101,110,116,46,10,10,32,32,32,32,73,102,32,97,32,109, - 111,100,117,108,101,32,105,115,32,97,108,114,101,97,100,121, - 32,105,110,32,115,121,115,46,109,111,100,117,108,101,115,44, - 32,116,104,97,116,32,101,120,105,115,116,105,110,103,32,109, - 111,100,117,108,101,32,103,101,116,115,10,32,32,32,32,99, - 108,111,98,98,101,114,101,100,46,10,10,32,32,32,32,78, - 41,3,114,49,0,0,0,114,17,0,0,0,114,162,0,0, - 0,41,1,114,95,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,94,0,0,0,179,2,0,0, - 115,4,0,0,0,0,9,12,1,114,94,0,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,64,0,0,0,115,140,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,100,2,90,4,101,5,100,3, - 100,4,132,0,131,1,90,6,101,7,100,20,100,6,100,7, - 132,1,131,1,90,8,101,7,100,21,100,8,100,9,132,1, - 131,1,90,9,101,7,100,10,100,11,132,0,131,1,90,10, - 101,7,100,12,100,13,132,0,131,1,90,11,101,7,101,12, - 100,14,100,15,132,0,131,1,131,1,90,13,101,7,101,12, - 100,16,100,17,132,0,131,1,131,1,90,14,101,7,101,12, - 100,18,100,19,132,0,131,1,131,1,90,15,101,7,101,16, - 131,1,90,17,100,5,83,0,41,22,218,15,66,117,105,108, - 116,105,110,73,109,112,111,114,116,101,114,122,144,77,101,116, - 97,32,112,97,116,104,32,105,109,112,111,114,116,32,102,111, - 114,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, - 101,115,46,10,10,32,32,32,32,65,108,108,32,109,101,116, - 104,111,100,115,32,97,114,101,32,101,105,116,104,101,114,32, - 99,108,97,115,115,32,111,114,32,115,116,97,116,105,99,32, - 109,101,116,104,111,100,115,32,116,111,32,97,118,111,105,100, - 32,116,104,101,32,110,101,101,100,32,116,111,10,32,32,32, - 32,105,110,115,116,97,110,116,105,97,116,101,32,116,104,101, - 32,99,108,97,115,115,46,10,10,32,32,32,32,122,8,98, - 117,105,108,116,45,105,110,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,5,0,0,0,67,0,0,0, - 115,22,0,0,0,100,1,124,0,106,0,155,2,100,2,116, - 1,106,2,155,0,100,3,157,5,83,0,169,4,122,115,82, - 101,116,117,114,110,32,114,101,112,114,32,102,111,114,32,116, - 104,101,32,109,111,100,117,108,101,46,10,10,32,32,32,32, - 32,32,32,32,84,104,101,32,109,101,116,104,111,100,32,105, - 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,84, - 104,101,32,105,109,112,111,114,116,32,109,97,99,104,105,110, - 101,114,121,32,100,111,101,115,32,116,104,101,32,106,111,98, - 32,105,116,115,101,108,102,46,10,10,32,32,32,32,32,32, - 32,32,114,101,0,0,0,114,103,0,0,0,114,104,0,0, - 0,41,3,114,1,0,0,0,114,163,0,0,0,114,142,0, - 0,0,41,1,114,96,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,99,0,0,0,205,2,0, - 0,115,2,0,0,0,0,7,122,27,66,117,105,108,116,105, - 110,73,109,112,111,114,116,101,114,46,109,111,100,117,108,101, - 95,114,101,112,114,78,99,4,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,5,0,0,0,67,0,0,0,115, - 46,0,0,0,124,2,100,0,107,9,114,12,100,0,83,0, - 116,0,160,1,124,1,161,1,114,38,116,2,124,1,124,0, - 124,0,106,3,100,1,141,3,83,0,100,0,83,0,100,0, - 83,0,169,2,78,114,141,0,0,0,41,4,114,56,0,0, - 0,90,10,105,115,95,98,117,105,108,116,105,110,114,91,0, - 0,0,114,142,0,0,0,169,4,218,3,99,108,115,114,81, - 0,0,0,218,4,112,97,116,104,218,6,116,97,114,103,101, - 116,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,9,102,105,110,100,95,115,112,101,99,214,2,0,0,115, - 10,0,0,0,0,2,8,1,4,1,10,1,16,2,122,25, - 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,46, - 102,105,110,100,95,115,112,101,99,99,3,0,0,0,0,0, - 0,0,0,0,0,0,4,0,0,0,4,0,0,0,67,0, - 0,0,115,30,0,0,0,124,0,160,0,124,1,124,2,161, - 2,125,3,124,3,100,1,107,9,114,26,124,3,106,1,83, - 0,100,1,83,0,41,2,122,175,70,105,110,100,32,116,104, - 101,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, - 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,39, - 112,97,116,104,39,32,105,115,32,101,118,101,114,32,115,112, - 101,99,105,102,105,101,100,32,116,104,101,110,32,116,104,101, - 32,115,101,97,114,99,104,32,105,115,32,99,111,110,115,105, - 100,101,114,101,100,32,97,32,102,97,105,108,117,114,101,46, - 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, - 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, - 116,101,100,46,32,32,85,115,101,32,102,105,110,100,95,115, - 112,101,99,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,78,41,2,114,170,0,0,0, - 114,111,0,0,0,41,4,114,167,0,0,0,114,81,0,0, - 0,114,168,0,0,0,114,95,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,11,102,105,110,100, - 95,109,111,100,117,108,101,223,2,0,0,115,4,0,0,0, - 0,9,12,1,122,27,66,117,105,108,116,105,110,73,109,112, - 111,114,116,101,114,46,102,105,110,100,95,109,111,100,117,108, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,4,0,0,0,67,0,0,0,115,46,0,0,0,124, - 1,106,0,116,1,106,2,107,7,114,34,116,3,124,1,106, - 0,155,2,100,1,157,2,124,1,106,0,100,2,141,2,130, - 1,116,4,116,5,106,6,124,1,131,2,83,0,41,3,122, - 24,67,114,101,97,116,101,32,97,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,114,77,0,0,0,114,16, - 0,0,0,41,7,114,17,0,0,0,114,15,0,0,0,114, - 78,0,0,0,114,79,0,0,0,114,66,0,0,0,114,56, - 0,0,0,90,14,99,114,101,97,116,101,95,98,117,105,108, - 116,105,110,41,2,114,30,0,0,0,114,95,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,153, - 0,0,0,235,2,0,0,115,10,0,0,0,0,3,12,1, - 12,1,4,255,6,2,122,29,66,117,105,108,116,105,110,73, - 109,112,111,114,116,101,114,46,99,114,101,97,116,101,95,109, - 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,16, - 0,0,0,116,0,116,1,106,2,124,1,131,2,1,0,100, - 1,83,0,41,2,122,22,69,120,101,99,32,97,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,78,41,3, - 114,66,0,0,0,114,56,0,0,0,90,12,101,120,101,99, - 95,98,117,105,108,116,105,110,41,2,114,30,0,0,0,114, - 96,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,154,0,0,0,243,2,0,0,115,2,0,0, - 0,0,3,122,27,66,117,105,108,116,105,110,73,109,112,111, - 114,116,101,114,46,101,120,101,99,95,109,111,100,117,108,101, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, - 83,0,41,2,122,57,82,101,116,117,114,110,32,78,111,110, - 101,32,97,115,32,98,117,105,108,116,45,105,110,32,109,111, - 100,117,108,101,115,32,100,111,32,110,111,116,32,104,97,118, - 101,32,99,111,100,101,32,111,98,106,101,99,116,115,46,78, - 114,10,0,0,0,169,2,114,167,0,0,0,114,81,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,8,103,101,116,95,99,111,100,101,248,2,0,0,115,2, - 0,0,0,0,4,122,24,66,117,105,108,116,105,110,73,109, - 112,111,114,116,101,114,46,103,101,116,95,99,111,100,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, - 0,41,2,122,56,82,101,116,117,114,110,32,78,111,110,101, - 32,97,115,32,98,117,105,108,116,45,105,110,32,109,111,100, - 117,108,101,115,32,100,111,32,110,111,116,32,104,97,118,101, - 32,115,111,117,114,99,101,32,99,111,100,101,46,78,114,10, - 0,0,0,114,172,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,10,103,101,116,95,115,111,117, - 114,99,101,254,2,0,0,115,2,0,0,0,0,4,122,26, - 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,46, - 103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,52, - 82,101,116,117,114,110,32,70,97,108,115,101,32,97,115,32, - 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, - 32,97,114,101,32,110,101,118,101,114,32,112,97,99,107,97, - 103,101,115,46,70,114,10,0,0,0,114,172,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,117, - 0,0,0,4,3,0,0,115,2,0,0,0,0,4,122,26, - 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,46, - 105,115,95,112,97,99,107,97,103,101,41,2,78,78,41,1, - 78,41,18,114,1,0,0,0,114,0,0,0,0,114,2,0, - 0,0,114,3,0,0,0,114,142,0,0,0,218,12,115,116, - 97,116,105,99,109,101,116,104,111,100,114,99,0,0,0,218, - 11,99,108,97,115,115,109,101,116,104,111,100,114,170,0,0, - 0,114,171,0,0,0,114,153,0,0,0,114,154,0,0,0, - 114,86,0,0,0,114,173,0,0,0,114,174,0,0,0,114, - 117,0,0,0,114,97,0,0,0,114,159,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,163,0,0,0,194,2,0,0,115,44,0,0,0, - 8,2,4,7,4,2,2,1,10,8,2,1,12,8,2,1, - 12,11,2,1,10,7,2,1,10,4,2,1,2,1,12,4, - 2,1,2,1,12,4,2,1,2,1,12,4,114,163,0,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,64,0,0,0,115,144,0,0,0,101, - 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,101, - 5,100,3,100,4,132,0,131,1,90,6,101,7,100,22,100, - 6,100,7,132,1,131,1,90,8,101,7,100,23,100,8,100, - 9,132,1,131,1,90,9,101,7,100,10,100,11,132,0,131, - 1,90,10,101,5,100,12,100,13,132,0,131,1,90,11,101, - 7,100,14,100,15,132,0,131,1,90,12,101,7,101,13,100, - 16,100,17,132,0,131,1,131,1,90,14,101,7,101,13,100, - 18,100,19,132,0,131,1,131,1,90,15,101,7,101,13,100, - 20,100,21,132,0,131,1,131,1,90,16,100,5,83,0,41, - 24,218,14,70,114,111,122,101,110,73,109,112,111,114,116,101, - 114,122,142,77,101,116,97,32,112,97,116,104,32,105,109,112, - 111,114,116,32,102,111,114,32,102,114,111,122,101,110,32,109, - 111,100,117,108,101,115,46,10,10,32,32,32,32,65,108,108, - 32,109,101,116,104,111,100,115,32,97,114,101,32,101,105,116, - 104,101,114,32,99,108,97,115,115,32,111,114,32,115,116,97, - 116,105,99,32,109,101,116,104,111,100,115,32,116,111,32,97, - 118,111,105,100,32,116,104,101,32,110,101,101,100,32,116,111, - 10,32,32,32,32,105,110,115,116,97,110,116,105,97,116,101, - 32,116,104,101,32,99,108,97,115,115,46,10,10,32,32,32, - 32,90,6,102,114,111,122,101,110,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,5,0,0,0,67,0, - 0,0,115,22,0,0,0,100,1,124,0,106,0,155,2,100, - 2,116,1,106,2,155,0,100,3,157,5,83,0,114,164,0, - 0,0,41,3,114,1,0,0,0,114,177,0,0,0,114,142, - 0,0,0,41,1,218,1,109,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,99,0,0,0,24,3,0,0, - 115,2,0,0,0,0,7,122,26,70,114,111,122,101,110,73, - 109,112,111,114,116,101,114,46,109,111,100,117,108,101,95,114, - 101,112,114,78,99,4,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,5,0,0,0,67,0,0,0,115,34,0, - 0,0,116,0,160,1,124,1,161,1,114,26,116,2,124,1, - 124,0,124,0,106,3,100,1,141,3,83,0,100,0,83,0, - 100,0,83,0,114,165,0,0,0,41,4,114,56,0,0,0, - 114,88,0,0,0,114,91,0,0,0,114,142,0,0,0,114, - 166,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,170,0,0,0,33,3,0,0,115,6,0,0, - 0,0,2,10,1,16,2,122,24,70,114,111,122,101,110,73, - 109,112,111,114,116,101,114,46,102,105,110,100,95,115,112,101, - 99,99,3,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,3,0,0,0,67,0,0,0,115,18,0,0,0,116, - 0,160,1,124,1,161,1,114,14,124,0,83,0,100,1,83, - 0,41,2,122,93,70,105,110,100,32,97,32,102,114,111,122, - 101,110,32,109,111,100,117,108,101,46,10,10,32,32,32,32, - 32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,32, - 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32, - 85,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32, - 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, - 32,32,78,41,2,114,56,0,0,0,114,88,0,0,0,41, - 3,114,167,0,0,0,114,81,0,0,0,114,168,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 171,0,0,0,40,3,0,0,115,2,0,0,0,0,7,122, - 26,70,114,111,122,101,110,73,109,112,111,114,116,101,114,46, - 102,105,110,100,95,109,111,100,117,108,101,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, - 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,122, - 42,85,115,101,32,100,101,102,97,117,108,116,32,115,101,109, - 97,110,116,105,99,115,32,102,111,114,32,109,111,100,117,108, - 101,32,99,114,101,97,116,105,111,110,46,78,114,10,0,0, - 0,41,2,114,167,0,0,0,114,95,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,153,0,0, - 0,49,3,0,0,115,2,0,0,0,0,2,122,28,70,114, - 111,122,101,110,73,109,112,111,114,116,101,114,46,99,114,101, - 97,116,101,95,109,111,100,117,108,101,99,1,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,4,0,0,0,67, - 0,0,0,115,64,0,0,0,124,0,106,0,106,1,125,1, - 116,2,160,3,124,1,161,1,115,36,116,4,124,1,155,2, - 100,1,157,2,124,1,100,2,141,2,130,1,116,5,116,2, - 106,6,124,1,131,2,125,2,116,7,124,2,124,0,106,8, - 131,2,1,0,100,0,83,0,114,87,0,0,0,41,9,114, - 107,0,0,0,114,17,0,0,0,114,56,0,0,0,114,88, - 0,0,0,114,79,0,0,0,114,66,0,0,0,218,17,103, - 101,116,95,102,114,111,122,101,110,95,111,98,106,101,99,116, - 218,4,101,120,101,99,114,7,0,0,0,41,3,114,96,0, - 0,0,114,17,0,0,0,218,4,99,111,100,101,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,154,0,0, - 0,53,3,0,0,115,10,0,0,0,0,2,8,1,10,1, - 18,1,12,1,122,26,70,114,111,122,101,110,73,109,112,111, - 114,116,101,114,46,101,120,101,99,95,109,111,100,117,108,101, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,3,0,0,0,67,0,0,0,115,10,0,0,0,116,0, - 124,0,124,1,131,2,83,0,41,1,122,95,76,111,97,100, - 32,97,32,102,114,111,122,101,110,32,109,111,100,117,108,101, - 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, - 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,46,32,32,85,115,101,32,101,120,101,99,95, - 109,111,100,117,108,101,40,41,32,105,110,115,116,101,97,100, - 46,10,10,32,32,32,32,32,32,32,32,41,1,114,97,0, - 0,0,114,172,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,159,0,0,0,61,3,0,0,115, - 2,0,0,0,0,7,122,26,70,114,111,122,101,110,73,109, - 112,111,114,116,101,114,46,108,111,97,100,95,109,111,100,117, - 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,67,0,0,0,115,10,0,0,0, - 116,0,160,1,124,1,161,1,83,0,41,1,122,45,82,101, - 116,117,114,110,32,116,104,101,32,99,111,100,101,32,111,98, - 106,101,99,116,32,102,111,114,32,116,104,101,32,102,114,111, - 122,101,110,32,109,111,100,117,108,101,46,41,2,114,56,0, - 0,0,114,179,0,0,0,114,172,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,173,0,0,0, - 70,3,0,0,115,2,0,0,0,0,4,122,23,70,114,111, - 122,101,110,73,109,112,111,114,116,101,114,46,103,101,116,95, - 99,111,100,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,100,1,83,0,41,2,122,54,82,101,116,117,114,110, - 32,78,111,110,101,32,97,115,32,102,114,111,122,101,110,32, - 109,111,100,117,108,101,115,32,100,111,32,110,111,116,32,104, - 97,118,101,32,115,111,117,114,99,101,32,99,111,100,101,46, - 78,114,10,0,0,0,114,172,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,174,0,0,0,76, - 3,0,0,115,2,0,0,0,0,4,122,25,70,114,111,122, - 101,110,73,109,112,111,114,116,101,114,46,103,101,116,95,115, - 111,117,114,99,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,10, - 0,0,0,116,0,160,1,124,1,161,1,83,0,41,1,122, - 46,82,101,116,117,114,110,32,84,114,117,101,32,105,102,32, - 116,104,101,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,41, - 2,114,56,0,0,0,90,17,105,115,95,102,114,111,122,101, - 110,95,112,97,99,107,97,103,101,114,172,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,117,0, - 0,0,82,3,0,0,115,2,0,0,0,0,4,122,25,70, - 114,111,122,101,110,73,109,112,111,114,116,101,114,46,105,115, - 95,112,97,99,107,97,103,101,41,2,78,78,41,1,78,41, - 17,114,1,0,0,0,114,0,0,0,0,114,2,0,0,0, - 114,3,0,0,0,114,142,0,0,0,114,175,0,0,0,114, - 99,0,0,0,114,176,0,0,0,114,170,0,0,0,114,171, - 0,0,0,114,153,0,0,0,114,154,0,0,0,114,159,0, - 0,0,114,90,0,0,0,114,173,0,0,0,114,174,0,0, - 0,114,117,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,177,0,0,0,13, - 3,0,0,115,46,0,0,0,8,2,4,7,4,2,2,1, - 10,8,2,1,12,6,2,1,12,8,2,1,10,3,2,1, - 10,7,2,1,10,8,2,1,2,1,12,4,2,1,2,1, - 12,4,2,1,2,1,114,177,0,0,0,99,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 64,0,0,0,115,32,0,0,0,101,0,90,1,100,0,90, - 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, - 5,132,0,90,5,100,6,83,0,41,7,218,18,95,73,109, - 112,111,114,116,76,111,99,107,67,111,110,116,101,120,116,122, - 36,67,111,110,116,101,120,116,32,109,97,110,97,103,101,114, - 32,102,111,114,32,116,104,101,32,105,109,112,111,114,116,32, - 108,111,99,107,46,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,2,0,0,0,67,0,0,0,115,12, - 0,0,0,116,0,160,1,161,0,1,0,100,1,83,0,41, - 2,122,24,65,99,113,117,105,114,101,32,116,104,101,32,105, - 109,112,111,114,116,32,108,111,99,107,46,78,41,2,114,56, - 0,0,0,114,57,0,0,0,114,46,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,53,0,0, - 0,95,3,0,0,115,2,0,0,0,0,2,122,28,95,73, - 109,112,111,114,116,76,111,99,107,67,111,110,116,101,120,116, - 46,95,95,101,110,116,101,114,95,95,99,4,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,2,0,0,0,67, - 0,0,0,115,12,0,0,0,116,0,160,1,161,0,1,0, - 100,1,83,0,41,2,122,60,82,101,108,101,97,115,101,32, - 116,104,101,32,105,109,112,111,114,116,32,108,111,99,107,32, - 114,101,103,97,114,100,108,101,115,115,32,111,102,32,97,110, - 121,32,114,97,105,115,101,100,32,101,120,99,101,112,116,105, - 111,110,115,46,78,41,2,114,56,0,0,0,114,58,0,0, - 0,41,4,114,30,0,0,0,218,8,101,120,99,95,116,121, - 112,101,218,9,101,120,99,95,118,97,108,117,101,218,13,101, - 120,99,95,116,114,97,99,101,98,97,99,107,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,55,0,0,0, - 99,3,0,0,115,2,0,0,0,0,2,122,27,95,73,109, - 112,111,114,116,76,111,99,107,67,111,110,116,101,120,116,46, - 95,95,101,120,105,116,95,95,78,41,6,114,1,0,0,0, - 114,0,0,0,0,114,2,0,0,0,114,3,0,0,0,114, - 53,0,0,0,114,55,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,182,0, - 0,0,91,3,0,0,115,6,0,0,0,8,2,4,2,8, - 4,114,182,0,0,0,99,3,0,0,0,0,0,0,0,0, - 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, - 66,0,0,0,124,1,160,0,100,1,124,2,100,2,24,0, - 161,2,125,3,116,1,124,3,131,1,124,2,107,0,114,36, - 116,2,100,3,131,1,130,1,124,3,100,4,25,0,125,4, - 124,0,114,62,124,4,155,0,100,1,124,0,155,0,157,3, - 83,0,124,4,83,0,41,5,122,50,82,101,115,111,108,118, - 101,32,97,32,114,101,108,97,116,105,118,101,32,109,111,100, - 117,108,101,32,110,97,109,101,32,116,111,32,97,110,32,97, - 98,115,111,108,117,116,101,32,111,110,101,46,114,132,0,0, - 0,114,37,0,0,0,122,50,97,116,116,101,109,112,116,101, - 100,32,114,101,108,97,116,105,118,101,32,105,109,112,111,114, - 116,32,98,101,121,111,110,100,32,116,111,112,45,108,101,118, - 101,108,32,112,97,99,107,97,103,101,114,22,0,0,0,41, - 3,218,6,114,115,112,108,105,116,218,3,108,101,110,114,79, - 0,0,0,41,5,114,17,0,0,0,218,7,112,97,99,107, - 97,103,101,218,5,108,101,118,101,108,90,4,98,105,116,115, - 90,4,98,97,115,101,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,13,95,114,101,115,111,108,118,101,95, - 110,97,109,101,104,3,0,0,115,10,0,0,0,0,2,16, - 1,12,1,8,1,8,1,114,190,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, - 0,67,0,0,0,115,34,0,0,0,124,0,160,0,124,1, - 124,2,161,2,125,3,124,3,100,0,107,8,114,24,100,0, - 83,0,116,1,124,1,124,3,131,2,83,0,114,13,0,0, - 0,41,2,114,171,0,0,0,114,91,0,0,0,41,4,218, - 6,102,105,110,100,101,114,114,17,0,0,0,114,168,0,0, - 0,114,111,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,17,95,102,105,110,100,95,115,112,101, - 99,95,108,101,103,97,99,121,113,3,0,0,115,8,0,0, - 0,0,3,12,1,8,1,4,1,114,192,0,0,0,99,3, - 0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10, - 0,0,0,67,0,0,0,115,12,1,0,0,116,0,106,1, - 125,3,124,3,100,1,107,8,114,22,116,2,100,2,131,1, - 130,1,124,3,115,38,116,3,160,4,100,3,116,5,161,2, - 1,0,124,0,116,0,106,6,107,6,125,4,124,3,68,0, - 93,210,125,5,116,7,131,0,143,84,1,0,122,10,124,5, - 106,8,125,6,87,0,110,54,4,0,116,9,107,10,114,128, - 1,0,1,0,1,0,116,10,124,5,124,0,124,1,131,3, - 125,7,124,7,100,1,107,8,114,124,89,0,87,0,53,0, - 81,0,82,0,163,0,113,52,89,0,110,14,88,0,124,6, - 124,0,124,1,124,2,131,3,125,7,87,0,53,0,81,0, - 82,0,88,0,124,7,100,1,107,9,114,52,124,4,144,0, - 115,254,124,0,116,0,106,6,107,6,144,0,114,254,116,0, - 106,6,124,0,25,0,125,8,122,10,124,8,106,11,125,9, - 87,0,110,28,4,0,116,9,107,10,114,226,1,0,1,0, - 1,0,124,7,6,0,89,0,2,0,1,0,83,0,88,0, - 124,9,100,1,107,8,114,244,124,7,2,0,1,0,83,0, - 124,9,2,0,1,0,83,0,113,52,124,7,2,0,1,0, - 83,0,113,52,100,1,83,0,41,4,122,21,70,105,110,100, - 32,97,32,109,111,100,117,108,101,39,115,32,115,112,101,99, - 46,78,122,53,115,121,115,46,109,101,116,97,95,112,97,116, - 104,32,105,115,32,78,111,110,101,44,32,80,121,116,104,111, - 110,32,105,115,32,108,105,107,101,108,121,32,115,104,117,116, - 116,105,110,103,32,100,111,119,110,122,22,115,121,115,46,109, - 101,116,97,95,112,97,116,104,32,105,115,32,101,109,112,116, - 121,41,12,114,15,0,0,0,218,9,109,101,116,97,95,112, - 97,116,104,114,79,0,0,0,218,9,95,119,97,114,110,105, - 110,103,115,218,4,119,97,114,110,218,13,73,109,112,111,114, - 116,87,97,114,110,105,110,103,114,92,0,0,0,114,182,0, - 0,0,114,170,0,0,0,114,108,0,0,0,114,192,0,0, - 0,114,107,0,0,0,41,10,114,17,0,0,0,114,168,0, - 0,0,114,169,0,0,0,114,193,0,0,0,90,9,105,115, - 95,114,101,108,111,97,100,114,191,0,0,0,114,170,0,0, - 0,114,95,0,0,0,114,96,0,0,0,114,107,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 10,95,102,105,110,100,95,115,112,101,99,122,3,0,0,115, - 54,0,0,0,0,2,6,1,8,2,8,3,4,1,12,5, - 10,1,8,1,8,1,2,1,10,1,14,1,12,1,8,1, - 20,2,22,1,8,2,18,1,10,1,2,1,10,1,14,4, - 14,2,8,1,8,2,10,2,10,2,114,197,0,0,0,99, - 3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 4,0,0,0,67,0,0,0,115,108,0,0,0,116,0,124, - 0,116,1,131,2,115,28,116,2,100,1,116,3,124,0,131, - 1,155,0,157,2,131,1,130,1,124,2,100,2,107,0,114, - 44,116,4,100,3,131,1,130,1,124,2,100,2,107,4,114, - 84,116,0,124,1,116,1,131,2,115,72,116,2,100,4,131, - 1,130,1,110,12,124,1,115,84,116,5,100,5,131,1,130, - 1,124,0,115,104,124,2,100,2,107,2,114,104,116,4,100, - 6,131,1,130,1,100,7,83,0,41,8,122,28,86,101,114, - 105,102,121,32,97,114,103,117,109,101,110,116,115,32,97,114, - 101,32,34,115,97,110,101,34,46,122,29,109,111,100,117,108, - 101,32,110,97,109,101,32,109,117,115,116,32,98,101,32,115, - 116,114,44,32,110,111,116,32,114,22,0,0,0,122,18,108, - 101,118,101,108,32,109,117,115,116,32,98,101,32,62,61,32, - 48,122,31,95,95,112,97,99,107,97,103,101,95,95,32,110, - 111,116,32,115,101,116,32,116,111,32,97,32,115,116,114,105, - 110,103,122,54,97,116,116,101,109,112,116,101,100,32,114,101, - 108,97,116,105,118,101,32,105,109,112,111,114,116,32,119,105, - 116,104,32,110,111,32,107,110,111,119,110,32,112,97,114,101, - 110,116,32,112,97,99,107,97,103,101,122,17,69,109,112,116, - 121,32,109,111,100,117,108,101,32,110,97,109,101,78,41,6, - 218,10,105,115,105,110,115,116,97,110,99,101,218,3,115,116, - 114,218,9,84,121,112,101,69,114,114,111,114,114,14,0,0, - 0,218,10,86,97,108,117,101,69,114,114,111,114,114,79,0, - 0,0,169,3,114,17,0,0,0,114,188,0,0,0,114,189, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,13,95,115,97,110,105,116,121,95,99,104,101,99, - 107,169,3,0,0,115,22,0,0,0,0,2,10,1,18,1, - 8,1,8,1,8,1,10,1,10,1,4,1,8,2,12,1, - 114,203,0,0,0,250,16,78,111,32,109,111,100,117,108,101, - 32,110,97,109,101,100,32,122,4,123,33,114,125,99,2,0, - 0,0,0,0,0,0,0,0,0,0,8,0,0,0,8,0, - 0,0,67,0,0,0,115,222,0,0,0,100,0,125,2,124, - 0,160,0,100,1,161,1,100,2,25,0,125,3,124,3,114, - 136,124,3,116,1,106,2,107,7,114,42,116,3,124,1,124, - 3,131,2,1,0,124,0,116,1,106,2,107,6,114,62,116, - 1,106,2,124,0,25,0,83,0,116,1,106,2,124,3,25, - 0,125,4,122,10,124,4,106,4,125,2,87,0,110,52,4, - 0,116,5,107,10,114,134,1,0,1,0,1,0,100,3,124, - 0,155,2,100,4,124,3,155,2,100,5,157,5,125,5,116, - 6,124,5,124,0,100,6,141,2,100,0,130,2,89,0,110, - 2,88,0,116,7,124,0,124,2,131,2,125,6,124,6,100, - 0,107,8,114,174,116,6,100,3,124,0,155,2,157,2,124, - 0,100,6,141,2,130,1,110,8,116,8,124,6,131,1,125, - 7,124,3,114,218,116,1,106,2,124,3,25,0,125,4,116, - 9,124,4,124,0,160,0,100,1,161,1,100,7,25,0,124, - 7,131,3,1,0,124,7,83,0,41,8,78,114,132,0,0, - 0,114,22,0,0,0,114,204,0,0,0,122,2,59,32,122, - 17,32,105,115,32,110,111,116,32,97,32,112,97,99,107,97, - 103,101,114,16,0,0,0,233,2,0,0,0,41,10,114,133, - 0,0,0,114,15,0,0,0,114,92,0,0,0,114,66,0, - 0,0,114,145,0,0,0,114,108,0,0,0,218,19,77,111, - 100,117,108,101,78,111,116,70,111,117,110,100,69,114,114,111, - 114,114,197,0,0,0,114,162,0,0,0,114,5,0,0,0, - 41,8,114,17,0,0,0,218,7,105,109,112,111,114,116,95, - 114,168,0,0,0,114,134,0,0,0,90,13,112,97,114,101, - 110,116,95,109,111,100,117,108,101,114,160,0,0,0,114,95, - 0,0,0,114,96,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,23,95,102,105,110,100,95,97, - 110,100,95,108,111,97,100,95,117,110,108,111,99,107,101,100, - 188,3,0,0,115,42,0,0,0,0,1,4,1,14,1,4, - 1,10,1,10,2,10,1,10,1,10,1,2,1,10,1,14, - 1,18,1,20,1,10,1,8,1,20,2,8,1,4,2,10, - 1,22,1,114,208,0,0,0,99,2,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,10,0,0,0,67,0,0, - 0,115,108,0,0,0,116,0,124,0,131,1,143,50,1,0, - 116,1,106,2,160,3,124,0,116,4,161,2,125,2,124,2, - 116,4,107,8,114,54,116,5,124,0,124,1,131,2,87,0, - 2,0,53,0,81,0,82,0,163,0,83,0,87,0,53,0, - 81,0,82,0,88,0,124,2,100,1,107,8,114,96,100,2, - 124,0,155,0,100,3,157,3,125,3,116,6,124,3,124,0, - 100,4,141,2,130,1,116,7,124,0,131,1,1,0,124,2, - 83,0,41,5,122,25,70,105,110,100,32,97,110,100,32,108, - 111,97,100,32,116,104,101,32,109,111,100,117,108,101,46,78, - 122,10,105,109,112,111,114,116,32,111,102,32,122,28,32,104, - 97,108,116,101,100,59,32,78,111,110,101,32,105,110,32,115, - 121,115,46,109,111,100,117,108,101,115,114,16,0,0,0,41, - 8,114,49,0,0,0,114,15,0,0,0,114,92,0,0,0, - 114,34,0,0,0,218,14,95,78,69,69,68,83,95,76,79, - 65,68,73,78,71,114,208,0,0,0,114,206,0,0,0,114, - 64,0,0,0,41,4,114,17,0,0,0,114,207,0,0,0, - 114,96,0,0,0,114,75,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,14,95,102,105,110,100, - 95,97,110,100,95,108,111,97,100,218,3,0,0,115,18,0, - 0,0,0,2,10,1,14,1,8,1,32,2,8,1,12,2, - 12,2,8,1,114,210,0,0,0,114,22,0,0,0,99,3, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4, - 0,0,0,67,0,0,0,115,42,0,0,0,116,0,124,0, - 124,1,124,2,131,3,1,0,124,2,100,1,107,4,114,32, - 116,1,124,0,124,1,124,2,131,3,125,0,116,2,124,0, - 116,3,131,2,83,0,41,2,97,50,1,0,0,73,109,112, - 111,114,116,32,97,110,100,32,114,101,116,117,114,110,32,116, - 104,101,32,109,111,100,117,108,101,32,98,97,115,101,100,32, - 111,110,32,105,116,115,32,110,97,109,101,44,32,116,104,101, - 32,112,97,99,107,97,103,101,32,116,104,101,32,99,97,108, - 108,32,105,115,10,32,32,32,32,98,101,105,110,103,32,109, - 97,100,101,32,102,114,111,109,44,32,97,110,100,32,116,104, - 101,32,108,101,118,101,108,32,97,100,106,117,115,116,109,101, - 110,116,46,10,10,32,32,32,32,84,104,105,115,32,102,117, - 110,99,116,105,111,110,32,114,101,112,114,101,115,101,110,116, - 115,32,116,104,101,32,103,114,101,97,116,101,115,116,32,99, - 111,109,109,111,110,32,100,101,110,111,109,105,110,97,116,111, - 114,32,111,102,32,102,117,110,99,116,105,111,110,97,108,105, - 116,121,10,32,32,32,32,98,101,116,119,101,101,110,32,105, - 109,112,111,114,116,95,109,111,100,117,108,101,32,97,110,100, - 32,95,95,105,109,112,111,114,116,95,95,46,32,84,104,105, - 115,32,105,110,99,108,117,100,101,115,32,115,101,116,116,105, - 110,103,32,95,95,112,97,99,107,97,103,101,95,95,32,105, - 102,10,32,32,32,32,116,104,101,32,108,111,97,100,101,114, - 32,100,105,100,32,110,111,116,46,10,10,32,32,32,32,114, - 22,0,0,0,41,4,114,203,0,0,0,114,190,0,0,0, - 114,210,0,0,0,218,11,95,103,99,100,95,105,109,112,111, - 114,116,114,202,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,211,0,0,0,234,3,0,0,115, - 8,0,0,0,0,9,12,1,8,1,12,1,114,211,0,0, - 0,169,1,218,9,114,101,99,117,114,115,105,118,101,99,3, - 0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,11, - 0,0,0,67,0,0,0,115,228,0,0,0,124,1,68,0, - 93,218,125,4,116,0,124,4,116,1,131,2,115,66,124,3, - 114,34,124,0,106,2,100,1,23,0,125,5,110,4,100,2, - 125,5,116,3,100,3,124,5,155,0,100,4,116,4,124,4, - 131,1,106,2,155,0,157,4,131,1,130,1,113,4,124,4, - 100,5,107,2,114,108,124,3,115,222,116,5,124,0,100,6, - 131,2,114,222,116,6,124,0,124,0,106,7,124,2,100,7, - 100,8,141,4,1,0,113,4,116,5,124,0,124,4,131,2, - 115,4,124,0,106,2,155,0,100,9,124,4,155,0,157,3, - 125,6,122,14,116,8,124,2,124,6,131,2,1,0,87,0, - 113,4,4,0,116,9,107,10,114,220,1,0,125,7,1,0, - 122,42,124,7,106,10,124,6,107,2,114,202,116,11,106,12, - 160,13,124,6,116,14,161,2,100,10,107,9,114,202,87,0, - 89,0,162,8,113,4,130,0,87,0,53,0,100,10,125,7, - 126,7,88,0,89,0,113,4,88,0,113,4,124,0,83,0, - 41,11,122,238,70,105,103,117,114,101,32,111,117,116,32,119, - 104,97,116,32,95,95,105,109,112,111,114,116,95,95,32,115, - 104,111,117,108,100,32,114,101,116,117,114,110,46,10,10,32, - 32,32,32,84,104,101,32,105,109,112,111,114,116,95,32,112, - 97,114,97,109,101,116,101,114,32,105,115,32,97,32,99,97, - 108,108,97,98,108,101,32,119,104,105,99,104,32,116,97,107, - 101,115,32,116,104,101,32,110,97,109,101,32,111,102,32,109, - 111,100,117,108,101,32,116,111,10,32,32,32,32,105,109,112, - 111,114,116,46,32,73,116,32,105,115,32,114,101,113,117,105, - 114,101,100,32,116,111,32,100,101,99,111,117,112,108,101,32, - 116,104,101,32,102,117,110,99,116,105,111,110,32,102,114,111, - 109,32,97,115,115,117,109,105,110,103,32,105,109,112,111,114, - 116,108,105,98,39,115,10,32,32,32,32,105,109,112,111,114, - 116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110, - 32,105,115,32,100,101,115,105,114,101,100,46,10,10,32,32, - 32,32,122,8,46,95,95,97,108,108,95,95,122,13,96,96, - 102,114,111,109,32,108,105,115,116,39,39,122,8,73,116,101, - 109,32,105,110,32,122,18,32,109,117,115,116,32,98,101,32, - 115,116,114,44,32,110,111,116,32,250,1,42,218,7,95,95, - 97,108,108,95,95,84,114,212,0,0,0,114,132,0,0,0, - 78,41,15,114,198,0,0,0,114,199,0,0,0,114,1,0, - 0,0,114,200,0,0,0,114,14,0,0,0,114,4,0,0, - 0,218,16,95,104,97,110,100,108,101,95,102,114,111,109,108, - 105,115,116,114,215,0,0,0,114,66,0,0,0,114,206,0, - 0,0,114,17,0,0,0,114,15,0,0,0,114,92,0,0, - 0,114,34,0,0,0,114,209,0,0,0,41,8,114,96,0, - 0,0,218,8,102,114,111,109,108,105,115,116,114,207,0,0, - 0,114,213,0,0,0,218,1,120,90,5,119,104,101,114,101, - 90,9,102,114,111,109,95,110,97,109,101,90,3,101,120,99, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 216,0,0,0,249,3,0,0,115,44,0,0,0,0,10,8, - 1,10,1,4,1,12,2,4,1,28,2,8,1,14,1,10, - 1,2,255,8,2,10,1,16,1,2,1,14,1,16,4,10, - 1,16,255,2,2,8,1,22,1,114,216,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,6, - 0,0,0,67,0,0,0,115,146,0,0,0,124,0,160,0, - 100,1,161,1,125,1,124,0,160,0,100,2,161,1,125,2, - 124,1,100,3,107,9,114,82,124,2,100,3,107,9,114,78, - 124,1,124,2,106,1,107,3,114,78,116,2,106,3,100,4, - 124,1,155,2,100,5,124,2,106,1,155,2,100,6,157,5, - 116,4,100,7,100,8,141,3,1,0,124,1,83,0,124,2, - 100,3,107,9,114,96,124,2,106,1,83,0,116,2,106,3, - 100,9,116,4,100,7,100,8,141,3,1,0,124,0,100,10, - 25,0,125,1,100,11,124,0,107,7,114,142,124,1,160,5, - 100,12,161,1,100,13,25,0,125,1,124,1,83,0,41,14, - 122,167,67,97,108,99,117,108,97,116,101,32,119,104,97,116, - 32,95,95,112,97,99,107,97,103,101,95,95,32,115,104,111, - 117,108,100,32,98,101,46,10,10,32,32,32,32,95,95,112, - 97,99,107,97,103,101,95,95,32,105,115,32,110,111,116,32, - 103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101, - 32,100,101,102,105,110,101,100,32,111,114,32,99,111,117,108, - 100,32,98,101,32,115,101,116,32,116,111,32,78,111,110,101, - 10,32,32,32,32,116,111,32,114,101,112,114,101,115,101,110, - 116,32,116,104,97,116,32,105,116,115,32,112,114,111,112,101, - 114,32,118,97,108,117,101,32,105,115,32,117,110,107,110,111, - 119,110,46,10,10,32,32,32,32,114,149,0,0,0,114,107, - 0,0,0,78,122,32,95,95,112,97,99,107,97,103,101,95, - 95,32,33,61,32,95,95,115,112,101,99,95,95,46,112,97, - 114,101,110,116,32,40,122,4,32,33,61,32,114,122,0,0, - 0,233,3,0,0,0,41,1,90,10,115,116,97,99,107,108, - 101,118,101,108,122,89,99,97,110,39,116,32,114,101,115,111, - 108,118,101,32,112,97,99,107,97,103,101,32,102,114,111,109, - 32,95,95,115,112,101,99,95,95,32,111,114,32,95,95,112, - 97,99,107,97,103,101,95,95,44,32,102,97,108,108,105,110, - 103,32,98,97,99,107,32,111,110,32,95,95,110,97,109,101, - 95,95,32,97,110,100,32,95,95,112,97,116,104,95,95,114, - 1,0,0,0,114,145,0,0,0,114,132,0,0,0,114,22, - 0,0,0,41,6,114,34,0,0,0,114,134,0,0,0,114, - 194,0,0,0,114,195,0,0,0,114,196,0,0,0,114,133, - 0,0,0,41,3,218,7,103,108,111,98,97,108,115,114,188, - 0,0,0,114,95,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,17,95,99,97,108,99,95,95, - 95,112,97,99,107,97,103,101,95,95,30,4,0,0,115,38, - 0,0,0,0,7,10,1,10,1,8,1,18,1,22,2,2, - 0,2,254,6,3,4,1,8,1,6,2,6,2,2,0,2, - 254,6,3,8,1,8,1,14,1,114,221,0,0,0,114,10, - 0,0,0,99,5,0,0,0,0,0,0,0,0,0,0,0, - 9,0,0,0,5,0,0,0,67,0,0,0,115,180,0,0, - 0,124,4,100,1,107,2,114,18,116,0,124,0,131,1,125, - 5,110,36,124,1,100,2,107,9,114,30,124,1,110,2,105, - 0,125,6,116,1,124,6,131,1,125,7,116,0,124,0,124, - 7,124,4,131,3,125,5,124,3,115,150,124,4,100,1,107, - 2,114,84,116,0,124,0,160,2,100,3,161,1,100,1,25, - 0,131,1,83,0,124,0,115,92,124,5,83,0,116,3,124, - 0,131,1,116,3,124,0,160,2,100,3,161,1,100,1,25, - 0,131,1,24,0,125,8,116,4,106,5,124,5,106,6,100, - 2,116,3,124,5,106,6,131,1,124,8,24,0,133,2,25, - 0,25,0,83,0,110,26,116,7,124,5,100,4,131,2,114, - 172,116,8,124,5,124,3,116,0,131,3,83,0,124,5,83, - 0,100,2,83,0,41,5,97,215,1,0,0,73,109,112,111, - 114,116,32,97,32,109,111,100,117,108,101,46,10,10,32,32, - 32,32,84,104,101,32,39,103,108,111,98,97,108,115,39,32, - 97,114,103,117,109,101,110,116,32,105,115,32,117,115,101,100, - 32,116,111,32,105,110,102,101,114,32,119,104,101,114,101,32, - 116,104,101,32,105,109,112,111,114,116,32,105,115,32,111,99, - 99,117,114,114,105,110,103,32,102,114,111,109,10,32,32,32, - 32,116,111,32,104,97,110,100,108,101,32,114,101,108,97,116, - 105,118,101,32,105,109,112,111,114,116,115,46,32,84,104,101, - 32,39,108,111,99,97,108,115,39,32,97,114,103,117,109,101, - 110,116,32,105,115,32,105,103,110,111,114,101,100,46,32,84, - 104,101,10,32,32,32,32,39,102,114,111,109,108,105,115,116, - 39,32,97,114,103,117,109,101,110,116,32,115,112,101,99,105, - 102,105,101,115,32,119,104,97,116,32,115,104,111,117,108,100, - 32,101,120,105,115,116,32,97,115,32,97,116,116,114,105,98, - 117,116,101,115,32,111,110,32,116,104,101,32,109,111,100,117, - 108,101,10,32,32,32,32,98,101,105,110,103,32,105,109,112, - 111,114,116,101,100,32,40,101,46,103,46,32,96,96,102,114, - 111,109,32,109,111,100,117,108,101,32,105,109,112,111,114,116, - 32,60,102,114,111,109,108,105,115,116,62,96,96,41,46,32, - 32,84,104,101,32,39,108,101,118,101,108,39,10,32,32,32, - 32,97,114,103,117,109,101,110,116,32,114,101,112,114,101,115, - 101,110,116,115,32,116,104,101,32,112,97,99,107,97,103,101, - 32,108,111,99,97,116,105,111,110,32,116,111,32,105,109,112, - 111,114,116,32,102,114,111,109,32,105,110,32,97,32,114,101, - 108,97,116,105,118,101,10,32,32,32,32,105,109,112,111,114, - 116,32,40,101,46,103,46,32,96,96,102,114,111,109,32,46, - 46,112,107,103,32,105,109,112,111,114,116,32,109,111,100,96, - 96,32,119,111,117,108,100,32,104,97,118,101,32,97,32,39, - 108,101,118,101,108,39,32,111,102,32,50,41,46,10,10,32, - 32,32,32,114,22,0,0,0,78,114,132,0,0,0,114,145, - 0,0,0,41,9,114,211,0,0,0,114,221,0,0,0,218, - 9,112,97,114,116,105,116,105,111,110,114,187,0,0,0,114, - 15,0,0,0,114,92,0,0,0,114,1,0,0,0,114,4, - 0,0,0,114,216,0,0,0,41,9,114,17,0,0,0,114, - 220,0,0,0,218,6,108,111,99,97,108,115,114,217,0,0, - 0,114,189,0,0,0,114,96,0,0,0,90,8,103,108,111, - 98,97,108,115,95,114,188,0,0,0,90,7,99,117,116,95, - 111,102,102,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,10,95,95,105,109,112,111,114,116,95,95,57,4, - 0,0,115,30,0,0,0,0,11,8,1,10,2,16,1,8, - 1,12,1,4,3,8,1,18,1,4,1,4,4,26,3,32, - 1,10,1,12,2,114,224,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, - 0,0,0,115,38,0,0,0,116,0,160,1,124,0,161,1, - 125,1,124,1,100,0,107,8,114,30,116,2,100,1,124,0, - 23,0,131,1,130,1,116,3,124,1,131,1,83,0,41,2, - 78,122,25,110,111,32,98,117,105,108,116,45,105,110,32,109, - 111,100,117,108,101,32,110,97,109,101,100,32,41,4,114,163, - 0,0,0,114,170,0,0,0,114,79,0,0,0,114,162,0, - 0,0,41,2,114,17,0,0,0,114,95,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,18,95, - 98,117,105,108,116,105,110,95,102,114,111,109,95,110,97,109, - 101,94,4,0,0,115,8,0,0,0,0,1,10,1,8,1, - 12,1,114,225,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,10,0,0,0,5,0,0,0,67,0,0,0, - 115,166,0,0,0,124,1,97,0,124,0,97,1,116,2,116, - 1,131,1,125,2,116,1,106,3,160,4,161,0,68,0,93, - 72,92,2,125,3,125,4,116,5,124,4,124,2,131,2,114, - 26,124,3,116,1,106,6,107,6,114,60,116,7,125,5,110, - 18,116,0,160,8,124,3,161,1,114,26,116,9,125,5,110, - 2,113,26,116,10,124,4,124,5,131,2,125,6,116,11,124, - 6,124,4,131,2,1,0,113,26,116,1,106,3,116,12,25, - 0,125,7,100,1,68,0,93,46,125,8,124,8,116,1,106, - 3,107,7,114,138,116,13,124,8,131,1,125,9,110,10,116, - 1,106,3,124,8,25,0,125,9,116,14,124,7,124,8,124, - 9,131,3,1,0,113,114,100,2,83,0,41,3,122,250,83, - 101,116,117,112,32,105,109,112,111,114,116,108,105,98,32,98, - 121,32,105,109,112,111,114,116,105,110,103,32,110,101,101,100, - 101,100,32,98,117,105,108,116,45,105,110,32,109,111,100,117, - 108,101,115,32,97,110,100,32,105,110,106,101,99,116,105,110, - 103,32,116,104,101,109,10,32,32,32,32,105,110,116,111,32, - 116,104,101,32,103,108,111,98,97,108,32,110,97,109,101,115, - 112,97,99,101,46,10,10,32,32,32,32,65,115,32,115,121, - 115,32,105,115,32,110,101,101,100,101,100,32,102,111,114,32, - 115,121,115,46,109,111,100,117,108,101,115,32,97,99,99,101, - 115,115,32,97,110,100,32,95,105,109,112,32,105,115,32,110, - 101,101,100,101,100,32,116,111,32,108,111,97,100,32,98,117, - 105,108,116,45,105,110,10,32,32,32,32,109,111,100,117,108, - 101,115,44,32,116,104,111,115,101,32,116,119,111,32,109,111, - 100,117,108,101,115,32,109,117,115,116,32,98,101,32,101,120, - 112,108,105,99,105,116,108,121,32,112,97,115,115,101,100,32, - 105,110,46,10,10,32,32,32,32,41,3,114,23,0,0,0, - 114,194,0,0,0,114,63,0,0,0,78,41,15,114,56,0, - 0,0,114,15,0,0,0,114,14,0,0,0,114,92,0,0, - 0,218,5,105,116,101,109,115,114,198,0,0,0,114,78,0, - 0,0,114,163,0,0,0,114,88,0,0,0,114,177,0,0, - 0,114,146,0,0,0,114,152,0,0,0,114,1,0,0,0, - 114,225,0,0,0,114,5,0,0,0,41,10,218,10,115,121, - 115,95,109,111,100,117,108,101,218,11,95,105,109,112,95,109, - 111,100,117,108,101,90,11,109,111,100,117,108,101,95,116,121, - 112,101,114,17,0,0,0,114,96,0,0,0,114,111,0,0, - 0,114,95,0,0,0,90,11,115,101,108,102,95,109,111,100, - 117,108,101,90,12,98,117,105,108,116,105,110,95,110,97,109, - 101,90,14,98,117,105,108,116,105,110,95,109,111,100,117,108, - 101,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,6,95,115,101,116,117,112,101,4,0,0,115,36,0,0, - 0,0,9,4,1,4,3,8,1,18,1,10,1,10,1,6, - 1,10,1,6,2,2,1,10,1,12,3,10,1,8,1,10, - 1,10,2,10,1,114,229,0,0,0,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, - 0,0,0,115,38,0,0,0,116,0,124,0,124,1,131,2, - 1,0,116,1,106,2,160,3,116,4,161,1,1,0,116,1, - 106,2,160,3,116,5,161,1,1,0,100,1,83,0,41,2, - 122,48,73,110,115,116,97,108,108,32,105,109,112,111,114,116, - 101,114,115,32,102,111,114,32,98,117,105,108,116,105,110,32, - 97,110,100,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,115,78,41,6,114,229,0,0,0,114,15,0,0,0,114, - 193,0,0,0,114,123,0,0,0,114,163,0,0,0,114,177, - 0,0,0,41,2,114,227,0,0,0,114,228,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,8, - 95,105,110,115,116,97,108,108,136,4,0,0,115,6,0,0, - 0,0,2,10,2,12,1,114,230,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0, - 0,67,0,0,0,115,32,0,0,0,100,1,100,2,108,0, - 125,0,124,0,97,1,124,0,160,2,116,3,106,4,116,5, - 25,0,161,1,1,0,100,2,83,0,41,3,122,57,73,110, - 115,116,97,108,108,32,105,109,112,111,114,116,101,114,115,32, - 116,104,97,116,32,114,101,113,117,105,114,101,32,101,120,116, - 101,114,110,97,108,32,102,105,108,101,115,121,115,116,101,109, - 32,97,99,99,101,115,115,114,22,0,0,0,78,41,6,218, - 26,95,102,114,111,122,101,110,95,105,109,112,111,114,116,108, - 105,98,95,101,120,116,101,114,110,97,108,114,130,0,0,0, - 114,230,0,0,0,114,15,0,0,0,114,92,0,0,0,114, - 1,0,0,0,41,1,114,231,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,27,95,105,110,115, - 116,97,108,108,95,101,120,116,101,114,110,97,108,95,105,109, - 112,111,114,116,101,114,115,144,4,0,0,115,6,0,0,0, - 0,3,8,1,4,1,114,232,0,0,0,41,2,78,78,41, - 1,78,41,2,78,114,22,0,0,0,41,4,78,78,114,10, - 0,0,0,114,22,0,0,0,41,50,114,3,0,0,0,114, - 130,0,0,0,114,12,0,0,0,114,18,0,0,0,114,59, - 0,0,0,114,33,0,0,0,114,42,0,0,0,114,19,0, - 0,0,114,20,0,0,0,114,48,0,0,0,114,49,0,0, - 0,114,52,0,0,0,114,64,0,0,0,114,66,0,0,0, - 114,76,0,0,0,114,86,0,0,0,114,90,0,0,0,114, - 97,0,0,0,114,113,0,0,0,114,114,0,0,0,114,91, - 0,0,0,114,146,0,0,0,114,152,0,0,0,114,156,0, - 0,0,114,109,0,0,0,114,93,0,0,0,114,161,0,0, - 0,114,162,0,0,0,114,94,0,0,0,114,163,0,0,0, - 114,177,0,0,0,114,182,0,0,0,114,190,0,0,0,114, - 192,0,0,0,114,197,0,0,0,114,203,0,0,0,90,15, - 95,69,82,82,95,77,83,71,95,80,82,69,70,73,88,90, - 8,95,69,82,82,95,77,83,71,114,208,0,0,0,218,6, - 111,98,106,101,99,116,114,209,0,0,0,114,210,0,0,0, - 114,211,0,0,0,114,216,0,0,0,114,221,0,0,0,114, - 224,0,0,0,114,225,0,0,0,114,229,0,0,0,114,230, - 0,0,0,114,232,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,8,60,109, - 111,100,117,108,101,62,1,0,0,0,115,94,0,0,0,4, - 24,4,2,8,8,8,8,4,2,4,3,16,4,14,68,14, - 21,14,16,8,37,8,17,8,11,14,8,8,11,8,12,8, - 16,8,36,14,100,16,26,10,45,14,72,8,17,8,17,8, - 30,8,37,8,42,8,15,14,75,14,78,14,13,8,9,8, - 9,10,47,8,16,4,1,8,2,8,27,6,3,8,16,10, - 15,14,37,8,27,10,37,8,7,8,35,8,8, -}; diff --git a/Tools/c-analyzer/cpython/_parser.py b/Tools/c-analyzer/cpython/_parser.py index d82fb967297cae..5924ab7860d8d5 100644 --- a/Tools/c-analyzer/cpython/_parser.py +++ b/Tools/c-analyzer/cpython/_parser.py @@ -328,7 +328,6 @@ def clean_lines(text): _abs('Python/frozen_modules/*.h'): (20_000, 500), _abs('Python/opcode_targets.h'): (10_000, 500), _abs('Python/stdlib_module_names.h'): (5_000, 500), - _abs('Python/importlib.h'): (200_000, 5000), # These large files are currently ignored (see above). _abs('Modules/_ssl_data.h'): (80_000, 10_000), diff --git a/configure b/configure index 9e99352f589f21..4ae8258438e620 100755 --- a/configure +++ b/configure @@ -3104,7 +3104,6 @@ if test "$srcdir" != . -a "$srcdir" != "$(pwd)"; then # resources get picked up before their $srcdir counterparts. # Objects/ -> typeslots.inc # Include/ -> Python.h - # Python/ -> importlib.h # (A side effect of this is that these resources will automatically be # regenerated when building out-of-tree, regardless of whether or not # the $srcdir counterpart is up-to-date. This is an acceptable trade diff --git a/configure.ac b/configure.ac index 31b7a2157a2bcc..4d9eb46f5ce7d8 100644 --- a/configure.ac +++ b/configure.ac @@ -97,7 +97,6 @@ if test "$srcdir" != . -a "$srcdir" != "$(pwd)"; then # resources get picked up before their $srcdir counterparts. # Objects/ -> typeslots.inc # Include/ -> Python.h - # Python/ -> importlib.h # (A side effect of this is that these resources will automatically be # regenerated when building out-of-tree, regardless of whether or not # the $srcdir counterpart is up-to-date. This is an acceptable trade From 2b6e8777672da03f5d5cd12366e8378e47c550da Mon Sep 17 00:00:00 2001 From: Stanislav Syekirin Date: Wed, 12 Apr 2023 22:11:50 +0200 Subject: [PATCH 159/349] gh-103088: Fix virtual environment activate script not working in Cygwin (GH-103470) --- .gitattributes | 3 +++ Lib/test/test_venv.py | 15 +++++++++++++++ ...2023-04-12-10-49-21.gh-issue-103088.Yjj-qJ.rst | 1 + 3 files changed, 19 insertions(+) create mode 100644 Misc/NEWS.d/next/Windows/2023-04-12-10-49-21.gh-issue-103088.Yjj-qJ.rst diff --git a/.gitattributes b/.gitattributes index 13289182400109..cb1cf8bcc7c877 100644 --- a/.gitattributes +++ b/.gitattributes @@ -32,6 +32,9 @@ Lib/test/test_importlib/resources/data01/* noeol Lib/test/test_importlib/resources/namespacedata01/* noeol Lib/test/xmltestdata/* noeol +# Shell scripts should have LF even on Windows because of Cygwin +Lib/venv/scripts/common/activate text eol=lf + # CRLF files [attr]dos text eol=crlf diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 4e18dfc23c40c2..23328431a7aad8 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -611,6 +611,21 @@ def test_zippath_from_non_installed_posix(self): out, err = check_output(cmd) self.assertTrue(zip_landmark.encode() in out) + def test_activate_shell_script_has_no_dos_newlines(self): + """ + Test that the `activate` shell script contains no CR LF. + This is relevant for Cygwin, as the Windows build might have + converted line endings accidentally. + """ + venv_dir = pathlib.Path(self.env_dir) + rmtree(venv_dir) + [[scripts_dir], *_] = self.ENV_SUBDIRS + script_path = venv_dir / scripts_dir / "activate" + venv.create(venv_dir) + with open(script_path, 'rb') as script: + for line in script: + self.assertFalse(line.endswith(b'\r\n'), line) + @requireVenvCreate class EnsurePipTest(BaseTest): """Test venv module installation of pip.""" diff --git a/Misc/NEWS.d/next/Windows/2023-04-12-10-49-21.gh-issue-103088.Yjj-qJ.rst b/Misc/NEWS.d/next/Windows/2023-04-12-10-49-21.gh-issue-103088.Yjj-qJ.rst new file mode 100644 index 00000000000000..1fee99da240378 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2023-04-12-10-49-21.gh-issue-103088.Yjj-qJ.rst @@ -0,0 +1 @@ +Fix virtual environment :file:`activate` script having incorrect line endings for Cygwin. From 330a942b6303c889d0f42f23d5ae2b42af92ecc4 Mon Sep 17 00:00:00 2001 From: Skip Montanaro Date: Wed, 12 Apr 2023 17:32:30 -0500 Subject: [PATCH 160/349] gh-67230: add quoting rules to csv module (GH-29469) Add two quoting styles for csv dialects. They will help to work with certain databases in particular. Automerge-Triggered-By: GH:merwok --- Doc/library/csv.rst | 22 +++++++++++++++++-- Lib/csv.py | 2 ++ Lib/test/test_csv.py | 4 ++++ .../2021-11-07-15-31-25.bpo-23041.564i32.rst | 2 ++ Modules/_csv.c | 16 +++++++++++++- 5 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2021-11-07-15-31-25.bpo-23041.564i32.rst diff --git a/Doc/library/csv.rst b/Doc/library/csv.rst index f1776554d8b9f2..64baa69be4af31 100644 --- a/Doc/library/csv.rst +++ b/Doc/library/csv.rst @@ -327,7 +327,7 @@ The :mod:`csv` module defines the following constants: Instructs :class:`writer` objects to quote all non-numeric fields. - Instructs the reader to convert all non-quoted fields to type *float*. + Instructs :class:`reader` objects to convert all non-quoted fields to type *float*. .. data:: QUOTE_NONE @@ -337,7 +337,25 @@ The :mod:`csv` module defines the following constants: character. If *escapechar* is not set, the writer will raise :exc:`Error` if any characters that require escaping are encountered. - Instructs :class:`reader` to perform no special processing of quote characters. + Instructs :class:`reader` objects to perform no special processing of quote characters. + +.. data:: QUOTE_NOTNULL + + Instructs :class:`writer` objects to quote all fields which are not + ``None``. This is similar to :data:`QUOTE_ALL`, except that if a + field value is ``None`` an empty (unquoted) string is written. + + Instructs :class:`reader` objects to interpret an empty (unquoted) field as None and + to otherwise behave as :data:`QUOTE_ALL`. + +.. data:: QUOTE_STRINGS + + Instructs :class:`writer` objects to always place quotes around fields + which are strings. This is similar to :data:`QUOTE_NONNUMERIC`, except that if a + field value is ``None`` an empty (unquoted) string is written. + + Instructs :class:`reader` objects to interpret an empty (unquoted) string as ``None`` and + to otherwise behave as :data:`QUOTE_NONNUMERIC`. The :mod:`csv` module defines the following exception: diff --git a/Lib/csv.py b/Lib/csv.py index 4ef8be45ca9e0a..77f30c8d2b1f61 100644 --- a/Lib/csv.py +++ b/Lib/csv.py @@ -9,12 +9,14 @@ unregister_dialect, get_dialect, list_dialects, \ field_size_limit, \ QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONNUMERIC, QUOTE_NONE, \ + QUOTE_STRINGS, QUOTE_NOTNULL, \ __doc__ from _csv import Dialect as _Dialect from io import StringIO __all__ = ["QUOTE_MINIMAL", "QUOTE_ALL", "QUOTE_NONNUMERIC", "QUOTE_NONE", + "QUOTE_STRINGS", "QUOTE_NOTNULL", "Error", "Dialect", "__doc__", "excel", "excel_tab", "field_size_limit", "reader", "writer", "register_dialect", "get_dialect", "list_dialects", "Sniffer", diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py index 8289ddb1c3a54f..8fb97bc0c1a1a7 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -187,6 +187,10 @@ def test_write_quoting(self): quoting = csv.QUOTE_ALL) self._write_test(['a\nb',1], '"a\nb","1"', quoting = csv.QUOTE_ALL) + self._write_test(['a','',None,1], '"a","",,1', + quoting = csv.QUOTE_STRINGS) + self._write_test(['a','',None,1], '"a","",,"1"', + quoting = csv.QUOTE_NOTNULL) def test_write_escape(self): self._write_test(['a',1,'p,q'], 'a,1,"p,q"', diff --git a/Misc/NEWS.d/next/Library/2021-11-07-15-31-25.bpo-23041.564i32.rst b/Misc/NEWS.d/next/Library/2021-11-07-15-31-25.bpo-23041.564i32.rst new file mode 100644 index 00000000000000..53c32d397b206b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-11-07-15-31-25.bpo-23041.564i32.rst @@ -0,0 +1,2 @@ +Add :data:`~csv.QUOTE_STRINGS` and :data:`~csv.QUOTE_NOTNULL` to the suite +of :mod:`csv` module quoting styles. diff --git a/Modules/_csv.c b/Modules/_csv.c index bd337084dbff81..2217cc2ca7a775 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -82,7 +82,8 @@ typedef enum { } ParserState; typedef enum { - QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONNUMERIC, QUOTE_NONE + QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONNUMERIC, QUOTE_NONE, + QUOTE_STRINGS, QUOTE_NOTNULL } QuoteStyle; typedef struct { @@ -95,6 +96,8 @@ static const StyleDesc quote_styles[] = { { QUOTE_ALL, "QUOTE_ALL" }, { QUOTE_NONNUMERIC, "QUOTE_NONNUMERIC" }, { QUOTE_NONE, "QUOTE_NONE" }, + { QUOTE_STRINGS, "QUOTE_STRINGS" }, + { QUOTE_NOTNULL, "QUOTE_NOTNULL" }, { 0 } }; @@ -1264,6 +1267,12 @@ csv_writerow(WriterObj *self, PyObject *seq) case QUOTE_ALL: quoted = 1; break; + case QUOTE_STRINGS: + quoted = PyUnicode_Check(field); + break; + case QUOTE_NOTNULL: + quoted = field != Py_None; + break; default: quoted = 0; break; @@ -1659,6 +1668,11 @@ PyDoc_STRVAR(csv_module_doc, " csv.QUOTE_NONNUMERIC means that quotes are always placed around\n" " fields which do not parse as integers or floating point\n" " numbers.\n" +" csv.QUOTE_STRINGS means that quotes are always placed around\n" +" fields which are strings. Note that the Python value None\n" +" is not a string.\n" +" csv.QUOTE_NOTNULL means that quotes are only placed around fields\n" +" that are not the Python value None.\n" " csv.QUOTE_NONE means that quotes are never placed around fields.\n" " * escapechar - specifies a one-character string used to escape\n" " the delimiter when quoting is set to QUOTE_NONE.\n" From fb38c1b52e77ffe6e8a02bfc01bd112dcd7e6d95 Mon Sep 17 00:00:00 2001 From: Skip Montanaro Date: Wed, 12 Apr 2023 19:45:52 -0500 Subject: [PATCH 161/349] gh-67230: document new csv quoting modes in whatsnew (gh-103491) --- Doc/whatsnew/3.12.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index c7fc7d229cd753..4165b16ba76441 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -253,6 +253,13 @@ asyncio * :func:`asyncio.wait` now accepts generators yielding tasks. (Contributed by Kumar Aditya in :gh:`78530`.) +csv +--- + +* Add :data:`~csv.QUOTE_NOTNULL` and :data:`~csv.QUOTE_STRINGS` flags to + provide finer grained control of ``None`` and empty strings by + :class:`~csv.reader` and :class:`~csv.writer` objects. + inspect ------- From 9e677406ee6666b32d869ce68c826519ff877445 Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Wed, 12 Apr 2023 23:17:36 -0500 Subject: [PATCH 162/349] gh-95299: Rework test_cppext.py to not invoke setup.py directly (#103316) * gh-95299: Rework test_cppext.py to not invoke setup.py directly * Add tests/cppextdata data to `TESTSUBDIRS` * Revert "Add tests/cppextdata data to `TESTSUBDIRS`" This reverts commit 635492e53954fb0fc2a2875c8961bde99266c48d. * Revert "gh-95299: Rework test_cppext.py to not invoke setup.py directly" This reverts commit 41c5a667b5de7070bbde5780f1c124f96863c91d. * Build and install the extension in a temporary directory instead * Pull in wheels for setuptools and wheel for testing extension builds --- Lib/test/setup_testcppext.py | 11 +++------ Lib/test/setuptools-67.6.1-py3-none-any.whl | Bin 0 -> 1089263 bytes Lib/test/test_cppext.py | 25 +++++++++++++------- Lib/test/wheel-0.40.0-py3-none-any.whl | Bin 0 -> 64545 bytes 4 files changed, 20 insertions(+), 16 deletions(-) create mode 100644 Lib/test/setuptools-67.6.1-py3-none-any.whl create mode 100644 Lib/test/wheel-0.40.0-py3-none-any.whl diff --git a/Lib/test/setup_testcppext.py b/Lib/test/setup_testcppext.py index c6b68104d1333c..22fe750085fd70 100644 --- a/Lib/test/setup_testcppext.py +++ b/Lib/test/setup_testcppext.py @@ -1,5 +1,6 @@ # gh-91321: Build a basic C++ test extension to check that the Python C API is # compatible with C++ and does not emit C++ compiler warnings. +import os import sys from test import support @@ -25,14 +26,8 @@ def main(): cppflags = list(CPPFLAGS) - if '-std=c++03' in sys.argv: - sys.argv.remove('-std=c++03') - std = 'c++03' - name = '_testcpp03ext' - else: - # Python currently targets C++11 - std = 'c++11' - name = '_testcpp11ext' + std = os.environ["CPYTHON_TEST_CPP_STD"] + name = os.environ["CPYTHON_TEST_EXT_NAME"] cppflags = [*CPPFLAGS, f'-std={std}'] diff --git a/Lib/test/setuptools-67.6.1-py3-none-any.whl b/Lib/test/setuptools-67.6.1-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..4b7ffd2e49e15596fc20cdc693164b30dd978f1c GIT binary patch literal 1089263 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

$O^~=wR#pXLy{1G<#bjrmv9* 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∋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

j6vbhE3 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 nPzGxR`H zsMrjHTpF>1QH=6t#}qp^qY^OF^zzEgW6ZX*W;%u`>TX8)Q?ZnM#U*7N0pk%Gsi`7K*2Q>nB=V(Wa9c2;#$r{}Bw;k9_9B-& z*u$TX?$~+w3SaGh18RG=d32d?v_wt3UWeXH%#P~=%)Os5G^?)%{(~=SQE%AK8q{e! zz{h~+@Aurc{pcZKiBIlgkvn*$LlJ$NZNd@r-RfTXBjo>FF-4+OCyU?JI)eXS?MDCm ziW%4%JK9+o|0ct3HLYKmHHzg^?1U7ia(G>FZ1_kovV8rBGQS11X{vE=fpTrX@mFF6h#6f*2)) z;R~a<#x)|%Pih`;Q=k~Pg*uY5OA;pM;dYi3my|D3d?qanfRZI-StRDv^UXDa?;c^2 zQ)zi}-jx-L)8+cZfg%-;q-y^#X9l66u^L$dv1kg%mo^|qPb+&{e{1kX#aRhQ)09tB z)2U0SczbKEsyjRYmJ4dFu37T`&Uy**Ev##%Ot0?ILz;mIGY zzV68vUQtfA`lpSReE`RV69|=tSd*?QW8ohMfB2~D_abo0*2gvHOMNvZ#ireK5rJEu zp;Gp|09so0E&@HZ@i7njD;Yo8X0Ia~Hs~8xmI}H+%w1nlvZGkXHj!7#3!1A zkD(7WcpqG#pMz``7Y_HN1flIDsc#^dx1k@OpWK=kW>Q+I_y@#@9oN&QFu_-AJmBre z^z!ZYvy1_b==1VJB#aKpLT9h`Y&uQ~5%_vb7y(<-ocJ4FxgfPCR+5=?{62!hyB-0 z-O=a!)odHO8vYKyUsN>FpVRM|%c_s>ODf~ysE|aGVw(HMFA%=gX1C;b#eeB)Zhzwy!q-jj!JKacxSDN4!DTdy`i5bjzahjN zOusw`6RiRocLa)fWvu`AeOHmVM692*gJCm+1@8_o-wrQThAQchgX*T{BL|p*s-%{_ zBGqKI{DL&uH@nHe7>jA*ykM*BKx7p>{wW8$YSU2a)(MpjBWjZe;R>Kzj1o+SLi`!` zDwxxdpeYpH?%>lY=ie+^KwZI-^-^Q0c&L@kagsa$Uv1${WkFlPzS#lC=}2%Zq>u*k zBnd?ZqrFajHl@x_l4gNIrB8mXPJepczxKOoxt!G*`*XDesPb37pk2C z6U@r;;s%HA7rq5?`yy<&rqz`s)Ne=((4YRj$wzlPKG*u{F`ehQOL6u6b$;~&cU|2k zx`RmtErz6$t-&pdpnNU`@1rI<>H@zI$b5PGv_bx!`4+zm6C6p2ytqu}$$)^PO&{1S z^98~*)Wzy6(Dwn(>Q8G_Tz}9Qp!%F!A#NR8Bi5+uUgr}_$q_sp%{2U8>c7B>er6DKk|99 z#!4G?zIB_prVXs>pBekpYzZze9K{@c5F3bLAUNz@+mvr~%Jt5RMkJ2nislL7{+M0% zVSqF@>d3%W8?21G%gwglzaKW9AEcg-o@k6p+j_MJ>yVUPbYhHM_dlwcO@OhbF-!LVK0mLI zKU$F=!)An+UTY^r;}sa?UF~T}a6p$pC1F5biByz0p@2zU2kI|O=E-VOxuSOk1zF*m zHaCIB?Eu_M4-09@#6gX&Qn9z2S!g%Erc(*E1k`JxZ2O#xl<)8N99v>gyBZ3MwClUE zHgWT6(%1OR*{{FGJ5fl!g$it8VSXYy;KH$8Iz~kye|{P2hI2 z0-TnS=`;Kzk8Tn#$Nh_1tr2N=`F1sXIZX=XH#sKSu0hL>!B=EvSdVpCEBJUBTQU=xsGbrV4`HM)r0ZWK^T(rv&y1*}3GLvts9g3huJk#a>ni`@t z#ki9c%yP;w69!|Bh49?Su*2smTRKOKl7v z#Av+C*E(!GDel}PmzCwU>a{Q~ zwG^kC98!tc+49fiV*h-aMVG>(Bt+8;h$NK<%%qt8@f_t>0xX3>J1JWh6)PQb9e0UO-8&_Q&pA+h!ptaJ%{;HNk|; zxvBjSU9JZ-qC;VoLtdm|Pt4mWjX0E^pnNu>-81=+& zI$(b}&(xCepw*30V^Pl<%7(oT!?LN@RT_XZz=l&}-x?x;pYshb<*W?|w>fBDDmVY& z7FRs2xrmJ|3U;g>cM#o|#DX$?erz68+DG1dtO;y%>T3m z^%VAcDGZu*`eeHa*(}33h-O2VoZYViSifr{^!{R5{FiM;FkpagZ00P zqyBpx;9_gx{`(D2YuLzbiX(jI>NPNlyA&tw(It}g8u53xt*I;J)s{tP6ma06;7FOtFfF3Rkzw@9=AykI2DBo8+)2;hU z?&4CC=S(j$9DzcaccN@jO0{g{bsN>KCVsp$#pJ66=^aqleIW72Nq2YVms^^dXI~P> zhcnnnNr!TD{PhRBGTL{~^u!AjJxZ*OpTs!sC{p&+Sv;7eEi!T(=BB@8YTS5)%ng`G z`L?89 zu|Nek9$Zv0!{h;wxB=*1k34S-Je+nvGTM=i@YZzX$P*(JtLHvhE>aV$!jQ(`eP)a& z-V$pEO%j~q#G4Z!E}gA^YN~0F18NMTF%%wRxTHl#ZHKwUePB4*A1@1|f@2XxN;tj! zR5FqiIdn^D_}pg1*&vj6fpbX^S$rP2pppWTB%O{4Wd=6&v zcQqpnd`Ve0z#~2j{3v^;pS2i&DJy!Or;Th^iYBD>@_A)gw%t3x|O!qT^I)m9H*Yb~$s&cZt5HZ7vRcZ;^=0-W# zCMwiDv+^9EBn;%m5^LDW0f6lpLp96>4g#7qFw*GmAVCsxW{4-43*5`3ap;GM?LoS@ zN)~vCkH4d{BMV<7pI&ZWt&;j>`t*gD`CdMVC_wjxS1h9)0M(Z!=ou)-j3rPDMefHJ znfYpIia{JFDx~PCm#sQ&k%%vZDN}f#8yV6kvH=WYxtIwCU*?q^Rn$r7*H5GUroo<` zplzPD2FpF+#p*%4{q|890W`X12!E&sX@`QTjqM9WqLqkjJXYgwtm~6k{~hJg zBn*PGj4RJ%hO)slX&dWz@59i-a zY$x_fNGm~z?}Wc+#?&1RIkb~#S|v8vopTps%^~(`iM&03U)`TA%vd&=+O!I33*R|$ zx{?a7GR?BK00KT0c_ybwyrox&tg&xs3IeU$upg{3y-A<{Qng;cIVkliVbHgVqEWeA zyCz@HUF{AMor{g;$+@jwx3u80bAz=!>b8Lf+|OIzTET&({31vk+KV!WY_AWg(2t{yDG|!N%OTQ*Wl@8((wOXkU29sAZSd1p z^rRiTJ^VHM7pgL*uQ|t|Eu@Z&1AyyyJf+J~x(Gjtk#+$jM&ZL5fP_Uu!v0(-P&I)h z80+b#jq1(H(T@<5SfLlxqUQfVQ>JJ2ABU{i7U!T^<144TS*LK=OLtb;s5{7nEkQm= zX17(Isk=91S90)ew5FG6rYVLJU?1ez@18<(sy}rhEibP|-LJn#q#e%e&B zLH`n1RG%)tBr7uff*riXpL{vzT?1);lKj``~8(9J2U+pUeRJS)|! z+RJEy^`hn7Z6G&GCjV)Lz@V~MS0+V&%rN#uKT4vygzS_|167ThiHTY?} z-+5~b-7WO+T7%UgVM`y7fhbOze`BJGO$;u6iUo8hbLWyXjV5!wCCXX;^{HrfHzMeA zN+<46KM+cW)DIvL96(Xx|5r;m%kCF-YH09*u-US+Oyc|ryQxLs002Xn|JPG@v#>R`bNjDaRKv?@vmNnAFAqq?Q|Ur?UoKev3SRl`JcNX(%Q?nYlAQmr6LlDLaozy zp#P8sSut6%Q$a;6s9H>@7W6+Fqe^$=E>@dx6VN^w=3~)l&vZ)(jzbW!z z(>O9nA8GYL+jo|zsG6+c3-Pfhn$(M@QQe|>2;@qXH>Ae~cZHn+->OZ5yG3g@v9zEj zY9bDg45smLG+_%sc$UerbW6!X4nXwy_ppi;jhAb!6tnV0xkGs1JW7qKw#9QfOvPoKHo4`=7s{cVHOyLu<*HBJWjyW9S8io2Lt zsrMn2aa3X=BCG-bC}M`t#pDEhrqdCOtv@ecpuOH=9!!>L*(|F{gl>l|&7?2PNl-|g zz;#75oF(~`rncN=zfYjX-t0NC55`AAc-WyI^cg6aNuH)V1f&>}nEFJ(@rRVD!n6tpj50-u4+NGG(1Xwr9nmA&QoXyU1a~Cih05h+VkMf` z+c_@5%h=h?%G}CikiZYwWi}>}CJfpG#7zf;2rR2nJs?zaECiqIc}IRT@XkVx4HE z@lGyTR+p7SS1RakYG{3@BA;>S z#c~l90VE9=Z`e&aP3=uh5y{s3(5L=KqQr+?!Nmy@qP@dI9oZn4sdjk>`S+@{;#oUM zuRN_FqfIvAR2U!{xdDYP3a!gry|lkiAV81@;puU!z=nL zLVhL>Q;Cn`eb~|;mE%MM6vvP}@8J+3LL_Gibr6dr98-tdjE-yuOCiFBFMye4=uF_` z{Mk~n*OhPq{$#y1+wV$BslSOg#s^^}6PbmksJAK6J5Faon9BeqtF-9Et708D6pa@Js+E!5wvPd9mM zQ%-exzFa?Ib06MbUcN5q`bHMW>p0=!y?yfhe`#(OLubMb=)t2MzM68B!cOZnh)9wK z0YfvqSq$hzqaRqTlk{!-b{)yg*w*Us(pPk46>5|L|LIa%OiMiCEcWeK-ze3YjXG{Bx;U!iN%ZZ=ZkWWzDA^( z0r7?%vDeM|q*<00DYJ`rTDk|%Bd9_1X1AC3yJtYUwshYZqQh;T=R7^Zb_APG7w2kS zol>gCVHR5#MeGlTD+(f7bZ7DjK1JYj(fJ6LnJ~+Z|8;>)Kwj|p*;#TA58|y%CkNW$ z>Iz$gbi)fA%r1!9+XJ{3`l;>fq{p*=KS7>uU$Q_ZF8Zd`M~>Kxv6M-vuFVdlfy)aF z*`G_6b?Eo=gBN+48&UK;Lj&}mtCn>K4OZRX@MI0Pubt+!gtd;%j=P0}yH@{))hL|= zEoAE7Eu&=v*TQ7E8jRf@X@q{Dyc=4c`onlo@}x5SV>o)^xu}IJ?XQjShXL3+r?Ft*vE^?P zgA(&bZaOgaQNErJo~ac=>6)YnWaOT3@mcH5e6h2m@rR~l1xpY zhmk#+*c~248bhapmOA#6r&X@w?be_xHd}j>L`7e=$|Y^gL+*PA?lE24^qzJXaAGb# zGDmC|g2;#X$stoxrsal?2bd?*-cNtp*brbglUII6ZM{e|mbiq6HjU3T)rQNYLmY|B z1pS}&988a<65o zvucqTUY>q1!4dIwBJqaWa8{%?`&sh{U1uX5>1=9O*W+O8$AJzF^wIk zW()dmJT&#K<4h2p{0^GTr$`~Cv1Z}TN>T+zNx?L{S#3llw#}Cp+cg19!5#LkQDZb7aYr z{#LhG40YBlh+Ynaf_HW?QEC6SBOfe{x-=x(bQ@F7=~lcr2n!C^m#2evkKi+;y-m`FKXy_2`~mDKg&MsbwKGt26D6Kz>-RZK7-9>!z;H` zHo|4uEzjEE0pLtZjf0Ld+~LV4VE-elV=_TI`2P15HJcZQ=czvstfD8SC#7Ms-#SRdb5|O?Ihu_yQeD9DcS3Y+eo!)X z;vfdA=R0BPdB$*g)&~O~Oqz_k1{;IulBCXB2#gu0?ZB>65x}6C4=?U6`uzF`d1G$R z3B8>%NuqS6P%AM-I$CH{w9z6uXScpaE?>OJR=705D8{@7X)-`Yh@K{a=1&7~qc=V;(<-$r|3S9>mtwMP z?A;l3H=5&+!jxfa4J90Q%m5?c;$2yjY1Y|W07UD2JoGGv$oqH0Py}_iNvu= zLs)sR_E3D$Vo+^XCylbor*ssL79oZ=|JzR{Y#HrSP!xI0lkd(hhep4(uQ9f(d|VOT zp@q`}H}AvL9~%mb0!f>*~ zT{<9GB2!JvE&kna0FaJo-5qJRiWnIgx_3}1v+(yj1Sz!4^AmQ4Tduy51r$Q4fYazW z0c|O+WD~&DZP`!>N2t?X7NsHmDuq%fLEl~}NOTpQu~o*v;tTs?3h=>@zObBd=m+LI zcmCiVDQFqOB)NztS0-dw8!uJx@h6$(2UcXSnSW~X7FUurmiZxcoKC!s z=lmk&fl!4BqCU}6%+dDic}8uWe>V;BOOz-QGv@dP<4yilaN;z)LG%OvVjMz^4fLxo`Wn> zf;jcMG7bsO3M6FL{ol;-%>O-TvHPHK{v8{hCzs-Gk?sC<$nZQHPH_dE3+3w)8g46G zSvfgkqx5z_Xk?HyrP!_oA~@;C5F@hkYL21ehV-vVz#uhVMl@?mp<%Ck4iAjx5Wqfl zo;LnD7=GMo_?fE_XT(m8GRavrkh#CYtQ>FBTrP)|Y7}wo6ED(2fjnq1mD<3D-JTR7 zN1%@{7ZU&om&6_7W0!$8R70(GRtd~K;9I#}!HLp^DgC8Uf?J1)GK6#Fiyf6``YPCG z2wxjl@a3N(53*Y>{A= zk(k<+l+c7P4GKz|gdW5p@#f?u0Stw#A_f}G2*dq+-cRz!oEO($c(aWbR8zGRtIT`8 zH@u??`hKX(crh_CwM~rjhFLqiu-fA9OyFAnfez)RFz*q&QW4t+&idsFrA**lIx2`z zuY_YtWpF-u%VBikgwn``#j!K+3_b2i^fIWTzH@^~BubZUwd!Eu>nd4YaLYtH%UDaJ zR@SsPDXd#~9f&Oo)|TAE7ZQvXp%N9_N#ha`Xpv+XX;!LiSQ~@BPtV0EY)Ckyc!n^U z2-q$e&i|zj+XbH}Qj{RFgwiIR_u~v868vi$@5qXJ-aMD8NR1-cdxn!xypWn}Oq=2* zW->-qN^8*8Im}NjBIDh!TQZ(JKUu==&>@Ucz2=>ljo%u{9I3}WcogZmuTPnAxG^JH zGNEbVcm^iCf2gUJA$6e7sd3UNdS30QIW18m`{hH&2s)Rn+>e&*r0D%`I!9fq%Y?&t zUVq1w+8^_QU9Msg^0~0fAY&)+whihZrt}5}Jpv}E%a$u8D+(fXLMwu*;x?#+aczT0 zl&{Ob?@PB`pT~;}s7&j52~KGD8^<-X7lOnqIFss*k<2Ga!FA$nm}_P^E=@t(e+*>|=n#B^61V z4HTDRE|S7jJ3|l|-q#zJNV2Fg@B3N(MOv9n+B5Whh8q_s5vz1IYyR;m!s05=;mh-0 zTuBO-tnXV2!A&NxDM6imJrXz+Ua3;mQS~!6X~jPCqb7Nzw_t*YAR`<0KMne=HiY0a6Qwds-ONw+#^#6qC~ z5g= z99&{bYKvI-Bm|A0PXmJk|| zwz3CJO_?t_+fFsnBKWdc;A6lC3~O}EkM_kC3he>0oSjl5<(5%K1th#^koW+xyJLs5 z2({!POexB}EQLLxAxisgR+-xu(fhNo;UNhR5U$Cm!o0!6uti33wlsJS77f}E?#TC+ zfTzl$_J+mYgWGnyfBadGBgd8%=%HKIh{Dre++3GDJ#0lk8V!2Rkk`ZdJr4IXV+o#( zO;>X|!6qxDv@AD?5Rfd`YOId!hOx)ge9`@UK}2KjfvRrd@;FLApqQ{1OQ#vII77CV zT4&m!oRRzbdjh##OFP3uah8O@W5Dk6$-E8GU0vUgTklT`jdWE-WQ zOT{kZUeVWX1~IydCPtbh`Tm zLv0f#emT|sgUtyov_JAXS~Jmn^=ldyS>Sm3@mbTGVdR1*I2AJ$h5I4*=5;dQ!KbnJ zEOa#JFXTtV`F?^c9eA6!|Em-iu#=QG(|GcL2{-AO>|F@MPSyntKKdh4xp>R6E%z{S z{H?@1^T~XD&YrJY1jg%653~dQZM#28;#|Hrd3ycWv=E2@2C$z_`n`LUs|+%RgBlFS z>8Gpby1V*1iIXSi;1GLuc{i>A?~`&U?Z%y%+A|-437Z`=Vh|^jC$2Aj3ua@4h4EAT zNLA>%;sbfk>S!S`+qAV7q6a)5lmV`BrB2ARB2obVxolw%fd?{2k~x?}KBEBav<+TF zah9ls)duk%%IqK*D2U~`Wk|t+s`i73g28U&`*ew@7J?xZr}LD@f%D>X`fesoOqM>} zBvN*6-b_q}rHcJ>P8%h5!9i;~+by2?k_TB|)`OZO5j5y-?TlO$-rC9UmM@2h;)AQ{ zeyi=z!ai+7?$Pc`c}W5BNQcAeFO~1dlkr)iccpJ^Q#7APHnom9NR9&p67B}(7LcEV z)%9{yhg<(r&Xm*niQ{LI-%Us_!JU6B&vbj*X@>NHfMKwy&{jnxSCQZ% z+iq3;lNo)Di926Z^c6IoJD**2#^(^H2H|HXK+BI0@m$F{z1@(YP_olSk7o;^uWYm% z*2^1lP6YM*i1~gn-@A?BLDm7|>;`51_}esvTlxMYhI3ODRwPGw&AcVNSz2*D{ja6+ zK&WTZD&?4I#neg0ZT0rid1m_UD8gN1wS4wQe#6IHY~h{RvZq8m_9W?lp3vZ`ktCyj zPi7mxyLU-5ds#;ZR z714inXeOo(zfFw|oqud%^xX`9+gaL~|7=8<&M?9cFu(%lx=ZVr0)jb!h!4OC>PKX8 ztSC8Dvrrtp3KWuo>34&6Q*}jD+myKU$BEc| zp^kXnk9@x12HGhRK<8=wl7j+58)HI-Jf7fewR-D!Go_H*DW`;M6OlFhvJ=kJe?3cVTb4x*?ZbM8W#MNU!}N>G40 zf6)S%)ie34QiLT^YvhtpnK!SmjON*=*sKT83y=oTMd}lWa_0~;TnYiU(sbYEBFW?B zcOO|Y)$RY_KI%j(<5~9vbWX}2H-m=gmn(h@KK61{!buIfW`B}9boUFoAZDu0O;d`Y z!@qYcFQYG8ElRn?kXsi$UExjjC?g4NCDz(G7fVnY_DUcWK=*I; zn-Y{XR?unN&(ewio~irwaTl7m`=rhw1jR-enj}dZxkOZe-uFwqMbj=Ax6>=!oCHe6 zg(zwMUxZNF&1E!8sf|?^0&CJ@IxtV>hm7SfGdw8Ip%tzF^(A z%Tf8ImoL5gRnz89-go4PvlC?!Yg91KDMTKUlKRD-1q*q#;*fp#1v~BnPk|n(n-)A#fp8ul z@w>E=8eAc^|hi=8Q;;x4mle>QhMnE zH1afr6g6+t8s#g_CM`zV?|?{rZBJj{k!bGA2**udk{KHa)3PpC#=JCa>)hB0`=}6M zWE^^%U3Z&QvnsKc0g6i8Yj#`3Thy8F%0v8VMAk|7s{L?vh=2I*02J=|@-Gc)N6v5< zQ1)Ge;8Y0Z!ofeG=1Vj}96KY(H!!;(x>)~G*dcE5Aj4B*S9$haz@Od~`%t-}vsht;hAXO-~tTHkS;qNShJ85bMuzPKC| zQ&%|wZ6n4IN8GZBD;1`i%>Hc1%l>2|^3DgMU)(X@hFiOw~=8-f&j(v2I-FQM? zuYoWCot558b-@$IVvG83*X+O46X9#_Y=Sy=a=S;~x@Im((s}Du%9;sV4_%d=&TQ@J z@V_wnBJkkI@oPrV$2nv5y#`s@yXEN2564Mk(PeF zSJwh$(SVQj$Lnr@`8-n~VG*Vj_#wcC)Z0ujkyK#|DlMe26F0gCv`?%PPz8&B`_ZZ@27Ov773vtfO*T{xTS{pf;~v}t5>MC zvH6W%Lyc7|JwBRQgUQ0icuermLa`gF1kP;RCq+g}ffyIEBLzm~u}`Jd!s6hJBo5{|M&F-7tcl*NyY^56hs!jpAOJTu5 zZ?7mH1ER1bCX10#k44E$wUe3)z+V)SV_~ycasRdIallRAS&%)dad86GPNlO$ILpB_ zTUJ-4NWX;P_=@ITQetJpGvJm))SuLV}MJ(A3Kf5uzPOZrg znpO?g(IKVqP%ZKd$dl)0&Siw($^zCyPA>?xZ4PD3*$d}i+0xUGgQ!n>R&7=32Ttv6 zWwa&Os?wYEcwoF;-LhfHPkKXZu)n1HGPUyg0NRu05NO?{v)br0nA0ln*E7hmruvRjm=Svwkw zQ}Nykqs^BH+Xn6%>j~fFJDq-FGQUZGG9bWap9`C@;YD1tr(B$NufNfg$Oi_VS=ILkZ}Fu-IG8daiKZ| zhWYi7mw)rLgYYCk9!FF$fD|P|)r?^|yZ@A?dcIP~BRORQ?et*3rz=VzXV_@I8=s~X ze*cDp0&>0QevX6d6eJ+JNHd^?b2;W-Yp(+qpVh0hamBhJOJuv%{^)r^(HiE*JYo9E z?31j$@9BE!7nJ-TKH-9gzET`)gj}wRAg7}eiLf4*XZcoy9`hje9P{YH-)ft<;)VIg zxLd+JJKQOo@sk$;lW6d#8j)br=u~}*@6atYDp>L+?wKETQIp>K)KJKz!`<+AVmI?y zeZNc~Wsdy;CghTndYHsuf|?fC{iuWf(xfzB^33VpDTkI6+)!Z}QhFd;u+yn}#3yp> zdiaP|CTiTUH0=e2vSjtiX0VRBtlc{S>U287n6`@?P}kCurX=04A^S~A|9V!nQ=JmY z#zP-$%zrMfSR>oL-1<1@+30n{X#9{WorcJWq0yH`p^a$9xh%n9+o&FqA!h6M@gI-v`FM zt6YE&?N^C1G15?U1*HnlTTHy+>@$03~S?p2}C66dx8 z;XpE8=T^pQ@o1s zT*ZDlJ5`28E-z%%6uqZER+@jXWuU$Z8R0zX9=(W8bN)c~N&RgtRkQUnjCFQDP{nDV zx}g|fW1evIUulqUJC&aB2g#A}KtMSEg=V`ShXF$yOV9tU#(%!Z|8M-;PXS6}%b0CK zn*k;fnI}6BVvEIM3tjc&i^#R9WvWO(S-R8l-NP-F^mo-&__IG{%**F>>+bTs=LPv5 zImt}8T!U~~r`i%vHs%6m>YgjF~%6_m^yf+f@k`mM)t{7Lp@_LA117pTUS^(qR022&#${}_LsSj`!c_mN^KawyBCQ& z)l*S?y4qQN9S!UG#?+IWnp9igw=Ipf_v+>QE|gH2C_)iU=#c(!K>*4&)L@hF3V-45 zuRr?`2=6hkATo2vhLWCB5@?{6EXa`K&ZhMSPR3gmIoa9O?so|AqFJx`sHdXO)vcOb zkp$Dx;ZEU1eCenesrq7{nzx49=+F zRc@XSTW9+h7dKfhuku+xhy<(-g{%eM;-F`p$$LDt39IAco3@8j9znUFH1h^LE$E$z zq(EAetp!o5RPN=eh?s^%0&S$ufDqr!RsPsx8PNvVZoe6iIgR5LO(=)O>7H*E?}#Or zZmQyVc4|oXK^g+I)Tn@`wUu=h)G)2?p5Mnt*iHaaa`onhPhitGo?AKNMpEKLb?N0C z%u;3P#1?7dNyTw)Y3zxKle|7#rjEak2?#1Eqxu!2d^K%@9{qe$fE_wfm!{_jL zZ;*Yoj2>N%k9}#CY{XBgIjCSjos6*?+NF*ci1vvD{3chb;1xq1@p5Ssn?CpNNH$Ta z!y1ku7SpgESOuGyfvcn3TIpZ_Co6O8NKRh7?G0JffWwV2?t&!3IHQwFe?z3NGA+!8hG!`EX937u>b4kY8SOx;Ipm!IrWkv9dY#)r#DJJ$s*@g zV(A9cIh)-m>lWBPASiQ4Ad(&6&(r;&BYht(+^2!T zRt3ARXh3UC7M7h77;9!j^E;@a?|^Djxnubj#l@N)8~LG;6o;WwkuAjNI#pnM-BKS{ z_;m4i3LXf%4Y<3*{?1Ciz25n*y~^ZKL+bI8Dlgnr6LNE^mOqp#Hd)1_84d(E5vCiR zpNM=@iw2PQ5a#q>swnD6uf1E!kcI_U*ILl7A!bg)mzR~BPhM&urEM82B6WfV&3AsF zpFIpBx6*ONs;1kx!(4l=k+MI$$P&(+OP+doE_KqB_Zw(3gm3=UX(oJw%3J9f)g?C?m;$fOzV0h+Hs=EJib zmr1rJIZb!jNL*29ML0!-oyEiAWU{e79#{Qr_2v6E#zAWKBX#;u9Q^+2Hvc;gew#Y}FE^yr zZ*}w&2k+D(a!^HI{sD9_UK`5!*=SOj$npg;+gvTw+>_R-Awg`FRHxvW(rqLVNRr_utTH6JMSS{jzFfR2odpUA|$ zrY=@_D;IH*6L;o;{CEzlynNT{x!j!hnUL&{7D0(OF=nN0>l+ENXt(j!Q%0F-s}y*I zJBvq9^PBq86D}10Il6Kc3de)EjRaxC*|*9!!De#+F55dEZNJEBMd~Z1h_uON&A?M5 zF%%5!N6I_bBXqxf%;QE)hqQpPrCN}R2R4Hkp%hsoE+fqakh)6U2+espb=6}KJ)@o$ zLxk5#oPv9ZhG|GPXlngCZnEVvFKkh+(T$x*{Z~$Y^3PHx_~PFSBkKajv`Yh|s%pIe z|Ew{u^izmPYruzSLB;g0x&6?VOHrr5tWQYd5kTf?`ST^`?48t@EP3uGg z^%SnZ2rLlSnnYsK<3*B-4(?FicVDuEm54~m(@AuJ`!x>Qy?NZ2E}q_+lVh5cFx050 zhk};7ni@Kdi>Axm@tIQX;}{PZ1WGipuc+j4UfW&geECq4npgcvQpG4 zo~>NA8_hIpHEzAUitKO1>&Quc;qI+=;q$%gjOclV+fS8R^0v5y->IIv*c$iT4#0C+ z9T!*p6nPfhFc4n8qJraUiZF?t6By}Swo+x=!e~KBD(>9g;fT3-+FhPg*&b<#4_Yt8 z*fyE%Ccv)-Vv;sA7fa==jLt6V22qnA@~pmYVmRJVY(%DU1Df&!sJhN&8`eGw1oRn% zh9Y=@X3f9E75+US=qK%7hQob>mn6fpAedJ~ zg#qj~+ScGk|Jojq^cM@FiK;=Gg6Yqe`k$)5=1E~i;L*cv`MU;+1gzj3rmdtw5uukM zBRh$*)7_VnNxZ+M>*8&q&o~ z&uI$DKG{*N_CG+1sLWs}%HGyQ5cUP899>!F3PX^F2?4+4fkVoJNgPlCWI>ucc|dlR zd`cu7y*1DjYTP+~*O86Q2((3YB>0(yjf_{f06m#b&sc@KZDuh}letwDSj8y@v#*EUmmC8y&@e0CqdR_-;k}1iC09Tghl3MmlO`gJr5B;0DL2P4YF* z&ncZbq)g`v0cF+T@l(I3Yj4nOtHd;?3(s47V+?$PTqhKSGx1LtVl07NcPBq6yEI+_ z{4<{@kR90!MrI016P$PAsn&kHo8(KTTJLxGq5y+u-do?L}hWvAiApdd!X&Re0vUOV~X<{{I)wYPUBEZgL70z!Zx72%1Ypj z_*fPNSh86gAKtunvan_kO+?XL9xbfu^a=Pq2_SE(ri%(JtPLmb~npP-D|k)}ht%n}G+#Z3SELdZe*$ z+C!DN0t`WS0?)C(r|&<{oP@o^r71WXU>%@V92>{$#)3CgqNLTX>~Adb2DhtWc?HAT1^jMoUc#_a0Ql=jO_qr5W< z)(E<_!`jyu7Q~OkEdARxG=Gu%vHxn_ zUD^IS=PVlgeSfa&IBEFqC}Z$w8u6lx_L~;G6g{nR`m8P=wk9>ZluiySRvD8j;|Mm} zd(9EXiB_bSfpDwOI?1$Y$oC`u^EP!Yhq*=tv#pnBAdRmeL-EfO@K#j@0?6oP_GXh9 zF<~w>;%g!5mEhdF3aGDRbX=kN%GmYJ+!`J-aPR9FgGCfPby4pag%I9=2T+G#1p$fz z4`kwybB=68z5@HUj~G;=2IC3arWj*r-07Gfcj<7l$;UA9o~UDae0{5NOR#ne2yEEz z2FwR0Du*?|;4%$UJ?NeJzQ zH4XRW27V^ey1;&-S2s-=y6ZuKCda;4B4CtZZYTd9!i1+Y?hA7T4zrcXyoWs9JAEis zt)tfp=?VOcy@N+J(-TC(#BOq8;haYIJE}p^-4{AD+z918D@ZbXw7Qh=ax=4#DuE;% z*w57O0q?T}FKo79c7M@&e$4d*o=bn>W+9S^|Nii>+Vws7?Nnk>DiBbX%>Uu- zj9e^jO!RF{oeh6VpKcyouT8du-6v{=x1b`m1Jd>FYc;oPUA?aAn}s3yOP$U?s|Wza zyrEDc)WD{~7r%MeJo1_RU3eBm; z=weiVFiB0IYj4bGh;~Hj`XMB?k8J-DrLNkLDvfv!VB!#% ze7DnVzkanKw^Mi|A5;5JDTRkAhXL`(YU`Yswn``ukEFff5mH zU8iYO7qG}j0-db!=+PL4LuwE(S&TzvbAKbc7pJ$QK=H&0tT4$UD-OKc5LdX=tB_Es z5%0TMHoKPKHL&B{rUY3{I~BkL(7*xjQH$#AYq>YZTW5{gFc@4qj?sx0msLt*X}M5M z;5wpVWk9g-nY$)PWTlsrldCyypap!G6%vVK z#3iukfg-;;qOpcT*}~+tNEvEz+Za_=Y1~F{-!uJ5Ga_ioTkjw*lXHLZ*gr7}7HUONty@#DAaTB(WVBe$ z>X?wMLL0=Q0TAnszs2DKHvbaTKM={Po#5!)_>h-N(h+W<@IT;xF@^t;x43l%h?x|a zV16AUJL;suLFzXK>eqkQkfv8fPD+89O(#Ew1rb1k2dR{cYNg4Cu;dh?-7$RPgIPG=(=4fEU{w6 zI6a|XXv?U3fTlG8Uid^#V>PU8672ywa5yS`@{ z52|6lo>vQ(+V28N${R8MIyBlP{C@ER>RYQRoj$3d3&pHZS+}$$N#$9aP8wUvw z29xyzhi{eN68!_I-E-TnzreWaflF3T>z5uq&l_ zT5PFB99|;)BL-KJUqxp?mGRRaNa@wJHrkpB?@lmQCYba`T{gWIJuB)F~B#p(`FW zh{cQcZPzs&MHFidNVDr162qc05DAFOC9=BuG)lGiV?hyZ2Zv&Uii6=aZw(FyEW8*S zl=*r$YWyCltVm*hhW1_;6sN;VKOGzF9+@K&bcJS*ac%?#9jBgq^)$rs)d)xWvzLhm zbmgR5*eE(xf?y!muT&TdS`_*c%q)ut^zz1#3~Ai+sa4c|&OoSgco&lo#hU?{%nCvo z!YaCGei#SUh`?%!&4SbxS8B6l0X?7A1lgp4MHJ9S5}cgMu~*hF3v@{L5Z?v`YbsU@ zE~pLkuAj3U2x|aZJ7u!Sbic;zts3{m#s*!)NO|s!*}$A+7M{!~k)By+Jrl|Ya#a*) zr^a1P0)%kK5*n=Jh7)tL?{HZ|>=Bc(3pmY5LB>oyYr$&QXGvWQ9$}m$=L1@9KtS}9 zTQlw64$R)O81l$gWwW!vD1?-Zx=naae^@Q#BJi7@S6n^&a4R`MKK&Fi20{{Z!NffA z7zpJk+z;N*t(QM^RHg{{J@*Txn0Zw#a9wZNo4+&>&06njUJ#AE>dvvxQ*L zIXS2p93+e_gH0?HM3l8a1Ade?8$$lcBcA*Wx<$81w`_Vuu~&@$3rj@O>++nK>*4jx zOlaij_&78$@q}t83{@yoN)s!(W0EU(8pWygYz3JWb#Ga|lo5_M+3eEI$jvh*&>QfiGt@ZRT4fGyGQzB3$d>+KccU~9(Y{$)13LLuyKH#z+ z&q7Olb35f5+knU8<8@xY2RqDPe_nw2mZOH<1)LYfN`S%?sWdonWkEQcOqeucZY@_G zOOgy`DA-C)VTqAmM<*DUTUU`x#3B4s5<8#~P>no|Mu5&OOTgp<419)jJn{8Mtav$a zwoT`Ob7uG`GFrK~e&)nVkf@R1fs>SU$^fH2P~y}=S?1~=k#C^1 zwR*f!6}8T)aofA!s)@hKTEkXv9 zj^hkMusa>@UpvYDE_l4}Pj2uKu+VW@*;s+EfCf9JF)T%`^%~ih0QE!;fnV=S16e(4<8Af z`4~&o*k8~8JuD4##c0WaGq*`Y8J-grLEuBry#DOmfA=XLoY@mj(Tz4Zy89*bdvfD~Gq8Fc*%m@ERx5ML2iDG4mIGVstH}rrJ>@q>M6{osXpZblDLe5eAR7 zFzM3$cr&S$0D}WrMo%gfqhvFv*-Xzc5@K zu-q-Z!L#>$UQa%|myYdCYcAV2!kCxqQ&{!n=DbVg$y#jsQ&QVlLf!5yyKz3Umd0r5`8uXH(|n{J2EdKD zPkaRZyPz`WG{E;2yC7sYmfZ|J};eWxDE6HfsSzKf=y7ET*b-7%yh(2 zF6qPxy|_ft=(I#f?qzJ!)lKg3w5bwBSv0VZ`I1s@ZFnQ=ZKOCd8uDpAu_sLX&Byj? z_^ZISk7jen2PlRV@*zcmT$ii?s>I874M^--^>g(XZ9!mJGxOuObPi@`s71vtNc<8pjJl1&xL^LF*y z5J@s&!8?6CjHbhJ2hP{mTrm(V%GRTlTAUx8Goy@TPNG|eh$BMh7nBo+ugSDiS$%QmH@ZXiw<4-)@Y&t6FKt?5?e4I)`(4$+b-v53P4F|%^ri&Jx$aqb0x7N!F^ZVfHBtHSU?~X# z9ywI*7Kb|U2hu4=EA5vr5sXb_J z>!JgQBpdYzxCLqYo~TxC_EXsSYP)LLyY?m} z5PW%VONThRGU_EN~@Ex}mtdC-^E?^;h zAFv_I`W(=KOM=@3Pe=N)`1Dfo*K=2;ayO0O6-3E6NJ1e6JD+7QMg;Fk*A5j$$>+jF z-K!I2 z9$m)hmHP*p-QZr%uZqZYeGUT$t*B5W4@K+GmvvRE(!W=ED9OTbnW;=B)Jj(xP@qx> zv-OGshuQHs!WqcZ9Of&0GlZh-d~R?eS2oBIK&7x$TpnL1xGtpPCRA3Tf0pO2mjsyr z6VXhK9Zs6qG-T8RU0JWl$#!O6F$6$xm)c}iGQWM8)$>xp}9b@AMA?ql{kXNWF< zlYgMVVw=i0z2H=5JB*IMikN-Y@Cd65&D+~^OVg_Q{W^P}>z)CFf1huhHw1z7r*1Xa z6i^2;)s#rfp^~}!qq9C5p4y<^!kAAH!&@3&yvVQE>Ex9AHGKY!oS|cscL9QHqk$XQ zQ0;ChWfNzQ{kWfAl}Pf*piB<62N>M--CcFhmop2hG+{4(q`cUZWGzJ1KabocvpZEl zZlIRo3UUfohXZ>*yZVdjy?d?2deMpk+?$tz54&evl8GR{^ZPX`ON&xY5o% z*jY}a=)(Wn{kbOWA8kv(oo-25J^}q~IZ1)!J3!cT8An~AR+sEvG00-7hs*TO++p8I zcvue4wVkmBfr480btw=JaOp)USEUl{3tvS%zoy}E2T%nLG#AGc2tle?C?nkcg*bbx zD(lX6WdZk)9GrjE>)PLgQZob9$0F#yL8q?Q_y?I}eqi5GNZd(^Yt&##^8_!y*t8|T zm`anzbXt8Vp8JBD78ll#a=@rLmVsi-nw;zk+o@Bbv+YEDg4~bl`;g^U>-pxFj~Wdm zt!cLL`mB)omF?b*E(wtaakv{nUDS!y*%s8bA2Le`B?%7^JJwcyUU$v4-sRvkhrBIf zSSxw75U8rH%Gtt3cIQ*vVhI~-bBrp1#Xz}O==|+(9IeC|iC?Dag$LVbs+!zS_&=@* zcfPO!-vWb_pt`m#%2U#XI5S*{??*7H?e54K1$)~tow53Uwxb06wFOV{!BwOl? z@MXDHzIo8+ay8D*8-kq@J4tjM!8fFPJBsjMTkgAfB_%_3-4&7ip3_y*P8<4CoBik0 zjfISdJ&dPp^29ePQ=6#$Xo6nUK`xBtL7nE;57ti1B+9YFu`?X^!I0*JfDcJ z9m?kS!CQvlxQIhH=#(!FqcfHRJl@-{bD;Jz8g7Y&vk)=}wmP5BmDXIFomm~co=r{7 zqTTgty2f6-&aot6?CumUt#;e0TwhK$6NhZQTMCjHqMSpuKK07qS&z+BJPw82e#t}h zmAh0j^Lz$&gNUBNmAj$3RQ#Lvj;;LB9~lqxW)BxmX|_HLcuH}tm%Ns*#<6N09B(3n zda?usG_*N4GH2%ZTwdOGR0mi9{Z8&KWtX|OexI??Oa4B>YZ_bCXQ9HdsKpD?L^)DR zHqbDb>P{18x5Ln}(@lH)dKbm6L_6@&UV;-Aoc8n+ft^D&y+P+n)RJ-bD};Kgcbag~ zwFU(8%T#^ed>YhXmbVGmq5TWzawfGek1}4k=`$kRmUnqSa*MDj-8(+C8mqA54V%3+ z#hU~0QMhE`jC_mb+Rsmp9U7=Gd7ivitz@}#++BWIJ8R2XG(W$_i-~(Z=4ER^f7i#9 zesGA<)vloa^;YSu*~pQ*X64KF>LK4!^f7_iGLZW+tA+G~M5YM+yAYcUBou&BWM|gOgzp<&(%gA0RabiF}jw-#uCwEHSmj^8hR!9vGksVZ{3d>WQ z7!g`%rX4y^nNXv*WkA?XA@Tp9v-@MhS9#?Bj_lw}4dc381z6T#B$!j$iRvvsUPF2E zgLcGJTSMh${^b{siby5W^?h=XFwC!{dJ@yMJW39NAUB~$pfu3ojwH(rSLyXSI{5L_ z>hX2Cdps9s3F{Rq46@`0V0_jXp8ri4_EvEL2eg z*o)KjYt+Xxp|GkNd)8W58W##tFu=D9Bjm(YmISH1wK7J z=LO^WUnJRCe-;pV3c@8cixSgTqH(d{y@gN?A?NJ9yIuy)B~zb>IcxLQn6pdyE?sbL z5X1s$dIU|M1;c;0nsx~4o${I?@_M~}_|52b_wk6FVBn}+#|aDgsJsNl4)T$lPcx3j zBW~@jpC-w4zb*NjUX+Q<{g;bEuiiL7I74<_Vgx1$yGh5pv2DvY1@2l@$ccBO` zqg%|(<}+DN$64vjjmt0Bd(k+fcenbB9CrMr-<<8=pS3VwCo-SL@U7&B)0XdWQM*~L ze{TApR$OFvzvUKvb{lv6c7+jq^c%h=L08EB5nco#Xi{H4YxKT+E+cFuWoK)~Q54QF zALV*qziQTecHNaxxxWVeBoLc5i2S;(vQ`qqGl{)BH5y{`raKdrb?;)J7 z3;-dyzVdk+`!&)#ZdLgOrhISeTkop+EEE^s^M7uW@YYENdVS7=39YGpNnucrR(F(J zKKU&8+!`!T9+eD!x7Gv)d1kYp8Eowf(ah$huD{c^-SY1ie1G43!}zfl6$n7K!`TKh zJE-&=X&%$^s7PCs9f%d~?v-3HbINhjtg&ozHW&15^~)kuGlPA%6tiWZy#bENqhRhg zUaJz48ypRnw3u{z$jWRPSKrh<&)8B{O>pWgaV@E-3n|%Rwu0skwH7C+asAe};PW_P zmomWsHd8UUmW$j}a5}=DksZ&r=rVoH+}a~4jxB>$c>@0I^y|uT5HDKyRGqEGiLIc9 zmO2(L!0Kwh8>ifoEU7nP1L{6hDHIGq%v{1+(9;Antc6}sG*UvTplPnP-WqMHmKGY? z1@?ya9_BFIS*lS$`NPD={4uSC^R;)F%qr~1~o7ST}f;x~;cc|t+%vA?>PC0K#PHK+1|zBTT5 zZc4wH5HvIvBql1D14r`4?`YBcMEbNKT96?Y#XGaC#V(@sIc*vi>A&9{<^C4*=c^&j zgt?bIvAF!~$^@@JZU!`Jn4eTWWogmi$+#r~yO;{{eX@(uD>Kl+YeM70 zPU<&Bz-XhRA3?-Q?II!M=t%XZevlMXXTnTnHMPM-im*}s$pL3eU)!~d8{HUiJ)(LY zh>#DBAC!X!pOrL2U=mHwV;&aWuIAoSs{_F;b?eQACyS60? zUs|U9_~5(C;dLf9rZ_4ngyuR~x9g-PZvL5Q!#(ZXLVH$k%cmu?LHKCx`{p@)@OC37 zDVUpMJ*%>uOLZFIiO5RjnBo& z1sEYEy>wob7SmN2oY?<+B>;j4ws^FfQn4Oho&O&c6YBW?5;P!>Lg0d^$v`k>kI z!;rzBmR>n8$!J$WR0Q{NVtzq30h&V(=fGi>R+YRHO@s`^{<(;-`L6dn2NY8Y{%N5C zHH(hl(!>WIZZscMWvwM_ce>4ww4dxj#p|+GY4!iSI7w+yGhKM(r5K&_n}{Qu4Y|MH z>f!M(e29to%1#^LAXBll0U{h#^Y@pZ6aXFtZ&^LBUe_}at^Qlg|4n;3K3Dl+vxM5Y z>8xth$26rXCw}7TlnL}Ze*HJ4vXpIm60P_rWnMHx<17d&eTdn-7gHjL--TRGvsj;X z4OAvF#Tdli$<%ArY6YLB0#NIUKtD}(9msj>8TgWYzaU~2r+_InOAXMYX1}RKI4~R4 z=~f<@xrdML+%&IOKq%fG+YfDQ)Nf;<8BQ-^dL;7s7!hC2tqNkR;w!nh)U+CB3?yD0 zy^)ehB%`b+wB+GLYR{62rNEbq@lG>i;eFbIGu2^vN-h-~d7Ff8 znOG%06#;9GBaW9Yms(wtP|t`*IP-tU%xlaOohaol)rnYtf|{!6WbNFdoxPnKW{8W^ z7&CSCVqHJV|IP-@IzE41T4-HEOx!(-L*?z255a}d?ab|2O@ZmS7JKS&! z#Wl@ZwYL-~ZpDXtx5y|gy-IQLLX-{^(Mt9k74YuYHX>?=|xf z?z~!}*05u7At$RWK_N9#g}>XR%P&~}X!k1vCYSjb$MIZL)++GK-J+`nfyvgpYyrdGwCI-${48;Xqp*{eB(*9Vw4V=oQE)@ZbtR%L zM&}+uQ}@j2nOS0wtp#wg?+Wcw9Sg@}T%DU0Ah*>v5@Ii=%P4o&=+?5sqi7HH>;^hO zPD(5G=t5@eJi~{H^DnVg<>K*glaX3GUuld!GN5%6$tX!_fPQGHX0p^~t!4m$GX;Fw zfKS$({D|*cwG`+y^OlYsBY0pXcfW!33V9GAaE~K9^A9z{&`z}$P%cv+E^FFYVs}z! z_ZhMzQwKrIV=F<@_{7DhvJVMN$&ym{D9;47F>DZlrv`prN@0u5grbzTy#d&@hXGlv zTx!y!_aZH*c``ywLiw$Ub;p9Gf+y^6{#(aXgXq0!*jD2S@ev96$RyXhRt1L=_!rIr zK|suv!{5Yv=s^eD+cJz-#{0IgEWoxQ=BYp`Hn>=07GOBMpP);u)>>Mb3wE5VSct*W zeueO_{FtVH;*ByNo7ACLAJBm-sa4!}sM$kg=*V+`99ZfIISdl0{9tDem0t}y(HTCW z_ID&WuD(m)!nkpE?^_`oOH)V@raVP=#uXwag4Hcx#$b&s8zC#f4C1Yr5;V;J7w34e zn_MD7<*x#dO}>G0Q1^)d@>t%x7Ue1x28leKMB1v73zxCaIY`Df#nvW_m8w=&PWeRI z44crIXX~}?m2`?-4@tYSyR{h)>*cq!ZoRk+$>#C9&@8)J_DKYB<$bb$S5Ig%V~Og9 zLOCktwX>sOmEP=R8pTvzJ^?(tdi>Hk2!X~h+)Z2xuymkuKi|Hr&s*mNZ=awCrnt)IViY6QgM)*~!| zK17yfRdlSqGw3C}^~;9xd<>fBKvxYRFAz6)@5CVjr-NAEc;Mj$gFb&Aoe z`zknQfq)UD0)M(?LQkPvRG4)w3K-Y*4o5gh@}yXk?Y{GdQ+tm$?Vc~QAK%O1`p8g=ebDRz)c{eGp0`|2F<9qV2GZ%u~c#9r4jO9WAEK)ZE#VDGcjfNvj zIo&<@j2u@7zNpJcJeC2Xl5IbVJK=I4c?5bNCSL}`j0`lj?nqI?sfn?%pid_;wo60S z@A_`@UsQ3yXb%asTvW1U^EaiUtst{%&_!0&8NwCb=g2un91W|oREI_NBwp{Vd9Rf# z<7baUvOuX~R375zu@Se9JOMI;y8tam+>}9Kt6nGFNE^k9m0|(XPzy4oJQMOi_}p0M z2zOjq6M&;<1s8hVpo6`0)#qMFUZXW8x}$TKcYw|4%L$V;krf%OxPqk$%mH7I)ETl? z#$i^HT!rz3&qa@9oD5|#AaC}leoi2v8yX9!&lE^!7rqBH2`$+3{2ZC6Sf?&fX8l6; z-Xwz^_>%5pQQY`#>$NBXu{v}h&uzv_65%-PjgBpYC`1-9fwcV6Pxh%{0b7o-ckVXgerO zu&>~lsR{KU6%6sz=&UEJQ)B1k2RcjoVAT_EZ|{WA|Iqwk6?$Z8YX_Gz{os$v64?6ARL+~TkOBFVd$9MJ62}YvwuhzbyHhGENqMFZ)Bli5_ zM;@b~&0F^-#|pqND@xdd`j*7!Rg9rk(a?%KFY1?n4>Uvh(*l8CjXho0K;QodLqNR0 zI7@#|#i~x!Cv~Pkk6@3o`ey^galb(So{t6sJc#+DEQQ`^7DX=|U1lDcw_uBjrRN-f3>JuHG_P&6re2@4g*cvkFXMUlrQJ zI~l7%nRoa$)xrCl(Ej~S_|nN2R3O0p0HBoa$71WGNj`j_2X5EPHG#jIg6=M++QPuT zc|P;kkm*$mXl8-tVAGI;Z0E}DlZ(Mh5(BT}$TN8^Jh!>bzedYRX*PjV|11)?=tV4^ zn+@4WOl>|B)TB*X(QZtP7Gh$rDxX)IyH&YM`GSXM$3Rmp?SxPEH0f{fa;J71jTE9S zN`GI7YCwB0QRr`3YND`T7BX?QH+Rdac2}2_gJm|K0l8r{kmfVdU-{NS^Y^bt8Z?6G zTIbt@?-IV>jqgc|b}Bj&&1O!XrLrbMyGyPCT(R5Zpx&VE_*oL*!wme;PCpul-UW6T zP8c9y`w;UH>W5PenEJb9sy?$opB+kg5(Z45KTNz54V;A=(CPxy+yMp*-7^obca6d8 z&)IW;UDp=lHT8D9egQr0`+Np8C-(-VM!_!R_J$-QRX|fxz@}Yk(*@#%TM|-0ulq*V zPJWAT4tDn2V}WI=@8!5P_Eel+mWy|mz-`-pe8HK0`MOuK4EVV<4?j;-_DgWj*zNUk*o2;=yo@ zn|^X5HV_;x*_e^muBDA=#BpFow7CSW+C=xFGMcYJNuV>fewIY0f1%0g0Z?*Qx>eaK zaPn*zB@AiN!ZxE;Es(cqGvq6WjPf}84v`K}71iOaW^$1+)i~&sp z$Eb)_i%Fl_7IxzwJ)NV^bRT#L068g>1Ybn!Xw|xJa0=i^Cdc(xf~Vi$rA}b_x<8_W zKFZxkPoMNghEkckzn6LODdZUQ^?x+l*GEVHQtBvQKZP7ZM_&wn2dH5?>NqO~P|DiI zsi8B7d8mtBUxjPyQ(wY0a7qkJ1$@et0|>yW&mM-GxIGKf+78XOmMq^mMm%^(JlL`v zhDD`IwDp6l(QgZj2Lq8!kmOH~#P~Wj_#|X=M8qHbE(4TILGZ7)0(1x|2jtzsh|Ea0 zmyvWYBj#R4QSgwx>KP>={AK5(#)zVDHqoS0|b z|J`t=c<@-LLO7wbL(g&er0&I*^+W`{*lVvYma<}h&5C6-==mutkX}_FE9FsE$|7l5 z%VnQb(Q0C)4Lk*l5reM9!;|rjrl~UTE(b_7OC7 zo3UK4HV_sA&x01f0^%`%=&4TE86~z_e1d{r6a$ao^j*v&KJj-BU$OHQS|*u+d6vU} zp{hy@{uqX{mP6LgAhII5k~;V6gmT(hcZQzrgDab>QlIT+a{e6a$0|taWPOEml0CnH z*8!#=<^X-gAbR|x`bp(Rf0i>xJ`u(X$|X%seFbR@T%!Y;k)@LSqaMJz#lY`*@O6je ztesDSa!`YqNZ7TLsUPMKZ{@MAK=tfw4l9X{Yg-s^Wq_Rw4ioi^I#xYJP!UNVmH|hH2rXHDUU=waY*Zt9jmR-f3*db7&K<+;b<+kkdwbr(N%`11@rgm! z;UD9~Z|nha`>QPdJK_)LqWKhiPQ!W-zsM2>A}C{G z;00VSOeeLx(kb-3gTwfkmdoFfAJEx}k+;syp0}jw>R=mF9=qVnmIZ|I<+hG`16p}g zvOt;{+k(194G#Te)(NHVMNTDWqM3TZnBCToeIlsAR{XRut_HV{2&Kk!GRTp}s?do5 zsn0PG%;5o3X?Z>vNu@abshuDPuwBaG{B571gh^IiXym*^i5{(JHG=2p;B|E^2N2co z$oas;qkvW+P|wsPkmE*qOrlSqk>$GJd3ua!Qn99Bx2Yi_?nL3pHVVfgYPhY#&HN&4SHNdtkcXW(05_UoqT`9 zD&^^v>5qWPBfhpU9_3MZeh!Ar!Z;=xe-4(^sS%(_j(4|C*vvaR){hxDqnzRf-XCdP zLKt=cN4!sBa*FMo!upzPHjQG3YZRt|2bdnZk~K(YR=b=wjUgS9FY3dI#*|7hyfqC! zOE(hM@SiVrdunM5Ftrkyqg=A9&oTyyk@vTx85uQObCyI8gj^R3J1P^1q26Pe)xAtm z??Vfkywzf#BY8C@yM$dk40D{(`HR*-dYaSecuVdpWK4K67M;Zu){d(bRy2K4OED*< zBJ9^XtX`3F0A&d%z7oZRVX@mO-TDGjOUlr@>c(i^ZbR~=Fq*YHMH-{OSoQ8hsu4D7 z7e3p?u9&K`fk~dAG2<@8q}SuO(sf@mn_pul2stqFF%-f=>4vY9nFVl?^(S5)TkG-9 z(c$P#dI`z_R9T!(Z)r_1yyaiW-ciHGzBDa_4{m>2$khir_Gx&jbXU@CMF}k{&$6>b z$*S#rdIXQ^KKfN35(jg0b@JY5zQU|G4cLzLfIET7F#xMe7;c-BxJrntH39KhUjkRu z7o0Rs+lvpBMmZ>g8EufM+fMX+2<`m`maMK2Np-xj!S?0~ zns!0cj<)ak{01i%o#o^vUGL-`f&Z_={}b?kJfv3?g1LB)&yAku1E4!?n%W!>xt?)r zxlZu(5-ybA>9>MmET^Fp;ph|txSF>Mty{Hd2V6s~IG#l3bU1lV5ws3xYNonL=x`Qr z9nP7V9nNdvwYbAM7uN?hb#)(P zfJ2*8$WW)Ni^<~(#D{*Cn(*1Yq`E6)V#c;=P*M>gYiI|<=!Q`kDXRpoWmQ2-5+!9- zF_*+?jPYH^p{7%stIJ-B`8PisO(X0{d7z66YFoZXT-`(fJ3;a)mxiR8HX}&DUAqN2 zt47N$(Wj+Kh}=awZ~^GksgY09jC1w%F38BKY0#OKyze=1OG1?u@c1E|d%Y@fh%l(FIR13b<1A{*>hO3(hdx`W+qeWO~4mSlvua zt-1`uQ>#YeG>=+~+vNs#de~WFe_o<&SDUG9$&teig z=No+rAvk+jtEnO8NIu2vg=hc#&9J}2yp1*6pNg?t=mNVvdxYJBhuQ5nVRri+ismy< zFo7m6K2*(jvYHH_8590!2n{f@D6U&ooeZf7JQwa{$Rg{43Wg^wcR5hc&yh1)?mZZ8 z!4QY;bL$Z)Cg@zjpF(?Xf$s2O30m&rE;a*Ng&kZSN9mqLQM&ax&>|!ny*4kg-cql1 zLH7T^?DakWot*Fh;)46hzj+48DUB;rF5TGlRjBH3%B3+IbNt!Mf#&?1=f@)PQ!7yD zbLt#NCWU82l(10WPM?{`CW+GaJ1u2gJEXN!HJMbQCz%qn3iKnKcBvL>RDnK*6H26) zzKUMw9O&oc$B+9?-0tL7Yek9J8MC^!z#M}Ag z#X_#$)o4iphgJ8kRIG?c#ezpA3we(gKo>xzhG2NJbL&Flijgx=tNd0=Gbru? zl2|huYxUusD$|m|T_RZ~ z_zg?7TufIE3#8gaJLj;qZToVQG}fn6eDsdh)g8R9mgBA7?pV$Esp=K~28So_Y_k?1rgceeodl zIIbBu^h6`51=5R?RmVtYi&z5*VFVS!Et;5myJ#@8YA=od;N@)Ok(I}Vuc{-6#O!|B2 zd$-~|qpKT3@Vsss!`INwBut>TdRro4h+l;4Htg2Vb zU5Pq|o)|=*s*e5wQrrDz-wwoPQ5>h*)%tF~f<=QtRV>W24&K*-55cxEP zMS>VR?0HfJ;rg8>MH1cAUz&)VF>0=EMYC+4#lQ%kriVLJK(#DIo0~?z!O4F;pd>$S zVf2?*N4BIgtPJ$_l;L$956&NwN)tKK@}bdouH{mS?0i8$d({roTubH`#$W`WUF-JJ z2QESBZu)}?wm{+NltsuF2tOh!UEipcrf9md#AH?8&>A75vWACoyMeT?7_~$c?3XjV z6g5{}^ky&Jtm(7bsW^~L#kpE1RBQ3lcnn?TL8zy0;7r}5aAI=TZ}Gi^0 zYV&z$Oa(Ru3@?mZ>T$ed9-<2!q_lXDnkXEPk|-T*wC&NFi5m5z9O23Oh)eT9>g^0Nib^0 zDO-4hlwGTxuB9h{8I)^*xjKYxL%v+F+s-q{Mz+eAfsnG%t(_kE{%OOCVM{}s`#J(A z<846j&S2j(T*AIt2%Td)XP=CsBInUPFx2^{(3HI7GEK|JNFCsa&|HSFeTu}B&get_ zJeq;)8zkl!ltubF@IfbMV)M|^8h<9O<8wm^zx^U@zrWp-XwB8NL-uS2C#C5y1neDXV>`1Wc)*Y};}9C@Nnay=8IB5x zK-V2>#I2CBb)gwAR=mu?ixV$yysW~@y3lJlKeI?aL7*fU%Jr}ZEY>CboWyLG3ok35 ziFkuCqXY~Ma#HzdtGcYuaZDOpc&x@v*Q0R_!?;Tz%ld++B$v@;E<6N=hAm8*W2Cz8 z;(y@M{Y?XZRXU;IUQ7mzdoj5e`jsp*8;=y8SnB6$=oVHMc0~dm;DNk;;DOcs@BxOF zHR7yDr>mR!S~GCXjU!ws47gz_vve}vjJ9xl!tlpM#o>jvZn_4FNCsBq*}@($+ErH{ z;OTj0IXO~<`)%CMK67v3Noi`$v$nAKYy4VI)nymd>RuK;4oS-(Pi)12D-N%`ltWi) zY+@}Hszg1y;%GblIVA1ExHZ5;52awEfbCqZHn{Y;k*Yz~tN6}7BFY;3a4(@OVeRI$bJ#8xx4W?`FXq+ zJ%`uQXW+VKd+rf-%YK#JCO^$?sZX-o%pL4@<94_`^F(TRI=b52u08C|@7fRd5O|Y^ z@jciD14U;l2hZrP?Zl6}_Dn0|I#YMUH3NOL)EB4W*Mz&NGUsh)fIXfc_StsD00@S< zyFvWxFf;?*H{YLGunIbFN+|+xKoSEjL>OPj)!y6D_8Xsv_DjNcZ5XLEj+F#Z!twaG-pLZ zTg<=x?QdVfp^gR0=NG>98fI*>7+THFyXAq<88-LUtUK3J0iYp zbR5|@zA)l+hn~#F?|$o2>U)PNq4G9kc_1vG0a|V_g@SR&0=2oJW(0JzK#YklsO+2v z(jgV}b?xxyTFB&~m+wIKsz?CDM+2}G6$bPU11dnOZFgZc{Skwd)3P{ivbk-0Di#|Z zgZ5D_CRs5F3ToY+hUAJ09Rc>hVN(xAy*d>;gWXWhuh^>Y_3W8Eh1XCZ2R|E6gzmK} zgA+HJS{CO(Ehk$JS)-zIdE&+#Ot3=2=hjwp)Y!psWsbL-4&l5VI`(&;LB}4Haxp69 zw|ikQd^!_-ik&RVZs9s(9e3&9LS~@2hhX=RSqDk z-0di0p?bH0GjR<#A?tL*U({_PDcwtda1pI;1X36J2!n=f0J?T$5|HBd&*%?{+zl1% z?;o}|K;d|xdr;#%{~ovwlaChw_YDonQ#w=e5$UGoZi0e}>*JCup<1FP%Fs9R*wG*o zfJDzJLvak<>m^QpEQa{3)!7B;RDaDPPO`mPk=r_1PvCe=YY(4CGH7;@O>jVMb%qR!G zE^h8{QD8tO7no$jZ6hdaq4Iq2##&E7g{SVod8kKub-l^HjEaxPpo*5}FQCY`aSB5I zvMncYR19DgvG{T&2+Pr)|HEBTOxYsDhC{#EmLurPEj@X9J!3wCXYymUyB=no+>H5t z?|^mbPgBcHp>lIbeFn<8cMZ9vY>hgn%;~&SzDO?8_i(LuAFx8pV&i1q>4Qo^eCV5$`CeC5S)wTOQf8qW6_l?H>n;WYE;(?36-U5sz*^%MR(hau#d&y@*y^R zI6QZK=Q~UYEWYI^1jqgcU#q(``b0Vk0(eanl`?7cL4Q*jC*Q!ZEa$~QEp`L$Y@&~S zi865}cuovdLgFi}IOcEkk->|T$dsSKgR{GRFq7E82k&yOlMQ6FDZWI{I2uRK2k31>SA}( zuI>V~TENm(VyVsMHDqzQd5vmvoq%L#l(H|S$NkPzx*O!H{(C8Zgc*rIa)*}wfAML9YXJwofYK|Pm; zN|=kLUO=-Mr))8Ptc$~7s>dL$T`7I3kVV=0zoA|hu$PJn1~xE^_RAlC6_da&YnQ%X zS~VF8_mRh6!l3bXsllEn-%B3fufI)zH}F;lzX0@J#$41<#sX#^-*W}P`y&AFI1xa5 z8Ox)GM$-3v!MwA_!+ORF$mk@GABMLZkwx9~rvN}6KMv2#G%xIQQ-vj+NW96cFw9T= zUohJybnwr}A?c;9`Ot_7_NNgm8T{!#%?BNFJ1u8*hPJpnT>=IrY}*>!0bC)CA?biZ z7N7uqF$IC_jd8HS7V;y>>6i?byH+j8on9IPcCTw3j+p{N79q>kf;87^?~)&2bJ1RN z&eRb`z?Z`+GnzX0r`;`dC}J4(zloFxKYNTuffKHZkDdcv>HDH}v3uYod?! zCL}&oxt5e-)I5EV%~*F|A#V`?ZDx8&?oLc9X+;5mCPgi%Q{II(OxxKqNe?}n;MPBC z?`kLDgFsqv%SH6MgVM)N&YKL6mb1L{p;P)iRGx43$D<>q1r{j{x)GcPboM#=gOQ1X z|7TUl|A(qCo=jG~>XY*{pz`KY}1Z=RS>{`}k*?b`|=-26GX8=q6BA zos}zh^f)=3``KcF78K~jB$Kg4+G+K1q&{n<24g9_BT3XP>pC7sSE{_@@w+fwqO;P6 zDijp!Lti9#f(l>&Q#2}`fevU<_N{|>Y}_WA#-8? zM^RmX-Ka&xz@Ly=Uq6A1#h9Ir8^lKhV3<-PduQb_u}5O+a?S9iA75qzE~|{b*uy4& z9`G%%LDpsklnydh-IY`eRY~qX{mC$Q&%KhnGY6C0Jqfw{v%#ym8z-02>5m7|Pe^*i zxQ2)!$<>q|Jq9J$3!!oYv%xls#6|VpNa8+zc~n;Gg-Ej?pi=+}kFB-4>B4b|Dekdt zF2SGD>Wa12U+QpO#*L`9qpkI^4%a2F3`+7Fv~?D39giD5YeKG=JA`RqF5HG*s}(n; z6ubJ+0qR8u$QF)T#C@*#440{;xsT1)^rBNWysro&$Gvo87mh$CQfaE&{g^y~7Jr1s z98MjxWsW0S&&|-3-A*Z+PG+B`;~4cZcyqfA(s;Fj-)$BHKR~u$A}C!$YK~fog(+QM zDo0Y_86ed9_zNr)em4DCdm?aNGEvf=44TizS)&(3eaiu`^FfTXAE-2;*HNoShT;aY z`JpOA7P8DtsI{$HXceO4L8I1&Tmq}^d&AY) zo8wYOf=*E(*{6*w8j>`w0e@4#wGI|DB<12G#m2tj%ppe2NHE!C^I1-1)F}8jkjT*g(Xo{`h=LR@W zEj8bE6{#;I939KhG9C@ zpSQfBUAdOSZT4UwQ5>cp0P@rD5q%8+>xvEOw$as#PTK&mo&M@ba;hI;_W=OLAq||V zt3p4)yT7Z?$sNQ?Er~fg){7)PvGcBzcMLUs#dNH9KSe0|zd+U6w9r0hKI`RV%1VrpZN+Sh)R(qXiA_>fdE%3Y$f5dC+vATXm(563 ziSdZIugv1{iu)c;vz@99RS0>({tc5zvx!uh9G99h$a2AW)-l+Wd5037<#@M=GOAxu zoL-)P$R`YdEGmnj!Y3bY>!LTX>2&mbmH}QjvaMeF z7q`9;1YaD)SrDO92TmwmhU5y&sF)Z%Xhh#JWw4!M>o=_Fqr$ap;cw>vqiq)8O>56X zk6V$;otvPx@r)@>MANSf_@X~60hw6`uq_Cdv@bS+*_8ZSBC zYcBZiQ4`s+Qdw;m-~;PfA&^kc=&W3g0v~NC-I09X zhVM&Cf0TR=;QRd2pCsSe(FQk_hLZ1(;ro=*Cz9`v<9kl&kMTVn-rLZk+OXO$Xs7Gc zEvuvH*vJ~~G;zi1)XG&bBCTjljzbtSR}AFdRe~2MUMgmljXJ7=WFxV?b~i7HtGQ*wk563HWO<5lj%;R#XPiI?aqZR1LEn(Z_sy-J5b z(xUg0c7=*ki9*w)!YXjKe|R=I?UWp+ENAsW=06W2dOPtF9e)tpyb~|c%!AnKop?zs zUApP`uh9PKs45d8ghO|!eY(L?CyLZ2p#@r8qelnITKQk6ko zoPIC8ZwfaQo!qwXurwQ^+Iyb4+=SenWs9bzC9yN%Qh>F^60RXsoKWX9&K4yU34N)mNcKis2vH{)b9B!b^-f#C1PWU zD~VMaah*^XuC|5gg)>QYj2yA}3KrP4{L0sr?A34f`LJ`pcP6RwO>8Igb1-;<){owt zSo#GL+K!e^VEQ9MA}Iaan!E5FoEJg&1g}~KZoC4SRU@@)MfgHDf2mIzh-{LeF0r^< z-_G=Ql5e?f#VpG024$1kC>Ic?rPP}GlZjGp=`_6MlupN6dMW4pxj{~)<;--)a|L`q zY;-2p=4|2NnaWgJ1#Xs?6ycs#7*X&56=cunpd(63CBs55RWPI&PwZ+-3xws*{rtjO z+Hw}zxvowv#T~2Q{k@@=;ECShrAsjk?M!*g{L(t<7Qewmm!4%a$~cHE@p{~J^G)Bf zxTdp}FAI!e#)~*J|BA-SqehT1WhOpy%5~s*JwH61S_je&a*6fRzn~n<%wtesn0D(r zmQO>Ee^&O0=mPfgV7kEv>{V@g*5@T4nU&lIX|m1J1ItJ+2ve`VJy! z)(p0D<+h{Il*+P}`75PMi0!rg5d)ZNxFl@~RT^4~r^9&A8_l+bZRemFcwC+yF3xnsRQt@Ee4Zt&~{X@Nx*==diJiT#R z`bbNo*>rpY#0VeY(=tl4|HL$zKk;OIBW z0;+c5o@T=NkJ|DaYwtW6zT>>9@a=qL-j3kH=Hk z={Xs5x@$ci)zzoHtGZ%9m7Cr4g?E@)ibudq^MHRI1H-uwpm6d5Ral(ve-|NO*shP) zYPm0>+t40esl-ww9vbkNmb;tHJUT9l0Spl;o+4#pfW;tQ`U^XpZm5gi@eUJwK-c8e za-WABEOH3y^VZTA^dk-uA24z=Nj4NP(B8nCKHR$G)^hjbYzamy;W1aJa6GlIE&0^>r$6CQ#EwoWJJ>E|44l}7kqFUMUhGFL_c+!m$8B;<%RPcx zu2-MQ!24l#$Fozk+%Uqq`fRRVTd!k4PCs}zlpM_pUX;^GN2JS~)vL15=z(|DBCMdH zam9#Lfq}{*61dXbP^&<#<=wu==EP73HCp6J_W`Jid z9;`6%N|&>tzFlwe5rgfhJ#`aMMju#)?dQb>{6K`A;#AOPP$Ia_xkOKpzhs9HC*rS? z=Pw%AkxhvMo0Lf6xF$-<;*j&!K(|!z0z0s2+zV(}Nh#4cLuGhM9$y$~50woKKYcU& z6i+-2uW;jxitQYjtY*hW+2R=7VAfBBNm28FnVAR3-i?Z&VK9ugb;Bguc>*JlhR*_W zpGd?XMZLI5uez76-_OFS?aM7<@EIs$4RKjsK{s@bBeLN(kX;dK%BuBvY4INB#Zl=5 z_QwrK><8hIaQecyzNpT)5OUq>7~D9UF2dTU57&O`ZB{$Li-AWpT?MRK_f60DFoY;g z$3Cr-$uonQISOVXuJ2ZxYCN@Gzadm@sqv`wCT$(B<)W-YMvJ}PBnBJwxPQkR(gD>F zeI=??_Le~x?cc+;$~JPSJ6jK>dRup>Ex=YYYzm$VP8hV&z(1MkL@ z(S`855>oIOHGnzUbMoBD&rhDoIx6=KTqL~!WdVqa0`tJ9#*Hy?-H@@Q z5I#)0r@&%62TuY#nFih;IHSDJkz?dEIg9l)95Qpt%oYsgXXlT4YoRX0%z~#fE?erZ zsqtAK9NsgLJjoM^TdmGy5>Qbv2izloo^6{*)|r%{A@C3HDVVEV9s-^B_YF6N=57eB z{DYZfsZ}QBQJ#~JvnT^nF3^-)IF6laiZ2#;iN3V@2_|OB;k-r+m_>Ok<8hgeh3H8( zb^>FSU^_y8y;lPY`|`APzz=3^orTWV!wc&f3^YSc*^iRjz6^>H$o1O8`P##I+QYMG zZUPW2wq@R05BVI2b=xVNP}5GXVA1uTldnj`Z=j8HQ2)T!qwrnRK4pudwRmcauM_A} zLw{Doam){2M%ESxOKUW#z(V&V4tO~vaDJ1o6>Z&ZZ=$W+jdSphA{K`_-Otm*e@?6o z07GV78HSpi^9a3(3w=C&?exg{85E)nb%{Sf@7_~ON>{T8Fx2!IGQ17fo~F>Zqsf`2 z>V3$6J5l$;peW}A`z0Q90Y=@qqxrZUE6YngiCEq7V4fN(^|;xQnEm%KofqX^ikT3^-j(A!v8 zyQ>T1Z-0pvfKKs6Xc*_ECk^9NjBzgV($6w<%EO>{9Vw4jfrFYtI`EjSZaNS2yoY{@ z>us(s$Zbkt%!wxqRl&fPX6vt1Wz%q!G0xhJga_+oTCXni(-|B_fppQ=^u1`w9>0m% zrd^zT%cw5ELOml}C;rU#*+s_!ae!#h=-nq7TQqkEH8J=aTHks!@@y~VFS6bdgQxId znmxzB?`-ap*N$wsXgr1lON%yQUK~m26FQLO(>p5qFvH~A2!My}O)$b-Fa5>ebvBp^ zy|Lj zUA9xpF(}-;KA-*#z!FELVbN4RnjHAc#Q&-`g97^sk0{Jyr*q-1LUINVyrZFSbZ-j$ zD2wBR_2$Bhz}&{adg$`s=|RbzBXI`cUIV-ATnm@)9<>;cM8}Y2LZREV?J}Oc-;|+* zEnw%*a`!R>#4+5QC@T zgC~@K3mK;_>m%N{x-3SP^}+Dgf5;$9k<0v@%H;(cjQ$1plDl}vU4ncEE^oCcm#yn3 zl4GZ%p~Wfu!0Bl#_g4&M$TI+eX%nOQp*y>VzdW-a<4)jX8h)(fNxg}91hRrB)p28W zpL#Ek9u-`d3aUo{v~VS3RIT+f3ei+@e{-MVV;#DkVQNm3CKz$iv)Fv07Q-&(Z6i&0}spbequ4Fx;JDxN$LPv!1W=3 zUIJGEu8t*wys8a|(poJJMOxtji8!;RS>)s#a*UDnbQCJhn8=nNx?9^U`R-aiio7~UCRmBrOGwPH>j%qmR~gBNkU+{}z`eFBJNZ^livMX%yADsI<_ zd?*^LOn*Y#!BYbc3j5BoB+AZk3+$CR&H6{>`PRc+vRp_Vsw&qXtIRErlyh>1vWg#K zDas~6lOI62h2imCmIR~Zm0Pe9Y>wZ6%}Flud*PAL;xQL$LRFR;H~m{7GcIw5JOg#4 zBJ2iU`JP~5(y>co`;3KMn68#0ifn#x=O%ap?+r86g74NV&sDD5Es*xnar`D-o1yDruEiCI_X=x3qfLl>E|OzcX|z6acN~VPMUJmRo9%Hj zRjoFI|117*8GP+;2Q`Nqu8n8G1b@Q8_Oiw!mw3>DG3C;N4Qc)bbvRw#$U7PZxm?$8 zm#pirK{<}?l`Un{6=EAoO)p4AU z5r6m_6vXB@ZmH4uyF-g_i7OgYca5aJFO)y1)|){=V*YxwS|_M?@u*Sm65#5n6Xe>q z#p$3$#-SET=M~MmKEI`T9BPrbM{AK##f}Q{cGSwgnL~G9r91)*X-H1WxtUFE#X}Xh z##KRGY>0z?TZR))>K$>l;?`JC3EDg1o??s#4&mB4=<@5KP?oR(CG8&)8wM1h z_eQ2{HwsWH>RZ`tl;f(7&v1p+eIe6Vsv@xrjwU+jr#b=Fj<$3BCE@+8r6!tINRbk!r+#jOaW92ppuNKs9}`I z1m(kC7@&bWJ&S+`y|v9*%3Ip$FO=$-7R?5>Q;uo2{?ni1FrCfx-dV58uPiBj`M~_3tjTY9QrirC5_bQ71Db%gw|LDo42tb`ROkC`2~zsF+cW z_`EG&&jOQl!c|oedlJta%@rp+qC#32!K$XU3cQGH?BU3|h&h(SF9 z`Bz?jgog^rzoKFg10iNMBsud=K?Q&s1W;>)1YQj~XJ!pWfGd$Xn`g8%XK`{CV?B_X zFEbpYm^7ZTxwQg~1^~$(VbF|6(dG)h+L~ZcW)z+NBI9;YWWl3SmYS(99)m&;x=`*l zo8y5Kr8q+m&%%(6KfHHVe@qoS_aYT!n@CZc7goT02`)>f)?xjC{PWR`$Y*l)+Z_GA?yu*&s?0#<8E#BXK z4K%FyhS6Jzh|A=)^{c_TpWw+G#q2rjMbFq%VWTvgR?Uu9MGltVo%dT0zD!mH09-9J%3+Zi6;{ap9z0?&dllC=Jc zbiPFl?7)o&QJi^quC*PtS6M>Ae850_GU6s_+T3(CWc>v9l656EjjRHAfMcnW5I83W z+_+&W_dME#&oXMU0&HP5Sc3F&nZ?KNNX3IhDn7vzw6J{v@GZZC8@jRxYqc%haw!wn zMuJ!@0ir0Iia9B_%{{kuSzl}Q*Ld=cKLt-firyt2jJWB07j(~Y9tmNcg>M+E&7i9t zN5sc}gQiwWDCqnI&mW^Dv-F=Di6u_ME7uqz(Mf)TM+XAeeiTfI*OzepsiEq=8owbF zLYNx2wila~$gR&J>Hz{PA%mX_vDUi1h$9JNqX-A&(*t{uaM$Dcb}TaqAtMtThaB=D53 z_h&D6tL!_C6^sUUFg%JG9&^|U9A-PKPkihWIMhAYVQhL%+c+Jj^&W99$x$oB;+`BM z@)xoIurl!HYsjp+6ta#0jtk;KOoF?rfxE0m{9O>8lSl}YmET}hTp{C)P_PQFj%xFI zJ9(;vVT9MVv1KinGi9@mUk8`%)VsFToOsxFfc5k^j%zwZ&gi8Sp21$3jlJU0Q*5V%Wz6fDpO>?x1+vl+~thA7|!~rt#815wR!EHafV1USr!IL-*gH5VV8Qr7`)})eu z)TB!C6#J_8rMPcwS=kx|nl)Zw%}ViSuUMnzIh_itJ|%Hmqne%0ZH#Azuzh>~`S$&b z;oI%I*N|lGQSDoR?Ze+XWDVMkAm45X%4yXlO>4lml;~}NMi}&R54E!u1 zWURTQy|BX_3KU`He7VV@ zgJq7gpB@V3vlTeftDj3ovc!XnZ{d{>4bp3FYA?`_9wEm5iaESN8b7l3a#JjE6nA%Y zJdN)irVP(2Mcd-)Npc^2VLv;h6tFWv%swH8@&6-j8%O`JcXXTn1KV`Y(LUU!Yv_-M z0oVj1y(ZC^6MADxu5645jmcq+>2TAvGxWnXNP2%o8Z_n>#HDLG3k%KdPHb68a09f; zsMdGe>$|0i^p?GBo24pH%Lsb^pn*Twn`q##XAB=dqwjyk-~Gs^@9r6%7G=gn!=B`{ zs2?XK9T(+m=zm`YGf#(!rrKqp3E5~q3pwwl-e(Z0zEGuRuM?#FD!WVAm?^$&?ytz4 z%*(y_8%NOY!mpN)j?s&N!?x$}VM)uh(Z}C|--RIwV7B3p#o%(L8Grr)2K=7SK(8dv zPnbe8_FS=g`Qtw%PfrM=9)i4l>y+qGwj??zPidV(&-~$v4Eoxhr3ZfrjjeZHpvo^2 z>z#s}3-VU0VVL@^O#O#g@VBazW{ZYic!w;uiLHWj;k-Absdvg3qt^_-3U^AWTD3*~ z0#Puw<~bdw#UL&L7Ei^K%Pj`ED71-%WDhk>3Arw~i7PI?%(>~D*Ak(%f>s^3%klLe z;SbKlcY|}@&goUl_u}t8#S9zfg*K-Rsm&HBW13!ug_UvP;7A!3yKI3nTqg2%VYLPK zlk=@pqkQYiG_ANkhQa!MxOnP!FK53o0|eUl-&d^2I{!PdB0B<1I-;w|k;1o>ODUVH zLz@yPOc{;BgWpC0nqk>(kn&rn(tDsxa>Reba@Bz4PQc(0+-{vSx|S<`VaA2Qq+=B- zY%BiDUpNl8BW?mVANhe4%cw2ZUR(qJ%04-O9#FBzgR%3z)t@`{9}@IvxxI>A$ISQBjA8L-q5#x z54cQNwRF9`K3@#5t+Cbl;uHUlu?liNNY3b-Jv;FG8(Un7)&i^(fxsiKgj@AfN{u$Hslt z74zy_s39-?FFmTLuBVQ5O`lrdi#n0@jzx6|S9BHoX)7yR@4JBej?o94hJEa^ih*-X z^<$I)5EJ{2&bPAVKA<_Y;LoIpGJ*oN-AS^r;2x;7R=Ba>8lWg1W= z?iiH*(wWYv(#fbY_oHu7C5FGz3xIo|v7TBQ{;_^GtsJXmz1w$Xjl8WtIunQ!azQKd z+_gv?`2r11#XY2|+zVI_d@!kh24trp+|U=jCP~VXC(Ko`boqXj_#NkF#0ulwon0gxkyzD)ZmhA7Q~M@=qZ*j!N?orOnc z9k%|XD2bYy5kcSC3Zkb=`z2`RJd8WC^;deCtb4WGSW?W35HLFTs`#%~J^rgTDZhB! z0m^SDmyln|CFC~`m?E7qMc#<~TCsD@Onyxx@|%~GU;I6$K z4u(9icm5SE!C&<%OZ;9WvkVtHpckhgQ=5UQP1qRv;AH)m{PI8q&#TA?qc{S3Ew_)Y z@xs@1Fa7kt*ly*}0~dz7f7X-#p!=skiQQkoy8l~!Kc2-yn z7aqhS(1+OFMAxvpnKrPyg?iaNk1oOcZFC`fwbBLbUO;bW_gVC2cArhJWA{09D!b36 z6WBeUitJuY)7ia*YX6BCI<*Z>+V`KBR6#GWdll_w_r>%)ySwS1+5H}RoZXkx!|cA2 zzRK>a=pJ@oO8g*&_yb(P`}QIX0oi9`X0KX%>6jjgK6w zdv?PW2M$U_B+Ze^PEG(l@R#4Q{jIzsb#Wr)jsL5?Zvlw1N*jLX0*p91W1^v=j)`Vr zMxh3b)F2FEIXc{B6?KF`n7B2(ua^=X9B3KdW-}|(wyn%A_HEnOUh=ZtKwR*)is=>= zTUczqe8X3`5?~?oKhHVu3^ORM-@kp|?*IKe_;}v;T%U7!&v~A6p7T7!XT3r@&p4T0 zZ9jxQLo(UICn>c7>0+8^XfA4Pz;e;2n)-xj16GPY<x~p2h$QFoj*TeDH$_O@H`or_JXfP=qn{YWZ?->vZ@=cjFVfTK6QI%0 z5W(=I*oMJ|o*-O&ZLom)Yg~UiDVp9^^d2T6n+teptc05bjXE>dB;jTRx3iP$1$At^ zl$!vaV`5D*PHnH3+Yifw+qn;UcT`=&_DOYT+U#|bhTg+O;w-dQ3Vj9HT!0ROM6JDt zk&t9x&gUTj^FIZ?jhO!*ApiI5^-@=j2Orc~f$SG5)~itP_52xGqjmtkm_F4uq$n#d z6HBO5J(f_%XJy(isO(>>v;(VFbBa}~b2?^E^qLSISKlGEe<`zHR#GUUb z%yz!%_ZVvLkXx1ZHks_GJG{DJyN+>(JM%CcTmfFUZ-oC|1~>{Z9h*0(Hc3*mNK%_5 zg?wukN$rg?dlSk1q&IgMm)^J}mc-sDwKqvI)~ka!&^Rz~5yK`4hSvDz@c=l{0FeN* z05kxh0BQim6KHk)XYG!}$J@abz!kvl1h*61E^xcR?FP3S+&*yo!0iXO-zi7_hLLs2 z`ozL`H&(g`U?ad|=%a^rJl3!sG4y?=wHJNxyYy`lXbw+YCwo^v9&L-A5I)!mqpntD66*NB?AAvUk2w5fZqYU3vdMB zB)~a<3p+^Pgh5+}fg1{LD7YcuhJdRER}HQbTqU>)a24Rn!Ik^>4Q(UlN$78YP=MJ_ z`t(hb46yd;3-a#Y559hWedqK2-`IT1yU9eW^h~rDok?z=nKmT_4~-xm&|SbMW@Q3Z zDuj%I?mP|TToX4&DBSDWs^OdXk6rfzq2o04r;rN)Q7BXU zZ{&sf$x**fNI$hh-|EO{b4?WP@a87Wdx>u6wGs_mo*gfu1y$e5XS4}BUJ^IGex>$q zdQm%gMA}A}@G>s>28AOYcM?X~7b_J_@u3*x8UrtKXM6|*ffvr$e7wSLk~0p8&u&y^ zmaz5^y@O_t+fEKrTU6CQV^E-|8*g$wCrUf2s%{@tfzf@5sK7urJ4Axl{oXhTb&`j- zqyJva#{CgcI@Gh7cs?b1Zlj*RBc8iN&*Fo4bM-|cD#nHsJV&!P3K_)zIq=_u{{iK) zEM_uBV;32P-yXzk;rPaP39lX`TBrJe+?rkOW@iyDVuI7qmts*m4V@_#iP8Nrcm?+8 zyCvL+N`o5pp}J!BJVo=3Gzz%~=}FuSRGrfg4`F+D(ZI1rAxR7b_Mo4HyXRpwg*l?X z+J}FD2tGH$DG`9TH%@JyV!tfiqO@O@aUpxq45e!paU7$_%Ov5Z7yS=JpMAk|_DaQt zlkuyFd6C>6&cT!AFFYs9Eid?=EU)pVbftMz0Y_WpLdI(z3E>cOQ3oZ2*^zvCzx|sL zsM=1(bKWy%6mLg)S#_FMj7)wWnPt9Fxcmaqhl5fETs!1D{Z(>jRVqC0@Sa8wH6hUx zupQ`9NhYhX1Pf8Pl_muLfoK>}SjG!Vc+93zfNP~EWB(oYBRIKJFL#Iryu4NhgHX+A%c^EC$A5IiSn@r#QoE%h2$Yz^>~bg*zmaB_Cq8)qDdcu_R?H) zYl9YSWJfJnPP|Y(ylWafpy@7Gu)R;sjfLpkXc9}lU^ypWghl)s(ZTu99ra-^7oysK zLUlm7w5MLqDpc>Euy;hdCiT|Kpgi`j+7q@8lkM^Z@ZTV_cWCVO$Fzo!@(F;nB1YeD zy_J(|kFTEwuX1AicRH^RUA9lbX^8$}889)pSh!a3IsK}C&k2!z;>hX8s`KyT&8vNK zZqhyp7iVvivLh-hP_Ke*!w9HlL=4xzex?xlbGN%kA1a{=Z&+xmez!{nK2i&_940ea zBN16aqkB?EH2Sl$-kg5F4&?Ryu24^$$RT|@csn1+An&9c6M%-vxuAlLlVHF}jKVLk zh?kpA`u~0eer5Bh;rSK$^TY5fp}!!same$OU)cq(+h@Ul=>QvlafAE{=Ki<&6@tUC z{EC>z4^XB6&<4-~&c*BBWA^Ua>N`=ISzW1kSTnE(m7W#9NCRPrlURqWtQ-Vop}EY z$Rt9sQOyiUWu4vWBNX7=Nm&l-PTvFcpIyyyFXVmuiYu~3#3^F8=6m2?z6K~_9@tjxV1cXx7%Hruk0mi8?qgNXeK*J zzG}#|XhO6B;TkjVE!Z#I7}?%J{>%!IPD-AW@cIfP#z4W!W70#_c--=qQsKOwTvRUUv{%EWjZsuQjHif z#XU|*a%G+QsHB3*ay+*g_u`uZFiUbF{;MGuhqag3aWOe+RvkSBwOiv|+kmKJ`3^-? z9a89ob?p-JHhZoEb5m)gpnTQ-(Gbm7{WWT;JB}B;Rr>>t!dFMcA4%#^fkePajT&?nueBj38HbI|(-ov4I>isI?@CRTI5R!cO9C_(HD#n#o;W zaz@aRjothGlb)N$zR2Jhj3ugsNJ+TdDIjZ$#J@CEHAZs%-Yb~kVNA~rh=v1v*1r@d zUcNp$sjjzq`ceMK45rKN)*iJ6^Yz(J@r*+r-f#zUm(`4`!)x&*tGaG;HvI(3Q^*J> zL)#-RqJlAQUjXBHo~ZZ>m4$Ot>;l88(H=23HqFxQQlweFbIH;yJ??R#$YcaL!UAD6 zca0aW?C|o-0Z)1ad%Omq=mx9yL}u3J71~h*hcvz(zxa#J1yn#aNHhxA*rS6FY97jl zM|yOSO^!Ihsu#10#lv7>R|Z1+y2c3`2C>)*kB(5Puwig-9cPMAA$JFzDUx^i%oLu> z`?rXVbd3x8vU)_03m0zLL8NdMJN$3=Z-2te&q;aFcuWn>QxOo+BazGZ`k6lzmGMM< z7PCsh%?F-q`EIJ40pBMMnjS1YBx*xLp&WOT!ZWEv5^;fcb~4GFO8JWOs53EIX{3g1 zaN2P_f!yF{fCrQky36fj59jKtIuj+BRr&ZKIIbrN+IFRVi-O@| z07D~Y6!lpGGzIYs8*B@*34jF$IC5HDGH4B?c7<6)NTn56Am=J&8m%~H%1%n7HL*A9 zT-*4H7M^Q^0>&Zs4J5(WjS$T~+8sd=tse-4)@%!qbpf|+uV{C3n-+CMxT&2_;qe`A zk5Y8jTvnZLu_l>>vWLF_2>Ev0gj4xIu=gb&rhvC@9D6{M1@?E zB{W{4%__gv;xS`8-m@MlWbJeh8W>OxE(O$bYk^#i!VwD8rRg5mPbIsE5w2hi7S^DN zGI~rZ+2C_bI@ebu9cI5!hrR_^qcn%UnP)N``c@b$SCLfpkS*}*odP4 z5ZzZM1!dYQ+G8r(*%qgKK8ho>3j+_4U4u+iTI`!0AiI^%IjQ}Eos0#ArC|(|$fBzs z1g~-Av;mJb8DC>6&T%0~M|fiqeAoq<7KyNOyEtS3od}3x9E_xG!VBeX!i*=#chlw? z2_w?Y2JnVvhXm2v@EMVHXmgtDyhqyx4*Se+Jy4*qn@Uzc>Db8n?2b<_qfn~o8|3jl za@kG0S%DuY*M}?=T0v6RcLcctoj*syGGA312(VNQ|7B|6zg3Z<5vOHn#3>7nIIRY+ z(tI8KS7L@n}OmxnTaEIfrdD!Ks;qKHPx zH|*w*q6yC95yzn>==hs{;?Ioyn7f~cMfsHd{8ooS&|YN6MqI?p^0&IZ7Ml!0^)Yq> zpM!VRWM?DJI5IkAEfK)~cJW*%U(p2-F1?JVpwhIbxp}>x*z45}L%XLX+9AxKkbwuJ z&S-~kAVS}6Oidw{xM&HkiQZ=8&j2HE=@lOEm61$Q6CPHvo9q&ir97D4j8I+l7co>* ztw%X(Rn?z}9222$s>Dl#_TV3*1TA+OZqw1w6B4PY~WdhEuPf zC6o+F-cx&3a=y{EMx>=C1G$k!#8PGCW&%b_^w=TMLcLV`8KfJH!XmtV0rl)s?GK_p z^N6Ma^&+=H%_@M3lWV)!KSp#x?uUGLR|$nm*!!3mPQgtTPS*PGqNY;}Nu^x3#&Alu zwX#BuZyV08%IWAp{j7sj(SAx5twL=~BT1wgdr?x}V0V?qPLA zRaYz`W;#f;QM+z63YiDV{Ih-nA81<;9mkEqCN>HsGOxxnd!rl;@o{GCpw~d zy;9qVyDva{5@{iLI}U9qgt*0Bq>=j||AWf_GdZPeIYqenMw(N9GMwzSM>2X~c<5Q_tst{~yL$94y2(BQgKJL+1kmwe0dv6q9>CrB2Z<7%19+fA_exE$F12;}Z z&CgULG~dwi96>{{AEbHSbxn=bZ;PabS0i#BNpv!X;|WYD&L4de)qZ^+J3_VJaJjxsF|yuIIW>MOKKol~ zFu{yG#u|_@tWX|^|LsrqYmkSZ8QfkQ#NHZQ$4<95O6*ON*bCOc*snH7rC-N3!BYb~ zHO969U)~|%&O{xHZDU8EW*@gz+WQG#zrxGg<0K@`JIYdQRyC67+*p5Bs^c9(VB(xK z;ivwS%AQAunUiWr5+(b`Ofn^DPpzLQv_9&eIFBZF-N);@QQSEMP)QNLZlDWsPI1kL zc11q`MS%nfm08e(p2`kfnkNcJ+sFZ4^QP$R1LFJ79WS7H!710 zf)Q+{t2z#Ci`$r)={}2xrHyPlY8`jh(B-@zJQ5&`>oZ#1?t3s6jGXySV91TadC~lO z#h4hbpCxM7;_=u8O0YM{u@G*LI71>`)`Jl=7{S#=jtZ89t4AKi-F9vSyvuvfA67GI zz2`+WOnKoUGWv90c6J2>dH5_>&|+IO!v^ZAk8$5EhJhVXpX^FPc1+wFysH^)ksL%JM)=;0K=+Ibr`)`bl7eGke9CFt|`i#s0l}b2mQ6s;VyI_kUVd zb&*^q*J+P(9|1EFQ-Q*SqfyOdN_&QR>`<|_h~{lTgi5V#Xllx-|Azgz)+nj^kZrCV8LP0$V~?-@wN3|($O*3Z zVk$znL}P5U&ZO(ONlFb=VXALwDgmg5+7XaY5qn(qC=0cuiO;)EQGrb)9@S~U?E@Ac z;g#rf+Ama9ZWx0fAZ1(q*%lp@RlbC>%5$BGlN8#f4P%9ws9X359&rxJYQDUmo@Dyc zv~AS#5US)+RqcapQE3ku?5#-2hS4M79SmMS!ml6{s7fz3)t|ACY+2}2{(Q0g@xrU9 zl(@gz&HltsBzW3YDA0X8h0!Yyz+iz)b?Dq~*d`Bi78RM`7sJOcXA?10%KA zkA$LitEb30AVvs<2<;?-k|^QD2yWEf^jbCQZh8<;Ea6)~jxUt318Tw%P|P*tSQQ#< zbegaM;%5mDRg?4VMyL6xmo)!P;WeaA-zX$fr+fy?avCCgN(E1e)ae>>Y8iShsZ*aR zx)8G9GjNJNd({-(on#W{MC@P*BD@O`7xwMc%srlFMsg%Cq5UMSHZ z03TQ@4_Xk%POhqBCwM5RPx!`&08CKdC+%%PT59ke=2J4wXYptZ_B4#sq?jOfguPy_ zv&S%8Z>G*7HwuTgQGN9=J)`1V%Lu^&bGmD^QOLzxlc-T1wW_1~bz$k{}HYYH)_lCyI`%Akuj;@t)&39b&nreAk1;5@k;$&fssm?YGL-BnUA}6+0>blQ z4ru}x!$)H=H+#6u(f);AeMj$Z&mBFWkDUwMD;hj1PV>TnN~i@&D2;CcqMA?l$knpr zYJ*WG_5^#n>KL0M3fsCywq)@Q^N4bl_Z}PCq*C8O^vuOX#-@vQK^%=8!iY@$Z|tk9g-0P4qtMu)Pe(o#}|u`0q_4t9JPEE#yTWEoiQ(04jA+O=IU9p^qG?teex zds0>d1S^()X|qB*j~tcVD#Sd3yXeByL1f5A_iGP()lH-Xh=+GsSMB82Cd*NmM2K+d zVUo)y4||GpSt`FLti92Z)1^JDs!~8MJ@rymwOdZtrF&|1;nKS1z8d|2>ixQ8i#(eR zOXf!NhkKj%Nnqapa=?+HM!R6}Nuly&8o*5xeoD(Ke%Lb)(of^NO>`}r%O5@?I1FlS zy;TMTDssaQZzjYlPTf<4c@KMe-Z=885L>5!oNJ~LvzVJvfrZMEIC>UJG#pVo(nrtc zRkBk(@$zJrtz8^oyBy3G;c?cw8U?S?xee+jeHW6>jftZJf}?W=*rmLxcFE`&7%>4O z-s_2Is~C_#WGRh2BN(U#j5!lyPQaKUK3U3WteL@Sxbup)!T2Ee+(7rZ+2`r~`A2Yh zF$mfds>jM?cyCUv`sq6K3z8VRoQZ+*9>%7sLcNhtF3{fNk%T_Mj^Yj7wwPcpz^0J9 zWH!wYd`>sa|Nx7cCNt87XqP_u*0E5y zb@T(O{Udd@Lv2$~+C-=wtJ;5D^}YjNfeRZYv~BRL4X%gdfuE7fT3kBsfC*0ky1OPN zVDpIDvAn7#ee{e3)OG54o0$;N;<~A~Ww%9=N@$^hv!rIgR7K=;pCLQzFeZ@>PqaFd=_s}3mg?U!L>e2iPl_RFJKRlZ|nLV`{Qo!{|0 zGIqM`^#j`a@+r<_Damz|y$)!6wI!IG+2b%GdY$xYsW?!ic*$6nU!y^ z=nH0lV;QwP-yy@n(uacuA1=eg3_hqaF>q$E>vkMGK{RqT89f8o#?O98+L-z)XeJ5X zA%x0bU7@_n$&Qxy1mX}HEp;jKd4|M_Aa^@Eh;c!Joh4uu*-!g~^PWzg=kNfrqY!E2 zzG78%_5gAoogFI&hHlyQimG7g6bS71<2Iu;KT_}w(OP|j=Y_AR3@^((rYfkF_`{+bcC zT=vn7@FnZ5_J6RL&$W)VmU5y@MB!IHn}dvwy9Z#liakDFDFj6TC^wwD~=V8Dzi{58NY3Q+5+zRhtZG0$9lmZk=lcE&(_+6&QQI zF!yuRs=_zpIsNwmdqC z^|0*!8b$`Rkd%GMBDJ4(XF)N06{2}RLEFSl5Mlwh%4k&T#2O&9;}f^L<9qmSan0^G zy64yA^b0$_^RVU?ukfiXu|F%c(1_UAjfe-LY zJcN2?t1HxaU9W9=6BjVTpmxbd=utD`^d@aRn;3_~i@hz5(SdUdyh-Vsl)lLsV&_KA zaFZML0}|KG__a%5oRe`d0{o;d8B8C&dNqEZs;ak9@2B3abL0rB>V0I{>pMgSPJJAH zxT>lH5LlSyU0_ahdk6^jgKmC6e^(@-ISFnZ)TNQJqJ$v1rMa$uI2 zFP#1qw;^}^0P*JYr+g|wW)p{ew5R~r5>lYPjPj4gqCifMgKNW6J_S7+oGcUn4pkAPDKal9W7 zfIlbLp{>_`QAk|aOtj*M;JIxJnZcnZ3X4?82*BC6pYIa>jAsvApYW$rva8BBt{U8> zBWe+&K10#48DIE%o{L~dsUGVK>F_FE?CiZF(rFV*{@{mDe zKI9ZSE9x_mzXx*5k<%^gY((pL0-2K?8K{PZ%_fs4P^k|$q86d)$8oy8>}KPMNQgS3 zYtr|snnq}ttqK?lkG=~}?;tsphGyXAQps6raiJg9%bSI!Lho+FySTqkZL$)@+*k@4 zjKFiozH0a8;H`4)C99loaG`+)I`D-ze(9Mb+4;M%^o@aA&sO(rIL(U$jzUNxc|d#% z<3$1Wj7NP&cv&F}TRA#_8!5yVdI%A6owM8Zp7w{W4{e5G%O6Y|r0uusNhaDN+I0@b+d{*GeUihkD(4vAP5OAH&b(8a)9(sBOT`6Fu zA$~=DLU^N&Pdt02nMASbEm$y?pcXb2_%KB-10K7P?L+alD|~Toa*%_?iZ(NqMxn4k zlr5h${H50>uOusq#S&R0lQ!ZQ-^xkb&QW?Ln7h|Q}5Ds{!{Nq`Q%%(j9=~w=11kB zM5BV3KM}u=0(!ua1>Xg5Suh!nLxaKUE#rX-*#fkxoKpfTCP78kz{^Anl67Pk?n1u* z3|pG-onhaEaY<~7Ig=&P6WD-8M#I;`yDQU@xGK}B-<4(*^6rORxLrKijYP`v5*y)6 zf)9^x_E{UhoLc{7VD!o{axQRbGR(GZ@aa8OdWy;x`r0Q~Z;7hM*>z-GGwOpL8b6otq=&j-0+NF?iisq^So@XV)6#J%`ntqGk+C zXF;xjnhAE`ob-M1_9l4@*SGmNWD=d@W@kfAQ6J(MvJc2Ae`-F>F1E}$cEMc!1 zB?p$K|FrZKzOrP&>gayo5(e=tJ`L8$(=ZH9o!_dYXLSD8= z9r~kuAGDT1!1L9dPDjp>RW7wrxEp1~o8)Lxk`Ky;rKJ-V8wYn%xP2Yo0&Ro-2?XEi zK!L(=+Lh;>E?>;^-JHD>$VWVygv!CNdG}M#u@Vppf`lHnqtpVW~-^ntYlbup_} z!FSm%$FWm0h0q=3(s;Xbi9|w5a?Vva4DGd}V^46csEX0h;);k~E@AJmZIs4xx7s$! z;<#xrqKv|ypCCzFfUXSSM`2orzC~7Vi;iPY@%okseLK&cll3_&>ReMvW4r+gjKm_| zeBtH*QIj@nfa=Cf;r=YEXhzwvU1qUIc<4k4qK`*1kmA97+y|N>e81M)JJMXFOIyVr z>L?_f&=Ink@jD~mh=*w>jhVvM-w#>xZ#7ZE;T~ZEpoF6W28V0D5x7F0@uXTjG}Xm5 zo>X6LhYsw5G>w6pq-;J2`UA*Mp=Oo4W(pq}lXH&hIz|z2XoS-dM^k9~$d0CD3O$f- zL`6GfE$ihg&bj9E`Z}nq`yMD*0_C1LG^E^3-f|yA`Cbv-n5kT2OwJK*9beImZJL!S zJTo-qeKcjkny+*Wgi8+&37<;CabQk?feBH*I4~qi|7sFN)(ev&e1U>Cl9Sa;NvfG5 z4olqQJ(Gt$GkF0y3hhMdr&D+@k5E4_g!)&niu&UUL9*B@upmoA{B&jvOEeOmuA(DQSCph+TYicc+X@xJ1xF;Ozc^9oNE8~D4W+5qgQg{obhh7 z0y`=ur{5(*ADP3@A0K;`Ygp~4l~Uh-ofAtRt)ekGRG<5^5>e*2Q`o-9tMYT^AeGfb zjxUr@h^nfX7$hNB6I;>9#b|#ZT1dG$f_=4rdyHItReMm8j~S3OGhek|hk0%CobKk_)9*zy+_L4%?Omfu66-A=|6VJ zLN}?--X=}PfG*E~xp0*n;q+_V&GN`^BBxnrKj!}HoA!E1?HN6#bA6AQ~VOzyk0vz@q>=0Gg1)v?E2S9#>VblOq0A>M111tsj34jG) z2f!NuM*uzt=mr=)0A&H(4v+|t4qySO0@x1lJiwa(?*lXgv;%Yl1iKk#BEW2bd)=s8 zkzv*XlmKi7cnshrfZqTd251KO5}+F(3`qM~0MP*Vlg(=X--S>e^P6}bGxq@G&9N>_{Suaaz%NXl2XjaoQuBTXDUID{KAqvjd2rOP+CF)Io7nc$P7_X z=fU)8Wh7({gfQgYo36CXTtZ^qQJ!lpEMw=CZNhS_dO*}jF<_Wtrku%TN*OC-hQB#X z9#aH=(3eaJ!;$CPNL^=@a79J*5f3H;u?f|TERYG5s^xmUJ^+97A{irztcf-*4^lAq zL`G&AgP@Wcq&FDFnu0a(W0;L)8{wyb7)%hOP=KR=KYV5OO^aukTjEJM5~)lc5E!Hw z5j;{kYP3o{=BBYB^D|&+$b?rMZ~a%9XH%#b%A!YAv;D7-kf7 zZu*jCX=&64UzxPUOBeaPGKtF!@r#!Z`lQZ}jG8+tIKD( z3`-OEv#hzejK!f?RBD1DSzy*AXgp;X6|S|KteZ52P-m;voXZw%niFg+GMmcHFtAHl zQ!YzV_~d?Txu%>eD=W1^h}l%E$p_?%ORZ+e10IV>oH-O*ieJ>I;5#(&gJ^J&w;^ru z5}z-JEhsG4n99q|#cPW;Y4SL0VaYm831qe2Ok)+66tab;qQZws_QB~GAHESp$qXqq zYq@psuGv(|S$%Pxqgl*qAZl@GISX}t&B-sJNxDdpA` zXv)h>xn|N_FaS(Nehuc^UUv;?FK^w=wDVHaX?wE;fOKg|u6fRlw}%I}NGt<$Li`2` z$P>fwj>d4Vgv>hrC={4YWfWVCch7a|xS_CgNWTrHn?G#2ayIWe>E>a&G7f6LzR=2Y zrlP?P!k#1%G2Yx^^Iu(Bg46b$&`>yglZn-v|6MWu^(ONv_H`+|=b6_R=K91H+sM4J z489u}G1xM`-zvtrXGol470BvVe4QnfnF;uDK?j|5F6u0 z4;$BHUB_X>a&Nxmd&-ANjKvSO4Ch=gT9^e+Z*&ARjG-{sT3TM3&uTIYNi7p1BE0Rf zgid-GFBoFanKOr30PFKQD^#t-1QEEB2TMvfl-vvDib?d?P1AydjWk-UMx+OTbE+FD zK2L^cx%j-(=h+F*3i0`8KF^Q)Ja6}Te!}N@htKnqKF@(R+oQHh8!X7OM{SR8vxNi% zz=~X5T@46DM%s+F8dzOt-5PDovcY-_i?Y#(SAjIMY&AAW#lW&$P*9*y1Z^xU+fY{K zw;uoNhq~^D{>}3KT^)AyUouci*ZZrw#-D$TN}oT;4gUG2-{$ity}>_ETFpPY`Tq%i zSNCbb|MUou4F28d&u;`s2LGft_%}EL{@%a8Re$^ofj{3j->@65vRH5b_ZzM6V7-U> zNC?AdtK4RTG3U=7-~PmoC!czH=QF!@Kl}6Ne)0SZFYbA1@5`^e`r5wN z|LvD={OZkrf9u!3`R(uC-hbfWq2Isr?tAZlP*;Dr;m98vn~okke&XaGPn~W)^WoWZ zfBNX-mQOzYto6^If6;dS%dgu1^7RFw<3C)T|M|_gT^Ij)sr$R0-oDG<|ImMB!2NeK zM8h*YH^dPAqwD{VF8{xsAss&apQ8PflVgjEV{zAjVe;TNTVsHq1|K%Tk1-hT%*(rT z6QQMy28M|@5S|$LIKmDyOH0>#pO*o*gpXi)olN6U$liOeBva zYaw|`FW{`@qF9UOU zaApqhy!h_fPnxrqWCQ-idBj}_Wo-hkqBym*l%=a<^53zt;(=vzw+mS}cB>dOf;mb!?8>jQuF$kWAE2r+>>*I0hzTv|s$LpAw`0J;?W6|~T{NeuVr+;wi z^}~N<9IV^BKF=*f;+3WjhCPxxe0$8x_Ak#jpU-}xW4`^#@Zoo?&@p$d@DHyWl7G!A z|8U=a4PC8c?p%HS`rc+4K0UgzMb}S%@22agUs`$n@H@BphY#(~@Taez{=H|eAD+JF z`uLxC#Xo%LclpF?G#r0_d{sAWIZNKWJ{|>!uV2rR$8}8lWp7c;XxzMRW3Ku8*O|)S zcczjmS!6CTTTQGvf$o$gu+}2|dUFY^6^#(a;^{*IZj*aXAWGy}rb0HU)S6aUvaZNX zS4QS(CV`xlh|yqq{C8QJnf1vu*;JBO1a!l9n5&^Qk1H}K6&9J7nu^U3`%^}byYLCt zLbfp1RFq~W`+|VCbcxxt-h7q+_k+36jI$UfLY`J+23q14skoZQ=jB-m&H)nNLzFU1 zn^0O@3<;MMmO$}ch%3z}p_IeA--~&qv3b-J`Ww?AzUiCF%*+BBYO=Ci84?BY%m+Zx z6q(tp5WPp9?%BQbw&1^!@;R#&TG`{7EYBz@AZ6w0H|7G71&N_JaxgJf4%iJF{E>8V zd7^nOw{D%;YJ}=y*Ikf^v0rArbFrZQSh=!vN^Z(F37dK!okd}Bdd z=;-%^Z}@#dx&(h8h|@vFG&y{spB!@m#|f71J;M7XsZkpAI?Sp}LQ!eCI6E+p(a|E} zAJ07NQ=4TRTgI`Zj()MSm_YpUd}e`7;w*=S#xrRQOd@3_tJz!IOn)E1x&?9c>HkcV zwGa;|;+Y5ZsY~@sfFH;!0%oa1mI~vV3})s}G)>;JeEL39I>?=1{b1Gd%trAn6ttFO z&E@geULXJU`{()9MZ|kuiLXe5`s%oN&*^HZ2mf&CkBHm9e*gP_OTX5=^Xmy8B>o5R z*EqI{zSJ=*0Z{(b7W{voFXn|ZbDl9N6J0z*!|SIgp@^c1Xy^s66$AmGe5*oqM~H5) z7&g);Y`mBjU6q)xTJ#$OaFYn=KTY(XC%(sv?+N0&QB0F6`lpF*mY9FGSay-h-;u2-zMT*DZ1OlaJv{@CFX+{08td@dGURZh|kMnd9R872Sof%iQylM z;h{maEj(@JX>(tf`7inp7ye(3KV10#-k*Bd9}U+G`}>EY{iFScKXjns!*7cJWAXkm zfB(Oa0rB_$_)sVq2XvTJu6P+1tTo#Q617 z-hFlavn`*uU1pfOw$PMC|4H}m62$QTuDN^r#P}ceUBXjfQIi{Ahj>5Ce0$AY^O zT%>8j!JPnZ|JOQZBDhDuodoV<;3BP%2ksPb6TzJdZrfjUgqGL`E{?Oe+I7S#m>S%T zh&;G>cGdNjj=`^|4O|>-t>EIO=t*!-J#%A#^cT`mm@n4J!(L$fSfKBBUD7d60c;0& z44?*}3cv=i5ugm90AMA65g-|00YEgsT!2V`*#NTu!T~e@VE~~3ApmLsC4d~D@2}7& z0K#8s{5Eh~0Ga`g0K5zE7Qo8@F9JLVupMACKpDUY`Cy-8pU%NHg+71mw!aNq#b2^$ zEoaV<@q_K833ze>Gt6%&e`PD9>ANn{eQIM``fy2a=x0p)`_eZi@J489>7X~bbz7b=l=juO9KQH000080HDM_m&@y{py&;MHCulMjZy`_JqZ5gr365KLk+MI{WUGo<_{*wjwKk6#G|FOp& z*IW-gX$#7HjYvx+@M4_T6@29v46}Zoz~1YxhgiD_4j* zr7PiY|AqN{@PC}hCVhDw7KAYwfc05==BpVuUu2{{LSLnHcn%Bh^Lbl2uTs zZ&IPrqL9kwxmA^E?oyR4aZhisj%+BhNGhA*_61mjYOHrDGnIRl8TFeJ|FFL~cd3=% z&I06Dnf-&lkl(Xj4Ts#N6thodwepHIm7NYXYyFn1W=+MZ@w%x2cf0saeSk77apy~N)!!rv`ew+X*KxT2P2p{#a0(O_ zgRVxPAdEQW>DZx~O{&?fTAL~gXXp+H!c%jKRBzLQj0WflMe4DnYOx_8R6&5P5vs>I z;oGt#iKcTku2{Y#9RYiR^2PclC6r+T`&e0pZz^k2Stoxd1A~n!drl0PXEX22#;BLw z75HAc9!K`R`lRu`G=AZ5Q&)rRu*%LvN*#n?&<*|#5Dbs0vJ*=9DM?X0a3~D~5?^2!yX~z(QjHc>ZcOfzfAq0^a4>0^SNQAjuTdGzn>Y;PXXr z7)C9(s#)*LvYr`Xk*b|CIX1Fm{MRoQXCSXf@c$ZeLV2H(skZWI}h|1DtFLXzLQBk0|- z?@rxKi-Kb52swgDDZkhSs@IkD!UW>GEF8F|=zDnH0r2Ob63dO{&UAnK&=_Pdlj6-0>XDMSF*W_1z3d?ZNh zxF5+-u5^FI!O?@PP z-zumjP&DV!PvVn21|W_US)(T`f`aA4Q$P&FD*P8WN<{o>puxbZ)W`>!n9erw`+nY? zT{SnVW}WKYTQ18hQbIMFV`92yo0z3X8&V{so|Gx#EdK_XR3z0iw?zIfaX#tANEWz9oek+luQ9 zh%EMTGL(xHr$ke!iGR9FAq&i`I~e|xTg4fJej+O=j*PuwjRRS3q}YP2`3>S{TM)kn zbeg7d-VzAg+yR&Z$I_9iQSUIf&R(vv4BpuR5EzXPj8l#8EHELR`qwl!{1Zr9D=15& zBj7!VX-^Fbu*}bREfzEDlM;U zmNXEfsN)<~1t?w$i&}LA!@itgSascgC#-H*+b|KQJO|hbRe_*sE8BJ!?iMRwsK28)Fbjc#)<3&D~5QiUh&*!J0@bdO4IX=1S z*F=uC@z+K{rcP74(&#)7xK#!#d81l;${vi^_g-OZ-wrJc~WefLM9Zni}qJQH{EM)u;u8j#)Gi=j=PLgdzJ1`w(%C zgiOT|)fxcu8*whqwE#u0i4RkN+3Ikpf~>zKV4OC!4EQ~-*-NT+>b)9M&I3aXm^D~^ zz=&G(50J90cVTCdH}fJ;oGK<=iz<$0=Uc|$WQ!i!bwGkf;z z<;&G@AH=GF*{q)|0eI4@`>1AZz--dn>*e7-2{Xa}K;kDXu%&U1W%4XZTQovZ*Qx}bW71` zfRq>Se~|4f$*9rXFoo@PsaozbU~$#9K62;_92~O_AlFhMMgKaM8DRDGYS;!Htb?&l z2^ie5U`$}Od7l0)4O&4~*&Z;CnPsaiVBR&^i95<3R{b1fK@JVD{xa$v+=m{9%=bjd|SkQSeFEK%ct zD9eIWn)TQTY+-X8e~VcTthXR*R*Ww?m3GM%WIMEe3iCNi%1Uh=EkWxJpmD)bI|60( zH?#iPDl5unszbF-b+jv1S<94HC|0AjO??pu+OsjhnhCq3zXQpK)=~*mfLB4n4jzW? zT_EraK87+gNN>5paM0~4LD{lS1^Jn;yPR?s)C+we2zheuxbrTdh=DX{e4CFv_DxCf z*cWNxoB~z~6SkB7BALGNLa^a>_5iX;qcYlGg;Mbf*N^cRtYVeJ*sJ9e<3pO!(IZ#{~V$11!N z^sxYiHUj37AIag;3EQ64ux|F-;4pZomwEG#@++ zaqK~m|JI^V(JfDa%06x=%1W`mfFyhQF?d-$5?Q?iWD`(V76WSLqtHfL%FKJ~yY(;) zl~?0iP-8$=J}pFhl^sLDuR>6FwWB4#YDhlPVc-cRLw2HO3bZ!pE+`qbonjkR zj0M3Pmqu=YVqw5ahSaDK3(R=0VzgROo!@^}DC4tGf0_fJmEQLQ29v~Jyjf2GPVWF_dp$#EIQcc;i9>Q#C{LfcV^$tvG zry5dpr$KpA8j5mYS)7m`PdOn!ZAs>#1gp=O^z%VD%4Pd>0M9-b1Wb9QZMxCwh~0@g zfy=X#k0FBvsENj^Ovr0lIsh5Biv&0j2v1xmNq*K6gYp$I1`rTQU&{v}*n2&R_s05J z|5m<089)aSEeLdZZGt5tqZz);GI?45G++}G>h!yiMco3*<;`kGEhZz$$0ey`Y zvp%#_yFApcjZ$k5XG3@hga^jMGK4ck&=zXftFc&Ou3c;&&nToR`{a5OR6jfiBlB%O zEKpO5ONgr3nv@?z)>pTn;l;X92xNmma(sFVnFmeh`DPJmW1GzF7vdGRwGt)(Qk(}N z8^o_hbcv30;fn~59FAcSLd&lr0&tgDJg3PlYsH#VuwGD8y$2T@!Bv`%t=uR0n#hhy z3Kf7_27&|$D=PzWBgNd2C>c#IxjCtG0rhLDX`z0jGTy(j*LS;{OqUZtN$X z6XNez#-Gnj5YIms#NP|3n@ok^tDyusnIttO7xrx|^dnRZv2U!Q#Fxm=km@EYN=$(WlWTTo6i)c=c z8lLY$d({PNyM#UAC}AT4?571KdEc}vw%H{p3LOrzs9g1lMEfOSwJ8|(Z7;l0em0LR zZ8I}jQD@NGDnIkzI4ebGF>L%E!p4&}Ne-b@Xm~B!ARtdv;(0p3i85dW|1h+g$xBdp?EOlKZMv#B;EF26%%+xV2pnD`?f zyWLh&RzkZCx$vGFu*5s?+7TpH$_v6RErI=Y5vxpiq?RBXZsiP1je34_Ul_cw?JQbDfGHKZNNx;U$zmEVa)X!`Lxb$u#v(Ts zXe@Hz0|ZIPl~Fl02R9U{y;w?uk1*V>!EFKBRRZRiPvl5m^FR&=XZy>Cf||)|`%6+~ zS&sRgX&Pm2K-5w2SC%dH;Op&^b6})eK&mr-mM!Ua#gt-WjL8mjahA$bsvWACBCn{8 zIplTC{Ohq~w*Zjn`DQb7`>Wz6;hIV5b7CjqUd>i=tw~_V|`0@of94@O&_MLNfT#DUPigldsG?GpMYYU;v6w)%^oiX7P5j6^~)cc6!f84}PSh4`XmP-IY`^?EIcICI*#fHnxC#A%OOH+#2quPfO z>l_qYUD1Ojw=kkvt!KS354?}DfGE3ous zSb7i{wd>H5UE66F*6bH*u~hryf(lLHdwXBHFR`pk_eEii(W_HY=Y&Byt*!Je8?WF# z)-<;dfBXsq-R}i5YbX;A%b~-)#10_ZJCwC(gjUT)#d};0e?V%j{9IEn+;nN3IDJuH zRbIDYvb^p&M;nZUaY&9?6}C|=t5eIG)kyy)NO~bX8|Jk3v<=#t!8R)1opR_20LO@e z&{ge-2gWA?u|(4TMBtS~;J47MampfBO@x3C8a6r~l%HP;i&qX+q~O|7$LGIn+}2f+89M%^JRwokyPIIcc3ekBH_rZ+tC^A3ng$gOQR0jSQ_@~F{tO56^5{5 zeLi#!){(sC+l&CaS1R^)D6C;M>RYnE7TbV4*$(Um8pffWMAfS7A2#b4VO;dM^n<#( zOKM|_<&`C!xNTPxSL^&Gte$81XxM1lF*Lq=!09Qq#UgVCwWq0JP%SgzU)6|K4)!MojTn(Z&_qoskOmjaOMN7cMd z>W)*f5il}1B0p-Q5s9UnP5y#D8qm;M%yukq6A%i2lo50&9N{R*t5BmvdZCcOR2=&9 ziCMPW8vO2Hz7o0Zc(vbM61!a?=?ByNSST$vDZrkh>F2LZObnqMT6`AQ?RuAHpB=s- zmJ+@pF{aUZIMXmx%4&4s0&c1zrpOCY@sU}cUJ}Qq*f^RstfN2t`n1#%`J>{_*g%*+ zcw|#tuaYtd+lpCnC%tEtcQwh|ctgI++g7nWiV!f1g zuS;T4f*$ncX^BP?h`>3utR3?swc@2C1nw{PqrVWyYr>k>fL1NsWqy;W_s4!__l5}&(F~Z5b8VAl%o{AWF70g%rdW)8gFL|UHfbgWo`ao=o zMp;}j4%3L-a~kr|IeD7fpVtBDnZRzLtG*!H04&$VcXfbJjuAKjL5$tY`*#w)I<$fC zYrCL8K7SnwK-GRvO(BpQP4{*#{i(`gejp^Y|6h|LcJI-;sjR})Zf;YJ4JmwuH?bo0 zYnZTp0#(<>1exDGCl11MRGj~+gP5`6J+1#Yfgc-158z4Y850}S1<_s{wg*LasK*Dj zFByzbYyB_i=8<;Ff;RCd=m@?@iXLr!0D>o zr%cmd@In{cd`_^f+)!+es7vEPyn@W!gq2gg>1{o8HRjMGZFnA&~oVQ zmHMD!rqi+nf+R`_BlWPBGlsI*SNk@@Rj@)ye z2FKRX5|aTNrbRLaOUIBbo`lyKWZ`i9Qq&_djl%5|6xxy-lO#Fikn*J z0N?i&{F9I=x~QG(8eKZ;d=Ru3=LEyETwMb1@;ILc&2HEVP}{A4CX z6u?ViI{Zw)m{N!d28{aYAZEXwTzEk}%la8a0M}jOen1WdXsTf?L)&u5OAeWHY-(A4 z!211K2^eKzjvUM(YUSM|Mz9N8QHK2!USp{M48|+WRJ;e5E>(>i zO>Hjxp4T1%&KLhFMEF3k>>Kn41K}HZ=@}}|Uct9sDN3d)!0R$&G)udYOg08kac*#U&n$VSm_e;TIu5FH4@_6B z!>&Mx4X=qBq4&Jjt7597BKCAck)u+9g=Hd(Hfq0L1^8nYd%uzWO{Vj^_l40BJy&kV zAuT3z^1=5-^EaqrkG!JB=uFYEHeW2w=(OrK2s+fr)HtjoILHM2a&&_ zr4eM2Y>VJc`0R4DEH#}&-WR%yBSo-hA8-|Do&WS{Ax(G@rUD{l#3yHwlz^e>L3E0X z%L!C1tH*bjr`rDHB+IovL!6H$Nn`3rxtv~sc* z(|P-QV)3h{)At@3_cE&v=#Ge*!slI!Sw}+b8mxt;I`ci^Iyf>vzJ&e`T6PqKlfE4& zqwfo_PL&zNZFxii<5X`& z{!vZ6`l7=8wYIpuZ;=32Pg5gy@7FNmHr1%frY(F*zbh$ycp|+&rFZS2c#`s*`6`ho zoWlp_Adzx@@l|{aCKxHr27$wi$RAGW@=>~oT?Czij~QD`-2H61rpxsvx6uB#?M-IY)-#hF#-{Tydk*A#Vp3|F>tRH|;-5V9%_DpDOeh%;lmoS=PgU4Yu zfiaonREBfGAMVxF^p%Bn4>mm#n|}50$xROtO)K)0vx@huUX$GT5}dtm2++E9X&BmR zn}}dgQ8wGcU+C`pc(uyZ0E)k!Bq+ARx+5t55QpN|CrMERC{8Ngllr><0g6le6?@tV zkq;{{{y}z#FmpHZmjgcp#?=MPFaDMcjH3&f?-lR&`r2eK@_K>TT`s`56L!Px!lSts zR#Q;2Na#Vn>ur`bw7*r)WgBDFMtituv(;>jft(2R(dnbY;9L^3@w|F@d#hXUSzJm+&Mz_E*|?8Z06Yam7TN{IGO*pK7?jkWAckaK)Y{PZa)53i%$2WvmH1I}H7W zegrP2uU(X8jp2)5;mtMt(qJu8GJ=@P3q4Rf600E#;mswFx zsOAaTXgwD$%88{KQ*&I#R>(Is+bDBTvl{xpXI!|i*zM;B3?r4}NvYUa{s`?AYIbB0 zm&t3&a(b6LQ8RcAM0IF#AgCU|B5TN4o7ltA;x^}C_(6A0x6h8B9V_;HDW(AXzuaTe z`3hs3>7A6)*CNT0XHj%1JBt2~7MckzX^-5@`t$b5FcY)bHokSQX)cHK_bfEdoTlhH z#W-)#`}0Di9>7#b1ON0x^%blVaS&QHLOV5Li{0A4t7$FG?Z5w(dE^LC6v7Hy9Z$9ip>GW`KQS zJn69Lqt&tok_F5L6~t*Ekmu2k63GO%m%&p;(pJS)5S{u3vhMn95D2_2OX}lW6=cW7 zc?5WT@s+EVHLBK{fZ<+`Qo@0Y(@!-rOmD@8uKL^OSkW1k-Jn*rYeS5u9Tp8H7gntM z9ZcEEm!NlvaXGqEXRF?GOLoO~r!%Psy-eqsw*_qI%>Tv3jmu$9dCnk7irg}c^8tyCwR>6->(8iGkUy?^>mZsQmYjoy zVPg%kCs*TnMP5&C>O_xZJ`P?QrA&!rr+dgC#An0La#2nnPt$-{{hUkC6%1G4&fAI3 zuA=R+>_B+NIVqNgsSlhXJj~j75T%2c-%2d!o|AHKebRn?**-NgsT0q9SP!Vi#DkLF zhoj{Ungmg!4|g6!s51|CFH9J#g16#hMTV= z{qArYn@wuf0qwm;D^?tP8((^fmjvm~@80w8ArB!F1<2*l83JLa96Bzx0oguuOc|jp zlR_XHp9ooj~ zD<(+#R{_?{g9VaQQ7~TXS5YuS>n$>uKPryxp##k<9K=DfzVVdXmszO1YSu#SdK9zF z!7NuVvj9|i6US*I<5_bXtmDuNFHtn7XVJ(Mi|TDynB7nega0n54r|eYEY_#NiWoSG z{})ElWS7Xpv5Qn;12}63;BZ&_l0(l&Z@9e3TxvN_X|&_T)({HfD&3_9i|V5 zrR^l|CzVwrJ)11AwB0?b0Vy^TcEX1)PbUz*u_cP*&S$s+;hn z!ed155|QKt61_*zK-4>^Z+y%3ac52x-W{M$RMVtp9r_Lz&Y3@>oI7muQK2?WCx`cG z;w;s4KDAtmANDeqxJxBX!9#&CtyqCy=otCpL?Q0c0+o60J5d0{g`m3>?O)STwU`Au z!>I)@10xe#F`&3lKPprPdNpcbSnXeZM|)m39;FO_KO%I9V?A*rkhn zr!U8ZcOhX-T0-M^=?&625ZFt|#jsF@!U9`oA=L+6Fg-i@J3G)ObU=+fm90dk_EO}P z_5Sd^Hu!VEU*_x+?*K*mGad`dJGaa>T%fV>okc&cMk2$YrZw2dWwyd<3t+cu9LAJO z?;$3@srkf%&$%{YhX2d>lb{# z%BSG7I^j&$+#XsCmM}tz9rG{$s zkJ*nhNx4J=*?dG5_9GjpQvy{09&7wqDVmM&D64!E>A5}$^07NJ$!Q1kK^}DE5w6N~ z7?IV(Qbk>?#e4B0DLsoQba*6Q>NPLwJ}(mlDzG+CsoSj?Y&}w+w@U_@ff>xs1+1iyTm2WU?!k zso-00s0-Ldk9y2HsLA{B0y-f}GvwLK_v|*wynu5UU_Z_YuyR*`eQ{rse~ycPN~di* z6Rw;u0Uy-*sm3bYl#=iW%ZunB8hdPY7U{E{#4i6RoJMhIyu0fN zjur?E75<{)JSlpGWLev9rL#wq)PXr;-| z;Z`P|imo)H6ec&Qm7uM@|0<{q^>XMNN!Vvddww<^*+7xE3`LU5Rl#(NmMgC)kXNV{@2N%3ylqhD4Z{GSiga7Rx+{>kS^pjY zODV|FKUO0@x@`4%WIhf@z`CB&*e$lo=$~L&Xt_qzrVTZsSz5N@-3+2#eQfY5n+k(xQa3BX?#8B1?|gs8jOFR3vh<(M(d8g5!3CWcAZ1 z+)8=s0|ziG!P*`t>?B>vTpKh@+|)YE;^9@*1?;fwR($e za_D&&vDGfzPMYx@iP<2+p=Ejrah~6ZW!j{yqAYiVQX2N+xqP;nUm0%o6)tWUV}nX!6uR$hOQsXz1kXki~UnSEfU#HddOr?4KH}mTg-W8ic$P zbLHnjE>bIFpP_&HKJ0*G>U}`wp1Du-)6V-tKh^NCl6|6kq7(JUq4Rm@fHVe1z_J@N zf1=^RLjEO;JHP8&)J;%~jM+UftVb2}PV2HLfC^HIdg^r2Q|~34oiXWt6uI^OtIweW z<}vtfv`;-Q2o`DZxjk(VDyz(;soIBjx+g$xX+-+#t<@e?nL&16h`-+`kn|ZUV=jtl z)&>}bsNHx8K^WG+SCUI8%egSeprjlnA_rE=ElKg;qk9@N^5cz7!Nw*-VgW`}Mv;i{ z9h8Tu5cLt^eBL(xp@>7*4SfBZc*Sb?Ya%?I?ACS-B_QB9gN@aA>kGoQn;cgu1J^Ng z{droiic7fT_jt5h*xiP>x#&o zqJ58`+zcxLI9g?5RBeL8Rl0h-=k$2bzu-NhOc&e3YQ#zMS7B)zvY>2GxiCwLMKu-! zjKES#9Z7L?fXt$Uj$VnqZZj%yEG%S4L#>S*l8k1v&2LG&07$>ZaRHFxJ*UTe{sr&J zK+fL#10emD^dA68aXo?bTdHRfde$b}u=ZmK1;>A4ko5_AcWUGDSRC8PUjhzL0*S)| z@G_dVd?(;}n25b?5AI@Zht+tRC|`Y&O)KvI9Ho|85;D)9p@f#xCG+&=&6NHkzQ*!a zlj?o`C<;CiRzpP58H29!JLx=1i^%ZlcS%x9|7}8Q>9Sv%qX)etNt;1LHAl-Y(K!SN zWxW(XW5=@A>_zjvsb!f?OgFOLgb0(|bj>4T&$H*zgoyo(*O8i5z5?wxDnk+B8!NF( z7;31*O_HL9$_{)$=IZT~c~uv2&7&?cLl9#rPOY5K57DCxN)NBC5rzib*0Y}=`fZ3& zpuynT=w>WR>^ma1H1d;m2?4X|Yz4eySv#Qu)@eEi|E|l>tVUGJ8uSO?3Qt&jG!M)A zZ)}TgH=XS-k|qSP13=z8i5qLq(->z=b(mpmES0|;B>@X$p8b?Jc|RaN=RY;OEJ==t zn$3T@C25LiU6AK;mtahXKLWVx2ADK4ikYXX;%%IGn=am5;%$z2>nq;oi#MBiTP)t% zse6p58by31B3=>HXz#0nc-i?Dh!?Z*^CL7zOvu|PPeZ|B#ApXXk$-MY60>{pUvr!a zDtODciD~qUDiYJE<)IPi#2IMWJIM{qNE-|lt;J)}-cGHzag&7S5P{~N>YCOR^dSar zbv+l;ThPPS%-;ZX=bI0cg?ScmmcP;z-S=Bmn-A?0Mt7B_SSZGKf890DSF@~-cE#tp z_ixEodKr45Y@)LernB#FyXIMV6Q}Y`XGuWn-Wy0(pJ%CMr`TcC4SWH%ou6m|K_zmZ zMX5Z4t6~vZP<(L3j zHaSQPD#qQ1BH9&^L#T_eJlqY*o13jhCR?BpR^&FDyhp=Dj-`YAYy%X(W(3la*j+}m z3m}Nzgx=ZbO>LBM{=9Y>h|wx*0FKoE8+4wHJN`CLSFM?Ku~b0Nd5zFd#o^KhdUmp{ zplqk`Fdm))M3qBFX=8S3_A;2XYD;XuhnBcfl@D3j2ENjTO?%JDRU06uyaJ6^v?|!V z?p+|)g?{@Wp3if;==!PrVC1?_c0d)UJO=`-!Ryd6&{k8EZJZgn;28YK#x4}h@qR>J zJ`q=sMabkLY8D+L(X)(6kp>i(L-&(Hh(fa*dWqzqN%KHiQaQWY+v z3bW20giO8rqM-v;Z0E#=Mq_Mn6<24WGk`O+{*k74*rWvW#9c7jl$Qz$5F_3S?Gq8vjwmQidUaR z2TkYN|0HV(Qm$*rZ)B`mc0jelLt`q-mcyM9pY1QiBY1Ibck8|1x1(7Xtmf zxIjNMaTkV|T|8$66Rr)6&p(~a(}x+8URe*54FW&TGyfCNMzM$T5^kI(-Dg3EVIw!^ z@b77Jh0b^_MT1J%e)-pA|IEP$2rBkSQBJHEp07x{OQh$XSND~C$9R2%*eW^r6|{RJ zdPTBUcx}Sh@f}3b1K#!WGr~=fOGe59ax(6`8r}t=9*G=ym{Z zV3A?JCG+p3{pMhqG7;86knIdwYZZB=uYa+; za(b_uBS9&rxaxp*8M`eLr0)gkOmSH2K)PNaD`-Zp%`NtBTJSlxAO!cseP%FzK~@`# zWcB?69@=P5>_3kz$*Tpvj4{`A=%8J13#H3f6qi{aPW1UZ-Nubl7;NvdIM>6(koMgyM) za`c6j6P80tBCZnS9;lq~pGk4JU}LvbPWV+)TouMmsGJZNJf9SYyZ^Di zl@or6ap@usWhVA34AF@I#oQhyxMHa^IDr0P8i?o@=Y{#}5_=O_|3DQ#ob{e~ye}UA z{DihsHlv?81f#DUM_ibZ?Dmp4&dBzWyTW`=JKJF#PLV@sdZNHw* z@8@SL5Fr|$#oy-;HSAOb6AM|^!y5sCcF@@a`~4dc$8j;JWgE#G;aTdw@nDlf*z)pO zRsm#+eaypcK!CzFH-MK4;9U0U6ESt<+Y z6m6cdILD@sWm;G0RH0Pud_~<=pBtB9nNxt7%^j`eur(q^9q`^R6|3R`(M|Drz z;st&I#-uHuBB8PKd&sAM*vc*B6ab>e5X94FNSrtcI9(%({HN(c${AM6GHa+t|0XiU zLXr#KAn0wu;+;UtuiGL_O+XHYJq+OrucSSMr9Vi;mr0TN7OhAv`)-Zczum$mEE-P5 zG7Hep6y?4qo|1P7dGD)T@hb?+8dPfw)ULk8R;o-4U0}`1M zFxERfM=HD{^*)}Osw2J?BY|_PWr&GBHgnf&sZfUf0Bfs9`{XA$Sse z8E$w}->_i3o3RW!=VaDn9F2ilAHCZY#h@K2o;}*%L}TKYnmu5+-H@}_#jeFomJn&r zj}9rsQGe%tf%^BMi6k;<#-46HN@aT+?6>TtWj?kFQEONg?v92hEu_m#4&ca2x)oj7 z(HnwJBv|m7-}cj%~CfIsDdg2y-#XWjfD?kkD|&`>m!R)tLD)aa08I>h3DA997_H211t`zbv3Gg#P~P^$gsq z8@(Ha+mlFxov&i0tRYtJ-KwQQ@8zl>QO(Lwq6czl0v;7AaN&J%HSp9sJ?>2v7eED3iM&u7@QOwtXj?8L3S~NnQss^Di9(eUW@{Fr>m1rEL}iBD zb%2foN|DBeo-6%BqzZ1>CFtuYy5d&2{~+2mHTvm>Q^45IjpRF?M@ zD2RwfhVY#)2!foxO5i=jjA~I=dE(6ly$6G`za{37`2_v3eEp$A#A$Jl86dc?*2#NyXsZSLt`@$Uccn*Qzm zm}7jOgH4s9JS&zTx>GvG{o~7S2^n03qPtk8D za`Zm$$FGsLsD)WC?~o+mS3>@o?Z;y*cic&4XU`FFG=#2z+O78sdN(ZWt$Md;Dd8)C zaQz884R2N>%?wm_;t}q~ny;y;Sd~=wFJ2 zB%bk`^8&3B*6!#YjEI}e!+)WN!lv4U6Ad(zkM?xhyQED7&rZDQop>9J_VVl8=OV*R0CLrvT3ix6zyK;zvPzUVRx((}&T7nQuHT z!mR$==-Nj-I`QgLWJyCcaBQJHV;gQiMDn#?&51MlRSZ z%{R80@#7n#_yhuD#)V+ealcXkBcn0)BRV-Tfrn{7a}(?2@|8k=X>6pU9XyvVow7r% zv3@F>noI5s{9*KzGRkr#qbx@fB1FRLyUPbO7zYTTfzmJuRn79RYw%)h{#tXF^`oa& zwXzA?ZH$cpztuuJ-Tg3hesBVGU^LEAfX86r4vn>cHQ(7|DoUSa>P?=Il zakA)X3fs`J{Y{IuTxs{q4wshY*~vE1w$e+N(M5+xI}pR=&@npSXkP;L-^^@nkUiB= zA&2(kUdru<$nG7PhGJZG4H13&e{4o$PJaXZ>Vo>u=rK^#v_$G?m zEh+K~4T`a3V5y|Jlx6;b!RnyTM)tQiqLvyIjVApA!3qCOB{-x4}*r{M)u zJ&Rw~xIN2HHs8oU-L6zR*tzh%2VgDn;S0P%@Ixii*9b#1y0@!Kwq+}`_KKLtGLY` zt%G>#(=F(vOox!^+de?^5}g@$L1!{SQnrX*)Y0GU_-p0qH-YLdXi8q`oooDBcPCqCD33$b-ze>jeXu}>=0C0HLvU}l|ZH4}4V(wz}3CNNf zyUBp+&ub7PvPPqc&#(eV_Iul({xIf%dNrI*c$J@T0`zC+L~nsUDBg4OGre#${(cs1 z0GTpz7phZyO~iEmBwi&R&Gj6JK7ST5WPdqf$TL{oCjN3A)UXuKxJB%98j^T|Ps>m$ zCb|d9Aw2ZPudT!7NLN?}AZWOxs0#6U=fo$mkQbt_@K7qeFU99G#rbfO>1Kd*&xG{Xgab#0fE2yjWnXOHPUC_ncq8penHegjC`hWMDs z3E-W`G=q^zFGIBP^>B4=`}C>I)*-J8<~xi-7CnzIgX*BxvaVX`^428j;fWgJ$FWCY zc)ka@YB^TW?$38vv_8dbeSqzT1iX`nb;g{0NLM{PpK1m<1@F57A_yYL6_gImovgW3 zbLpZvltSj9I5z)+Tfq~u5Di!S!!7x0*(t+3ulM7Bs7W50eeeYNs2ab$=AHD+dK{S7 zXkZSitV5-N8Ertc@x^ewvm(H3Ct+Z6XkbS3+qyyQDNxP+NDRr(*f##T8_zpJ(RP0h z3`rhDO?6`*pn(jv*#dm*n z$+i!#>lz<%P!=#LX&=0_TP<+&Uwm{iLj_4$udgGSc_B*Ld-0Cs<75~@7p>CQg-%T|fIjkuGeQEse+$esh;Sy)#ON&vJ$J-j|?*4rx-Yt6XfcV+1yPy*{!kab_-WK-7 zM7zKGiWo2PZqRRn5D%}rh)z%5Kl~3LqE1g=G84Cb%*_q3@_gJx5~t*uxH3t61F7J( z__)w6#-`%JxenbGWZQzQflu!P1P}C4Rr|*UWAwUen5I5(8L~q<>7`8AppB#BUa{Di z3!^hJTI)sL178Ka=k#6xK7LiiyIZcZTd;v~m~2|~yMvMY(a;(6ez9P%yrMTbL-F?; z@fh|7yeDp}>OE2ZwZhitHGmX+WpVXbH?M%+u0d-xmuJR4 z@mJ^Z??1SRW-sO>{R1?~LN#*e{`10gkpMATN)fdn)Ph8tvgB?x^3xx}_t%Dt!uYPMVV!wYeGQ}-x z#K+czJ!J_p)Zk<2oTp_Lv)%siRqw5nq}UMCdD)}LW}UCEBb&Wn_V4kBoxfg(degnx zepWKy@7=caI)ya{Q0Cm?D=5&?1J(`RZTc~z*;H6rQ26<6-_`TogsVcMj*(_Vff8jzYfp*yDAv?Pu zH$HbL*4?Hv^eFmIbo#xZN=!tRYi*mbAIr+RPd`Q9IQ$Cj(jSYX*MW`>oZtn)sgdAK z*|547jZ-6vta@t~S; zF;fjLBN&(AMLB3zWF?MbTQP|G7wDdUC7d=3Q z+Lq2roIY=-A-D}_&-F9}SN>oK?)q_j2yg@3+oBC`v{Lu`@j*vSaidC0z?&F>`fLO; zW({Cui}qMohX4?|wEmb`3tYs?fm(*C{NuQf2)Ky))3u7>R?BZedG6b;O-5e(ft1Yu^I?4#bR- zvRdJ6J@wbP7kIBN4mC^`x+3J_mXiScN&q`tYy58kJ+ zPQD!~U?KM^g6QS0YhFun0MJ>x020ylgAS>)Q2cX6w1=7tudh(KMz)9cRBt_PnjnPC zi3=gKlAN{Y1JBO}exDO}))u=5$*xIA+w+081AW(3pzY8n`!8Qg&~}HPWsO}Ocgpb` zC}C}Wb~?zSkwq3nq)9Lt=ujJ3AmG_%I)5_<&wpx;@T8N_yV&)nbH-0FG3%>U2@1Z| zAI{pl3ej(?92z6=P!0{Fz&5!G{n?m4$9qCg#T!D|d|Su8i(%fTm#~H*I|W_?%_SVM z?lqm6a}c>({oXGGHBvq#l%AumisS6lfDnuBo{D$9B{2KC1ffaq$|V!M`R2|plA8~l zRor>oMRMQZg5*L6GyUOQB)Ksw-X?-M88L_Th}-D)%jf+P(VM^~GR(HpesG)$-}w_7 zCufkA%<`kV?q2!^!(Bf?AzDz9D}a*RuoA_$Xf;jvL-V06=%?<$fdQ7(|H5&?Q<5Wx z#_t^mq45rHgXV@QLJ)vxbW;RgI#d{s0fN0jlsb!N#X(gNkj-(bT|1kooc9bai*5Yv z6-d@#5jb!WeEVBk1U^^|gcUIZ7efmvN^z$dOW0T zfDSK+trtOj#Z?O8Ml-fYI1`LJM~L6^l)?p{u$a~3lSUVOFHX(dAwTm6;UDQ(a6f*` z=6XDKkg?2`9x$6oY;CVi(d5|-A`G4|BDB}qv@8*2qZk{0KCd=v*KZR6tJYtIbd?h6 z6MAjM?(M8^(6hclMOFAbw+S7c@3Jil>i~>szi?p2p4i1^-&*!VRk&Te_U%Pxq;nwMZHP zjBnM-DCSt@qw&cU?FHrfv><+{FUW%F*%*}ruYqig%fUDo#^vG{{4l;1<2l9)z|1C$ zZ41&@{N4^!a%>?`*@+L?Kp@4J{Z^kRaC`J0{+0))ZKQI>+$S`+c1t}98N-jV_Yl7wP4(K zfQx1br|-6Gj3>y%1mQII`FHcP1~n5rv(^d=rrS3#;NZV}PaIz1VG+pT6(Zo`i$oxo zKPCeC{2>Zt@Owpsk53Z;l}{CcQa)J(rt?A(n8ou&U=F`r1Pb_NA~2sjMPM<{e6Q=I z8<#{F$tFMf4+;@cY3`DBm3p6L>T!r|BDDCuja3aFp?Yo zf(WBMnOBQ&3x=17a4UxAi!i!a^9My3zs=33i!ffPz=I-;dJ*@DFdk0g*NQM5Y|a&7 zJRZx3iZC9X<=G-k2cB&rOed8)-=#2~b>`oSFuGFkRuRSn&wQ5%qb;2`y-OR(!k4qE zS)1HF&uOYREA3VK)az?hVyXjT%vUI8xroVznD0f*(yp2aXOKB2;Y+$A#JA&R;n zW}}EH5;3_DQzK%o7BRq)vsQ?h;UcC0V*VmxvP6szVqOz5XZ|h_3u0arG10$wcTf17 zDgi)_u86)lS{6RQHK}q%4yH zW(|?|Pz@S1&=`WrG9>f;e@Wcx^a^n4e|5o9!dgnIn)TkQ_}NL8pPLZ8fe2n-Otkx} z(_*{}(C7bhX+U3pryI~9+Yw}SAmW>Pj?W(2b=-(T8L19`TtNul1r& z|9**0TZ^mHp<%gdHhyswtIF_K`}>$m#8(=7vB4s7OQK`ZN5yAaMZYdGzB1fjO8!hNsQ&cV6Zm+JO3a0bRDvgA>xB|6YBIk#RT1z_*UK5 z%e&owdVIESQ_^SaKI;BlUC_D{zgI_WUVN~wF(xNIR_Ccfrm_5g|IIp<^rgFtz)xIo zBzB?y?B&ZW6Kv`FSRp|`oc>*$wduq0Ml@NZXT~LrWB4_^AvIX>a>$gT-2nYjy^!O_ zDpO!71Dn!=5X{D4wmu1hIT*~*$I+K!L5A6ad@I2}f1fBnBq8E_ha5C!h)+?+|5#=p zRc=z{W)QYT>&fSt%1{|X7q3whcF#vAY)6>g=0A za$x~x?`Jws-9x(`X{?E_gQBr!x+I|=6(F5;PJ0rS3Kx&oI{gW!4JQU_rKYv z7{({O72l`ma{-)WjTajgZ%DXNar`gHL4POp*r+)1my2&yjOB;kq@9B`Z(eHWU^_Z; z;E?6?D5ejK>0VKO(mUK%T;3FT9P;S9Dq{l6CM=^hkL4?u5^e9D0si0-P%z zjc-^KPbdFVIaE&8nI^t#9UZ`|q6}Nru)XMQtYg@8k^C=_d`nmISV}&Bmq`ANNS3>j zos@hqo{Z;_gP_ob?OAUNzt<6vyLlevHl3^D*-F>ZIkH1ar7?{* zih@frW&%PZM1)RruR-I2HW=Z`Br(fm*EnXzER*=MsL2=yTo5-TQKMrP$zr^u&4gs) zmZbt#AY}5snfK=X@6By4r>br(r>ag>ovJ!@isn=vxPu*ytUNE=j;V}QK6Ee@ zpzIz58$DG|MQ-VumaS&mIn=YG9K~gt^UxSHVzBYuZ(@A6;W-?d++ks)eBeEH<|9FA z;%hqn;rj^wy}SGh|8AgXLfFNII`}HD3NmP zePw3vCGE0E?VtZBdRly>o31SzPIZD z%Qx}{)txB`9=wTACBbKA5q^#IL8?@{Ws5|06RtSBDG0R&6$1;Y5yF^0(CVFvBA?sG zG92~}jre=8o)5YMylI7duojR&m6$tb@~sxs9!1&E)RkC~74aA^(P+yK$q1YGvUbS<_#eM~kF9zb>P<`P%em@m|)jn+^~S<3qPI+{6UDJwhJUxVT>>C(f9<9lf;#jHP+pHA~D{#@h z{C+4haj@me!h!ON4XOeK^e0g9yGUzweZ2Pki9X7OQ@Sg(s?)0OMh{v+d*M_kyO%I7 z^!Jm5HF-(L?Jjm6t;2TW1N8C$^)NHGy-~HP^jdaGzta0-g8Bdxj>_C4M?OMNjqQ`C zsdB46ccB=$RR&DIFLb_x9jSs$_xYKHCn&S9XCpET z)he^_MOxiuU>1hfZwz1-?59b9Si_s^>CnAqeOE*GhII_z9KgMQ5M>r12F5LfgWIaB zRHC7qoYsaJWe=VT;-U;0EQujqCUN_^fUSCdi+B=a4EUXiwpcH41;X`UFbI8N?q`zc z0-3JJjlJ*_JxBn9KJWl|g*PAjy=PGuYGegb^%-V($7@mSEFZ7D7V`1@|D#ABm#&Ht z^84XfVv$>zi(;&J$3Lq;$rwA;vcg3El$fOHR0gRM)rok=|8XtV1Gk!fdOL%zPm4>v zgC1W?U4EL@K_0MypJ~DyjXFvLvIW!FX%v|u92p_010oK)RI9{1J&m%fJ@TQTk>Z9yg(jnJ8ORwUV}vg3iu9W}wJGt9k+SF`>KDvPX!tCf_IyphExocm{yi zOHmu=mH`CIq#)jxC#__={Yfa$x*d`x{r|;K3ryefo1YdgVBNd!ub;a-iz6bSGvo&SP3;`~Z zL$Ac_nTq24#!5Up>Dzb^Wj6M;RIn?JnSOyz&-I@KmZi`V8S(-lr8&@fIckRXc!6&F zdCv?$0UXDCWwrwa79HMkA&NNOJATp%)T%KUCdIKZw-zFxz{EJJ>%$lE&N&1@@0_RS zxT>a7$xjGd)i(sDw>{-`&-xkqx1Oa!S-kaiqC4G>FGUsbEVV@51ATDme5y=*==}8< z`%l>E)hR*rN*l?3g)kwXI{@8SMX-9uKU0qA4rzyOpH9$4w&}zaitrW4Y=lms7=QDO zA7gE27_&ZOIsZ&~LTrkX4Xr`gV!cgd&-B95w= z8Y)lPfJf1(Jq{Y$D1K#639yJ4PW1U;;E#%ZR0Lxi2f)BksR*XYlJhjOb8#jm=E2E? z3&sa1gGWt_4z3X%=#ZAcYtMI90uYPI66tK}sPlLcc!d1= zdZtC*ChcxPEp+dM)3O2V*ewh3j+&s`pU2_XYOHw%x21EHNmAd74iw=fT!C5ABuRgf zUFYPmoG^Ovn9%tYgT`2iS_ixjKzUeLwi7U7>R@iW(r9WO#Ub2Y#YXjtTNYIL&Ln;5vWXjHjTmeVcnS^ddGb3VU!2rYZ&wQp$uPbz1?8Y0RQ5+g2iSt z+ArIsZ_ziayFJh2mF|0Z@4qCz04d1bcA-0)8%aSgE%A@B2{^2oZB$9@yLw=Y>+SJ3 zz#!N-i84;~4v#Q)%$nqei2CXQ&cYqE&d6+c2{6;uPSsNdS(m6g%1KV?ZCqMU zm9E3TZK&zp?vzoZpGF1 znfv{c65aL^+_gqw395exlK6`=m!1?mfSbt!1RSbU4Uj_n=;=@znugLkct44;0{O~x z%LTzARZ^9>sPh8R!b?+T0j)DNd*467&o%EACUhDBLz{9-U*AE~X8NhqpG2AF3v@E3U?-k# zs?wkk$BHpnGGdUN_#{8Yl%9n9&qa%H<;CS_lQ#YpmA$~z*Av287X1x|ZYN&)P%Df} zHEsz@Q+C>FY=1_5=6ajA&J0ctWhZyh;SwjVcZa2-mPET{pK!pQxX&il;UaFwIW^_K z)U%f@xF%k4l#-I;1oBnim*G;tH{y7?^|3Ce(m{{$sdNW63yG8N_v2d54#x^gt@ppp zw1AgI6LFybPA|EiqQ-GoJCRJMaZ5VW9w%#cFsAQ&}k z`I=BYSB*Vc6L5)rz!Aw#?+8kwQvsBUeh2q4ENR8|7#L%S?zO}rLG zsV){PTwjV9Egycwe_V7o7^PTL)>EG*9mSwKPSZnP*XmGt;UR2b9|<}b=tq6Tvi$yU z1MWTv(6E-obZ2lj*iBh|olFhw{kaSPSBMW5V)d%J!qEPH&ms%V&h2-%{7ZZjrvF*I3kDLEWE+ zAE$eysY6cvN*o-o?capIP4UFfU3z=>c!$%p3Y<(?*z(T3KnY zp&uoi-nI>MsopPv3u?Hws8g2{Q46^=Et-`|%3s)-!I7xj@}kDLg#{2Ija$~l;}B8T zYzVLGMB2Pt;VCeSH0+O}y-Y~3S)icWodkDY{ET6`#t)XgpxqTH?!3W*sjUqSBK(tz`|T`hBTXxY7tPTr(ko(Sm?)e4*YUJiya72K>0N5ldX6OD-P2K%+Edt%H*oB+RU5||JV9d} znuP{-+lKEnJxkky$B4%~hgn&cNJFksLwX^kv0^b$LtEejJn-k~eB}pOzcz{FS-0Ud zvej<+o3Y|7G>kMqyS*$=6_97r;WH+qbhyf(w+YEpC5gb9-#nCa<^oD=LUhkTbbEuj zl=$Cvun`HeZd6(9dMdQ}H|p7qCm~poq@$SlQOe>9ekBjDk7w7J{6K5G26ON1G()S# zw@IPy#WI?wX5$B%joIzwPe*h$&zN^pJNZ*#IhQ@{ArIN%mp%38q)q%(nCZtZ)xc*6 zhXUnIzZysDzrQp?FQr4fX@p@m@cS*}Rl!p~zx}5*$Y4)tb9i|T6-Je5U-Oew^4Xy& zhNnrvb}1v;4lUO%y~ybH3#8j%JTzgG_RGKd4hy-}Qg5svcuBWqx8QQtsD&;y;T70^ z(bTuUQ}b!8_~0^|^?>KiG)o`0^IFXm1UlFiH;3ggz^~Sbn<=YfmU}wg z#oi(vk2;JVrwX~6Fp@nI&O;8#?@3(PH326ZN)erGBzKr>bSdM?<-Fx0%sCTo<+85r zWn3Lx$W@i>ewbF_fi~gp9Y6k38P^WDsKYHq=6xJ&e^vBzgY8Z}*p8PitGnL+d$8-l zmP#w)c)LR#Z|S7PDrJ}|KM-T6DzLU8_hr1GU-(Tu6Q;(C+tP4J9A(Dw5JJVPNO{Qx8i#cAr%Q0Ox?(dvw%1{~ z`2^TR!1J#*X-}Hv95$kJz8QGUxKisJGfX_E)cREuu78lvB2a^|IN%++ayfW`LN#kN z$cN}v@*z~Epmz_9&8YwMsG2$GE#zort=I-!B~MaXGiW~XH|RyP-}w$;)P-s7UKdA)Vi^v znp3FeZ9Z{u;HBhKD;1{gZI4idU%z-uQPP27mkv8>GPJVe1fz!N4sAhBq>>89QLTI8 zQHL%o-fdrfqeIyVIY~379#dj|yajW!N9^W3pvdRE>gEjgswJyfF^6M`o!lq154B zrQ+Yl?iBS7w(O-0N*YCoGH50JUoi?BnkrM%b7hxlB}k~m4fQYRRqL%z_^XM$WCL=myBg&EYQSV^&3EM~8iE_^)%FpF zO~Ao!1;1?QTG&gTv4U=W4_o0MbzX+g(zljV(5}F=No%ZJiIH253m@34myAfZZKGG2 zY86|PVl(bIjJstqC_Ni4?V_4`Uh#f$)hT`L%j5QE-uKxoCv3(ECx8^vS8!%#uh>W4 zR_V}bQssAtzxVc&JNtWZrH9PgFPyjpQ2e<0!y$(IBilX}(qHo1`Fx%zE zibe1Z(9s$za5e*V*3DMFl!S>P<<2C7-WOD!mt^?KkqZOPC+X7ZG~FI5iRHA&M(GH0P!9jN&*c44zdRO@_4I(xHr;XP@g^j1C#KOFB76ZI z;{@Z53JuzzNTTJMrRq3i^Bz=M9zm5MX~U?Nxb92w3Nb+XOM1K-dN|82M@>-Xctx4Sk+vEi z->dtkYDto#1q;k_{9SCyLbrU|m>HxC;+;}6E+HMt+53Q>aE)8_@%i41K)b0LRMoUc zFy+&W9JG`?=@kJrcU<+8t~P&+iIT3K&I^!qf9#BOxA{pImk2N}PP-R|QHt%R#N0iU zHrh&5QG)bqtU$e#Ku$&DI@0h&nz{TjEM8%9epO;MJ0z+hFzQ*t-)47U)2Aa>@I^8HF)~KC&o^Kk*n}gzCNv-K!F*D4^wx zaph}B_Sbhx_7SY4SAIB#A5eZgHR_TMRv!Zu!Z$=5riQ#{aYw2i^}U z-JEes7r5B_<)zp}zZ{T0|4SucC!!V=W#yK*DqZHd) zjp=m(5B;HS#iGB*kPVJ&E4y9WK1EfeG#cynXMxNKF zvr9ihdu+zuX**q$Z7~Tq;lF|SFAo11y_c+_WVie%9X38z=QG))24A>MI_L|Q4*9gw zVX6LIh!XWzI0o(%CXUD1l#o0gZ_5^L98d5n;Qr%ry$x;9h=d!)lVI#UEjxuiEyEQQ zk~r&&Lg`WB3wsZ_H=oWX$xuWF+k03IC=`-W+P^v|WC1WxP1je%#iYN`kZwA$`SqMRUA740FOalGbmwuGfK1Q{n zc&Oz%`Pf3Ws9#x#bcQq_uV08dbX(R_vDONzH^45T?lfr)mk(cpI%}Qr*)Wn~oC$lW zECkNql$Z%a*h156dgoXr&WPWkRW0ouSZApdQz#c;t!Nd-TpKH(d0_yJn#K$9vq-;5 z2#8d)IC8_CHA77}?QN%DI!&_gA$auWsuDA4FdhDSKxX7d5ptB=a!}6&bw9j;4jkz$ zo`yv~7mt?4Bb|`iT%cYJ0rXSc#X>q*k0a zR_#Pir{V{pObSnxb|ZWB`%tdlUoHvS&@wQ;|Ljm%efDrOK(A;#qa>JRqN^{ z@mBfR_XS{X(G zEJ09ftb9;InZ;Gh=@QA=h26YY^b3={SAt+_i+ip+*3cAK5lP?L5@9-HrhXfYm3WwS zFO;%!6-G`xElbNEN@w{#x&<%Ps>M}|4pjZ;5`VedSvM%p{SJp*g=uNRRckX+&wS`J z?ce_C&qR!}*I2LGS65I(T0SPYHw=l6zp4Ps(Hm(CxC{BL$G>$h{nYXWW)#s92T~Ml z(ouPB2-iS*32#T>h1h~bq+;o2K71C-w+rus(lD;NjJJ_r(HkH9nxf5e_d7r>l4F+={u>fhHB$%zD)mZTaVY}YY?r)2S%-G{IuI;#}t`~pj1=%<2*i1u-84=Hp z8Hl$iF>hZ_JEdj!;rd%2)Fwp*V=o4!Q@weB%7pT~Si@DQ)(tR4YMFqynPN8g(`;T+ zvv~+o)ra9~=Ckp*;^J7b8%L53IuWJaRT*^ncUC#fRGa&3uj7Q`&Hk9GU8>w?Gd^C6 znuQbOSKVD|J+3QZToIFFtB5bBo@xzt$$F9Q_o9qU0%qAtM~eM;$O$_ZrulXuGCZx| z#o+~#Cc+pz=;g>oZBuy8axdl{_}>(PU1-T=4{7J?)1zQ2Fh#}3fElKi%JV{mtN=z; zN%W8ega=;po?o|}wN96sfGW6}=^NxDC0#Bd$;EsLX$Gzu9ivCqu=-|G;rlcR?~9NR z8(2^Gp%Y2K$u3zvLQjgwXMz}ISn)*2_xJJPL6)hBpDk9;eBxG6>@}MM=hNAtPpQQr zeV1lwgqpa%r2Pg#+X7%R$G4>yDi2E@Ask7wd?++JByF0dUZ}SxCkb`$&Ox6Gfi-(~ zIHlV|4(Xzt-_1W4w$vLdpQVPY#!5OXubDLl#k{7U(>T zrSG`2COZh1fZr+hXR@M^&K*=SpsjUXp!M{84ALlH|2$@RbcnoSfuf`*er1=E(`xkN zoHc`zav5{tPM7rY4!i@fQ7)+KVv%_Ad=z5G)#_>CR3ZXzJN|Gk&TG#aU}}sDJnp4$ z`})gq3$WN&dt>)}+F|b1i{%a@D97rsoMYOgN=p>=^2f4{dnrG2UXLFz_f9* z^Fd!2gmvh_SkX

f_RAvc{Lx!F?rl*ZN|?rZFt{nbhwQ z_+67+o?7{l7_tr1@)>OxPWGuCL}1bqgh*h{4E(Gh6Cd4K*yVt5yg*U5^`!GODQGQB z#;P>x9W+iH9Ox!O=8V8;bTgesOD#2b=Xt&ean$clqj11%#-o zsqyNC{D~0foOrj?@5>^(nslxRCn&;jR4kjjzaz(^uLYjSU;v6apzMcv%*S{@aF+)6 zCGP8s%PL!`1R|3$&#!CN)i`7I`BiJ;-=N&*KG}n1SjAS&C@Z)M`RG$su@0_p&YAm> zqsF06tI5*om(6lYdr_xWO}}3kAt^xzS!?5LTRQMF>AL7$w(1FnO(rpHwI)r{I;yn3 z5bNqO4sVzOS*EH_b{eRTkh*{r>|?(bM%pYN`%|(TonP23XO{J{NxOM)3`oPv8u6@c z2i-hvo`+3!O*|^Hfhwp<#uIlL*a;w)Le+HRphpi$Lu$zyRx`=;$OM(!L1u@Y^^1>1 zi54a1<5;A%HC)+Vv-~BL5R_~fYD;?<((`$|SF|EtBYDF#MLB5sR!n3P1^X2x=6Eml zI3DUVrybRHbjsaMZN5;t=VOsk00n$0F_4Yb2G+$xv2@O(u3%v13Q}wGwdug7RB4S{gYt*siZdjf zUp2u{9dzeVtk#RGCxoH8jw-q^a2^XP35U>RG>yiK|D?-In&3E!?|XL{YL(n;t4C}|-GOzMHM-u!uyFY z8Z*(IXCk#GPp{_Uj6;ff`d7$YeJCc%n;yZa@y4)K)U96Zl_nXzjfz}94|k$(#f-J! z3R0@{*Eh%8lSc{()mq^7$L(m1O}9j9x@O$;v^vI!L>SCUWDE^P=colvsa8H0MER8IR48-IDDf|L-5DD{AtD#JIM<6> z=wK!>8FDC}$;ZC!JmgT$%JWxSAs8X^e48;;ODE5x>4DG9xPYC6#bF1YAPH|0NWx1} z^Vp^0*=f=Mr$qIp(cR}{Tvl-)N2=LI*{tY}7uBB5L9~qWg2!M4t_3zhcY=v;&>J*o z(w+Gq;{8j#&WzD1yD-~tBF1N$8>0=5sFZXJ;uw{#KZ ze`HgRerzn~=nu=czukq`RoT4JU|ShXm0HjM-MR`e0|V%O^5IP&$lZ5Kv)qnqxo>qS zd-1;%nL8VsNTU!Wzm&%#cUIk;?st7Ok4efop>rB_P(GTfVBfa7{iOF->^yjqbP~t< zq4N10b~>{$M;-I8QD82Ao=q3rGcN4B1hgU^P-3=4Gwqf=m6)I&biR(^<*FRyTz!LK zn7VG0M(B5bmsW_CAI(uWPvn9e|6kqJ7b{W$w4OX zVdz8$eTTE;PRkyuf0$m^qn;Eu+f{w}s1d#gy%mxQuv|C*98oGgx&4VaPA1vyMP%AU z=z8A6ZZqq6s+>v=(o4xLSA;)fStyN=F({5WC=Q!7IZ+JCmk#+R8@K54>plaHVOM^5 zL%z*2+2rYlp!@wH`8M6;Xx|XD_4HhiAol(~=-AsAZQNQ%mG+y2&U%WBj za!3eupwL~s!gFt|c!A&L=2y7>FgWz7^)_pj2J5vt>pMSvh35%IqokOGWnInG>(`3s z9m>8m%RWJ$93}pc9OX3H>wuwarvNoTpP2Wo$ypU0??ie?N7d3<@v+XtrgY|@i}QtuXzTwQ`(>l1y`}vDM47|;Q=SpE|l|U;#yxr=a((79ZS!0 zCEdNtI)hJSy>v^32w_Yr(45DV@dfxm9z}XzGEn)K4&T`ELSOE+fpXK$ctTc+If=7< zDSE%WV65t^E#n;`+R#ZvQe?6nIlQoLR5qzy>U1W#;Mzb`uacbA$p;$3lG_234gvdI z8&Liz+?i?Lwlvl%64%*LC8Y&F9bU(qTup$IZRAT$u!z%5U->9W=S?}IO{{8%~ ze>UOmZ1C*n@Fa(=9BQK(?9E{khYk+2ITSct!r^Z?e3rx4INZ)*BZr@Ic$UMf9QKT1 z@J0@A%PdWUW!}Adhzr)9Lb@B!?_%makz@Z^&D>Iu%5$a4*$yGRSr$D490Ufn!`yP z-o;@Nhs!v8n8OVmzQ*Bp4i9qpIfvhKsEy<4a(F$5qdAf|6qD zK@@W47P-J%822~uIye0~48AgZyYMA$S26WHv^3XK=oW^#7pdubQUUo4h7}}iqlnUa)`^y$BeqhPcWy|UIIzAq;SSVcJGP^vU5|5dXNM0dX z&Z(K1%#}K2rcJpcz)I{>(`{)}+FYjJk~C^`WSFhkoa1&E73Ss$g;3Q6Ii=J^+lZ12LYn7_ z^T2LiR3dr;aUEt(6U^XsK}o3qd7bZq*fBdESE*P8JYkHmb_rdeDf z&MPpNx^r?}w77~&AlY^W7Fb>*I+T|`?=Dt()3aE43k865NpY@g*e@@Sz;u!@9gGce zY)d4M<3BPPzl+7R$7qj6fh)(&VnTnn{!BjaFD&U$cWvQr=`viYkoPm;ZpLtK5lUcT zp+^vNirOj(Ym<6Jf1|sM|DKX!?0SboVPOwUJ4Ju|BgVAPH|+zlzDvNK=UP~p>rzXR z`RC>2Dsw~o0m{MB32d{fzgs)_TL2_jC=@{do`)1MKQIjX@49?=pu8L*r!5KkL^4w7 z*co_S_ld4jOcW_-I&b`tIl<*wP*{uuOd-+$HUqI(EX6{-Kj)v=6+nKH#&nq0p1TgZ<$S_D4F{*LJW!+QA-NUcRb) zML7(Vx>e5)Cnc30DUm5Vz z{=%Oc*8Hz7{{I2bwRKwX-%SCUw%;#(+EIX}?Wg^Pzcvc^M}L1W|M-iBU!X1U+b_;C z&v$$KFU@aTzB{^T+D!+`SFH3_RIYk(byc;rrsg*fJ^aYpM<09qiQhi?)YH#A``q*E z*1xdfcN<^){U0{H^ztjO{_(ZfH~+^QZ@%^RmaW^~dG}A--`nx$+Pa;)cJHa*+pur{ zfrEz{4>!I4!I7iKK0JQnFDF0x_>)ghHGlT`7hj(K>Wtj-weRdVfBm-gyYK(@!@2Vp zE?)Zar^{EaD*x~VsOt&NFPZ@TtMmV_PXE7r0^0TW{}JWyaEx8BU~H+nOhNMCxyhUk zj~NY%;Gyp6>BIB#hBHe>Iw7`n=HKqhg*l?jqlTYSvap?fD$K~xn(1;2>Ia)RPb?J( znIsm`_$C1lj?m`z6yh31dX6WzfQO&xn(Glc???US6jLjti)mr}7&pd=@nKvLei6on z@nCoiLo#y&(UX@$DA&ji(3SojIj~Ef;6C86|Gf z?RRHxEIN`7G3U&4O(-d2A!lT!P9HULnBD1Q{s9j_2e1O<07pO-F{b4QMFJ%Q1q9^; z#Ra7Xg$HE_MF}N}1q)Bg)G1SEWW|$VF#krox*j!bE{z7<7vxbmho`p)W-|+>my`%y z4!rFiP5%heUkE4t^TJ5~tWeT_w1M;=*}FNmsb_86fFKe%`e72OSwn&$|Ch%c ziA47S;NF+IYhuGlEQF7R@Uaj+c4Tx@_ga%1m&{sY2szo4kZ~azf_5~&){Bq?YKO>< zItbaF*518uFzE~K(co^#o7DcBK}!r-)7!-xXAUOaG?Ph4Yf!V!txZBaleC0H^$j9@ z=f>9dbjM^zClRtHkts4?5=Tf{Z{X2C<7E&RM&d>rN!;|9)*j7KO~%?tcSLr0h9+1` zf<4+KO|+IozhO$E_K{#W>WOi5Ffon{cSrRNBYpFXr0?i%q^~EowP!QSyPDP)g9$mC zKu8%+D>O_`!bXRZu<5~mKU;5vdIR&*pE0P>YlwaVKyw5!=S2~77VrxYzuD8bmDNnN zTVo0)CLx5F01wm1h+0jkmV}NBO47ta`RBo#6#{h;jCJ9T8xl@>jm{&zGBo(XsnvvON!ZBXq$tEWFBEV#5YzOCS~bqekk?)C zZsBDVh4Ji;fVjdTt}uVSpnsH~53xhv1n*()zcGc7dvR}6ty5<~262T#TwtDVa%+r0 z4|(B07h%Nc33qEEv?M|kMdIQ^NcX(ANcYiilJ1(#B%HS+H_RiWXq+KfHhx;z0sVQe zDTIvX>BbF!vKkHiny0PSFnqGVoS=*ZfKaY+fD4qBKMzBv6LMyHTU=3`e*JVelaNF3 zrmNp6KEZx`u&k?R5%M^^`P|RTV16IoRce?XdeQ^(&|{?0A7L*hWY^w^@F_h z8yVN!s|nglARSGIvY~m7ggirg$bz~C_c#yuGiZomLI7Qk45lNLCPYg@G|#X;1oO~6 z7--K#y1&uQ9hn`G!Qu~v_zg7vDB72WQnQNh1rgvvLI!-nX>d5;I{H3cKTW=_v;M=} z2g;~V80nMOjr18EN%~Ch)yitd=#TTJWrW-f?-U+qR8%mD8XZBRrejHlWvl*fUrvY@ z-dn#2Y50`AYSp|Y`@;dPf*(q+ z-L$0J$S^h@OxGs;y}W<;1kl89+w!jI8Af_S9(qE2Jw4rFv|ht%LD$U0XTE^#FR<$;WWQ$C&OsZ_p?D z$1~ceK>LDzF)q*Fhx_}K`5Ot5;B~3>Nd0$XGzxeCZMN&HYhEPeO?a1a|D(Zt`uBu9 zABfjnhF1dG2ZyJ|r9?x|8QB`%9NH988|2n!>yp%ZbgQ_pF&c=nW>fF}tn5`L>aezK02EQsd~nziDmjZ`$f#6Qm_Uqcud+H+NS-vr$KPbtZB`6U26 z`dK-J!o(6!W?}KXA{U!+k|#(Cm0#fAVDk8uF4H9hMC!;X&MSg>`Zy(CX8a!o8O za!tuu-~!(tk{I9IOcxVz>{(rj#sL00Eta#gP2-y6HmEjNen8AwtSKcTmc(rs zW2TVD9H9rs7!docMQ#@v$G+xx1ksICZyTv4c2|*0xCU*DK1u7P%NzssfL)iLo3v@AcGp~S-aMBl12T^lxejwTlWn20OcL@W zx;aZq=8Nu$d{Y%F0M|nv!7nK}Zb9@QO$e?sft=Cs^#i*7Mab{94p)wQqQ?bgv4NUx zMMWjKo{o0(Hom`7IB4EmO7Kjy8(MMXa*`3||i@)hxP;ng+SP4gE7z$us&{P&0N}F zMON!)73R583UWMICF!_hJYkXGBD*?|2dMpJTJDhRfYlyCHd0sC7NK?Prim`kq70XZ zdMVCj1P!HnFV;y`VeWiR;jdmxg-~Fbl(Oj(OjaSZ(^5+FU?MNkbf&vlVOFvh#o9X5 z@^1s|&`1H36exMIv;f0T5cBh09-#bYturMZvOu#0r5>mA=R2!JEe!H`pfAX`m9;js zVe5l%DeYarPYb12Dty5jBsq)pfvKxxMP6a$2Q^HHoum|%l=7a0Jj^JA<8LF+1mtF_ zD7Zxd^Z0Z-U$aOUw#$G%VlnR#F;N@IB+%iwb3878ZfCZ40jxhk90TflW{#&2g%fOK za_aOcsm@U&hvgL&L7%Rh4)jb3mz-o_@}}l9`wiN*6++A(AqUjH$|gWUb49^bY9s&U zPjf1h!|G^nw@YIB`|%*pt@*pY+WXi3C;b2W`SyUicuA5|3R z5GL>HZ;L-Ld+XmA&qki!AGrHgj$b4H zew=@g4Pj-WmRVrAcdUn>d;Zz}|Fhx$tKt$BHr z+tsOW0=Gx0{x33ncW!Uu_8#26p4(%&y@1=}xZTR_y}8}M?S0hvE--svZr{Z1{keTL zw-4ZUGq;<$T|Uq3YP)Pb$L!au<;Lx0Dn8t<$~`4<`(ibIZoka!vD~f}wt?G|pZ@1U zoIl_^U_D`V({U+6rI+t{yUYk;bl~LB!J(Z)D~IDaOy)3&!vqe^9GW;J9R8qZQ0DMU z4x2grn8Ons9_6r!!-E_)aJZYpS`N2!xQ)Zj9Iof^F%H*sh`)lvB^(MI7I2u&VFrg* z4wE??&0zwECJqUQq5AgiS#6KQI@E`ix9g$_{~WlSKWcxWrm5nh&M(!c+|9nVe#iQO zjLaoK1Hkr*mpkEYT6nwi-{8e<%_MlI zz`H=x7B7YyOW0iYenQW-khkE)d%C`d*93lt!a+W8)49pW`KqmLS6-T6Tola z-Hu@cV3_;3OCjH-gy- zu(S`uK>&D!yB`Ip>C4P|fOqv}e&zu5a&ra1J=~8S2FyPUU}lsZ*fW6nX#n^w%BVy@ zUI0E01LYF%^CZ9<210)gjU^jkXgmuW0k9h0$H2S>;GjW-JPYQF00-T`{3HO(;pRMm zi@EtRfP3M670e9)HG`q7x&i(G-{j`E0NyqP#sTnC2JqAn7PcAS{fRLCpgX|oM20`g zU<@5fNHmy}0BWF*n1JB-Cs0q_{S4sbsKaOQ9rBSJM~Ho)=FY0Lq4 zE5M=Sp-;s)0p^cq<>LnU_-%k2xIYQ7-|dhW2wMPf_3aEFgqye-;a_iO>9zu#V`XU} zJO%G=q$_~9M}+1AfUP!8R{)1jfN>RZ0N4!gm*^khoxpsTLA}fY_`4Jq|3-jM+96$t zeISJsKsVv=t0NtQ?qBkzH3A{^Q~z|4DCT3G;}xQB&( z65w;$gv5iN^#HeKGe6q^wq`RND9mAIgumwIW`Nht1)6}c@c{3DcL|ss0Q2UucnSdC zlE=z658$zUXlvl772u$GP^Mr`0yuXbZ)*TwoX2SoU@bQz{I-DAX)C}#-wXMLu(bfU z%!hsr>U0~xdlx{xfVl|ZHh7cJ9pL<87$3k~j{CQ$n-0p1-PM<)$c}t_Y2Hi2C%ybyc_t52Kb!FXmUNko(sVbxW@uq zxD?6(%w+&yS_b(9^Q!>=yd26M%(Va)mqT76p}hl4^gC1!WCp zJ-}iK?=^=u4)7AZ&w|^DSuL4~E6x0j2BW!(&_sIZnd77E+08hiKhj?Uw z_dW;pi*yd~+2@!agtMP#X(4p4gZ2exgnwAa`+tDj*8^RFJHnwGpv^-0TLFH%fzewl zz-NC4c?LfS%^O+#2f@Y;H!*Q;{on@mC-{3z@PpI^#y(|11x$SXamd$AJ`1_1?CEX3;zS~ z0dpC^>06*51alU^PqwgnYzBC4D>GjNxam)TGx$N+YdfR2Sb*K$W8cR z*B+o_@E;4Xx*o~_;?C12^iNo;0Iy- zQJzPDPaFgM!Tcn^Q?<7R|!ax=<+f5y!SQAQhaLx}Rv=#CKOXwe4{fZ(r1=joPG_UwZ<@qPQDF!nlJJX0 zg?L`5KU2K>pF|Sme&i9 z*UD?;@tb6x$hQh`UDTWWttwpezd!N#XXW+6v#E=k6u|grP0YXK457}yXrf$;OYm#rUj5Sf zui5ySdpF|x?K?FE5c{4qHIGM##%u1ry=fyx>i1t&b&5`0@7AW|Gx6^ll}(t11O^Se za6LaQU;j0Csf@CZ=&MM_HA$ad-`$_N;|uGB>^sLmIIMc7=BvJR5C899{9kmXIGm}8 zN0;bkzCXGC+Cy$Va}3B_k8%O#b9;=Jhm1KP%s>wF zPu#BsC-4r_(>-y2RWQCT{>?#sn6AJa)aMp+#;Q;k^Gw|Tli-AbbnCr@X`#v|+rC)~ zj;4xkAwKl0`1(#5BIHTeKBCRv^${IE1HT5pIQ6|0QLl;5{u9u0jJn|@7Np&hIBxuN^!w`?gk$W4ChBW1+_LQpGR!x3Vay#>;_!&!I8-ehhs?IlTWT-dw2gC__>*lES#9K)TdUuW z_Hld{pNZD9?P}Z)ycMmt+l@Xf4jbS0A6dWj$v2N1A~>9;1(7Ckg}>8le;7RTDJ^(z zy&jCT8o{?WBn2n#PX^9tfen9S2JgA8D)^R`KXW$^yHZU{CNn-Nn~0zYm<-WyP6 zCCXN#j;i44wLk0qKUJqaUWU*PbqIZIzf08b*F;~D@JAXv;uQK8TBwWqbz;tPk0+YZ z=-HdGPB@l(1nvdz#qx#1tiZM6o#uq&XC#YyUe_my`XY}%QZ2Mo`wdZFnQp!bl33q? zYa`~|<9YR#%ke8R{gI+Zf27gVbIa}cRSW&pLd?%P{o3Uq**Tsh^XY}@RZm}@Q~mUn z^H)AyB=o>!nI!S_x^(U7+jI1%KRe%edOhB;{JM)MFRoqAHdyaEQM}x<3-`Nt?^*7- z3-@>NzJT}XxKID@_MLx#t*hu{&p5}_!2M>7=@Y28XpT6%9zTz#5%qgAo6@^u&7<(F!Q<9gg0UygIp$(`dIUn6Pi`1WIbi-d;u%v*T9oY#}v$BRyG z8()v-Mvu6K*V}RBcs+sfnvJmr{D(Ql9BYi_VU9b;-!98B=2&ygIrjEgKY_7kJL|1B zS^pCl^CCa`h@WQ{(snV;v%CnjVLg7HyO4Gl(+ZXsd64FjX_yO<{$Cxl=zi@mY4+*0 zI`H4XI!MBLNXEKI2^I-6GHi&*Y2f->h88+w=%KTQ5juunN;JBC$jA;28##E+4IMY~ zLTjwf47IYXWPHbqKr6Y!f){KXT@xdVYJuO=$B*w0#3$SP59F zgXA56E%0vmqbHg7u1goCucLl5Nvzmyt(7OPGPgGLSDyMg@M+gZ^A@eQ?eh!8m6t8l zMCnte2t4)116xVoc5Qrh^4$~BXc^ue9?-=`yPs#=|dRNqt!Md0|B5 z5s_#;+qnaI|A4+j7(5a`XPBSz&1q_WI5(#1-<#}TI%wRkyV$QKs$X$)v+J%`C)4eD zX_E8evF7DkH81I+?kUg>!pU}@N>XD!IY;R46FFvibu>CTN27pq_NJlwD?9(Io9F33(B-amG7*`qrsyREe3tvSEgxOGX2dAJg?Ri!>> zY`8v+dL)BAttK)y!EGgI>2U_M`r-()@q@;PV7hyEAi zH!c0I-41ZQ7{3mtGhY(&CI5d9&!yn7=l(z2?j_r^>bYe3_u9^XcYNNZ-~ZWq{;TsT zWnW#&6Nlq*AM3Eb0XSa-niiklWT^BeRpwL+ct5TIuB$s=$319rJnX}u4@i@1+4Gis zA6TzXU3-^WW0&f4{Ce*E#iM->{AR~bHs0~+RbM^!?ZG#!bcZIM5u1u9`R&Eo?r|`w zGNeB$v{hlypVD3-PC9bUh$j4XLaThmgX_iAs&OTQ|0s9{a>TLOdhoS;Blt&mQt&O% z)YFt3Apehm_d}bC7{JeCmfY|f9s$O$@KRdLCOz4 zy}x1f&yu zM|IJ5F2ASHt%dZ2d#c^Y%%`{G2jjAdU;C~H_{+X2gvkssM;JH$BjFq5oCvab^q3>bQ zhBZ=O3B4XV^WjR(HCBT)%r;z`G6GDWsjl8+e_b)&E!JFzYLHgbytsT2>0Dz&$eT4^ zbYmTPds4)bBD7~B-JL4BS+6#b5jciCMOa%*&(%Z@;6F0F-W3?ac)fj@=pMm+_JF60 z&)Yoe*$ManBVfuNgX~%_;RhZk&0Te0(%cWxDm_H}#cm#9l zAPg^vHrjw(r`+XEz|oApzqWo>;Q0D1^erVYyb|@G%sQ;?k(I#lB!Th&nZz~7`}NcE zVmv<1yvTC`X&mbsYpiS0Z`oIrg^X2SGyH0Kty3K4vygL{65zZ&Y0YEt#H-~Jr!gK$ z7=z=0Bi2q{ARp`EG_G7DevEr2o;P#+k?$<}{36EdW185*xncjGO|j;!X;y$V@VSd> z-u{{NF5e83hK=jlX^swa8x)1WM3U$x9V3mHgK;cfBmy4LG~jz%2H@SZPy{w$t?c@$ zIqtxF-uu5Q#*=KE>6vlbr#u)c^L-%V0*XBB`x&Vec6Ut zn+=%rLSMCDz7H@DO8SvEg?{;_9EK63T>vPiZzdX#T>8EnBSF<-*w2T zWu#pVde@pP)*QMRE#r9Z0{wX*$sVr^**59V?Lu_V)b290%Qo)>pXE5^qRk(m>}K?J zXy3A~fx9yTx1#JLn;YH%j_kB$fMXBF_#p5oKV;J(@?ws=$DWU>^uVHvg4`rKS(8)l@`RMky?@zRo{m`-_YWwzAivmUnf?>3#edaA_a}2icMw;| z6W)wm(VZ{wwn|Ee{+< z-Mj33`28qHU0GiZ@)_Bp`)f?c4?LnwSa6=UWTzoKe_x|*JJ#Q=@;TNYJN@TKZ^!Ro z4(;m$aeVG4!82(hV%yQ#r>|IjDu(`@i|4&7MFrPSHqs!2oa}V13cHgBIejAatALF|Wp7=3J+1g)rQ2eh0PTlOP?Xi$hWY*>bG$HaPC2WM!3z| zR2(SIRck{&4-^M3&sBNYRtD)Cbr0ktjVr->7wCwqLOEI?nSQpP(W9a~nxF>oBi5KxSC%&A_2V7wJ5{qVGZI=;uKa#6(`1h#SlR&rR ze8<%z`A^1;(q0U@@+@_Me*&E%>|BE$%-@gkOq^@fdv?UvW!Lcr)&}068p`hZR0 zFprjKj)Su7FyK#9Wj%54hrq)o^9)SQGrGtOkAattWSbG!Cg;IXl&R622OV14LFWtR zR?63%nz+rOZP@|6F*0fthd9=dzd@(>PvR%-&`Y0q_3Cde7Gjxos3 z?B=-M40G+d`ir}2vHmKt{-{IR>yJ8k%~t?dg=h;@Um@-@MH}_5=7nasMi&LenqxKOy*AK|dhmq;=z*=& z`$PiGS*1zYBC;*TjC|O-|2lAg{f0Y-JjvVU3iDgqB;SU98n+goacJpWOV5-Qr3bQ$ zFn9R5wcN34v`LwEBV^h>@WH_kRe^U>ma2Tk4?fwU=Z-Ccu0lAJjJ9v8e2~~qm2BtH zvZfi^dFH>;4*dy+Aj?v&Bre!~0(QGXqkJ2aU99}!A;S#E=a=|bvP$7!Y7GCT>GO+- zw~8*DGmOy4XU*UkWzWmZ$T;S84C~dU%{|nsE1K$TH@B8)bGt^DR#ntwio?FfTc7zsU1`@~iWzQLSv>Y| zil`rSsr!Yz&oaX!$)a>{mMP^c561Jj*NiM&S==>jq=iVEJ~STP-k3bTg0%2X@D~UA zUouM+5cdX%duOX6pdEdUPs|SN{~OR=@=K%<2Fgj4nK&QRM}~}o5alGcyAaQ(L5DoD zt?bZzw8Qjc$YY=l>e8<-G$XI&nUNyo@kJFqoQr(y*BHvO&$QvN-@biN5zb)%`-;k7kor`W~ z|5z8tfc5m~&eju#(|de8TCaHE{@%A2nUR_FA+GOuy7xOVRhCLc`%lHC0nfY7&mc!l z(rqgr)?@b{M2rW|#20r%=JqFvzR@I60JAys_#f`6pV|2-GudUH!?;R$3FRouL9Wg6-6z6l zkd`gT!!7uxwj+5e+u#}(^R2pzR3B*n^T>J04b8|O;^a8VGY7KBGoLB0ij4usUCb3> zcam7beM~-QV;*c+n9qiLR~+0PY10rn$s(rH&LoGPMtzN(3)IiO8Cmb{So^dS_zG2h ziE?NhUwcUmT(4l)3|W?Y3ffzn>SX@`7j&POYCiE%Sr25f%-T=P4kyAFTVF3Iev?f; z6T_LKpZsX}C}=X<%RzgDHMhtJ!J?4NA!nfc0(?sX$6^cwitaYGLs13x1kX>wm=Iy@2wb#dzQ0`vSilsjuAQ_ifv zZUJp&Qhy7dolpCPzpkFRqibE2N#fa@%$^;mfe+PK`?aFK!U>wZQLgFSL!b?(T$p3j zTTy~~YLZkvuc00@N%4Z3RDWF%?|V~3#d9tZFbvV>Lp>Pq(qX{f1DG1K>dzkoZ7xPS zZTcni`^#%-pTzqG3utHQuW-MhcqDDDoOiq2!VA&*&NP3W4{cyf178AcBYJ;DF~@&RkigHO=O`>KWf{n#Ff3XMDFiL)1gpKXMjx&VECeFXdjvE9n20Xmk(L z+@qq6dzEPzzn%gmZ`xYpB+TdmVLj2H%RSTn{-fEzY!{|dOyKn|i#y#;x<2$dK5ZXfOa zQOvI&^371zt>@Qc3}ju9laA}Et^?;{b^QbC@)w$sevDHmWX=70zRVLm%RKoq&o<;C z-?Z!5Z`HHqOst+qkY`Jw1VC%VU}ho_1N<%xSRSCD^c``qIrFS7DB;$127+WA_od_H9hqD?$U z^4Lwvwz8rsBS8M1hu=ojQ|R;`sX#uPzcuc|Tr5y^1TWsSEtF?&J=#({K5}34cx_SP z&c(T?+X)>Hv>o$W-ws~72W#jR?jx;-se8*!yU<|uOQ zRQmu^<*LuSMR)UMN(Lcc%(h?#?>q^;Dbm>D8~+^g@V*)MA@EDjfC!kFyA6Pcu>9&` zw5%WRufVvxnxgCziE@ja_W>m%h<@69+_CiG>FG*dRyIJ;VbEhE)CV2WgZ1(!%Re#0 z+8^*kw*9k8llER)j-6_6w`Hc2Tiu#AMq2{+R6mV*?bOs-<#^7OdPj9+*?7lM&Tof4 z=M>gheWzX>>ChcxNRzq+Wo^Q6(oI?=LiZqVwq*zOqx><{`&fz|*{17}WtNTn5A$rB z^uQFGG~sM;h&IY<4e6rohJst}BcE+3Rs6OXx`p%W+L{v!XtQ>;P|r@X?2Wc9Ws;s; zTTPm<$JwX_fd5A*FFCHNjyNW&j?xC24nE?WFS64w7ZHqK9rUM=qg>gKJijsT+eOAb1~8!mz$9^ z(j{EUubgOuK73oC!#Mv&gk4ClNyZ#p9y`16Zt!MU@MfUQED3K$=%c{tIGE4($HDwj z)J2#VJAS#N`75(`QfDj%Y%aik3$8sD+?~0zB-~e7aHl80Jp#Cc?*R8qa>H533-q-h zKCA%D#989RhoQTHmu5j)1uBt(oMhcs&92cdQc?kOlgRFE@j}?}*?$i&i@RwkkZR z^lIo1vjff&GuRvw!EDm&BGKIh+R~_lPt|}Hf~Gic0R3@^$iEkH|HX_nRg1u1aNmsk z;^4|~uW+nzXzrz6()pkfZdoVywL;VNj~4*17Cgi80F2(#(e2TdS%>X?s~qmff{%X@ zbKnC_%f;FoLOu=Y2S8(5zEc&Xt(keR(g>3oS*_7lYeu~IjV=NYi0Z-UY7vg^Pa2P| zOddahwxat*dvpWRj%pRrN<9)?sYga`)+1xj8Nukbq%d$n(z2nI)sdrx^ouYnn1^^2H{Zp3hUE46fKpK(CmXPOW4b6OJgGst{CEAOA?fj%w(4a(KlRB9P5ja>H&`pcQO z8SBN1d<_Fi=JQUxTF(3aD0B(DYe4;1Wp?iH<@T3%E)ddZhOk`?xY7aBzicrhNMC#4 zfUmsrF|7@Hbp3Y$XZn1Ze{J(`efI{V`70*#3~SO4CEWqo9FTADoHnO(M=$z#C)TJ_ z&O?7i3+32c_9@-_y;JV;H_*2&R@+nU3qOh3mNA!SA@^?s4S8j*+RNMqoVy2W0D45Y z8hnCsDEH-~;3)$Ad;BuF-yEh)i*eaAh;n|Ek#?OeN}pjF?m5sGiTg=gW{F5V?Y8BW zTQS%7pf0&*In6E{vx5_^#^u!!Pm1VEO0o86Q!rm>r!yJ4-Q71xn$diBQn=D7+IG!S zI(p7PN}!`oggdSg;oH$R@&sDEX1E#foJb#EaYxEPMdv0X6LfKHWwX{s-Lw;Ol5>+d zym;<|M<2-&fjgU9o+sQHg!>xMri_dg^~JZQS$hSRmRUN7Xyi#GK;V z@0J%k9r9e4JV#*L)f}Sifw?hRdBt3**Js7s=V?pmcqpaB_fTp{hptt0)M*uE7Vmu# z^<0blo}lvSYC58PkTB2Ny-06?jxb`l4uQUI^=huJ)kPxEnk6E4Y-)J^j^!f!b1}Z$ zx6}-uFw$4I;Mu8NwzPSv2y=gubgJV6B3x+IPn>T$CjBGxFIBG(^^!LGP>#IG_W?6p z0-3WJ&toV@*tqX!Sn$ub_ix9ea_*#GRf<-@`;ybqGR_a@CUHK8Petn+F>gOWo!@)@ zCj-C!?bx3a@xurF08aI>F3jVeg>mEjhXOUu_X3W@y3HAIr6~bd9{DTciura_;z}p3 zqpqpAB7N&HPWvr<8Hq$oo6zpMC%_w?$P8>q7Tq79yf6cflv-na1IoUC1{~oTmy-V` zjucurGWWlLBMLvnB!0YM;YVQ{etgElkKQ+@lgo6@J98qo@Dvh5lE5Gx~-j zX`sTr31b17$^CWECtjacYu3F-Nc!sr{njW`UCVv&1xwR8#`6BMrOwHFu{34!e%?}J z^4`7Fd9AYjCE5)+pTx}t3AXlJ;vw+05p$a;A2FTsQ4qM?g!|7fipfSkuab?Ly-GHc zc1Q2bcE?1ygl!Q|Sl1ZqN|Am`l83MUZR5Q@Ei+43b=D0U798&aTjhIzP0l0ulA1@z z#~6d_3gYa4`O3DbTk`$8^`pt^N9BzDXqwUw`p4L7=i5n;Z)Sj{AP$zJ?*NMpgA@2v zIaibWz1*YjOfOh5N}I@4BK&LGX)({VJylj{(#M#2d}#$MoSMpWAwSmMzgg|k_R0O_ zV({zApw{+Aim3PFS9t~G1K?%l60ObTb&b}x3w2iR*4nra=uC$!NWanD%5SuoGJCp+ z&~N60sIwN=>u6V{zIVL{SCFpZemSq{N^WR)QM3)nvZ&{PkbcsuG_@bp@LRRVEZ-eg z`C9O<7`nO(^|7tXX>V=P)=0XDb>>JC_037*w&E)Wck~)!d5NazMlb!cvF0nEwfb;a zle%8zACwKPa#U;MKG-0A(vgok>QP)rE#H&LzCJs(uUoA7qP@d;eQYh*`#Rd3%^oez z4*yQ`ccb?1^Y^v5`Mdf5&fouQ^OxvHD0x0;fh$>C)9?qtoeeoN8~pSWq34}Ct_eI9 zjdWjb@tJ?bJQrE_rXjj7v+f6wPC1DD&#BFqe6LC)e5#Hw>C#^!ry1{ybCac?U$HiK zsSo)y!H^lo^;8gQ+GknHK^ZM${a8L4Ocb906)umeQYU15`&|#jH z&}f?nJ$~cu==MY&L)|Nm$Lx_jMaxYiPhp>LhYqaj$@NkvVLcZxe{w!D3|YR|sjsD; zJ=tE0YVReqXX8Q@%CPQYZG45CYm_;FF-e4x=P{=G?@aZr#N0-|Lfo{je71jley_jt zGvuFbUC+HkUGeRU8QK>!lqnD@G)c}3?Hh4vSyuUXTX&tApkrB=UUwU{*t***V(V_5 z9$R`+&k12-+tmcYPZ%wVww1Ll-Rxzmo|MJ#bnt@oyj>>XS!!o z!}u9Z^z}iu?Zb85hs-eL-bUSwEIl9HzVS*C3F>CM)Ri>p&rs)sOkDDywwAm$B*ddN zT7JNXe6_gRXGxd_+&Dz}xw$UJYvbo4ejkE9aB{t4ZcCB37PdggBP?FvGwFr<9~B@NCL6>e^rv+Y$M7PVc z0W7yv>hybTJGt)~WhZyule~sHWHa&?Cs#+fr(CRc?qGi}HKuoMYPisZ`c7tx3ADW@ zDXz{W)QL5^M@L!{>Ri9h8A!I?jT(;7qNJLxg~;={g{HKHzLh4zpFy8Ki}4sSL}a}i z>wx%=HBS7e9Rzfttcm+cSDF!xyv`o01!}B@sk>NZw#4Oq3G>@>C2g$z6&=t|?R=|f zk3j#NTA>_&zV}^W$!(8;4$}usS8^N1Y()p;SG#QMEPq`qbRK8>{4BdH&l$BQoHO!S zI6+^>_=-C@pv*#&zxa@L#|Qu@0_7| zZ$qCNt`=>@vqgRF9NKL{lXjbp`$T~I7Ry2Zo!}e3EV;i?>I6*9fT;v9l>xt3P!6`z z$~HBWFT*p-a?Du%V^(?9FO;9&w|jF@&lOS+m_{@1btlx9r^VGb1C7Z}$ZzMRuU(=Y z=blYH&!>D@RWNvXN=rKq#KWj@#S((ux?pTF>tX8 zed*+WGv?^Xcy#+?zzGRQdtnyKl1{z4kTH!4yvO7oO?HSj_hBP9bPaILkbVfc-YCk- zatl(|j#7rKQ~s5{E0qnYazO1X^4XOleX9;P0|!8xDwtQ=EiBw8Y}q+69q$*}G2g4i zy{2b32cCTje`lY1_NhdB|KDp({*!+Q#_Nk0e#qnHScGvv}CcQOzSM%hVkqgSF{`JkLNu0K!$&`cpxv(iFeCz zC7in-!klAXIhUXPb96iVH<=gwN#@0s`Ix64c|c>motNNOll$B`N{?_rkKkF{M=-{J z=3bjaWYX99PpCib0dpJu<69De7(P7 zkTC|VvX?5e*edf~l<}Q0D@Gt2emQRJE3>EDlWcn95@w`!w;6P6&N2G**EE?G#Mv65 z@Ud3J>}WN(ryW8d594UX=V3iHPVT9SK&?|mV2~o+s{qh7rgup z?h9J{zOJeQ`ng<3wA;RzB!Zy0RpY9H-xnO&uqm%e2Rd``+(1PNfC%Or{*Cb$~Om-+2lB9+-&M zyW;vy9fW;mIriJ`ha;{Z;Tifdqra&1`_sLr4I|W@BuWopJ$ofiy2hkU3HZkIh}^Gp zYB_1N1Jyu&^Z=i>V|}`{{IT36+jnpe{nNmogSx^!=IGx|WKmxT7zXK!kk?nz6%zvFPn+z5P6W?{sE=sEPZZm*a9Q z+XxPSLkkY&iwNYwJ)h2s(Wm?@wJ%1RQXP%<@f`SYYEqCsZljEi@}vliKA9XGIgaao z-lqhQ8(QGlN)7m`1%`lYN6yk0ZZPhAz>n2>`IHWr3<*O9*UbK`!b|+h&VTH zB!^A|rWJ88y_rc}-=Fnqz*LWMDg#`@m|L!$r_M#U|61>OGrG-q{@X6|eDtVsFMUX% zwN(Jd3i=|90PZtu_23ZT9Qn8&iO!=>PEs)1O809>& z%!&1mXK!Tt*88uvtiGwSvxcQnz6m>Io(HS3Ck5(}^qdF;3BUo&6Qx1rO(hjGsHJ(hJS6o5RbJ+mF+_BZKVwbQ+x}uDCmYI1XG(?|%E<>xUTP@!L4P8j zE$MG4ufe_0oU3{EwOE)HwRrYuj@75|oT&Fafq5(u;!tt(P`M*Vl+(6Tog@x#jz;(F z1K!r)9&5hunBnl!Uh=>R<-<2!?}+#N6JE#=kJ49YBj|q(_(YGMByIA8Ja<-G6>rwES)W4sm%v}Ym?9!M$!54` zp=jIWgpM{K0*kA3sasZ}j*=?kM4F5z$MZt9E>ZBsEOi!X5IASzcfhI6x%q)ZTdaHf zDAro{^lfok_iq__-Xh?1@f?3$DSp(+266orehbOVaNUR>b+Q^<>+zdUn<1{_J?Am8oR@Uewt)N1bP>L0Ub2zAQmI#7pX2 zUamZsH*Dm1dDd~4Uir!wvnW@BMqqpr^YL5`^Lz>8`W@?>-Ap_=AVmMy@%wxHzJcGP z_-(}xe7C<(7yWziBfb!?1^8i{e>0xNB5^=z=tvQvhN^*1{-^<3D%6g+30F4URk@YmI%zGlz|$5jV* zI5gKm)sBK?id-@;wkF2GyCUFqZbQZaI8ux&VLGeMTZFy{8gUeQ9(|n|3#=0|2>qyb z$HnrxHOXHmWnV+d@lMpSjehxWzFKadL3s@K-8yB=TyJEKI+r;uzdCm!^FzK2FmBiO z3y{S&D_@SiSBf?b^p$x#-gL{@SIBpmF*-V}^DXqHU|#nX3dYV9u6sww0h-RZ3nLCu z8sDd4z_2|{>f8ayP!ZO%SndfbTx#~e}EeLEW>R5yM?fa6|zxcj;qtP-y+J%f(`WR#~AB=`K>cI!MO2bo0l5H_%@jD0QyfDI%atP4BmYV?_R~Y6kF*W4=KNa$4`rk zHs##gg{?eOxK5Yy^44n0=hxxfx1$p2;6?Q%59m8bW_v=^CmH|ClOehouc&&qqQ&&b zZl5FlC#{(1{v%V)yG{BBzF?mT^4^msN_$hp8uExyjQ@+XV{%$2?vLVrEp0*`(ft)yj$A>ZDpwpIZ!~54DuSKI;@Hk{o$%CwO zf>%YO+t2=8RdAtv&I|n*&s;Y-kj1_`dx{VHk(KDzHayceZu6|XF4oEVl;3D}XfDcv zXUM&9#$7lBST>$Ym1i61M}3enM}9jy%>5|a*OBz#!3D}k^)zG5fS;Dg@yiME{gt@K zAm*H4JO~rqZjMt18H6mrwwh5l%Sc*cwVQ|Xc01W~q|95VeC78~@r6u? zTk>emOryLbY3FVc@qbfD9hGprHCy4t zoAR3DO{9O9;PWA_gA;(AeW$+dJ|o&nlDE+IJQ>$a#*JglIL&{=gYoE@rQkf8B>ET& zaSQ6$l0;cFC)6BYPRluzPZ{ovIwMddaUehRjak;&1C4SO;8uFk5E z=IljZ-h!M=zcl(SzopIq_YHwgJx|>Edvm-ObHjf3&6YaQk?+rzb8v+B|7wlNO#F_q zp$uu$QMk(d&3}QukYGpSTxWmFjAYY4m3lAwY{%4MJT0r9EXao;P0dAJ5#}-X0dw0u zhK%QaglA&wW~ul=pzVF@bQ!P8YuED{#(;I$pD-gs=-a#X_2fm>*W2Ry>VLx8 z|A-sEKVDREQ7(0kw^-yJaxM@7@5IWZdv$H>?8A@j;ClHY`m$Y!XZoy|93u%aImib) z^t>@GI`bKd#PeBpO!p2wN8-abQTIKl`{l`aA4)!@Z0ZLOVLr{$@n()MvNz7>UD+L; zQ|GF}fAA=Jo+{)Si*VGFsP|0Yx8+&{EGK){-B>Y_BFgBiCGof@IpCb=>7>1CPH?Uyf8?8-X;51E9KHdJ1B#8#>FVGXv<`rG1f13C(Aua=rZ!$flSj< z0(a@a8>>CkU&ea0fwaIDTs>83fv;iSWtx_*(uUIlf5)_xSQ*;od)Fmbbh=FGd*;+c zMIuc|GE|%b)Kvgkq}7hSW5<+i>tdhD^k(@WMF3ZDOy@pZ^EmkHW7@9Mvh0Ln@t0hgI_mt07Np=hZE7n1_mvJEEyP_m3 z4uX0YkFV5GwB3bL9^u>-Z&G=wXCFiVi1REXXe*JiFy{p*r>HTH!N4_jnzCy`j27~H z;up*8vfnqw%Ehk*iEqJ}-bH^KD;8eeCfonUdVbLI!QuP+tawZII`}zbWCdgTR4e0s zU_DTma9(w2hZlO)BUU?~(?yPM)$2=$+XSTBQ<4#rM_)@<=Z;D9llK!9`v(1BRu?ZO3XWz|uY?Y#_ zZ4=UJw7E-*ht-~55Oo~9B6VlY>!Kn<+TPVW;xu)wnz5>@p1~^9AW|{-}(T z*DCKj>qtX7Ktr~OU3JCyd9=>LndN^Yv?p89$!(A^8KaTolQX;k>mVltBzWn$+0f?} zlD;e6eW2PU&xuh7p*?$`+9i4Bzb%q61S32@dm3=>05w%K zYTneEIF7YV+~@gj+Mhd-k3OU$|E!n%Ql8769)FJO_NHvn?dV+@UWL3R(igyecdfRi zup>n*;aqIM8e$wkd6vhe&i4n>WAlDXx{{UTUQGLC%Ew%DFLm@9a_@rs7zY`@W7ruU zGMwH-c|xwArmAqPKMFR|66#i8jB9I&)t1A;W!I);##8JxC!C!JtXPVSPY}PKDC-X- z2WH}X3FnE!Znu(e=ZVSl#9`ANiyt{%UYog|46B~@xO%R+WIfaUD;PI-1o)Bxx^Q*6 z==%-EFCDsZQ2O(y9}Fg&kuK1Pk6lf=fM=%}`G|G@VO(F;GRAf@#-5gUD0^b%HsIkY zr|CaZylLAGrmfVclSQ2| zH^h9*^S-z|A>_$P6@7m{E4wRQ?la|tzCJ6ri~fRtF=mB&wONz$5#btve1tjaYlR;3 z##h8RV`I|x$g(5gy<5;P7ii!r&_5YdfqlOE;EvVk+aXOvn2+z7uNHYuFvjRL2X>_4 z{a}#@fJe&ri>!YCcoM;mQp0Y(1W9Qbc{k zNDrOE_>W_3cY+snFBFG+^xUy04Y@Z4x-xeRGHksQWxoY_;;XEREJInFpOKew50h;! z)>K>E`*tC}4{d)KdG~7hV|-qX`$p}y^FtS+_2-O?&>8&3jWpnQTIiUvF+a=wN$OyW zG54%iH&#%9qgG-eU6OvMLc;TjdJ*$fbXC&8QbGh`YG#g{K3k|V<^+{ z10y1zf4DLd;PVgV^D~Wa-W>TlpWjSX&u4FrY~l0SSnQCQ`bQZ~RLu)$A}R3xh3Y)Z zrQ)}Za8KHbzg+`b_0O}E4?&8uk5AU~;Th_Q@6Q*wXPXXP0d-iq%%iq0!!^nHP{mF= z&e^5;N&5mdmtW9SENJqR9SbhSPcBW5&eLWG9r7INf1COqX!}38V*K?JF3DfFzSBCT zjna29TKe&e(LVAh2d=bn4^Bi&?e9H2eZA-&PWIQGk+JZzL&59GFS0}aB(djZ{Hjt_ zz9+9&cB?X^+20EB#ra;AY1xN%%~IdAc*SYidn_G39djULQtT( zce&_Ck{zssMbx=>D&J1`e`@Xb2uKOWjm`&zy@+>X2^bV&tcZYUct z3Qd%D=ZQd%o;SApVpP)U0T*qu{;k~iUWj}4VJ_yI{a_!++h;Mm7 zoM*D{wVj}Sk9hm9@qW=>+9`&BV~i>G7W$bShhzOtg=0SeEM_#?*O5h;ThzbllyQc` z++#it8XE=P9y7E6w3|r4I!{Tz-JyIl@^!)m{N%ewaL+TdBcRjtX<&ULD@0@@wWkpD zx?=RW78rR_3yfZew3X0-_iGj%cLYbM|MIuURdRf#hOyNH!)vv`&~XtUKau{rjH^7) zjNFBGSpN{(`d@%`WWP>66=r*X1Wf$40MDQeFXFuxd_8+hq5DBSILdqv8bR77-47-O z`Mm)5gULaDGr+w>eTQJ=IT0Q?ZMN&uwwV*+w*^N2Lu;px!$=42*X!~-1kY0Lda^e7 z7UMN76A{{Zwn+a#9YX~D1@gH+UB>4qle9(?0V~#E7VEY2?nfCncIcyKWO%(csngP@ zcxV}D)u;T7=l87iyJ6menBF_|KJ<<6lBd5bRciR5=$_)gfA|RX&;97j z70#)#jd*s__aU*?nc+wyP4Z@n%v(Qb9_8A9z#-$2?)eG0N2R9zVTYXbxl#q&R+tqZwSwdFEo402Xpx?Da$CsV47)$47n~_92K4Uae<}`)+e#g>DJMUDxtNm>Z#`Gzr9r+1U#^GxO zysc=X;|WpG@sJh-o<=@m@c;*CGS5`|^r`t9to&&6$n6K2v(FK^bo7+W!dpGj*RNCsZW;Q}Vof=Bj-XFoZpcYjHE?^+|{N#sYmZ zngQQl-8t3_9X}q%j?V~`0GHE%+w^bt7Nza1 z1x^>wb!XKKtM6sx%@^GOrt}tv-1iLsPMxRo{x)jkQ=(tyPi!6EJBqgKb|~+$-5$p8 zM4N1n?OOg2-V(I!9qz9jo*Yroq35>HMn}Db-@FlTL(b0MS2QVJD;YXjE;wswLGVi8Mr+AaPr_WKbRweK0XRrfsP<#MowA{ifdm$C2YinP>!Uj39ljwTBtO z{RZ4`13q&<`wYfu_rB7ub$ZTf)*ZQA$y5GFv_1!9ow2;qC-;i>&FD8fll*t;KcFv~ zsp2m`+MBRHX6rGI5Z4*~J~~sx-Dj{4Nk@N;@u6*z{h%)w`@wT4_hanx8UH6$ePf8e zTz#Toc@OZbQTjwbU#Dz}y>%*<#WQtVTm@Oa6cMh}=CqB_UfiB5@w!q=l4De7PK`XqHgt>*?oPspY8i`&xlIzpu@g*N<5+Wu?kEU^3{$?DcASt`gPoFdH>p(|ox4w7h{iFe%V3FA_zl-Jktky?+naHvTI1$KZ0*_n?AYuVg0JOk!9TiVcHtAWL0Pec7B;s$ zzv80$E>U#9c!zkXKb+jFj&>M9@{?#sQjjo27ek*R|5&e8(B^Q?FudbNk~d-`d(Rsw z-q~+Nx6?1EqTId6LM9GSmL`v z1Y4Yf=Z)&GOPTy;nmn&oW#Q2U^e3xObc0^V80s9`YZLM==d)p*0g(RJ{<;%4n_m#q-qWi=4n&f)qy0q71yiCkz z)Tc^{(sx$AE-IF3j^(U--$nVIPVXMzIiLFs;(4z3bM(Cf9x{#l{t_=A)+AmYUrGB> zws#oMHh$hVq0Wd(zeb_rd;f`Y&4cE)mjQDSx?LLJZ~=y5z(V*&SN2z|20XoZ*Zlf) zSb1h}%NdMo)!J2F#&Q77P1CsN;9AvrMpU>BXA5P_4O+o+jt%Qc#EZokk7mw|HgBm9 z<1q;N(J5s`$XSr%wk2EmIH~I^e2B;Kf%`-jaofgI;;4dy+j$#t0&jiaRx7GSDl#-{bbT^Thn1~JAnBp2ae>U{<*~C`@bZ01k$IH zMQJ;)gN}X7^2K$RD7-8NybkbaDM#SG#SL1bxm@4W^)Bv<(@uB>bdr15>s+Efh_aQ< zqOIQ{>U&c}pt4LznE`rY#Tm$R*AwTpJbBK9c3-=lT21c79MP4$awJ#F?P3}Fp0b=A z=PETX^4qM?!^j5||C}f1#7q*U^gD6jYWI!(BG0CcqX9gdJ^?3ye+?ySPnv6!at!k` zuXj{b&~C(U&l0vqz5YCXq-&5b-QwFS?tP*6>dVzPYS|9+Qa&U6e75VQpVnTC(aLjC z`7N5scBIYa+7&gLTlyDpd~1wYnMTOkXm{j&qMdEA3~7-UWokzi4vc=ZzhW_-oBw3vMEXw7eeo$#L3#gDI8kKb zMDHRc$E7FWM0yM-+BdiqPAobbj}z(dgcGuiPtQ5zoT%F7X?L%EC){|qeH_{j#-&VR zgw7jDp;OA2QN~bQPuzb<;Z7NFCkMEbN57lVPVNmMPY~tOPzLpsr9d~YNuIPlW=Y#4&ow}<;2dnIzN(Aoe`+vxkul zomX?XsINIPdkSkIYc-!yzJixt|5MM!yzQP6OUnBkba=|@XP_^4xYXW9&`^6M&*EBa z*=D)#^jz}z3MuETxjEdSJ6aclKl*?Jq#HI3A^qU|D_or?arJ~DmP3cm+KVy==+|S_ z|1Cq=Fy<+Ld2fEc+&{{iQdWo+--v@_vsE@l?q}tCl}w)P%~AVGj8WlTov(c9spEdp z%KuPY9Ti5*uJ^VZ<2KXzj~Um+k8OVo?=Z&kRgBlI512_SNLlj~lwylX~z|Sa%(%%6GpbO`W^QgZ@{b6rOBMfe?zu7^SnzJ%KcRZgY2tQ+Erai$srWW;IS!Wy_*@byMoo_~Xj(haU>XOoAM;diz%IdPt zs)RZ>sF-1Pog>hLXk&0?-g@6)Ds(mQ&m7H}7C(3F&m+$9S5rU)WdvQzT}go z;FFB4Ff8|}^SsYNSNRpst|W}9J4eCOs>jy&|FFiH@j3aNWBCob`&5jr9P6Cj^}3>M z%uAaC*Bxn;OZk0CAJNsiTAyp<>Yt_CwCbnt!pAS|*D;VQy6G1xG&AgcU~=E#(ZqcR zW&4+Ve9J#z**NI0`u;e0Xdj_I@@DSLej&C$)ezPO^jOJHa;<(Xh^vRbSHh6A@ln!7 z`m}GxoD)79ws<{S%IFq+t3b;}=r?5;CDLCiTST}fj$s`Q1CL*j->(%p=QP!BRExFy zL(Lw~xbqKF&lh+lzRowrT^IB81lD4T8JuZb4HCi>lU9g<~ zJGFU=PIAxhCfs-EVr*!FJ`y?JYCKE4iqrqaM0DEvmEUGS{__~;POPt)^y6CU>cHdY zEI<4wt-i&7?>2EilD-qsXiw)z^wm!8Aw%fQiT6w59vr_HH-bJstHt=l9h&mHrcHYt zXg%^(Fs9=u`ngJoLp9B#<;A(`9DY%fIJ_wu-J@wLUym01HrOXM^_{rHZ}QshZ=S2Z z&&aj{bLDq}PCAxUhiimmIllwj$nkwEy1ie_Spj;pydUYb&sPF}g4VZk)IQxaS#MkC zrY|slz_jzhFIa0uli%T>{PQKor4%yOME7sdegWXU2KSEv*2frw(k0gLEUY6Mt>>OD zac}64(e3RzzlZ6s`}1rwa&@W*lp6gNcj_YYhLI5()Xd11%fwpOZ=3HuC<>N;53*w) zWJvC7-+??F!=4|Awh`UE^jubFA@BK(9PUH({EMPuy|stre`G zZMvP~HiP}Sncue(>Kt0J@+GKSB6$#PoB7@v%P(jIGQlrJZ2f!*GzYkrCBJKf`nPM2 z{$(mgikY4F6V#vwsJ_kM%IW zH~WCLliwjE-QD%(4KmK)GR6y(-w0PaKK<<&CqwG>^n2iUHu25@n$W08Iv83|p#0NV z2lIDce07jzXy@&}80{lZyH89#!<d7z0Vlpt6!rF=Go|)?U&QNqa;hkwu z>z7KVIhi)#4)FZ{Ef1PUJ5N1$)Y;tnyjwV1xuzKlpka?_<9ECrw}9T=sMgmmO~ny+ zoYdFw444bg2e5X{z!v#!uq~*^mkBwx+4uZR=RdAZmEUsQBkB3DBOvz~A60u=*_!lc zkTHL*jL&!2%I6mW=9%ex0EKb+g;g(RZrb;P=fvl;>W%-duo@?RM>Y1{WZNf)zJ>hW zo6QS@QI4_y2z8~k(7k%}?6J*~C+LzVeCqY+_BXQ4NT*Z9ifT*|he@+qEx)NAJ#DO) zb`6a-wDd0LXUvM)X#NVHo+jgIw&>17Ch}cs-Nk=9+3w$yfDvnI4`dN}#+dC5G0qi! z>n(oG?@2GTc=8Y9`g0HNA03ID)h4-uYO*;)b$J^08tY^2R$C`|xBwYTwF8!T*wv)dpB`^$m`21!)F!urTC}|V*>v7B_{pb6D|6QQhEh?7E zK@Vt&^#8~Z_4w_1RWBG5PPt$4l5^7)0bHMPq0Z68TCf%O_ctX4esz=i{OS8Pjyu|KuL~Tr z%J_0X!x_hr>BF(~bvf#cy{rdtIqdH^C$z;mr9I>*@NZ;RP8WUqoD)5RgqgO~6G*F> zXc$~O;T*Kjbaj%KMdevgS&n#k@Ahol9bV`Y<{$M`>Ex!NpcN#jh^?t@*_B z6dXhS*-ClU1}Y_8TRBGr{03wDiQ@_SQV@Txg8mU#Sn-A8 z@m{u9biHb?>iPiN;yPPnwZ(G^iEY_!B%ZB!C;K#Y8PI@`Y;V)`_Sto>!lmm2XF(fQ zdcc!VC%=C^uKW!`ZyTwhYXD0G`788zSmsJtMy@j>|6$Av{n024y>1kEUo-N-XY;&_ zHLbo^m?LB1dW_0fNN4SM>|;XecEE`gxt8P0+U1BJ%6IqDHrpBJZ`c}7?SpFm&@bvj z7cQzX&7NWYY}rD_(w66Py8_Q1fTCw>#DzaIfyC|C#oR-l@H*@~0Y8)fV@;)YyI~z;^r5?swF_ zcc^SiyOS}zq|KQz5K`^7t5U2p=IWi@{`9yWQ~iGFr>4gHLsRj$Nx@=*FF$O-a_bDR zK=$+6_&5cg;ba>guT7U`j?eHO*Vk|Yd|Kt?`ts}3*Vo4`{`J>aw!OXv{u=9R27IWh zlzluiIR}*rAJD&r79N()fQO8MP56k5_P5lI%vbS466Ze%{_EA8{9g4-Jg-?(l@z!o z$$z9lbBr;T&l?YaZ3kl)t^SG_r~Q&=R&ATcOmIsbQTace%mzOsUn~QU-U$BR_*HWp z#JNxMckW+ZR6Mt1vwPf*+c8s2=c#zAY>KpF?xp`P_R7TxswgrIry2lzdgFT#T| zrmLeBibs8Kii~$S4&8eX?W)1qB2sL{Vs(^d$oRm_Bar9!^Oet9ql#sgN#AO_Jiq%4 z8SR;xqS*Jl?Q-9lh;HY-`?t%+`?Ae2zZLuMl)(VspC)4|UFy4*Gk@oK!*Fza3*)y~ z=S)kIL|=&=Ll$r|)^KsM$f6%9ZGe@@g?ICNAWr?Z1Tk%O-1U`Tcs! z2Fo~Rvd`S}ZBge5R6J?Tio-ig#HE$#qS6 z-F}{%BID3EVmy9y0qY8VN-Oqfsc}ei#rLb@A;EJk33^VVz4m#VPCw(=q|TF32b6nN z|7^DR(#PZdSi8xhFNgRkzFe1^DFQt%vu)e=w-k~mud&ty_Z#~5m3EO{(4JrmfxkH>+~P-gNBlRNu+H6WNSa>` zm`S5Q0D0X7xUZYzulpu_lmXMoeZKJnfN5EgYbRifc%359kStEoUhX?a8^qkDzGLc~ z!u`0?uE~84(&R=>`JtPd+E?)4S{zkEF^1!Ok#$d=h;R*U znryFd>1)*cGlcY&S7{5D^80qYzYqDDhcHPSShBJ+7Po(K{C~6e?r~9F*B^sF5hjXmEb(yZ1TF!@;EY{(k@c_;)%$PZ%45 zJzJ90&?3$dQ7-JS&|!}0Jz0p}b362&Z=4S3Jr5^F(0j5_z2_G%`J1n%_tf{sz8I;U z_O^~p#(dK>dn)AroiBj#655|v#(2UxVNc>dXJQ@in1r1movrhBm^e0PT^ZMN%Up-E zq0iquKzoDZmDciXZu@QKxKogiWXv zKA`$_Uo-0OCcM)L>@Iq5_ulNmqlmj5-B}3TSSF>xe;0bE;P*jCMrG>d9Hnx$T=eI? zd(qz=Rk-Bhjq#zb`^}s(N6H0PI1<$aZpnhEch8AMseU`=-z)F0u>m?|5}kmrpnM{*M3hegSR!4FpPRNTlE4vBsXrTN zJW%I9!|EJ;;$EZSa!(0?g%s zYel?OOE&Wy1vbD94EF=uO~t7$@QNcxNnYJ3Fkndb_nnx)>Cf9&M)MjxC;L{BUJc!1 zom7YSOy8CHr~QEB`ws16z%>A-LH`a>)>e*LbLD=h$%`GpUj%<$a8daAgyNcLayOOP zx6RPrrrBM!a~?~5NQXa&=ok9${f(SsVjKgL=1HonND}j;Pd2#=fe}M|gB7U0{ELEz zu$iiFw*LJ_)%SV*d!Fi>sehkN^IiX*qx!DZzkf;feNO*gO!G$n-e2s?pzj>3?6m-{ z&N9#j=Ypf!xq#BX;16KxgzLd@-fy5afIA?p3DZO_Kl1f}^iNw8kCD8&k=DdAjxn0# z&Wni0dW9ZhL%1CX$pPE9te?w$cW|D#@siL*0Phn%WP4<8XVe4xR^)@-`7M_?-e|5= z*U&@zVb7Kk@eZCJq%#8a9+R z&xI@Tg+I$U{q^FfkJCRchK^HygmF4>QM9i*Xq?`>7&=Z}7emMC;AQd7z2l5iq%jJ% z15$8jwJ6nfKb4F5&DI%szqGgy+^_CsqFaM@-UOZ|?ia)HrGoj*4&W$h^uan=d=Yk9 zB!8?ojKvlklea_ol;qaeU9|z26+!E+ztm%Do98KlpC!&K69m@b)#KP})4kM8aJh;w2rL%qlL*F^-Nct+u!Rhvf3>S%RNr zNiWq~J`#`-;zopw@B(bmfP3a!-fJJV4*{>lyIJ)dmu(Ke%zOfiz{+jSkIHFouSH<* z2s_MV_wNNBc`n-X3o2`CtkA1|)4?`nCb5pL43Ayy&``KOBktd=&7Uhg*mr>oE}YQ2I|KXlpi{wee}$} zU;Vfsp|u4%((Gta)?<_(J_{tH<-zZm=?&!%Q(GEg12qXYP;q>IJTYu9z`U=Q zQu!QerTV%~ums2wjU=0yh(6Vl@X>G%9R{{Yf^*1TfVS`FvZ09Wi*e|E+uyuwZf=v8 z&P&fn@pzfFB{k_4HHpu(m}opu4ru={o!>DBOj266A}ifR5*u=CZEV3OVk5V`&}ef; zvBHI0Ck$<-cLwEHw*|3GRyFjL#O-T=O_#adv{|9HnTSs7C{MifKQAkvkRU5_;;F-{Ql3$QI1A4OMtzCnd+;O z)X{~Kad4Q+gA$$BWcR!q|EmRO*M?}8fc18P)|+f&o8YH@?3=3R1LE88S6oBS?K@fR zU}|d%#^%Jktu1W^!~wN*mq?Z-;1Mz@scEZWUCXw#z&e8c!|@raSbJ2?2Xd-I+(%d) z!X_t)<6B4aI~RN;+>cs6M;m}=Q0v^=YBNozwMG50zm_wIy#aQL#6KLvaunwwbpEaU z@`V7ukS+**!ELc3_#*eqG5qZP!ax1Z`82<2{dmxKV8S>gYZK~ygxj==IJM5OIJJf- z;B=bZDt*36a~AIp(th$s%-NknUku!fCXPKW;u|@ms4S9Eorn#qt!)RDzhnw4=rX81 zraiNp>@nlHAw=I^H$xZw5w974eJ5V2`N?9>VVn^f;s9 z{=pMRvi>7%B>$8gSN3=`@n4rzTLa&+XqMKtDtohOw5r!>?kt?KDk|yWRb>{M@8yaV zYx&_$Q@Ybk`EwZ0-)0QTACLS7o*#Lg@vN}X6l-}tN-1+D0v{pH;!I?PMHYdVp|H+E z`yQe9dI0uCM&?>d^cv631nXntI2dT3e^=lU*uOit;GqW}d@$4=EueeBxc1Y$z`Y_c zgqvx8%%O316HU^H&palv+!CUVT}r8e&v?k#?{PGh&>UY_J-Z-{c$EGO?bmrfcqZrz z-gKSJF)s6T`r}-UF;IogWqC8>_8Ym&=^d`;j)1+FEhTm1Ip$O!_pwiM=MarnYPc`U z_hvU8Hi#IQ=7FYrs5&tDAO;|EqIw1el^6uV6Q{#n%_x- zf8mbfD9H*%t6016X-sy!$Jc+1gU1;IA6p#YWAKT>m_c8GF`Z58`7rUWR2uUxgQ=j?7zWpchlY!OD^_(fb>AJd_5!fl8 zpuN!<68j{!8})g=Pkfiw^9;)CU5)XV-3EFm|6ITa^6)ro_0~h;yl{SDD83hT67aRV z>x+=HQr0_2UMZXYZp$)~OV%Qm!c>wG=d{|Ohd())ZEBEN9&Cb~lozs(gYw=^d0VrD zOaqx2eiXpxh3;6%dbb6!l^v30{X&wpaKG!{D|}1463f<`UJ+%KX)*WeNlqJ#X|+{J zED`tYbbjSArDns1o9gwlk(Z8h`#dA(0n3<3FZsm(l71I;eqs3iYUsT&WZ_e~9VLz7 zAklGHjz&zMozDyh^o*6mLeEHi-CF7Qcg&!FBmM6-O0`?Sf2`61+#z6}rL%P<=Gbj= z+MM6g`fk+ZVc3y1Qok2zw1J)1nus+fhb+uafMu8b|AU zC8Em*)V8BEPoY1*kLEPuD|sj0(i=;8yd*F9*%Ke9B(&Og|CdzzFl0|7wX4py6m8sX zrMAY>Oep=SdESp7AKKjWr$zTZcY5&VBk5fAbe8@9s@fZD$m{`!j*# zGxn|=;oTVV?kQSJ(93Qiz5%RB@Co2U9-+Kkzd`SHrE))GDkH_gc?6|%{&20}4>*@* z63;hC$(Baq537kk)T9LD8~C^%qqZ2a=GW?LUg+Z&QvH_C*v}24JZ`Tm{7ybNokZ}FU8^HlKP=WY&g^S??(@<4U5ndPKFsksIJU6@{K2KnMQ!BR z*YI@!)>8FUEe3it;-ar9M}A*WY{K#GrO{uk|B(CP=_Yct&# zsQve=JkBl3zhgh*+m2zvI=CJ7H0JUV{hW~NC1Y(Duv09$9WY{XTFtQE9;CD-Pbo== zHOk|3|9xQPKAKOo?-b6Xew~eBg?@`Tzft*xxEt_O8g!o|19`xQh%eQBD~|SHu6N}) z!sU>|_L%~61M}Ehq1G{~*Sl7e8DhfDK(En!-H*KkabLyyurq1!0iko@YXQIen#G(A z)*puBeQNm2S71rLN9!sWOR^li(4f|hhb8%@mLIyQ10&+@@Uvh^ZV6yX76MB$a_lXu zb}y3Zm>U(qlq?DJi9dDL-yDBV+#6lX#>bT0skaM6@bM^$0WEDFF3@?yPtOob7d-9qS+0+DT+MGclI-|mudXML9M4q5dO)93+`gb#-l6?Z z;qm*ta<1ENPzFf`uGD4bNOHH=U~Nj{=dU!59sZM#g}v!H>YtE>CedD=#&wAQfqq4^ zJV~~8A0>Li_h<{fe?O&XQhN2XYCH6)*t4n({O)Zh;t!JC)l>g5?$*S9^CIPk?$w0* zSdy=+pJnavX`{WT+e-7z#Lhh3N^4v}46=*$y*NK0E(mbNRpH~(^D9o{WcN1uMEpsl zZQ*H2j=x}S##)=Irm}WZY)TW?pA#SW8S16;D)AW~VzrsFsP1UK#>&r(BhN4B#hK;h zkhtnTtYaFF7rU|dSPlqGbKwiNV-mZYz98DH6aldkF zx4%Ay#)Q@S>y>uIaVP%Zp@5DQ z`ceLFJnrU6rqyJX)1NAbsQZMvP!aM%L{(kb;(~TWDI2- z86(9Z$ssbv+mJC%M36DghuLfCa_~l?uYaxSfEW{DGYy(mKB@LTn+Z8Va_M*>;qBhU z+l<&;+}^(DY=wdIinA4RJ7OgGr%8p=-~He53E#*6M?S&t>Lu3`w5~Z0{#ui(>Wxr2 zIb836eepc)i!W+6A#;tPwll?xxEHrx5B=h`POMM zlFI0JwPrU|9dyR(gs#^p?kR%L=k^Wp9ADVJC7$Ep*$>8ZeG)(mafphklzS_|z?5uizbjaUKXY&n3&%}6uLj}Ao=##VQH(v{@ zWB9q4)+@&^4SBXGCgdKT=SyTaZVf5}@?H|n+41zXdhF*&=XUU(jSmQ{Sj-R12k$-} z*Yk{p=T1MaUjXb3w;wjad&2NkXnk9Rtg(3?*7szbbKOE*kG#g` zHM?kLX1NNtM#5Le&;cYbUEX4o3-&6|+x3R*3Z!#Co;wLGeBT6jk% zvg(HlvKOfwt2%oTE5y7UV2bwaLG4*Of5tHwq35Z-f#b^|R>bo(7C#*I=i%Iea}DT( zx}4vY7TCW9ybGH9tJs1ibF-ViO|n<%BH#&4o>j6)#E5i88F;?zpnM`v`mAb6PC&lv z={?jP&vh%YP4V9{;=VND2U`8lf8x)hadurx<9*hG*vOIet3k0|Cm7oEC$kD}Q%iiW zLfCUTru&6oG|qL(t%!NAdPt_O(QP==pj*4Oq38W`Lf$`1d-^c(FT7*8mF79U^E$Nw z_n5m4%!BjH)7m+)HJaTBY}M>Dfpe>s$A3w3?>-Ya`vminJK-C1RJ6%_Yh)fr^aX~v zkJ0mW{G1)&Z|zhrkCh91)g=^F?gnC()q4kG8Y9zSW!?rKBh()(d6js18-67go8)=o2zb$cd9n&RSZ*^}mSUc=g- zKJRZnBJ`q(i|2~94*fXBqj70QVYsckURTL^Za=g^qP^gGzpyV9&;JxSPo)d~wz!My zh`H^|qZ($IHIc{GJ(E(L#W5=^(G5L!tWta1p0aEuvP;1y)Dw0V)i&ROeIlU-=X>J8*~Ei!&dcHXstbxnxr2J?`xo zDa!?3_#;Yt9XKL1{%y0OHxI@sO-rclOQ6@KzMxOE_G;RwA77z%?T#|m&V_t9{}JBy zb>PjC;_%L&S%Cb{W6UW3K05m@p+21;z6&1s7WFxvzGH4Jf0pHd&i@+4{bEB8`ttBB z=IW+r@p41Y{zPhvBYrdJ1peJ#=UlmNI$H@kxitH}IAIG{j{Aq6zxtamq{9wFKYs`v zNZa>*#`jX#QZ#<|XT;BxGW&E^OZ~4Ls3aL;dY6sX_8fZ~ox^AigFf7by|;zGhnNo8 z?`-DZt1+hziSOu}qV3aF^j+Vx;WwDYrX-ede^y<7u^&QSUUw9o>8VWv--q5(%#HAN zouGD=P`erpqFob$+S3=*p3H|>O!{6+ zHOWl35r6R$pFb`uZr<+xK)WNwt><|pWlT2XKFraqgLq-xAgvY190Rh&t$c|kasAcI z&Xq!cW#PDdxWB21GB-ITwXTciyHiT;Hkp`f4m|_zP53!Yx3kAs|BiS~3Z1168Nd@$ z+*8jAyGmdZcM$)@eVG0}Z2kp~PT>7t`1w6A;sJ1cK`YlSB)OH3{LT7r=>K>hvlQ+8 zo9qs@t&D8%bM-i`K3Q^5#+~J-1N$o0ryKTqJf2|+^&!Q5Ig@STIuMx+8I$h3Se3*o zHxr*+-mLm;F`b1p;m>%VRei+cwEHTn`!`zbz2(i!x5>zM{)F=U9lp3N+=r&)$A|sR znF*`|W$5n~%i`Ui1-*-N?H?zwTd+gNn)lw1^5MA>FX}rO$NhJFsd7p;u%qb=-yv)l6&^1*JB`N+%j33w)fWnihFR_BCaI5O z-nRWn9YGA7HiNZ0d34@JoH_7)ctT_M3VGxul$$NHj)uoqjQou1eVq2aM*2>&M#sAN zP1;8t5`c|>@l)jUC$e=+s&0y zx*NoO&(p~v}@+RGNCZ07hj=T?{367PYZXx#Nd%^#bvt(B)l|^k@(0=)FS5vouGq_5cS$%yH9Y;|UUr~Q=%D#H z#n3qIT4Nu9yt?~)#*w!2dkc0OCa-*H>g0l#X3_uL$puQnl*G33$pu||9ZjV)hBPM~ zb{{J&A{iF)TN{;Wm#l+XB4$s|l2gKGVf^^uSFRu6&jq)8nB#zOnRt5&jak=av1h?Q zbmvsbwVU!R((bRmdP>OZSK=oG)9qC~=8t2yS*=}6W&e_Br(>-yJc;=#=pNo?@Dlji z-petr8hUoq8H@IqGuXEV%5U@RrgQ2HDlcVToU7~cWh2z)4%iSr4Xm=qX9L$_=O#&% zQR^4H2lvcgdeA#tdIyR6gc7%Fj(^99#32Ao|ZaiMu5sKa4kTJ`-K~ z$D_-uV}8{qNXAa4dT7D$IG%`)i1Dm97;4v3Kdm&5KmEtDk$jo$%!1#@KWGerlSO$- z7Kkw`T@d40@t~~&c1xQmPaDzHOl>mJyECXw+;0={5b5*WWq$YPh%~n_=ij9{e~#8< z#{^(Bq;kBA#v}YLAU~e(X;vY_?g{9?@tkCU{IO^KfoD63pKPKv0-UZ!?5Ds?j@#Fg zJSoY7cE$pmm)dC|`T-xir0(I7>a4iUT>nUI)_=zlznDp51uRDJaA2pr#PtkU@>|Te zim1@Jwl`?5g~we;<#88MImY!mndJi$9&u)YdCvZia}IkM$6uj(h_5}3dAE=1a%l7J z*Mot1_sn3}yoFg3M#vR@5dqrIoibM;XAZnu|_Wc!@fCNYP6NSWAa3@QI-X=jj@L1`I*v_YgzrL?Jmv=5PX4W(TZ zNb5&hKBeUc(*B9GFHqVS0%`9e?Pf~5Igr+aw7HZvH;}d;X45q1BPwGV_g@e;9pO5)EBt6lhVQ3x zVBd$&sw2#Gl)kSfd9-S;ZP)Z4%0f}B2xVy6m+@fIl=>g5}4?2fZBRfz^yxh#xIx}#C=o5M! zoI9C9ay9(}7t}=Zxrv_Pd8VY42|eH+L+vVRjO~|Z2z}tf*Kps#4qT+~J{|W{wz)MQ zI>#m1=!Or_SvlHq`EPXYB)PmKM)g?*ZbNMj;_*-$vl1F@x{g5DqXXyP>R5Y;+Z;I_ zrS~9@AZE-v#9P}g*7ur<8TVbzT;1BTh2$tZn>YmBkn%-t_cwSu?#d58`G*OkxAZ>$ z7i#CS8@g#8xRwze8lQQFpOd0K5^^N;vTZMK=9mM^<}#O#O?j5eeU|Fd@y#lzzrs#8 z$*s4O+Y(Y+@4h5(K1!gsTdinV$jot6PS^bVCUIRPbf%hqqMYL_8W!$qr@C=h%l#wg zvIFm)ptGKKXFFdGzX!8A7Q#kkEpx?CdoInuS?-qh&^!Cr$L4`q)v$`fa0txbQ4v?X zBjU4_S9!MlD$g3me+J$X*FV8!?i0Gf5^3RxU5evAdAHNteUsi>r@gl>=)IEF_j5hK z?W-4#jF)HrYUrWZf|^l(9^0V$?tpDtt;J9pyqY1KCiIM~2EBHBIrtkJcc_|`kn=^H>l;nUb) z2yM@8Ct#nb`fjDq#x?hkbb)8CSvb<5<)Jy6cQZXZG?lqFt>KtQ3w}bh!yGR-A$U)? zOt3}by0o_y$;j_}a85CQC(5PW5hVoQ5g~Sbkl{K;8Dr;iF|8h+%_zY`e!PVBp zA4rA`my`B=By=#^UDl40=PEZump2r53Hrhg4J+ZLB+*}eU)cFn z%4XpUm+by?k`^o2z=pn^c*jND$vc*bYU`T3ueUH#Rg`d@fbnqLLtpOc8=*)(U zur(X%i)pp#@-Ncul&)hBlHp+M~up%G7dPWV(+yMuD&ed z7zg`Xg!7X~<8zj`J!ugBHFr|GS5UpEuWOw8(8m7DK^U2#dbGFMu+bMu-bGy#wK-fN z_{oMyxV*Su$Yi0hP{!t05I@7SM6pJ;<9>QZGE1cM%G)KwxA+{A@^;Zi_H z6l%w!dT|4xJvu65h$Q*hAyRoonYd z?Zk&l=lL87N)zPB>?qjUS!+Pw94?odxt@O>nQ|Mhr4AHRma!)I>}(VOdGs84B> z559X<;2AXT=MCImV*4bCV{+tXlMHB~Iq-%-dE-tR`@_*}sEXG2Av)utpNMy_OkG{B zOh0HN86$reozr#^U)UYZe4rQn?!HQWOrNNFUQT76GWy<_K<$~xJp8$)b2NQr9=C%q zCzzVJUTMKRUkQD8PhdXa-{L-UVHEStr#>Qf58CB5aQqzJ_Q$C0Xq#@o@;k)NnJV-b z*Pj-$Hu#Ue-mumd5pM@3Y^R2e9R3_*g=grebJRc9Ph~WQ`YHOi^%H+(3hy8D9D&|O zYflBRTj+E8KQIrkjGwe9Xj~>A7d{=p!wrw0ggc2w5j(*(7CVXdr}@lu)woKf#{>4P z#^b{0|H`;Zk?q!%PT?~J9|DqDd_^)t{BwS$+r#Z)8_NC9u|n@!R+uxPq1+kYP(JW| z`rX6|+v6I_+hXZ=GyUGk3fJQqrJeXOD=eY+23lDmd`i5VSt0aB1KZ%6!dxeQ!wP{@ z@?0Xn%gY6?=uBpnsmGxMRy|u_Uo7)jG94yY=gQ&^I{7%}f$B@5Prn7Sq3WA>T(?(euG@BxZ?7Kd zp6{=(!_F!k&qLFZQ~6kHz(&(CfGm9Ojz4crKft`TG+DHHTOTDbLLXg?@l4_4={_d- z9%O0oxv4ak^F9ofHQ)b`-`ys{uN*oo_)=k?X{Rx>8DWEH?UtmJCd6#S_^u+FXGXC+ z_tnOZ)|0I|w;&fbH#CL=qyC+(AKMF1-|i2E4oT2-lKU{p+gsodKy~lZ+5){S^h#$n ze;|d%)c>Y8EPI+%c9Fs_6@ZjtExge6A#qY;_(qTJsEXkOIG5PQY%^#+I zLVMp@$>pz~*nW}5$lpZr0*#Y@v9WMij&b|_hISrf)i1aEuN8h`{&`Yi3V%1YJr%#} zm!EkYekH{Ld-?Eu!S?dABl*?H+|T3qKWR^h zWqHCc#^B0Bdv1$lzdu*BXI|v?n9v@|GuEE)e8KIR7ok1dV2?1#{Tj8WA%^9_?&cjM z>)`ELYj90KyY7laC#_u-k=u3jL(nOxUE%qH+f@C^5!&m9A8ZxQ}7RM(kf;$BPm${!flmLk|LJo#0jCq--|l23OQ z9uxN+#m55j$0r{M`2%<|;+St0ViIMC`QXM9bzm|BhPkWqF z=A06e2c6Lp$MjD>23t>2-&B0pc+kh1k2rLSAHNc6(;U#t|8Y!rgZK*?j(N}P#Lx3I zpA>(++>SE*q8g6EDU(i#)~0P!?; z&e0fYwql9GuNLtjtnOyb56!z+_nES~R~{4l3&*$*@#7g^5B~F4AgdV;Kv&%*?*7JN zN8_GZk1>3Sc-hK%Q=2Z$X1;-`rp+U%Jnn+eOZ?4A>A)e)ft_!EKp()@;56pxJ1V(m zz9IbZ{4pADOJW|(+q1MD%+RUJX@e)OWgdfF#IQy?a;O~&wZr?H==K>z+b0a2knubV zB}>hZNX{;RO@xJ2&Zu*a#Nobx+UeXgvuR-Jgv}0LCt}U!!VYwIGOH~kIm=6DqTLd! zjg^wR_eYBu%*fld$LMnS)I!s~69v~({zFn+S?iws!6qyCmx1Igr5pK9(Dy+(&T*ZO zxf-iaaQoR3lAoWWeGB#&z!I8C^8}*NSvKi{t-lIn$zreSVx%L`GEZHiO zbAkH~8?9=CT8RFn>>DWP0+#un?7^Cebatk4{C_jHJE$z+F5I24PLwxIa=~{C<^4`8 zuP>2RF58>mggu?d&nCJKUSr<;@UU9gC}kv~thHDNl(vM%WG;NIiPxHl=1zM4!b z$~QK|Ll=|+oHOgxpyzk#&*{CsX{txJxBL}@--y8_?l=VBfqYgxEbe1cVsVEA-Xyz5 zZU~Q2o#N=<7Vu;2GqGGR?SaEds%MEoDMQ@qN-5cLZUXZF<7%6U5FS(`)qFu$tL7Q6*Kz&$xlgEW_x&^&r$mAY}E6gxObytq-aTD(*~^aXKR z8IRCBGzaEk0_OJ&Iyay!yzkcDw@^OlD3Q;??M*DSwpihO`n`_YJwW9SIxL%=!|;8{ zn1wOt*y&+Bo@7)H=;)oN?Yl)`cS9uWgSQbcay9(v>UTqt?E7ozog1=ge!ME~%W#j6 z^PteX#z9{6gx}{wXNUQ*eD2gH#D9iNKZkhQvr(+_{9=K}{2Yzz(3&+pCl=qxW&Q_< z_SH0xF{g^OSm73l71H@R0k{Ar;s?YGK_fiEF@JB|8#k^1+tgqT-Jj={yiC`)&FNmfMuxncCg z`7@p98BEL9;1eKOx@Dr_7*BMsF8^R!x(oRETn?kXbo4CO8#;E<*&h4xJD?@yk&1Jh z5NqREgSAYjd!H6ti_@EEZ6$uvYDlhGOLbKnQp*O2=4js$YELh8Yhm=(X$`u6O{4es zU;gy_-^lvaSI6v^b`Y=B?nNB%>x8Y3>xhs~pE(k+$GMK?zz$(ow?VgcnyT44rP5ff zgDe4=hsG=&wpUL)Hj*+ZX&s}}Vb%QF z@cpLq;@pWd>VsPTZwHl;b3|ZML53Yqk9)OwnL~8-%MzF8&WczWj(1X6?rf6X=WF$q z9|_3raaw)91D=79yEfcJw6JONpYw^wxt-w!lJ`zbP1{^~th2E3vKBWxiq)17&F>hE znN!janK(OtF4N;>rZ~PQ!B&dS`_8VOcr}K_d$(jxs_2IXRx;6jk%BimSlmtxp_^{4PZ_qZn{4mb92%l ztta;ynN<#7qpsw(eQ|8l?x~qIS+sYL(0EuavGuPOaWOV0RFc;}pAW1|d$qU=X`?)ivUq26znHss@HlKznXZeb zx$av2$E)*_$nmxLKGp--41Dl?TB8@Z4N$T}pToq2Hu<m*%9a0 zIh{$9#lCu9f8b2~jeeo?#+mRe zea~Vd_WSJz#hu$}{=A_am^j3*UljTZ(Vk~S{J0ko&mO;@ABG<$=7VW$K4f0@=M@Ll zm!siH1pCR~&@ZqD=4fpZb)@n-8dx9(Qe=Dcf1mFsY4an!|NmXSzwR98`%j1SeJQA( zbA4Ck`~3SW=LGG!Zc@vCrY~rH^yxOEk!Jm5JM`N(o%!EwFgblQb@_VNeFRga&QlybNc9&cW8xGT|CpXTgew7r@ z;c@PR@7k`!`3<#y1>Wg>eStkaP4qR9?=dMV_oE7qqX*s6`$vTjG{>FzK-}%;4*Hv~ z{TJ>XNAj(jz6o~4Rk#D8GV4=>jmyokdJN1+cDZA7liLG8?#K^n+tA^Fe51cRhTC{! zY(<}jlRTa3I8XEBSAQ05d(9tc@2~$XWT=lK#5D?!KlBXAxlR!q(}TH#Iit@X%pJ@d z%pZO3m}%XA=bXm#iUT}P)4`R;MmSGk9iBZb_}!($fjI}AU4udOyn0sG%k2%r-w?I} zeI$42YhWVSBrNa8iyk=UpQ_&tt0zHHUumToHYjgt=zt} zoj!9`H`)**tJ=WoI4!Rl$6J(p0X{Vx8=3LAakv}HS6B!9H+~YuI_hW-Z=wH7R6b-6 zntOTBGl5S#qs4FNrFe`5Gsz|rtDP#hv>*lsm$#_R|7FqiW+Y!$$sFUtW0%rv+7a(9 znhllGn3;>!1q$0-zB8H~P;%xwPS76KNd53eH3oXW0BN^ z{C8aP?>r|fZuo}qJ1sifnKXMYl6~tCBLeC79uA51CiaqXbo}r!UIG77`v0u`e%A2Q zv3^5;{$;J->L>onKEwj1af9#qrfAW2d=6+aWB!Leb)H50|IURB>$9QfdMcmJv3amL zfL%sW)ug33*GifVL($ihmqNaA052s?_{A4}apF?Qm!M}heAY+pwF5-s`N%U_U@H}6 zTb346ns;<}qFs_|5JPVXo@X?apOnq+Y%5DNEt)iIU3F$b)|1f{KZs%n9`^fpIwc8b zvqHolKpU|}@ELUlZO6C&*JD{@U*5)J_7eTxVYPiPwc4%$_DeL|1YA%({kL3aOlNzd z*B!8NmpVCq4DLjM@!#q9S2m)Yj~5ou*&s1lvrU7(7r5G>1utulW>fSc$nwdLGym>3LMm-sQ8z6BqrG`F^wKUje+TC;uhxe{R88O00wERg3%ZlFn8ed`OEr za|WsXl^v9?!YKSmfwQ(fsEnF_2_89{o~6*5XoyyQk5U;cqItX^ZbN~6ffMj@3fSk2@DP)r&bWm(roT zj?;oin3-I+2QkcZkYiP-KKJxPEzeUM4#yHL zvkta=O;X%4(WXmlgGFmYoD|1x!#|>T=4oSe+Von>iF)-9U9ZTS4@>4j6SWKRA-!v> z{?H{UO{VGc=F{}tTMuk+RWg&xkQIl8=7U#?vc&Rv^zg2a_}y1rO^Fm& zRx`b+MOk^>F2590GY$5-#h)9*-iSMi<3s~0x2KKXbyK-`zXbYpDr3e<=PrJaNAG19 z&uB7B6PnCa&ey0e=pfO?lf-Mg=)I)XNlm{ZdcRKp-#Y8h$2x1`KF}5i{Dus$7u4Eq zUzxKD&*y7cG4uG{9PXPz^L zT8HZ}@jJxrC_>zWC|a9uiMR)RE#X`f7Wbf0!)|b14#YihO7>arQaP|&1uhjZia6F^ zoMzLTz-s#q+;;Pfq2J*WXXbSGiuZ|ku3>qwnI&Ft<O5@;Jt_F zJ+*=5K}P>rrnX#EpT_+Z;u$dMp6rK_;OXRkM=3w4pYuIh|VU%%8YD@ zWRN=h(qVa>t(ADoaEz!2_qQ{soWU~YY3-RJv)PAyWfp5HEby#X^Qc9H^z9b zv#?y;A)ln@r)Ep8_IsA>YNUV2zQsBQ716L5vcMY?7p$ZIxK&XV*V4Sect=YyWmIQR zcGl}HQ8af4s0=5t|L$?_!kzC)xuN_6dAh?ye6S?Bv}~PZDl-!=TnH>4dEGbKC5xqK zzf>E$nk6XFG{=aaVgEp!l6-o0_${fH)??-GsmwR&eA`NV8CV64w60A&=8vUj4RC{~ z-ml&x&ab$yEYi}wl&;((cp`8E70GDcCq=rt#C$zP®i`)IDV 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%0Dd_KG}v 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 z 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 z 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 z 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
    Rb9CHd?qY=^Y4BJsJ@^8Hvv)N5R&Wo&g3+ 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�#d|!I2eS0z?8+?twq%g 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
    r(zr($g=- zxN6jC>{m)z-IKrf#2g4Oc1q&?KKEyoUMw?_SDoh2VfSG#>T;SBI#h&N_V{za zsbhfpP7?>(B@d{(r$<&qtVCSqx@QXs!{HD%BDXjtGA~=g2=g4QkK)o)M9e+Md7wDJ z@55>~Ba?BN+gsuvDiy@9Wj>HxZ*C+PXgwTvsU0vL`}e)&L(;IPNSfO>xz z4cICZrfyX{C|M~{Ld{yex`+@@+GP{6-_@L?|0I5BrMrKs*?#9TxBL=M6EQG=Zh?UL zYUpRanO95~n@a8}U1#7YQEMZ4q7*CxvwmDSHNwrY|M3~Ze+!ND&d$TQ=IogP8dY5< z_X2Of;SUt98q-Os2)xY!#eng0$Rxi{z=n z4mV4VAgh?0yWofXkn;pvc6`0Mk)ryy++J`>;xIy5Sl`&fnHh+@{nOhe2s2HF`R zmjsWBzc2K?g3H~*)Z8y`$<7Rsfkc*MUs}sIDXYf1kjA&Kx$1Y$8tAxZQ0O=@t9u#8 zYQvOX&biLZ3@LK7m*K9#zD=V0C%55~RoJ}LOHxlDGy-9Ms<7I@9`oF)6|TLilj3$A z-GqG|-}&>$-y130?uPqAua zI#g&$Ay^!8da3p@A4UOPx5Uz3%SO!WoUmz>!eM}OnjET5y1vq8I4687NnZ(V7wYS> zr4xZy#AIF-rG-mUw3MpR*RclPO~rAiKTC(d{IPznBVsFdPy6Jn9G_4LM@;C_h&qxz zVU$l^f|zB!o^&B!HE`VIczpxoSQvJ?yDOHf!M&}#e$!ve*(8tyetGx=25Ej-`_-da zU=9j*i|_9+7Oh*EsNEKEXJEQW_y>~9iDqb#D)Ts3NqoS8e)fWYZFd!b4BtvOfLRr-jXyRhm>`iKBHm1Ed?s$@8Af*9Q+|r0Y z_%}Xnz47RNYE=O&d5{y&eHn z8G3Gpm!ED-(g4>ABr3SVVH(UYuNr0mkh%(GkCK=@v3d5S7f1)uC3fPnWZn~?%(2@N zWe*(-@*maI+<}UTvC~YG7>FgEO|N4$_8q|K{Fb+J;fUjGjjQI6O6JY;XH`3=>F7ggVFhO}Xi&v>E~*yMxlk%# z+5RWP4_ikE2|xb8tQs#x#2wSL+rq6d=qBEnYL_%&{wgWbN4!IP%x?vYe(0OMszivR zvHYs>@yrNJ8hdCG%OFrEb)X~?>vjZv^frh*doP=4Mpi7A9n=~MwTIi2T2WgZs$9@o zg{e>p(nV+Nl4MJQ^p?Al3Y|u^@#>UPwSFZP=+TzG?$&g^!xhC=RGlO}di~Dbw`Db- zZnD3do9`&IKIq=#^FxP5*KJ}|Ae_xfplvtF!!i1{71Az>W=nF^TSs-9v%dwpj}I)n zIsMO3OjpUnG(SpCkC9P1fF1lq8SExcJuA4;>ax0%rVT082g3muy}P9fzkbY^A-i(D zIyVsjdJQz(g!UQ_VCp(r{SFsg=ET~1yM1-HyJlQy`$a<}M;${lxnv>rMwtM;oq?

    HrRRZ`WETt)YY{X4_44;X0Sjm%FH5z0Off$ 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

    #cQ?q)_wuV;9k0I6*mdzNny^gk+* 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 HKR^9HaRT!n literal 0 HcmV?d00001 From 19d2639d1e6478e2e251479d842bdfa2e8272396 Mon Sep 17 00:00:00 2001 From: Ali-Akber Saifee Date: Wed, 12 Apr 2023 21:46:52 -0700 Subject: [PATCH 163/349] gh-103462: Ensure SelectorSocketTransport.writelines registers a writer when data is still pending (#103463) --- Lib/asyncio/selector_events.py | 3 ++ Lib/test/test_asyncio/test_selector_events.py | 42 +++++++++++++++++++ ...-04-12-06-00-02.gh-issue-103462.w6yBlM.rst | 4 ++ 3 files changed, 49 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2023-04-12-06-00-02.gh-issue-103462.w6yBlM.rst diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index de5076a96218e0..3a697129e4c914 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -1176,6 +1176,9 @@ def writelines(self, list_of_data): return self._buffer.extend([memoryview(data) for data in list_of_data]) self._write_ready() + # If the entire buffer couldn't be written, register a write handler + if self._buffer: + self._loop._add_writer(self._sock_fd, self._write_ready) def can_write_eof(self): return True diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py index 921c98a2702d76..e41341fd26e19e 100644 --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -747,6 +747,48 @@ def test_write_sendmsg_no_data(self): self.assertFalse(self.sock.sendmsg.called) self.assertEqual(list_to_buffer([b'data']), transport._buffer) + @unittest.skipUnless(selector_events._HAS_SENDMSG, 'no sendmsg') + def test_writelines_sendmsg_full(self): + data = memoryview(b'data') + self.sock.sendmsg = mock.Mock() + self.sock.sendmsg.return_value = len(data) + + transport = self.socket_transport(sendmsg=True) + transport.writelines([data]) + self.assertTrue(self.sock.sendmsg.called) + self.assertFalse(self.loop.writers) + + @unittest.skipUnless(selector_events._HAS_SENDMSG, 'no sendmsg') + def test_writelines_sendmsg_partial(self): + data = memoryview(b'data') + self.sock.sendmsg = mock.Mock() + self.sock.sendmsg.return_value = 2 + + transport = self.socket_transport(sendmsg=True) + transport.writelines([data]) + self.assertTrue(self.sock.sendmsg.called) + self.assertTrue(self.loop.writers) + + def test_writelines_send_full(self): + data = memoryview(b'data') + self.sock.send.return_value = len(data) + self.sock.send.fileno.return_value = 7 + + transport = self.socket_transport() + transport.writelines([data]) + self.assertTrue(self.sock.send.called) + self.assertFalse(self.loop.writers) + + def test_writelines_send_partial(self): + data = memoryview(b'data') + self.sock.send.return_value = 2 + self.sock.send.fileno.return_value = 7 + + transport = self.socket_transport() + transport.writelines([data]) + self.assertTrue(self.sock.send.called) + self.assertTrue(self.loop.writers) + @unittest.skipUnless(selector_events._HAS_SENDMSG, 'no sendmsg') def test_write_sendmsg_full(self): data = memoryview(b'data') diff --git a/Misc/NEWS.d/next/Library/2023-04-12-06-00-02.gh-issue-103462.w6yBlM.rst b/Misc/NEWS.d/next/Library/2023-04-12-06-00-02.gh-issue-103462.w6yBlM.rst new file mode 100644 index 00000000000000..50758c89cc2856 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-12-06-00-02.gh-issue-103462.w6yBlM.rst @@ -0,0 +1,4 @@ +Fixed an issue with using :meth:`~asyncio.WriteTransport.writelines` in :mod:`asyncio` to send very +large payloads that exceed the amount of data that can be written in one +call to :meth:`socket.socket.send` or :meth:`socket.socket.sendmsg`, +resulting in the remaining buffer being left unwritten. From 59e0de4903c02e72b329e505fddf1ad9794928bc Mon Sep 17 00:00:00 2001 From: Tomas R Date: Thu, 13 Apr 2023 09:37:57 +0200 Subject: [PATCH 164/349] gh-102978: Fix mock.patch function signatures for class and staticmethod decorators (#103228) Fixes unittest.mock.patch not enforcing function signatures for methods decorated with @classmethod or @staticmethod when patch is called with autospec=True. --- .../test_unittest/testmock/testhelpers.py | 18 +++++++++++ Lib/test/test_unittest/testmock/testpatch.py | 30 +++++++++++++++++++ Lib/unittest/mock.py | 6 ++++ Misc/ACKS | 1 + ...-04-03-23-44-34.gh-issue-102978.gy9eVk.rst | 3 ++ 5 files changed, 58 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2023-04-03-23-44-34.gh-issue-102978.gy9eVk.rst diff --git a/Lib/test/test_unittest/testmock/testhelpers.py b/Lib/test/test_unittest/testmock/testhelpers.py index dc4d004cda8a75..74785a83757a92 100644 --- a/Lib/test/test_unittest/testmock/testhelpers.py +++ b/Lib/test/test_unittest/testmock/testhelpers.py @@ -952,6 +952,24 @@ def __getattr__(self, attribute): self.assertFalse(hasattr(autospec, '__name__')) + def test_autospec_signature_staticmethod(self): + class Foo: + @staticmethod + def static_method(a, b=10, *, c): pass + + mock = create_autospec(Foo.__dict__['static_method']) + self.assertEqual(inspect.signature(Foo.static_method), inspect.signature(mock)) + + + def test_autospec_signature_classmethod(self): + class Foo: + @classmethod + def class_method(cls, a, b=10, *, c): pass + + mock = create_autospec(Foo.__dict__['class_method']) + self.assertEqual(inspect.signature(Foo.class_method), inspect.signature(mock)) + + def test_spec_inspect_signature(self): def myfunc(x, y): pass diff --git a/Lib/test/test_unittest/testmock/testpatch.py b/Lib/test/test_unittest/testmock/testpatch.py index 8ceb5d973e1aaf..833d7da1f31a20 100644 --- a/Lib/test/test_unittest/testmock/testpatch.py +++ b/Lib/test/test_unittest/testmock/testpatch.py @@ -996,6 +996,36 @@ def test_autospec_classmethod(self): method.assert_called_once_with() + def test_autospec_staticmethod_signature(self): + # Patched methods which are decorated with @staticmethod should have the same signature + class Foo: + @staticmethod + def static_method(a, b=10, *, c): pass + + Foo.static_method(1, 2, c=3) + + with patch.object(Foo, 'static_method', autospec=True) as method: + method(1, 2, c=3) + self.assertRaises(TypeError, method) + self.assertRaises(TypeError, method, 1) + self.assertRaises(TypeError, method, 1, 2, 3, c=4) + + + def test_autospec_classmethod_signature(self): + # Patched methods which are decorated with @classmethod should have the same signature + class Foo: + @classmethod + def class_method(cls, a, b=10, *, c): pass + + Foo.class_method(1, 2, c=3) + + with patch.object(Foo, 'class_method', autospec=True) as method: + method(1, 2, c=3) + self.assertRaises(TypeError, method) + self.assertRaises(TypeError, method, 1) + self.assertRaises(TypeError, method, 1, 2, 3, c=4) + + def test_autospec_with_new(self): patcher = patch('%s.function' % __name__, new=3, autospec=True) self.assertRaises(TypeError, patcher.start) diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 0f93cb53c3d5ce..7ca085760650af 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -98,6 +98,12 @@ def _get_signature_object(func, as_instance, eat_self): func = func.__init__ # Skip the `self` argument in __init__ eat_self = True + elif isinstance(func, (classmethod, staticmethod)): + if isinstance(func, classmethod): + # Skip the `cls` argument of a class method + eat_self = True + # Use the original decorated method to extract the correct function signature + func = func.__func__ elif not isinstance(func, FunctionTypes): # If we really want to model an instance of the passed type, # __call__ should be looked up, not __init__. diff --git a/Misc/ACKS b/Misc/ACKS index 1e94d33a665e4c..d0ff4e8aeb5c90 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1550,6 +1550,7 @@ Hugo van Rossum Saskia van Rossum Robin Roth Clement Rouault +Tomas Roun Donald Wallace Rouse II Liam Routt Todd Rovito diff --git a/Misc/NEWS.d/next/Library/2023-04-03-23-44-34.gh-issue-102978.gy9eVk.rst b/Misc/NEWS.d/next/Library/2023-04-03-23-44-34.gh-issue-102978.gy9eVk.rst new file mode 100644 index 00000000000000..df63af10a385eb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-03-23-44-34.gh-issue-102978.gy9eVk.rst @@ -0,0 +1,3 @@ +Fixes :func:`unittest.mock.patch` not enforcing function signatures for methods +decorated with ``@classmethod`` or ``@staticmethod`` when patch is called with +``autospec=True``. From 70e0a28bed1354ec450989271152ae697e1f0993 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Thu, 13 Apr 2023 13:56:09 +0100 Subject: [PATCH 165/349] GH-103082: Turn on branch events for FOR_ITER instructions. (#103507) Turn on branch events for FOR_ITER instructions. --- Lib/test/test_monitoring.py | 71 +++++++++++++++++++++++++++++++++++++ Python/instrumentation.c | 2 ++ 2 files changed, 73 insertions(+) diff --git a/Lib/test/test_monitoring.py b/Lib/test/test_monitoring.py index 4aad3da61b6bee..738ace923cc523 100644 --- a/Lib/test/test_monitoring.py +++ b/Lib/test/test_monitoring.py @@ -1011,6 +1011,77 @@ def func3(): ('line', 'func3', 6)]) +def line_from_offset(code, offset): + for start, end, line in code.co_lines(): + if start <= offset < end: + return line - code.co_firstlineno + return -1 + +class JumpRecorder: + + event_type = E.JUMP + name = "jump" + + def __init__(self, events): + self.events = events + + def __call__(self, code, from_, to): + from_line = line_from_offset(code, from_) + to_line = line_from_offset(code, to) + self.events.append((self.name, code.co_name, from_line, to_line)) + + +class BranchRecorder(JumpRecorder): + + event_type = E.BRANCH + name = "branch" + + +JUMP_AND_BRANCH_RECORDERS = JumpRecorder, BranchRecorder +JUMP_BRANCH_AND_LINE_RECORDERS = JumpRecorder, BranchRecorder, LineRecorder + +class TestBranchAndJumpEvents(CheckEvents): + maxDiff = None + + def test_loop(self): + + def func(): + x = 1 + for a in range(2): + if a: + x = 4 + else: + x = 6 + + self.check_events(func, recorders = JUMP_AND_BRANCH_RECORDERS, expected = [ + ('branch', 'func', 2, 2), + ('branch', 'func', 3, 6), + ('jump', 'func', 6, 2), + ('branch', 'func', 2, 2), + ('branch', 'func', 3, 4), + ('jump', 'func', 4, 2), + ('branch', 'func', 2, 2)]) + + + self.check_events(func, recorders = JUMP_BRANCH_AND_LINE_RECORDERS, expected = [ + ('line', 'check_events', 10), + ('line', 'func', 1), + ('line', 'func', 2), + ('branch', 'func', 2, 2), + ('line', 'func', 3), + ('branch', 'func', 3, 6), + ('line', 'func', 6), + ('jump', 'func', 6, 2), + ('branch', 'func', 2, 2), + ('line', 'func', 3), + ('branch', 'func', 3, 4), + ('line', 'func', 4), + ('jump', 'func', 4, 2), + ('branch', 'func', 2, 2), + ('line', 'func', 2), + ('line', 'check_events', 11)]) + + class TestSetGetEvents(MonitoringTestBase, unittest.TestCase): def test_global(self): diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 39a7eaa3bd2d42..8dc8b01fcb0496 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -105,6 +105,8 @@ static const uint8_t INSTRUMENTED_OPCODES[256] = { [INSTRUMENTED_END_FOR] = INSTRUMENTED_END_FOR, [END_SEND] = INSTRUMENTED_END_SEND, [INSTRUMENTED_END_SEND] = INSTRUMENTED_END_SEND, + [FOR_ITER] = INSTRUMENTED_FOR_ITER, + [INSTRUMENTED_FOR_ITER] = INSTRUMENTED_FOR_ITER, [INSTRUMENTED_LINE] = INSTRUMENTED_LINE, [INSTRUMENTED_INSTRUCTION] = INSTRUMENTED_INSTRUCTION, From 4307feaddc76b9e93cd38e325a1f0ee59d593093 Mon Sep 17 00:00:00 2001 From: Stanislav Syekirin Date: Thu, 13 Apr 2023 15:17:14 +0200 Subject: [PATCH 166/349] gh-103088: Fix test_venv error message to avoid bytes/str warning (GH-103500) --- Lib/test/test_venv.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 23328431a7aad8..7cccbe84f4ebfa 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -623,8 +623,9 @@ def test_activate_shell_script_has_no_dos_newlines(self): script_path = venv_dir / scripts_dir / "activate" venv.create(venv_dir) with open(script_path, 'rb') as script: - for line in script: - self.assertFalse(line.endswith(b'\r\n'), line) + for i, line in enumerate(script, 1): + error_message = f"CR LF found in line {i}" + self.assertFalse(line.endswith(b'\r\n'), error_message) @requireVenvCreate class EnsurePipTest(BaseTest): From efb8a2553c88a295514be228c44fb99ef035e3fa Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Thu, 13 Apr 2023 16:19:07 +0100 Subject: [PATCH 167/349] GH-103488: Use return-offset, not yield-offset. (GH-103502) * Use return-offset, not yield-offset, so that instruction pointer is correct when sending to a generator or coroutine. --- Include/internal/pycore_frame.h | 10 +- Lib/test/test_generators.py | 15 + ...-04-12-20-18-51.gh-issue-103488.vYvlHD.rst | 3 + Python/bytecodes.c | 28 +- Python/ceval.c | 3 +- Python/generated_cases.c.h | 810 +++++++++--------- 6 files changed, 455 insertions(+), 414 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-04-12-20-18-51.gh-issue-103488.vYvlHD.rst diff --git a/Include/internal/pycore_frame.h b/Include/internal/pycore_frame.h index 856297aaea8ab4..20d48d20362571 100644 --- a/Include/internal/pycore_frame.h +++ b/Include/internal/pycore_frame.h @@ -61,7 +61,13 @@ typedef struct _PyInterpreterFrame { // over, or (in the case of a newly-created frame) a totally invalid value: _Py_CODEUNIT *prev_instr; int stacktop; /* Offset of TOS from localsplus */ - uint16_t yield_offset; + /* The return_offset determines where a `RETURN` should go in the caller, + * relative to `prev_instr`. + * It is only meaningful to the callee, + * so it needs to be set in any CALL (to a Python function) + * or SEND (to a coroutine or generator). + * If there is no callee, then it is meaningless. */ + uint16_t return_offset; char owner; /* Locals and stack */ PyObject *localsplus[1]; @@ -121,7 +127,7 @@ _PyFrame_Initialize( frame->stacktop = code->co_nlocalsplus; frame->frame_obj = NULL; frame->prev_instr = _PyCode_CODE(code) - 1; - frame->yield_offset = 0; + frame->return_offset = 0; frame->owner = FRAME_OWNED_BY_THREAD; for (int i = null_locals_from; i < code->co_nlocalsplus; i++) { diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py index a5949dec70d176..cc782ea1ee5dff 100644 --- a/Lib/test/test_generators.py +++ b/Lib/test/test_generators.py @@ -225,7 +225,22 @@ def f(): gi = f() self.assertIsNone(gi.gi_frame.f_back) + def test_issue103488(self): + def gen_raises(): + yield + raise ValueError() + + def loop(): + try: + for _ in gen_raises(): + if True is False: + return + except ValueError: + pass + + #This should not raise + loop() class ExceptionTest(unittest.TestCase): # Tests for the issue #23353: check that the currently handled exception diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-04-12-20-18-51.gh-issue-103488.vYvlHD.rst b/Misc/NEWS.d/next/Core and Builtins/2023-04-12-20-18-51.gh-issue-103488.vYvlHD.rst new file mode 100644 index 00000000000000..e7daa104e57105 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-04-12-20-18-51.gh-issue-103488.vYvlHD.rst @@ -0,0 +1,3 @@ +Change the internal offset distinguishing yield and return target addresses, +so that the instruction pointer is correct for exception handling and other +stack unwinding. diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 5c6398aba198f9..7af96b4a5e324e 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -506,6 +506,7 @@ dummy_func( new_frame->localsplus[0] = container; new_frame->localsplus[1] = sub; JUMPBY(INLINE_CACHE_ENTRIES_BINARY_SUBSCR); + frame->return_offset = 0; DISPATCH_INLINED(new_frame); } @@ -637,6 +638,7 @@ dummy_func( _PyInterpreterFrame *dying = frame; frame = cframe.current_frame = dying->previous; _PyEvalFrameClearAndPop(tstate, dying); + frame->prev_instr += frame->return_offset; _PyFrame_StackPush(frame, retval); goto resume_frame; } @@ -655,6 +657,7 @@ dummy_func( _PyInterpreterFrame *dying = frame; frame = cframe.current_frame = dying->previous; _PyEvalFrameClearAndPop(tstate, dying); + frame->prev_instr += frame->return_offset; _PyFrame_StackPush(frame, retval); goto resume_frame; } @@ -670,6 +673,7 @@ dummy_func( _PyInterpreterFrame *dying = frame; frame = cframe.current_frame = dying->previous; _PyEvalFrameClearAndPop(tstate, dying); + frame->prev_instr += frame->return_offset; _PyFrame_StackPush(frame, retval); goto resume_frame; } @@ -689,6 +693,7 @@ dummy_func( _PyInterpreterFrame *dying = frame; frame = cframe.current_frame = dying->previous; _PyEvalFrameClearAndPop(tstate, dying); + frame->prev_instr += frame->return_offset; _PyFrame_StackPush(frame, retval); goto resume_frame; } @@ -823,13 +828,13 @@ dummy_func( { PyGenObject *gen = (PyGenObject *)receiver; _PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; - frame->yield_offset = oparg; + frame->return_offset = oparg; STACK_SHRINK(1); _PyFrame_StackPush(gen_frame, v); gen->gi_frame_state = FRAME_EXECUTING; gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; - JUMPBY(INLINE_CACHE_ENTRIES_SEND + oparg); + JUMPBY(INLINE_CACHE_ENTRIES_SEND); DISPATCH_INLINED(gen_frame); } if (Py_IsNone(v) && PyIter_Check(receiver)) { @@ -861,13 +866,13 @@ dummy_func( DEOPT_IF(gen->gi_frame_state >= FRAME_EXECUTING, SEND); STAT_INC(SEND, hit); _PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; - frame->yield_offset = oparg; + frame->return_offset = oparg; STACK_SHRINK(1); _PyFrame_StackPush(gen_frame, v); gen->gi_frame_state = FRAME_EXECUTING; gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; - JUMPBY(INLINE_CACHE_ENTRIES_SEND + oparg); + JUMPBY(INLINE_CACHE_ENTRIES_SEND); DISPATCH_INLINED(gen_frame); } @@ -886,7 +891,6 @@ dummy_func( _PyInterpreterFrame *gen_frame = frame; frame = cframe.current_frame = frame->previous; gen_frame->previous = NULL; - frame->prev_instr -= frame->yield_offset; _PyFrame_StackPush(frame, retval); goto resume_frame; } @@ -905,7 +909,6 @@ dummy_func( _PyInterpreterFrame *gen_frame = frame; frame = cframe.current_frame = frame->previous; gen_frame->previous = NULL; - frame->prev_instr -= frame->yield_offset; _PyFrame_StackPush(frame, retval); goto resume_frame; } @@ -1724,6 +1727,7 @@ dummy_func( STACK_SHRINK(shrink_stack); new_frame->localsplus[0] = owner; JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); + frame->return_offset = 0; DISPATCH_INLINED(new_frame); } @@ -1751,6 +1755,7 @@ dummy_func( new_frame->localsplus[0] = owner; new_frame->localsplus[1] = Py_NewRef(name); JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); + frame->return_offset = 0; DISPATCH_INLINED(new_frame); } @@ -2259,14 +2264,14 @@ dummy_func( DEOPT_IF(gen->gi_frame_state >= FRAME_EXECUTING, FOR_ITER); STAT_INC(FOR_ITER, hit); _PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; - frame->yield_offset = oparg; + frame->return_offset = oparg; _PyFrame_StackPush(gen_frame, Py_NewRef(Py_None)); gen->gi_frame_state = FRAME_EXECUTING; gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; - JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg); - assert(next_instr->op.code == END_FOR || - next_instr->op.code == INSTRUMENTED_END_FOR); + JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER); + assert(next_instr[oparg].op.code == END_FOR || + next_instr[oparg].op.code == INSTRUMENTED_END_FOR); DISPATCH_INLINED(gen_frame); } @@ -2521,6 +2526,7 @@ dummy_func( goto error; } JUMPBY(INLINE_CACHE_ENTRIES_CALL); + frame->return_offset = 0; DISPATCH_INLINED(new_frame); } /* Callable is not a normal Python function */ @@ -2594,6 +2600,7 @@ dummy_func( // Manipulate stack directly since we leave using DISPATCH_INLINED(). STACK_SHRINK(oparg + 2); JUMPBY(INLINE_CACHE_ENTRIES_CALL); + frame->return_offset = 0; DISPATCH_INLINED(new_frame); } @@ -2631,6 +2638,7 @@ dummy_func( // Manipulate stack and cache directly since we leave using DISPATCH_INLINED(). STACK_SHRINK(oparg + 2); JUMPBY(INLINE_CACHE_ENTRIES_CALL); + frame->return_offset = 0; DISPATCH_INLINED(new_frame); } diff --git a/Python/ceval.c b/Python/ceval.c index a38c9ec9ad5f9c..8c43e3d89c2c2a 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -672,7 +672,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int _PyCode_CODE(tstate->interp->interpreter_trampoline); entry_frame.stacktop = 0; entry_frame.owner = FRAME_OWNED_BY_CSTACK; - entry_frame.yield_offset = 0; + entry_frame.return_offset = 0; /* Push frame */ entry_frame.previous = prev_cframe->current_frame; frame->previous = &entry_frame; @@ -881,6 +881,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int _PyInterpreterFrame *dying = frame; frame = cframe.current_frame = dying->previous; _PyEvalFrameClearAndPop(tstate, dying); + frame->return_offset = 0; if (frame == &entry_frame) { /* Restore previous cframe and exit */ tstate->cframe = cframe.previous; diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 4d52e95dc04a27..0928f8200ae751 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -715,16 +715,17 @@ new_frame->localsplus[0] = container; new_frame->localsplus[1] = sub; JUMPBY(INLINE_CACHE_ENTRIES_BINARY_SUBSCR); + frame->return_offset = 0; DISPATCH_INLINED(new_frame); - #line 720 "Python/generated_cases.c.h" + #line 721 "Python/generated_cases.c.h" } TARGET(LIST_APPEND) { PyObject *v = stack_pointer[-1]; PyObject *list = stack_pointer[-(2 + (oparg-1))]; - #line 513 "Python/bytecodes.c" + #line 514 "Python/bytecodes.c" if (_PyList_AppendTakeRef((PyListObject *)list, v) < 0) goto pop_1_error; - #line 728 "Python/generated_cases.c.h" + #line 729 "Python/generated_cases.c.h" STACK_SHRINK(1); PREDICT(JUMP_BACKWARD); DISPATCH(); @@ -733,13 +734,13 @@ TARGET(SET_ADD) { PyObject *v = stack_pointer[-1]; PyObject *set = stack_pointer[-(2 + (oparg-1))]; - #line 518 "Python/bytecodes.c" + #line 519 "Python/bytecodes.c" int err = PySet_Add(set, v); - #line 739 "Python/generated_cases.c.h" + #line 740 "Python/generated_cases.c.h" Py_DECREF(v); - #line 520 "Python/bytecodes.c" + #line 521 "Python/bytecodes.c" if (err) goto pop_1_error; - #line 743 "Python/generated_cases.c.h" + #line 744 "Python/generated_cases.c.h" STACK_SHRINK(1); PREDICT(JUMP_BACKWARD); DISPATCH(); @@ -752,7 +753,7 @@ PyObject *container = stack_pointer[-2]; PyObject *v = stack_pointer[-3]; uint16_t counter = read_u16(&next_instr[0].cache); - #line 531 "Python/bytecodes.c" + #line 532 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION if (ADAPTIVE_COUNTER_IS_ZERO(counter)) { next_instr--; @@ -767,13 +768,13 @@ #endif /* ENABLE_SPECIALIZATION */ /* container[sub] = v */ int err = PyObject_SetItem(container, sub, v); - #line 771 "Python/generated_cases.c.h" + #line 772 "Python/generated_cases.c.h" Py_DECREF(v); Py_DECREF(container); Py_DECREF(sub); - #line 546 "Python/bytecodes.c" + #line 547 "Python/bytecodes.c" if (err) goto pop_3_error; - #line 777 "Python/generated_cases.c.h" + #line 778 "Python/generated_cases.c.h" STACK_SHRINK(3); next_instr += 1; DISPATCH(); @@ -783,7 +784,7 @@ PyObject *sub = stack_pointer[-1]; PyObject *list = stack_pointer[-2]; PyObject *value = stack_pointer[-3]; - #line 550 "Python/bytecodes.c" + #line 551 "Python/bytecodes.c" DEOPT_IF(!PyLong_CheckExact(sub), STORE_SUBSCR); DEOPT_IF(!PyList_CheckExact(list), STORE_SUBSCR); @@ -800,7 +801,7 @@ Py_DECREF(old_value); _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); Py_DECREF(list); - #line 804 "Python/generated_cases.c.h" + #line 805 "Python/generated_cases.c.h" STACK_SHRINK(3); next_instr += 1; DISPATCH(); @@ -810,13 +811,13 @@ PyObject *sub = stack_pointer[-1]; PyObject *dict = stack_pointer[-2]; PyObject *value = stack_pointer[-3]; - #line 569 "Python/bytecodes.c" + #line 570 "Python/bytecodes.c" DEOPT_IF(!PyDict_CheckExact(dict), STORE_SUBSCR); STAT_INC(STORE_SUBSCR, hit); int err = _PyDict_SetItem_Take2((PyDictObject *)dict, sub, value); Py_DECREF(dict); if (err) goto pop_3_error; - #line 820 "Python/generated_cases.c.h" + #line 821 "Python/generated_cases.c.h" STACK_SHRINK(3); next_instr += 1; DISPATCH(); @@ -825,15 +826,15 @@ TARGET(DELETE_SUBSCR) { PyObject *sub = stack_pointer[-1]; PyObject *container = stack_pointer[-2]; - #line 577 "Python/bytecodes.c" + #line 578 "Python/bytecodes.c" /* del container[sub] */ int err = PyObject_DelItem(container, sub); - #line 832 "Python/generated_cases.c.h" + #line 833 "Python/generated_cases.c.h" Py_DECREF(container); Py_DECREF(sub); - #line 580 "Python/bytecodes.c" + #line 581 "Python/bytecodes.c" if (err) goto pop_2_error; - #line 837 "Python/generated_cases.c.h" + #line 838 "Python/generated_cases.c.h" STACK_SHRINK(2); DISPATCH(); } @@ -841,14 +842,14 @@ TARGET(CALL_INTRINSIC_1) { PyObject *value = stack_pointer[-1]; PyObject *res; - #line 584 "Python/bytecodes.c" + #line 585 "Python/bytecodes.c" assert(oparg <= MAX_INTRINSIC_1); res = _PyIntrinsics_UnaryFunctions[oparg](tstate, value); - #line 848 "Python/generated_cases.c.h" + #line 849 "Python/generated_cases.c.h" Py_DECREF(value); - #line 587 "Python/bytecodes.c" + #line 588 "Python/bytecodes.c" if (res == NULL) goto pop_1_error; - #line 852 "Python/generated_cases.c.h" + #line 853 "Python/generated_cases.c.h" stack_pointer[-1] = res; DISPATCH(); } @@ -857,15 +858,15 @@ PyObject *value1 = stack_pointer[-1]; PyObject *value2 = stack_pointer[-2]; PyObject *res; - #line 591 "Python/bytecodes.c" + #line 592 "Python/bytecodes.c" assert(oparg <= MAX_INTRINSIC_2); res = _PyIntrinsics_BinaryFunctions[oparg](tstate, value2, value1); - #line 864 "Python/generated_cases.c.h" + #line 865 "Python/generated_cases.c.h" Py_DECREF(value2); Py_DECREF(value1); - #line 594 "Python/bytecodes.c" + #line 595 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; - #line 869 "Python/generated_cases.c.h" + #line 870 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; DISPATCH(); @@ -873,7 +874,7 @@ TARGET(RAISE_VARARGS) { PyObject **args = (stack_pointer - oparg); - #line 598 "Python/bytecodes.c" + #line 599 "Python/bytecodes.c" PyObject *cause = NULL, *exc = NULL; switch (oparg) { case 2: @@ -891,12 +892,12 @@ break; } if (true) { STACK_SHRINK(oparg); goto error; } - #line 895 "Python/generated_cases.c.h" + #line 896 "Python/generated_cases.c.h" } TARGET(INTERPRETER_EXIT) { PyObject *retval = stack_pointer[-1]; - #line 618 "Python/bytecodes.c" + #line 619 "Python/bytecodes.c" assert(frame == &entry_frame); assert(_PyFrame_IsIncomplete(frame)); STACK_SHRINK(1); // Since we're not going to DISPATCH() @@ -907,12 +908,12 @@ assert(!_PyErr_Occurred(tstate)); _Py_LeaveRecursiveCallTstate(tstate); return retval; - #line 911 "Python/generated_cases.c.h" + #line 912 "Python/generated_cases.c.h" } TARGET(RETURN_VALUE) { PyObject *retval = stack_pointer[-1]; - #line 631 "Python/bytecodes.c" + #line 632 "Python/bytecodes.c" STACK_SHRINK(1); assert(EMPTY()); _PyFrame_SetStackPointer(frame, stack_pointer); @@ -922,14 +923,15 @@ _PyInterpreterFrame *dying = frame; frame = cframe.current_frame = dying->previous; _PyEvalFrameClearAndPop(tstate, dying); + frame->prev_instr += frame->return_offset; _PyFrame_StackPush(frame, retval); goto resume_frame; - #line 928 "Python/generated_cases.c.h" + #line 930 "Python/generated_cases.c.h" } TARGET(INSTRUMENTED_RETURN_VALUE) { PyObject *retval = stack_pointer[-1]; - #line 645 "Python/bytecodes.c" + #line 647 "Python/bytecodes.c" int err = _Py_call_instrumentation_arg( tstate, PY_MONITORING_EVENT_PY_RETURN, frame, next_instr-1, retval); @@ -943,13 +945,14 @@ _PyInterpreterFrame *dying = frame; frame = cframe.current_frame = dying->previous; _PyEvalFrameClearAndPop(tstate, dying); + frame->prev_instr += frame->return_offset; _PyFrame_StackPush(frame, retval); goto resume_frame; - #line 949 "Python/generated_cases.c.h" + #line 952 "Python/generated_cases.c.h" } TARGET(RETURN_CONST) { - #line 663 "Python/bytecodes.c" + #line 666 "Python/bytecodes.c" PyObject *retval = GETITEM(frame->f_code->co_consts, oparg); Py_INCREF(retval); assert(EMPTY()); @@ -960,13 +963,14 @@ _PyInterpreterFrame *dying = frame; frame = cframe.current_frame = dying->previous; _PyEvalFrameClearAndPop(tstate, dying); + frame->prev_instr += frame->return_offset; _PyFrame_StackPush(frame, retval); goto resume_frame; - #line 966 "Python/generated_cases.c.h" + #line 970 "Python/generated_cases.c.h" } TARGET(INSTRUMENTED_RETURN_CONST) { - #line 678 "Python/bytecodes.c" + #line 682 "Python/bytecodes.c" PyObject *retval = GETITEM(frame->f_code->co_consts, oparg); int err = _Py_call_instrumentation_arg( tstate, PY_MONITORING_EVENT_PY_RETURN, @@ -981,15 +985,16 @@ _PyInterpreterFrame *dying = frame; frame = cframe.current_frame = dying->previous; _PyEvalFrameClearAndPop(tstate, dying); + frame->prev_instr += frame->return_offset; _PyFrame_StackPush(frame, retval); goto resume_frame; - #line 987 "Python/generated_cases.c.h" + #line 992 "Python/generated_cases.c.h" } TARGET(GET_AITER) { PyObject *obj = stack_pointer[-1]; PyObject *iter; - #line 697 "Python/bytecodes.c" + #line 702 "Python/bytecodes.c" unaryfunc getter = NULL; PyTypeObject *type = Py_TYPE(obj); @@ -1002,16 +1007,16 @@ "'async for' requires an object with " "__aiter__ method, got %.100s", type->tp_name); - #line 1006 "Python/generated_cases.c.h" + #line 1011 "Python/generated_cases.c.h" Py_DECREF(obj); - #line 710 "Python/bytecodes.c" + #line 715 "Python/bytecodes.c" if (true) goto pop_1_error; } iter = (*getter)(obj); - #line 1013 "Python/generated_cases.c.h" + #line 1018 "Python/generated_cases.c.h" Py_DECREF(obj); - #line 715 "Python/bytecodes.c" + #line 720 "Python/bytecodes.c" if (iter == NULL) goto pop_1_error; if (Py_TYPE(iter)->tp_as_async == NULL || @@ -1024,7 +1029,7 @@ Py_DECREF(iter); if (true) goto pop_1_error; } - #line 1028 "Python/generated_cases.c.h" + #line 1033 "Python/generated_cases.c.h" stack_pointer[-1] = iter; DISPATCH(); } @@ -1032,7 +1037,7 @@ TARGET(GET_ANEXT) { PyObject *aiter = stack_pointer[-1]; PyObject *awaitable; - #line 730 "Python/bytecodes.c" + #line 735 "Python/bytecodes.c" unaryfunc getter = NULL; PyObject *next_iter = NULL; PyTypeObject *type = Py_TYPE(aiter); @@ -1076,7 +1081,7 @@ } } - #line 1080 "Python/generated_cases.c.h" + #line 1085 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = awaitable; PREDICT(LOAD_CONST); @@ -1087,16 +1092,16 @@ PREDICTED(GET_AWAITABLE); PyObject *iterable = stack_pointer[-1]; PyObject *iter; - #line 777 "Python/bytecodes.c" + #line 782 "Python/bytecodes.c" iter = _PyCoro_GetAwaitableIter(iterable); if (iter == NULL) { format_awaitable_error(tstate, Py_TYPE(iterable), oparg); } - #line 1098 "Python/generated_cases.c.h" + #line 1103 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 784 "Python/bytecodes.c" + #line 789 "Python/bytecodes.c" if (iter != NULL && PyCoro_CheckExact(iter)) { PyObject *yf = _PyGen_yf((PyGenObject*)iter); @@ -1114,7 +1119,7 @@ if (iter == NULL) goto pop_1_error; - #line 1118 "Python/generated_cases.c.h" + #line 1123 "Python/generated_cases.c.h" stack_pointer[-1] = iter; PREDICT(LOAD_CONST); DISPATCH(); @@ -1125,7 +1130,7 @@ PyObject *v = stack_pointer[-1]; PyObject *receiver = stack_pointer[-2]; PyObject *retval; - #line 810 "Python/bytecodes.c" + #line 815 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PySendCache *cache = (_PySendCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -1142,13 +1147,13 @@ { PyGenObject *gen = (PyGenObject *)receiver; _PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; - frame->yield_offset = oparg; + frame->return_offset = oparg; STACK_SHRINK(1); _PyFrame_StackPush(gen_frame, v); gen->gi_frame_state = FRAME_EXECUTING; gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; - JUMPBY(INLINE_CACHE_ENTRIES_SEND + oparg); + JUMPBY(INLINE_CACHE_ENTRIES_SEND); DISPATCH_INLINED(gen_frame); } if (Py_IsNone(v) && PyIter_Check(receiver)) { @@ -1171,7 +1176,7 @@ } } Py_DECREF(v); - #line 1175 "Python/generated_cases.c.h" + #line 1180 "Python/generated_cases.c.h" stack_pointer[-1] = retval; next_instr += 1; DISPATCH(); @@ -1180,27 +1185,27 @@ TARGET(SEND_GEN) { PyObject *v = stack_pointer[-1]; PyObject *receiver = stack_pointer[-2]; - #line 858 "Python/bytecodes.c" + #line 863 "Python/bytecodes.c" PyGenObject *gen = (PyGenObject *)receiver; DEOPT_IF(Py_TYPE(gen) != &PyGen_Type && Py_TYPE(gen) != &PyCoro_Type, SEND); DEOPT_IF(gen->gi_frame_state >= FRAME_EXECUTING, SEND); STAT_INC(SEND, hit); _PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; - frame->yield_offset = oparg; + frame->return_offset = oparg; STACK_SHRINK(1); _PyFrame_StackPush(gen_frame, v); gen->gi_frame_state = FRAME_EXECUTING; gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; - JUMPBY(INLINE_CACHE_ENTRIES_SEND + oparg); + JUMPBY(INLINE_CACHE_ENTRIES_SEND); DISPATCH_INLINED(gen_frame); - #line 1199 "Python/generated_cases.c.h" + #line 1204 "Python/generated_cases.c.h" } TARGET(INSTRUMENTED_YIELD_VALUE) { PyObject *retval = stack_pointer[-1]; - #line 875 "Python/bytecodes.c" + #line 880 "Python/bytecodes.c" assert(frame != &entry_frame); PyGenObject *gen = _PyFrame_GetGenerator(frame); gen->gi_frame_state = FRAME_SUSPENDED; @@ -1215,15 +1220,14 @@ _PyInterpreterFrame *gen_frame = frame; frame = cframe.current_frame = frame->previous; gen_frame->previous = NULL; - frame->prev_instr -= frame->yield_offset; _PyFrame_StackPush(frame, retval); goto resume_frame; - #line 1222 "Python/generated_cases.c.h" + #line 1226 "Python/generated_cases.c.h" } TARGET(YIELD_VALUE) { PyObject *retval = stack_pointer[-1]; - #line 895 "Python/bytecodes.c" + #line 899 "Python/bytecodes.c" // NOTE: It's important that YIELD_VALUE never raises an exception! // The compiler treats any exception raised here as a failed close() // or throw() call. @@ -1237,18 +1241,17 @@ _PyInterpreterFrame *gen_frame = frame; frame = cframe.current_frame = frame->previous; gen_frame->previous = NULL; - frame->prev_instr -= frame->yield_offset; _PyFrame_StackPush(frame, retval); goto resume_frame; - #line 1244 "Python/generated_cases.c.h" + #line 1247 "Python/generated_cases.c.h" } TARGET(POP_EXCEPT) { PyObject *exc_value = stack_pointer[-1]; - #line 914 "Python/bytecodes.c" + #line 917 "Python/bytecodes.c" _PyErr_StackItem *exc_info = tstate->exc_info; Py_XSETREF(exc_info->exc_value, exc_value); - #line 1252 "Python/generated_cases.c.h" + #line 1255 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } @@ -1256,7 +1259,7 @@ TARGET(RERAISE) { PyObject *exc = stack_pointer[-1]; PyObject **values = (stack_pointer - (1 + oparg)); - #line 919 "Python/bytecodes.c" + #line 922 "Python/bytecodes.c" assert(oparg >= 0 && oparg <= 2); if (oparg) { PyObject *lasti = values[0]; @@ -1274,26 +1277,26 @@ Py_INCREF(exc); _PyErr_SetRaisedException(tstate, exc); goto exception_unwind; - #line 1278 "Python/generated_cases.c.h" + #line 1281 "Python/generated_cases.c.h" } TARGET(END_ASYNC_FOR) { PyObject *exc = stack_pointer[-1]; PyObject *awaitable = stack_pointer[-2]; - #line 939 "Python/bytecodes.c" + #line 942 "Python/bytecodes.c" assert(exc && PyExceptionInstance_Check(exc)); if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) { - #line 1287 "Python/generated_cases.c.h" + #line 1290 "Python/generated_cases.c.h" Py_DECREF(awaitable); Py_DECREF(exc); - #line 942 "Python/bytecodes.c" + #line 945 "Python/bytecodes.c" } else { Py_INCREF(exc); _PyErr_SetRaisedException(tstate, exc); goto exception_unwind; } - #line 1297 "Python/generated_cases.c.h" + #line 1300 "Python/generated_cases.c.h" STACK_SHRINK(2); DISPATCH(); } @@ -1304,23 +1307,23 @@ PyObject *sub_iter = stack_pointer[-3]; PyObject *none; PyObject *value; - #line 951 "Python/bytecodes.c" + #line 954 "Python/bytecodes.c" assert(throwflag); assert(exc_value && PyExceptionInstance_Check(exc_value)); if (PyErr_GivenExceptionMatches(exc_value, PyExc_StopIteration)) { value = Py_NewRef(((PyStopIterationObject *)exc_value)->value); - #line 1313 "Python/generated_cases.c.h" + #line 1316 "Python/generated_cases.c.h" Py_DECREF(sub_iter); Py_DECREF(last_sent_val); Py_DECREF(exc_value); - #line 956 "Python/bytecodes.c" + #line 959 "Python/bytecodes.c" none = Py_NewRef(Py_None); } else { _PyErr_SetRaisedException(tstate, Py_NewRef(exc_value)); goto exception_unwind; } - #line 1324 "Python/generated_cases.c.h" + #line 1327 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = value; stack_pointer[-2] = none; @@ -1329,9 +1332,9 @@ TARGET(LOAD_ASSERTION_ERROR) { PyObject *value; - #line 965 "Python/bytecodes.c" + #line 968 "Python/bytecodes.c" value = Py_NewRef(PyExc_AssertionError); - #line 1335 "Python/generated_cases.c.h" + #line 1338 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = value; DISPATCH(); @@ -1339,7 +1342,7 @@ TARGET(LOAD_BUILD_CLASS) { PyObject *bc; - #line 969 "Python/bytecodes.c" + #line 972 "Python/bytecodes.c" if (PyDict_CheckExact(BUILTINS())) { bc = _PyDict_GetItemWithError(BUILTINS(), &_Py_ID(__build_class__)); @@ -1361,7 +1364,7 @@ if (true) goto error; } } - #line 1365 "Python/generated_cases.c.h" + #line 1368 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = bc; DISPATCH(); @@ -1369,33 +1372,33 @@ TARGET(STORE_NAME) { PyObject *v = stack_pointer[-1]; - #line 993 "Python/bytecodes.c" + #line 996 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); PyObject *ns = LOCALS(); int err; if (ns == NULL) { _PyErr_Format(tstate, PyExc_SystemError, "no locals found when storing %R", name); - #line 1380 "Python/generated_cases.c.h" + #line 1383 "Python/generated_cases.c.h" Py_DECREF(v); - #line 1000 "Python/bytecodes.c" + #line 1003 "Python/bytecodes.c" if (true) goto pop_1_error; } if (PyDict_CheckExact(ns)) err = PyDict_SetItem(ns, name, v); else err = PyObject_SetItem(ns, name, v); - #line 1389 "Python/generated_cases.c.h" + #line 1392 "Python/generated_cases.c.h" Py_DECREF(v); - #line 1007 "Python/bytecodes.c" + #line 1010 "Python/bytecodes.c" if (err) goto pop_1_error; - #line 1393 "Python/generated_cases.c.h" + #line 1396 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(DELETE_NAME) { - #line 1011 "Python/bytecodes.c" + #line 1014 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); PyObject *ns = LOCALS(); int err; @@ -1412,7 +1415,7 @@ name); goto error; } - #line 1416 "Python/generated_cases.c.h" + #line 1419 "Python/generated_cases.c.h" DISPATCH(); } @@ -1420,7 +1423,7 @@ PREDICTED(UNPACK_SEQUENCE); static_assert(INLINE_CACHE_ENTRIES_UNPACK_SEQUENCE == 1, "incorrect cache size"); PyObject *seq = stack_pointer[-1]; - #line 1037 "Python/bytecodes.c" + #line 1040 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyUnpackSequenceCache *cache = (_PyUnpackSequenceCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -1433,11 +1436,11 @@ #endif /* ENABLE_SPECIALIZATION */ PyObject **top = stack_pointer + oparg - 1; int res = unpack_iterable(tstate, seq, oparg, -1, top); - #line 1437 "Python/generated_cases.c.h" + #line 1440 "Python/generated_cases.c.h" Py_DECREF(seq); - #line 1050 "Python/bytecodes.c" + #line 1053 "Python/bytecodes.c" if (res == 0) goto pop_1_error; - #line 1441 "Python/generated_cases.c.h" + #line 1444 "Python/generated_cases.c.h" STACK_SHRINK(1); STACK_GROW(oparg); next_instr += 1; @@ -1447,14 +1450,14 @@ TARGET(UNPACK_SEQUENCE_TWO_TUPLE) { PyObject *seq = stack_pointer[-1]; PyObject **values = stack_pointer - (1); - #line 1054 "Python/bytecodes.c" + #line 1057 "Python/bytecodes.c" DEOPT_IF(!PyTuple_CheckExact(seq), UNPACK_SEQUENCE); DEOPT_IF(PyTuple_GET_SIZE(seq) != 2, UNPACK_SEQUENCE); assert(oparg == 2); STAT_INC(UNPACK_SEQUENCE, hit); values[0] = Py_NewRef(PyTuple_GET_ITEM(seq, 1)); values[1] = Py_NewRef(PyTuple_GET_ITEM(seq, 0)); - #line 1458 "Python/generated_cases.c.h" + #line 1461 "Python/generated_cases.c.h" Py_DECREF(seq); STACK_SHRINK(1); STACK_GROW(oparg); @@ -1465,7 +1468,7 @@ TARGET(UNPACK_SEQUENCE_TUPLE) { PyObject *seq = stack_pointer[-1]; PyObject **values = stack_pointer - (1); - #line 1064 "Python/bytecodes.c" + #line 1067 "Python/bytecodes.c" DEOPT_IF(!PyTuple_CheckExact(seq), UNPACK_SEQUENCE); DEOPT_IF(PyTuple_GET_SIZE(seq) != oparg, UNPACK_SEQUENCE); STAT_INC(UNPACK_SEQUENCE, hit); @@ -1473,7 +1476,7 @@ for (int i = oparg; --i >= 0; ) { *values++ = Py_NewRef(items[i]); } - #line 1477 "Python/generated_cases.c.h" + #line 1480 "Python/generated_cases.c.h" Py_DECREF(seq); STACK_SHRINK(1); STACK_GROW(oparg); @@ -1484,7 +1487,7 @@ TARGET(UNPACK_SEQUENCE_LIST) { PyObject *seq = stack_pointer[-1]; PyObject **values = stack_pointer - (1); - #line 1075 "Python/bytecodes.c" + #line 1078 "Python/bytecodes.c" DEOPT_IF(!PyList_CheckExact(seq), UNPACK_SEQUENCE); DEOPT_IF(PyList_GET_SIZE(seq) != oparg, UNPACK_SEQUENCE); STAT_INC(UNPACK_SEQUENCE, hit); @@ -1492,7 +1495,7 @@ for (int i = oparg; --i >= 0; ) { *values++ = Py_NewRef(items[i]); } - #line 1496 "Python/generated_cases.c.h" + #line 1499 "Python/generated_cases.c.h" Py_DECREF(seq); STACK_SHRINK(1); STACK_GROW(oparg); @@ -1502,15 +1505,15 @@ TARGET(UNPACK_EX) { PyObject *seq = stack_pointer[-1]; - #line 1086 "Python/bytecodes.c" + #line 1089 "Python/bytecodes.c" int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8); PyObject **top = stack_pointer + totalargs - 1; int res = unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8, top); - #line 1510 "Python/generated_cases.c.h" + #line 1513 "Python/generated_cases.c.h" Py_DECREF(seq); - #line 1090 "Python/bytecodes.c" + #line 1093 "Python/bytecodes.c" if (res == 0) goto pop_1_error; - #line 1514 "Python/generated_cases.c.h" + #line 1517 "Python/generated_cases.c.h" STACK_GROW((oparg & 0xFF) + (oparg >> 8)); DISPATCH(); } @@ -1521,7 +1524,7 @@ PyObject *owner = stack_pointer[-1]; PyObject *v = stack_pointer[-2]; uint16_t counter = read_u16(&next_instr[0].cache); - #line 1101 "Python/bytecodes.c" + #line 1104 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION if (ADAPTIVE_COUNTER_IS_ZERO(counter)) { PyObject *name = GETITEM(frame->f_code->co_names, oparg); @@ -1537,12 +1540,12 @@ #endif /* ENABLE_SPECIALIZATION */ PyObject *name = GETITEM(frame->f_code->co_names, oparg); int err = PyObject_SetAttr(owner, name, v); - #line 1541 "Python/generated_cases.c.h" + #line 1544 "Python/generated_cases.c.h" Py_DECREF(v); Py_DECREF(owner); - #line 1117 "Python/bytecodes.c" + #line 1120 "Python/bytecodes.c" if (err) goto pop_2_error; - #line 1546 "Python/generated_cases.c.h" + #line 1549 "Python/generated_cases.c.h" STACK_SHRINK(2); next_instr += 4; DISPATCH(); @@ -1550,34 +1553,34 @@ TARGET(DELETE_ATTR) { PyObject *owner = stack_pointer[-1]; - #line 1121 "Python/bytecodes.c" + #line 1124 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); int err = PyObject_SetAttr(owner, name, (PyObject *)NULL); - #line 1557 "Python/generated_cases.c.h" + #line 1560 "Python/generated_cases.c.h" Py_DECREF(owner); - #line 1124 "Python/bytecodes.c" + #line 1127 "Python/bytecodes.c" if (err) goto pop_1_error; - #line 1561 "Python/generated_cases.c.h" + #line 1564 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(STORE_GLOBAL) { PyObject *v = stack_pointer[-1]; - #line 1128 "Python/bytecodes.c" + #line 1131 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); int err = PyDict_SetItem(GLOBALS(), name, v); - #line 1571 "Python/generated_cases.c.h" + #line 1574 "Python/generated_cases.c.h" Py_DECREF(v); - #line 1131 "Python/bytecodes.c" + #line 1134 "Python/bytecodes.c" if (err) goto pop_1_error; - #line 1575 "Python/generated_cases.c.h" + #line 1578 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(DELETE_GLOBAL) { - #line 1135 "Python/bytecodes.c" + #line 1138 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); int err; err = PyDict_DelItem(GLOBALS(), name); @@ -1589,13 +1592,13 @@ } goto error; } - #line 1593 "Python/generated_cases.c.h" + #line 1596 "Python/generated_cases.c.h" DISPATCH(); } TARGET(LOAD_NAME) { PyObject *v; - #line 1149 "Python/bytecodes.c" + #line 1152 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); PyObject *locals = LOCALS(); if (locals == NULL) { @@ -1654,7 +1657,7 @@ } } } - #line 1658 "Python/generated_cases.c.h" + #line 1661 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = v; DISPATCH(); @@ -1665,7 +1668,7 @@ static_assert(INLINE_CACHE_ENTRIES_LOAD_GLOBAL == 4, "incorrect cache size"); PyObject *null = NULL; PyObject *v; - #line 1216 "Python/bytecodes.c" + #line 1219 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyLoadGlobalCache *cache = (_PyLoadGlobalCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -1717,7 +1720,7 @@ } } null = NULL; - #line 1721 "Python/generated_cases.c.h" + #line 1724 "Python/generated_cases.c.h" STACK_GROW(1); STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = v; @@ -1731,7 +1734,7 @@ PyObject *res; uint16_t index = read_u16(&next_instr[1].cache); uint16_t version = read_u16(&next_instr[2].cache); - #line 1270 "Python/bytecodes.c" + #line 1273 "Python/bytecodes.c" DEOPT_IF(!PyDict_CheckExact(GLOBALS()), LOAD_GLOBAL); PyDictObject *dict = (PyDictObject *)GLOBALS(); DEOPT_IF(dict->ma_keys->dk_version != version, LOAD_GLOBAL); @@ -1742,7 +1745,7 @@ Py_INCREF(res); STAT_INC(LOAD_GLOBAL, hit); null = NULL; - #line 1746 "Python/generated_cases.c.h" + #line 1749 "Python/generated_cases.c.h" STACK_GROW(1); STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; @@ -1757,7 +1760,7 @@ uint16_t index = read_u16(&next_instr[1].cache); uint16_t mod_version = read_u16(&next_instr[2].cache); uint16_t bltn_version = read_u16(&next_instr[3].cache); - #line 1283 "Python/bytecodes.c" + #line 1286 "Python/bytecodes.c" DEOPT_IF(!PyDict_CheckExact(GLOBALS()), LOAD_GLOBAL); DEOPT_IF(!PyDict_CheckExact(BUILTINS()), LOAD_GLOBAL); PyDictObject *mdict = (PyDictObject *)GLOBALS(); @@ -1772,7 +1775,7 @@ Py_INCREF(res); STAT_INC(LOAD_GLOBAL, hit); null = NULL; - #line 1776 "Python/generated_cases.c.h" + #line 1779 "Python/generated_cases.c.h" STACK_GROW(1); STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; @@ -1782,16 +1785,16 @@ } TARGET(DELETE_FAST) { - #line 1300 "Python/bytecodes.c" + #line 1303 "Python/bytecodes.c" PyObject *v = GETLOCAL(oparg); if (v == NULL) goto unbound_local_error; SETLOCAL(oparg, NULL); - #line 1790 "Python/generated_cases.c.h" + #line 1793 "Python/generated_cases.c.h" DISPATCH(); } TARGET(MAKE_CELL) { - #line 1306 "Python/bytecodes.c" + #line 1309 "Python/bytecodes.c" // "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); @@ -1800,12 +1803,12 @@ goto resume_with_error; } SETLOCAL(oparg, cell); - #line 1804 "Python/generated_cases.c.h" + #line 1807 "Python/generated_cases.c.h" DISPATCH(); } TARGET(DELETE_DEREF) { - #line 1317 "Python/bytecodes.c" + #line 1320 "Python/bytecodes.c" PyObject *cell = GETLOCAL(oparg); PyObject *oldobj = PyCell_GET(cell); // Can't use ERROR_IF here. @@ -1816,13 +1819,13 @@ } PyCell_SET(cell, NULL); Py_DECREF(oldobj); - #line 1820 "Python/generated_cases.c.h" + #line 1823 "Python/generated_cases.c.h" DISPATCH(); } TARGET(LOAD_CLASSDEREF) { PyObject *value; - #line 1330 "Python/bytecodes.c" + #line 1333 "Python/bytecodes.c" PyObject *name, *locals = LOCALS(); assert(locals); assert(oparg >= 0 && oparg < frame->f_code->co_nlocalsplus); @@ -1854,7 +1857,7 @@ } Py_INCREF(value); } - #line 1858 "Python/generated_cases.c.h" + #line 1861 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = value; DISPATCH(); @@ -1862,7 +1865,7 @@ TARGET(LOAD_DEREF) { PyObject *value; - #line 1364 "Python/bytecodes.c" + #line 1367 "Python/bytecodes.c" PyObject *cell = GETLOCAL(oparg); value = PyCell_GET(cell); if (value == NULL) { @@ -1870,7 +1873,7 @@ if (true) goto error; } Py_INCREF(value); - #line 1874 "Python/generated_cases.c.h" + #line 1877 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = value; DISPATCH(); @@ -1878,18 +1881,18 @@ TARGET(STORE_DEREF) { PyObject *v = stack_pointer[-1]; - #line 1374 "Python/bytecodes.c" + #line 1377 "Python/bytecodes.c" PyObject *cell = GETLOCAL(oparg); PyObject *oldobj = PyCell_GET(cell); PyCell_SET(cell, v); Py_XDECREF(oldobj); - #line 1887 "Python/generated_cases.c.h" + #line 1890 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(COPY_FREE_VARS) { - #line 1381 "Python/bytecodes.c" + #line 1384 "Python/bytecodes.c" /* Copy closure variables to free variables */ PyCodeObject *co = frame->f_code; assert(PyFunction_Check(frame->f_funcobj)); @@ -1900,22 +1903,22 @@ PyObject *o = PyTuple_GET_ITEM(closure, i); frame->localsplus[offset + i] = Py_NewRef(o); } - #line 1904 "Python/generated_cases.c.h" + #line 1907 "Python/generated_cases.c.h" DISPATCH(); } TARGET(BUILD_STRING) { PyObject **pieces = (stack_pointer - oparg); PyObject *str; - #line 1394 "Python/bytecodes.c" + #line 1397 "Python/bytecodes.c" str = _PyUnicode_JoinArray(&_Py_STR(empty), pieces, oparg); - #line 1913 "Python/generated_cases.c.h" + #line 1916 "Python/generated_cases.c.h" for (int _i = oparg; --_i >= 0;) { Py_DECREF(pieces[_i]); } - #line 1396 "Python/bytecodes.c" + #line 1399 "Python/bytecodes.c" if (str == NULL) { STACK_SHRINK(oparg); goto error; } - #line 1919 "Python/generated_cases.c.h" + #line 1922 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_GROW(1); stack_pointer[-1] = str; @@ -1925,10 +1928,10 @@ TARGET(BUILD_TUPLE) { PyObject **values = (stack_pointer - oparg); PyObject *tup; - #line 1400 "Python/bytecodes.c" + #line 1403 "Python/bytecodes.c" tup = _PyTuple_FromArraySteal(values, oparg); if (tup == NULL) { STACK_SHRINK(oparg); goto error; } - #line 1932 "Python/generated_cases.c.h" + #line 1935 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_GROW(1); stack_pointer[-1] = tup; @@ -1938,10 +1941,10 @@ TARGET(BUILD_LIST) { PyObject **values = (stack_pointer - oparg); PyObject *list; - #line 1405 "Python/bytecodes.c" + #line 1408 "Python/bytecodes.c" list = _PyList_FromArraySteal(values, oparg); if (list == NULL) { STACK_SHRINK(oparg); goto error; } - #line 1945 "Python/generated_cases.c.h" + #line 1948 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_GROW(1); stack_pointer[-1] = list; @@ -1951,7 +1954,7 @@ TARGET(LIST_EXTEND) { PyObject *iterable = stack_pointer[-1]; PyObject *list = stack_pointer[-(2 + (oparg-1))]; - #line 1410 "Python/bytecodes.c" + #line 1413 "Python/bytecodes.c" PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable); if (none_val == NULL) { if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) && @@ -1962,13 +1965,13 @@ "Value after * must be an iterable, not %.200s", Py_TYPE(iterable)->tp_name); } - #line 1966 "Python/generated_cases.c.h" + #line 1969 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 1421 "Python/bytecodes.c" + #line 1424 "Python/bytecodes.c" if (true) goto pop_1_error; } Py_DECREF(none_val); - #line 1972 "Python/generated_cases.c.h" + #line 1975 "Python/generated_cases.c.h" Py_DECREF(iterable); STACK_SHRINK(1); DISPATCH(); @@ -1977,13 +1980,13 @@ TARGET(SET_UPDATE) { PyObject *iterable = stack_pointer[-1]; PyObject *set = stack_pointer[-(2 + (oparg-1))]; - #line 1428 "Python/bytecodes.c" + #line 1431 "Python/bytecodes.c" int err = _PySet_Update(set, iterable); - #line 1983 "Python/generated_cases.c.h" + #line 1986 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 1430 "Python/bytecodes.c" + #line 1433 "Python/bytecodes.c" if (err < 0) goto pop_1_error; - #line 1987 "Python/generated_cases.c.h" + #line 1990 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } @@ -1991,7 +1994,7 @@ TARGET(BUILD_SET) { PyObject **values = (stack_pointer - oparg); PyObject *set; - #line 1434 "Python/bytecodes.c" + #line 1437 "Python/bytecodes.c" set = PySet_New(NULL); if (set == NULL) goto error; @@ -2006,7 +2009,7 @@ Py_DECREF(set); if (true) { STACK_SHRINK(oparg); goto error; } } - #line 2010 "Python/generated_cases.c.h" + #line 2013 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_GROW(1); stack_pointer[-1] = set; @@ -2016,7 +2019,7 @@ TARGET(BUILD_MAP) { PyObject **values = (stack_pointer - oparg*2); PyObject *map; - #line 1451 "Python/bytecodes.c" + #line 1454 "Python/bytecodes.c" map = _PyDict_FromItems( values, 2, values+1, 2, @@ -2024,13 +2027,13 @@ if (map == NULL) goto error; - #line 2028 "Python/generated_cases.c.h" + #line 2031 "Python/generated_cases.c.h" for (int _i = oparg*2; --_i >= 0;) { Py_DECREF(values[_i]); } - #line 1459 "Python/bytecodes.c" + #line 1462 "Python/bytecodes.c" if (map == NULL) { STACK_SHRINK(oparg*2); goto error; } - #line 2034 "Python/generated_cases.c.h" + #line 2037 "Python/generated_cases.c.h" STACK_SHRINK(oparg*2); STACK_GROW(1); stack_pointer[-1] = map; @@ -2038,7 +2041,7 @@ } TARGET(SETUP_ANNOTATIONS) { - #line 1463 "Python/bytecodes.c" + #line 1466 "Python/bytecodes.c" int err; PyObject *ann_dict; if (LOCALS() == NULL) { @@ -2078,7 +2081,7 @@ Py_DECREF(ann_dict); } } - #line 2082 "Python/generated_cases.c.h" + #line 2085 "Python/generated_cases.c.h" DISPATCH(); } @@ -2086,7 +2089,7 @@ PyObject *keys = stack_pointer[-1]; PyObject **values = (stack_pointer - (1 + oparg)); PyObject *map; - #line 1505 "Python/bytecodes.c" + #line 1508 "Python/bytecodes.c" if (!PyTuple_CheckExact(keys) || PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) { _PyErr_SetString(tstate, PyExc_SystemError, @@ -2096,14 +2099,14 @@ map = _PyDict_FromItems( &PyTuple_GET_ITEM(keys, 0), 1, values, 1, oparg); - #line 2100 "Python/generated_cases.c.h" + #line 2103 "Python/generated_cases.c.h" for (int _i = oparg; --_i >= 0;) { Py_DECREF(values[_i]); } Py_DECREF(keys); - #line 1515 "Python/bytecodes.c" + #line 1518 "Python/bytecodes.c" if (map == NULL) { STACK_SHRINK(oparg); goto pop_1_error; } - #line 2107 "Python/generated_cases.c.h" + #line 2110 "Python/generated_cases.c.h" STACK_SHRINK(oparg); stack_pointer[-1] = map; DISPATCH(); @@ -2111,7 +2114,7 @@ TARGET(DICT_UPDATE) { PyObject *update = stack_pointer[-1]; - #line 1519 "Python/bytecodes.c" + #line 1522 "Python/bytecodes.c" PyObject *dict = PEEK(oparg + 1); // update is still on the stack if (PyDict_Update(dict, update) < 0) { if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { @@ -2119,12 +2122,12 @@ "'%.200s' object is not a mapping", Py_TYPE(update)->tp_name); } - #line 2123 "Python/generated_cases.c.h" + #line 2126 "Python/generated_cases.c.h" Py_DECREF(update); - #line 1527 "Python/bytecodes.c" + #line 1530 "Python/bytecodes.c" if (true) goto pop_1_error; } - #line 2128 "Python/generated_cases.c.h" + #line 2131 "Python/generated_cases.c.h" Py_DECREF(update); STACK_SHRINK(1); DISPATCH(); @@ -2132,17 +2135,17 @@ TARGET(DICT_MERGE) { PyObject *update = stack_pointer[-1]; - #line 1533 "Python/bytecodes.c" + #line 1536 "Python/bytecodes.c" PyObject *dict = PEEK(oparg + 1); // update is still on the stack if (_PyDict_MergeEx(dict, update, 2) < 0) { format_kwargs_error(tstate, PEEK(3 + oparg), update); - #line 2141 "Python/generated_cases.c.h" + #line 2144 "Python/generated_cases.c.h" Py_DECREF(update); - #line 1538 "Python/bytecodes.c" + #line 1541 "Python/bytecodes.c" if (true) goto pop_1_error; } - #line 2146 "Python/generated_cases.c.h" + #line 2149 "Python/generated_cases.c.h" Py_DECREF(update); STACK_SHRINK(1); PREDICT(CALL_FUNCTION_EX); @@ -2152,13 +2155,13 @@ TARGET(MAP_ADD) { PyObject *value = stack_pointer[-1]; PyObject *key = stack_pointer[-2]; - #line 1545 "Python/bytecodes.c" + #line 1548 "Python/bytecodes.c" PyObject *dict = PEEK(oparg + 2); // key, value are still on the stack assert(PyDict_CheckExact(dict)); /* dict[key] = value */ // Do not DECREF INPUTS because the function steals the references if (_PyDict_SetItem_Take2((PyDictObject *)dict, key, value) != 0) goto pop_2_error; - #line 2162 "Python/generated_cases.c.h" + #line 2165 "Python/generated_cases.c.h" STACK_SHRINK(2); PREDICT(JUMP_BACKWARD); DISPATCH(); @@ -2170,7 +2173,7 @@ PyObject *owner = stack_pointer[-1]; PyObject *res2 = NULL; PyObject *res; - #line 1568 "Python/bytecodes.c" + #line 1571 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyAttrCache *cache = (_PyAttrCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -2204,9 +2207,9 @@ NULL | meth | arg1 | ... | argN */ - #line 2208 "Python/generated_cases.c.h" + #line 2211 "Python/generated_cases.c.h" Py_DECREF(owner); - #line 1602 "Python/bytecodes.c" + #line 1605 "Python/bytecodes.c" if (meth == NULL) goto pop_1_error; res2 = NULL; res = meth; @@ -2215,12 +2218,12 @@ else { /* Classic, pushes one value. */ res = PyObject_GetAttr(owner, name); - #line 2219 "Python/generated_cases.c.h" + #line 2222 "Python/generated_cases.c.h" Py_DECREF(owner); - #line 1611 "Python/bytecodes.c" + #line 1614 "Python/bytecodes.c" if (res == NULL) goto pop_1_error; } - #line 2224 "Python/generated_cases.c.h" + #line 2227 "Python/generated_cases.c.h" STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; if (oparg & 1) { stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))] = res2; } @@ -2234,7 +2237,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1616 "Python/bytecodes.c" + #line 1619 "Python/bytecodes.c" PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, LOAD_ATTR); @@ -2247,7 +2250,7 @@ STAT_INC(LOAD_ATTR, hit); Py_INCREF(res); res2 = NULL; - #line 2251 "Python/generated_cases.c.h" + #line 2254 "Python/generated_cases.c.h" Py_DECREF(owner); STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; @@ -2262,7 +2265,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1632 "Python/bytecodes.c" + #line 1635 "Python/bytecodes.c" DEOPT_IF(!PyModule_CheckExact(owner), LOAD_ATTR); PyDictObject *dict = (PyDictObject *)((PyModuleObject *)owner)->md_dict; assert(dict != NULL); @@ -2275,7 +2278,7 @@ STAT_INC(LOAD_ATTR, hit); Py_INCREF(res); res2 = NULL; - #line 2279 "Python/generated_cases.c.h" + #line 2282 "Python/generated_cases.c.h" Py_DECREF(owner); STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; @@ -2290,7 +2293,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1648 "Python/bytecodes.c" + #line 1651 "Python/bytecodes.c" PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, LOAD_ATTR); @@ -2317,7 +2320,7 @@ STAT_INC(LOAD_ATTR, hit); Py_INCREF(res); res2 = NULL; - #line 2321 "Python/generated_cases.c.h" + #line 2324 "Python/generated_cases.c.h" Py_DECREF(owner); STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; @@ -2332,7 +2335,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1678 "Python/bytecodes.c" + #line 1681 "Python/bytecodes.c" PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, LOAD_ATTR); @@ -2342,7 +2345,7 @@ STAT_INC(LOAD_ATTR, hit); Py_INCREF(res); res2 = NULL; - #line 2346 "Python/generated_cases.c.h" + #line 2349 "Python/generated_cases.c.h" Py_DECREF(owner); STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; @@ -2357,7 +2360,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 1691 "Python/bytecodes.c" + #line 1694 "Python/bytecodes.c" DEOPT_IF(!PyType_Check(cls), LOAD_ATTR); DEOPT_IF(((PyTypeObject *)cls)->tp_version_tag != type_version, @@ -2369,7 +2372,7 @@ res = descr; assert(res != NULL); Py_INCREF(res); - #line 2373 "Python/generated_cases.c.h" + #line 2376 "Python/generated_cases.c.h" Py_DECREF(cls); STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; @@ -2383,7 +2386,7 @@ uint32_t type_version = read_u32(&next_instr[1].cache); uint32_t func_version = read_u32(&next_instr[3].cache); PyObject *fget = read_obj(&next_instr[5].cache); - #line 1706 "Python/bytecodes.c" + #line 1709 "Python/bytecodes.c" DEOPT_IF(tstate->interp->eval_frame, LOAD_ATTR); PyTypeObject *cls = Py_TYPE(owner); @@ -2405,8 +2408,9 @@ STACK_SHRINK(shrink_stack); new_frame->localsplus[0] = owner; JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); + frame->return_offset = 0; DISPATCH_INLINED(new_frame); - #line 2410 "Python/generated_cases.c.h" + #line 2414 "Python/generated_cases.c.h" } TARGET(LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN) { @@ -2414,7 +2418,7 @@ uint32_t type_version = read_u32(&next_instr[1].cache); uint32_t func_version = read_u32(&next_instr[3].cache); PyObject *getattribute = read_obj(&next_instr[5].cache); - #line 1731 "Python/bytecodes.c" + #line 1735 "Python/bytecodes.c" DEOPT_IF(tstate->interp->eval_frame, LOAD_ATTR); PyTypeObject *cls = Py_TYPE(owner); DEOPT_IF(cls->tp_version_tag != type_version, LOAD_ATTR); @@ -2438,8 +2442,9 @@ new_frame->localsplus[0] = owner; new_frame->localsplus[1] = Py_NewRef(name); JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); + frame->return_offset = 0; DISPATCH_INLINED(new_frame); - #line 2443 "Python/generated_cases.c.h" + #line 2448 "Python/generated_cases.c.h" } TARGET(STORE_ATTR_INSTANCE_VALUE) { @@ -2447,7 +2452,7 @@ PyObject *value = stack_pointer[-2]; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1758 "Python/bytecodes.c" + #line 1763 "Python/bytecodes.c" PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, STORE_ATTR); @@ -2465,7 +2470,7 @@ Py_DECREF(old_value); } Py_DECREF(owner); - #line 2469 "Python/generated_cases.c.h" + #line 2474 "Python/generated_cases.c.h" STACK_SHRINK(2); next_instr += 4; DISPATCH(); @@ -2476,7 +2481,7 @@ PyObject *value = stack_pointer[-2]; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t hint = read_u16(&next_instr[3].cache); - #line 1778 "Python/bytecodes.c" + #line 1783 "Python/bytecodes.c" PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, STORE_ATTR); @@ -2515,7 +2520,7 @@ /* PEP 509 */ dict->ma_version_tag = new_version; Py_DECREF(owner); - #line 2519 "Python/generated_cases.c.h" + #line 2524 "Python/generated_cases.c.h" STACK_SHRINK(2); next_instr += 4; DISPATCH(); @@ -2526,7 +2531,7 @@ PyObject *value = stack_pointer[-2]; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 1819 "Python/bytecodes.c" + #line 1824 "Python/bytecodes.c" PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, STORE_ATTR); @@ -2536,7 +2541,7 @@ *(PyObject **)addr = value; Py_XDECREF(old_value); Py_DECREF(owner); - #line 2540 "Python/generated_cases.c.h" + #line 2545 "Python/generated_cases.c.h" STACK_SHRINK(2); next_instr += 4; DISPATCH(); @@ -2548,7 +2553,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 1838 "Python/bytecodes.c" + #line 1843 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyCompareOpCache *cache = (_PyCompareOpCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -2561,12 +2566,12 @@ #endif /* ENABLE_SPECIALIZATION */ assert((oparg >> 4) <= Py_GE); res = PyObject_RichCompare(left, right, oparg>>4); - #line 2565 "Python/generated_cases.c.h" + #line 2570 "Python/generated_cases.c.h" Py_DECREF(left); Py_DECREF(right); - #line 1851 "Python/bytecodes.c" + #line 1856 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; - #line 2570 "Python/generated_cases.c.h" + #line 2575 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -2577,7 +2582,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 1855 "Python/bytecodes.c" + #line 1860 "Python/bytecodes.c" DEOPT_IF(!PyFloat_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyFloat_CheckExact(right), COMPARE_OP); STAT_INC(COMPARE_OP, hit); @@ -2589,7 +2594,7 @@ _Py_DECREF_SPECIALIZED(right, _PyFloat_ExactDealloc); res = (sign_ish & oparg) ? Py_True : Py_False; Py_INCREF(res); - #line 2593 "Python/generated_cases.c.h" + #line 2598 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -2600,7 +2605,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 1870 "Python/bytecodes.c" + #line 1875 "Python/bytecodes.c" DEOPT_IF(!PyLong_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyLong_CheckExact(right), COMPARE_OP); DEOPT_IF(!_PyLong_IsCompact((PyLongObject *)left), COMPARE_OP); @@ -2616,7 +2621,7 @@ _Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free); res = (sign_ish & oparg) ? Py_True : Py_False; Py_INCREF(res); - #line 2620 "Python/generated_cases.c.h" + #line 2625 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -2627,7 +2632,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 1889 "Python/bytecodes.c" + #line 1894 "Python/bytecodes.c" DEOPT_IF(!PyUnicode_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyUnicode_CheckExact(right), COMPARE_OP); STAT_INC(COMPARE_OP, hit); @@ -2640,7 +2645,7 @@ assert(COMPARISON_NOT_EQUALS + 1 == COMPARISON_EQUALS); res = ((COMPARISON_NOT_EQUALS + eq) & oparg) ? Py_True : Py_False; Py_INCREF(res); - #line 2644 "Python/generated_cases.c.h" + #line 2649 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -2651,14 +2656,14 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *b; - #line 1904 "Python/bytecodes.c" + #line 1909 "Python/bytecodes.c" int res = Py_Is(left, right) ^ oparg; - #line 2657 "Python/generated_cases.c.h" + #line 2662 "Python/generated_cases.c.h" Py_DECREF(left); Py_DECREF(right); - #line 1906 "Python/bytecodes.c" + #line 1911 "Python/bytecodes.c" b = Py_NewRef(res ? Py_True : Py_False); - #line 2662 "Python/generated_cases.c.h" + #line 2667 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = b; DISPATCH(); @@ -2668,15 +2673,15 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *b; - #line 1910 "Python/bytecodes.c" + #line 1915 "Python/bytecodes.c" int res = PySequence_Contains(right, left); - #line 2674 "Python/generated_cases.c.h" + #line 2679 "Python/generated_cases.c.h" Py_DECREF(left); Py_DECREF(right); - #line 1912 "Python/bytecodes.c" + #line 1917 "Python/bytecodes.c" if (res < 0) goto pop_2_error; b = Py_NewRef((res^oparg) ? Py_True : Py_False); - #line 2680 "Python/generated_cases.c.h" + #line 2685 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = b; DISPATCH(); @@ -2687,12 +2692,12 @@ PyObject *exc_value = stack_pointer[-2]; PyObject *rest; PyObject *match; - #line 1917 "Python/bytecodes.c" + #line 1922 "Python/bytecodes.c" if (check_except_star_type_valid(tstate, match_type) < 0) { - #line 2693 "Python/generated_cases.c.h" + #line 2698 "Python/generated_cases.c.h" Py_DECREF(exc_value); Py_DECREF(match_type); - #line 1919 "Python/bytecodes.c" + #line 1924 "Python/bytecodes.c" if (true) goto pop_2_error; } @@ -2700,10 +2705,10 @@ rest = NULL; int res = exception_group_match(exc_value, match_type, &match, &rest); - #line 2704 "Python/generated_cases.c.h" + #line 2709 "Python/generated_cases.c.h" Py_DECREF(exc_value); Py_DECREF(match_type); - #line 1927 "Python/bytecodes.c" + #line 1932 "Python/bytecodes.c" if (res < 0) goto pop_2_error; assert((match == NULL) == (rest == NULL)); @@ -2712,7 +2717,7 @@ if (!Py_IsNone(match)) { PyErr_SetHandledException(match); } - #line 2716 "Python/generated_cases.c.h" + #line 2721 "Python/generated_cases.c.h" stack_pointer[-1] = match; stack_pointer[-2] = rest; DISPATCH(); @@ -2722,21 +2727,21 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *b; - #line 1938 "Python/bytecodes.c" + #line 1943 "Python/bytecodes.c" assert(PyExceptionInstance_Check(left)); if (check_except_type_valid(tstate, right) < 0) { - #line 2729 "Python/generated_cases.c.h" + #line 2734 "Python/generated_cases.c.h" Py_DECREF(right); - #line 1941 "Python/bytecodes.c" + #line 1946 "Python/bytecodes.c" if (true) goto pop_1_error; } int res = PyErr_GivenExceptionMatches(left, right); - #line 2736 "Python/generated_cases.c.h" + #line 2741 "Python/generated_cases.c.h" Py_DECREF(right); - #line 1946 "Python/bytecodes.c" + #line 1951 "Python/bytecodes.c" b = Py_NewRef(res ? Py_True : Py_False); - #line 2740 "Python/generated_cases.c.h" + #line 2745 "Python/generated_cases.c.h" stack_pointer[-1] = b; DISPATCH(); } @@ -2745,15 +2750,15 @@ PyObject *fromlist = stack_pointer[-1]; PyObject *level = stack_pointer[-2]; PyObject *res; - #line 1950 "Python/bytecodes.c" + #line 1955 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); res = import_name(tstate, frame, name, fromlist, level); - #line 2752 "Python/generated_cases.c.h" + #line 2757 "Python/generated_cases.c.h" Py_DECREF(level); Py_DECREF(fromlist); - #line 1953 "Python/bytecodes.c" + #line 1958 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; - #line 2757 "Python/generated_cases.c.h" + #line 2762 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; DISPATCH(); @@ -2762,29 +2767,29 @@ TARGET(IMPORT_FROM) { PyObject *from = stack_pointer[-1]; PyObject *res; - #line 1957 "Python/bytecodes.c" + #line 1962 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); res = import_from(tstate, from, name); if (res == NULL) goto error; - #line 2770 "Python/generated_cases.c.h" + #line 2775 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; DISPATCH(); } TARGET(JUMP_FORWARD) { - #line 1963 "Python/bytecodes.c" + #line 1968 "Python/bytecodes.c" JUMPBY(oparg); - #line 2779 "Python/generated_cases.c.h" + #line 2784 "Python/generated_cases.c.h" DISPATCH(); } TARGET(JUMP_BACKWARD) { PREDICTED(JUMP_BACKWARD); - #line 1967 "Python/bytecodes.c" + #line 1972 "Python/bytecodes.c" assert(oparg < INSTR_OFFSET()); JUMPBY(-oparg); - #line 2788 "Python/generated_cases.c.h" + #line 2793 "Python/generated_cases.c.h" CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -2792,7 +2797,7 @@ TARGET(POP_JUMP_IF_FALSE) { PREDICTED(POP_JUMP_IF_FALSE); PyObject *cond = stack_pointer[-1]; - #line 1973 "Python/bytecodes.c" + #line 1978 "Python/bytecodes.c" if (Py_IsTrue(cond)) { _Py_DECREF_NO_DEALLOC(cond); } @@ -2802,9 +2807,9 @@ } else { int err = PyObject_IsTrue(cond); - #line 2806 "Python/generated_cases.c.h" + #line 2811 "Python/generated_cases.c.h" Py_DECREF(cond); - #line 1983 "Python/bytecodes.c" + #line 1988 "Python/bytecodes.c" if (err == 0) { JUMPBY(oparg); } @@ -2812,14 +2817,14 @@ if (err < 0) goto pop_1_error; } } - #line 2816 "Python/generated_cases.c.h" + #line 2821 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(POP_JUMP_IF_TRUE) { PyObject *cond = stack_pointer[-1]; - #line 1993 "Python/bytecodes.c" + #line 1998 "Python/bytecodes.c" if (Py_IsFalse(cond)) { _Py_DECREF_NO_DEALLOC(cond); } @@ -2829,9 +2834,9 @@ } else { int err = PyObject_IsTrue(cond); - #line 2833 "Python/generated_cases.c.h" + #line 2838 "Python/generated_cases.c.h" Py_DECREF(cond); - #line 2003 "Python/bytecodes.c" + #line 2008 "Python/bytecodes.c" if (err > 0) { JUMPBY(oparg); } @@ -2839,67 +2844,67 @@ if (err < 0) goto pop_1_error; } } - #line 2843 "Python/generated_cases.c.h" + #line 2848 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(POP_JUMP_IF_NOT_NONE) { PyObject *value = stack_pointer[-1]; - #line 2013 "Python/bytecodes.c" + #line 2018 "Python/bytecodes.c" if (!Py_IsNone(value)) { - #line 2852 "Python/generated_cases.c.h" + #line 2857 "Python/generated_cases.c.h" Py_DECREF(value); - #line 2015 "Python/bytecodes.c" + #line 2020 "Python/bytecodes.c" JUMPBY(oparg); } else { _Py_DECREF_NO_DEALLOC(value); } - #line 2860 "Python/generated_cases.c.h" + #line 2865 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(POP_JUMP_IF_NONE) { PyObject *value = stack_pointer[-1]; - #line 2023 "Python/bytecodes.c" + #line 2028 "Python/bytecodes.c" if (Py_IsNone(value)) { _Py_DECREF_NO_DEALLOC(value); JUMPBY(oparg); } else { - #line 2873 "Python/generated_cases.c.h" + #line 2878 "Python/generated_cases.c.h" Py_DECREF(value); - #line 2029 "Python/bytecodes.c" + #line 2034 "Python/bytecodes.c" } - #line 2877 "Python/generated_cases.c.h" + #line 2882 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(JUMP_BACKWARD_NO_INTERRUPT) { - #line 2033 "Python/bytecodes.c" + #line 2038 "Python/bytecodes.c" /* This bytecode is used in the `yield from` or `await` loop. * If there is an interrupt, we want it handled in the innermost * generator or coroutine, so we deliberately do not check it here. * (see bpo-30039). */ JUMPBY(-oparg); - #line 2890 "Python/generated_cases.c.h" + #line 2895 "Python/generated_cases.c.h" DISPATCH(); } TARGET(GET_LEN) { PyObject *obj = stack_pointer[-1]; PyObject *len_o; - #line 2042 "Python/bytecodes.c" + #line 2047 "Python/bytecodes.c" // PUSH(len(TOS)) Py_ssize_t len_i = PyObject_Length(obj); if (len_i < 0) goto error; len_o = PyLong_FromSsize_t(len_i); if (len_o == NULL) goto error; - #line 2903 "Python/generated_cases.c.h" + #line 2908 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = len_o; DISPATCH(); @@ -2910,16 +2915,16 @@ PyObject *type = stack_pointer[-2]; PyObject *subject = stack_pointer[-3]; PyObject *attrs; - #line 2050 "Python/bytecodes.c" + #line 2055 "Python/bytecodes.c" // Pop TOS and TOS1. Set TOS to a tuple of attributes on success, or // None on failure. assert(PyTuple_CheckExact(names)); attrs = match_class(tstate, subject, type, oparg, names); - #line 2919 "Python/generated_cases.c.h" + #line 2924 "Python/generated_cases.c.h" Py_DECREF(subject); Py_DECREF(type); Py_DECREF(names); - #line 2055 "Python/bytecodes.c" + #line 2060 "Python/bytecodes.c" if (attrs) { assert(PyTuple_CheckExact(attrs)); // Success! } @@ -2927,7 +2932,7 @@ if (_PyErr_Occurred(tstate)) goto pop_3_error; attrs = Py_NewRef(Py_None); // Failure! } - #line 2931 "Python/generated_cases.c.h" + #line 2936 "Python/generated_cases.c.h" STACK_SHRINK(2); stack_pointer[-1] = attrs; DISPATCH(); @@ -2936,10 +2941,10 @@ TARGET(MATCH_MAPPING) { PyObject *subject = stack_pointer[-1]; PyObject *res; - #line 2065 "Python/bytecodes.c" + #line 2070 "Python/bytecodes.c" int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING; res = Py_NewRef(match ? Py_True : Py_False); - #line 2943 "Python/generated_cases.c.h" + #line 2948 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; PREDICT(POP_JUMP_IF_FALSE); @@ -2949,10 +2954,10 @@ TARGET(MATCH_SEQUENCE) { PyObject *subject = stack_pointer[-1]; PyObject *res; - #line 2071 "Python/bytecodes.c" + #line 2076 "Python/bytecodes.c" int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE; res = Py_NewRef(match ? Py_True : Py_False); - #line 2956 "Python/generated_cases.c.h" + #line 2961 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; PREDICT(POP_JUMP_IF_FALSE); @@ -2963,11 +2968,11 @@ PyObject *keys = stack_pointer[-1]; PyObject *subject = stack_pointer[-2]; PyObject *values_or_none; - #line 2077 "Python/bytecodes.c" + #line 2082 "Python/bytecodes.c" // On successful match, PUSH(values). Otherwise, PUSH(None). values_or_none = match_keys(tstate, subject, keys); if (values_or_none == NULL) goto error; - #line 2971 "Python/generated_cases.c.h" + #line 2976 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = values_or_none; DISPATCH(); @@ -2976,14 +2981,14 @@ TARGET(GET_ITER) { PyObject *iterable = stack_pointer[-1]; PyObject *iter; - #line 2083 "Python/bytecodes.c" + #line 2088 "Python/bytecodes.c" /* before: [obj]; after [getiter(obj)] */ iter = PyObject_GetIter(iterable); - #line 2983 "Python/generated_cases.c.h" + #line 2988 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 2086 "Python/bytecodes.c" + #line 2091 "Python/bytecodes.c" if (iter == NULL) goto pop_1_error; - #line 2987 "Python/generated_cases.c.h" + #line 2992 "Python/generated_cases.c.h" stack_pointer[-1] = iter; DISPATCH(); } @@ -2991,7 +2996,7 @@ TARGET(GET_YIELD_FROM_ITER) { PyObject *iterable = stack_pointer[-1]; PyObject *iter; - #line 2090 "Python/bytecodes.c" + #line 2095 "Python/bytecodes.c" /* before: [obj]; after [getiter(obj)] */ if (PyCoro_CheckExact(iterable)) { /* `iterable` is a coroutine */ @@ -3014,11 +3019,11 @@ if (iter == NULL) { goto error; } - #line 3018 "Python/generated_cases.c.h" + #line 3023 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 2113 "Python/bytecodes.c" + #line 2118 "Python/bytecodes.c" } - #line 3022 "Python/generated_cases.c.h" + #line 3027 "Python/generated_cases.c.h" stack_pointer[-1] = iter; PREDICT(LOAD_CONST); DISPATCH(); @@ -3029,7 +3034,7 @@ static_assert(INLINE_CACHE_ENTRIES_FOR_ITER == 1, "incorrect cache size"); PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2132 "Python/bytecodes.c" + #line 2137 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyForIterCache *cache = (_PyForIterCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -3060,7 +3065,7 @@ DISPATCH(); } // Common case: no jump, leave it to the code generator - #line 3064 "Python/generated_cases.c.h" + #line 3069 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = next; next_instr += 1; @@ -3068,7 +3073,7 @@ } TARGET(INSTRUMENTED_FOR_ITER) { - #line 2165 "Python/bytecodes.c" + #line 2170 "Python/bytecodes.c" _Py_CODEUNIT *here = next_instr-1; _Py_CODEUNIT *target; PyObject *iter = TOP(); @@ -3094,14 +3099,14 @@ target = next_instr + INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1; } INSTRUMENTED_JUMP(here, target, PY_MONITORING_EVENT_BRANCH); - #line 3098 "Python/generated_cases.c.h" + #line 3103 "Python/generated_cases.c.h" DISPATCH(); } TARGET(FOR_ITER_LIST) { PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2193 "Python/bytecodes.c" + #line 2198 "Python/bytecodes.c" DEOPT_IF(Py_TYPE(iter) != &PyListIter_Type, FOR_ITER); _PyListIterObject *it = (_PyListIterObject *)iter; STAT_INC(FOR_ITER, hit); @@ -3121,7 +3126,7 @@ DISPATCH(); end_for_iter_list: // Common case: no jump, leave it to the code generator - #line 3125 "Python/generated_cases.c.h" + #line 3130 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = next; next_instr += 1; @@ -3131,7 +3136,7 @@ TARGET(FOR_ITER_TUPLE) { PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2215 "Python/bytecodes.c" + #line 2220 "Python/bytecodes.c" _PyTupleIterObject *it = (_PyTupleIterObject *)iter; DEOPT_IF(Py_TYPE(it) != &PyTupleIter_Type, FOR_ITER); STAT_INC(FOR_ITER, hit); @@ -3151,7 +3156,7 @@ DISPATCH(); end_for_iter_tuple: // Common case: no jump, leave it to the code generator - #line 3155 "Python/generated_cases.c.h" + #line 3160 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = next; next_instr += 1; @@ -3161,7 +3166,7 @@ TARGET(FOR_ITER_RANGE) { PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2237 "Python/bytecodes.c" + #line 2242 "Python/bytecodes.c" _PyRangeIterObject *r = (_PyRangeIterObject *)iter; DEOPT_IF(Py_TYPE(r) != &PyRangeIter_Type, FOR_ITER); STAT_INC(FOR_ITER, hit); @@ -3179,7 +3184,7 @@ if (next == NULL) { goto error; } - #line 3183 "Python/generated_cases.c.h" + #line 3188 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = next; next_instr += 1; @@ -3188,29 +3193,29 @@ TARGET(FOR_ITER_GEN) { PyObject *iter = stack_pointer[-1]; - #line 2257 "Python/bytecodes.c" + #line 2262 "Python/bytecodes.c" PyGenObject *gen = (PyGenObject *)iter; DEOPT_IF(Py_TYPE(gen) != &PyGen_Type, FOR_ITER); DEOPT_IF(gen->gi_frame_state >= FRAME_EXECUTING, FOR_ITER); STAT_INC(FOR_ITER, hit); _PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; - frame->yield_offset = oparg; + frame->return_offset = oparg; _PyFrame_StackPush(gen_frame, Py_NewRef(Py_None)); gen->gi_frame_state = FRAME_EXECUTING; gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; - JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg); - assert(next_instr->op.code == END_FOR || - next_instr->op.code == INSTRUMENTED_END_FOR); + JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER); + assert(next_instr[oparg].op.code == END_FOR || + next_instr[oparg].op.code == INSTRUMENTED_END_FOR); DISPATCH_INLINED(gen_frame); - #line 3207 "Python/generated_cases.c.h" + #line 3212 "Python/generated_cases.c.h" } TARGET(BEFORE_ASYNC_WITH) { PyObject *mgr = stack_pointer[-1]; PyObject *exit; PyObject *res; - #line 2274 "Python/bytecodes.c" + #line 2279 "Python/bytecodes.c" PyObject *enter = _PyObject_LookupSpecial(mgr, &_Py_ID(__aenter__)); if (enter == NULL) { if (!_PyErr_Occurred(tstate)) { @@ -3233,16 +3238,16 @@ Py_DECREF(enter); goto error; } - #line 3237 "Python/generated_cases.c.h" + #line 3242 "Python/generated_cases.c.h" Py_DECREF(mgr); - #line 2297 "Python/bytecodes.c" + #line 2302 "Python/bytecodes.c" res = _PyObject_CallNoArgs(enter); Py_DECREF(enter); if (res == NULL) { Py_DECREF(exit); if (true) goto pop_1_error; } - #line 3246 "Python/generated_cases.c.h" + #line 3251 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; stack_pointer[-2] = exit; @@ -3254,7 +3259,7 @@ PyObject *mgr = stack_pointer[-1]; PyObject *exit; PyObject *res; - #line 2307 "Python/bytecodes.c" + #line 2312 "Python/bytecodes.c" /* pop the context manager, push its __exit__ and the * value returned from calling its __enter__ */ @@ -3280,16 +3285,16 @@ Py_DECREF(enter); goto error; } - #line 3284 "Python/generated_cases.c.h" + #line 3289 "Python/generated_cases.c.h" Py_DECREF(mgr); - #line 2333 "Python/bytecodes.c" + #line 2338 "Python/bytecodes.c" res = _PyObject_CallNoArgs(enter); Py_DECREF(enter); if (res == NULL) { Py_DECREF(exit); if (true) goto pop_1_error; } - #line 3293 "Python/generated_cases.c.h" + #line 3298 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; stack_pointer[-2] = exit; @@ -3301,7 +3306,7 @@ PyObject *lasti = stack_pointer[-3]; PyObject *exit_func = stack_pointer[-4]; PyObject *res; - #line 2342 "Python/bytecodes.c" + #line 2347 "Python/bytecodes.c" /* At the top of the stack are 4 values: - val: TOP = exc_info() - unused: SECOND = previous exception @@ -3322,7 +3327,7 @@ res = PyObject_Vectorcall(exit_func, stack + 1, 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); if (res == NULL) goto error; - #line 3326 "Python/generated_cases.c.h" + #line 3331 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; DISPATCH(); @@ -3331,7 +3336,7 @@ TARGET(PUSH_EXC_INFO) { PyObject *new_exc = stack_pointer[-1]; PyObject *prev_exc; - #line 2365 "Python/bytecodes.c" + #line 2370 "Python/bytecodes.c" _PyErr_StackItem *exc_info = tstate->exc_info; if (exc_info->exc_value != NULL) { prev_exc = exc_info->exc_value; @@ -3341,7 +3346,7 @@ } assert(PyExceptionInstance_Check(new_exc)); exc_info->exc_value = Py_NewRef(new_exc); - #line 3345 "Python/generated_cases.c.h" + #line 3350 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = new_exc; stack_pointer[-2] = prev_exc; @@ -3355,7 +3360,7 @@ uint32_t type_version = read_u32(&next_instr[1].cache); uint32_t keys_version = read_u32(&next_instr[3].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 2377 "Python/bytecodes.c" + #line 2382 "Python/bytecodes.c" /* Cached method object */ PyTypeObject *self_cls = Py_TYPE(self); assert(type_version != 0); @@ -3372,7 +3377,7 @@ assert(_PyType_HasFeature(Py_TYPE(res2), Py_TPFLAGS_METHOD_DESCRIPTOR)); res = self; assert(oparg & 1); - #line 3376 "Python/generated_cases.c.h" + #line 3381 "Python/generated_cases.c.h" STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; if (oparg & 1) { stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))] = res2; } @@ -3386,7 +3391,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 2396 "Python/bytecodes.c" + #line 2401 "Python/bytecodes.c" PyTypeObject *self_cls = Py_TYPE(self); DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR); assert(self_cls->tp_dictoffset == 0); @@ -3396,7 +3401,7 @@ res2 = Py_NewRef(descr); res = self; assert(oparg & 1); - #line 3400 "Python/generated_cases.c.h" + #line 3405 "Python/generated_cases.c.h" STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; if (oparg & 1) { stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))] = res2; } @@ -3410,7 +3415,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 2408 "Python/bytecodes.c" + #line 2413 "Python/bytecodes.c" PyTypeObject *self_cls = Py_TYPE(self); DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR); Py_ssize_t dictoffset = self_cls->tp_dictoffset; @@ -3424,7 +3429,7 @@ res2 = Py_NewRef(descr); res = self; assert(oparg & 1); - #line 3428 "Python/generated_cases.c.h" + #line 3433 "Python/generated_cases.c.h" STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; if (oparg & 1) { stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))] = res2; } @@ -3433,16 +3438,16 @@ } TARGET(KW_NAMES) { - #line 2424 "Python/bytecodes.c" + #line 2429 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg < PyTuple_GET_SIZE(frame->f_code->co_consts)); kwnames = GETITEM(frame->f_code->co_consts, oparg); - #line 3441 "Python/generated_cases.c.h" + #line 3446 "Python/generated_cases.c.h" DISPATCH(); } TARGET(INSTRUMENTED_CALL) { - #line 2430 "Python/bytecodes.c" + #line 2435 "Python/bytecodes.c" int is_meth = PEEK(oparg+2) != NULL; int total_args = oparg + is_meth; PyObject *function = PEEK(total_args + 1); @@ -3455,7 +3460,7 @@ _PyCallCache *cache = (_PyCallCache *)next_instr; INCREMENT_ADAPTIVE_COUNTER(cache->counter); GO_TO_INSTRUCTION(CALL); - #line 3459 "Python/generated_cases.c.h" + #line 3464 "Python/generated_cases.c.h" } TARGET(CALL) { @@ -3465,7 +3470,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2475 "Python/bytecodes.c" + #line 2480 "Python/bytecodes.c" int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -3515,6 +3520,7 @@ goto error; } JUMPBY(INLINE_CACHE_ENTRIES_CALL); + frame->return_offset = 0; DISPATCH_INLINED(new_frame); } /* Callable is not a normal Python function */ @@ -3546,7 +3552,7 @@ Py_DECREF(args[i]); } if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3550 "Python/generated_cases.c.h" + #line 3556 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3558,7 +3564,7 @@ TARGET(CALL_BOUND_METHOD_EXACT_ARGS) { PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; - #line 2562 "Python/bytecodes.c" + #line 2568 "Python/bytecodes.c" DEOPT_IF(method != NULL, CALL); DEOPT_IF(Py_TYPE(callable) != &PyMethod_Type, CALL); STAT_INC(CALL, hit); @@ -3568,7 +3574,7 @@ PEEK(oparg + 2) = Py_NewRef(meth); // method Py_DECREF(callable); GO_TO_INSTRUCTION(CALL_PY_EXACT_ARGS); - #line 3572 "Python/generated_cases.c.h" + #line 3578 "Python/generated_cases.c.h" } TARGET(CALL_PY_EXACT_ARGS) { @@ -3577,7 +3583,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; uint32_t func_version = read_u32(&next_instr[1].cache); - #line 2574 "Python/bytecodes.c" + #line 2580 "Python/bytecodes.c" assert(kwnames == NULL); DEOPT_IF(tstate->interp->eval_frame, CALL); int is_meth = method != NULL; @@ -3601,8 +3607,9 @@ // Manipulate stack directly since we leave using DISPATCH_INLINED(). STACK_SHRINK(oparg + 2); JUMPBY(INLINE_CACHE_ENTRIES_CALL); + frame->return_offset = 0; DISPATCH_INLINED(new_frame); - #line 3606 "Python/generated_cases.c.h" + #line 3613 "Python/generated_cases.c.h" } TARGET(CALL_PY_WITH_DEFAULTS) { @@ -3610,7 +3617,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; uint32_t func_version = read_u32(&next_instr[1].cache); - #line 2601 "Python/bytecodes.c" + #line 2608 "Python/bytecodes.c" assert(kwnames == NULL); DEOPT_IF(tstate->interp->eval_frame, CALL); int is_meth = method != NULL; @@ -3644,8 +3651,9 @@ // Manipulate stack and cache directly since we leave using DISPATCH_INLINED(). STACK_SHRINK(oparg + 2); JUMPBY(INLINE_CACHE_ENTRIES_CALL); + frame->return_offset = 0; DISPATCH_INLINED(new_frame); - #line 3649 "Python/generated_cases.c.h" + #line 3657 "Python/generated_cases.c.h" } TARGET(CALL_NO_KW_TYPE_1) { @@ -3653,7 +3661,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2638 "Python/bytecodes.c" + #line 2646 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); @@ -3663,7 +3671,7 @@ res = Py_NewRef(Py_TYPE(obj)); Py_DECREF(obj); Py_DECREF(&PyType_Type); // I.e., callable - #line 3667 "Python/generated_cases.c.h" + #line 3675 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3676,7 +3684,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2650 "Python/bytecodes.c" + #line 2658 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); @@ -3687,7 +3695,7 @@ Py_DECREF(arg); Py_DECREF(&PyUnicode_Type); // I.e., callable if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3691 "Python/generated_cases.c.h" + #line 3699 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3701,7 +3709,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2664 "Python/bytecodes.c" + #line 2672 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); @@ -3712,7 +3720,7 @@ Py_DECREF(arg); Py_DECREF(&PyTuple_Type); // I.e., tuple if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3716 "Python/generated_cases.c.h" + #line 3724 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3726,7 +3734,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2678 "Python/bytecodes.c" + #line 2686 "Python/bytecodes.c" int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -3748,7 +3756,7 @@ } Py_DECREF(tp); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3752 "Python/generated_cases.c.h" + #line 3760 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3762,7 +3770,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2703 "Python/bytecodes.c" + #line 2711 "Python/bytecodes.c" /* Builtin METH_O functions */ assert(kwnames == NULL); int is_meth = method != NULL; @@ -3790,7 +3798,7 @@ Py_DECREF(arg); Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3794 "Python/generated_cases.c.h" + #line 3802 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3804,7 +3812,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2734 "Python/bytecodes.c" + #line 2742 "Python/bytecodes.c" /* Builtin METH_FASTCALL functions, without keywords */ assert(kwnames == NULL); int is_meth = method != NULL; @@ -3836,7 +3844,7 @@ 'invalid'). In those cases an exception is set, so we must handle it. */ - #line 3840 "Python/generated_cases.c.h" + #line 3848 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3850,7 +3858,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2769 "Python/bytecodes.c" + #line 2777 "Python/bytecodes.c" /* Builtin METH_FASTCALL | METH_KEYWORDS functions */ int is_meth = method != NULL; int total_args = oparg; @@ -3882,7 +3890,7 @@ } Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3886 "Python/generated_cases.c.h" + #line 3894 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3896,7 +3904,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2804 "Python/bytecodes.c" + #line 2812 "Python/bytecodes.c" assert(kwnames == NULL); /* len(o) */ int is_meth = method != NULL; @@ -3921,7 +3929,7 @@ Py_DECREF(callable); Py_DECREF(arg); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3925 "Python/generated_cases.c.h" + #line 3933 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3934,7 +3942,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2831 "Python/bytecodes.c" + #line 2839 "Python/bytecodes.c" assert(kwnames == NULL); /* isinstance(o, o2) */ int is_meth = method != NULL; @@ -3961,7 +3969,7 @@ Py_DECREF(cls); Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3965 "Python/generated_cases.c.h" + #line 3973 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3973,7 +3981,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *self = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; - #line 2861 "Python/bytecodes.c" + #line 2869 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 1); assert(method != NULL); @@ -3991,14 +3999,14 @@ JUMPBY(INLINE_CACHE_ENTRIES_CALL + 1); assert(next_instr[-1].op.code == POP_TOP); DISPATCH(); - #line 3995 "Python/generated_cases.c.h" + #line 4003 "Python/generated_cases.c.h" } TARGET(CALL_NO_KW_METHOD_DESCRIPTOR_O) { PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2881 "Python/bytecodes.c" + #line 2889 "Python/bytecodes.c" assert(kwnames == NULL); int is_meth = method != NULL; int total_args = oparg; @@ -4029,7 +4037,7 @@ Py_DECREF(arg); Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 4033 "Python/generated_cases.c.h" + #line 4041 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -4042,7 +4050,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2915 "Python/bytecodes.c" + #line 2923 "Python/bytecodes.c" int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -4071,7 +4079,7 @@ } Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 4075 "Python/generated_cases.c.h" + #line 4083 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -4084,7 +4092,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2947 "Python/bytecodes.c" + #line 2955 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 0 || oparg == 1); int is_meth = method != NULL; @@ -4113,7 +4121,7 @@ Py_DECREF(self); Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 4117 "Python/generated_cases.c.h" + #line 4125 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -4126,7 +4134,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2979 "Python/bytecodes.c" + #line 2987 "Python/bytecodes.c" assert(kwnames == NULL); int is_meth = method != NULL; int total_args = oparg; @@ -4154,7 +4162,7 @@ } Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 4158 "Python/generated_cases.c.h" + #line 4166 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -4164,9 +4172,9 @@ } TARGET(INSTRUMENTED_CALL_FUNCTION_EX) { - #line 3010 "Python/bytecodes.c" + #line 3018 "Python/bytecodes.c" GO_TO_INSTRUCTION(CALL_FUNCTION_EX); - #line 4170 "Python/generated_cases.c.h" + #line 4178 "Python/generated_cases.c.h" } TARGET(CALL_FUNCTION_EX) { @@ -4175,7 +4183,7 @@ PyObject *callargs = stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))]; PyObject *func = stack_pointer[-(2 + ((oparg & 1) ? 1 : 0))]; PyObject *result; - #line 3014 "Python/bytecodes.c" + #line 3022 "Python/bytecodes.c" // DICT_MERGE is called before this opcode if there are kwargs. // It converts all dict subtypes in kwargs into regular dicts. assert(kwargs == NULL || PyDict_CheckExact(kwargs)); @@ -4218,14 +4226,14 @@ else { result = PyObject_Call(func, callargs, kwargs); } - #line 4222 "Python/generated_cases.c.h" + #line 4230 "Python/generated_cases.c.h" Py_DECREF(func); Py_DECREF(callargs); Py_XDECREF(kwargs); - #line 3057 "Python/bytecodes.c" + #line 3065 "Python/bytecodes.c" assert(PEEK(3 + (oparg & 1)) == NULL); if (result == NULL) { STACK_SHRINK(((oparg & 1) ? 1 : 0)); goto pop_3_error; } - #line 4229 "Python/generated_cases.c.h" + #line 4237 "Python/generated_cases.c.h" STACK_SHRINK(((oparg & 1) ? 1 : 0)); STACK_SHRINK(2); stack_pointer[-1] = result; @@ -4240,7 +4248,7 @@ PyObject *kwdefaults = (oparg & 0x02) ? stack_pointer[-(1 + ((oparg & 0x08) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0))] : NULL; PyObject *defaults = (oparg & 0x01) ? stack_pointer[-(1 + ((oparg & 0x08) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0) + ((oparg & 0x01) ? 1 : 0))] : NULL; PyObject *func; - #line 3067 "Python/bytecodes.c" + #line 3075 "Python/bytecodes.c" PyFunctionObject *func_obj = (PyFunctionObject *) PyFunction_New(codeobj, GLOBALS()); @@ -4269,14 +4277,14 @@ func_obj->func_version = ((PyCodeObject *)codeobj)->co_version; func = (PyObject *)func_obj; - #line 4273 "Python/generated_cases.c.h" + #line 4281 "Python/generated_cases.c.h" STACK_SHRINK(((oparg & 0x01) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x08) ? 1 : 0)); stack_pointer[-1] = func; DISPATCH(); } TARGET(RETURN_GENERATOR) { - #line 3098 "Python/bytecodes.c" + #line 3106 "Python/bytecodes.c" assert(PyFunction_Check(frame->f_funcobj)); PyFunctionObject *func = (PyFunctionObject *)frame->f_funcobj; PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func); @@ -4297,7 +4305,7 @@ frame = cframe.current_frame = prev; _PyFrame_StackPush(frame, (PyObject *)gen); goto resume_frame; - #line 4301 "Python/generated_cases.c.h" + #line 4309 "Python/generated_cases.c.h" } TARGET(BUILD_SLICE) { @@ -4305,15 +4313,15 @@ PyObject *stop = stack_pointer[-(1 + ((oparg == 3) ? 1 : 0))]; PyObject *start = stack_pointer[-(2 + ((oparg == 3) ? 1 : 0))]; PyObject *slice; - #line 3121 "Python/bytecodes.c" + #line 3129 "Python/bytecodes.c" slice = PySlice_New(start, stop, step); - #line 4311 "Python/generated_cases.c.h" + #line 4319 "Python/generated_cases.c.h" Py_DECREF(start); Py_DECREF(stop); Py_XDECREF(step); - #line 3123 "Python/bytecodes.c" + #line 3131 "Python/bytecodes.c" if (slice == NULL) { STACK_SHRINK(((oparg == 3) ? 1 : 0)); goto pop_2_error; } - #line 4317 "Python/generated_cases.c.h" + #line 4325 "Python/generated_cases.c.h" STACK_SHRINK(((oparg == 3) ? 1 : 0)); STACK_SHRINK(1); stack_pointer[-1] = slice; @@ -4324,7 +4332,7 @@ PyObject *fmt_spec = ((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? stack_pointer[-((((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0))] : NULL; PyObject *value = stack_pointer[-(1 + (((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0))]; PyObject *result; - #line 3127 "Python/bytecodes.c" + #line 3135 "Python/bytecodes.c" /* Handles f-string value formatting. */ PyObject *(*conv_fn)(PyObject *); int which_conversion = oparg & FVC_MASK; @@ -4359,7 +4367,7 @@ Py_DECREF(value); Py_XDECREF(fmt_spec); if (result == NULL) { STACK_SHRINK((((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0)); goto pop_1_error; } - #line 4363 "Python/generated_cases.c.h" + #line 4371 "Python/generated_cases.c.h" STACK_SHRINK((((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0)); stack_pointer[-1] = result; DISPATCH(); @@ -4368,10 +4376,10 @@ TARGET(COPY) { PyObject *bottom = stack_pointer[-(1 + (oparg-1))]; PyObject *top; - #line 3164 "Python/bytecodes.c" + #line 3172 "Python/bytecodes.c" assert(oparg > 0); top = Py_NewRef(bottom); - #line 4375 "Python/generated_cases.c.h" + #line 4383 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = top; DISPATCH(); @@ -4383,7 +4391,7 @@ PyObject *rhs = stack_pointer[-1]; PyObject *lhs = stack_pointer[-2]; PyObject *res; - #line 3169 "Python/bytecodes.c" + #line 3177 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyBinaryOpCache *cache = (_PyBinaryOpCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -4398,12 +4406,12 @@ assert((unsigned)oparg < Py_ARRAY_LENGTH(binary_ops)); assert(binary_ops[oparg]); res = binary_ops[oparg](lhs, rhs); - #line 4402 "Python/generated_cases.c.h" + #line 4410 "Python/generated_cases.c.h" Py_DECREF(lhs); Py_DECREF(rhs); - #line 3184 "Python/bytecodes.c" + #line 3192 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; - #line 4407 "Python/generated_cases.c.h" + #line 4415 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -4413,16 +4421,16 @@ TARGET(SWAP) { PyObject *top = stack_pointer[-1]; PyObject *bottom = stack_pointer[-(2 + (oparg-2))]; - #line 3189 "Python/bytecodes.c" + #line 3197 "Python/bytecodes.c" assert(oparg >= 2); - #line 4419 "Python/generated_cases.c.h" + #line 4427 "Python/generated_cases.c.h" stack_pointer[-1] = bottom; stack_pointer[-(2 + (oparg-2))] = top; DISPATCH(); } TARGET(INSTRUMENTED_LINE) { - #line 3193 "Python/bytecodes.c" + #line 3201 "Python/bytecodes.c" _Py_CODEUNIT *here = next_instr-1; _PyFrame_SetStackPointer(frame, stack_pointer); int original_opcode = _Py_call_instrumentation_line( @@ -4442,11 +4450,11 @@ } opcode = original_opcode; DISPATCH_GOTO(); - #line 4446 "Python/generated_cases.c.h" + #line 4454 "Python/generated_cases.c.h" } TARGET(INSTRUMENTED_INSTRUCTION) { - #line 3215 "Python/bytecodes.c" + #line 3223 "Python/bytecodes.c" int next_opcode = _Py_call_instrumentation_instruction( tstate, frame, next_instr-1); if (next_opcode < 0) goto error; @@ -4458,26 +4466,26 @@ assert(next_opcode > 0 && next_opcode < 256); opcode = next_opcode; DISPATCH_GOTO(); - #line 4462 "Python/generated_cases.c.h" + #line 4470 "Python/generated_cases.c.h" } TARGET(INSTRUMENTED_JUMP_FORWARD) { - #line 3229 "Python/bytecodes.c" + #line 3237 "Python/bytecodes.c" INSTRUMENTED_JUMP(next_instr-1, next_instr+oparg, PY_MONITORING_EVENT_JUMP); - #line 4468 "Python/generated_cases.c.h" + #line 4476 "Python/generated_cases.c.h" DISPATCH(); } TARGET(INSTRUMENTED_JUMP_BACKWARD) { - #line 3233 "Python/bytecodes.c" + #line 3241 "Python/bytecodes.c" INSTRUMENTED_JUMP(next_instr-1, next_instr-oparg, PY_MONITORING_EVENT_JUMP); - #line 4475 "Python/generated_cases.c.h" + #line 4483 "Python/generated_cases.c.h" CHECK_EVAL_BREAKER(); DISPATCH(); } TARGET(INSTRUMENTED_POP_JUMP_IF_TRUE) { - #line 3238 "Python/bytecodes.c" + #line 3246 "Python/bytecodes.c" PyObject *cond = POP(); int err = PyObject_IsTrue(cond); Py_DECREF(cond); @@ -4486,12 +4494,12 @@ assert(err == 0 || err == 1); int offset = err*oparg; INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); - #line 4490 "Python/generated_cases.c.h" + #line 4498 "Python/generated_cases.c.h" DISPATCH(); } TARGET(INSTRUMENTED_POP_JUMP_IF_FALSE) { - #line 3249 "Python/bytecodes.c" + #line 3257 "Python/bytecodes.c" PyObject *cond = POP(); int err = PyObject_IsTrue(cond); Py_DECREF(cond); @@ -4500,12 +4508,12 @@ assert(err == 0 || err == 1); int offset = (1-err)*oparg; INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); - #line 4504 "Python/generated_cases.c.h" + #line 4512 "Python/generated_cases.c.h" DISPATCH(); } TARGET(INSTRUMENTED_POP_JUMP_IF_NONE) { - #line 3260 "Python/bytecodes.c" + #line 3268 "Python/bytecodes.c" PyObject *value = POP(); _Py_CODEUNIT *here = next_instr-1; int offset; @@ -4518,12 +4526,12 @@ offset = 0; } INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); - #line 4522 "Python/generated_cases.c.h" + #line 4530 "Python/generated_cases.c.h" DISPATCH(); } TARGET(INSTRUMENTED_POP_JUMP_IF_NOT_NONE) { - #line 3275 "Python/bytecodes.c" + #line 3283 "Python/bytecodes.c" PyObject *value = POP(); _Py_CODEUNIT *here = next_instr-1; int offset; @@ -4536,30 +4544,30 @@ offset = oparg; } INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); - #line 4540 "Python/generated_cases.c.h" + #line 4548 "Python/generated_cases.c.h" DISPATCH(); } TARGET(EXTENDED_ARG) { - #line 3290 "Python/bytecodes.c" + #line 3298 "Python/bytecodes.c" assert(oparg); opcode = next_instr->op.code; oparg = oparg << 8 | next_instr->op.arg; PRE_DISPATCH_GOTO(); DISPATCH_GOTO(); - #line 4551 "Python/generated_cases.c.h" + #line 4559 "Python/generated_cases.c.h" } TARGET(CACHE) { - #line 3298 "Python/bytecodes.c" + #line 3306 "Python/bytecodes.c" assert(0 && "Executing a cache."); Py_UNREACHABLE(); - #line 4558 "Python/generated_cases.c.h" + #line 4566 "Python/generated_cases.c.h" } TARGET(RESERVED) { - #line 3303 "Python/bytecodes.c" + #line 3311 "Python/bytecodes.c" assert(0 && "Executing RESERVED instruction."); Py_UNREACHABLE(); - #line 4565 "Python/generated_cases.c.h" + #line 4573 "Python/generated_cases.c.h" } From 2194071540313e2bbdc7214d77453b9ce3034a5c Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Thu, 13 Apr 2023 08:24:33 -0700 Subject: [PATCH 168/349] gh-103365: [Enum] STRICT boundary corrections (GH-103494) STRICT boundary: - fix bitwise operations - make default for Flag --- Doc/library/enum.rst | 5 +- Lib/enum.py | 67 +++++++++++-------- Lib/test/test_enum.py | 47 ++++++++++--- ...-04-12-17-59-55.gh-issue-103365.UBEE0U.rst | 1 + 4 files changed, 82 insertions(+), 38 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-12-17-59-55.gh-issue-103365.UBEE0U.rst diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index c690c837309ea5..07acf9da33e275 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -696,7 +696,8 @@ Data Types .. attribute:: STRICT - Out-of-range values cause a :exc:`ValueError` to be raised:: + Out-of-range values cause a :exc:`ValueError` to be raised. This is the + default for :class:`Flag`:: >>> from enum import Flag, STRICT, auto >>> class StrictFlag(Flag, boundary=STRICT): @@ -714,7 +715,7 @@ Data Types .. attribute:: CONFORM Out-of-range values have invalid values removed, leaving a valid *Flag* - value. This is the default for :class:`Flag`:: + value:: >>> from enum import Flag, CONFORM, auto >>> class ConformFlag(Flag, boundary=CONFORM): diff --git a/Lib/enum.py b/Lib/enum.py index 10902c4b202a2d..432d7456b4b9f1 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -275,6 +275,13 @@ def __set_name__(self, enum_class, member_name): enum_member.__objclass__ = enum_class enum_member.__init__(*args) enum_member._sort_order_ = len(enum_class._member_names_) + + if Flag is not None and issubclass(enum_class, Flag): + enum_class._flag_mask_ |= value + if _is_single_bit(value): + enum_class._singles_mask_ |= value + enum_class._all_bits_ = 2 ** ((enum_class._flag_mask_).bit_length()) - 1 + # If another member with the same value was already defined, the # new member becomes an alias to the existing one. try: @@ -532,12 +539,8 @@ def __new__(metacls, cls, bases, classdict, *, boundary=None, _simple=False, **k classdict['_use_args_'] = use_args # # convert future enum members into temporary _proto_members - # and record integer values in case this will be a Flag - flag_mask = 0 for name in member_names: value = classdict[name] - if isinstance(value, int): - flag_mask |= value classdict[name] = _proto_member(value) # # house-keeping structures @@ -554,8 +557,9 @@ def __new__(metacls, cls, bases, classdict, *, boundary=None, _simple=False, **k boundary or getattr(first_enum, '_boundary_', None) ) - classdict['_flag_mask_'] = flag_mask - classdict['_all_bits_'] = 2 ** ((flag_mask).bit_length()) - 1 + classdict['_flag_mask_'] = 0 + classdict['_singles_mask_'] = 0 + classdict['_all_bits_'] = 0 classdict['_inverted_'] = None try: exc = None @@ -644,21 +648,10 @@ def __new__(metacls, cls, bases, classdict, *, boundary=None, _simple=False, **k ): delattr(enum_class, '_boundary_') delattr(enum_class, '_flag_mask_') + delattr(enum_class, '_singles_mask_') delattr(enum_class, '_all_bits_') delattr(enum_class, '_inverted_') elif Flag is not None and issubclass(enum_class, Flag): - # ensure _all_bits_ is correct and there are no missing flags - single_bit_total = 0 - multi_bit_total = 0 - for flag in enum_class._member_map_.values(): - flag_value = flag._value_ - if _is_single_bit(flag_value): - single_bit_total |= flag_value - else: - # multi-bit flags are considered aliases - multi_bit_total |= flag_value - enum_class._flag_mask_ = single_bit_total - # # set correct __iter__ member_list = [m._value_ for m in enum_class] if member_list != sorted(member_list): @@ -1303,8 +1296,8 @@ def _reduce_ex_by_global_name(self, proto): class FlagBoundary(StrEnum): """ control how out of range values are handled - "strict" -> error is raised - "conform" -> extra bits are discarded [default for Flag] + "strict" -> error is raised [default for Flag] + "conform" -> extra bits are discarded "eject" -> lose flag status "keep" -> keep flag status and all bits [default for IntFlag] """ @@ -1315,7 +1308,7 @@ class FlagBoundary(StrEnum): STRICT, CONFORM, EJECT, KEEP = FlagBoundary -class Flag(Enum, boundary=CONFORM): +class Flag(Enum, boundary=STRICT): """ Support for flags """ @@ -1394,6 +1387,7 @@ def _missing_(cls, value): # - value must not include any skipped flags (e.g. if bit 2 is not # defined, then 0d10 is invalid) flag_mask = cls._flag_mask_ + singles_mask = cls._singles_mask_ all_bits = cls._all_bits_ neg_value = None if ( @@ -1425,7 +1419,8 @@ def _missing_(cls, value): value = all_bits + 1 + value # get members and unknown unknown = value & ~flag_mask - member_value = value & flag_mask + aliases = value & ~singles_mask + member_value = value & singles_mask if unknown and cls._boundary_ is not KEEP: raise ValueError( '%s(%r) --> unknown values %r [%s]' @@ -1439,11 +1434,25 @@ def _missing_(cls, value): pseudo_member = cls._member_type_.__new__(cls, value) if not hasattr(pseudo_member, '_value_'): pseudo_member._value_ = value - if member_value: - pseudo_member._name_ = '|'.join([ - m._name_ for m in cls._iter_member_(member_value) - ]) - if unknown: + if member_value or aliases: + members = [] + combined_value = 0 + for m in cls._iter_member_(member_value): + members.append(m) + combined_value |= m._value_ + if aliases: + value = member_value | aliases + for n, pm in cls._member_map_.items(): + if pm not in members and pm._value_ and pm._value_ & value == pm._value_: + members.append(pm) + combined_value |= pm._value_ + unknown = value ^ combined_value + pseudo_member._name_ = '|'.join([m._name_ for m in members]) + if not combined_value: + pseudo_member._name_ = None + elif unknown and cls._boundary_ is STRICT: + raise ValueError('%r: no members with value %r' % (cls, unknown)) + elif unknown: pseudo_member._name_ += '|%s' % cls._numeric_repr_(unknown) else: pseudo_member._name_ = None @@ -1675,6 +1684,7 @@ def convert_class(cls): body['_boundary_'] = boundary or etype._boundary_ body['_flag_mask_'] = None body['_all_bits_'] = None + body['_singles_mask_'] = None body['_inverted_'] = None body['__or__'] = Flag.__or__ body['__xor__'] = Flag.__xor__ @@ -1750,7 +1760,8 @@ def convert_class(cls): else: multi_bits |= value gnv_last_values.append(value) - enum_class._flag_mask_ = single_bits + enum_class._flag_mask_ = single_bits | multi_bits + enum_class._singles_mask_ = single_bits enum_class._all_bits_ = 2 ** ((single_bits|multi_bits).bit_length()) - 1 # set correct __iter__ member_list = [m._value_ for m in enum_class] diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index e4151bf9e6d9b3..89294e95df2a83 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2873,6 +2873,8 @@ def __new__(cls, c): # a = ord('a') # + self.assertEqual(FlagFromChar._all_bits_, 316912650057057350374175801343) + self.assertEqual(FlagFromChar._flag_mask_, 158456325028528675187087900672) self.assertEqual(FlagFromChar.a, 158456325028528675187087900672) self.assertEqual(FlagFromChar.a|1, 158456325028528675187087900673) # @@ -2887,6 +2889,8 @@ def __new__(cls, c): a = ord('a') z = 1 # + self.assertEqual(FlagFromChar._all_bits_, 316912650057057350374175801343) + self.assertEqual(FlagFromChar._flag_mask_, 158456325028528675187087900674) self.assertEqual(FlagFromChar.a.value, 158456325028528675187087900672) self.assertEqual((FlagFromChar.a|FlagFromChar.z).value, 158456325028528675187087900674) # @@ -2900,6 +2904,8 @@ def __new__(cls, c): # a = ord('a') # + self.assertEqual(FlagFromChar._all_bits_, 316912650057057350374175801343) + self.assertEqual(FlagFromChar._flag_mask_, 158456325028528675187087900672) self.assertEqual(FlagFromChar.a, 158456325028528675187087900672) self.assertEqual(FlagFromChar.a|1, 158456325028528675187087900673) @@ -3077,18 +3083,18 @@ def test_bool(self): self.assertEqual(bool(f.value), bool(f)) def test_boundary(self): - self.assertIs(enum.Flag._boundary_, CONFORM) - class Iron(Flag, boundary=STRICT): + self.assertIs(enum.Flag._boundary_, STRICT) + class Iron(Flag, boundary=CONFORM): ONE = 1 TWO = 2 EIGHT = 8 - self.assertIs(Iron._boundary_, STRICT) + self.assertIs(Iron._boundary_, CONFORM) # - class Water(Flag, boundary=CONFORM): + class Water(Flag, boundary=STRICT): ONE = 1 TWO = 2 EIGHT = 8 - self.assertIs(Water._boundary_, CONFORM) + self.assertIs(Water._boundary_, STRICT) # class Space(Flag, boundary=EJECT): ONE = 1 @@ -3101,10 +3107,10 @@ class Bizarre(Flag, boundary=KEEP): c = 4 d = 6 # - self.assertRaisesRegex(ValueError, 'invalid value 7', Iron, 7) + self.assertRaisesRegex(ValueError, 'invalid value 7', Water, 7) # - self.assertIs(Water(7), Water.ONE|Water.TWO) - self.assertIs(Water(~9), Water.TWO) + self.assertIs(Iron(7), Iron.ONE|Iron.TWO) + self.assertIs(Iron(~9), Iron.TWO) # self.assertEqual(Space(7), 7) self.assertTrue(type(Space(7)) is int) @@ -3112,6 +3118,31 @@ class Bizarre(Flag, boundary=KEEP): self.assertEqual(list(Bizarre), [Bizarre.c]) self.assertIs(Bizarre(3), Bizarre.b) self.assertIs(Bizarre(6), Bizarre.d) + # + class SkipFlag(enum.Flag): + A = 1 + B = 2 + C = 4 | B + # + self.assertTrue(SkipFlag.C in (SkipFlag.A|SkipFlag.C)) + self.assertRaisesRegex(ValueError, 'SkipFlag.. invalid value 42', SkipFlag, 42) + # + class SkipIntFlag(enum.IntFlag): + A = 1 + B = 2 + C = 4 | B + # + self.assertTrue(SkipIntFlag.C in (SkipIntFlag.A|SkipIntFlag.C)) + self.assertEqual(SkipIntFlag(42).value, 42) + # + class MethodHint(Flag): + HiddenText = 0x10 + DigitsOnly = 0x01 + LettersOnly = 0x02 + OnlyMask = 0x0f + # + self.assertEqual(str(MethodHint.HiddenText|MethodHint.OnlyMask), 'MethodHint.HiddenText|DigitsOnly|LettersOnly|OnlyMask') + def test_iter(self): Color = self.Color diff --git a/Misc/NEWS.d/next/Library/2023-04-12-17-59-55.gh-issue-103365.UBEE0U.rst b/Misc/NEWS.d/next/Library/2023-04-12-17-59-55.gh-issue-103365.UBEE0U.rst new file mode 100644 index 00000000000000..4d69f6f6fff713 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-12-17-59-55.gh-issue-103365.UBEE0U.rst @@ -0,0 +1 @@ +Set default Flag boundary to ``STRICT`` and fix bitwise operations. From a6f95941a3d686707fb38e0f37758e666f25e180 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Thu, 13 Apr 2023 08:31:03 -0700 Subject: [PATCH 169/349] gh-103479: [Enum] require __new__ to be considered a data type (GH-103495) a mixin must either have a __new__ method, or be a dataclass, to be interpreted as a data-type --- Doc/howto/enum.rst | 8 +++++--- Lib/enum.py | 3 ++- Lib/test/test_enum.py | 13 +++++++------ 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Doc/howto/enum.rst b/Doc/howto/enum.rst index 9390faded2fb8d..56391a026cf889 100644 --- a/Doc/howto/enum.rst +++ b/Doc/howto/enum.rst @@ -865,17 +865,19 @@ Some rules: 4. When another data type is mixed in, the :attr:`value` attribute is *not the same* as the enum member itself, although it is equivalent and will compare equal. -5. %-style formatting: ``%s`` and ``%r`` call the :class:`Enum` class's +5. A ``data type`` is a mixin that defines :meth:`__new__`, or a + :class:`~dataclasses.dataclass` +6. %-style formatting: ``%s`` and ``%r`` call the :class:`Enum` class's :meth:`__str__` and :meth:`__repr__` respectively; other codes (such as ``%i`` or ``%h`` for IntEnum) treat the enum member as its mixed-in type. -6. :ref:`Formatted string literals `, :meth:`str.format`, +7. :ref:`Formatted string literals `, :meth:`str.format`, and :func:`format` will use the enum's :meth:`__str__` method. .. note:: Because :class:`IntEnum`, :class:`IntFlag`, and :class:`StrEnum` are designed to be drop-in replacements for existing constants, their - :meth:`__str__` method has been reset to their data types + :meth:`__str__` method has been reset to their data types' :meth:`__str__` method. When to use :meth:`__new__` vs. :meth:`__init__` diff --git a/Lib/enum.py b/Lib/enum.py index 432d7456b4b9f1..e9f224a303d3e5 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -967,6 +967,7 @@ def _find_data_repr_(mcls, class_name, bases): @classmethod def _find_data_type_(mcls, class_name, bases): + # a datatype has a __new__ method, or a __dataclass_fields__ attribute data_types = set() base_chain = set() for chain in bases: @@ -979,7 +980,7 @@ def _find_data_type_(mcls, class_name, bases): if base._member_type_ is not object: data_types.add(base._member_type_) break - elif '__new__' in base.__dict__ or '__init__' in base.__dict__: + elif '__new__' in base.__dict__ or '__dataclass_fields__' in base.__dict__: data_types.add(candidate or base) break else: diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 89294e95df2a83..e9dfcf8586a823 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2737,10 +2737,10 @@ def __repr__(self): return 'ha hah!' class Entries(Foo, Enum): ENTRY1 = 1 + self.assertEqual(repr(Entries.ENTRY1), '') + self.assertTrue(Entries.ENTRY1.value == Foo(1), Entries.ENTRY1.value) self.assertTrue(isinstance(Entries.ENTRY1, Foo)) self.assertTrue(Entries._member_type_ is Foo, Entries._member_type_) - self.assertTrue(Entries.ENTRY1.value == Foo(1), Entries.ENTRY1.value) - self.assertEqual(repr(Entries.ENTRY1), '') # # check auto-generated dataclass __repr__ is not used # @@ -2787,8 +2787,7 @@ class Creature(CreatureDataMixin, Enum): DOG = ('medium', 4) self.assertRegex(repr(Creature.DOG), "") - def test_repr_with_init_data_type_mixin(self): - # non-data_type is a mixin that doesn't define __new__ + def test_repr_with_init_mixin(self): class Foo: def __init__(self, a): self.a = a @@ -2797,9 +2796,9 @@ def __repr__(self): class Entries(Foo, Enum): ENTRY1 = 1 # - self.assertEqual(repr(Entries.ENTRY1), '') + self.assertEqual(repr(Entries.ENTRY1), 'Foo(a=1)') - def test_repr_and_str_with_non_data_type_mixin(self): + def test_repr_and_str_with_no_init_mixin(self): # non-data_type is a mixin that doesn't define __new__ class Foo: def __repr__(self): @@ -2911,6 +2910,8 @@ def __new__(cls, c): def test_init_exception(self): class Base: + def __new__(cls, *args): + return object.__new__(cls) def __init__(self, x): raise ValueError("I don't like", x) with self.assertRaises(TypeError): From 7b95d23591f605fc05d4820f83fef8fbf1552729 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Thu, 13 Apr 2023 12:45:03 -0500 Subject: [PATCH 170/349] Fix unused functions warnings in instrumentation.c (GH-103515) --- Python/instrumentation.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 8dc8b01fcb0496..853e8a10e81463 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -125,6 +125,7 @@ is_instrumented(int opcode) { return opcode >= MIN_INSTRUMENTED_OPCODE; } +#ifndef NDEBUG static inline bool monitors_equals(_Py_Monitors a, _Py_Monitors b) { @@ -135,6 +136,7 @@ monitors_equals(_Py_Monitors a, _Py_Monitors b) } return true; } +#endif static inline _Py_Monitors monitors_sub(_Py_Monitors a, _Py_Monitors b) @@ -146,6 +148,7 @@ monitors_sub(_Py_Monitors a, _Py_Monitors b) return res; } +#ifndef NDEBUG static inline _Py_Monitors monitors_and(_Py_Monitors a, _Py_Monitors b) { @@ -155,6 +158,7 @@ monitors_and(_Py_Monitors a, _Py_Monitors b) } return res; } +#endif static inline _Py_Monitors monitors_or(_Py_Monitors a, _Py_Monitors b) From a3d313a9e2d894f301557c18788aa1eec16c507c Mon Sep 17 00:00:00 2001 From: Boris Verkhovskiy Date: Fri, 14 Apr 2023 04:07:49 +0100 Subject: [PATCH 171/349] Proofread howto/perf_profiling.rst (#103530) --- Doc/howto/perf_profiling.rst | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Doc/howto/perf_profiling.rst b/Doc/howto/perf_profiling.rst index ad2eb7b4d58aa5..6af5536166f58a 100644 --- a/Doc/howto/perf_profiling.rst +++ b/Doc/howto/perf_profiling.rst @@ -15,9 +15,9 @@ information about the performance of your application. that aid with the analysis of the data that it produces. The main problem with using the ``perf`` profiler with Python applications is that -``perf`` only allows to get information about native symbols, this is, the names of -the functions and procedures written in C. This means that the names and file names -of the Python functions in your code will not appear in the output of the ``perf``. +``perf`` only gets information about native symbols, that is, the names of +functions and procedures written in C. This means that the names and file names +of Python functions in your code will not appear in the output of ``perf``. Since Python 3.12, the interpreter can run in a special mode that allows Python functions to appear in the output of the ``perf`` profiler. When this mode is @@ -28,8 +28,8 @@ relationship between this piece of code and the associated Python function using .. note:: - Support for the ``perf`` profiler is only currently available for Linux on - selected architectures. Check the output of the configure build step or + Support for the ``perf`` profiler is currently only available for Linux on + select architectures. Check the output of the ``configure`` build step or check the output of ``python -m sysconfig | grep HAVE_PERF_TRAMPOLINE`` to see if your system is supported. @@ -52,11 +52,11 @@ For example, consider the following script: if __name__ == "__main__": baz(1000000) -We can run ``perf`` to sample CPU stack traces at 9999 Hertz:: +We can run ``perf`` to sample CPU stack traces at 9999 hertz:: $ perf record -F 9999 -g -o perf.data python my_script.py -Then we can use ``perf`` report to analyze the data: +Then we can use ``perf report`` to analyze the data: .. code-block:: shell-session @@ -97,7 +97,7 @@ Then we can use ``perf`` report to analyze the data: | | | | | |--2.97%--_PyObject_Malloc ... -As you can see here, the Python functions are not shown in the output, only ``_Py_Eval_EvalFrameDefault`` appears +As you can see, the Python functions are not shown in the output, only ``_Py_Eval_EvalFrameDefault`` (the function that evaluates the Python bytecode) shows up. Unfortunately that's not very useful because all Python functions use the same C function to evaluate bytecode so we cannot know which Python function corresponds to which bytecode-evaluating function. @@ -151,7 +151,7 @@ Instead, if we run the same experiment with ``perf`` support enabled we get: How to enable ``perf`` profiling support ---------------------------------------- -``perf`` profiling support can either be enabled from the start using +``perf`` profiling support can be enabled either from the start using the environment variable :envvar:`PYTHONPERFSUPPORT` or the :option:`-X perf <-X>` option, or dynamically using :func:`sys.activate_stack_trampoline` and @@ -192,7 +192,7 @@ Example, using the :mod:`sys` APIs in file :file:`example.py`: How to obtain the best results ------------------------------ -For the best results, Python should be compiled with +For best results, Python should be compiled with ``CFLAGS="-fno-omit-frame-pointer -mno-omit-leaf-frame-pointer"`` as this allows profilers to unwind using only the frame pointer and not on DWARF debug information. This is because as the code that is interposed to allow ``perf`` From 756978117698eeac3af270db25d22599e681bcb3 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Fri, 14 Apr 2023 10:06:31 +0300 Subject: [PATCH 172/349] gh-103406: Modernize pos-only arguments usage in `test_signature` (#103407) --- Lib/test/test_inspect.py | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 3a3646f1861e80..cfdb992654c252 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -3044,14 +3044,9 @@ def foo(a=1, b=2, c=3): self.assertEqual(_foo(*ba.args, **ba.kwargs), (12, 10, 20)) - def foo(a, b, c, d, **kwargs): + def foo(a, b, /, c, d, **kwargs): pass sig = inspect.signature(foo) - params = sig.parameters.copy() - params['a'] = params['a'].replace(kind=Parameter.POSITIONAL_ONLY) - params['b'] = params['b'].replace(kind=Parameter.POSITIONAL_ONLY) - foo.__signature__ = inspect.Signature(params.values()) - sig = inspect.signature(foo) self.assertEqual(str(sig), '(a, b, /, c, d, **kwargs)') self.assertEqual(self.signature(partial(foo, 1)), @@ -3556,14 +3551,9 @@ def test_signature_str_positional_only(self): P = inspect.Parameter S = inspect.Signature - def test(a_po, *, b, **kwargs): + def test(a_po, /, *, b, **kwargs): return a_po, kwargs - sig = inspect.signature(test) - new_params = list(sig.parameters.values()) - new_params[0] = new_params[0].replace(kind=P.POSITIONAL_ONLY) - test.__signature__ = sig.replace(parameters=new_params) - self.assertEqual(str(inspect.signature(test)), '(a_po, /, *, b, **kwargs)') @@ -3593,6 +3583,14 @@ def test() -> 42: self.assertEqual(sig.return_annotation, 42) self.assertEqual(sig, inspect.signature(test)) + def test_signature_replaced(self): + def test(): + pass + + spam_param = inspect.Parameter('spam', inspect.Parameter.POSITIONAL_ONLY) + sig = test.__signature__ = inspect.Signature(parameters=(spam_param,)) + self.assertEqual(sig, inspect.signature(test)) + def test_signature_on_mangled_parameters(self): class Spam: def foo(self, __p1:1=2, *, __p2:2=3): @@ -4157,16 +4155,9 @@ def test(a, *args, b, z=100, **kwargs): def test_signature_bind_positional_only(self): P = inspect.Parameter - def test(a_po, b_po, c_po=3, foo=42, *, bar=50, **kwargs): + def test(a_po, b_po, c_po=3, /, foo=42, *, bar=50, **kwargs): return a_po, b_po, c_po, foo, bar, kwargs - sig = inspect.signature(test) - new_params = collections.OrderedDict(tuple(sig.parameters.items())) - for name in ('a_po', 'b_po', 'c_po'): - new_params[name] = new_params[name].replace(kind=P.POSITIONAL_ONLY) - new_sig = sig.replace(parameters=new_params.values()) - test.__signature__ = new_sig - self.assertEqual(self.call(test, 1, 2, 4, 5, bar=6), (1, 2, 4, 5, 6, {})) From 282f0d26e376b6c8d8cc039b23b649422acc30e9 Mon Sep 17 00:00:00 2001 From: AN Long Date: Fri, 14 Apr 2023 15:40:25 +0800 Subject: [PATCH 173/349] Fix syntax typo in isolating extensions doc (#103516) --- Doc/howto/isolating-extensions.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/howto/isolating-extensions.rst b/Doc/howto/isolating-extensions.rst index 2eddb582da7c24..0262054ae2b4a0 100644 --- a/Doc/howto/isolating-extensions.rst +++ b/Doc/howto/isolating-extensions.rst @@ -372,7 +372,7 @@ To save a some tedious error-handling boilerplate code, you can combine these two steps with :c:func:`PyType_GetModuleState`, resulting in:: my_struct *state = (my_struct*)PyType_GetModuleState(type); - if (state === NULL) { + if (state == NULL) { return NULL; } @@ -435,7 +435,7 @@ For example:: PyObject *kwnames) { my_struct *state = (my_struct*)PyType_GetModuleState(defining_class); - if (state === NULL) { + if (state == NULL) { return NULL; } ... // rest of logic @@ -479,7 +479,7 @@ to get the state:: PyObject *module = PyType_GetModuleByDef(Py_TYPE(self), &module_def); my_struct *state = (my_struct*)PyModule_GetState(module); - if (state === NULL) { + if (state == NULL) { return NULL; } From 9cc1960df65e4bdcfd127f1fab1834e91fd13e52 Mon Sep 17 00:00:00 2001 From: Sergii Dymchenko Date: Fri, 14 Apr 2023 00:44:10 -0700 Subject: [PATCH 174/349] ipaddress: Remove non-existent ip_str param from docstring (#103461) --- Lib/ipaddress.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py index 1cb71d8032e173..af1d5c4800cce8 100644 --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -1821,9 +1821,6 @@ def _string_from_ip_int(cls, ip_int=None): def _explode_shorthand_ip_string(self): """Expand a shortened IPv6 address. - Args: - ip_str: A string, the IPv6 address. - Returns: A string, the expanded IPv6 address. From 1aa376f946ef68ba46937019a424d925bf5b9611 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Fri, 14 Apr 2023 03:45:14 -0400 Subject: [PATCH 175/349] Remove double space in import error message (#103458) --- Lib/importlib/_bootstrap.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 22fa2469964ab3..e4fcaa61e6de29 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -1260,7 +1260,7 @@ def _find_and_load_unlocked(name, import_): try: path = parent_module.__path__ except AttributeError: - msg = f'{_ERR_MSG_PREFIX} {name!r}; {parent!r} is not a package' + msg = f'{_ERR_MSG_PREFIX}{name!r}; {parent!r} is not a package' raise ModuleNotFoundError(msg, name=name) from None parent_spec = parent_module.__spec__ child = name.rpartition('.')[2] From be8903eb9d66ef1229f93a3a6036aeafc3bb0bda Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Fri, 14 Apr 2023 12:01:10 +0300 Subject: [PATCH 176/349] gh-103180: Add CI timeouts to all GitHub Actions jobs (#103437) --- .github/workflows/build.yml | 10 ++++++++-- .github/workflows/build_msi.yml | 1 + .github/workflows/doc.yml | 2 ++ .github/workflows/new-bugs-announce-notifier.yml | 1 + .github/workflows/project-updater.yml | 3 ++- .github/workflows/require-pr-label.yml | 1 + .github/workflows/stale.yml | 1 + .github/workflows/verify-ensurepip-wheels.yml | 1 + 8 files changed, 17 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4e5328282f1224..7eba212cbb9a6a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,6 +33,7 @@ jobs: check_source: name: 'Check for source changes' runs-on: ubuntu-latest + timeout-minutes: 10 outputs: run_tests: ${{ steps.check.outputs.run_tests }} steps: @@ -63,6 +64,7 @@ jobs: check_generated_files: name: 'Check if generated files are up to date' runs-on: ubuntu-latest + timeout-minutes: 60 needs: check_source if: needs.check_source.outputs.run_tests == 'true' steps: @@ -118,6 +120,7 @@ jobs: build_win32: name: 'Windows (x86)' runs-on: windows-latest + timeout-minutes: 60 needs: check_source if: needs.check_source.outputs.run_tests == 'true' env: @@ -126,7 +129,6 @@ jobs: - uses: actions/checkout@v3 - name: Build CPython run: .\PCbuild\build.bat -e -d -p Win32 - timeout-minutes: 30 - name: Display build info run: .\python.bat -m test.pythoninfo - name: Tests @@ -135,6 +137,7 @@ jobs: build_win_amd64: name: 'Windows (x64)' runs-on: windows-latest + timeout-minutes: 60 needs: check_source if: needs.check_source.outputs.run_tests == 'true' env: @@ -145,7 +148,6 @@ jobs: run: echo "::add-matcher::.github/problem-matchers/msvc.json" - name: Build CPython run: .\PCbuild\build.bat -e -d -p x64 - timeout-minutes: 30 - name: Display build info run: .\python.bat -m test.pythoninfo - name: Tests @@ -154,6 +156,7 @@ jobs: build_macos: name: 'macOS' runs-on: macos-latest + timeout-minutes: 60 needs: check_source if: needs.check_source.outputs.run_tests == 'true' env: @@ -184,6 +187,7 @@ jobs: build_ubuntu: name: 'Ubuntu' runs-on: ubuntu-20.04 + timeout-minutes: 60 needs: check_source if: needs.check_source.outputs.run_tests == 'true' env: @@ -241,6 +245,7 @@ jobs: build_ubuntu_ssltests: name: 'Ubuntu SSL tests with OpenSSL' runs-on: ubuntu-20.04 + timeout-minutes: 60 needs: check_source if: needs.check_source.outputs.run_tests == 'true' strategy: @@ -290,6 +295,7 @@ jobs: build_asan: name: 'Address sanitizer' runs-on: ubuntu-20.04 + timeout-minutes: 60 needs: check_source if: needs.check_source.outputs.run_tests == 'true' env: diff --git a/.github/workflows/build_msi.yml b/.github/workflows/build_msi.yml index 5f1dcae190efbc..2bed09014e0ff2 100644 --- a/.github/workflows/build_msi.yml +++ b/.github/workflows/build_msi.yml @@ -26,6 +26,7 @@ jobs: build: name: Windows Installer runs-on: windows-latest + timeout-minutes: 60 strategy: matrix: type: [x86, x64, arm64] diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 314a7da647ff70..3101b30231c355 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -36,6 +36,7 @@ jobs: build_doc: name: 'Docs' runs-on: ubuntu-latest + timeout-minutes: 60 steps: - uses: actions/checkout@v3 - name: Register Sphinx problem matcher @@ -80,6 +81,7 @@ jobs: doctest: name: 'Doctest' runs-on: ubuntu-latest + timeout-minutes: 60 steps: - uses: actions/checkout@v3 - name: Register Sphinx problem matcher diff --git a/.github/workflows/new-bugs-announce-notifier.yml b/.github/workflows/new-bugs-announce-notifier.yml index b2a76ef7d36153..73806c5d6d58af 100644 --- a/.github/workflows/new-bugs-announce-notifier.yml +++ b/.github/workflows/new-bugs-announce-notifier.yml @@ -11,6 +11,7 @@ permissions: jobs: notify-new-bugs-announce: runs-on: ubuntu-latest + timeout-minutes: 10 steps: - uses: actions/setup-node@v3 with: diff --git a/.github/workflows/project-updater.yml b/.github/workflows/project-updater.yml index 99c7a05ae8cab0..dde923b26c2a71 100644 --- a/.github/workflows/project-updater.yml +++ b/.github/workflows/project-updater.yml @@ -13,6 +13,7 @@ jobs: add-to-project: name: Add issues to projects runs-on: ubuntu-latest + timeout-minutes: 10 strategy: matrix: include: @@ -22,7 +23,7 @@ jobs: - { project: 3, label: expert-subinterpreters } - { project: 29, label: expert-asyncio } - { project: 32, label: sprint } - + steps: - uses: actions/add-to-project@v0.1.0 with: diff --git a/.github/workflows/require-pr-label.yml b/.github/workflows/require-pr-label.yml index e847bae155e216..151a60c2c04d26 100644 --- a/.github/workflows/require-pr-label.yml +++ b/.github/workflows/require-pr-label.yml @@ -8,6 +8,7 @@ jobs: label: name: DO-NOT-MERGE runs-on: ubuntu-latest + timeout-minutes: 10 steps: - uses: mheap/github-action-required-labels@v4 diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index d79e856c87e78d..94676f5ee5fffc 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -12,6 +12,7 @@ jobs: if: github.repository_owner == 'python' runs-on: ubuntu-latest + timeout-minutes: 10 steps: - name: "Check PRs" diff --git a/.github/workflows/verify-ensurepip-wheels.yml b/.github/workflows/verify-ensurepip-wheels.yml index 969515ed287b55..d4a2cb6846c1cb 100644 --- a/.github/workflows/verify-ensurepip-wheels.yml +++ b/.github/workflows/verify-ensurepip-wheels.yml @@ -23,6 +23,7 @@ concurrency: jobs: verify: runs-on: ubuntu-latest + timeout-minutes: 10 steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 From 69e2c42f42f1d6fb1287ac5f9c6d19f2822df8fe Mon Sep 17 00:00:00 2001 From: Christopher Chavez Date: Fri, 14 Apr 2023 09:04:16 -0500 Subject: [PATCH 177/349] gh-103532: Remove TKINTER_PROTECT_LOADTK code (GH-103535) This was only needed for Tk 8.4.13 and older, but Tkinter already requires at least 8.5.12. --- Modules/_tkinter.c | 47 --------------------------------------------- Modules/tkappinit.c | 24 ----------------------- Modules/tkinter.h | 8 -------- 3 files changed, 79 deletions(-) diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 20e01c79668549..385a05932a77ed 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -324,10 +324,6 @@ static int quitMainLoop = 0; static int errorInCmd = 0; static PyObject *excInCmd; -#ifdef TKINTER_PROTECT_LOADTK -static int tk_load_failed = 0; -#endif - static PyObject *Tkapp_UnicodeResult(TkappObject *); @@ -532,17 +528,7 @@ Tcl_AppInit(Tcl_Interp *interp) return TCL_OK; } -#ifdef TKINTER_PROTECT_LOADTK - if (tk_load_failed) { - PySys_WriteStderr("Tk_Init error: %s\n", TKINTER_LOADTK_ERRMSG); - return TCL_ERROR; - } -#endif - if (Tk_Init(interp) == TCL_ERROR) { -#ifdef TKINTER_PROTECT_LOADTK - tk_load_failed = 1; -#endif PySys_WriteStderr("Tk_Init error: %s\n", Tcl_GetStringResult(interp)); return TCL_ERROR; } @@ -635,12 +621,6 @@ Tkapp_New(const char *screenName, const char *className, Tcl_SetVar(v->interp, "_tkinter_skip_tk_init", "1", TCL_GLOBAL_ONLY); } -#ifdef TKINTER_PROTECT_LOADTK - else if (tk_load_failed) { - Tcl_SetVar(v->interp, - "_tkinter_tk_failed", "1", TCL_GLOBAL_ONLY); - } -#endif /* some initial arguments need to be in argv */ if (sync || use) { @@ -702,18 +682,6 @@ Tkapp_New(const char *screenName, const char *className, if (Tcl_AppInit(v->interp) != TCL_OK) { PyObject *result = Tkinter_Error(v); -#ifdef TKINTER_PROTECT_LOADTK - if (wantTk) { - const char *_tkinter_tk_failed; - _tkinter_tk_failed = Tcl_GetVar(v->interp, - "_tkinter_tk_failed", TCL_GLOBAL_ONLY); - - if ( _tkinter_tk_failed != NULL && - strcmp(_tkinter_tk_failed, "1") == 0) { - tk_load_failed = 1; - } - } -#endif Py_DECREF((PyObject *)v); return (TkappObject *)result; } @@ -2780,18 +2748,6 @@ _tkinter_tkapp_loadtk_impl(TkappObject *self) const char * _tk_exists = NULL; int err; -#ifdef TKINTER_PROTECT_LOADTK - /* Up to Tk 8.4.13, Tk_Init deadlocks on the second call when the - * first call failed. - * To avoid the deadlock, we just refuse the second call through - * a static variable. - */ - if (tk_load_failed) { - PyErr_SetString(Tkinter_TclError, TKINTER_LOADTK_ERRMSG); - return NULL; - } -#endif - /* We want to guard against calling Tk_Init() multiple times */ CHECK_TCL_APPARTMENT; ENTER_TCL @@ -2811,9 +2767,6 @@ _tkinter_tkapp_loadtk_impl(TkappObject *self) if (_tk_exists == NULL || strcmp(_tk_exists, "1") != 0) { if (Tk_Init(interp) == TCL_ERROR) { Tkinter_Error(self); -#ifdef TKINTER_PROTECT_LOADTK - tk_load_failed = 1; -#endif return NULL; } } diff --git a/Modules/tkappinit.c b/Modules/tkappinit.c index 7616d9d319d228..67d6250318c616 100644 --- a/Modules/tkappinit.c +++ b/Modules/tkappinit.c @@ -18,18 +18,10 @@ #include "tkinter.h" -#ifdef TKINTER_PROTECT_LOADTK -/* See Tkapp_TkInit in _tkinter.c for the usage of tk_load_faile */ -static int tk_load_failed; -#endif - int Tcl_AppInit(Tcl_Interp *interp) { const char *_tkinter_skip_tk_init; -#ifdef TKINTER_PROTECT_LOADTK - const char *_tkinter_tk_failed; -#endif #ifdef TK_AQUA #ifndef MAX_PATH_LEN @@ -90,23 +82,7 @@ Tcl_AppInit(Tcl_Interp *interp) return TCL_OK; } -#ifdef TKINTER_PROTECT_LOADTK - _tkinter_tk_failed = Tcl_GetVar(interp, - "_tkinter_tk_failed", TCL_GLOBAL_ONLY); - - if (tk_load_failed || ( - _tkinter_tk_failed != NULL && - strcmp(_tkinter_tk_failed, "1") == 0)) { - Tcl_SetResult(interp, TKINTER_LOADTK_ERRMSG, TCL_STATIC); - return TCL_ERROR; - } -#endif - if (Tk_Init(interp) == TCL_ERROR) { -#ifdef TKINTER_PROTECT_LOADTK - tk_load_failed = 1; - Tcl_SetVar(interp, "_tkinter_tk_failed", "1", TCL_GLOBAL_ONLY); -#endif return TCL_ERROR; } diff --git a/Modules/tkinter.h b/Modules/tkinter.h index cb5a806b0c4326..40281c21760331 100644 --- a/Modules/tkinter.h +++ b/Modules/tkinter.h @@ -16,12 +16,4 @@ (TK_RELEASE_LEVEL << 8) | \ (TK_RELEASE_SERIAL << 0)) -/* Protect Tk 8.4.13 and older from a deadlock that happens when trying - * to load tk after a failed attempt. */ -#if TK_HEX_VERSION < 0x0804020e -#define TKINTER_PROTECT_LOADTK -#define TKINTER_LOADTK_ERRMSG \ - "Calling Tk_Init again after a previous call failed might deadlock" -#endif - #endif /* !TKINTER_H */ From e32c197ad31436e8160d9c8c0bba65d89f8ee14d Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Fri, 14 Apr 2023 10:28:53 -0500 Subject: [PATCH 178/349] gh-103532: Add NEWS entry (#103542) --- .../next/Build/2023-04-14-10-24-37.gh-issue-103532.H1djkd.rst | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/Build/2023-04-14-10-24-37.gh-issue-103532.H1djkd.rst diff --git a/Misc/NEWS.d/next/Build/2023-04-14-10-24-37.gh-issue-103532.H1djkd.rst b/Misc/NEWS.d/next/Build/2023-04-14-10-24-37.gh-issue-103532.H1djkd.rst new file mode 100644 index 00000000000000..ad981eafc59144 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2023-04-14-10-24-37.gh-issue-103532.H1djkd.rst @@ -0,0 +1,4 @@ +The ``TKINTER_PROTECT_LOADTK`` macro is no longer defined or used in the +``_tkinter`` module. It was previously only defined when building against +Tk 8.4.13 and older, but Tk older than 8.5.12 has been unsupported since +:gh-issue:`91152`. From 95ee7c47ab53eb0e26f2b2b4f681015f49c0bff7 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Fri, 14 Apr 2023 11:03:28 -0500 Subject: [PATCH 179/349] gh-103532: Fix reST syntax in NEWS entry (GH-103544) --- .../next/Build/2023-04-14-10-24-37.gh-issue-103532.H1djkd.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Build/2023-04-14-10-24-37.gh-issue-103532.H1djkd.rst b/Misc/NEWS.d/next/Build/2023-04-14-10-24-37.gh-issue-103532.H1djkd.rst index ad981eafc59144..255c9833282c2f 100644 --- a/Misc/NEWS.d/next/Build/2023-04-14-10-24-37.gh-issue-103532.H1djkd.rst +++ b/Misc/NEWS.d/next/Build/2023-04-14-10-24-37.gh-issue-103532.H1djkd.rst @@ -1,4 +1,4 @@ The ``TKINTER_PROTECT_LOADTK`` macro is no longer defined or used in the ``_tkinter`` module. It was previously only defined when building against Tk 8.4.13 and older, but Tk older than 8.5.12 has been unsupported since -:gh-issue:`91152`. +gh-issue-91152. From 3d71b5ec5ecccc14c00707d73ebbc907877b3448 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Fri, 14 Apr 2023 20:47:13 +0200 Subject: [PATCH 180/349] gh-103527: Add make deps for _codecs_* and _multibytecodec (#103528) --- Makefile.pre.in | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Makefile.pre.in b/Makefile.pre.in index afd503ef126339..a4633caba30522 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -2662,6 +2662,13 @@ MODULE__SOCKET_DEPS=$(srcdir)/Modules/socketmodule.h $(srcdir)/Modules/addrinfo. MODULE__SSL_DEPS=$(srcdir)/Modules/_ssl.h $(srcdir)/Modules/_ssl/cert.c $(srcdir)/Modules/_ssl/debughelpers.c $(srcdir)/Modules/_ssl/misc.c $(srcdir)/Modules/_ssl_data.h $(srcdir)/Modules/_ssl_data_111.h $(srcdir)/Modules/_ssl_data_300.h $(srcdir)/Modules/socketmodule.h MODULE__TESTCAPI_DEPS=$(srcdir)/Modules/_testcapi/testcapi_long.h $(srcdir)/Modules/_testcapi/parts.h MODULE__SQLITE3_DEPS=$(srcdir)/Modules/_sqlite/connection.h $(srcdir)/Modules/_sqlite/cursor.h $(srcdir)/Modules/_sqlite/microprotocols.h $(srcdir)/Modules/_sqlite/module.h $(srcdir)/Modules/_sqlite/prepare_protocol.h $(srcdir)/Modules/_sqlite/row.h $(srcdir)/Modules/_sqlite/util.h +MODULE__CODECS_CN_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_cn.h $(srcdir)/Modules/cjkcodecs/cjkcodecs.h +MODULE__CODECS_HK_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_hk.h $(srcdir)/Modules/cjkcodecs/cjkcodecs.h +MODULE__CODECS_ISO2022_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_jisx0213_pair.h $(srcdir)/Modules/cjkcodecs/cjkcodecs.h $(srcdir)/Modules/cjkcodecs/alg_jisx0201.h $(srcdir)/Modules/cjkcodecs/emu_jisx0213_2000.h +MODULE__CODECS_JP_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_jisx0213_pair.h $(srcdir)/Modules/cjkcodecs/cjkcodecs.h $(srcdir)/Modules/cjkcodecs/alg_jisx0201.h $(srcdir)/Modules/cjkcodecs/emu_jisx0213_2000.h $(srcdir)/Modules/cjkcodecs/mappings_jp.h +MODULE__CODECS_KR_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_kr.h $(srcdir)/Modules/cjkcodecs/cjkcodecs.h +MODULE__CODECS_TW_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_tw.h $(srcdir)/Modules/cjkcodecs/cjkcodecs.h +MODULE__MULTIBYTECODEC_DEPS=$(srcdir)/Modules/cjkcodecs/multibytecodec.h # IF YOU PUT ANYTHING HERE IT WILL GO AWAY # Local Variables: From 7c1b0a46c61f8bf8e2039bba1bff11b6ae20e56b Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Fri, 14 Apr 2023 13:40:31 -0700 Subject: [PATCH 181/349] gh-101517: Add regression test for a lineno bug in try/except* impacting pdb (#103547) --- Lib/test/test_pdb.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 9ad9a1c52ac102..94b441720f258c 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -1700,6 +1700,26 @@ def test_pdb_issue_gh_103225(): (Pdb) continue """ +def test_pdb_issue_gh_101517(): + """See GH-101517 + + Make sure pdb doesn't crash when the exception is caught in a try/except* block + + >>> def test_function(): + ... try: + ... raise KeyError + ... except* Exception as e: + ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() + + >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE + ... 'continue' + ... ]): + ... test_function() + --Return-- + > (None)test_function()->None + (Pdb) continue + """ + @support.requires_subprocess() class PdbTestCase(unittest.TestCase): From 8af8f52d175959f03cf4a2786b6a81ec09e15e95 Mon Sep 17 00:00:00 2001 From: Barney Gale Date: Fri, 14 Apr 2023 21:55:41 +0100 Subject: [PATCH 182/349] GH-78079: Fix UNC device path root normalization in pathlib (GH-102003) We no longer add a root to device paths such as `//./PhysicalDrive0`, `//?/BootPartition` and `//./c:` while normalizing. We also avoid adding a root to incomplete UNC share paths, like `//`, `//a` and `//a/`. Co-authored-by: Eryk Sun --- Lib/pathlib.py | 11 ++++++--- Lib/test/test_ntpath.py | 8 +++++++ Lib/test/test_pathlib.py | 24 +++++++++++++++++++ ...3-02-17-21-14-40.gh-issue-78079.z3Szr6.rst | 3 +++ 4 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-02-17-21-14-40.gh-issue-78079.z3Szr6.rst diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 4ae1fae6f4b358..f43f01ef41a97f 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -322,9 +322,14 @@ def _parse_path(cls, path): if altsep: path = path.replace(altsep, sep) drv, root, rel = cls._flavour.splitroot(path) - if drv.startswith(sep): - # pathlib assumes that UNC paths always have a root. - root = sep + if not root and drv.startswith(sep) and not drv.endswith(sep): + drv_parts = drv.split(sep) + if len(drv_parts) == 4 and drv_parts[2] not in '?.': + # e.g. //server/share + root = sep + elif len(drv_parts) == 6: + # e.g. //?/unc/server/share + root = sep parsed = [sys.intern(str(x)) for x in rel.split(sep) if x and x != '.'] return drv, root, parsed diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py index 42b9587ca18107..0e57c165ca98ea 100644 --- a/Lib/test/test_ntpath.py +++ b/Lib/test/test_ntpath.py @@ -169,6 +169,7 @@ def test_splitroot(self): # gh-81790: support device namespace, including UNC drives. tester('ntpath.splitroot("//?/c:")', ("//?/c:", "", "")) + tester('ntpath.splitroot("//./c:")', ("//./c:", "", "")) tester('ntpath.splitroot("//?/c:/")', ("//?/c:", "/", "")) tester('ntpath.splitroot("//?/c:/dir")', ("//?/c:", "/", "dir")) tester('ntpath.splitroot("//?/UNC")', ("//?/UNC", "", "")) @@ -179,8 +180,12 @@ def test_splitroot(self): tester('ntpath.splitroot("//?/VOLUME{00000000-0000-0000-0000-000000000000}/spam")', ('//?/VOLUME{00000000-0000-0000-0000-000000000000}', '/', 'spam')) tester('ntpath.splitroot("//?/BootPartition/")', ("//?/BootPartition", "/", "")) + tester('ntpath.splitroot("//./BootPartition/")', ("//./BootPartition", "/", "")) + tester('ntpath.splitroot("//./PhysicalDrive0")', ("//./PhysicalDrive0", "", "")) + tester('ntpath.splitroot("//./nul")', ("//./nul", "", "")) tester('ntpath.splitroot("\\\\?\\c:")', ("\\\\?\\c:", "", "")) + tester('ntpath.splitroot("\\\\.\\c:")', ("\\\\.\\c:", "", "")) tester('ntpath.splitroot("\\\\?\\c:\\")', ("\\\\?\\c:", "\\", "")) tester('ntpath.splitroot("\\\\?\\c:\\dir")', ("\\\\?\\c:", "\\", "dir")) tester('ntpath.splitroot("\\\\?\\UNC")', ("\\\\?\\UNC", "", "")) @@ -193,6 +198,9 @@ def test_splitroot(self): tester('ntpath.splitroot("\\\\?\\VOLUME{00000000-0000-0000-0000-000000000000}\\spam")', ('\\\\?\\VOLUME{00000000-0000-0000-0000-000000000000}', '\\', 'spam')) tester('ntpath.splitroot("\\\\?\\BootPartition\\")', ("\\\\?\\BootPartition", "\\", "")) + tester('ntpath.splitroot("\\\\.\\BootPartition\\")', ("\\\\.\\BootPartition", "\\", "")) + tester('ntpath.splitroot("\\\\.\\PhysicalDrive0")', ("\\\\.\\PhysicalDrive0", "", "")) + tester('ntpath.splitroot("\\\\.\\nul")', ("\\\\.\\nul", "", "")) # gh-96290: support partial/invalid UNC drives tester('ntpath.splitroot("//")', ("//", "", "")) # empty server & missing share diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 3c6da94d094610..120b70f2197385 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -810,6 +810,9 @@ def test_drive_root_parts(self): check(('c:/a',), 'c:', '\\', ('c:\\', 'a')) check(('/a',), '', '\\', ('\\', 'a')) # UNC paths. + check(('//',), '\\\\', '', ('\\\\',)) + check(('//a',), '\\\\a', '', ('\\\\a',)) + check(('//a/',), '\\\\a\\', '', ('\\\\a\\',)) check(('//a/b',), '\\\\a\\b', '\\', ('\\\\a\\b\\',)) check(('//a/b/',), '\\\\a\\b', '\\', ('\\\\a\\b\\',)) check(('//a/b/c',), '\\\\a\\b', '\\', ('\\\\a\\b\\', 'c')) @@ -823,12 +826,26 @@ def test_drive_root_parts(self): # UNC paths. check(('a', '//b/c//', 'd'), '\\\\b\\c', '\\', ('\\\\b\\c\\', 'd')) # Extended paths. + check(('//./c:',), '\\\\.\\c:', '', ('\\\\.\\c:',)) check(('//?/c:/',), '\\\\?\\c:', '\\', ('\\\\?\\c:\\',)) check(('//?/c:/a',), '\\\\?\\c:', '\\', ('\\\\?\\c:\\', 'a')) check(('//?/c:/a', '/b'), '\\\\?\\c:', '\\', ('\\\\?\\c:\\', 'b')) # Extended UNC paths (format is "\\?\UNC\server\share"). + check(('//?',), '\\\\?', '', ('\\\\?',)) + check(('//?/',), '\\\\?\\', '', ('\\\\?\\',)) + check(('//?/UNC',), '\\\\?\\UNC', '', ('\\\\?\\UNC',)) + check(('//?/UNC/',), '\\\\?\\UNC\\', '', ('\\\\?\\UNC\\',)) + check(('//?/UNC/b',), '\\\\?\\UNC\\b', '', ('\\\\?\\UNC\\b',)) + check(('//?/UNC/b/',), '\\\\?\\UNC\\b\\', '', ('\\\\?\\UNC\\b\\',)) check(('//?/UNC/b/c',), '\\\\?\\UNC\\b\\c', '\\', ('\\\\?\\UNC\\b\\c\\',)) + check(('//?/UNC/b/c/',), '\\\\?\\UNC\\b\\c', '\\', ('\\\\?\\UNC\\b\\c\\',)) check(('//?/UNC/b/c/d',), '\\\\?\\UNC\\b\\c', '\\', ('\\\\?\\UNC\\b\\c\\', 'd')) + # UNC device paths + check(('//./BootPartition/',), '\\\\.\\BootPartition', '\\', ('\\\\.\\BootPartition\\',)) + check(('//?/BootPartition/',), '\\\\?\\BootPartition', '\\', ('\\\\?\\BootPartition\\',)) + check(('//./PhysicalDrive0',), '\\\\.\\PhysicalDrive0', '', ('\\\\.\\PhysicalDrive0',)) + check(('//?/Volume{}/',), '\\\\?\\Volume{}', '\\', ('\\\\?\\Volume{}\\',)) + check(('//./nul',), '\\\\.\\nul', '', ('\\\\.\\nul',)) # Second part has a root but not drive. check(('a', '/b', 'c'), '', '\\', ('\\', 'b', 'c')) check(('Z:/a', '/b', 'c'), 'Z:', '\\', ('Z:\\', 'b', 'c')) @@ -1371,6 +1388,13 @@ def test_join(self): self.assertEqual(pp, P('C:/a/b/dd:s')) pp = p.joinpath(P('E:d:s')) self.assertEqual(pp, P('E:d:s')) + # Joining onto a UNC path with no root + pp = P('//').joinpath('server') + self.assertEqual(pp, P('//server')) + pp = P('//server').joinpath('share') + self.assertEqual(pp, P('//server/share')) + pp = P('//./BootPartition').joinpath('Windows') + self.assertEqual(pp, P('//./BootPartition/Windows')) def test_div(self): # Basically the same as joinpath(). diff --git a/Misc/NEWS.d/next/Library/2023-02-17-21-14-40.gh-issue-78079.z3Szr6.rst b/Misc/NEWS.d/next/Library/2023-02-17-21-14-40.gh-issue-78079.z3Szr6.rst new file mode 100644 index 00000000000000..bbb9ac3e3f8faa --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-02-17-21-14-40.gh-issue-78079.z3Szr6.rst @@ -0,0 +1,3 @@ +Fix incorrect normalization of UNC device path roots, and partial UNC share +path roots, in :class:`pathlib.PurePath`. Pathlib no longer appends a +trailing slash to such paths. From 2b6f5c3483597abcb8422508aeffab04f500f568 Mon Sep 17 00:00:00 2001 From: chgnrdv <52372310+chgnrdv@users.noreply.github.com> Date: Sat, 15 Apr 2023 08:53:31 +0300 Subject: [PATCH 183/349] gh-102114: Make dis print more concise tracebacks for syntax errors in str inputs (#102115) --- Lib/dis.py | 6 +++--- Lib/test/test_dis.py | 7 +++++++ .../Library/2023-02-21-14-57-34.gh-issue-102114.uUDQzb.rst | 1 + 3 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-02-21-14-57-34.gh-issue-102114.uUDQzb.rst diff --git a/Lib/dis.py b/Lib/dis.py index b39b2835330135..6a7fcb8a1a0071 100644 --- a/Lib/dis.py +++ b/Lib/dis.py @@ -64,10 +64,10 @@ def _try_compile(source, name): expect code objects """ try: - c = compile(source, name, 'eval') + return compile(source, name, 'eval') except SyntaxError: - c = compile(source, name, 'exec') - return c + pass + return compile(source, name, 'exec') def dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False): """Disassemble classes, methods, functions, and other compiled objects. diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 0a60a979614d52..2d5c73c9adc920 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -1067,6 +1067,13 @@ def check(expected, **kwargs): check(dis_nested_2, depth=None) check(dis_nested_2) + def test__try_compile_no_context_exc_on_error(self): + # see gh-102114 + try: + dis._try_compile(")", "") + except Exception as e: + self.assertIsNone(e.__context__) + @staticmethod def code_quicken(f, times=ADAPTIVE_WARMUP_DELAY): for _ in range(times): diff --git a/Misc/NEWS.d/next/Library/2023-02-21-14-57-34.gh-issue-102114.uUDQzb.rst b/Misc/NEWS.d/next/Library/2023-02-21-14-57-34.gh-issue-102114.uUDQzb.rst new file mode 100644 index 00000000000000..4140c9a96cd272 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-02-21-14-57-34.gh-issue-102114.uUDQzb.rst @@ -0,0 +1 @@ +Functions in the :mod:`dis` module that accept a source code string as argument now print a more concise traceback when the string contains a syntax or indentation error. From 0097c36e07eeb516bcccba34feb4d494a67832d5 Mon Sep 17 00:00:00 2001 From: Barney Gale Date: Sat, 15 Apr 2023 17:35:17 +0100 Subject: [PATCH 184/349] GH-103517: Improve tests for `pathlib.Path.walk()` (GH-103518) --- Lib/test/test_pathlib.py | 77 +++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 32 deletions(-) diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 120b70f2197385..76cfadeedcea84 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -2702,20 +2702,20 @@ def setUp(self): del self.sub2_tree[1][:1] def test_walk_topdown(self): - all = list(self.walk_path.walk()) - - self.assertEqual(len(all), 4) - # We can't know which order SUB1 and SUB2 will appear in. - # Not flipped: TESTFN, SUB1, SUB11, SUB2 - # flipped: TESTFN, SUB2, SUB1, SUB11 - flipped = all[0][1][0] != "SUB1" - all[0][1].sort() - all[3 - 2 * flipped][-1].sort() - all[3 - 2 * flipped][1].sort() - self.assertEqual(all[0], (self.walk_path, ["SUB1", "SUB2"], ["tmp1"])) - self.assertEqual(all[1 + flipped], (self.sub1_path, ["SUB11"], ["tmp2"])) - self.assertEqual(all[2 + flipped], (self.sub11_path, [], [])) - self.assertEqual(all[3 - 2 * flipped], self.sub2_tree) + walker = self.walk_path.walk() + entry = next(walker) + entry[1].sort() # Ensure we visit SUB1 before SUB2 + self.assertEqual(entry, (self.walk_path, ["SUB1", "SUB2"], ["tmp1"])) + entry = next(walker) + self.assertEqual(entry, (self.sub1_path, ["SUB11"], ["tmp2"])) + entry = next(walker) + self.assertEqual(entry, (self.sub11_path, [], [])) + entry = next(walker) + entry[1].sort() + entry[2].sort() + self.assertEqual(entry, self.sub2_tree) + with self.assertRaises(StopIteration): + next(walker) def test_walk_prune(self, walk_path=None): if walk_path is None: @@ -2739,24 +2739,37 @@ def test_file_like_path(self): self.test_walk_prune(FakePath(self.walk_path).__fspath__()) def test_walk_bottom_up(self): - all = list(self.walk_path.walk( top_down=False)) - - self.assertEqual(len(all), 4, all) - # We can't know which order SUB1 and SUB2 will appear in. - # Not flipped: SUB11, SUB1, SUB2, TESTFN - # flipped: SUB2, SUB11, SUB1, TESTFN - flipped = all[3][1][0] != "SUB1" - all[3][1].sort() - all[2 - 2 * flipped][-1].sort() - all[2 - 2 * flipped][1].sort() - self.assertEqual(all[3], - (self.walk_path, ["SUB1", "SUB2"], ["tmp1"])) - self.assertEqual(all[flipped], - (self.sub11_path, [], [])) - self.assertEqual(all[flipped + 1], - (self.sub1_path, ["SUB11"], ["tmp2"])) - self.assertEqual(all[2 - 2 * flipped], - self.sub2_tree) + seen_testfn = seen_sub1 = seen_sub11 = seen_sub2 = False + for path, dirnames, filenames in self.walk_path.walk(top_down=False): + if path == self.walk_path: + self.assertFalse(seen_testfn) + self.assertTrue(seen_sub1) + self.assertTrue(seen_sub2) + self.assertEqual(sorted(dirnames), ["SUB1", "SUB2"]) + self.assertEqual(filenames, ["tmp1"]) + seen_testfn = True + elif path == self.sub1_path: + self.assertFalse(seen_testfn) + self.assertFalse(seen_sub1) + self.assertTrue(seen_sub11) + self.assertEqual(dirnames, ["SUB11"]) + self.assertEqual(filenames, ["tmp2"]) + seen_sub1 = True + elif path == self.sub11_path: + self.assertFalse(seen_sub1) + self.assertFalse(seen_sub11) + self.assertEqual(dirnames, []) + self.assertEqual(filenames, []) + seen_sub11 = True + elif path == self.sub2_path: + self.assertFalse(seen_testfn) + self.assertFalse(seen_sub2) + self.assertEqual(sorted(dirnames), sorted(self.sub2_tree[1])) + self.assertEqual(sorted(filenames), sorted(self.sub2_tree[2])) + seen_sub2 = True + else: + raise AssertionError(f"Unexpected path: {path}") + self.assertTrue(seen_testfn) @os_helper.skip_unless_symlink def test_walk_follow_symlinks(self): From 4fe1c4b97e39429abbb9c2117fe40f585de00887 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Sat, 15 Apr 2023 23:48:31 +0300 Subject: [PATCH 185/349] gh-103553: Improve `test_inspect`: add more assertions, remove unused (#103554) --- Lib/test/test_inspect.py | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index cfdb992654c252..6b342b1f00d654 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -1820,8 +1820,7 @@ def test_errors(self): self.assertEqualException(f, '2, 3, 4') self.assertEqualException(f, '1, 2, 3, a=1') self.assertEqualException(f, '2, 3, 4, c=5') - # XXX: success of this one depends on dict order - ## self.assertEqualException(f, '2, 3, 4, a=1, c=5') + self.assertEqualException(f, '2, 3, 4, a=1, c=5') # f got an unexpected keyword argument self.assertEqualException(f, 'c=2') self.assertEqualException(f, '2, c=3') @@ -1832,17 +1831,19 @@ def test_errors(self): self.assertEqualException(f, '1, a=2') self.assertEqualException(f, '1, **{"a":2}') self.assertEqualException(f, '1, 2, b=3') - # XXX: Python inconsistency - # - for functions and bound methods: unexpected keyword 'c' - # - for unbound methods: multiple values for keyword 'a' - #self.assertEqualException(f, '1, c=3, a=2') + self.assertEqualException(f, '1, c=3, a=2') # issue11256: f3 = self.makeCallable('**c') self.assertEqualException(f3, '1, 2') self.assertEqualException(f3, '1, 2, a=1, b=2') f4 = self.makeCallable('*, a, b=0') - self.assertEqualException(f3, '1, 2') - self.assertEqualException(f3, '1, 2, a=1, b=2') + self.assertEqualException(f4, '1, 2') + self.assertEqualException(f4, '1, 2, a=1, b=2') + self.assertEqualException(f4, 'a=1, a=3') + self.assertEqualException(f4, 'a=1, c=3') + self.assertEqualException(f4, 'a=1, a=3, b=4') + self.assertEqualException(f4, 'a=1, b=2, a=3, b=4') + self.assertEqualException(f4, 'a=1, a=2, a=3, b=4') # issue #20816: getcallargs() fails to iterate over non-existent # kwonlydefaults and raises a wrong TypeError @@ -2872,8 +2873,6 @@ def foo(cls, *, arg): def test_signature_on_partial(self): from functools import partial - Parameter = inspect.Parameter - def test(): pass @@ -2988,8 +2987,6 @@ def test(a, b, c:int) -> 42: ((('c', ..., int, "positional_or_keyword"),), 42)) - psig = inspect.signature(partial(partial(test, 1), 2)) - def foo(a): return a _foo = partial(partial(foo, a=10), a=20) @@ -4153,8 +4150,6 @@ def test(a, *args, b, z=100, **kwargs): self.assertEqual(ba.args, (10, 20)) def test_signature_bind_positional_only(self): - P = inspect.Parameter - def test(a_po, b_po, c_po=3, /, foo=42, *, bar=50, **kwargs): return a_po, b_po, c_po, foo, bar, kwargs @@ -4578,7 +4573,6 @@ def test_qualname_source(self): self.assertEqual(err, b'') def test_builtins(self): - module = importlib.import_module('unittest') _, out, err = assert_python_failure('-m', 'inspect', 'sys') lines = err.decode().splitlines() From a210cac77649a18bf0eb7354c9187ec91ccb078a Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 16 Apr 2023 05:57:30 +0200 Subject: [PATCH 186/349] gh-103527: Add multibytecodec.h as make dep for _codecs_* (#103567) --- Makefile.pre.in | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index a4633caba30522..a58397f21f9bb2 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -2662,12 +2662,14 @@ MODULE__SOCKET_DEPS=$(srcdir)/Modules/socketmodule.h $(srcdir)/Modules/addrinfo. MODULE__SSL_DEPS=$(srcdir)/Modules/_ssl.h $(srcdir)/Modules/_ssl/cert.c $(srcdir)/Modules/_ssl/debughelpers.c $(srcdir)/Modules/_ssl/misc.c $(srcdir)/Modules/_ssl_data.h $(srcdir)/Modules/_ssl_data_111.h $(srcdir)/Modules/_ssl_data_300.h $(srcdir)/Modules/socketmodule.h MODULE__TESTCAPI_DEPS=$(srcdir)/Modules/_testcapi/testcapi_long.h $(srcdir)/Modules/_testcapi/parts.h MODULE__SQLITE3_DEPS=$(srcdir)/Modules/_sqlite/connection.h $(srcdir)/Modules/_sqlite/cursor.h $(srcdir)/Modules/_sqlite/microprotocols.h $(srcdir)/Modules/_sqlite/module.h $(srcdir)/Modules/_sqlite/prepare_protocol.h $(srcdir)/Modules/_sqlite/row.h $(srcdir)/Modules/_sqlite/util.h -MODULE__CODECS_CN_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_cn.h $(srcdir)/Modules/cjkcodecs/cjkcodecs.h -MODULE__CODECS_HK_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_hk.h $(srcdir)/Modules/cjkcodecs/cjkcodecs.h -MODULE__CODECS_ISO2022_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_jisx0213_pair.h $(srcdir)/Modules/cjkcodecs/cjkcodecs.h $(srcdir)/Modules/cjkcodecs/alg_jisx0201.h $(srcdir)/Modules/cjkcodecs/emu_jisx0213_2000.h -MODULE__CODECS_JP_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_jisx0213_pair.h $(srcdir)/Modules/cjkcodecs/cjkcodecs.h $(srcdir)/Modules/cjkcodecs/alg_jisx0201.h $(srcdir)/Modules/cjkcodecs/emu_jisx0213_2000.h $(srcdir)/Modules/cjkcodecs/mappings_jp.h -MODULE__CODECS_KR_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_kr.h $(srcdir)/Modules/cjkcodecs/cjkcodecs.h -MODULE__CODECS_TW_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_tw.h $(srcdir)/Modules/cjkcodecs/cjkcodecs.h + +CODECS_COMMON_HEADERS=$(srcdir)/Modules/cjkcodecs/multibytecodec.h $(srcdir)/Modules/cjkcodecs/cjkcodecs.h +MODULE__CODECS_CN_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_cn.h $(CODECS_COMMON_HEADERS) +MODULE__CODECS_HK_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_hk.h $(CODECS_COMMON_HEADERS) +MODULE__CODECS_ISO2022_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_jisx0213_pair.h $(srcdir)/Modules/cjkcodecs/alg_jisx0201.h $(srcdir)/Modules/cjkcodecs/emu_jisx0213_2000.h $(CODECS_COMMON_HEADERS) +MODULE__CODECS_JP_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_jisx0213_pair.h $(srcdir)/Modules/cjkcodecs/alg_jisx0201.h $(srcdir)/Modules/cjkcodecs/emu_jisx0213_2000.h $(srcdir)/Modules/cjkcodecs/mappings_jp.h $(CODECS_COMMON_HEADERS) +MODULE__CODECS_KR_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_kr.h $(CODECS_COMMON_HEADERS) +MODULE__CODECS_TW_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_tw.h $(CODECS_COMMON_HEADERS) MODULE__MULTIBYTECODEC_DEPS=$(srcdir)/Modules/cjkcodecs/multibytecodec.h # IF YOU PUT ANYTHING HERE IT WILL GO AWAY From ff3303e49c13495d8d9cf1dc0cf0624bbda1d3ae Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Mon, 17 Apr 2023 00:19:44 +0200 Subject: [PATCH 187/349] gh-48330: address review comments to PR-12271 (#103209) address review comments to PR-12271 Signed-off-by: Giampaolo Rodola --- Doc/library/unittest.rst | 4 ---- Lib/test/test_unittest/test_runner.py | 12 ++++++------ Lib/unittest/result.py | 6 +++++- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index d1a977fd7da6a5..a7c74cfa4fb477 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -2191,10 +2191,6 @@ Loading and running tests .. versionadded:: 3.12 Added *durations* keyword argument. - .. versionchanged:: 3.12 - Subclasses should accept ``**kwargs`` to ensure compatibility as the - interface changes. - .. data:: defaultTestLoader Instance of the :class:`TestLoader` class intended to be shared. If no diff --git a/Lib/test/test_unittest/test_runner.py b/Lib/test/test_unittest/test_runner.py index 1ce42a106c5883..ceb4c8acde532c 100644 --- a/Lib/test/test_unittest/test_runner.py +++ b/Lib/test/test_unittest/test_runner.py @@ -1367,7 +1367,7 @@ def testSpecifiedStreamUsed(self): self.assertTrue(runner.stream.stream is f) def test_durations(self): - def run(test, expect_durations): + def run(test, *, expect_durations=True): stream = BufferedWriter() runner = unittest.TextTestRunner(stream=stream, durations=5, verbosity=2) result = runner.run(test) @@ -1389,21 +1389,21 @@ class Foo(unittest.TestCase): def test_1(self): pass - run(Foo('test_1'), True) + run(Foo('test_1'), expect_durations=True) # failure class Foo(unittest.TestCase): def test_1(self): self.assertEqual(0, 1) - run(Foo('test_1'), True) + run(Foo('test_1'), expect_durations=True) # error class Foo(unittest.TestCase): def test_1(self): 1 / 0 - run(Foo('test_1'), True) + run(Foo('test_1'), expect_durations=True) # error in setUp and tearDown @@ -1414,7 +1414,7 @@ def setUp(self): def test_1(self): pass - run(Foo('test_1'), True) + run(Foo('test_1'), expect_durations=True) # skip (expect no durations) class Foo(unittest.TestCase): @@ -1422,7 +1422,7 @@ class Foo(unittest.TestCase): def test_1(self): pass - run(Foo('test_1'), False) + run(Foo('test_1'), expect_durations=False) diff --git a/Lib/unittest/result.py b/Lib/unittest/result.py index fa9bea47c88829..7757dba9670b43 100644 --- a/Lib/unittest/result.py +++ b/Lib/unittest/result.py @@ -159,7 +159,11 @@ def addUnexpectedSuccess(self, test): self.unexpectedSuccesses.append(test) def addDuration(self, test, elapsed): - """Called when a test finished to run, regardless of its outcome.""" + """Called when a test finished to run, regardless of its outcome. + *test* is the test case corresponding to the test method. + *elapsed* is the time represented in seconds, and it includes the + execution of cleanup functions. + """ # support for a TextTestRunner using an old TestResult class if hasattr(self, "collectedDurations"): self.collectedDurations.append((test, elapsed)) From 217911ede5d52b02b2e3c9222439e1ea08545291 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Mon, 17 Apr 2023 02:41:25 +0200 Subject: [PATCH 188/349] gh-103583: Add codecs and maps to _codecs_* module state (#103540) --- Modules/cjkcodecs/_codecs_cn.c | 4 +- Modules/cjkcodecs/_codecs_hk.c | 5 +- Modules/cjkcodecs/_codecs_iso2022.c | 9 +- Modules/cjkcodecs/_codecs_jp.c | 13 +- Modules/cjkcodecs/_codecs_kr.c | 4 +- Modules/cjkcodecs/_codecs_tw.c | 4 +- Modules/cjkcodecs/cjkcodecs.h | 175 +++++++++++++------- Modules/cjkcodecs/multibytecodec.c | 41 ++--- Tools/c-analyzer/cpython/globals-to-fix.tsv | 2 - 9 files changed, 161 insertions(+), 96 deletions(-) diff --git a/Modules/cjkcodecs/_codecs_cn.c b/Modules/cjkcodecs/_codecs_cn.c index 8a62f7e257c6b1..e2c7908c9bb275 100644 --- a/Modules/cjkcodecs/_codecs_cn.c +++ b/Modules/cjkcodecs/_codecs_cn.c @@ -453,14 +453,14 @@ DECODER(hz) } -BEGIN_MAPPINGS_LIST +BEGIN_MAPPINGS_LIST(4) MAPPING_DECONLY(gb2312) MAPPING_DECONLY(gbkext) MAPPING_ENCONLY(gbcommon) MAPPING_ENCDEC(gb18030ext) END_MAPPINGS_LIST -BEGIN_CODECS_LIST +BEGIN_CODECS_LIST(4) CODEC_STATELESS(gb2312) CODEC_STATELESS(gbk) CODEC_STATELESS(gb18030) diff --git a/Modules/cjkcodecs/_codecs_hk.c b/Modules/cjkcodecs/_codecs_hk.c index 4f21569a0ce73f..43593b873733e6 100644 --- a/Modules/cjkcodecs/_codecs_hk.c +++ b/Modules/cjkcodecs/_codecs_hk.c @@ -177,14 +177,13 @@ DECODER(big5hkscs) return 0; } - -BEGIN_MAPPINGS_LIST +BEGIN_MAPPINGS_LIST(3) MAPPING_DECONLY(big5hkscs) MAPPING_ENCONLY(big5hkscs_bmp) MAPPING_ENCONLY(big5hkscs_nonbmp) END_MAPPINGS_LIST -BEGIN_CODECS_LIST +BEGIN_CODECS_LIST(1) CODEC_STATELESS_WINIT(big5hkscs) END_CODECS_LIST diff --git a/Modules/cjkcodecs/_codecs_iso2022.c b/Modules/cjkcodecs/_codecs_iso2022.c index 7394cf67e0e7dd..cf34752e16a527 100644 --- a/Modules/cjkcodecs/_codecs_iso2022.c +++ b/Modules/cjkcodecs/_codecs_iso2022.c @@ -1119,18 +1119,19 @@ static const struct iso2022_designation iso2022_jp_ext_designations[] = { CONFIGDEF(jp_ext, NO_SHIFT | USE_JISX0208_EXT) -BEGIN_MAPPINGS_LIST +BEGIN_MAPPINGS_LIST(0) /* no mapping table here */ END_MAPPINGS_LIST -#define ISO2022_CODEC(variation) { \ +#define ISO2022_CODEC(variation) \ +NEXT_CODEC = (MultibyteCodec){ \ "iso2022_" #variation, \ &iso2022_##variation##_config, \ iso2022_codec_init, \ _STATEFUL_METHODS(iso2022) \ -}, +}; -BEGIN_CODECS_LIST +BEGIN_CODECS_LIST(7) ISO2022_CODEC(kr) ISO2022_CODEC(jp) ISO2022_CODEC(jp_1) diff --git a/Modules/cjkcodecs/_codecs_jp.c b/Modules/cjkcodecs/_codecs_jp.c index 3a332953b957cb..7a8b78a23592ea 100644 --- a/Modules/cjkcodecs/_codecs_jp.c +++ b/Modules/cjkcodecs/_codecs_jp.c @@ -733,7 +733,7 @@ DECODER(shift_jis_2004) } -BEGIN_MAPPINGS_LIST +BEGIN_MAPPINGS_LIST(11) MAPPING_DECONLY(jisx0208) MAPPING_DECONLY(jisx0212) MAPPING_ENCONLY(jisxcommon) @@ -747,14 +747,19 @@ BEGIN_MAPPINGS_LIST MAPPING_ENCDEC(cp932ext) END_MAPPINGS_LIST -BEGIN_CODECS_LIST +#define CODEC_CUSTOM(NAME, N, METH) \ + NEXT_CODEC = (MultibyteCodec){NAME, (void *)N, NULL, _STATELESS_METHODS(METH)}; + +BEGIN_CODECS_LIST(7) CODEC_STATELESS(shift_jis) CODEC_STATELESS(cp932) CODEC_STATELESS(euc_jp) CODEC_STATELESS(shift_jis_2004) CODEC_STATELESS(euc_jis_2004) - { "euc_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(euc_jis_2004) }, - { "shift_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(shift_jis_2004) }, + CODEC_CUSTOM("euc_jisx0213", 2000, euc_jis_2004) + CODEC_CUSTOM("shift_jisx0213", 2000, shift_jis_2004) END_CODECS_LIST +#undef CODEC_CUSTOM + I_AM_A_MODULE_FOR(jp) diff --git a/Modules/cjkcodecs/_codecs_kr.c b/Modules/cjkcodecs/_codecs_kr.c index 72641e495af0b0..fd9a9fd92db1fd 100644 --- a/Modules/cjkcodecs/_codecs_kr.c +++ b/Modules/cjkcodecs/_codecs_kr.c @@ -453,13 +453,13 @@ DECODER(johab) #undef FILL -BEGIN_MAPPINGS_LIST +BEGIN_MAPPINGS_LIST(3) MAPPING_DECONLY(ksx1001) MAPPING_ENCONLY(cp949) MAPPING_DECONLY(cp949ext) END_MAPPINGS_LIST -BEGIN_CODECS_LIST +BEGIN_CODECS_LIST(3) CODEC_STATELESS(euc_kr) CODEC_STATELESS(cp949) CODEC_STATELESS(johab) diff --git a/Modules/cjkcodecs/_codecs_tw.c b/Modules/cjkcodecs/_codecs_tw.c index 722b26b128a708..3e440991414434 100644 --- a/Modules/cjkcodecs/_codecs_tw.c +++ b/Modules/cjkcodecs/_codecs_tw.c @@ -130,12 +130,12 @@ DECODER(cp950) -BEGIN_MAPPINGS_LIST +BEGIN_MAPPINGS_LIST(2) MAPPING_ENCDEC(big5) MAPPING_ENCDEC(cp950ext) END_MAPPINGS_LIST -BEGIN_CODECS_LIST +BEGIN_CODECS_LIST(2) CODEC_STATELESS(big5) CODEC_STATELESS(cp950) END_CODECS_LIST diff --git a/Modules/cjkcodecs/cjkcodecs.h b/Modules/cjkcodecs/cjkcodecs.h index d9aeec2ff40b08..646a9fd255ce20 100644 --- a/Modules/cjkcodecs/cjkcodecs.h +++ b/Modules/cjkcodecs/cjkcodecs.h @@ -60,8 +60,20 @@ struct pair_encodemap { DBCHAR code; }; -static const MultibyteCodec *codec_list; -static const struct dbcs_map *mapping_list; +typedef struct { + int num_mappings; + int num_codecs; + struct dbcs_map *mapping_list; + MultibyteCodec *codec_list; +} cjkcodecs_module_state; + +static inline cjkcodecs_module_state * +get_module_state(PyObject *mod) +{ + void *state = PyModule_GetState(mod); + assert(state != NULL); + return (cjkcodecs_module_state *)state; +} #define CODEC_INIT(encoding) \ static int encoding##_codec_init(const void *config) @@ -202,16 +214,42 @@ static const struct dbcs_map *mapping_list; #define TRYMAP_DEC(charset, assi, c1, c2) \ _TRYMAP_DEC(&charset##_decmap[c1], assi, c2) -#define BEGIN_MAPPINGS_LIST static const struct dbcs_map _mapping_list[] = { -#define MAPPING_ENCONLY(enc) {#enc, (void*)enc##_encmap, NULL}, -#define MAPPING_DECONLY(enc) {#enc, NULL, (void*)enc##_decmap}, -#define MAPPING_ENCDEC(enc) {#enc, (void*)enc##_encmap, (void*)enc##_decmap}, -#define END_MAPPINGS_LIST \ - {"", NULL, NULL} }; \ - static const struct dbcs_map *mapping_list = \ - (const struct dbcs_map *)_mapping_list; +#define BEGIN_MAPPINGS_LIST(NUM) \ +static int \ +add_mappings(cjkcodecs_module_state *st) \ +{ \ + int idx = 0; \ + (void)idx; \ + st->num_mappings = NUM; \ + st->mapping_list = PyMem_Calloc(NUM, sizeof(struct dbcs_map)); \ + if (st->mapping_list == NULL) { \ + return -1; \ + } + +#define MAPPING_ENCONLY(enc) \ + st->mapping_list[idx++] = (struct dbcs_map){#enc, (void*)enc##_encmap, NULL}; +#define MAPPING_DECONLY(enc) \ + st->mapping_list[idx++] = (struct dbcs_map){#enc, NULL, (void*)enc##_decmap}; +#define MAPPING_ENCDEC(enc) \ + st->mapping_list[idx++] = (struct dbcs_map){#enc, (void*)enc##_encmap, (void*)enc##_decmap}; + +#define END_MAPPINGS_LIST \ + assert(st->num_mappings == idx); \ + return 0; \ +} + +#define BEGIN_CODECS_LIST(NUM) \ +static int \ +add_codecs(cjkcodecs_module_state *st) \ +{ \ + int idx = 0; \ + (void)idx; \ + st->num_codecs = NUM; \ + st->codec_list = PyMem_Calloc(NUM, sizeof(MultibyteCodec)); \ + if (st->codec_list == NULL) { \ + return -1; \ + } -#define BEGIN_CODECS_LIST static const MultibyteCodec _codec_list[] = { #define _STATEFUL_METHODS(enc) \ enc##_encode, \ enc##_encode_init, \ @@ -222,23 +260,21 @@ static const struct dbcs_map *mapping_list; #define _STATELESS_METHODS(enc) \ enc##_encode, NULL, NULL, \ enc##_decode, NULL, NULL, -#define CODEC_STATEFUL(enc) { \ - #enc, NULL, NULL, \ - _STATEFUL_METHODS(enc) \ -}, -#define CODEC_STATELESS(enc) { \ - #enc, NULL, NULL, \ - _STATELESS_METHODS(enc) \ -}, -#define CODEC_STATELESS_WINIT(enc) { \ - #enc, NULL, \ - enc##_codec_init, \ - _STATELESS_METHODS(enc) \ -}, -#define END_CODECS_LIST \ - {"", NULL,} }; \ - static const MultibyteCodec *codec_list = \ - (const MultibyteCodec *)_codec_list; + +#define NEXT_CODEC \ + st->codec_list[idx++] + +#define CODEC_STATEFUL(enc) \ + NEXT_CODEC = (MultibyteCodec){#enc, NULL, NULL, _STATEFUL_METHODS(enc)}; +#define CODEC_STATELESS(enc) \ + NEXT_CODEC = (MultibyteCodec){#enc, NULL, NULL, _STATELESS_METHODS(enc)}; +#define CODEC_STATELESS_WINIT(enc) \ + NEXT_CODEC = (MultibyteCodec){#enc, NULL, enc##_codec_init, _STATELESS_METHODS(enc)}; + +#define END_CODECS_LIST \ + assert(st->num_codecs == idx); \ + return 0; \ +} @@ -249,53 +285,70 @@ getmultibytecodec(void) } static PyObject * -getcodec(PyObject *self, PyObject *encoding) +_getcodec(const MultibyteCodec *codec) { - PyObject *codecobj, *r, *cofunc; - const MultibyteCodec *codec; - const char *enc; - - if (!PyUnicode_Check(encoding)) { - PyErr_SetString(PyExc_TypeError, - "encoding name must be a string."); + PyObject *cofunc = getmultibytecodec(); + if (cofunc == NULL) { return NULL; } - enc = PyUnicode_AsUTF8(encoding); - if (enc == NULL) - return NULL; - cofunc = getmultibytecodec(); - if (cofunc == NULL) + PyObject *codecobj = PyCapsule_New((void *)codec, + PyMultibyteCodec_CAPSULE_NAME, + NULL); + if (codecobj == NULL) { + Py_DECREF(cofunc); return NULL; + } - for (codec = codec_list; codec->encoding[0]; codec++) - if (strcmp(codec->encoding, enc) == 0) - break; + PyObject *res = PyObject_CallOneArg(cofunc, codecobj); + Py_DECREF(codecobj); + Py_DECREF(cofunc); + return res; +} - if (codec->encoding[0] == '\0') { - PyErr_SetString(PyExc_LookupError, - "no such codec is supported."); +static PyObject * +getcodec(PyObject *self, PyObject *encoding) +{ + if (!PyUnicode_Check(encoding)) { + PyErr_SetString(PyExc_TypeError, + "encoding name must be a string."); return NULL; } - - codecobj = PyCapsule_New((void *)codec, PyMultibyteCodec_CAPSULE_NAME, NULL); - if (codecobj == NULL) + const char *enc = PyUnicode_AsUTF8(encoding); + if (enc == NULL) { return NULL; + } - r = PyObject_CallOneArg(cofunc, codecobj); - Py_DECREF(codecobj); - Py_DECREF(cofunc); + cjkcodecs_module_state *st = get_module_state(self); + for (int i = 0; i < st->num_codecs; i++) { + const MultibyteCodec *codec = &st->codec_list[i]; + if (strcmp(codec->encoding, enc) == 0) { + return _getcodec(codec); + } + } - return r; + PyErr_SetString(PyExc_LookupError, + "no such codec is supported."); + return NULL; } +static int add_mappings(cjkcodecs_module_state *); +static int add_codecs(cjkcodecs_module_state *); static int register_maps(PyObject *module) { - const struct dbcs_map *h; + // Init module state. + cjkcodecs_module_state *st = get_module_state(module); + if (add_mappings(st) < 0) { + return -1; + } + if (add_codecs(st) < 0) { + return -1; + } - for (h = mapping_list; h->charset[0] != '\0'; h++) { + for (int i = 0; i < st->num_mappings; i++) { + const struct dbcs_map *h = &st->mapping_list[i]; char mhname[256] = "__map_"; strcpy(mhname + sizeof("__map_") - 1, h->charset); @@ -394,6 +447,13 @@ _cjk_exec(PyObject *module) return register_maps(module); } +static void +_cjk_free(void *mod) +{ + cjkcodecs_module_state *st = get_module_state((PyObject *)mod); + PyMem_Free(st->mapping_list); + PyMem_Free(st->codec_list); +} static struct PyMethodDef _cjk_methods[] = { {"getcodec", (PyCFunction)getcodec, METH_O, ""}, @@ -409,9 +469,10 @@ static PyModuleDef_Slot _cjk_slots[] = { static struct PyModuleDef _cjk_module = { \ PyModuleDef_HEAD_INIT, \ .m_name = "_codecs_"#loc, \ - .m_size = 0, \ + .m_size = sizeof(cjkcodecs_module_state), \ .m_methods = _cjk_methods, \ .m_slots = _cjk_slots, \ + .m_free = _cjk_free, \ }; \ \ PyMODINIT_FUNC \ diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 8564494f6262fb..55778cdb59e4dc 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -19,26 +19,27 @@ typedef struct { PyTypeObject *writer_type; PyTypeObject *multibytecodec_type; PyObject *str_write; -} _multibytecodec_state; +} module_state; -static _multibytecodec_state * -_multibytecodec_get_state(PyObject *module) +static module_state * +get_module_state(PyObject *module) { - _multibytecodec_state *state = PyModule_GetState(module); + module_state *state = PyModule_GetState(module); assert(state != NULL); return state; } static struct PyModuleDef _multibytecodecmodule; -static _multibytecodec_state * -_multibyte_codec_find_state_by_type(PyTypeObject *type) + +static module_state * +find_state_by_def(PyTypeObject *type) { PyObject *module = PyType_GetModuleByDef(type, &_multibytecodecmodule); assert(module != NULL); - return _multibytecodec_get_state(module); + return get_module_state(module); } -#define clinic_get_state() _multibyte_codec_find_state_by_type(type) +#define clinic_get_state() find_state_by_def(type) /*[clinic input] module _multibytecodec class _multibytecodec.MultibyteCodec "MultibyteCodecObject *" "clinic_get_state()->multibytecodec_type" @@ -1040,7 +1041,7 @@ mbiencoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (codec == NULL) goto errorexit; - _multibytecodec_state *state = _multibyte_codec_find_state_by_type(type); + module_state *state = find_state_by_def(type); if (!MultibyteCodec_Check(state, codec)) { PyErr_SetString(PyExc_TypeError, "codec is unexpected type"); goto errorexit; @@ -1315,7 +1316,7 @@ mbidecoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (codec == NULL) goto errorexit; - _multibytecodec_state *state = _multibyte_codec_find_state_by_type(type); + module_state *state = find_state_by_def(type); if (!MultibyteCodec_Check(state, codec)) { PyErr_SetString(PyExc_TypeError, "codec is unexpected type"); goto errorexit; @@ -1630,7 +1631,7 @@ mbstreamreader_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (codec == NULL) goto errorexit; - _multibytecodec_state *state = _multibyte_codec_find_state_by_type(type); + module_state *state = find_state_by_def(type); if (!MultibyteCodec_Check(state, codec)) { PyErr_SetString(PyExc_TypeError, "codec is unexpected type"); goto errorexit; @@ -1735,7 +1736,7 @@ _multibytecodec_MultibyteStreamWriter_write_impl(MultibyteStreamWriterObject *se PyObject *strobj) /*[clinic end generated code: output=68ade3aea26410ac input=199f26f68bd8425a]*/ { - _multibytecodec_state *state = PyType_GetModuleState(cls); + module_state *state = PyType_GetModuleState(cls); assert(state != NULL); if (mbstreamwriter_iwrite(self, strobj, state->str_write)) { return NULL; @@ -1766,7 +1767,7 @@ _multibytecodec_MultibyteStreamWriter_writelines_impl(MultibyteStreamWriterObjec return NULL; } - _multibytecodec_state *state = PyType_GetModuleState(cls); + module_state *state = PyType_GetModuleState(cls); assert(state != NULL); for (i = 0; i < PySequence_Length(lines); i++) { /* length can be changed even within this loop */ @@ -1817,7 +1818,7 @@ _multibytecodec_MultibyteStreamWriter_reset_impl(MultibyteStreamWriterObject *se assert(PyBytes_Check(pwrt)); - _multibytecodec_state *state = PyType_GetModuleState(cls); + module_state *state = PyType_GetModuleState(cls); assert(state != NULL); if (PyBytes_Size(pwrt) > 0) { @@ -1853,7 +1854,7 @@ mbstreamwriter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (codec == NULL) goto errorexit; - _multibytecodec_state *state = _multibyte_codec_find_state_by_type(type); + module_state *state = find_state_by_def(type); if (!MultibyteCodec_Check(state, codec)) { PyErr_SetString(PyExc_TypeError, "codec is unexpected type"); goto errorexit; @@ -1963,7 +1964,7 @@ _multibytecodec___create_codec(PyObject *module, PyObject *arg) if (codec->codecinit != NULL && codec->codecinit(codec->config) != 0) return NULL; - _multibytecodec_state *state = _multibytecodec_get_state(module); + module_state *state = get_module_state(module); self = PyObject_GC_New(MultibyteCodecObject, state->multibytecodec_type); if (self == NULL) return NULL; @@ -1976,7 +1977,7 @@ _multibytecodec___create_codec(PyObject *module, PyObject *arg) static int _multibytecodec_traverse(PyObject *mod, visitproc visit, void *arg) { - _multibytecodec_state *state = _multibytecodec_get_state(mod); + module_state *state = get_module_state(mod); Py_VISIT(state->multibytecodec_type); Py_VISIT(state->encoder_type); Py_VISIT(state->decoder_type); @@ -1988,7 +1989,7 @@ _multibytecodec_traverse(PyObject *mod, visitproc visit, void *arg) static int _multibytecodec_clear(PyObject *mod) { - _multibytecodec_state *state = _multibytecodec_get_state(mod); + module_state *state = get_module_state(mod); Py_CLEAR(state->multibytecodec_type); Py_CLEAR(state->encoder_type); Py_CLEAR(state->decoder_type); @@ -2022,7 +2023,7 @@ _multibytecodec_free(void *mod) static int _multibytecodec_exec(PyObject *mod) { - _multibytecodec_state *state = _multibytecodec_get_state(mod); + module_state *state = get_module_state(mod); state->str_write = PyUnicode_InternFromString("write"); if (state->str_write == NULL) { return -1; @@ -2056,7 +2057,7 @@ static PyModuleDef_Slot _multibytecodec_slots[] = { static struct PyModuleDef _multibytecodecmodule = { .m_base = PyModuleDef_HEAD_INIT, .m_name = "_multibytecodec", - .m_size = sizeof(_multibytecodec_state), + .m_size = sizeof(module_state), .m_methods = _multibytecodec_methods, .m_slots = _multibytecodec_slots, .m_traverse = _multibytecodec_traverse, diff --git a/Tools/c-analyzer/cpython/globals-to-fix.tsv b/Tools/c-analyzer/cpython/globals-to-fix.tsv index 5c173b1041e3e4..849fd5d9a1e8d5 100644 --- a/Tools/c-analyzer/cpython/globals-to-fix.tsv +++ b/Tools/c-analyzer/cpython/globals-to-fix.tsv @@ -506,8 +506,6 @@ Modules/cjkcodecs/_codecs_iso2022.c jisx0208_init initialized - Modules/cjkcodecs/_codecs_iso2022.c jisx0212_init initialized - Modules/cjkcodecs/_codecs_iso2022.c jisx0213_init initialized - Modules/cjkcodecs/_codecs_iso2022.c gb2312_init initialized - -Modules/cjkcodecs/cjkcodecs.h - codec_list - -Modules/cjkcodecs/cjkcodecs.h - mapping_list - Modules/readline.c - libedit_append_replace_history_offset - Modules/readline.c - using_libedit_emulation - Modules/readline.c - libedit_history_start - From 76933df10afc958b2db2a6bcff7509285fbf5fcf Mon Sep 17 00:00:00 2001 From: Ezio Melotti Date: Mon, 17 Apr 2023 11:26:22 +0800 Subject: [PATCH 189/349] Remove `expert-*` from `project-updater` GH workflow (#103579) --- .github/workflows/project-updater.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/project-updater.yml b/.github/workflows/project-updater.yml index dde923b26c2a71..7574bfc208ff76 100644 --- a/.github/workflows/project-updater.yml +++ b/.github/workflows/project-updater.yml @@ -20,8 +20,6 @@ jobs: # if an issue has any of these labels, it will be added # to the corresponding project - { project: 2, label: "release-blocker, deferred-blocker" } - - { project: 3, label: expert-subinterpreters } - - { project: 29, label: expert-asyncio } - { project: 32, label: sprint } steps: From 5d9762e7cf90444b03b43262be8001ff83401aac Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Mon, 17 Apr 2023 23:14:18 +0900 Subject: [PATCH 190/349] gh-101525: Fix make test if the --enable-bolt enabled (gh-103574) --- Makefile.pre.in | 20 +++++---- configure | 108 ++++++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 7 ++++ 3 files changed, 128 insertions(+), 7 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index a58397f21f9bb2..582310807d05ba 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -38,6 +38,7 @@ CC= @CC@ CXX= @CXX@ LINKCC= @LINKCC@ AR= @AR@ +READELF= @READELF@ SOABI= @SOABI@ LDVERSION= @LDVERSION@ LIBPYTHON= @LIBPYTHON@ @@ -670,13 +671,18 @@ profile-opt: profile-run-stamp bolt-opt: @PREBOLT_RULE@ rm -f *.fdata - @LLVM_BOLT@ ./$(BUILDPYTHON) -instrument -instrumentation-file-append-pid -instrumentation-file=$(abspath $(BUILDPYTHON).bolt) -o $(BUILDPYTHON).bolt_inst - ./$(BUILDPYTHON).bolt_inst $(PROFILE_TASK) || true - @MERGE_FDATA@ $(BUILDPYTHON).*.fdata > $(BUILDPYTHON).fdata - @LLVM_BOLT@ ./$(BUILDPYTHON) -o $(BUILDPYTHON).bolt -data=$(BUILDPYTHON).fdata -update-debug-sections -reorder-blocks=ext-tsp -reorder-functions=hfsort+ -split-functions -icf=1 -inline-all -split-eh -reorder-functions-use-hot-size -peepholes=none -jump-tables=aggressive -inline-ap -indirect-call-promotion=all -dyno-stats -use-gnu-stack -frame-opt=hot - rm -f *.fdata - rm -f $(BUILDPYTHON).bolt_inst - mv $(BUILDPYTHON).bolt $(BUILDPYTHON) + @if $(READELF) -p .note.bolt_info $(BUILDPYTHON) | grep BOLT > /dev/null; then\ + echo "skip: $(BUILDPYTHON) is already BOLTed."; \ + else \ + @LLVM_BOLT@ ./$(BUILDPYTHON) -instrument -instrumentation-file-append-pid -instrumentation-file=$(abspath $(BUILDPYTHON).bolt) -o $(BUILDPYTHON).bolt_inst; \ + ./$(BUILDPYTHON).bolt_inst $(PROFILE_TASK) || true; \ + @MERGE_FDATA@ $(BUILDPYTHON).*.fdata > $(BUILDPYTHON).fdata; \ + @LLVM_BOLT@ ./$(BUILDPYTHON) -o $(BUILDPYTHON).bolt -data=$(BUILDPYTHON).fdata -update-debug-sections -reorder-blocks=ext-tsp -reorder-functions=hfsort+ -split-functions -icf=1 -inline-all -split-eh -reorder-functions-use-hot-size -peepholes=none -jump-tables=aggressive -inline-ap -indirect-call-promotion=all -dyno-stats -use-gnu-stack -frame-opt=hot; \ + rm -f *.fdata; \ + rm -f $(BUILDPYTHON).bolt_inst; \ + mv $(BUILDPYTHON).bolt $(BUILDPYTHON); \ + fi + # Compile and run with gcov .PHONY=coverage coverage-lcov coverage-report diff --git a/configure b/configure index 4ae8258438e620..8133d47f61355b 100755 --- a/configure +++ b/configure @@ -892,6 +892,8 @@ PGO_PROF_USE_FLAG PGO_PROF_GEN_FLAG MERGE_FDATA LLVM_BOLT +ac_ct_READELF +READELF PREBOLT_RULE LLVM_AR_FOUND LLVM_AR @@ -7916,6 +7918,112 @@ if test "$Py_BOLT" = 'true' ; then DEF_MAKE_ALL_RULE="bolt-opt" DEF_MAKE_RULE="build_all" + + if test -n "$ac_tool_prefix"; then + for ac_prog in readelf + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; 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_prog_READELF+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$READELF"; then + ac_cv_prog_READELF="$READELF" # Let the user override the test. +else +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_prog_READELF="$ac_tool_prefix$ac_prog" + $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 + +fi +fi +READELF=$ac_cv_prog_READELF +if test -n "$READELF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READELF" >&5 +$as_echo "$READELF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$READELF" && break + done +fi +if test -z "$READELF"; then + ac_ct_READELF=$READELF + for ac_prog in readelf +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; 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_prog_ac_ct_READELF+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_READELF"; then + ac_cv_prog_ac_ct_READELF="$ac_ct_READELF" # Let the user override the test. +else +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_prog_ac_ct_READELF="$ac_prog" + $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 + +fi +fi +ac_ct_READELF=$ac_cv_prog_ac_ct_READELF +if test -n "$ac_ct_READELF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_READELF" >&5 +$as_echo "$ac_ct_READELF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_READELF" && break +done + + if test "x$ac_ct_READELF" = x; then + READELF=""notfound"" + 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 + READELF=$ac_ct_READELF + fi +fi + + if test "$READELF" == "notfound" + then + as_fn_error $? "readelf is required for a --enable-bolt build but could not be found." "$LINENO" 5 + fi + # -fno-reorder-blocks-and-partition is required for bolt to work. # Possibly GCC only. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fno-reorder-blocks-and-partition" >&5 diff --git a/configure.ac b/configure.ac index 4d9eb46f5ce7d8..3f20d8980d8abc 100644 --- a/configure.ac +++ b/configure.ac @@ -1938,6 +1938,13 @@ if test "$Py_BOLT" = 'true' ; then DEF_MAKE_ALL_RULE="bolt-opt" DEF_MAKE_RULE="build_all" + AC_SUBST(READELF) + AC_CHECK_TOOLS(READELF, [readelf], "notfound") + if test "$READELF" == "notfound" + then + AC_MSG_ERROR([readelf is required for a --enable-bolt build but could not be found.]) + fi + # -fno-reorder-blocks-and-partition is required for bolt to work. # Possibly GCC only. AX_CHECK_COMPILE_FLAG([-fno-reorder-blocks-and-partition],[ From eb5fd31948e2e379635e17545c18c9ef5d06d3e7 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Mon, 17 Apr 2023 17:33:54 +0100 Subject: [PATCH 191/349] gh-103088: Ensure POSIX venv scripts always use LF line endings (GH-103591) Also touches the affected files in meaningless ways to ensure they get updated when pulling --- .gitattributes | 1 + Lib/venv/scripts/common/activate | 2 +- Lib/venv/scripts/posix/activate.csh | 1 + Lib/venv/scripts/posix/activate.fish | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitattributes b/.gitattributes index cb1cf8bcc7c877..4ed95069442f3d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -34,6 +34,7 @@ Lib/test/xmltestdata/* noeol # Shell scripts should have LF even on Windows because of Cygwin Lib/venv/scripts/common/activate text eol=lf +Lib/venv/scripts/posix/* text eol=lf # CRLF files [attr]dos text eol=crlf diff --git a/Lib/venv/scripts/common/activate b/Lib/venv/scripts/common/activate index cb898b39670c47..408df5cb93b9e9 100644 --- a/Lib/venv/scripts/common/activate +++ b/Lib/venv/scripts/common/activate @@ -1,5 +1,5 @@ # This file must be used with "source bin/activate" *from bash* -# you cannot run it directly +# You cannot run it directly deactivate () { # reset old environment variables diff --git a/Lib/venv/scripts/posix/activate.csh b/Lib/venv/scripts/posix/activate.csh index d6f697c55ed81c..5e8d66fa9e5061 100644 --- a/Lib/venv/scripts/posix/activate.csh +++ b/Lib/venv/scripts/posix/activate.csh @@ -1,5 +1,6 @@ # This file must be used with "source bin/activate.csh" *from csh*. # You cannot run it directly. + # Created by Davide Di Blasi . # Ported to Python 3.3 venv by Andrew Svetlov diff --git a/Lib/venv/scripts/posix/activate.fish b/Lib/venv/scripts/posix/activate.fish index 9aa4446005f4d8..91ad6442e05692 100644 --- a/Lib/venv/scripts/posix/activate.fish +++ b/Lib/venv/scripts/posix/activate.fish @@ -1,5 +1,5 @@ # This file must be used with "source /bin/activate.fish" *from fish* -# (https://fishshell.com/); you cannot run it directly. +# (https://fishshell.com/). You cannot run it directly. function deactivate -d "Exit virtual environment and return to normal shell environment" # reset old environment variables From d83faf7f1ba2de95e98e3eeb5ce9009d9cd62192 Mon Sep 17 00:00:00 2001 From: AN Long Date: Tue, 18 Apr 2023 02:30:48 +0800 Subject: [PATCH 192/349] gh-103092: Isolate winreg (#103250) --- Lib/test/test_winreg.py | 16 +- ...-04-08-00-48-40.gh-issue-103092.5EFts0.rst | 1 + Objects/object.c | 6 - PC/clinic/winreg.c.h | 54 ++-- PC/winreg.c | 271 ++++++++++-------- 5 files changed, 196 insertions(+), 152 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-08-00-48-40.gh-issue-103092.5EFts0.rst diff --git a/Lib/test/test_winreg.py b/Lib/test/test_winreg.py index 769ab67b0f5611..924a962781a75b 100644 --- a/Lib/test/test_winreg.py +++ b/Lib/test/test_winreg.py @@ -1,11 +1,12 @@ # Test the windows specific win32reg module. # Only win32reg functions not hit here: FlushKey, LoadKey and SaveKey +import gc import os, sys, errno -import unittest -from test.support import import_helper import threading +import unittest from platform import machine, win32_edition +from test.support import cpython_only, import_helper # Do this first so test will be skipped if module doesn't exist import_helper.import_module('winreg', required_on=['win']) @@ -49,6 +50,17 @@ ("Japanese 日本", "日本語", REG_SZ), ] + +@cpython_only +class HeapTypeTests(unittest.TestCase): + def test_have_gc(self): + self.assertTrue(gc.is_tracked(HKEYType)) + + def test_immutable(self): + with self.assertRaisesRegex(TypeError, "immutable"): + HKEYType.foo = "bar" + + class BaseWinregTests(unittest.TestCase): def setUp(self): diff --git a/Misc/NEWS.d/next/Library/2023-04-08-00-48-40.gh-issue-103092.5EFts0.rst b/Misc/NEWS.d/next/Library/2023-04-08-00-48-40.gh-issue-103092.5EFts0.rst new file mode 100644 index 00000000000000..0f2108fee763d0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-08-00-48-40.gh-issue-103092.5EFts0.rst @@ -0,0 +1 @@ +Adapt the :mod:`winreg` extension module to :pep:`687`. diff --git a/Objects/object.c b/Objects/object.c index 56747fa193e178..e26f737fccd60f 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1965,9 +1965,6 @@ PyObject _Py_NotImplementedStruct = { 1, &_PyNotImplemented_Type }; -#ifdef MS_WINDOWS -extern PyTypeObject PyHKEY_Type; -#endif extern PyTypeObject _Py_GenericAliasIterType; extern PyTypeObject _PyMemoryIter_Type; extern PyTypeObject _PyLineIterator; @@ -2018,9 +2015,6 @@ static PyTypeObject* static_types[] = { &PyFunction_Type, &PyGen_Type, &PyGetSetDescr_Type, -#ifdef MS_WINDOWS - &PyHKEY_Type, -#endif &PyInstanceMethod_Type, &PyListIter_Type, &PyListRevIter_Type, diff --git a/PC/clinic/winreg.c.h b/PC/clinic/winreg.c.h index 7a9474301da8a1..4109c85276f0a4 100644 --- a/PC/clinic/winreg.c.h +++ b/PC/clinic/winreg.c.h @@ -219,14 +219,14 @@ winreg_ConnectRegistry(PyObject *module, PyObject *const *args, Py_ssize_t nargs _PyArg_BadArgument("ConnectRegistry", "argument 1", "str or None", args[0]); goto exit; } - if (!clinic_HKEY_converter(args[1], &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), args[1], &key)) { goto exit; } _return_value = winreg_ConnectRegistry_impl(module, computer_name, key); if (_return_value == NULL) { goto exit; } - return_value = PyHKEY_FromHKEY(_return_value); + return_value = PyHKEY_FromHKEY(_PyModule_GetState(module), _return_value); exit: /* Cleanup for computer_name */ @@ -275,7 +275,7 @@ winreg_CreateKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("CreateKey", nargs, 2, 2)) { goto exit; } - if (!clinic_HKEY_converter(args[0], &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), args[0], &key)) { goto exit; } if (args[1] == Py_None) { @@ -295,7 +295,7 @@ winreg_CreateKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (_return_value == NULL) { goto exit; } - return_value = PyHKEY_FromHKEY(_return_value); + return_value = PyHKEY_FromHKEY(_PyModule_GetState(module), _return_value); exit: /* Cleanup for sub_key */ @@ -382,7 +382,7 @@ winreg_CreateKeyEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs, Py if (!args) { goto exit; } - if (!clinic_HKEY_converter(args[0], &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), args[0], &key)) { goto exit; } if (args[1] == Py_None) { @@ -419,7 +419,7 @@ winreg_CreateKeyEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs, Py if (_return_value == NULL) { goto exit; } - return_value = PyHKEY_FromHKEY(_return_value); + return_value = PyHKEY_FromHKEY(_PyModule_GetState(module), _return_value); exit: /* Cleanup for sub_key */ @@ -466,7 +466,7 @@ winreg_DeleteKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("DeleteKey", nargs, 2, 2)) { goto exit; } - if (!clinic_HKEY_converter(args[0], &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), args[0], &key)) { goto exit; } if (!PyUnicode_Check(args[1])) { @@ -566,7 +566,7 @@ winreg_DeleteKeyEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs, Py if (!args) { goto exit; } - if (!clinic_HKEY_converter(args[0], &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), args[0], &key)) { goto exit; } if (!PyUnicode_Check(args[1])) { @@ -634,7 +634,7 @@ winreg_DeleteValue(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("DeleteValue", nargs, 2, 2)) { goto exit; } - if (!clinic_HKEY_converter(args[0], &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), args[0], &key)) { goto exit; } if (args[1] == Py_None) { @@ -694,7 +694,7 @@ winreg_EnumKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("EnumKey", nargs, 2, 2)) { goto exit; } - if (!clinic_HKEY_converter(args[0], &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), args[0], &key)) { goto exit; } index = _PyLong_AsInt(args[1]); @@ -751,7 +751,7 @@ winreg_EnumValue(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("EnumValue", nargs, 2, 2)) { goto exit; } - if (!clinic_HKEY_converter(args[0], &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), args[0], &key)) { goto exit; } index = _PyLong_AsInt(args[1]); @@ -839,7 +839,7 @@ winreg_FlushKey(PyObject *module, PyObject *arg) PyObject *return_value = NULL; HKEY key; - if (!clinic_HKEY_converter(arg, &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), arg, &key)) { goto exit; } return_value = winreg_FlushKey_impl(module, key); @@ -898,7 +898,7 @@ winreg_LoadKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("LoadKey", nargs, 3, 3)) { goto exit; } - if (!clinic_HKEY_converter(args[0], &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), args[0], &key)) { goto exit; } if (!PyUnicode_Check(args[1])) { @@ -999,7 +999,7 @@ winreg_OpenKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje if (!args) { goto exit; } - if (!clinic_HKEY_converter(args[0], &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), args[0], &key)) { goto exit; } if (args[1] == Py_None) { @@ -1036,7 +1036,7 @@ winreg_OpenKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje if (_return_value == NULL) { goto exit; } - return_value = PyHKEY_FromHKEY(_return_value); + return_value = PyHKEY_FromHKEY(_PyModule_GetState(module), _return_value); exit: /* Cleanup for sub_key */ @@ -1116,7 +1116,7 @@ winreg_OpenKeyEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb if (!args) { goto exit; } - if (!clinic_HKEY_converter(args[0], &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), args[0], &key)) { goto exit; } if (args[1] == Py_None) { @@ -1153,7 +1153,7 @@ winreg_OpenKeyEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb if (_return_value == NULL) { goto exit; } - return_value = PyHKEY_FromHKEY(_return_value); + return_value = PyHKEY_FromHKEY(_PyModule_GetState(module), _return_value); exit: /* Cleanup for sub_key */ @@ -1193,7 +1193,7 @@ winreg_QueryInfoKey(PyObject *module, PyObject *arg) PyObject *return_value = NULL; HKEY key; - if (!clinic_HKEY_converter(arg, &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), arg, &key)) { goto exit; } return_value = winreg_QueryInfoKey_impl(module, key); @@ -1242,7 +1242,7 @@ winreg_QueryValue(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("QueryValue", nargs, 2, 2)) { goto exit; } - if (!clinic_HKEY_converter(args[0], &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), args[0], &key)) { goto exit; } if (args[1] == Py_None) { @@ -1303,7 +1303,7 @@ winreg_QueryValueEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("QueryValueEx", nargs, 2, 2)) { goto exit; } - if (!clinic_HKEY_converter(args[0], &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), args[0], &key)) { goto exit; } if (args[1] == Py_None) { @@ -1369,7 +1369,7 @@ winreg_SaveKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("SaveKey", nargs, 2, 2)) { goto exit; } - if (!clinic_HKEY_converter(args[0], &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), args[0], &key)) { goto exit; } if (!PyUnicode_Check(args[1])) { @@ -1438,7 +1438,7 @@ winreg_SetValue(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("SetValue", nargs, 4, 4)) { goto exit; } - if (!clinic_HKEY_converter(args[0], &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), args[0], &key)) { goto exit; } if (args[1] == Py_None) { @@ -1542,7 +1542,7 @@ winreg_SetValueEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("SetValueEx", nargs, 5, 5)) { goto exit; } - if (!clinic_HKEY_converter(args[0], &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), args[0], &key)) { goto exit; } if (args[1] == Py_None) { @@ -1603,7 +1603,7 @@ winreg_DisableReflectionKey(PyObject *module, PyObject *arg) PyObject *return_value = NULL; HKEY key; - if (!clinic_HKEY_converter(arg, &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), arg, &key)) { goto exit; } return_value = winreg_DisableReflectionKey_impl(module, key); @@ -1641,7 +1641,7 @@ winreg_EnableReflectionKey(PyObject *module, PyObject *arg) PyObject *return_value = NULL; HKEY key; - if (!clinic_HKEY_converter(arg, &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), arg, &key)) { goto exit; } return_value = winreg_EnableReflectionKey_impl(module, key); @@ -1677,7 +1677,7 @@ winreg_QueryReflectionKey(PyObject *module, PyObject *arg) PyObject *return_value = NULL; HKEY key; - if (!clinic_HKEY_converter(arg, &key)) { + if (!clinic_HKEY_converter(_PyModule_GetState(module), arg, &key)) { goto exit; } return_value = winreg_QueryReflectionKey_impl(module, key); @@ -1795,4 +1795,4 @@ winreg_QueryReflectionKey(PyObject *module, PyObject *arg) #ifndef WINREG_QUERYREFLECTIONKEY_METHODDEF #define WINREG_QUERYREFLECTIONKEY_METHODDEF #endif /* !defined(WINREG_QUERYREFLECTIONKEY_METHODDEF) */ -/*[clinic end generated code: output=715db416dc1321ee input=a9049054013a1b77]*/ +/*[clinic end generated code: output=15dc2e6c4d4e2ad5 input=a9049054013a1b77]*/ diff --git a/PC/winreg.c b/PC/winreg.c index 15d32e7fcb99c9..4884125c3609ad 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -15,15 +15,22 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" #include "pycore_object.h" // _PyObject_Init() +#include "pycore_moduleobject.h" #include "structmember.h" // PyMemberDef #include #if defined(MS_WINDOWS_DESKTOP) || defined(MS_WINDOWS_SYSTEM) || defined(MS_WINDOWS_GAMES) -static BOOL PyHKEY_AsHKEY(PyObject *ob, HKEY *pRes, BOOL bNoneOK); -static BOOL clinic_HKEY_converter(PyObject *ob, void *p); -static PyObject *PyHKEY_FromHKEY(HKEY h); -static BOOL PyHKEY_Close(PyObject *obHandle); +typedef struct { + PyTypeObject *PyHKEY_Type; +} winreg_state; + +/* Forward declares */ + +static BOOL PyHKEY_AsHKEY(winreg_state *st, PyObject *ob, HKEY *pRes, BOOL bNoneOK); +static BOOL clinic_HKEY_converter(winreg_state *st, PyObject *ob, void *p); +static PyObject *PyHKEY_FromHKEY(winreg_state *st, HKEY h); +static BOOL PyHKEY_Close(winreg_state *st, PyObject *obHandle); static char errNotAHandle[] = "Object is not a handle"; @@ -35,8 +42,6 @@ static char errNotAHandle[] = "Object is not a handle"; #define PyErr_SetFromWindowsErrWithFunction(rc, fnname) \ PyErr_SetFromWindowsErr(rc) -/* Forward declares */ - /* Doc strings */ PyDoc_STRVAR(module_doc, "This module provides access to the Windows registry API.\n" @@ -114,7 +119,7 @@ typedef struct { HKEY hkey; } PyHKEYObject; -#define PyHKEY_Check(op) Py_IS_TYPE(op, &PyHKEY_Type) +#define PyHKEY_Check(st, op) Py_IS_TYPE(op, st->PyHKEY_Type) static char *failMsg = "bad operand type"; @@ -147,7 +152,18 @@ PyHKEY_deallocFunc(PyObject *ob) PyHKEYObject *obkey = (PyHKEYObject *)ob; if (obkey->hkey) RegCloseKey((HKEY)obkey->hkey); - PyObject_Free(ob); + + PyTypeObject *tp = Py_TYPE(ob); + PyObject_GC_UnTrack(ob); + PyObject_GC_Del(ob); + Py_DECREF(tp); +} + +static int +PyHKEY_traverseFunc(PyHKEYObject *self, visitproc visit, void *arg) +{ + Py_VISIT(Py_TYPE(self)); + return 0; } static int @@ -189,29 +205,6 @@ PyHKEY_hashFunc(PyObject *ob) } -static PyNumberMethods PyHKEY_NumberMethods = -{ - PyHKEY_binaryFailureFunc, /* nb_add */ - PyHKEY_binaryFailureFunc, /* nb_subtract */ - PyHKEY_binaryFailureFunc, /* nb_multiply */ - PyHKEY_binaryFailureFunc, /* nb_remainder */ - PyHKEY_binaryFailureFunc, /* nb_divmod */ - PyHKEY_ternaryFailureFunc, /* nb_power */ - PyHKEY_unaryFailureFunc, /* nb_negative */ - PyHKEY_unaryFailureFunc, /* nb_positive */ - PyHKEY_unaryFailureFunc, /* nb_absolute */ - PyHKEY_boolFunc, /* nb_bool */ - PyHKEY_unaryFailureFunc, /* nb_invert */ - PyHKEY_binaryFailureFunc, /* nb_lshift */ - PyHKEY_binaryFailureFunc, /* nb_rshift */ - PyHKEY_binaryFailureFunc, /* nb_and */ - PyHKEY_binaryFailureFunc, /* nb_xor */ - PyHKEY_binaryFailureFunc, /* nb_or */ - PyHKEY_intFunc, /* nb_int */ - 0, /* nb_reserved */ - PyHKEY_unaryFailureFunc, /* nb_float */ -}; - /*[clinic input] module winreg class winreg.HKEYType "PyHKEYObject *" "&PyHKEY_Type" @@ -229,6 +222,14 @@ class HKEY_converter(CConverter): type = 'HKEY' converter = 'clinic_HKEY_converter' + def parse_arg(self, argname, displayname): + return """ + if (!{converter}(_PyModule_GetState(module), {argname}, &{paramname})) {{{{ + goto exit; + }}}} + """.format(argname=argname, paramname=self.parser_name, + converter=self.converter) + class HKEY_return_converter(CReturnConverter): type = 'HKEY' @@ -236,7 +237,7 @@ class HKEY_return_converter(CReturnConverter): self.declare(data) self.err_occurred_if_null_pointer("_return_value", data) data.return_conversion.append( - 'return_value = PyHKEY_FromHKEY(_return_value);\n') + 'return_value = PyHKEY_FromHKEY(_PyModule_GetState(module), _return_value);\n') # HACK: this only works for PyHKEYObjects, nothing else. # Should this be generalized and enshrined in clinic.py, @@ -249,7 +250,7 @@ class self_return_converter(CReturnConverter): data.return_conversion.append( 'return_value = (PyObject *)_return_value;\n') [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=2ebb7a4922d408d6]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=17e645060c7b8ae1]*/ #include "clinic/winreg.c.h" @@ -270,8 +271,11 @@ static PyObject * winreg_HKEYType_Close_impl(PyHKEYObject *self) /*[clinic end generated code: output=fced3a624fb0c344 input=6786ac75f6b89de6]*/ { - if (!PyHKEY_Close((PyObject *)self)) + winreg_state *st = _PyType_GetModuleState(Py_TYPE(self)); + assert(st != NULL); + if (!PyHKEY_Close(st, (PyObject *)self)) { return NULL; + } Py_RETURN_NONE; } @@ -327,8 +331,11 @@ winreg_HKEYType___exit___impl(PyHKEYObject *self, PyObject *exc_type, PyObject *exc_value, PyObject *traceback) /*[clinic end generated code: output=923ebe7389e6a263 input=fb32489ee92403c7]*/ { - if (!PyHKEY_Close((PyObject *)self)) + winreg_state *st = _PyType_GetModuleState(Py_TYPE(self)); + assert(st != NULL); + if (!PyHKEY_Close(st, (PyObject *)self)) { return NULL; + } Py_RETURN_NONE; } @@ -350,62 +357,71 @@ static PyMemberDef PyHKEY_memberlist[] = { {NULL} /* Sentinel */ }; -/* The type itself */ -PyTypeObject PyHKEY_Type = -{ - PyVarObject_HEAD_INIT(0, 0) /* fill in type at module init */ - "PyHKEY", - sizeof(PyHKEYObject), - 0, - PyHKEY_deallocFunc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - &PyHKEY_NumberMethods, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - PyHKEY_hashFunc, /* tp_hash */ - 0, /* tp_call */ - PyHKEY_strFunc, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - 0, /* tp_flags */ - PyHKEY_doc, /* tp_doc */ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - PyHKEY_methods, /*tp_methods*/ - PyHKEY_memberlist, /*tp_members*/ +static PyType_Slot pyhkey_type_slots[] = { + {Py_tp_dealloc, PyHKEY_deallocFunc}, + {Py_tp_members, PyHKEY_memberlist}, + {Py_tp_methods, PyHKEY_methods}, + {Py_tp_doc, (char *)PyHKEY_doc}, + {Py_tp_traverse, PyHKEY_traverseFunc}, + {Py_tp_hash, PyHKEY_hashFunc}, + {Py_tp_str, PyHKEY_strFunc}, + + // Number protocol + {Py_nb_add, PyHKEY_binaryFailureFunc}, + {Py_nb_subtract, PyHKEY_binaryFailureFunc}, + {Py_nb_multiply, PyHKEY_binaryFailureFunc}, + {Py_nb_remainder, PyHKEY_binaryFailureFunc}, + {Py_nb_divmod, PyHKEY_binaryFailureFunc}, + {Py_nb_power, PyHKEY_ternaryFailureFunc}, + {Py_nb_negative, PyHKEY_unaryFailureFunc}, + {Py_nb_positive, PyHKEY_unaryFailureFunc}, + {Py_nb_absolute, PyHKEY_unaryFailureFunc}, + {Py_nb_bool, PyHKEY_boolFunc}, + {Py_nb_invert, PyHKEY_unaryFailureFunc}, + {Py_nb_lshift, PyHKEY_binaryFailureFunc}, + {Py_nb_rshift, PyHKEY_binaryFailureFunc}, + {Py_nb_and, PyHKEY_binaryFailureFunc}, + {Py_nb_xor, PyHKEY_binaryFailureFunc}, + {Py_nb_or, PyHKEY_binaryFailureFunc}, + {Py_nb_int, PyHKEY_intFunc}, + {Py_nb_float, PyHKEY_unaryFailureFunc}, + {0, NULL}, +}; + +static PyType_Spec pyhkey_type_spec = { + .name = "winreg.PyHKEY", + .basicsize = sizeof(PyHKEYObject), + .flags = (Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE | + Py_TPFLAGS_DISALLOW_INSTANTIATION), + .slots = pyhkey_type_slots, }; /************************************************************************ The public PyHKEY API (well, not public yet :-) ************************************************************************/ PyObject * -PyHKEY_New(HKEY hInit) +PyHKEY_New(PyObject *m, HKEY hInit) { - PyHKEYObject *key = PyObject_New(PyHKEYObject, &PyHKEY_Type); - if (key) - key->hkey = hInit; + winreg_state *st = _PyModule_GetState(m); + PyHKEYObject *key = PyObject_GC_New(PyHKEYObject, st->PyHKEY_Type); + if (key == NULL) { + return NULL; + } + key->hkey = hInit; + PyObject_GC_Track(key); return (PyObject *)key; } BOOL -PyHKEY_Close(PyObject *ob_handle) +PyHKEY_Close(winreg_state *st, PyObject *ob_handle) { LONG rc; HKEY key; - if (!PyHKEY_AsHKEY(ob_handle, &key, TRUE)) { + if (!PyHKEY_AsHKEY(st, ob_handle, &key, TRUE)) { return FALSE; } - if (PyHKEY_Check(ob_handle)) { + if (PyHKEY_Check(st, ob_handle)) { ((PyHKEYObject*)ob_handle)->hkey = 0; } rc = key ? RegCloseKey(key) : ERROR_SUCCESS; @@ -415,7 +431,7 @@ PyHKEY_Close(PyObject *ob_handle) } BOOL -PyHKEY_AsHKEY(PyObject *ob, HKEY *pHANDLE, BOOL bNoneOK) +PyHKEY_AsHKEY(winreg_state *st, PyObject *ob, HKEY *pHANDLE, BOOL bNoneOK) { if (ob == Py_None) { if (!bNoneOK) { @@ -426,7 +442,7 @@ PyHKEY_AsHKEY(PyObject *ob, HKEY *pHANDLE, BOOL bNoneOK) } *pHANDLE = (HKEY)0; } - else if (PyHKEY_Check(ob)) { + else if (PyHKEY_Check(st ,ob)) { PyHKEYObject *pH = (PyHKEYObject *)ob; *pHANDLE = pH->hkey; } @@ -447,23 +463,24 @@ PyHKEY_AsHKEY(PyObject *ob, HKEY *pHANDLE, BOOL bNoneOK) } BOOL -clinic_HKEY_converter(PyObject *ob, void *p) +clinic_HKEY_converter(winreg_state *st, PyObject *ob, void *p) { - if (!PyHKEY_AsHKEY(ob, (HKEY *)p, FALSE)) + if (!PyHKEY_AsHKEY(st, ob, (HKEY *)p, FALSE)) { return FALSE; + } return TRUE; } PyObject * -PyHKEY_FromHKEY(HKEY h) +PyHKEY_FromHKEY(winreg_state *st, HKEY h) { - /* Inline PyObject_New */ - PyHKEYObject *op = (PyHKEYObject *) PyObject_Malloc(sizeof(PyHKEYObject)); + PyHKEYObject *op = (PyHKEYObject *)PyObject_GC_New(PyHKEYObject, + st->PyHKEY_Type); if (op == NULL) { - return PyErr_NoMemory(); + return NULL; } - _PyObject_Init((PyObject*)op, &PyHKEY_Type); op->hkey = h; + PyObject_GC_Track(op); return (PyObject *)op; } @@ -472,11 +489,11 @@ PyHKEY_FromHKEY(HKEY h) The module methods ************************************************************************/ BOOL -PyWinObject_CloseHKEY(PyObject *obHandle) +PyWinObject_CloseHKEY(winreg_state *st, PyObject *obHandle) { BOOL ok; - if (PyHKEY_Check(obHandle)) { - ok = PyHKEY_Close(obHandle); + if (PyHKEY_Check(st, obHandle)) { + ok = PyHKEY_Close(st, obHandle); } #if SIZEOF_LONG >= SIZEOF_HKEY else if (PyLong_Check(obHandle)) { @@ -826,8 +843,9 @@ static PyObject * winreg_CloseKey(PyObject *module, PyObject *hkey) /*[clinic end generated code: output=a4fa537019a80d15 input=5b1aac65ba5127ad]*/ { - if (!PyHKEY_Close(hkey)) + if (!PyHKEY_Close(_PyModule_GetState(module), hkey)) { return NULL; + } Py_RETURN_NONE; } @@ -2061,7 +2079,7 @@ static struct PyMethodDef winreg_methods[] = { #define ADD_INT(VAL) do { \ if (PyModule_AddIntConstant(m, #VAL, VAL) < 0) { \ - goto error; \ + return -1; \ } \ } while (0) @@ -2079,38 +2097,25 @@ inskey(PyObject *mod, char *name, HKEY key) #define ADD_KEY(VAL) do { \ if (inskey(m, #VAL, VAL) < 0) { \ - goto error; \ + return -1; \ } \ } while (0) - -static struct PyModuleDef winregmodule = { - PyModuleDef_HEAD_INIT, - "winreg", - module_doc, - -1, - winreg_methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC PyInit_winreg(void) +static int +exec_module(PyObject *m) { - PyObject *m = PyModule_Create(&winregmodule); - if (m == NULL) { - return NULL; - } - PyHKEY_Type.tp_doc = PyHKEY_doc; - if (PyType_Ready(&PyHKEY_Type) < 0) { - goto error; + winreg_state *st = (winreg_state *)_PyModule_GetState(m); + + st->PyHKEY_Type = (PyTypeObject *) + PyType_FromModuleAndSpec(m, &pyhkey_type_spec, NULL); + if (st->PyHKEY_Type == NULL) { + return -1; } - if (PyModule_AddObjectRef(m, "HKEYType", (PyObject *)&PyHKEY_Type) < 0) { - goto error; + if (PyModule_AddObjectRef(m, "HKEYType", (PyObject *)st->PyHKEY_Type) < 0) { + return -1; } if (PyModule_AddObjectRef(m, "error", PyExc_OSError) < 0) { - goto error; + return -1; } /* Add the relevant constants */ @@ -2174,12 +2179,44 @@ PyMODINIT_FUNC PyInit_winreg(void) ADD_INT(REG_RESOURCE_REQUIREMENTS_LIST); #undef ADD_INT + return 0; +} - return m; +static PyModuleDef_Slot winreg_slots[] = { + {Py_mod_exec, exec_module}, + {0, NULL} +}; -error: - Py_DECREF(m); - return NULL; +static int +winreg_traverse(PyObject *module, visitproc visit, void *arg) +{ + winreg_state *state = _PyModule_GetState(module); + Py_VISIT(state->PyHKEY_Type); + return 0; +} + +static int +winreg_clear(PyObject *module) +{ + winreg_state *state = _PyModule_GetState(module); + Py_CLEAR(state->PyHKEY_Type); + return 0; +} + +static struct PyModuleDef winregmodule = { + .m_base = PyModuleDef_HEAD_INIT, + .m_name = "winreg", + .m_doc = module_doc, + .m_size = sizeof(winreg_state), + .m_methods = winreg_methods, + .m_slots = winreg_slots, + .m_traverse = winreg_traverse, + .m_clear = winreg_clear, +}; + +PyMODINIT_FUNC PyInit_winreg(void) +{ + return PyModuleDef_Init(&winregmodule); } #endif /* MS_WINDOWS_DESKTOP || MS_WINDOWS_SYSTEM || MS_WINDOWS_GAMES */ From b57f55c23e15654e9dd77680ff1462603e360b76 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Tue, 18 Apr 2023 02:33:22 +0300 Subject: [PATCH 193/349] gh-103449: Fix a bug in dataclass docstring generation (#103454) --- Lib/dataclasses.py | 9 +++++++-- Lib/test/test_dataclasses.py | 13 +++++++++++++ .../2023-04-11-21-38-39.gh-issue-103449.-nxmhb.rst | 1 + 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-11-21-38-39.gh-issue-103449.-nxmhb.rst diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 4026c8b77975b7..a73cdc22a5f4b3 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -1128,8 +1128,13 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen, if not getattr(cls, '__doc__'): # Create a class doc-string. - cls.__doc__ = (cls.__name__ + - str(inspect.signature(cls)).replace(' -> None', '')) + try: + # In some cases fetching a signature is not possible. + # But, we surely should not fail in this case. + text_sig = str(inspect.signature(cls)).replace(' -> None', '') + except (TypeError, ValueError): + text_sig = '' + cls.__doc__ = (cls.__name__ + text_sig) if match_args: # I could probably compute this once diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index 6888680105c4fd..ae8bfcc149e862 100644 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -2297,6 +2297,19 @@ class C: self.assertDocStrEqual(C.__doc__, "C(x:collections.deque=)") + def test_docstring_with_no_signature(self): + # See https://github.com/python/cpython/issues/103449 + class Meta(type): + __call__ = dict + class Base(metaclass=Meta): + pass + + @dataclass + class C(Base): + pass + + self.assertDocStrEqual(C.__doc__, "C") + class TestInit(unittest.TestCase): def test_base_has_init(self): diff --git a/Misc/NEWS.d/next/Library/2023-04-11-21-38-39.gh-issue-103449.-nxmhb.rst b/Misc/NEWS.d/next/Library/2023-04-11-21-38-39.gh-issue-103449.-nxmhb.rst new file mode 100644 index 00000000000000..0b2b47af1cbaab --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-11-21-38-39.gh-issue-103449.-nxmhb.rst @@ -0,0 +1 @@ +Fix a bug in doc string generation in :func:`dataclasses.dataclass`. From e35e0f15eba64a1dcbab10bbbd2ce276e190dcfa Mon Sep 17 00:00:00 2001 From: Skip Montanaro Date: Mon, 17 Apr 2023 20:21:19 -0500 Subject: [PATCH 194/349] gh-67230: update whatsnew note for csv changes (#103598) --- Doc/whatsnew/3.12.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 4165b16ba76441..2a371ebf55a11f 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -258,7 +258,7 @@ csv * Add :data:`~csv.QUOTE_NOTNULL` and :data:`~csv.QUOTE_STRINGS` flags to provide finer grained control of ``None`` and empty strings by - :class:`~csv.reader` and :class:`~csv.writer` objects. + :class:`~csv.writer` objects. inspect ------- From f39e00f9521a0d412a5fc9a50f2a553ec2bb1a7c Mon Sep 17 00:00:00 2001 From: Rafael Fontenelle Date: Mon, 17 Apr 2023 23:57:53 -0300 Subject: [PATCH 195/349] GH-103484: Docs: add linkcheck allowed redirects entries for most cases (#103569) Co-authored-by: Hugo van Kemenade --- Doc/conf.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Doc/conf.py b/Doc/conf.py index e99b801d0ae87a..60404fd3829e5b 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -254,9 +254,14 @@ # Options for the link checker # ---------------------------- -# Ignore certain URLs. -linkcheck_ignore = [r'https://bugs.python.org/(issue)?\d+'] - +linkcheck_allowed_redirects = { + # bpo-NNNN -> BPO -> GH Issues + r'https://bugs.python.org/issue\?@action=redirect&bpo=\d+': 'https://github.com/python/cpython/issues/\d+', + # GH-NNNN used to refer to pull requests + r'https://github.com/python/cpython/issues/\d+': 'https://github.com/python/cpython/pull/\d+', + # :source:`something` linking files in the repository + r'https://github.com/python/cpython/tree/.*': 'https://github.com/python/cpython/blob/.*' +} # Options for extensions # ---------------------- From ece20dba120a1a4745721c49f8d7389d4b1ee2a7 Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Mon, 17 Apr 2023 23:43:34 -0500 Subject: [PATCH 196/349] gh-95299: Stop installing setuptools as a part of ensurepip and venv (#101039) Remove the bundled setuptools wheel from ensurepip, and stop installing setuptools in environments created by venv. Co-Authored-by: Hugo van Kemenade Co-authored-by: C.A.M. Gerlach Co-authored-by: Oleg Iarygin --- .github/workflows/verify-ensurepip-wheels.yml | 4 +- Doc/library/venv.rst | 7 +++- Doc/using/venv-create.inc | 7 +++- Doc/whatsnew/3.12.rst | 18 +++++++++ Lib/ensurepip/__init__.py | 16 ++++---- .../setuptools-65.5.0-py3-none-any.whl | Bin 1232695 -> 0 bytes Lib/test/test_ensurepip.py | 35 ++++++------------ Lib/test/test_venv.py | 2 - Lib/venv/__init__.py | 4 +- Mac/BuildScript/scripts/postflight.ensurepip | 8 ++-- Mac/Makefile.in | 1 - ...3-01-14-17-54-56.gh-issue-95299.vUhpKz.rst | 1 + Tools/build/verify_ensurepip_wheels.py | 2 +- 13 files changed, 57 insertions(+), 48 deletions(-) delete mode 100644 Lib/ensurepip/_bundled/setuptools-65.5.0-py3-none-any.whl create mode 100644 Misc/NEWS.d/next/Library/2023-01-14-17-54-56.gh-issue-95299.vUhpKz.rst diff --git a/.github/workflows/verify-ensurepip-wheels.yml b/.github/workflows/verify-ensurepip-wheels.yml index d4a2cb6846c1cb..17d841f1f1c54a 100644 --- a/.github/workflows/verify-ensurepip-wheels.yml +++ b/.github/workflows/verify-ensurepip-wheels.yml @@ -1,4 +1,4 @@ -name: Verify bundled pip and setuptools +name: Verify bundled wheels on: workflow_dispatch: @@ -29,5 +29,5 @@ jobs: - uses: actions/setup-python@v4 with: python-version: '3' - - name: Compare checksums of bundled pip and setuptools to ones published on PyPI + - name: Compare checksum of bundled wheels to the ones published on PyPI run: ./Tools/build/verify_ensurepip_wheels.py diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst index 240ab139838db9..52bf99e5bb0f67 100644 --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -284,11 +284,14 @@ creation according to their needs, the :class:`EnvBuilder` class. .. method:: upgrade_dependencies(context) - Upgrades the core venv dependency packages (currently ``pip`` and - ``setuptools``) in the environment. This is done by shelling out to the + Upgrades the core venv dependency packages (currently ``pip``) + in the environment. This is done by shelling out to the ``pip`` executable in the environment. .. versionadded:: 3.9 + .. versionchanged:: 3.12 + + ``setuptools`` is no longer a core venv dependency. .. method:: post_setup(context) diff --git a/Doc/using/venv-create.inc b/Doc/using/venv-create.inc index 43ee6b7807d57e..2fc90126482268 100644 --- a/Doc/using/venv-create.inc +++ b/Doc/using/venv-create.inc @@ -61,12 +61,16 @@ The command, if run with ``-h``, will show the available options:: environment (pip is bootstrapped by default) --prompt PROMPT Provides an alternative prompt prefix for this environment. - --upgrade-deps Upgrade core dependencies: pip setuptools to the + --upgrade-deps Upgrade core dependencies (pip) to the latest version in PyPI Once an environment has been created, you may wish to activate it, e.g. by sourcing an activate script in its bin directory. +.. versionchanged:: 3.12 + + ``setuptools`` is no longer a core venv dependency. + .. versionchanged:: 3.9 Add ``--upgrade-deps`` option to upgrade pip + setuptools to the latest on PyPI @@ -104,4 +108,3 @@ invoked to bootstrap ``pip`` into the virtual environment. Multiple paths can be given to ``venv``, in which case an identical virtual environment will be created, according to the given options, at each provided path. - diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 2a371ebf55a11f..bd95bfeea80c71 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -731,6 +731,24 @@ Removed project can be installed: it still provides ``distutils``. (Contributed by Victor Stinner in :gh:`92584`.) +* Remove the bundled setuptools wheel from :mod:`ensurepip`, + and stop installing setuptools in environments created by :mod:`venv`. + + ``pip (>= 22.1)`` does not require setuptools to be installed in the + environment. ``setuptools``-based (and ``distutils``-based) packages + can still be used with ``pip install``, since pip will provide + ``setuptools`` in the build environment it uses for building a + package. + + ``easy_install``, ``pkg_resources``, ``setuptools`` and ``distutils`` + are no longer provided by default in environments created with + ``venv`` or bootstrapped with ``ensurepip``, since they are part of + the ``setuptools`` package. For projects relying on these at runtime, + the ``setuptools`` project should be declared as a dependency and + installed separately (typically, using pip). + + (Contributed by Pradyun Gedam in :gh:`95299`.) + * Removed many old deprecated :mod:`unittest` features: - A number of :class:`~unittest.TestCase` method aliases: diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py index 00e77749e25e77..69b23de9e05025 100644 --- a/Lib/ensurepip/__init__.py +++ b/Lib/ensurepip/__init__.py @@ -9,11 +9,9 @@ __all__ = ["version", "bootstrap"] -_PACKAGE_NAMES = ('setuptools', 'pip') -_SETUPTOOLS_VERSION = "65.5.0" +_PACKAGE_NAMES = ('pip',) _PIP_VERSION = "23.0.1" _PROJECTS = [ - ("setuptools", _SETUPTOOLS_VERSION, "py3"), ("pip", _PIP_VERSION, "py3"), ] @@ -153,17 +151,17 @@ def _bootstrap(*, root=None, upgrade=False, user=False, _disable_pip_configuration_settings() - # By default, installing pip and setuptools installs all of the + # By default, installing pip installs all of the # following scripts (X.Y == running Python version): # - # pip, pipX, pipX.Y, easy_install, easy_install-X.Y + # pip, pipX, pipX.Y # # pip 1.5+ allows ensurepip to request that some of those be left out if altinstall: - # omit pip, pipX and easy_install + # omit pip, pipX os.environ["ENSUREPIP_OPTIONS"] = "altinstall" elif not default_pip: - # omit pip and easy_install + # omit pip os.environ["ENSUREPIP_OPTIONS"] = "install" with tempfile.TemporaryDirectory() as tmpdir: @@ -271,14 +269,14 @@ def _main(argv=None): action="store_true", default=False, help=("Make an alternate install, installing only the X.Y versioned " - "scripts (Default: pipX, pipX.Y, easy_install-X.Y)."), + "scripts (Default: pipX, pipX.Y)."), ) parser.add_argument( "--default-pip", action="store_true", default=False, help=("Make a default pip install, installing the unqualified pip " - "and easy_install in addition to the versioned scripts."), + "in addition to the versioned scripts."), ) args = parser.parse_args(argv) diff --git a/Lib/ensurepip/_bundled/setuptools-65.5.0-py3-none-any.whl b/Lib/ensurepip/_bundled/setuptools-65.5.0-py3-none-any.whl deleted file mode 100644 index 123a13e2c6b2543f83a7f0040ad153f8de633558..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1232695 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νS>c$rrefWjz=!<){VkfOx8%cuIi8jsPR1A|c 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�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
    ^tH2Ug<1s)N#|+e&BgL(`0p^&_;QH( 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

    9~+Lnpy3q;M4UoI3MRmuT{PP(~#T* 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%0A*gYMV|TW)s@^IQ^H zWC(}t?!;T*?8eb__85BMB01cM&^iK%Fta6Pa{@VEraFb;0!RnxI z5(V-0aPKz!!%=SXPzy4JzuGJ7$_?lh1{F}m$lS=TX8Q=?0qPWT{nvn z>vJ;C>-rNuPDwnDES0KSC|#gO?(gT3{hd(U8?B~pel;V%&*GT3hi<)7C7JGgsQO?`y2aZ7-_W&0vqA8svNH|lRcCc<5i{89^hbSp zlF6fwqsJ4m`7BVD4NXj){;w-fXfnV3CIiBV zyI&MAw}g;Ni!*@yO%myuMF9keD9?xprP5x0>rL6MB8us_93otpY_Ip%Hg}dYUGd|9 z^l{csjB%MLam!<_(lsV`;0ogliyV~r(oP^hvCkx`!j=TI29MPpSeh`0A15D=KvKOR zmCHQ~mv7%&(>%$QDguO%)>ThKdYJRfn!z-LHcvFc*tiD#m^RoIY!L&`CQ+!9WIIQ z`&2kzY?kp7u?8x2SshMismgBe=;vooBv-}dE{9Y4mB5nkW zNGxmOXdp?`1G<;KSDYOYDJMHwSQ8^<9{kyFAyP@DHl^6g>!aF(G2-h>-A!rHuG*`O zZ?ne(4wtLHUZjy+3=i&Y*~J5`DHu6*k=nJ+FTRU)-$KTFA?dvvq38(ldm!vd_ zVbEh`M}NvOEVT^W+C1NHyYlVqCsy0+^}g@AeSYe?PTA}9w{{Y&ldi&$AsQ>VsP@Yx zVKYss`ZjDJe5}Z*=P&*wUUgeZjN%9<0RUi%B`jTyBmeU~*$Vu5B_DxOc$srkIdp=B zR}m11EMm9H$csvwr2Y&^Fy}nygxs%KxH1!+ zclM?u{s71GvH2ZxlK0I-ZUbgfLELdCFV-RbgtjOvG%h3i;Ga5EM1;Je&m%P>9MsDD z9gE~6a`q8Hq8a~nxp|w6$JNIfpd?S=pY>?}!od@Y>0hzev$$0WN9%?eyiMe`wwJV0 zRGK!sNLa`%$atHg4XvBAQm3u0-2P;laabhrk)7?FYWhESR_$90q}e zTfo5uF&-fX9j9wOT2BLLOYabCqk!|9T_)r(hShz1@&E|GT=QN*+|hvXF1{Bpz$M+x zObDA5qok9AI4n}UC)ou{`E0nhl5Z2|>JcHk zfFT*k$P!?HK4yf=s5OF^CkXjDZpBt)`pJtFpASM?1D8-iXb?kYCNP&|;SvIsi=wfB z?QI!w!B3Xk0SjU8HZKR+DWiIFakdaS>)RjO#6dygZ_lMAX-?h}=5IB4obymGZuc$K z{YW=qc&}^!CI!qhN;!CO>Xo(^2B);6SFn(HLvhYX#xA74Nsi2wfPK*AM%jo+#&VEV zXED~PSle@Tu-}>#lRh&{Rt2sCxqHp3H-{&<^A1Z9c-FQEuZnzfS0}}Ch*4{41}5!V zWE$@z>w8e*39MJhGCbYvJqu!^3LOA>rgmezZNvjp^bHIj>&K%a@vAlE{9I~(VC{%V z&s|@Y$N{h66M0S@g?edFmtK6ySD1*OLZMKR*#x#0Cw?aermp9TnJ*~q?8F8*=L1q4 zJ=9}R*o(@G9`uqn(+c%bx?>A)0ym3_0xuoZWgCCzX@?lvmSLAkHHNRW@K*Dt9acPB zi!q)jW7^I&#B(N-eSGh&kKdHD-M-kNtT?BSJ~gau)JOOBfm{bWHfgYafI>HVQLks- zeXFxY_9j#zcPXiYa6Kt=H!^_+xUD=z1hW4DH{n5ZoOeF6C{Z)gZ=fMs3$iZf5mPxp zp|8dTHepoiCD6R9!#vkD?VU<5+Y_HtV|rkROm(?P7=pbL9wCS}{Vm@9`*e71^9j`` zsC(JlG|cRQQ$pk|R=PqsUN(nr+!ynbf6jfT%@{}63;)zJz7r)dL_kpA5Y*XkuSK{l zr8Nmu<|(ANrjQFz8xgV($o=Qu0t#e`520^OjhYwi-mDTEP-RIc!=*Vbl8{;;J~_+M zYWA#Lu6CJ`g8*$paJ>5R&90FXKh-j`_Ky!^f0-SAZ2e)Ya_+o!(Opm#oiLi^BrxB(Ojc?+fp2yywX4E0l{r!}ae0QL!Kz(O` zgwQ1JaE*zXW4nTjdTUY+H8l0lbx&vdsy7EJRF^O2#_OVr3=`7?JoT@`#3(*(i1gy! z$&{rWO!6gJMlR@>;wDGW$_vPMzm+DD`i2!yh(o8&|Esznxui3Fi#(UlyCA#S|c? zRFF!EIN^oXvgyTb9wl0@P+eFu;0z9lXjpU@D}M7?aTn#S-vygSb}~ ziJ=8F;;AYd7&v|3*B@qPI$%-7^MDq4W+;$LFU&@o?b0 zo*&GSMm6V*IrBwFIM~DEYFvEHc}FrY8y|4(_%=O;SK@Ij_iwfCu8r2?wb3WdJFh$Q zHtvq$jMFX^8jnl0a-{wef&Kki%Y)1jHNIDOx~DCP;V%A7A6D3X)zKpOJiL5jLTzA2 z@TE<;C2oG~{^_1TMPtmjpE!(o)P~Hoz({ST1fK-Fme*Duo4A1R1o~N{G?1RU(L889 zo?g(aAwhn4@q5sN|8~56-F(0-p+@iv26J$la?g%La#JV~X{Az|8^q{JOAro#_%Ty1 zB$9syLSY^cE2kfHc2wxgS0Zysi^YTdNH`a*5uU)s1p|BNqK6OPm5 z?**rsTs88#x0bQmqGiCp1vjZDP6Lunu{U$Ii!Pj>HLq!>$S-XtE~!xbmqa34H4C+o z9PmvV0R*&%UATalFlA9*4$FkDv*)6<<-B$9fVX!9ky0GSG- z>+oWDSGq5LLc@OLjH_QatXV@|OSkq^tOpq3%#2Tx>1%v2mS#vSvO4rts(yoi7P!$F&1yvM%C!H2FETnkdW!!%_Cgtej z?YFK-CG6prbX0X9$iQp$Ga7{Mfo{dF`b~;sG3M!vUCj=dW3`H0c>l&knc+REz9RJQ z`1|B>x-%BOubr>X*WO~wIjXlgU4M|iV(dusM+-YQ{kyx}AJfFE`KN)H_6Ph=Oi)zR za`TjtDT>&+3mz6c)x3t5WDXTb#d<95`!>`uFKryQZy4+uAdN)hh0xibX92 zdP@QoT12-=fn+Pb0hC!jzck3H9m}Al58pZr4TsN5~FTj};DVK(d+;uSb|KA@1FAVHoK=m?2|C*uq``{YV&gjPG5zZGm7{miCEj zoUr0O9J;8Xu{hoUG7Vibs_6^Ha1&Zn{$3mXHhwQ82`>X7FPM|DkrOVxN(g+O1ELT5 zrbM2r#6Bkt4Gl0~(~ypeMW{#mCK;44Be{!~KNYyuggcjZDNAEU{GtN!qn` zF>(>}ge>Kcp;u6sXw)r6ky3EueiSI19k(kp^k8}1{1)F)XV~U@L*GrCV4NbO33C>? zR;+?Qx#=8QkCFS$qt}B>klo?xQ?-sIa6ZZ852*EnBQ=Xw(rnyf^lNs0UUQ$-xxW?i zucIOVIno8&%?wXdvRbFQw5JGg)Rofl=Q{7s--Zzm+cYOykfNOrxnrewU(xM`dMw6V zb*?^(jH?{9%v36EyHr*ZT+I8NDNWr0Vy)eiw-{CX$(o}$bUUs&LBgS1mSXRhkwYq;9sXu|F6Kv!IPQY*xuH`(B&U4a#hlm zA7nuB-K}dkI$&#*0XzgpOhOcpjX?5bF{7*w9j(>fAfgHRz3Get75!W&<$c|9o}rax zCS)zw;fzZ*0CG&bOx=r_ISiFxF6QmK6llPT73=78%1A>v3uz1R0K$+IYk(mrl&WJj zg<>6ZdU6;$eAlq4x#|0 zi?bUdU1{JQ)tB(PVTl)~pEqE_8f_{&vt@CimN%2EUQN<2%{dTiwI*J>9@_S6a~CEu z(K=F4M~NLo-SIQ5us{^0fr^fs2#;QN)JL8%sWOJo!MoR!?R; zM1b-xMg_1`hpYB7pvWbM$daH_1(-fL9nI+!(89Cy?yL13(ul|OGN{3Q(?oQ4_<;Ws zUK!Olr7O*W@BpYo?#~6yfHy?I6y5*cGUXRE=o{^vma(B%h8lpnq%YDP2GvDNYC zyg72aUDhf-S+DlcLnSJNgbk%4zyyUg`PZ)t8VCeJNpkTam^LWd*I56^fg>ilsCt5g zHi$yMZiogBM1K$qJ$T^QEBS$Sb|NU1dM1xb;e-++ez_~7E^UpCQXPc;jf_5t3B5~^ z0Rt{PcmOaO1YR1iDf#d)89ezAoIIJaOR`9n!sx{~@7{<(VkKKA#b$g`Rs-dNZG5>- zs@ReVo~@9=!&>&v9hH7!K2qate%+vdFUk`!(nOiebF|c^d^tEvu$d@R{Yl~S(o4N|&ktG5eu&f| zb>wR(!9f)iy(z~5HDIa;T?78MNqZwO{kBBlG$KP54H7++-HbmtX)GoWVgA)HYxpYl z@2<0%P~0di-ZwNoyk@+Vy-f|07WR#6QfW2CqwF<|l3zW9G+J}>iKz!lxanUZ2BEZc z8^w}yI9;n`GDEY4^7W2CeUCiyo*BhQLlI&8doq&xLQ_unu9x%lW5C6YF)ew zz0W-sBY)Zowpes#4--&%baMjbsQEgTXX*jG$xMMZeuAk-eLz6`6_;%O#VNCL{5#+K znliw{;A$l-hG?$!)FfHY-z&z}0>%f(Z4?=z3Z-{CKkZ92@)M3-hFZ)%i!>aF&y{ln zldCqKUQ01wdSC-Q)l*T_gv3k#3T|>WvUxM1{>u|f1w}PuXT7-t7>za=ODCGzvMg?a zThl_r4qOw6ZyId^84qK-qk?HA6S^YAFVrG->5&#{4Fit^J3O9wp4dAOUJA-X1)y)p zU@;h&l7-NP8Q?~cP-Ye;jwWAC2ra*S(@O1Dz?i2+0ks3D<4_+gsA#Q&CB$z@iO)2x z+>6LlB=WfZY#PuZ&O1V50N%_?$xu((Pz>+^^~`Q#aTq8dqbHy3VkE=Vk1{H}sgD}I zhf!ym$7Gc2E7AX`!>*fjyHv~ds~cLdvJzkpiW8CPG_qz7e70wRQ-db)X##jx3=1UQ zUmt(IPJ8H)=MKD)02&HX0a5{Iq%?tP1>@FKpVIh16hI5hxly>5E69jA%hn}JL?p~~ zH->eCH=HVun-@x%3^(5#*8RMcJMqCzG{y0GLdsrGuVuVmp^@(FlH=` zs)4qYksupdvJ(!D%StlQ$wO1w9LeLCGNw>Ev7ER-an_WR`YuzH;51uB0@`s8IsWIO zOEJ7ifTgGg^%@`T53^f@YlCRLVtQ_Haic;rjX!!`1Nkp!o=?j~5ZQ06E{_xffo&~E8r0&S?c`A7#y^MvRNdw+N{(#|faSjkkvn7H(vQAP``0=+i zg?LRmtom@k665osmWRN3ga<*iU}}RAfVFuJA6&AElR1YvH-)_nAc10v5F|HH#65~i zDWQgH$>%p*9wvnGxtpbW*`>DR$R)%OB>Mx`4Ovl4*Ii3N+^CCB-t#uXx5D&-K(rJS z2y?4J>f&dLm{wakpa$fZgj_E{KwoD|6(I*A2h_AT6;LyF8 z-C!s=$?v;n?`hpG>FR6U!i0%UusA(I<;Q0pkX~#G6}X55p_j4WdK?0)+M%}{nJj5M zhYGY0SoQaC7BLB^efLAfB4UP)B)A_e2Delko_$341hp}I2#9Y)Aqlf&?&cIHYl*l` zW5=`T>MzNPZ57Ej%9&vO&^XAd^oCnNWvlcR4Ie<8`z?XW8Xr3?ra?SI^@^t`37t2> zx1MgNWf%l-HcQ|$kLYE* z+~EcYqYBeYZ{MZt7|0h5D|;Hy{7xaC8%5CcO)wwIrs|5*tCHsfmcoo;-bK;cp}t=r zqRV6QdIZ#Qzwi|>-Afu?S7sJoydgSBcb@4xRHW*O4peR>0I}qSX znCC{~_(3E;@0P}WlTQ@PDi{IDga;Uv$V^Yg+`$am{ZAu@CuOC##m+$ns(vB$c1orW zNaN-yhYyeH<AU%oZ#qZ*c8<)gOHKx8TD66Ldo@O(DFzqTCRobT$HI6l49emz zrT9Kwyle;i2(hk{gI}#AKN16^w@t@L&@0*sz2>b31^^{!AOrL&o{vY6v8toe>h;ph zbK&e}w|Y8Jws2atx?`6M(|$g_oI>2}*JxM3ajsWHxsr1_#MUiH$5-pMCHn`SFOyDo z7cL+kKY9^I4{%C@oil4~W4|mbrJ=uc$Q>59-1a9wqSv2LoI_WFikvSEr6k@yn;g|) ztY&O>G3y1RU;$uufW~_~;8AaMnilA>Y=h$F&Dr!7oXhAMj1O=e)7s3IAKzt&(=&Kh z=y^@Nw??+&y5ji>E-BWA9P;Y9jppzCAI8ohN|b2JwrSheP209@+qP}nylLCEZQFL< zG=KgYqZ;)_H7fcM-E(&AwdOo~P{Z}lBrPW{lM4tqxOE8WWz4Wr%M(Y8lv_w+nB$fg zLgj%6##V^&HkP|!wNT+752TUBAqyvwhNT`OMJrX`695Wd_coJxE{gU9F1Yq~C_J+e zH?fjp2;D!9TiKKiF$o2(+z=q`cc}D9k=Tn)&u0^L->nhp0t*SPOv9Ng2sBi=l9oSY z0tfd7-3T@{wYUekjt35>5u%kQ&jb)Pfj^S=EQ6-QXYW*GH{Vk^0n?1sw!wH%-}7kM zqPo=T8C=vz&sxd^?vfZp+8zf{wW4i$Yv@B+_fFeLCE7Jz)6Hw4vBJE(mI1$d|IFn1 z`?tj%_3Z`Ie$v!41FuuF84X2$==DqD^A;P>2 ztcsFe(@vcq^C8^mS>V9Ww#?1QJMrH=vZKM{o+&DatL_<#jK{3J6Z}ahnLNYMfqxKO5~MBX0XFIzy{n?4y-p%7+2h(X#ja09&q92{V%!2k3HGHaWKq_qk--!-GF$43eS-|S zz4F%N>IL4CulH@fbdROhz+%$+IGDpns4~s^b+!v{tFh?DFVEMn>Oa;~KGN;4k3l{p z75{T)p%|alZ@?{-y7CyY##R)1epiQK7zRtZ6J_^G>Xiih68LBjKas+CKvAUEDwf1m zv9J@KGqQ*_gq?43o@zM>FAs3g#wo*CX0-qX$Ki!2I&3~yzxy~S>z_}eb{+MIQ$Tiq z83#0GEzkTmSfP#c~Ii*OM5QxxCM>TJlhi>&j(19*jTFm$c@ib6T5b zXgRBxrROqleiW#9WqrC-+-6Li2M^)jFdyO_{wnInHF;kNXBg3Q+qcTVvzx@9+q8_2 z>HLDgp9&rYJ5zJG60ZGk7+7QdpS}+D3**z|^grGl<`%KhQ6oo8+ZGL<+#&A_h!5T> z`*+#taY)AloiF3#^H~K@)UnSa(B4ytlMlS3a=(VrIAxXm8?g`3OaEb5#xD`v;_%lUl|U`KebtK z)$*#p|J3u_(0J*Zj643K7GH^){X#>;*!y)ClX$}eB9;W&fx#JkLv!%(nJwc8!n|&F z&1AjnI)Akse=!6j>#RDXC2Y5?(%6ncduPPT?Lx1at?_#LIyotY^CXR)bZxV3N4zj< z@N^s80dKyRP+94Vs?@h6G;H-}-g>Y=j02ONa9T>hH!pypFMs|oNiu0`rU+q3lCV#Cg5y2|>$lLMx zynd7}Pmqu#@mm+*aa2k_UaG7dlvpQ}N(3JaW%3-pbXBq6%tni1P01CaTD$2wP+(d( z7q~#62`{1wp6HZ6I}8?BY0f0(xN*ftC;L!nEtDol@Xo3x^f#NmDIB@wEo~;9dGveb zh$~#KgeJsJr|jWKpytB#53s1Mpv<_4cDJhN|Rui2zzNTfbx>7*OZNa;o- z{X7@ub7mP_XA+uBJ&`x(!6ATh)kk{K)M9m*IKcB2Vc~;3;)qwd0lnMxM?hZ#SLeX5 z_@?-HTDPm!?QwtMrMi@xr*w(W%nyEKj&cS}iyQMD$i+~tUja7$>v<~<(oLqIak?xI zVc3dSOqvoXjGwDzN#s|Re@T`MxzX*kj=%1y!XS^6g`IPG0kJe-Z$66u)4AQPb zkp4bo`j~chyFBe*U$~z5<;(k8>SC8|BW&IBxfb4M*z&jfI$b@FVsqV8)=Zt9wig#j zb#%6Y;Pbh_V*+Gw1!%ZXon-hJsC~fl40S5hh6+HUt%9~S^LM9)HvDSPlmEAApn(^MNytC@Dyg@!P76R8{QHNM*4`T93X=CAWn9yQmD5zBU6zrL-PkOCZ4w;=WFJlgRk15*Ms6EOSd2uj0xu~!1iEwUkZ$j z?*vRSJZr^2NQ=rLEEuue415MR^2y#$UJJ$npynt=3c+|t+DKd= zg>|sMSTMh8vm()(aX9m(0Ymw+Uv~i^Xw&Ht88vv9 zJ(MtPOU`~h4>z9n_PB%3NmTJ3!dxh=_}ygN;oiBhghrU?Jd@N;&<)U2MI+-gV22GG zPhLOwufnmfLOS2HJzgXxQV5I-(YV;VpKO8IgwI5EFmeSSh(NdH>pbXf1iTkZG0=Nm z(&JO}@51t5V(Rd&C0q5!29ZGwf4*&V_=nrUj470~>VJ~q6tM&(YtS1<&c3CLAKAZTc zJnCxNSjG~UFV$fPkBb~P5Vo|c zjM`};fi!X=`v}?CZzMWB69%pEA}6i6!bOEMPSsJ&HrM%a=(f*K;qFL3V^u`!W_?Xk zuECLJU^8EI&=QJZp_-`fQ`vf4E0t4@C*1ck)1dWA|1?+x%YR7!?!u|gK!n2=#~Pqk#zRy zphX$^K}hi^9@SwV+8?gfg6#EzhNJ+P;A~0A zo2gnrD>pDy@%4Oz&$2ZIdL3SkNGqAIp?(mB_0e7;0Y>Ol~Lscffvs`l_T(2J7FDv1WZN) z55KaBI%K#Fxe;)6Eq!&t!~(Jn)=oZ|Pb3%?(k1o)B1piwNcO8IQ2UAPv}3@3p{D9{ zw1@wimDC&!5ZkE4B|_;LC_gxc^{>7V*L*4A#k~D?m0$i4DN8I3y@itrOr6$T3B{vE z;9Ab9NTWfqu5@K7$FEos`oZacxfztOo2WK=%h=*puN=+FpE*zR{C=);7fqmXj?q@hJlWo**$>Zebt5O_;i z1y=w`N<3Ha0&EhL*Fd4qx0dbbGiLqkXzNV3g9M0TY(y6Aj`D{MkHg<{bUgU7A#&7f zOEvOLG}ORioPJ`z-lK^mD<(ko4->cgm}L2a4;##VAi$9TI}TY1BCGjUsv~r~mKJ%& zi!On-Yj~k2T3>jl7IH55*-&`^MhOPNxhNGe@Y$U8Y^`zVNV&pLE^%fB>Iid{xxNzu z6QOcQvT#IIDN#oolfdU%96c95GlbQ~8>q>vVtH{gFkT+Nw_V5sI4pumUMJpLhyYc)P zNOy$ty8Hrrd!Tpc+Oa#5*wVfsRR1lZ04oN7lGkNW>J$By&fb(3rK;F0DY7?rGoYEh zeFba_)zwO=X}vaSrbj^2yRaZXE+}1B^KV~Tn&RKFj3blyMzx>hdPq2Mg5OD(BlDv5u%?T?~S<}zz{6ZCw0nd%2fB%DgBUmgP|xNrSl-3TzWV`0Xsr%;Shl}j^fI{j% z7oGhER^3eF2o4`DsmpAgCc)LWs!Y5h@%^_v>)UgzSVaN_isp(TNZCkvp$(o?c>MZy zn!B8DiZ)ZPQew)b_|tltE#6?)m9x8jvU>@xjxswuJdEBFkk=o)ejppGRoiSXWMe5Pz5ELKdX2 zlU*M?XLBAWOc+In<(ykVjfm(Ua)yt*1DxU3A>yKvQ<0?L){^r^%s%2uNF!gr2+3Ht zN5xmExqs=S4^tTaRO{QDw=c+KiTYd(E|pHWy8usBKYY_5cPVEjIw`?ya__`T*xD+X zx)&WMl2}k5+0K&cz8`?}=NMmcYL)OG4ISwAaRcB{gzbZkrmReq1L?DX*yNcoWtj=k zfb{$)ApDomr+0@%{it16?21y>>s4oZkSrwoTUeWnKt8 z&a(rx(~A+<$(**sad}oKHBwrDBwGiQjOuI9MCKrWNe|7|Eo^o<^sTb3!&a9}h727V zL$^aaO=;4Psu03eDY!zPTp|VyNi{m{91|d7*V@I$&t$2mbC&@kTs1glZdZDIPJ%rm z1~Xys@5ypHHY>_{x{je>p+)?g5lp)C5xJnY9;^OpfX{BQ@(WRWWxBORD@HeZ2q`R! zpf?n{2<%tbfCPYN^anua>pRlgGl^o+iJu|F>mUVEgWUVfbaem86CvCiR12BgZJ~xN@jzt194=V=ZHM8Ky1{X2=7p zy4=sQsa<_3Aed6#A5dSMLG~VC0*A(QGF(Gi9#C-MPkxStw)A--V1RnZkx9#hiCkSU z=2oap1Dfu#Nf=jb{~PWme_Ca7+~KHWncf?B*1Af__<=eqES?_jDVT=u-{f*{uXOie z^9cF2kCItRVoMqD$mu#u)jg6?xmS&(A#%~<1Qg!|6*K6wS+kmwDM^jX>|{%2P^KO- z8(%64tUzeuI4-v2PHlLZ?6DyX$%r@i^=_V1G&%m;mcCa@;Zo5P*PRk?!uArV8ND3A zrgv5@R>~A~Iz+{NQ8L53#>^?Qf8};nx;j`FmK__D*?6{+(uTeagSRSD|0REFu2sVO z;zV1=$|`4gG1WOhxg~-3{giymKpon0$57-EXVL`mmQJEd6fGnxMmP_v--Jt%_}FY6 zA8q6=$W>5@MX}Xkr|zDU*~+%Wuz2-CV1N*UE5qc^xsjlKl}S=ZTbxn3WyEqC-rhg;58ZF5dm%R#{0s0|+Aq*Y z$h_G}HUm(h#YYWUX8h;#DbBA3>5J}z_P1OQi3D8uv#^XSG)hUrh(963qy~l5HLMyt zn}v^)0te?&g7pOs6bwF?bm(mDi0H`fU`+(>5{iymJeMQ*F>2C*%&_!;y7=60McL$T zZI0rVO?vNbZWyHr&#T_tKQ-hmsvg%c`VG5KYFLL{l&}T`>MSGUc0@DCYU?rN6;zYk zX}F5|{Ax>TmW~kN>;6sw65K3q?>hcMAQ6WG+1vGcJ-lgltH&)yy8)JhLQVN`{p3X& zxgcYxT)JhJ0Plm4w9e)KUKBr}hbMec&B(%B9jIzHxCm}xNY@H+oHR6FhMnlmcl_8famqDe@A$9DA zPwCslPovmb)?$VNy;4h^$I+{qYg(Z2mx<<`BA|CSK)!G*_maEMsxjvf)r7S&cUQ9D zo*(8h&15@p*QpL&!ZWci%AyDD1ZPhcyp=-Ar00pUNsDx$A}|%(Qb1{8HI1m&Q03AH zVFfEmP*kiDSDw?$@FQ@!>tgm;y~!EXrfsGL(@0J~!OKl%hl@yqg?0|bQmh6OqFBs7 zQfm_-o$%OUQ$PpKowGpq`|wk&z96n6s~vV5C`fC6pUTF^{1!HhK6E?*KO1k}j)oMi$(TPU^;O6^}~W7ErZ3#U=OX z<;8nz^p?r|%hAVM4_X(pi(ZylB7d_XI3_FuILJz&<=~*M?wGiKSB`QQx=-h^lJN*8 z0CHvPvbdm?UHRnOe~heG9jccShEy+H_{|se2JjR^e4-_ANiTNnH8T@$_-p#}T+?Wb zC9zR$D(Q9eC*Cg*g#lgdi z*h*f4)XcAGJ8q#sfRPAR?O1Vl5G~5uQKXA3X|fZ%X!apQkUjc0|70R}qJ{ZxU)?{T zXLKV1o*6&vRr^5hR2-xA!riD9ipb_*7XSRK)6adPm+!i8dDkMXS;%H(+iI7V2|zA z)957~>jQ`Kq-vy=LjzbE_$mt7B;-AobJB#$yi~<9)w)d&W-MRjKUFMZ4)&R!D1+&g zbM91UAugL^)J>)=ODL|j-7kv-!!|MIrM0xbDA~4wIOOrIY@?=X*##|>lp~%gs_$LYJ;C$ zZyQK$K`UBZCU%#+TClr$H52kBT-XYRJ!Xe&_SEWhBkw`^*l^{90#&9{yI&JI)W&O4 z-+XC~BWab0B1UaXu_Mf`E#zq(V%oe*q4HEx+&dEQX!Hl^))5%%&4)`%3XjXH-KfN^ z^>&KnfY(-4m#up<@AK}H29t{kBY6`v^BLhpKO2WJ0hjit1tIR8r7?JpEJV8`6~3eAsTEzM=2@tmU3eu+S!*e#nkEN0&nZ$i9^uS=plFb%{l`bZ&;V?#mn z&Hc1m`iHC4LEZW$UQRlByAP#47P}eqMPR#|RQr)Z!QQ!fM%4l^de0Bu2TE7c8t=zaT>-~UWjMOlL4@BCIy zSaAO@1}hhPYdZtu-~YNXnExHmiOqp2ry6FD&2G9l6T)*nV2$8u@p>VgHs?o5w9gku z1Gp~3{CU{~g+L-OVats81Msmk%$r95LCTRBfk*HWdF zSPD&OMT-vxBO-2)&>}|4;89$>qS9e1pcK3|9GLv;lSP^Y@GA4#QWH#+(zNSt(rZ(; zg~FX(CEQFxk#aT6U=ddYM5}x>`8do#)ktXuR)GkrPaOEQOkYmTe5J}lW#nk`Z1nJb za`K=YF6nO0f||%7?rB5d*-0;)gjT^6RD$+$8Krq&;q2a)ii(>yxqbY$oW(X`EyS;} z*x8_ji4F|mrK)^6ZtR#>p75jC&#D5PIaV@aB*ELm6EXhup(aK~XBhbHp)*%|6)s%< z?FaUu#J@|fGWoVxYSEY~(XEtKAx&BDJ5g-CcE2B`=bJ-4JHz*vc30cGgX7D&(cA0$ z=JEX`lX~n0GC;0wS}v7CFDNF6LxV{q1xev@R2?6j;Y~Tk8VehwJ-_dh0SB0YpUIK# z2XL9cnCFH^or0(&9d*eO{!6@+mS=>3v!%zEkmksS06AHy6VNsbW;uDeN7&;%J!I=K+^^< zNOl%7R^d3jnpb8DwNmibu(PafoIqv){X*Ba{L-T?1dcg2o4*}+h7rIe+qmayh2N&{ zLegF_G$U}v_EI=!cquTr0Y>QyN6$vyC8pla8Q@Gij5}2tSPF}^E&!yo6u9j;Ry+)+ zPLX)S+@){TrytmKJj0@Ux)clBp?TY8-EqhR=1TocuZv$+KoM4dKCy3bXjuL)VAhR_ zftJV)o{w~mv98QeGl7*VgL+sBNNq$j0L17qoa7QjW_3wkK3w>lCZ-&o_iO$YT)|5{ z`YY8(`eK^~8419MCO1|A;eNDQe?UvBG_G(|T+R!=ja>YXuX4#bPEcjlcY)KxN!p;9 z?2u2eCrQ4wke~iRRVTEcwhw_e(RRmPld=!eB&)TQks_mtvPQHGw0&`)t%-ErCL-4! z_1T8AZB$Kl1X%0zBmh{hzXJ>C=feD2TA8kdIDl*s}N2kSWMzrmf__d0d^%M9X2o!D=FOo?}L>5*xm@(E&(_P2t#sLJ8ifaaq3< z<%;>xEFg7WHH2v+PDiYDAyfTMp1`dIpBk)HpSQCPb=a)fze2jqX=^aq;$awMYJ}%I z@C<~_!7;^f30haFF&Jp%FVp>uy=Zh$O-(ZX3i1pqUf5nWl2ZM1|qHt`~?O zD*&hYN7J&cF|CY{+CuvZQNTd+kP9;|{l&SP{q+jMBmZb&bERDIHVCBxC=H)V76>@a zbp51S{V?u?KZ2!NVIAu}Y*qc`@DQjoIgFP&{V_&Z-5f`f5RV=EBDT}7_n(Ipb(GxjGwJKeqCUstWI_&eR*z8;RBpI5EBe1E%pIek1H4qhR?ySROQ zogJ@wgqNhk)Um!PzNyU`5l|X7;XOe#>CjjIfSwUxAVK5iI|U!AJa~e?oqZBLloE~I zFtiU(hL!_AZRb+tB~d?WK_~hd(cZ&=(QOw6{hW&1R7O42g6OnCj6+aGVl z+O|4-`X_9^U8H4;=h(A*D75_ ziMtqn3S#b77ewFx8@%uA>Ehzhe9AIuC#IQzc64@k$1t(af=vGue`CS*?#q`gv=_#D z2V35@Y;@UC!`h1HAT29a>z_xg~9jU^Z&`K@;U%PA)J`XQy0Gn7Fp z`F8Cl>*w~Qk-r3I1+KEoj)x_4=&XG>mFb4oe)kYYDYj#igZ9* zt)OIlR?@jQp}ccwK0&1tA#EroM@>pG1f`8kr+mz7Lp`=7eyG^0X91_=Nb(@Mc{GR7 zOA9O(arlFzYG+zFzuO+j7lrdoB|^;xL_T4a@sD}CUM8OsqZ;a&wC1S#mr+5o#+6yR z<~X`@ucLYd`4Lt|=>Z!Z&F)PlLK$uitCd#Qtk2i&GpmRhr5&+u4s)8aUP8W~mqK1y zAReH^J!`Hq5OGK(18S{)bSFJ4HDuR}5woXWD+(T0ZyBBkvLCJA@a7u_eH?Ifi zCRguO?;CrycICv25sgp}C_yI&E@Gib?UiN0CMW#-DnYTP;x}XL1%uo+H_7|v_sVNf zu82gXLST@VM?Awq8A0|Q$_O+opEL6NSMHAEw=i|&$1P>&%@Gmc}=0L~T9(0ObTL(L8;OijnkrW$HFvNPC@ zG7Hj4tIwF-w9_XZ3>2Y&2ZV{3H!e+;Kxn@2K%w74;8~X zxmQ=ondXoXPKBfaG8*Agtw@y!xV*iWZI4*L$(E zYCmq{&h8=9ZfWTC`d;JjKQJ5K-Fgho?45QcNLazi(igfj$N16fB6!eN4jUE-cSPbq z%#NRB={Pup1!Vvo_WliTGJp2Z^O*J-HscqIv( zx#d0NDl*-|D1&)5o{IAc1eheM&@rSfJTsLrF}xzQk;BuJMK@k*#&}%3$Yt}nW_@`e z5JUo`qn%tVj}5VeAxha)0rZ9F9oIY>th1L(0>?C_!>1Zkq`HUUs)@mGT(wOtU%fa{ zkPNcBddL;68;jL31+o*Ktd_A64`tJ`yWXYDh3X*OSAw%(?CA_QejP?#fgDHaSS!~p_?E?KDMNCq78*8si zI_!UK$xewq!v9Ks@p45m6rmc?l&|QasKR@54jUgxv@;pK4s9B0+@1=;7`F3PlZN$q z<{+-s=pmd)s+iP!XpL2qouYLKuy>=`m3oV^EMem+k#$9}Q?E;m1VzPP1Y>V^|Sif6yl^~7Sds%)%Go`@1 zX|1gyvlGYqu{S=|zIJ!YEG!BED){bETRUPWAha(X!P$gL5|4Niw}i{=)j7&)Gj&@^ z#zLsi^UFh9Gk6T*OhmG^?Z#Lz*|>m0m&9*Ud{Aww=!_grlD$ZeOPIWJ>xP_S{mN8B z82n#uQ*frM8M0z-bUuF~St$%lYQ~L<#Q311|MwW*VOGpo()fD*kSp-A4NE`CzOx)GBM)|2&@(pqQWnV7aHfU& zM|0eRU1p^Zx;TaptPjI_bG0*d3IdjFeXMr=HH@H$i4)J2XLth=yz;*QX**LmFAve? z1F8470+zSopr%{N*)+mo07&)Tbnb+UKGNIfZu*b>uGmkxo1yjTAfUh^2WD&Ui*~7P zTqg;6z0gN|m@rO}iz^0SCEe8`ESQoB=5Y6$6q;3lYcVKfQtL!%oNypb++fxzwqNN8 zI8PGQ?b*>1{vt$Cs-SRK0jbu^&H)N%M$Irj)vD9IKTY=q~wMY`g z7#Z)Kdb@!SQ_np*t`zo^JhX1Z>tcB{LL440f8bZc0ry%ruS}!@bABmc7M1xw=XRyV_^=t-KYmuH+0{?t_`EZozvSi;vm!Em!2F_$LW1#4sK$ zc*gIwkOpTWV1B3htksst^|I6`bEc?N4Ul`MVRg@}L+I6_rN8Ssl?PO8^ATFHf6{16 zAv5zi$AMQMl;=`sBeAd2mddlF6<(6ir@Ah#c;A&?)w8W<@qh%hb)(BxU(ZKy3GBU_ zWCw{n!5gYIb;JQDcfRjjHx_qTpoWd-;Yr)c&KZ{v=*-}o8FG{CPHl#%te{Z#IamrW zYxr_cp46+~I`5T?Tw zIl{o0>S-AZZF|*2!B-MQQa_Md zz<8k@n+%}AiGFw$kbYL%?xN!o2QrvM{+-B0w**$E%B}^jhix#rbLpXjkU-< z62lV#Fy2M(R%=iz51rN7(gfB!4`H;|s!>Fo<%N1-y+o4dgn1iK!_x;k#1Btj?&k0( zYWvf#Y#(-?=X<;%*<4s-4TlPA+T%dsN&Dt!?02PYbUQrep-ce#8G`Zjyn6yevwN%@ zxia~`Mr4rwOLs+;tioO`|tF^%$lup@QI4}jRZiX%2mUb4pl-BI_Q z=iMq){=mRI-Q>ow+g3{ML18qbV2VGScu>1leWXIo!&<;i6h-ulj4!aIV~Zt#lC?(= zMj{3Qp78%5UtbiSrn-d;WX$tU+Qg)++objx0#qaQbJ#jvxtw_K^VjeayWySmri|}u zfR(W+N6vDAB*y+BH&H?X(_j;6j>L`;Yw8R*o9wWSWBFfqveq}*A2X^AWZs{$?m0FBuMDdvzf3B>ulICBX3_iGdaBK?G!5z}8rGIo zl{x`CN$c9rMQ6i+!l#8$MX7V_$02z6&VOdIr+5f>1+IUz2WR=2c{J})WPAcuKj7uN z75*ta#wvg7^|n2XTfKJJk-1o=nG{f(be(~84C)~1RBJ-%mK8-iX}J>>tsZi8)0cgo z?0ET9qMWDgJ(l^x&J$R&r$%z&sp+PMllbi4kSVW0r4>`mgtIQ?IYX-M7@~((c(;PG z{Hc`(QDdh-d!5NYH43umXz+R6l%c!2K3DVFad=quhE<}_!99DN`;hOJv;l?wd<}L{ zcybYciZTfsTcwB}BoJ<)$38(3%gJi@G+!C8EcGUOAl+GT?2TSn-G|=(aJ}U*8|2s~ zJ$|qDdQKQVohCD)exfp2+rg)giaXd~uKH=X(Y?BWSvDYf>hnLLL3!>{gp0 z1sKjO=1`Qq){^$Kvx&QOLsZu`xwEvw-<`78!kPi^{6`StHcD#{p$E}WNC!N~Fq&J2 z5_#QyAKU3T1huy1qfjJ>SKPoJk184jE>_7G+E4~VQZ#m;_hr>>ttbP`~MMc*FL{{ z6H%l+w=bwFXBFaAW+RUEY0=J&U!H=7+QASi)q3Y*Ie9z?NtJ{@ApfLx%1x^t-^n}^ zhJPOMsRJTay|{jfSxISWX=iCCnNH0^LFB=>Gu?6RqIbP`iAtuK$=g6jYEnaFBV`PF zl#DX5n#VnBMhrmTxQV9dot|P%B1P|sXr43kETC(G8izAOChb8(bPes|xk(dk(gG`3 zbuz%ksf#9w!b6W_1EWtGHESWy*%}5X8m`f;*ll7#utMyjbxtmxk2l)aKlTeh?r2_I zQ8_R#uXAq2v+(RBLHzXA`4`w~H=y&r(>W4~lTBP)N6{y3>Q?M$$bCU*t4GK($@lZ)K z2}UW?d1K@lmYTZ#?(S|4#<&p;URrbyl~}-w622@|V7xx+Y}H4YkW%xs#+mAq(JqPxc$12Sk5&9oo{+i&M4j6PgF`p(a# zQH~hZ2SmE0{&9-1ARSo(e0#^{+%0yaMwF2R`KEh-_Fv-o9~W^r}Hj$m}Xfy<*4-7{1QPMamp%X{Ff-8CD++hTKX%6q4Lik)E1`scOl~E>-jqWk7UK zRI_^#LorXx()CJr6Rv0@@Buktw}?p$?U4N=t0S=Y)3ou~%c1Y|(Myph66!x+XCH>C zDC5$+f=%b(o(~mrAJ+q0UZ#Woe za}y!7AJjq1piEqgG_%J`JyVnd5W6Me4*woHk0hsQzor6Q=pNPp7NTW;XaUI18Si}= zKjIhNfnJl%-CM*D6?tDhanVasl761vhhN`%b-8~|j@|SI2OHn<@>lx9U9&ZQoPUVQ zN9q(OzYK(T{}FYIGkrz10P!oR+~mUAzx9(cdcH&S>yDUctBB;P%^=9f|L|+qm%je} zp7uga#yls3nn@acz0F@Ma-YPxbcA{~mzKH;_Vos=#D6X$nyoxcGR%gdF5TGO^)pIy z0{V;h>ZHBj(bB2vf~ofFC;TKQxxUO6mfKJB5PCDZ)F}t7>@r)L%l)?I=knS zfpn9a?|K~muxJ?AdGykNI~XZptIHGb*}Ewmx}()CV%lnaxIpUYnwU%;0lac>X223X zJ>4xaajC%O=Hg?EuUQx-${alhstjUQ>h~4!kC-r5LrZ7cosNb0w}Osa_ysGBm>g9C zY3F?C3wdROah&u6vsM4zInt9KY7t!tQv{9@nXWS^&$9Kc-=t@SQp8XI)2gs0f3sE= zN`-|gY&9+~k6jbM_J*`)tdt%Kl{p1Ku#YNSf`V?xF<>E`M@4=kA4G7~_X&77MOh_p z-s6GrWFv7!Xq!@Z510`H=0)auzL)3!@#sa?4QPY69;zSx+yj~NE{gg=IzQ|Sh58|Z z`az-lOWD2y0m+o_ylVp&pS4KN5DdGD^f4RNVC;gqTLM7VL)89M4Ejy$sI-4LHno|)!D=gi02T| zg;M$(Km?|JWZ3V#g&iDP=9Tw|yCI`;`mr{?&tDJ7V*<1v`xpIn>fxN>Zr&_`Op!4Q zz=8xwQdLWFU{hXNcok&sp^C@@rZHESpcL@ie?TN*#uRda9$?!}s5VUoSf&#Ou{~5}A&ra9nJmkaqo$NB-#80Lme* z&{$(mfpV@|j9&v7E$iX{DaO}L;~Xy86MVtCWEgJ9jm&aWRyX_1!VIW`WcW&&D3%!= z?bOrAwC8Y#o?yK=#o&1P0wV@@@NCx4*Nf%f8wZmrb%A2$I(4+RzKt;9_% z!wVK5w|>~gn#y0?yeHrfXoja264*^hE#df{(Zj{T!p0LBlO^mXpd`nFMX}vrB+I3m z^0y8G1N@lyMIxPi!3#Mxpve9;0y_*H>IaD~{%-vQx%;TFYwC6^HL7~ZP5_t!q4>{? z`MTI`4$HsT)XR0)mF>4o;$dpn1ig9fDAgPUqgjrd=aBW={7PebC*6xyVFd_vQC0oZ z8g$Hc1Gik^@oCi!=xApzG=eZTFx$THmgW+^Et(jLF?62w^$O(b%9drWF#w&4Jnyu% zxHSBHHVpxPn3rEMV?+Z^cB;sHtQq<3VEeeN zQ*<)nqr<%(ZIEU!vmsx;y@>mGS1`6p^dKH{T3o(#s^i-^-SiiY@ijsR>MHNdW3r&q zQyfvWDL3lM0m^e-+snYK`tYu+`YSGaxo}-O!6@K$xR*EzpQT4(@e5^B#2Hg#? zsd%xPT*V*oR6kV#0^qOwl^YcrAk>Y{JqB8-nUX=4jMnpnSkVeH#@O=7kcsZ0)?}uD zs}&hyE<8#x7p$2lH^SDTW^5f=@>N7qz(#Bj*2TkIh&hYpvdXSpiHy!h*qaHyK*9?$ z^Fhkm9UGJnU9a`qS77tO3+6qZm5yxX` z&CrXMPaYd%-?epwADlbtc_r{?S0;}|G3dL{H&i6}T1cLfx_S0{hHaTefNZ#Wm5NgNQEPCrSD2+1elyqqY$*K`SKk;zid7o=A z%dPoUNE`UhOv(q#& zem^UOK3nx<1S;}tDp%w3l`U(QIUz;I29j2 z#PUx;mhGcosHIk)JYoorwVWOVS$U|ZT)q*!k#NaeRjG2$&jH>gATlz|1Fr_WyT8KJ zm)H!(6-pAERI^z;7WF;Yh+7xUV{k4$E93MiBHU0slO+zo!@Rc#9O7Fq@wZ&JJ_(Qa zw=|;^1OemlJ+Bw0TyDBEoC(CN5 zj_J-5mN3F-v+D3;Q|EaekI&S1sh{X=4cIuAyvW0Wh_3ctL0&&=ZvE@_d1u|`6-gwh z!KmOE%%ij2>=Rk?(VyH_uHq0J98@HrTJ8fVR^=DXKj`)K7|R&$Ev{%vwEfmQAvVpA zIsS~n(SseDS_{yR0+WrA?y~biCsn{ILlBblqS0G5+tDYI|8fiakmTmpEi@fku>pF~ zJ#`*@B^B9zb%_XQu>Rtt_m4JhI$QK2oxxzW0%{cs(K%zM9`S7nRlwoa#1DH{kGVmL z1`MsWzVr5jS$Sm6w~%sb;~rB&CwjT83H6VWDuXC-)WY}jfWnTTb=IXU{lN2lSVS=2 z`IFo>R;D;f+y9TPbBYlyXtQYBwr$(CZQHhS+jif!ZQHhO+jh^LKbd4QnWP@-?IiV7 zr@p<{Ql>Lew8MDr<-`=@&xXm+K@-_GBcKcNMXkL%r4)u^(EPcYv3gfFZ!4f*K=>AX ztFfp=eocAnv!#f(PrcvYesAR0jP1IcsqLu5dNM2-oreQJn0u{`am#2s&mq5}U zCuF#$ux57i3+E!C`5+3B-embti|QFAD8EIaP=&683Nu{J`=+L&cMV~;2t9}86p6$+d=D!j{dyJ_VxC*z=kKAa z+Rnn9kf^AS4aGWqO8z5v#-6S~W$Gagl|D3~)z0t|y;wLJW`6V>00L~q4dyLSTdWFF ziK)%LavK#;T2@L?a_ZQZ;V6`*nQuPlTTl*(OZy_Q(^7k{LfO$%4+GB~S6qJ&ir}N~ z8Ue&ITG%>Xas>}IPwYo|-F~4O!}&Tc1VbP$@Fl8xaQ4Z&bTu;ZoV%fH*5T(dlD8PU zF@y^r4T`5rdcR4OemDzeU}<@hRPj%J_D@2uUT7CAe6QD`iTksm!2!IXWEEdSTqyn? zp_e*sP&b5OKD?wTM*s6qI9C9tkzqLXP=4N02=Ktnr*?GP1kEn2b<+4uq!^-G4x~3S ztgWXXnFLy8)Z{02Z?iILFQ>rJy%2?PVo~9NaF#p?c>uF5HLSF>j26{Hx3M}T4};oU zzIPZXd@d{P6UCgRnOOl$X0(09@(~fO z3=R;{?2%)|x%R(Q&#ud0x!OlaE2nJJK&j+k95a>nD~r;lqEyb3TOSdEQ} z2{MmSFeZk;bxn?6bv?_W3+f1Fm*<>4) z%Vq>neV>S|91i;k(WexDfH=F&zLxJu?y^X-3Qv;cEw-37XwHd5;8v({9RKyYT=_Mw z5y1xjjTPf(1s^=p&CcLT^|63V^m)0CSp_VOjmhOTSUq51CLe)TsyCLGDnT@1KEdo zZ;eoeYVJE6^($~+l63otm?>Vrx+fw1CvMWE0`^H|;Zl(YO9o1D-Sim_QK0vn4}+Wk zbo*2B;A66PMQPviX0nk7;LSouMzMZw-Fs)zsW#wEg8-;fq8y-n+?TU;R*f^eY_fpN zbGPPT6nP!6<>@@lAt$q*VDFYQYt~f6gq@pu0v6WoNr4pW{&k4y7i**|=laHKf3&?5 z2!{%ps198NqsE}#f?bBepxhbURO8~EDmh2WS*Y=TVlW==lv~D)-QBdNF?Q|B{QG zbD$Pd?~QsUqJxoT1D|FmySHMm<3=QuE6y+j_e!zjtE2R&VDO_-`WG}^WcEk>NJX{o zHYQfUWrhT$$Mr^PswVGu6?kHEAe5N1uUIj(_nwhqoEG2?xQ@7js}#+``aATECA^DE ziq-9kEY=&F^Z~>f-UEu7gAvD>z=2bMz!)vp&?rFy>Y}$K`R{oW@`3C_5Kgs}MZQ$Q zOXClPQ?aVBtQ-NcRbj1l-Cd(-dZWka29b@A=pQp(^mfD~<(FL3=&;dGF1c!rWdzs7W&1s$e#$|79KQ3nTZ^#-E&Rg80Ndij^DkUfB zLfyf+=z%yE;V?JaphPnli|{6$i!R!+`#a&|Bq`jyxmt%-`m8_b)1WCng@C_@8tS$= zqfS*`aV1u8o)q&llS~NN(iChAVfq(ELV~tpPLiX*tYuP6T?`BvgiFj~N+UGtG7%rE zTfdor6&{=A;{F2R{rPz;)2S2I-A;CLwe64W=CC3~nBStd9ha7j)m2l4&o;&SM)jl} z%_Yt)6bZU(Wr1U=_u)~@WTC~df4Il7cDg}g|oiU@wMmBQ*N9~AHD>O zIcNz~8OQ6!t{w%U%c#E0k(gARt7S==b(k^F8gxhTux~-AP!LKDB2z0y^HYTFeIe<3 z*U>U=@QqJmVM0?yr`=pdbYW2YHPVK1VG*E0q&zU^Em=WdZs{XlL=NZ5!Hz3*036{L zG7=xml!8(uk@ONlE=O6E#HjL+CmD(fymSY(orcFe9RRf^ckycd@TzAqRL+b>$P{L4Zs zepnbr8;?G>Ue!ZtkCGMdVa-i?i^P{IHCStML)UarUB=u}sI+l&plK8#j$AB4Mb`yfU15C)h1w^PH!ICQPO@J1<8VAkI}N2YLc zK=@tXfx5gCKAVK8_ZgY}weC!aK`MEJrLxUQ#3Uz#^m0FnH3ybRZcaqiqNb_>Q;t(?X!O(#+reH|F{>uX}q*rXnGs$M=_roY{ltm;j= zt=HqtUs35#e$c6Gc|CL^Eo9W#7M}2GE!rCEHbx1bO%3e|?sX0Qu>uRQ19O#ODC8`F zo_x=A#qMm)<8k%Gj8XfUdNkm_(-^?4T5hah9o~Qt40X8oer2gb=eKCSjoTJtdCH0; zUy)tU!OE7zNk#&ZE*QP8UQ51)Yr-yOweHgBMw6uAVKQKPCjk+o+?G`2v>dM|JK`Wp zI?x_Ssl2&RzA|Tmc6hAt76+<%vXn3z*TsmbVwcM>!9zdIE?WFbpY4aKenX1~l*h?~ zV&wErK#=nQOdZW_Eys(=0914E*`8%4-oP$m?e)6_hBIq}JjxL~5i&RP-M=CcFh&Za z7JW~8n^Y>CvAPT>fZo^%d3#RAa+0q`^%Cl&6BpZFTlg%1LiSlT3PxXxGcIvT#45gPHFK}>Rf~%p5czW?U^GRN2u6##biO8*#Pnsjw{XikOvlSX z41@A=B`Ab5q=HxbfknLZlyQ6C=>6)JjQH;PZgw1?gYrM#lwu;3&NX_^DW=Y?|BeNe zD6|h2h8jnH)`cU2-B_U_3)q=s7S6MHXfkx#)W=`LyxCFZ(7(2nxju_TzFHIy&ZeqZkM0if^1<+-xsgaS6!ZZf(X!N?s?LP0i; z2aRI#2)ni#B$C~$+Uh&X67@5k3ttc^v0b-fZY&kehda;m{amVuzpL*Q7jdDH-Vma=h&T7Ej9#jWx3 zUvorfcw!vCi-oZJr;$rp%%{uVdcwB-P_tfai0F7M95k!`%(tglWILyGohKMuhj6fV zJT7>#mRb(u9Xi{k8y=5{hQsATQL{4(-hvxmN1T=o-EGD^ZbIX@>aeBD@SdGqprn>Q z)gkTuj;4Wq*Wij{NRBFYCQD7_p@G-b;FCa0#dWH4nd*D6KGCnoRP{e*q0#a!fxJx) zB~82hdkdTd2L@a2x2XhX^_*dm(2#L)6!HU|36=L!aUZ*_C3!mpDzT>;tq$TDomPKP zn?cxNx;PT+n1etTN#w$FeYzsB-8-OD4~g zCTzfxdk~2G8mb;&cPo0^v-j9pM?)m7fP~{J?)|-A}}WLgMDh!fV_7mI+3bw zrm8B2AIVuzAo^67m%_XexmRBCYb;A^FoU1{kyn{ks?jS@5p zN35IN@8gT){_oKQ8#^58bN4a$bn2>J%Q&WJde=Sf0;)C_=E$v_)^ECL9Pk*Ph!ql% za`C+L^F+{rgzK$2?L{NMS6Lb#%We~7)a?dlS6PhY}XWH*#Lo(?wZ6{!{3@fTBxM%+xCYd z`V~fXlV6#eSVZvYJ-Q^fiNp8G^=;NY{lNw>G4Z~LZ9Dn)y|E24s$%VV8?;bsyk&0v8EQO?&x-RTc+J#mt(w0kXWvs^*lU%S%4s2>HXQs#uCU|JiokEH|cUNb|wU$ zaNtwsk8di(bT2CYCa52ZaGVsAa)v0f7U?0BQ37_%Wk@CQQl-Q4D%7Fu7T2@)141l> zvK_$b3}g4|mxLnqj=uqAssetfwvSi5@vd9lmst(u1X3oaA1fn#Sr_n`BCw{qcBE&R zdUgnIv=rCg0t^GPVd4PWv5Q`SuHxJYz#@XLQ0;0umB_c!@F|p$j6(!#E;_`)m%xa) zv+K`0BbTE^%Ul{K?Dr9qeYNd$ud>ffeo%T~e3U;)Tu+AEeY0A5Fpk^s2 z0t_^*0CE}IfSx5c0c1jG3_g&RoFoX+FdaEyV^{=4cV@YOk75L)YE2Q_TTxI=e%Y1n z8{%ICfPC+g2qQV|z+wS-thoVj-2Rah9Fdy1d#fN9VSz#e+y!5(q6$`{`$FTn-Wzz( z6PwjU=PbXy7Pa)NHngcVQ+;%E>30AfUGkBoqGF?>c0y{IU~&mUMS0_2koc9sg)RI3 ztHBFSEj~+S4N@F~P$eqkY8e1Y6*t#l81rWU=2`4hJz?TF!|y9L-2UYSg@DmPyoG zXHw*RVPIaB^4F{XgoUqZgnAW*O94-Q*;E>GBdqk!ufY+%{hIERm~7X!jh0lt@#6fi zZ%{LUVGqBMu*da1*_Q{ReBv--1~PArOA$74_CBu#WS#mm+ubYWSFzPyw|l~A;|}Zu z%&z|-Kw2BX4|E8BDk?eSGIMUw8TG%{>hqQi(kaD4#=9Skjz-SV9)zL89Uj_=3h@r= za%Nf3qlCW?0ENJSt}rO_igAJOf`|~d;1&H?;>LJ{x^CMGeC)#YQ$5d`DTXS4;DDHj zc0Q1U>WZg8j6(Lyg|9~txdDaX6yXC!yZA%x!%02{EvTMh9dQjAED->R;C@QXG4r-P zFwBL_5Lc_9SOw5rru&EW@nN60#To3l5E=4N0I=LZJ{ZZt)m3w2`AB{IqhAFsu{?&t zOO0N1ju0Pw+%n&;jOS22{T#1_bPW>Dd5Y(NQcS*)M!>Yi@7y$Xmvv~Y4c56$pNXmV zgqn-DPA^POI}IcJ(Nr^nJ(FQMvYDF*tqvW~Sp*+_Ak*NSF~f%r}dv_)O+kTQ)apuUi?*L_+z z5a|wR@B{O`j-ixEXJzdOEIHH7u|n^*vYz#nN8{QVzBD1@aVH*)@bK@^e?4u0KHN}5 zj6tpvc;7QyGwApiRNAz;RAI$i6Crx;QI;#z`Zd3_T;TfSGpvplr}FP09PFzx=NKM7 zpgb!zq70cbP=G2l_D zxFsH+6fzRA7JwITH3(n}aB_Za*b1Rj@0}c>@Y4rN%-$f%;qZF>^LaRF`;-&8am177 z<1oXPjRF>fL z^&B}XVw=i1xyi^3F~BD#I_Ccn2TSTkyg-PX0;$OlRPho88fr!iX2c7y$#^zKf2;-f z{4!39a7&Ve$5zb&I~5JR;mqY(@H3Apo<-iF(Ow?Sh%u77T1-%91V+UAkIR({N%-P) zS9t|1&6EZ7iU9C+ur!m zBV4GDKamebte-n*ec(N#l#Z->uFFH4lt4d&pBX@PH1(25wq6EA2)&~PQyBkv+j}~) z36oQZ@e-dpbW{HtSL1H{)}_^p3jBgFF=FEqP!sO`Ag* zFIn8Y46@eWo>t9BVLyx^M2^mP$1K|H(doMant^%*?kA;aTIJ3He)Xt0O>ir^ikZ%8 z;LN^&pSiRBFAX^5=vi^MKd(8by@8HqJ@Cn^v(>_CCJUx|?^jb3wzM*YO>NX+fdwH? z%G0YQsV&v(q}s=>5#UPVxhA-SQXh$D;3=Te(2-EssTg0*j!&kKPQCbM$ zoigQurHUG%X|DvekTQ<15jX0xj~mqx17vg@lkvfbBo!BYoIbV;m$ESqijnLkI>sH;;}DCa!K@IFI==ZQfPt2+G} zXNc!tT&b*gM#AgDb4=t=+J0|5MXW$)1pCCRt1XPCAAVVr%W4y)AQ)KLETQimPRc+A zRO_Iw#nA#_#@Mch=7Xk=IX#mqc1ABdH<} z9oXCCUWuSL#3x4bH?U{b5;WLA;Cy`h$U4>i&=iWMZ122xs2(~Xr(hjk zw_QGXNP*0eu{&53G#wecs6|?hSps{E=-TfvypzR=tH<3H#H|K95d;Q^!yvBaZ=AV{ zG6V!bY#FxY9+m#~5x+}6IyK>#t;19#lAta_2rVF|Vo{N-F3?IjwF%xL6aAl~dO#pO zrU-`8I=Fd8h5-#Tu!T~oifuz=K?7nwF9%BQxBfp^+&*$*zJ|D z5nA!`^A1&t_FDUJpc&|ycO#Kg&EqoHj!xghPR`G(+v2!xC@oB5$kfkQAJ>W+;RGl> zxK0_)RpsB9c3IZKRV0b2hnSR_M>QxLYEn@1jC`~%);k)iSeIRZ7hf(U3B@0gOw9eU zKbXD)q24U>f1VUnNUuA2d30Lr6K%+HZYh<&FNsXI*Kl-wDyn)LRkn~F?OGoH1rU4{UYCE7S|lgN;11BxkHiiUJAspjvDrraB- z9^5INY=3QpZ;_`QrO|E~$iy;Mg3O4nOUV`hmJW0EIa~8IAXTVrb!*8j6JuO!yc(kz zCf72My3W-gi3M*9(;KL+)|G{YcFbnWQW+ss5y`*_RIuTRR}@x_E-Oum`Fy=j@>3Hr zu(=-)Y&Cmc@x-4!yr7v-C_1KRDy&#ZeF4AGH(!<+F67Tt^7bQFuw0np~)OzW8*` z;l8xZ1ZD|c5fLmqQ5?oY@U6)aR4`KcXmob>0QxnKOxwB{@DvR2mcD!-yfSWMc#%7M#zjAQ5DD>bs@w|~vr_4b3Nt;bFaBgp;Mc^C7b7L`=&*Q>o=&==W zk=x13H_?L5$3ljAbRv0X%o%ziPGUCB}?PD%)X%Gf(QGy<4j9`s4G2xm*(Mg7{Ch(o$fEyN4umG82 z*I|Bz9ob_aK+LyT|9mpeu1>=b==0#s4gjAk5q?z4Iw_t%C0Z&jKkM>RFi0Lrx_RG8 z=H+J=c?N8u9q?zRS^3o*u+&bxgqxt&^O4!*lg+F!*?eC`Bf^coJequU*$M)*2+U%1 z=V~c|&X*w!{LfxRN+-RaEe#3Na#c_8Mi&1E`6AiK;P^F9w9Ch~VbQ|FPa0sB;S+5x zBYa`)0?aSZ==TS?qg_a_IfOULcb>0;AdzSiiJLsQu7WagH~%U|97dJZ^HWl(d9t&@ zw;fgNUqVaGn)2uy4q87dUF=BpK^?)=RIim5l;N*fTq$I$gu;xPxg;|ag4;pOelBuz zb1R6xRfcnS<>pml*KH%rZnw9LpBv3gHQa2CiNyif-idX7Q;#Om}K95?nS&uo9@ zK*(^I_t(SpZ>!DfZ95=Ie=%t3lN+nzZGtv6%RyEkRBd~-WVOnw1*>UqPzn|d>m!^y zKheqXZxAxa2+ekhsH{@u=E1oazI6u71Q$um&NC5$1O`@#dJx}>d_aS@Wy^?;NW$ix zA5IAMd{z&itI`m*+w?O@IEOQQ}M1fm^jyewZXq#U{leJ~v9O^z{#xEO5#)%^e!GFwyG- zn2kz}%#p~cOC|5@Aaff2|ng-~YALKXu~u zL7GvC@S-JD$i$oiW-rf+ky93u$y|F{?}OA}em3N#pVsNwhwL|p-M7LucJz9d$jX6~ z6EsF*PM+QN!`Ly+krL+LM&E0frGoD^)#(z&$6LwPOo*UX@;}R9RN`50v#pRv%GA{^ zC-(U_azd0Vmq{q)a$8?&Wt@VuhauYr)z z4q+{|8GNmz?2k>hbMxG5Vf;Ml1XG{?Ct_0M6|6XuUBS%hwPIP@l3#c+dLjQWcvsAEiN@k+vZV#m-=I4yt{!=vw z8u?RQ)7AR(k}jiCrQiR;;Uyqkt>(oUKx>gQi&p*!-b6h&Tsc<@<=_M zXhKRwgsge8Sy5?2gXHMTZS;4TqSXsE&47BD7^UYVlhI1FU^P!IX|kt~OSEVL%OODop$3w(+$}eIu_&#z;<#2&q6_^xvPMrx+F3f?aB6 z=0P14qt4|eeg}xz=n$CSzgSgIS@xHk-lCKQN?mm304$*uzXV~Io|dJ^u~9d13IzqN z%YZJVVx-o!djV<+{!5@%i!yYfRj)1}n??=eJ%D=6y>W#jLif=cCaRtwI#OcWp9BKO zgj(iUeuhv0SMG}G;YaumvAuH&kqr}Ihw*hizcTnx&X_2-bo3!~DYs{=P_zD5y~!fk zO#x#&I-J~YZ7FikbP~)lqa);56k~&qWMT4VpQ!kkh9yCLmz0EafX=;BltaT1t{7n+ zfZ3(;2FCrM;BfOik6G~^or_;u>Al}a=gPJGPUx6oKO9(B74z9yaRGLvi@jrs?xwn_7-6ORES+NaN|4UX$hdxcMYQ*Qx?81z`w%nxV-WIsun4rBPG9)k)BEkU!x`dc@WnEA&x7xcq zZuL#pbvymjXeGK`89v$t%pn$+RbyAnr_nv5DJPfMvEY26jnL!6>7dp#fWQC~&>@TY zAompXhtYT=**YDtWp{n%J>=+_&^C{sAI>P0hi0_T0Rfa@7JK_#O$_#!Tq`gQeuy~o zHCnZD9JEr0&_gc}a9V9szFK8c&n_5TgIL)i9Rnd1jkyM$g`Jym%CKgZojMI9W0r4j zAUH8~qj^T`C1M}JU%&n$o1}iN@GA|ig1PGyrJ{ySLL^T(mF&52oD1ROe+QzFB?5<)g-Wj0np5iz$Q2G((xzUq+T#oza%gMM%=hu2BxW!ja+78_U4O zv@8e!hSiLXEwIP^L9iAnp^g}3o%OL(s%d9_33$fLuHHZAI6by7(q`U%$%YlA&y}8^?97 zhYW%#cF9}HYnEKgFsU&l_?IM0F7ZxK2|N~C1zvcLu#4jM*y&uAEek*!y`OM9@!kqi zv71ePDCl4WAq$uqp%1s{yF0!LZjYuHD>M>Jh}Vx{AmGb9k3fr3ht`@qTv$_mZ z6dElc_1vm)T^QL$B}u>`+4-XNj50M@l30IRXuAK%ar{7Di@%Juek-r-P*C;GA@u%T zChFN6|II`IwfU!!U*fETdx$jR_!ZWnQ9|&i1?b{mX{q+LY}u6ND0ALS)m{a_f~5`= zx|+$malV)_w7s&Yz~dMKRam#2494tg34;4UxrI;*%6C6TrR53P|(Gk4afbTTzkwM7i*5lGy4C)yt`Ds+ ztn8Bod_ah1|3uS!TTO?``lo)weckGVHh%3hbxfOxB{$sGhxIZ-%M$d@d>vzaE^g8y%IXW9?+$3ZZpsk$*zSuzv{cNFN|dVhp}BZe9?6L)bEPu-rR~e%5Yg% z(ETU6TuN{oKrEq{zZMyJW$8q`-#jB=-!#J!Pczzs3ZUE6Xg<~OMsRPc_~f{6hgMt{ z^&NCd8QxgU3_~DCKW5I<1a?YUH`k0ya#h6Gf%u6!6xaGu-!l=0dUh+r)W8ufXITo= zO<&5w<&01BXt8xozUshKCIw*_W2_c!kkgrfKCLA2yA(=Ph-2_GmFi_Uxr>pNB0YM6 zG(X*4GL`BTCR)@@Qg*gF9}GAS87Qsfj>J8NJ9GO2C7nP)5I*?_BBH>BZaoPkj#zU~ zmVG*;%O5m>#*8--&_do!wfzs)zus1h~KBt9RQ8RW*3yh6d8o;8a_I6h1cu?U` zQ;F}{Py*CYAp+-v9S1Z$rM ze|$NOqAzwLp2uKuN61SiTF(%|D5G0e3=n-*GlKR0>|A9WCj83m`nJj(!#z@-yjZom zHF`QuK&JOR$|?=NKtOpfsxfXDW92}gK$nsTpz+2aLQt2BGOoDwp!=LD$w*DJ{2o9r z)uNP{jD9=0RJn0!*MuqRV`V9yYR@>KUnU-ECBhDn(Kmx=56^cxV+-O|4r0uYB>BRh zxG{lV6`16)Y%NM~Sa+y^td&GG*>%!WUR1u4SEru!IlI#bf*n{RJn(26-;QT1ht;}9 zU6F>}*yBRvk=Ba@E5O$p+qkZE$DwLH2CL>tlw}hu_~(@?Bhvef`D4K+9|T@}ky-Hh z$Ny~K9|^pE6h&uO6l`0JS<_EjL%I0J(BU73gM97@^m+bgJDN;yBcFwQu#+ZBd$?1_ zD^;phK8E80nZ1k?xDJ^hsOZ*U8%pq{*h?QyD-hwt^OwH*vB;{3Q=j9JKLE`soETUx z6E}kXn2{04BUdmJ(sBv9=ms6%)9CVPL0%NqY9+^Gb`=y9EefQNwbrQX)!t^#+}@n| zZ-eLCNK|pwCcX{;*fOES&z6P8=nW0)jNCOHKt1u})hlKZ@%D{DZE`Ehxzi@)#Fn+v zt^3ni8c!eYKUDT14Cr>ZFmNSkrHcz-D@6TYEe{^)ZgUFUz z1u#2s=27YZRi6{LSW9VmA+O+PbWsCu@{huBf!7Z)Pf3<&;$%82;O4|rTVR!!?W{oqnPg~yn_?)z`SbiUyBt4%Y zv@&;c^>9`djUQe+j|05A7>{{o)^IG+<)apZYti7OxZzV@Cv{TjBjU7$4=JhwzaQ>$ zybrJxs<{syNauDM#N}reqjfO2-YK%It3aCXKrHvmOSIdJX`M*ic9t+yuOmZtb7vy` z?rHoo=rw1j5Au2~xt+k3$daNn?zd4w3FnmZm!)xDdsO&q&r9*=uM)_wNQZ}Udl&aG zbQ(!?d>nTx2YoY6$-z5EC0#Hl!OGI&Bx&HGlWI)~{%gzIESVyEqSAASgH3t@rE<)LRFBB4G%2v;jMMM#^ly$%s42@5R^y9tG zaXnIj-Cy!b_!2l1LocYQ_VhzYfYt|0^fOiafQqvF`Mj;0=d$jUyBAdNXxb$%DN?hE zSHZ%lRy#)G%HR&F8*RE#^8fXoR*+$zQk~Ee_UHzuFUo6`URyO)=l^RfLX&#gy-+VG zPhxbT&WU*dxhZX+!4a%G-j?o^&kXxS1?G7HX1#Z+PPVg4^?Y^FTf+F|9ktmhf7`s{ zI>{2fhPBn|3#X62>uDP`y*k_zXyyKt0lYcb@&vw-3I^y|9bqC;-l;S_NH&+ElGWbe zwJZ3v{Yp+Bn`hn#A`EfJne(^)B5eF1oBAP*!Ka%ca(9>#lwQj0n`%b}sqy}{M2Qba zsM!wO*1K=a2IwbH@$ARy{@e>CB&Ic&r}@TYy4#zh_9JAr(yMfp-8@vMC0i$?*5Ly; zOMAV=&;C>`XKmBn)2fm4M)2+f7*Y?eTtfGAP+>BtZ#hN8${8gw`tzsdQgUu4II`gX zDi(#t9XVW~007Pj{^1h;f2M?&rGvvij6}2MW$b1f>d$TIo}9mi97=mX5G_MlP>EzI zgu)fbZ~-)nh6P0gmUAJth?iNGQ6Qg)-^=-nMyxrUn! zJ?8bAqVJ_cQDIJNay)TVZ= zV#?YImf?Z0XKxF=-|%6fWSVOadaP=qhSBrRjt-{ZA5p&WP)B1b@8q|*G7;G&8OS?F zTBuZ9*lKsVKhP( zp?1&%*AngB0#eDQ0@74QZjv4+5wnR?6kw&#LiitMGNB?BQYS=Go=MQfpM}pZQ+gv; zoh^u&gb0h@zw#tJ>KKupBwd7!3R%t@68=a?lMM(N|Hi~NEyapYroQXNBAEZY4-*{D z=8g5>#a9Ipw=|1~c%*igp2}vEf$hI3mhJ zGPq3JkGy=dPFMDPj@F_|xZu`Wvj4zkX--*_Vr;K!h0n;Q$F@&SgB2~`9%qS@s(^b# zr-{HVM5Hb#X(>gNgybw`EHU8RW73|(DMt1i9hJdo_NKK&Vg2L$ChkH0=H_10TU_b( z?XnwDVz^%WJpi)Q5g(K$@BtyrAxu*gE-2H){E6HT7Xb(f#7}y4p{suyYp-O$kgT2tK^kKhlEgfomZ#ULl>M z!K=w~!x8Pm)Lz=ei6GfMIibsfl#tJ_P*4LUFPk6!CY6hp9PPlgA zH*1osRfHM?eKoSY=WqW8GFY)*5!xDF>j=xCtGjiXjIA;vO_%O0HChbv!PwGUdpK z2+}W0mi+}UtGu6w#BfUf@f)M;ZmuAY09#LpmZyJbya=1fCQTDLI<x)>TFWmY)0C~yD!SAop;}}GOp@n(@9wC`W@7Tod$gTS-NW@qC zSeFNoCIF8O%a>4=ayUr{r0S1M!~{^;l(ENt`GEkjT5BD@P5etH33985_uYgjDD2^+ zo)*OZF#F4k&P)MHWZ-u>xjER8pqp#?{v436;uM4 z^bk|>9+FEu)AA1F>6g>B76}T*XnF_PW_+o&q@8mdBH<9<%=_xiOn8*cJfU+3OttAF z<}SW0h`yONRXF<5Qf!$WERrkb4!t$E1+Unhw;@b>H!*{6D^8s43B@3L0jvdSg{1q? z^?V(Aju#Ox+7eP6I*4hWG?CHVjwdTfz?3G0Mmi+VyKn}11CKqu1#r905Hqw+dH^Gw zyKJ>3h0ay+jiHf9+LJQiW4`KdrBSUzYrW$U2exEWT~cV?Dgjl!Iz$ioT7Ay*x`;AdvQf3+-^V#CnY zO)QR^yLfIWN~t}_h`YPnTU)2|V_tjL_*$MC(u;0XEFAS2!#hA1+xUDR#tgXL_&~T% zvTDerJ`(NGZ?-x(^n$zl(ldw?>>*yY$KuC^bjdLK5LemNoOY;H(*5F+bEH>t|qx3RIBwEh#K+3j{=17X)zp{aQUz03LTV z@J}B$_LWTCN8YqCIxDF0IZ}*#*~u^M|U>}Y?7~MCT?)Lome@*>EBXBd`=M$n?@vNuK5Qusqu)|OU6`z zo{`~%k9XXSuQcAnZ(gs`oBFl+OCq!!U!S68=KJnznP>zo6Cyhp6v#jfT%sWLI;9qt zKp6BeBv$*TsnHemH?d(`tgK)q62?$lg^=}mk3SxU1O0rw7rwiAH>0nNBA_t?uL>VG zFW^rPORhPXVdv#pI)u}kA}qIduqa*1wcp?7bA2r{IY=pKiJf~gAE$%%{#kLZV#5H9 zV3uMzxUkC7R+ND8&+OOvl&MPv;UKkPiaSe{ari>m-neXTZ@*+s(670kN!;n1b>j2I z9_t+Pt>VDq9?>-ppv@ssP`q}UGPI*-OA{-{X@P`0#a^GRofmxnH|mqcLm$b*_ky4lm}~()i*1rLm9?A8Fb)x zVZ_7-CZXvI4XGJJClun0a7O6BHwQ^p`63MBETBa3GBrUIlflgOtxg>-i{Ux=Bb{8( zNgO|Cj*%IBYA|S>oTp{vJOFh%jD=`?2Q!=5ZdVB0-TeYGF5>5d5W06d#dSo;;jW-} zOU+N~dlO)0_vu2W=sBpO-6Lrn0=tq`RQ#bsFdG-Wnqp2h)9Hf3$@+^GoipvYy$?Mp zlm3YNwk(N-^r9=|)@wJ#(+!#5pvT=kQ<$lZrT-<*eSZnxr{=eXt*x|-j8!x6W06k} zN~`|1PQxt^fdx|Nmvx($>M=$;HOfNZ;1f#n8mi#qfWF!k2liowr63cAu#o zo>T$j|HhM!_MpsGHcG*Zqe`nuN<9Rc(bh+4A|av$+z~XZo%j9&p~dtkDqZQ|D%V5g z{bQj0Hw3NJT;pb=1iPT5SNXv{TcP*(GUmf|QNLXO)7Rg8leLp#lIZ=SwZV4Tynb?0 zinr-Ht3B($GzRoJKNn=Q{O_V#kdGTVRg9U|9~P{i~}XgJRA+8{ywKrFalGeX2sqkIghhY9AVy zW8CJd|H$8n+&wx~RhXOVhT93wnr_2;s@@BC+P_w^-G(xSv6l}NhLtG*n*Noo-#E&Y zt_J{n`L3|D%HLxJNAc0qJ^jqtA?}Z|sG58&)QF(QC`V|v3MW>x)jQ5~e-H5htc~;; zL!ZZfQ;1L>6A#^GVU>fM%C=gJv)zo)o8j$k;(O$;)K!j7xierwAOQ{YHR7Klhdhge zTwA#opgFtzFUsDrOSC9R7A)Jgty?y4*|vGhwr$(CZQHhO+cnj1X4dNNFR%L-oVE5o z85x;7Gosc;fNZfOX9CY;UwC_eLikZK;sFdN>RV;tkIVI@dX?`{g>qx0OxVpGvgusX z1tQ?V&?By5ez$AooleiMg2|K`x@<@FoOC!p_;ZI&7s}JD9}KfG&#B8sJ<_}W$)0f_4JmXz`EV&vH z26SHhb-(D4Jln+d{UHUm{km@3MIomA*(x{kX9Wv=@P&CGy@VQ&<|=bnZ6=^|ag<7k zsr>L>|D~*8_X+WOzQ*$U&iWrNgLy57b&5?Ml+Pgc6mkPwh@0dFcq3V6&U-XcGUpp_ zMofLVB5EHkLCER?GIZb~fNR*vvt?22V{07t#(%H@Rso(0Ae{O|K>9uU3XJb2VQS9w z`0-G8@Y0)X#kMv^n%9y-64>$09yVMe#a)Z$50x;n36ln$@|ifXv`;JC^{T&r+H^eM1Knr<>!c@U9+3wWpdQQ zlYJGb2Njn}7dn25Neo9Mt7xinv!YhEvd5NX(I52TuhD2a09)02An7iQxgIF>wKt-C4G z-xTnWl1{Y7mL(nyE`ZjQ>s%}EA5jDzLx_t(3)l#m#*KJq zJ#m246t>tQUn|!G?6LbpH4u5L#`>==KY?-TqO-A{hOI&oS3@plGf4O+43UuwgJzjH%lKb`M>hJhg^Jv#sX>6Y|7yBK2cg6I&S z5S-JbKKkHL1Of=I9eoYx$~JWLWHU_q4BOjV!Fq!6U(RQLFUo{m{UZ$S{sJaB-^1fKH)_K+$sh`Gc!8Q7u|Jqlop zZ@>bpq-vb8HVH~QzFcUgB{yvePm5ZX%C`q0DA|Ze?g=r2M0h=Ij}hOfBJ$+E{c@`AuL{Uh=)E}()f{7N*ZYvaDYREq>6EE;zh-j_0cxQo$6``RjPbZdhs$~JrqFFAF8T8 zdb;3(Tby^5=-b3nbCww-@*QkZ24KiT>u+CXWCmdAny)jfrbQO3jEI`WJG5R7c0CS{ z3dEcg5UbFIp%V_a<3fxU&c-Ly>oMy%Oypkhff6bI4ACyIbgJk=@~P#7f2-LHqIA*e z5%X3TbhkqH1?@1EvWhu5Atc=qGvs%;V1ktw)_u7I{j5CZu2g5rl?NI(gkvEi*L*;< zGW*bB6nVmNyf=AS<53YKwNOB_0~qdy-5fj&3BDEg{@2N_I^93Sr^(UTcH@J|zG2ar z#rBysu8klQ;u&hUwv8y@V&4Yh5^9Lz6J)1qW*bAkcY5*mpHtp4;rjx8_O2)%l1_JT zW<@|bGt03C;Vt8B-D!moeB_9NyjWP|esN=|i0Aj&1^$24@)1RQv4@(>%!o$-4C+X8 zY*1T`4IedNj>4b>cxBo;x}k>~i^2Z%QsgGD(#b8fLi+&!bi$zodUzW8IAtElS(__E zgx9@*pE2vQzRxDzwpgv~J#%!w#)La8s)g)#FvnLWP9Hm%PNW^*d3xAET^{;~-mMY6 zZUjhn{>%#!sH?x!x|8nERAu-}NYVwz(w{YAO`h7a{*XliBDu3_(rALXG?`atdlH-T#iALtGe zm7zS}Mu0Ui6V6+PpZp!9@E4DR_P``O|6A8sbnhO7sbAE~(w9#v?YT(?q^J|`r$f<> zQEJZW23iqm&q~u%>QuE0qlyM6C&ilC07gKWn|be|vMEMoGMEl7Ab?$`;I@o(o9HIb zFSr~4k;InVZEOB6RiX}U&f0*Lx5!Mu&2uHNyvu+*=$}B>l7(y@pl)h8h+%?6K+QP8 z4;K*60e+MsZQbJk?Z+(JPaXiw@uG@{MV@0H#nH!|&qrlfx*Z`5FV-z266mX?!8&_+?qH_-rqId4inex-ij8 z#$eJ>9|`W|V)tt;;uXR#k9_8^J~{y4&OC(qR=!+=HG*o)6x(c|>qN#ztmMK@tRZOI zl>!EhAmC`96Lupl^!QU7N+e-xh-XP9q<(m)?|*{FE-j>{mQA8*xrIdQrg0k+FPW+{ zXF^3bCzuxHT-PIBYw_~FUMSLQRA2x!w<*Q5TFEZ z7g2NX8SMz7X_qrn zhH*!~m@9r#ppjjS_FP9E^l`aDV&ure-9-s6t%!-w za-n@3$@z#2J<@+d#|7fIGj%#~pX#du z;9EKzZVQ-ouifK*O|LXfuQm4Ip9O$EK_BaPvAGqZdjJyV0V=M?lO}x$ZE?-I;=E~I z!a3dL#4*&i^aumWh;)O}S3#XFTP#H%MI9ANN}QIIA!qL3s+AiT1gR5EuiP|lR68$e zooK18Cj8j*Qcf;w4`dfm^N~$==_>;eFlT9P>yx1p{E9^Vm!4ufhpS)01{*?)rz)2i z^JJlCdVp5Kl7Zgja~0((woSUID)YH7n^TqCr_-P|)a$w=GJ%}w`>T^4ostz2EgAM8 zq$85qOgu7!|7A$d#ziiBD5Fe7a_kBQZ!wei2jx++ok`-(RUOq}LTC|?wa3SQ++yOT z5yoS0bJEAkv-QA>Ff_g~Ze$JCFnko1s9k1^a^7B|vcuKX8e#8f7$f*PLj%FdletrI zEJYP09-9Yjl<^E{P(L5JD$Q0?>dk2kAJp=EJ6J}+MR=vEP5!_DVL&&ikhh1ulMcb! z#{P@D>6glt)sjzkFWilGXIm>tz2LlFzC(W|LzEVl0z;f^HKdV|qqI(J+e0bHL~)knvdMj@c?;SP0>`gls*7x)qrjO&OYpzEx~4@zMGzHs-G6ls|~oFu=DEaniYTxb>*0=u*BeIxl^r zh@amiLOw%d~#(iH2Gk-|`jp{P*|G|!Z?O{y3aJ}i6Kw;kmr6;c?vGx^Aw1oQ)0 zjUA~vbdRVHEC^e5nI7h19QSUqlU-4FFVN|_@MTv?IU|@@F*$qvh^NWWbd9ua>AbbX zIO6;w9NCg=o3UvHjH|{K6(|be6Px@K9!bfS{|SBNEg403I4w<=A1vy`{R1nXjkUEl zp+d%>(k2*OI;XNh*gZ8$1ve*O%8B>%4DtG6NXu@ePQVAIzzT84uOeD$eaQP?!?C40 zLQV0*3gp|HnVFM+upW<8$&DJ^Kc8_yLb3`#M7@!PS2JqeQCSbJo7WnWy? zEcO;UsbdUtj_31WP6}6A3*7*)=EHVpnn6#Vx9$Q73xowD|F5Z!6Q{ zvxDjFY*u2UyB{WKy4e6oLh`z`uI=5^O15GIY`4t+R8SG8k&tiWXSJIcFhW$^TG$Hl z;WgP$?_g`7#bECBg(VAlxV%gjlp*LbaMarsE1zXsJmC=GQOGZ=wbS5}Zxq!sr-_K1RnaLhVKHhXBbYF z-B1xGp`(kQLnaZe2$|!?cZW|}wT_ea1z7)fxU@4Y4IO61@=)%*h~R4l#sT2W?>|MV zPErw13#K--Vw@LKWfV1p6{+Y(NN%AYfFj4g9xLQs%jiPzg11kar8GkL=e~c)hYjaa zv#SCQryUomyDtx^OELhb%ZhGWwpVb}*4*_U><@YmLBA;NV1_%!G=NUXD4Q498wWJVM%b}x^ZF{634 z$9xTdBE7*?0AlnNNg3$HzckSXd-CC9j?93RVgx)N9S3Wa-RZjl4$j{<9fmqGbw2q3 z@|C{y4W>0LQ3VsC2pvAJ&xs3i%Zpq|6)jiShlw2>KJRz1wLVQdg)+s{MU3hA=69wX zI-2gFQGkKnuR!KIzfBJeta({_KLpu2_mrN5-?7BoItkmc3we0P$na|$$XWyhLP>H4 zmaRg=T9`PXN(pw7*G!_lN5C!57mVyBl(1eJYaWttJo7RS;g){aZs0q63<0S&Y7wO{-UHazZIZ)Ja>U>FbR=(b4hC-u)e(- z=WFuCPrYw-y!Ktgq+BMN<`5NQ-LW=dZgrW)1zwH_%wpB36FH9dA}-HJG3#R?)V6cf zthFh^$qVdq%?Kg53JPZnqIgbsKGp#(S0*O0iW6XBVZhKBUT@BDCf;>a&QQ*OAB(~u zfMA~_=Jm`$K>G*^*{sOIs|5}z0WV!xXiT_6hCwj8do5v+eU_`bUxdiKIQ86Xx7|6D zwxX?A>8QF5y}-|OlCco*Au=t0X(A|&sj|O;66PGW zssf?k=$k$FMxB`aQ(zEP+9=hL5fE@NIOmWy6iSQGEp}O#)M{NeeQ8USdP-}?tIOJw zxo@`jgqfPJpHD6Izk>2vB6RdrQ@cf!N!$lRk|i4W-)KFeQH%1oFXys?g_W`pl`-t3 zgn;nMFN8>|@7E>7=hkqrG<}60hwjSLfR^9k+N+;08%_jGFEPRKxP{{~F}IC`8vy-C zxIWvhgij(Fq4N3T`D;u_r0}~w`Bm{Z8$ShCKy3(J#kD1AC`SvjjIyOGA^6@$(W3|H zWa=x1!rk%%%@pj$gR&&Qu#?W%=@;Rl)H-HimT#ZCN5&p4c@{>8Q#E9mqQQ<>Wq8NQ zKTJWtO_vF9FgeJL_>}9>On*a0+Zk|57&l8jNy5oo z-nm{s0RrF(p{by+m04^8jB7gHwH z%3TN7F@8~)oiG()jSzPgI8QTNwQ-h(AHf z1Lm4u2yD(&Yb&c$;vzeXWD3TY?|73vTVWs7i9ZX`G5jXnc9wonj605d1c8~Hf|p3zo=B*$0cYv=XQKR6 z$VwTAdNVa!urqxme2?qm)uahYKWzjY6x3<0feeanx_!V zDT2+)_(jfE5A|em=!eSOa3$!!vlXZM>|GLcjeW8R3krH0^f@*-tVf2pdT_Ww3HZel=s8F&)Fc>PK zR=Xt=yp1oWCf+IBqj+JOr8~WYOm0ZfUJBc@RivVPFT|PwJ$DU6#RPxxA7X7yD=Gr% zon@09x^l>d;RZdb65yY;UJUR!-Rb0@yW}cHOlM51?ShBd+Nqh_IA^v-%R>5Ki$(jA zvGPJK?8ZTI2gNmcFq;@|%6=ulajjD-Ro*|>{lMYay|_Nw(1>%EN@H0Zj-|;kT$qU8 ziKCwuOh_2vGHv*@L|7Png=fq-pH%0LVqtz`XzWql*QAv?g}_uDD>0<_g3L?4hT!jn z^^h`WD}>5m9I;M;=Z3)V%qX$7&R76LoC3`@ZJ(l|kG)Bu+4{z!mw)jJ6V zB6*H_LcFoS|NB!(Z1jl2Iu$M1R@(7+4cFokEz?z=m=*n-7=(sgMbsK$9i z$vs4aDDsj~oUu_e_kpO+SDkQu`skXJ$aRJT|MH>Oat~2<#sgEb;*AHuG{H6)~z6NCX zd8$Oe`6fTyrBJ2R7AG!Gx}0_87dpY4FBb~kmR3}c=G{Ir=ptZL+xWJLf|BeqPII4t?Kq#hL!@RLQyQ*zNwb5kYyrj9X@ zETC-Oy0fJP0tb@p&4c4A-TWrKO>nl4&2Ob3?vJZ&8LX+I<2oL>Ga$pawbi|09^>51 zaJ(*a%$-rD-+kh7Dqt>q-NpkV@|+nsLRF>9ykR5SiF8I^Q6;Kyt1;c7;r{n>u$oifX3$o@{_4l zQ7izGB2!k!q=<$Rdca#*XIyp>CQ?M#qaaek|v1y<=~^}o2{He5O=o?0(f_KCJG-xIprftXUOl6iN8wKvxWgj z3a`>{{23mA%o)PfHS#Fs02y2jUfO{L5s~KH2e}~bxC+})u2X9gw}h3j zhX-c3p`R7#_lKbjLeB%^3Tjj{m_|_RXi6HNoltInG6_KDAEj=0?wOUgFYLXOA+^EI z@KNg^p|S%R@uG&{MPDZ6Ybm*aq%M$cGQ=36wS&~x8x3nQx#p!Sw*S^i!OuB)9@}km zGj}PQX-7DZP?8He_ANyMzoQ< zDCIrSE{ZN`PBc*dc*}HUk@wHDHqB`+Kc}o-e&dc&T@W)}+zj%LE@RV3k(I@DI)*nq z$=jj)eQ%I1Q89itu*dk8diZG49pT{sWL-N^VgS#wJ!m+ely!(f-8s#*uKtVW&=;w* zZFEHMXalhcRL#y z2Tli+ns|aJB71`0agf>rE%T!Ym%}MML1tu>gNLu>G>H{r!g7pPnlk?x2!2#yihpa< zpMdF6`#Wzlic36wCd}Eoo&9wPSWUrYV(%8| z^?6G92N`YBi(BFxEv0Lp*eMc(1I4~C;8KX{A}G<~{!g#(_vK?u|LW<2to7~_Xmc#Q zI=!T0)gxf_Y!C7>JLn=f$KeMC@DAPe@~?^IUowRiAFM&TcTcOYZ_)!*!(-5hxu}_PjcZZK? zR`g@BWm~lmEA6B(J!pKhXAza3!su^(^zC84ZUd<(487WY^=#O>yK#fe{;j3PI}ehK z)_{1@n_8SdK!;c1t1SwmoJUz60ES+Hv%-$=1=#&+%-Q`n?ib;eF+RJrPDkLOE$P$` z43bM>Tj^Z2stYXZ*c7=nJN!hQh2^Ut+a7PAH=%=Ahb z;!C5+WMk3~H=<+C`<^tMB+0L@QulH76pf5bm+tYto@AN~1_y>YVmPb@8NH`k{H1)SA2bJtwoFAE23}%k(+Mc7OtK%*WIh`eE z>;q4OCPxMC7or6GtWa-DH2!{jTsoBw;@{-bKfBE-t}`;~+Xqm+m+x$L|7fB5s4mnp zY|B@{PJ%Ffar;-yio>Lm7CvL9B{ET_D(4ux%(WZe>mb&)s&29%bSr-eXv&T6dy*1=A5eX}RM)9cn z2achQrKPc<-cR9M;B^8OAevZ7Gy}bmG zocyI3y(!MTVO6@hg$?ykdFAQT2PcqQ4KSluu3n3t0FY<_+YOKdF)~39PypkYAP^NI z2qG0T6BDws#bE9T%@Zm6_>xOZ(MMx{KH0N4J*>)S3SfUNw?f^E9j6zg^{a#DUqU1H z*29v#VdP zA+CwK6k}b8>bNvyO?>f0%8Ph6rC{h_`4YBF1=K#*kj6jAE#C?GnoMq(kb{W6_)inN zD%CmIRmt6$O_L_x2=d0y158((u~8Ji`lDi@=7rbv zohv2F`{nV>x;}lrv~!90^;iq=ZP|rOAS088o7hV}0Qz-0D*Q?@;^S)b1>B3v9@7Dc z->Y_d8TUylvv4Rz`xR>BUr)9PCJne6ipPHy`825JzW!H0+lg}#bJe~rac74)7=XuV z*{~5W^?nSC_#eP`J=GLHqGpKQ4$a_A*$wa@PajxE0RO9Y(CLzil#V)DsPi?nsr%h9 zhM6q`NrVpQrfIz1#$^kxbV`4&iXBi#QU`)Z73=;tqcRgQ3wY#o+!^vqdG%3up{2tp z>%Xe|tP*y2U`y@BkFYzfVZNofV|(@*uuC$;L_sl1MRXFe8di)_*^z%(0{xa`7?m8e zkKt48UiCe4A%Ct?^1oGyT0MR={Nc4s#5*3GnY%LGChz5`bT=yi_V{sZ$JI?^M2%~N zCd%p82#bp3jFW>7lW4e9SVVNQW{Nn5Qvc;zfp5fADo-HatzmIyEZx42zHAQv#F;rP zkg+I|dw{h|Q~`RxAbsJ`^E5K0sW^dUs3lv=2j?)4ltH~e{mKz#)U`_~n^Z~W9vib- z`^kVEGG08i^Yt;}|HY|kW7m*z051yJe9?+y2Q%reqq#3PN;oh(>7nKZ^6~;-~z^GNtbl8r>)$M3g;|lkA zF}wF}2FO&@_FAu=5qc>yMX8b?>`Ma-S^z0>#L3kT0C3DQE4|l9bV9j<;$Xa z+UpjYzZOq6>yiV}Qr>xkmd3`YLr17cUa@~H7O zT)L(RIo=SuNZuzmkE}7YXT!H|N?wo0$MKdYeEDqgCCvFFt3@V74w>9SFO8ABk{h?; z>CzLDQRD3d<@o-8bAOHDv@x>)0RWJN1^{6CpGTyLleM9vjg94h(32eF*Bo*#O*DV=%n3E~uV?0SnwOfYW zZ%5F!q(X+OE$nTij!YWXNG~hP_Jq}wG8|)jIkjh?HU*-(nTJ?a-NMAxXarO?x|FRV zoFAr`TU&DgzqGZqMsIdV{KuUI;5z|Vn)Wx`44ocevYP{H<#hb4jYf?Aq+9wV$ANhIhBVK&Jue|(>HM5|oB4tO8 z-($z2(q~wR2)G!QYf#Ff{z#ao4sR|yOjf{B@`Uw@4Cf3~(+g5k-WM6VN0A!RivU7t z?K&@vt#4@T6#stryl-F{n;{$1-RVAgfj@!k83h(F6fIrh3 z^z<&1TN9TS@-)LR;E=>zz0_8bkp+2kQ7*X6eTNbID{++G7DD`v04^FbK`>wmW8Cgx73b7lEB1`5~bY3aPsC2FW z<-9*(eitElNOl$?mMiF_qsUgBOFyr-piX5cBia^=id|j9AXs(M-U*X*7&C|JdEt(>^ZkM=6af{Ss2rE_1fr zR-bCoE?Q%KbN$`grCz2S)s#0_4Q51L9;K}7SAh`N0aY}vj7*#t(b}K>S0x@AkEEP} z`HvFlpR5P>5(iZJdV8O`>|1^_KJA2%1}nCVCslE7%$s=GabB+Xw?~H=UAxTN9a2+1 z_%-aCep2bwW(AJ!e-zE(7hpa})*;+12I z$E63c3g;iM1};`DuuWIa9o#G&=0hEKLg}5-GGhCro-u#YW^Lyid}|gTF_DJ867#|k zME!*EBK(FSyw`6~)J&T_c0-hIkpPDd?xj912L5SCcC}cE@#(L%tzg_d7?X6`?*w5E zHE1miP}NS_l&9NFAwsp-OUknLJh|QmIy;hXL@<@abNu9hBl=`>5zh<*mUwbUFHPii zAWU}bqbA}j*K9|{*_K|KC(0mAKL5;Ys*`;K|5rAV&bhj>`AZH_ApTd_W%gTE{r}jN z^jlhG@FR3RP>W0hhK3e3ri{kZ4vE9Zm6w}4R1kFr=WT+h_Ne8L)+?r@?9z+v_u@WsvP4 zvId3xCJCw@)(;ak55>Z$>75cN)8cgCkmAvM#lWk=y?^Lr5>p~&2#U;7p@_QMwpLxB zKB0@d5whBkw#;4bAyR`5sH>vR1aJKJ*wbv?CPV z@toL5S5DuMwvwPjgT{|gC}NA*7XrZ>3~s^U#(_bIem&sb7zPh}9-Fvu8;TKYNS7+! z16D=p%C2?KJ~Z*7h)vj}QD>}Lk*A=h)QqQQT*yxT)zi%d4hFLRK7nPLGQ`@_7*UVX zUR+M8=Gn|0z1RYnHwP)AfguhK!ck1lJU;rXgR(;#Hi0!dpD`IGn1Ii~O?HTuUAQGe zhCMHZm99=beptjdur#jEVo=}t;x2jLFO$?A#1hTIjC*ks^XC&&>)Xpv(sO)^BgD|q zwnIS7*uZO`zzU2O+WeI^cOcHNuz0jfL?4&Y3d!r$vdQBy+PUJ)r4c+|V~H!;CxV<* zas3lZDkuzv!*UdogKLMQf61J!ch9TpN+hW(^h5j~T@B~+)i=iT*L-?N#ZWeVl0!ZKzD7aVBwXN-t)^lQZN06mZ%(7i zyVLA{OY}i;({v-h)s+8lvZwo>C;I=`clgcmMF|tpzby#imv5+kZ7Cr3Z(jgfEIn4* zcL+{1HUYg^)+|#IB<(Pni=LW7?ti|3>C4!X`A)9lIxf+$iOK`TqJYNk&OnkQ{je96 z5%QQG#w{hQ{n4PC6(Uft1c!2~sJG&8wYpI}U%j_(w(&8B$;-y%sQrfUdS}Dn@)BmCe^^E4#1S5<#HDV zBoV>!#Xy`&=@%m$g_IyN5(y#=(GMCS;@05^UE|3oZ*E^vMz&}`*w3Zl_Xx+sQGfH$ zyeZcJ|ITbzXvFA&(V8cBTNvt&{~K*|+u^z%8*@$mK3&tnLf~nV8HdMOV1$gqUF*!Z z2gJwk_D;k7#4bc|yo9j@uP3G#_2`Oqc-$4NZ7e1ozb^Wc!9>$bR0d;t&3h(^!@j?4 zET3?N$N9oZgl1VG9t`-%T`6;ql@mzgso+zd93TEjDZim3y0*TLX`MB1>S>zjXD3~=l|lDa5Q%Pk6J8ASzdO79>M#jhJ9QR zsVtn#%0u6RZFO)L@XAkoA+UT@x_WSTwa?iUalgmGd3|YYUgpscV`s}HhcD;GRhimK z;J~zTvD}|ola;YW0us2hN!e6V*@$C8@*WE}z@^hL{fO$rAQt|(tv(8edix)g2e)|xfFtl*ipG@o~5{x@SaS(udy5~E>hURlcmlxz4tcu%esUpo7v8 zP6STXujZ=B_(}k`@Qi;kuZu|94l9+Sp0oSSRINP!Ae=p0i8XwQz21_Mm~(jKk#s|z zp8_b2NwoofpbudlAe1AgQ=4Hvz5UpmnWJ|MiE+i@8US`yBlmw55?9vJq%kc z8yY+O=QT3zSOGYHdIaGYo}of)W`^xvE{x`3WnhSy84mOSg=5OlSxqi}03bG({-+chHTVYN2kNsg4C>ah=8AuXIsGsT z1G#P1*Yl3PwLSma8D+0-k~{w9pH#&E0b%=3XY`+X;azI-za1bL@0l8ed!&!p_EU>G z0BSg{++JJUb^{L#Fu}012n|t25>l5C{U5JFqlx${Nr$T{Z!v?2PqDa93Z^C%@MgvN z{s61NpmEB<9XpvU695UZiBftKrrTlTh>Ksp8L%(JKjG4xJ$I;T*~u*141uG&ov zT%6cX0K`r(kHvT=1@+ox$Y3?E`A?AbTPtAvzS4qizq`5&c#RW`;EJVl5~@_;RvMj? ze8fjv@S7GiIfxHeVl4WBOG3v=zG6+rx3m8 zG|p(m=yoQMZG?{eWJvl{em*0nsn@vU10pBJ`Isb1q18hfp$%4RG?L4^>%5DQk8YB%4@-@#;lM{Rfo3;oHD zkATW`iJ?O>R^dMimEPlE%{~*3Z4=pP+2%kebu~=_JmBmdb!y&-D4r*X7}RKWt0#1Q z8Xc3nJi>ViS(?5sj?p%d(0iobbEEGc&W|4_BPion(gR5_cI$REx5{U)irh~pI$%WJ z&@yys`tSteCl#cY8XX+z#|54@ct_6iY_wBUh?}(PeE0}v0|O&f>gCtR;F?0YZa}KP z(iWZ8J059sm*M`G{~*xfL8tA?{hm296KW2QBnKpyS~Zw(x- zh+X~xe9L!uK68LpuE}<}6a$*O(Gz-VwWy3<#t41D=Y? zoP@8FXjhzZ%r2K?~5p6Ejo}m}v0DeE6Pwni;a-|sEf2gcs2MK1)Jk6_85E}gI z8|WVIuvHdnI#bNGB9-kx(Yal_)C$8}*`KqjS;h$>VAM;`lp0C~liXZ3o_3@x z#`u^N!|q2IhZT;-;EPY_FAn=Pr@>Unw;KMrcs#Sk;94_$zb0E^uli8$o*UoG(5%oB z$&49@kZqVg^@A_s9JG2B6t8-|{Wv|PeJ4-|Zx;ueF?}+^@)ViNUmJ)(tTC-D9V?*F zW^pGdNf=%Wt*a+yReu&|Cb#2vg?aJ3i%#k}b3VTdTK1@&_MED(9D-vP%ZL#ua?Jtc zx$&gAA&g0edc7-&f~I-Az1`ixpYv18@ei90a8crC?w(^jB`fF@LY;X4Zg;%rIX$LjG&|!>i-Ke=@5LXT)Oxk^Z?>vV1RD@c61tfIheB&c^4dpm6yiL*R8r$hZ zPZhAym)eemr!Bnf#{9x*$Q1A*>E85s6k3UkAs`l&z=J6kK;op&CJ7jqOR(=c^e^h; z#Es{l^22n`iw?DwhfxXRECQ{rwy!7!z*S`GV?2dmWfs@4-GOqtYKvo!E#mv`P-MC! zs7Me~;JyA)BE6R>1){y$$-ie1W85mfHn8s+2V&|pL@Q*5j0jfUm7V9%^6z%R+(Ai< z+%E0hkm#hSlJvUjD8(EqUDhBT`Zx4_9h{16H_kpI)ZX+zo2@O>&5n?4#m8;dx|**w z?&HmZBK%zbsf3)Ps!Gs!*k5WqlC#+C$M5P((rz`XbRa#(KA0u|isvWBl}UCS5Wk)o z_%=zy2G;v}^@=NFEhAgjCR+)|+apm#kSVf`HXr^{2KsdPrqCdy!veA@p4b+MqTz-o zlg8**i;4XSLC)zJX@B=YUpjRZf!sz&GrS}3*3>hQ5#D$um(Clanneo6JbfUwE=mt0 z*;TpkA=}rc_Ke)JMpFB!cZI!aLDoHQ3#{B&=k>2?!FwYN(9TF;v%ghFMg%w`j3T@i zb6V(-K3Ko95_3+o$aey^qn#oa=2a4M(T6U@DoEomc}LsD@cbmhh% zuj`VMCs{;g;q<9xVSW0VA$Z;WcPjk8=H*R23q=eM0`D;A^R{e-UkGQO`@`-7D851j z3eTL_?wZlp>-*vntIs12>d+jnUIg9bQW=ntxW(GX4lQ0IY|zGdK)m~ashGJdEV#o} z#fxT+dYW+tS~f7yfQ){C{wtwuu_*c_)&KzU|9hPIe;>=Le*5zOF*fj_iZGQ&7h8ty zzUJ?wrefLan+LIO9ik00RE$g*ek5+cez_78Z#m+;`A4sPFm7l>^gQkn#D0wJ)f+76 zeV{%#dsJ8c_^&}gEdh8h>?c~0Pax!~R~QpQ#b2{XIjl=HCXweO$*6+S zbFYzfop6ICwTtpvg9!2VVaI`#!L!jf!SJG>o9|E6s-$dTJlcWJRc@IgjtpEs{x0Tq z33UFD?7gPh@p7dx^f^0>s=lHQVb&jemiRCwd&6BB2N&V!YgjDhGn6U#A*RYa85x<+ z8}5Tc@pm?`N`HlltWjGO0M|IbdW*$vR%OljC^aa`%j}@QFXmLl;8lCtLp=K;{kj$l z`c?t3uN&iSQTjOAq+ zz|7EW2=l|-7l7z3|0K2{Z=E8GZzCqoi!Q6NZM36{HLR6Y#HC=$D7DEIiV6vpQwi0( z5B_rYeZD+8#Se+peBFI=H1YM3cM`hs_VZ%tD{ja+=r{~e2C`pD?JctCJGg^Y_w_eX z+4hcf`S?q3^tMl+f+JRjfN3%}^>51L=xt40mx?=au8BcpYq;nJ5*fV`M6%pHXuOdb zQ6sCi&ehr;;Pn?;b7vif(Vvy_rIFe3BAaymXa9UikqwN_#Al&m>%`O~9B#(8VOyS<@#lF>^i2>S4%{bN>5fCg}d5ig+ zi!{R~?>L7e6`hTgC$JKd`FcrD3G+ZzL}T?_dOS7Z){&R3YnM1{fILU`E3m7t$LBrANFrI;3!IhS|SoEyxu6W8FHwSjD_rDoy{86e>ERJko8!t7A5D4bB^vGYhI z_;&3(g^qgKznIDEdo8Ot=D$vM1>Je5T{4Oy&31^F%Gvcm`}%J^meE^Ngz(>z(D65t zng4HXxBtWz{&SPsNkQ6T;Qs`2=u<36{kLx~*jFpeufZ56Bkhq8AH5+w@OHQTmr+qP}nwr$(oZQHhOyLa2WZA_nY zCuYt)F>_~bMN~!9OW|Ry^{+p_%nZgq&}mv#NotB|kOUDpV~P>wfTRXyPSKF01x_{g z0fpxk%(_)gV(i5$SxqsD@!BsxUPI)}o#ztSsYo~P8OiqlSD0RLGmToIJc4HN@zt=g}tP{Ap7*?Oo7&30)-Wo+Il8%fzDL zezasmaa2rWl;k?!q-}=k0zNNE{e#@yNhuAu*^VR?4$W#5FZz&(AtrP-h#IG%r; zPKljYE2R1$L=-ISqcrq*N1OjiO`aH}ym~2@d=HIBEH{00|4F%!tas6$L-G<4t+xttg z1zA+=RWGT8z0(-eO8~`BS)mHo1{b@|k}*`L#p&brF9ZqR!s%6%%J8|Z@6hnkJ zx~S4Fi`@E+l4A7L1m=_A+w3v$DMFDl zsw<=gVMXTMjG1NZ*3L|>T%#iYA1n}3G0fi@n^*&K&^E0;O;l1I0 z8d@!2V>;rJ5n0cX(Eu|?&RCm52vT&9DI-tWR3X6>6kEE?O!%+9*rc02&bgU}_#@vvss0t}Nh5+O&8dSeUjo2fXsQ@oh^jqSBXdzPmN( z^z6P!iu=n{6$UvJnJnMlq#)yX`Yw{}TM)RJM6fDGc=uBAXYU#BRr6kH_ytj_-CQ9k zc9dUVCCa=Z&UjCg+#s49Jy+pFnA;)j)t-i#SfE)4&jnI7$0q+4v*wXu?)BSs{Z8NE z%gp|6x3|8=qgej*;)A0e9sle{0n%RROQFhki0>@MFRAx@bfce{_}QFjD^<_Qd($v~ zF(q4pLZ_8Qk5@X2(*xx|+rI2IRo>&vP2SiJI|y<4*)!wVdJ)<^$tpH1H3{VnkaH7C z=mJeKA-<~NDa06+Z9KN-Uwce$N#3r3^5BpuT*_w*L`-f(HPg{r|rh8X6h@PL|i|GjadHeqB;VTn{`C zE&$Wii?RstbgCT&*l_A(b!EVXv?+a@Uc)|*TxXl`U=MAk6pZ;3Hz zTR)Ic39L0sPV2PgD&`jfC<8OlAt<^@@HMwlDzVJT-EI;TA5r0f7PP;;Dge|Of zA}VbLyPJ136t5K~kE>e_2&QF$aG^(mDl>y^Ys09v1bKz*s1B|>(TUW>GhP9(9w9UQ z+iCG@zWKhr7(uP_5eG}bqYBxjCwd8ZQ4p5KeiVm*%AW3=A*Iy@M`c`2NO=vzXp;m~waF=fu({6eI@g*?a%m*`T%Rmo2@E)42_R^kjt%M|C7xlBHM zh=rGK8Ea2(BL9Ku6A1Cqxe2H@$0$&Exa=9xn36JPA>N*n1kPj7NCA7Kq`~1e>43Y- z0+8E%@Uv2|7W3X9pzM%PLe*q<6t8FD1@RK91ks)y4PvvV!-&A)XZj*sXF*yrz&0ly z633kR=zO;XmW(n`nD@Bu7Op@4h`ja9vhZ?F8dzZFK7SS)>2t>k@5A+;&>y7r@Mhv2 z4zFW<2lV9L&>V7X$V2>i7a0|O(KYOHJbw=c5sMvJOwWBXqZ-w(9T=bUm|jic^@HNF zu)%Fthx|Kt$-5XiN!~nd0^JGH7)V!d3Vat9B3AkkqwfAW+a9PW7Ikc(1_OVlbik@t z7MVaMnQAxvKDt8u$AdIAadte25{;T8@Uhv0gg=Vl>y?01wszX0*G(+b|VvOF~ z-Tfn{Za$vGWBn#TjgDu`F<%~I;eu=>W65?M?AaXOgtaA$RMjjgD}B9q@cFy4)x9BU zkUktr!&+JC6iu?u$e-1B8$}X?39^VsH(yU}O0RNhf(%0bQ6K3qp0%8}<@06izTCGU z=Xj#LIi@%co2X)Wd(MmzdcZ3d9k>4=k+12u2bA<)HT79(_MzS~wH zaiTNcy>DTKmo1Lft4c!GA!=^KgNk!If>FLc%e)vj%^NmaMcitQ=YRfPdZ<8xk6O~& z`fyU*jRBzI3}^tL9$W1cJW)JWo%svtXU~)dreU5vB37E6m6Ue?XBVx^qUqaV_`$Rf zP>99dlbqa(F9igiq?YSS%H0^oM1f+}lKxJ55Rmo(MJ92I>GrT??XS6VHFz?x3$UO{ zszQ+JsvV#kHyO*t96e?5xale+Zn)N}N_d_Lk9AO=Z28+}tyX06s6DwdV@<=aZe2P4 zeUO}8!1ZX%25!w687~um%z6gy3!^FguxB*!h4i+W^q)5Y+=X@+XBBX%=VmylS32>h zns&>gw9W515AS=>Cb9E`>C;dsB`!mgLkcr3jO?J?e(;}7#<+H1m}vD|iugyk`%gmJ zN(R(81RW-tn5fl!S>~g}QQ~GE=1Kzf?y>H#cDiiF8q+lg^gx>E&(4>@*q;P(3>lel zX;KF;l~idqj!(Fm>EJEz!2S$$Q^?OugPEavR2R5kd1Lf3ieZn^;?~GG84kz~TVLBf z=3~)k7ZHs5n)`noycCxV)($B;zw;x%`ihQTzT`R@85@B$9Ri$uOZI&hl`QMi}| zh~&7WsO1e63Aj`V@Vf;T59Rk8+WJ-i4@ZH9^Zj9650Z1qMUOFdSSol4CgX!`MHW4_ z%=>MSiI((cm>~CvgjaA!MXe&=dKlsx9fl%T3`*S3w9_b(cK+o}!qG)snli7b$#DsQ zY|+gINt7!YyDmskJc4#N>0!$Xx8lQ728&$_sh8#@i?S4<1|*Ut>(X z6?|0@4}3>(h@+!rodvSVinGkolB3QCd@bbMb8a!l;Oimo#d9*Ji}?|M8b#V&G+M&3 zqC?rjSP$(%5Pzc*Gb5!$w+sh8YB8z*PJsH>VT#XEi0onRV8G}@1JXXWpYti>nTA#c z%hu5jX<=-wE@VK>5_y!(AFW5ti3BOX#!{16lGv`%MFkP~$Pd&c-i}7{MtwYV{IdhS z{~=+@q{f3yr)uTqnn=mQa)zh)2Wh>2dfrxM)QY*EK6*Ja7w^X7ySNR*(D>1yiI;8}$PGFv3M97HgV6-%gx zr|!mL^mdeCIZlrcqO;=l654cs?Pt;gNNAhq$~1xyrL59Io#jA76=GkbbgAYY|LLP@ z7a?PZgS!apYh}l5c0iq(RJ>a{BN7LBM&D`|b-LZ<-9RzKu$J5Xc|j-FU)b=uY@ z^xjMx@0CCO&;8uazmflElQ96oxFqh^nn3x*fB!#${QujYaQ-cbYGeAJv5bMZB?g3^ zQ);o}1Q1hVM^UZe#sCe-2Bhj?zyhnR_L_}hxYn%_|GD)@U2@r}Md@UZled}a><08` zQ73X3W$S7TgIHW%YYl18Sf5U-^<36`jMc{$88nle+t%bsfLf}baZ?W>dt%d~*Pl=(!UxT7IRIZY;vYZtrt?k%Te{jJ4Yvr@Mt$x&4Olqv#V>y7r#qA#ryzP@GB3BQ zH=)$FC~9FgTu?9jYF4dba8=^l^)gLny!8!z=xp#;tR|c~J%IPH)VWos)b*wWYX)bY z0L~>IoA*}I`W<*yf`EoKz^1x!1o9QF(>A8K5o+4I%TbY2GPbFH#g3Irc}>gz)WJFc zP-?$hjo2dA7eoWSk79LU*3*XlM<0pVxEfn7Fp2C;XKIyG(Qc7e#FqA^#>hWV0u>@)w2iPs zRiBrN|3EE(rh%*XhPk8$C5)mC+qs3{3OZ}@)$^a+e0L4T4X4PS|2Z4?#4~;;?Kqpa z32!GuRT*auuH!cJnBt=#Rc&n-HT2BX(^X@X6W0@r{uGHXxI!nvtic&unwJc|TC(_D z#1Y8y_2c@{F6`O)!*N*QDV8*Z=)jxLqs&V#)I~5Exp<|L2iOXbWnq#m7jJc{bg~&7 zo#BJ2~{&z^?S4&evS|rwai`*Ae~yJhp!~SOC9t?0+7lzgK5d7gvY>1Yha(-AwIF?49VX z44n*(?f)x;0{q{Su$agQ8eo63b!bq3vv&TM4>7j4`#;IB9t~;xEwSI7nmWxNV99i% zixVXfg?$3q=w?x@VoPrZ7*o->;aEz#E}aX+wVxj54}$c@BaCxl@Mx`BAMQDOH`>)$ zm8=OjqATSsS}am$i;q;DRV=qoBFmtNX~VY)U=y~3147HX~Q8Zh5y zpvs`X+)a%rtaX+9u643!6Q{9@Ic9VlB?qgI%CU=*Ca+L@!PU@}t~ z+on)sc0?dd3(iggod-KBy*SCqt6c-7rKJ^62Sjo9a*fd071Kk%pk2NtC&(>e>}eBt zXEpUg+f{L#W-F~gc$?<;+|K68Cga%LThJWxA%a=zJLBr(*Za3JHu*?GyP%#;F|PG> z+>SBQ-R2!STdXI7-aMs1;Kq*9%EB}H*u$MC1tUF?lvk~n4kG+(r0}W;#TDnb3PGtO z8(3~Zlsn0~2iXN_xo5r61-&Ww?4mg}Lv&gwSWyxo7;q0vU3^mve5+Q|dDpRd5ig^P z^Y$Vz7$SCggQLIq3-f)EB>R(!RjMo`2*9gOfTfjHBjP;rm2kd{z zG?6q3>X>Lx>M(d|Tng;~fFIq3(2>YZ26gk3)%#47HF5KatS}0bFwlf+_d82;c{cj% z7h<3L>zDCS_P@{_Oi~P~D6#^(I?|xC?&cQgPURNy5=R7lR$|hGu>>wT8Y!`A16p>8 zZ8sBBs~XgP!Et@67-R%{U|E*hXJBeCpqX{;7<@#kFs0hep%z;bOkQfmbu`w09-%e* z_pu4!o_D2&XP-JV^`_^Xe4N+ai;+gnqr-X^h=4*^X@`kz3f;5P?0>(nKrDpwDXH^U z9(4Yh@qP-vMtEdiH9PkfbeP5si$SZ2zwA8f@F_|LA80g z_3NrfL_KAwV=&TqB8$*_?@S%Iu{9c}5z+~x7tkG4S#Y%wCC&{#321`aT+~)tOtUGB z`K@-EZu?`y4%X07z&GhZyR%m`>nYiRZx|OPbFjHGFn^@tq!hZ}J+O+Q4cBVK&{ZCx zwk%ZX!olJi?NaZ?RGp9X5J%^P1NBTq(rds;Im_UAB&<5%a5WXc9l6nUA+dm$AU(^R zc$T5eNIks2J)E+w5i8pay4tIxnYIqJ_uoDh*2+T~2aY9Xpj;ujPN&<<8>q+``pq%A z!v}rOR>A2}lCA_l!yDagfPO^jDj=^aHI%g@WtR>oYe2HSKnzJ;0%h5A_Es; zu>@0|3r@S&@p*Dc^(N`8opNxdA$<%qZr-jzDJ0G+ik!Xi*cE7%3M$SV_${$O&O(r+ zgSN0ky9jBxfQR>t$O_f6CC91NJd&c(?dCuBuC084;VDdY>#OVQ=LM}RsNsb=IwA?v zzabiTM+dn{bu!lWit8 z42*`$aURd3SJo#(vK*WDPt=>tGe7NiLd?g49wsz)jAk+smjFyUTrR3rdi7P9;~> zgS4|_U@1M%{c)?42Jy=B-2(pXtYh5+jabfL1HiaQ7D?1h6ugGjbKE{*`3a|{Q|#*k zr|syE-t(xE20vPhaHaq!!3GcHn+Qgf6he$q2x__bO8VQ+VEz?9^;fJ@6n`tjFTBZn z!UFe$if@cqS~@)`o0b<>hbs=@(y%0cgY|R1^yOAusn$#uk!zNx+T8q9VT>h7%=PmJ zl}-=VYwYL4t0j(4qfYHezg+$Ijo*Sjd@A)rG(0kD&$rB1Oqn;+LNsdD`wS&TG=8GvPd?r=|Ejcvwh;(Tt*00G84n6aN4B01%2Pwld}H zm7+=Nqept(1JSBnYp@$Esyvm~N;oNAg_WyQyy>W#)E-8AW-l8<)(UGoH?~^t=|ziJ z4xRL4tTtJFv&vy()RI+eRMBK~&b&f3qAv6_^5+_9j;mEF+QF{+Bzzql_Iq`sD?YIB z-{Zq8GFEI;<#*DvCrpx}yq>8Oyt4s(YS9Gv_SvcU26?lOE(H4fhK7XSzovtQ)U*{_ zsxlV~^&(o6yry^tb%BMmv?L4zHkDw-$iYL-hQi_Ph+(hZB&S+_YT3r+QisT7ipX#K zjBvX&lXZ?Ot&F5kNT%++a!n-<1}y!^s(2170!FVVilj#X_WW*hQiokGBuUDxcPfMV zyrqC)D5l;gBFriR2vZlUHd%6EfjE}O!80n&MT-)JmG;`GHReHR7AfkgHLXevuuF7i zoG97UKY4eH3n!yL3K^Fk?0};Uh5&t{i~?m@1Z?$q2E}-WXNdUtflRX5%OW+FwQLM( z=NmiK?<~E%lC~F@vzI1BsbndX=~C!{Pk_*NZ3d9dmf*@OKYl$a3Ame>p{E2aT83_ui4TtfwsQ2^Njf)kz09{+o$8u;QQz5ykvKy5O;)~ot>k{)IE z7k_oH`}y!QJ+6HTFPv*0iDe?QI^Ye$-Aw>62bjh;+6X?twwoH9bgL*W-D<5_Lx^ZQ zx|<&rO)>}AOr6}&txMES+I2{B*zy;YnG+lP-x)uCB!kI6Y6R!SMC@`zCQOV_Ad|aI zLTnmOwIwGuBs+|64UEmk8)Pt4NAHTuh8z&OM<$CB~@21Y_AiDwl8M94avQKCO{m+ z=aTVdzsDyK@sPoYmF+q)fvE;uqEYe1n>Hn8Bsf67Y$H6jCc&t79?LV^mpShK>i~~v z4yx6erX}Q|7g<(9gkPk?0}!u>_D~4OEi6`)Ou&LroyxYKw|u8nCE5Vk1oB|bfqNeY z(Z12{eXl);^BqYPR3DtE05LMn@Glx9MBIs zA@!L^T&dKKxzC4FDZ5GPT!~HVoQP=QHk2j&Xr8iQXzxm!=4X?V8ms%A+ep=wIrN&z zFyr?{4?Fq#28p2SZ$6Q1gMdTjsnuCVb_(GXuGi{Q`Y3BDkBv52Pb*t(4_xZVw_FMC zL0qg>K#Hd|Y7a&=(_7I~Q|{>IWA`2&k90osL&5w;Ak)yN#8FtLr%iNaYMM zQU{=1NaGnguJ_i~Sw@P}q)QR~JwSt|;xxE%nXRQzdcK-t`V=}3#_1@&LvOz6vqcA` z`x2`qf2wo^HKLny;J8m37RGGIg#oYg;bxA&u?A)(KW)qigZyJ?No5~_b)7~Z*I65w z;GbCFATJDJYHB!gwV?i__)6_y{Ga{6i#Krg+xj&h`t-Rs6Q9KHV^9fX9xMxz)_qjj4;PkaG6wr~f&! z4jjysRM5c6sr|sj`E|a!v!>T59-Punhsq#q048QHXhI5FYSN%dCFeZ7!WIL{o&{(wQKW)+-?Au*2k|D! zV^m0nTN~MRY&fY5iG`)!2D)>A@yzmSXmAtrKTsF9K5Tx=bc_3IV=NVZoHN3sKi_O! zGL}`S5xhbw2UASh7!ytvF84ag4*Eh>S0doPn~pPk-43xS)xA#8pavwpVMVe}BmHZM z0AD@Jt-17~pe0q2CcMfoH0EbHFc9iXd=${h$8kjciuC12R5ESp$gY(tsuff3*o!vV zZsFM*C&bfo29`Ny3+pUr+E-Tlz~U4{pLutHXF99fm`>#eN?~*kw7R;ujm19JXnu3C zFMjw;lw4Y8WSVqBO;#bn#z=Cs#|GJy*nvq}AL`Cku7)AQgIm-&03{y?0UD0sH^;w4kmB`D zV~Hj-9vDtqw?$u~pTgco=<6l1O}V5dnVpCkLM0A{dR!H)jYIVimS9y1Dc_bWuU{MS z1?-63A*4g1lJO6>)@>&SE@NGm_o_68tQeD9G4{R2W_-Y4*9g_hXj0J_Iit#xz5Om^ z$+J`oHJD?s?u_kQcO3MmY04l>0z_N=$p>Yf$F?Gfy+mpWB88&fy$t_yM0wflsTNj* zMr%ok27B0ma#Ghs>zgW|K3lzmb;S%jG@5&xqpA{qY1qO+g+B1;B}F4=%&!2Jz)1 zWGz*)y3P?HzX&Is#51-Vkejf8!H1hy03b`LnQcVKjKtUgX=_v12m3W`K~ij$f9}9U`G>QJ-y?|i+<;c# zG346j(MZFBS^vxkDAY9W4|nUQ(vTGwd9i?*YpfkF6ZA-l2boD8 zF+I(!!DPdDQzE}go3Y@yAnbDg)qF#jf`AY%4Fuz;+O>PUErFiju})L-X^TX$uN46X z=_MtNuV-0*(=6aFbsRLKf1OfnjmRiRdc0P^K}*fv2zil;$O2d5#LNA)DmtjF?kncpbCeQhqB`sEfa_AiQOA> z=$LzUm7Y*!mxGkYZv0M_t(Z2RBpEz5&v4j}noHS9fxf3hJ~=~Qis)(`4w!~mC0JYh z59ykY2PSRfg3prbSl4WFtS!utN9DO~t^!bhgkLums_RGVrWnplYbcd-YP_z*tB(3U z9%Dy`da99bJ$n9oTs8w{vytIKV5VZ*7>L(`c3l}twnsh`i{zi58NSc6xQKF}TVC7G z%W#~9Zm1-t(O)yLjHukvqqVBLb4&C~+iG8(z`TDqc+Bo{w1D!T+MgcOKLy4i6I2Ag zG1o2uTV23Gu^8CrjNl+r9mX<&(5^Y{`<%nl2doV1iftLjYW&e_N8LVNar1($DAAZyyXF1M7C=X0JE~iQBEo*Z*nBvZj4yBEHXXfu(mR16awWuKHjh z4+=<6#_IFr7E~pnV1=rIP9K#n5&a=aUOExHnU$|INA>67>2Ia-UUs-P)G2(%p$1Dn z+T#WJ7vs&!Z^P|zy1zbHdM^%R@D_=!uskQ*pMZ3Dq+uQWt)tat(r){9jAktJ3TzPy-IB-NK3v`!n-$wu`zuec$)W0hVpD>=*Q)F#sL zZkHxfK`{^ogqji@!GC=fChOh_VaMnsBq31%eEg^sY1F-*m4~<8qTrYE=mwS3Lx&Soj!@}l(*n!9U%?9=D=r-D6?cWd2J79{KE-ZA_d z*hQ*4+S(=10C9N-!z1lVrg6MW=7y6+jrUuJ@k9TAHbZpbi6+aD0RVD%005}|muAR+ z1Qz~llww5N)_sdD?fXVQkPM%qgekjt$C+!FqbA#>G*@5;x*gmnD zVXX~SU6YP!^$TEu`%a=7nFK8nZ$rcIB}taCp4i zJ$%5viVzo=F(E_s#VBmuG^3&{(Vc2WOkpHeTK3k36(@j7$9$=dTyzZwA{dcoO4Hi+ zAzrh~)@Cm3{TGUFGck?c)PJbBm43FWsnm+}!(tbs5KW35dNzTR0OHKZjZ`AL6qcyM z7|3Uq%&%ax@a$#c-N(N^>IXs&Npz>28ByjGS?26;2>z0Zh|Q zEs4*ks9L7B6!6Lc$A1S7{zH~wu|;dHfQ-6_5KNd!iC!H|&7C-#=-??h;sQLOwVgqo zH{1(sVcOt&B_iIxPP-vZdl-o+xRdZSQrB|>i>=fXIyOLm9<&>X8$z|RrLr1%JgeD4 zZwvJiYAccyF)fh|CLse!?}z1wFW`T{tP{D*Gj8%Oq z5*DQXkD$&b>@_UI;=nAR5u(Rp+Lr=;cQqouMciO{609W+{rklLA6pE~L?Aa*VkQ#% zz!-GV1f*3q2AnJeM?~W-O$Uv1$eQSo-(s3Jx^W-gksqMF_=KNZ90nq?G~-}mbh~#O zhp)&$C$Eh&;)rnJoP@d@GGJa`S{skUI|oo-Vsrih3}MN7^p!_Y{N#~SFvLGX0?Wbu zH-*D2Pmlu297CnGH4rvnZIIj+~P%qPoX7WO%u ztk(019Y#4aDT@aG+NzJ|vI=Qz5Mbkm9tgCzB^go1@?Wr zX})3P!l=1COz?e&1Yvs#N(AhtKy0``2_+{x5Dn0SP8Ey zSDd0rrfU&Grc2xC4&-LPNI((4v+d{R+**=Gow}B?m+F3)JfOxx-~m=iPo6iUA_-*# zrvDm5l>s<}&^-%e<|O+F`!xm;qSw_jZDzXY{b^FBQuQoK{jH5ak#dx$96|(&Cb#2S z$BjusX;`SjRDO*NO5?g{bfU|T$5_HnyvTj62^OlswzNtU+ABw!&`q?8pr)6nns90y@!!4v|{oDj^yP5MY~RPqj)dI1Sb14?2~9kQ&{DBbly&M6*j* zi^)+Gsj%xOww#C~;pf9bXIZZVF<0iJTy>GSk}ygK@D4q9YIVE4pJ%F?)_$HYKA+m= z-aevR6P;xnK?2o)y{D3hG)ktmlcUx`dIIotff<*}I>G=416Td5u6uNW1Lr^l1W6?t z1INm>06G(yN5xoM0)MiC(>bOsWlNkCTRUuhMf*GJ`*D~+3c-Qw{?;=t2vt)isaK^% zDTA?#bk{!mg!W~n#0_}F1e-Wp5DgEN8$$Ex1jp8-|CI`^Xl^w#v8tc83XjvK!Biig z5rXVdYAW<9u}(mpHYkz~Aav>86dp*s4Vop2a5)JaT70k)3%cmAI}$6>gDVr_T&sA+ zn=GKRUxi*#cmsKMy?{oBY)stJMcc1^LvzZ=81MxlwZ1+@Wc z*CZEn;L+gElQ26wtE4EA8o|W=r$sP-;w9JFp9W}6?;^MERnJVXrD2ZgiGbdQ0evd& z6#{L{t^mMKU)Ig9E!CkR$OBh677bEipM>Nh{9+ZT7-51V~ytLXGe{MQ5QP^(KlH%gR0c z5eP>jYM?AgUv!>bcR_&T>XZ9I+6yok<9EEt?tTZu;X#GiR89I;y0lsp#e04OG2%LQ z%Hd0*d{O}KArUw;@aQL0Ygr-Ca%KFW$Lh^WiQe=W3(1t1FaxAmKW0PDT3!kIhznAd z@0Sa}suLW9t}^7>*}F>8L|pk-X*<- zg}zcof!2%jguHgy6yWZ>VNjIPtvu?r+E48tA|{3S8fNbu&S+N?&Fgtx72Vr5!|4)Z z8@-A`ZYxpFG}~}8k6=_PpJ=zkW`pP&O43}MT6k3(nr?wcj8J0`__Wt z#cjT@TB|y=1M`hyzwfvBx6-Qz%9PSOb_?N>Q7&*e7(W`o`-Qo@7qDr|;vFSMzbcNK zP@7V&19naeUD-U}ra~4aeh{q)G?Ce@jn6*GnYDk}E3-0yoEOF&PH>rbS?W<#Z7mcZ zcNZ4V6cD!vEz8Jg(wmZNT<5qsU*|B9O4z`y@7biJvYX6wQeVczQbF;-6w!RKPO+#| zMPO$7Fz)Daq@c>SY=3yY%y66ePVyHqi7IxK_jo~$k7kH-M-Hzb2LlFs?!L6P^;eas z?xcaHn$gj!j|h(Y@ZX+1Rlza9BN)K!1|lvq3b!QXxMMR8ejP+TJ%7ganBU4;M?`x! z@A%!YbwR$1I0KHp9CcU<)3M{a>hu!kSR@#g@48_6Ye}?3R=2YbCGpXuKRsV%qti>| zaG9)X|GKm^I9X8b-6h{tOo2(-`Aq!>)M)hqUQ;`)Q2Kus3`&-H=j6S6Cb@d<15q?g zH8MGU-~y$O7)d2b!YwDE(h^6(FwE&cj|RR}c5~gI6JB?b3=^GbyQ0yrBV@*d{eo3C z(j$21x^FxCFOQHJI3ki$|Eap_v^}@$;e2S%nRwkD9bL$U849b>H`W`X^XS%@T}d`V zRcC>?GxdP46sx#&Aq1+nC82(}#QXqdas)t%VDF=VLiG{rQfd;AGjG%mf9^Ve0K47T z(3Ed<250X%SJN`mo)feBk3T=3B~6TM-2LeIx)R3wcfGs3)4x0|O{nMHj=N-u$O>X$ zI1MTNgfYLklL1q2Jii|!qwi&UZn_c@*9V@z0AO-0xC=ykbl@8tBtyiRF-kiAIOkc2 z?dy;@vUk|kW;=bKq0sHG6573+*=i_PWYd8Cr3-#Q)p;>FuyZJD0(>&F*yPq-7SI6a zEHtkhz}c5aW269LRO$rIj(@So%U%lHG5WE)2r=~;IBr5=u)%G+$A85A!2eLgsd19$ ze)a333esoF+2Y*yD$f~h`?Pd%Nok$$`|BJKAI`RYQm_MgY6q~?a}|O0gHApsUt3;w zdBamV7`wQCUSXU@buI}aCf;3k*~{Pm-l267g&o?b4B+z(_w)8PGUl)wxH0wW9dRc| zfq%kxuuAuU@1O93Z}tIx{!MTSmyeS;H8!?61{@46my(Ea2^EPr$cM`Dl&@oy*SH}tIux5`-8W-$2A={9!BNARyGNT^V z&9+)hSXm0a%!UJ5C>t(>87z@5yJJTdugh>qxF&0IyTr|ab4njmWqH`i&XrQ{!tzGy zVn3P9>_Y^gd2+K35#KSrw?rMgK&uU*0?Y~>Kf~cWr{<<>c0*)XhJA=TRzrqcw z@88G#@8Fajt-%GHKxXcgLvi<5i^v--FVg&>lO`8CTE*w%iupU}wgt8)R7m;nF+m~S zU(>@k?>`S zVn6P~+sy0qI*cio$i6VjpHGzmW2KS`g5cw>XUrabXd<=37OEQ92?Jm4J6oB(^Wr>v zE}UQ)_wJ#EzNK&<@M~3<`ek5QWgXno7{hJ_*jNI)wC7%XE0;&*Mlnd7*z%4ge?+2$ zA-~As{}uY(*n{jiQ_R2$`h_*`uGjEON_5`;`rB`?RAXPKP@F@bI6rxjIQZ}d2pL28 zTyz3z6Ev93@fpa6!!T2t^*C_vmv7C$&4)*5og|*UwbZPKZh5e4(FJ4XJvo|5p5&T! zh~V$-Vyv4hsnrwAf>A?8_vlr<>cfGl0*WiBIx}AV(@{Aupz+0)lkMbAxxui~7veWE zSGY9G2CtRe`G&WFIO5(X_1U+7mpm*l%;JF7O(C;1uTvKJHA@zscqKe-3_Bp2+CT(X0`CWl#fif9CahrzU zClc_%wfk9c3u@4D)`?1Endx8NvAf<6T4|?pe_{`;GSn1K0z~3-mBj&GOf3n;nO&N4 z<1={keT;GmemuSEDbBt6gw+L0#$~TF5^r`U;fp1p5hA2OWAgHePT}Q?E`+ggM0}4 z<|B$WegR0@y=s*XGWEas6Uwu)XzYJrYCb#`1b+*=WBN7FcRbj($D;0E(P7TFsi#LY zHlL?bt`-HtjdZhI7oL`UIAx^UeHVG0|0PdRDU+VTb^X4CEVU)FH+aBa)D5TrN^zgTue0n~Z8hrGoPkd4_!Tt@hF92|PZ|dZ$ z3C&~^Lm~R2&x~QaG-*&BXJL(QU_C39G&(i~RNa5WeTZ9LxoZk+)X=|_8*U0ybD7>^ z50BWuc2~U6)x*(shh?+BUm)-HamfufOh>L0M$e^LO`vDYHHi z2;ne)go)mP-4DeT*w$)h!e# z%S?gu7{=eZLH~3tPrSp-SDf!>jxpfBnZr^!PyqDrU zOz9`ye>gwOlt)VvcAypE$4sA#i($N-kEw$b)>ZHP@p;y4_a1mP5BOr>x`;#l5MiDS zMgsik^1wOZ+u+yNJFh%u4^8HXzp}Zm(>RHpriV+V``QlEgLI%DBT&|jow0p^P@{MB z%RcnY-O{Ve z$;&1->Cy*%yL!_5e3-uU2!|JbVR9jH3`ANZg+3i$Bcd>HAsww?kS(pG@^KkpEYh=m z>Dqn84|b`!jZQu+Q`cSFS9XtOqq08B`}ysfp>01q;g49+6_B&yI&`)5no;!g->Ux; zDslu0{`!1Mzvur;`lqeEld1myRr}z-T7J^hlXI%`Q#15Zs^inNZ0m=4i!e#!}8BW9cPmsOBf9BV*L-ROQ-dnrE2h&Vc`oYgRy~@mTQ$02rGF z1fcwX_8$M+xBSQLZ^pw_&xiY#SQ5o&*AG;T^T{n@6e1}%{Pnmy&e+Dpj!lv*Pj;8O zcsPipLXapB41kuB(|zBbm#e#Lk)Wa+lfK`p3sM%yyQc2%G3V1nTSe9(TSY`)dqFO* zrrIHicI=fyo7GKoL2`;zH>tZ|vO=M0R^`%Wm-bdTfX{#3sF*a1UK3^PVL|m1FcKv? z8miW1w2*SV+1evpMJB&iR6Lp11={ScU9y!0t#5w*Os?#Ztg3#Cm3Lg_{jFrW<=UB0 zw&gUn;)GGPCjKJ{LNE5&vMsRF$<}A!b^qkoF#CGhNY&Q1*74@4n%Z^!nd^V_ z#HBwDjUk*S_0%a@CEIz7FYA?D0hT4x`}xPd?6R?a(yE+wpU{5sWHW}XYb!2E70RFz zf}zS)^Ect(7&RT#;f6{1^~r1tfZ-cD@9vU{HVp#AZ>~@5k^VCtVH@?WvYJh&bK6W6 ziZ}BfpzHqtN3uy#6iVmo zEO=Z|`?-2C-z{!3TYCW=&eO#W)wd6?cg0O+dtBtzVz*AKX?>lqn%X{w-2;f9dA}R= zv#7JhuF2nJQ$odBzX8a(?hu>x*y+KPFxx!Zq}9zdE0(sAWxiTv6>d}aq;7K9t5eu3 z^SnrDU$5Sca3W6UB0xxvOB=-_5HLk4_5gaz%|Y87TLCO53Ab#kj*!3 z0EKHrUh@KWmu)6T8nw<+fRJpj_8ad>y+vfPk7!TBC;;=8Zn+2(+*I;lHS>B}15&vM z>(uqTE*Glm8o{!4OK_7-m)WAE?dP6u132IlCXMDv(Ogf=r*`ntY1-?!;f0fGp%x6rT+r|qZPEW6R@$Mn$~u8?i}(}z>#!KvC6Q&{Ay z=Gu0fZnm!ZI_Sg_sjrfC!WUNvEn zc?Kw%`Oj{z9b)nmK)KRAu|S3+Ewj7KzCn^ZUFVxz;i3@5 zrkrN!;@Um^*>!OX%>YSVy5E2^ntJ`S0Dz|JuY@4hudB+TD;{O^T0baPtJ;x7(*e>E zShhxy)b*4HXr8=F*DzW-rY$lt_VQ#ML9-Oef1$R3eQ^or0Ft|`f^(ppzXcrV!`biz zSeZoja^FzaHI@`c8S2O#v;_5tT7`~oYoxpjW zAjzhKE}7pydRn98lTq^NA(MlzR8%JUrc8EqmZS+B3G1W0NC+hW)^!7CHmpsS(a6t` zjXaytv5-}>gjtF)H}civXO{qXlni<0u@JR0o4u)a*=$CzF5u^X<6sE?XETQMJOjoG zc#~zqG{CM3H9#u@J<1Bn@Bo>35gOsV&gpAk7~wwgG>C}w)C_$v08m{H%<}P2)uJFe zR~ex8nSF$RFet`yfT8WtFCr}hxOhPa$zRTsqFo06XtIfeL%(On7lmvw?hRV)5HxsD zZul_tUBx5p(=@nV27B-U|v#NfD__i?NwAU+&A8@rzsoc!k&rPZhy(m)!Kt6CE7;<*L; z2L3Nfnpcerj#IUOdEyq(M`f9d>?s=H3_F3HxZ14~Jjs&#a>ryPO|G&+5EnoPca^ND zfhj#|$|G2xDhCdknxmat)8KB?qJb~>Fur*XEL?S;0LL*-zM|a$%X9_Qe7(L;>T6`B zm}L0i-V+sbG}9 zHCkJuh49SE_6GomI>8$PtQq!HFej>==DIA#Wp(vYUe~+q^wZ}j&uztQ4WqbDYq&yJ zY6!il++KkdoAw3-g}%GMBhf#;J3c-B^!WJ8NPe&I=XVJLX~r`_nXYP>*nebnoee3(q!$#iZ` zC|KMD)BtiV*HpWDKUV1$am=!TaGe0$D{qr^S>B}A!0*xoP{x@ROStk`9$uE{6%n_=@a#9EwLmDPxz&>&oB=?NbjaI7|tZ>8yEOKJ*uH97uqkI%-*n`;2(ZCUi- z;9kB%YUW@@9Hh61Ti{{M1p61gvCK`UUsl=tu~j1#F2q-uO_su>>9wza+=FE;83m z9FGBqH5*HKJmPkeiC3K@IMfJJbX*U)@4PX41-RcWVii`p0`|6$mQ1gUbaDLvf|zXp z9}E0gwl>7Y@nz>`*j^}J09rY0r+kxLr6?j6_|-)C>fLrrBFa%R-!(Y;^fs-89KZzc zc~&$f{4LaOljf)v@`+|$?y7~`E(TLK={?l=X_sSn`Bjmxa#%>d1=mn6y)u_`xZy)L ziyPc}NSk337?62;ZzRR?23D@x!TCn(@;-zI&bjRwGE}xB;EvRm!oTr&O#im<)wUTn zNhgiptRDZvEnm8;3w=Q*U^)euH`8gq&ep4u-Pwxa!58Cc-WaKYEfSRA)jSu@Yv6T( z!glUr(7G+*Q(bsomg{z5kLk6Y2BaW%zlw5)Bx(x>g0dGk5Neu%66c2ml!_;6lM386 zj$Y6`NiLY~CW(L2$ZRHE!9l?ivyhWmXRBt6Jcw76xDeZz;YLQ5#Rv`|)v;kU@J~=o zt)>sV))EA3KTfwq*lB(SYX-hJ=HV5Rkvzm>+qJ_fw%!E%Ztz%*8403WayglJ)rSOe zf3bgPQlJn(sChMjT+f+Jp@l9BpnqMf4VNlO|h-OkUV(B0~ZWoxhbp zTgz$*pix8${|-5fZMnS%vMCkPfBaJivndvm9Q^AzfboyTG25~x`P~SaLdAR%Kt>4U zr^sJcRkmoJYU+(!O<{fZE-!cW`rZgg_u+jUN)hnHCjO>M7a1yDlm4cxaf72imo9R| ztPes|1&ZuF@y4}pMGjnu|1U-zB_Wy`uv!xdmUn}PE#;jJIMg<|M}cz}9cu65@wVJj zM}wAp*C$4*W4NeH`A#J#AM!711Ro^dl+`9(=Rflfr?NfdZ?1MuuR)V;GDM>Z4!Tdx zjOh`e_BTKh1|+0N+zW4#Snx%19Gq=UTH$$n>@|tc;%&m4pni!X5(5dZk+N%Cr5hK? zb7*9L>l)e7ADKelhK$r;oRAX`%Zo-QaGP6Xfu@VoAtyZvnesv9} zE}Yn7jTwC&3ar2Y$J3_);jaiAj}ATqLjRmPj&9 z*d~T;_SE(RmWtIA&;dTK@hD2yNxDXxtotLbMyd6X1(`0y)-4EHs5=HtzD(h{wfXg^uKQsk&oUJTWx>x{3G=j3Gqo7U)p;18Z zgnmr$2lRLj|9i_yWlyAnlzif;{}ukQ6oe<5<2|Ha2vbX^0Gbsv$xzs$A1D%j`BjS8cu}n z87nh%RLpMZ%mPY9&Fu;oD7w%#%_3wUz}FusQ`yB!U>t;Rb=Li!v>Virq)1rMCKl7hmB4G>Abd;Q(f>9dog zy19q_{Zy9L3c#M~{lfP^wr`+Q8AXe@K)h{9e@<))Y(0Gy#TBM@HfgcL0R#l^?`963 zPzfj3U}Q&iN$#~wL2mjcUX{2OZ$^!`lH*#9iYx>atkAH-K(qY2t@0Oa47?{;``U4czikSeATna{BQI zKaaW8f;}o=f$3Y{AO;F+f6li`vnVA8R%w3h5kSHKQ^qVWn=BK?jrbDPTIAV`o}+c! zY(_}N<*HrAu!09C&*91Q$;oAK3`K|<(_sI;Yc9)bS^_U?^9q0jINmi=AjIjF*0p=u zTH*9k02Ee*{SVDGgdl{kz@9DEWeuoYqT)2vCw{59KRSe2|AJM-It{UXuWC}u7`$ z%Y2C^{Ys>%3=is~Wtzpi*N1PydYH;7#@*ss1jCoIP-UTY?tpnyvKTu@@dW=yZi9Y4 zWcEkRYcnREEWuc~Cp-XPyeUcxfc@u_p47|Gz&QDyWE^NELQ-_%p`sQQC@?^c(}oR1 zQ*4g+2sPwc-@zMgdq)=qAdAR43!|b|K}J{e?W8O+X|RQ4h>)yT#q&wD^S)!{bJGC+bC2uiaylZJ`_3teUM%ZsiA!s zgz&~&Caz!a&w);_4a$f&l?9c?ELQkm!3CUWU|Zsuu=xWV6xYC?64b{n>_Y$n2)+jf z1GpXPyc64q_?j>O8jyJ7qNm@KjhHrQl8XL>K!-?4XbhSZ>NU401crA+Y%|vNGKmhU zE3tRdbiKVtO``c}R97=PI>dZI4lrzsPCvZi!$q}5F+@}C7AVNJH$LYZ(AMuWE!J9J zI?kpnj5;@V&Ij8zvy9%ihII4>W~IgV-ahUoUXBu3JLLATYq)Y1%frX*YNAMli+Mus zO^qn(&!qRr4f4xhs$WO)>Dz7gTAQRdMuA=0^wk24ylE*o1n{uRfcMBA4Hn z_wp5g4TP0{{nIXosp5u*orC)LrXQUpUql2+mb)$7EP(&4#VUh&eeqAQ_Ma8r;L_Xl zeoRae96iW+=EZi0))j1*T{9n!-UvH1XEK-kY_-Z4d4~EG`u&CJ(uZMMkuFC#cCiw% z!&`d5HCIg@fSDK@9fY@TXLcYSNyT51kCOh~bn=&EnA}ZI@E?@E;E&=jgBh~1*#E4U z8I!lBY|^!B+47w=kATkrl48&9rn#*~S4v?C4c?gDL$?yF{DikN!%*>m6)}EfH#c&k zb9j6tPFVr;vcN^^arlO)f6_uagK-Ak2A797%@T~$L3hi?XwvNWK)+Aq_X+nH$SGc~ zugVJekIk7i=)WD`<~R9A|CQ!eG&BXyf8BqnPQ2I^ms{jbPU2!Wf#fzL5tdh$Z&eK- zWd?0O3EKJ6XdY>MSiNJ8^y8Y3)0Y?dW%4)t2lYsoUITbf$(`&+RLKB@qY3`sGG-vf zSkPeHqG*nOm%(5W$BL4N#^cQH&=FH^(;5nv!<>~KEP z&3ci-8WmTp7Q5AO_Zq-nN7NIX(%d0F3d@jo@{G%z0X7{a1e-H}$|Y?cE^>Bxadw7Y zBkeu4DVL<{a@zcKUdlG0jb&UcU&6-rj7xq%5AEb7JM}tAK_!$jwTtf_+S=FTnF=?T zH4nX_`Bi6bf~3u#Vmafq4JCQ`D_(oqCbkBe&rGq&Rt1!`;tQ?2{k_QpjW{ znK_c>J5Y#moI15IFbXh&I_&Egrr9{ib zGRACsN8}ohh+Dk*FdmFJoYM=4v|WoxwM<#QVI5LNdPgSwbd%RL{OvRQy8o0AQ>c9T2%CC|F78;XD__Y$sm(kAfuXm$pN(z*q@bl#5E#Q z9~Us37}rKn*pakYf>U2xO7m59wXjdBiaZaSz^~Gjk?#Fy>@;NPd2K|@_FC(Xkf8<0 zP_+Dn`xFh2>GUcgBnD8hA9Bq4v^BX)99m@La^@H*JCki1CGA0@2t#Zv7L~*AA+A$2 z_%azL{eqll_JEAW*q5pvv*m?J z6JC}-N!To3oya-F%F8zQ`nQ9b*K^CgM%Z3077E!PQ%8K0Cj0uMGOEjoar+T`G>*z* z<0h;YTCs9BNN=WO^bRDD>xhFZD&Bt5ZXU^zzCel_ZSG&9v0=~oE1WBL(Y`F2=Vt2o z=5IP$nr?&_oU4osw`q3>d%e)TaG-7vc)85sfArYFAtK+YGyx1QxFf5E27rEfbOd%9 zM4nyn$cXVLiwaT5CY+@!?MIRc=ctE{K|}rhEwquWpTtEDHd2We=raZJ{zi**rUh|)5Nw3wU@l(c(aM( zXQCB8Qmw7)d1FHm9!(TH7@@MCoM93lrA{v$u8mYM{@hq}5G*!591T?4y!^N`tT1HC zDm~+@^wYpf(2dhsCh{>HQQ=e+CnH@S=)Y!;8Ox#Svj;0JWgZ`x2n9T%7 zNImnGw9mKJHe@#Amn7f8DV@E&w04hgJnstP;cv;cNY-25*Cav*d85(UKx(AagrS5k z@KQmsOKWX|t1u@5J=u8-F|pBS3x9`0ecFtK)bbnm;lu`P>eCiIv20VHb}Jn^rhdr{ z*b205C#nW*;1jP(#dS_yos28#G8q?oCW!h&;G|<6bnyGVRdm$pMoG2kR0L1YsD%xMEE_yE9=HPp8FozFsPvMEg$;ffjg_g@*r%cj~3& zk~OE#1%0OEpEak?1%E#ctmlwb=b+JM!l>Y7LSy7h-?djj)@vJ7i&E<;6pfG;msHKO&Ihw>Hn;wEZMGj4!#^*al6}(( z6hth;xr@bdL2W7Mzh~g4whB~xlXEA+#Zq_>=0bu?Wf1p?{O@^(cfdynJo!hq-f~n2 z<_DC=IeXNSEx2{4p_6fwHb8-fER<13?AGyGyf?WVc@jfiC$q%d1txe}O4ddWfv_}e zZkFh2&qY1xZtD$Fb@$#`qD}EHokzF~i7fys4D~4Y%50N|if(5)fHGS$`Fod>NuL7` zM-cE)WffV&wm#Z$^{v%*kzoAc=l~ct`h^ZO*;*<*J<kUCX$PO z6E8J~XzIIG!Td$TZCNk{JIW8@;B|gb#4You*LMY~S%rVMPJ;$;Hp(vLK?!C|W`v_bYfg6hdnOe|LuF43 z<72U>O)t{4&9~6mF1P1i&wK8Q)i%aQWf_$2xprQleLdCTs6p=2 zd(dM~yIqJ9RPn?mU3@ed&z)03wm#)9@r|1B^>|UjxCbLn#Md{o@(i2UdSZ_?L`tT{ z78XQ5t+`|?7!Ou4`QhNg%cO&nOw`T3P|wc3hzAs=uEBpzmYcx9=ox9UPWWPV=`1YL z#6;Q`rZTIMt%NQ%n9C@$VTtt!oxiod4QG-GM|5B9yl0{BwJbtRrHsJ_6u8@qVcPs7 z7Nx#HRXr3$zgS~AaOk4gfxYkI5Q=|#857rX+9`=eL1zt{Cg5QsP^Y{MRXNX#8GDfd z$)uJ{Jf}HjQDmJ6G45#8P-A30&Ur~m0G*q^M?DzMyx~NjJP2I`$wn!03JEV?2vH!rnn9Swym`zKFSNH&HdJB`PXnptn0uX?Mt?m@*LRdIN!iwnIpHr z)er(jR+G%ApN+4^Bf~)me_(TN5s!g3mZ%{{O^`D}fw9zkgq2o%b3w{pz?Tcgn#;>U zghaNc+_ouHdT^0~!KSY6Ss{Tj6|9DWJ=G}MNxsbJBB|tBRF|Yt5+c#`Z8pOjxF@|U z^QCz~QLH#%B2Ic_WnV+PDxo6Z7uzB~(C;mn8Cdl&%~bE|8h_<)(I)0$XlMkWHSr>K zMLJOJi)i1BnNfhG`xIeO4D5(R5P3|KMOINr1}b{ylp)^w605`FRO+05VF32aC;R8Z zGUG3I7zIi?mw0rsco`!r_hfkqq?gx#j=n|@I)O$Yup!1sgg z_hnnjZf5&RO8&y5cp-xfLPJx$5gRR$JL{7oY<}Nlk<$IX#e#NUt)^^Q)lgJbh{Yqf zmp$UGrphwIqhRfpT+61Fc}#z{jh6I)Q>>A^yr9mzRA7nptCz)SbF)YX=-;?E;IK0Kb?m%s9mI<=2tQIr%m( z(#om%hdc;L>_>CwFn}dRfk@Z3*V=W9dI%d(m^^aty-u<_%)slC{pHrPp1e<3{mgU< z*knwvi`r`>$exq`OfBNf3(P{%ddjOS(gE+baD_+s0W)%i$*N(~R5j(>0(Pmnw!s=D zJPYnPGbxH<_jJ3fva!&O*PFbd)=~;qw5yX1nzdeqR}#)f?FH#`nhgrjPWTw0+ zz3cts^~*0_f8UGO;_Y{yti}{iD`0$Zp?7r9?&u`nwY0z8=!jY`p{V?ip{ev4V1RV* z?%__Y(UmyP5EXZJ`UeTW*Fn|um7@7=za{(&jf?z9TecL2M2m}#BVypLBT%x8wjC$j zAS3cp>YF#wzH^iFg;E7h7U{uGh;A3?=(WxI%c-BOjdDESuSCzlqCtXRr!cX)Te2@w zhB>_dxto4?K~VOdo;9p_eQ3U44qX1e34d|K59IoNa3*}merP`Mm5TY%ZVw#FACs7u zLD$O6>&pPB9c#CBfZ3J{yhdh;*awR|+$CH|ZDgB-q8cmeW?34krO+&B9zr)ZHF&kp>wYs+&tEzJb+^p8vrY_hm3dbF)j zf`)@hY%)JDGs(zqvXim&VTk^qc*E%J|y#A%<(YOmL2EkcuDp0Zli_(uai#dzu*U{ynaZ6sW|kFlOXJ5XvKVwUnsFmR0e7<4Ej^mTu}TRBd> zOA+C7JRX;Tn~d3<*v%hW_ntxp9~fQtdQ$UVhIRF1CtX#IUs&sPMDy>>-u&5KJg0{? zhX$3~2IOwunp6s(xrbc-R>FukNLm6@X*edWL>e#)hWeUA-i|oy9=`g)M zOX_i6OK@BtufIhkE?6Z>DEtP$-?FR19x^F?brKPYd+iYpaW#Nm+(po;Ea2;Be{Pz2 z*p$2J=Dz7O^%V5_^AQf>N1?d`3CKZ2fawP?b$<{wi0*y7aO!EqX#roH{%BIbW+H{* ze-Gu3_8jUo>>g~7NpoACvh@8T;L-)HP>ckA z4OodkCnY#&#`_tl_Uv11)SrbCL^qNQ?2jc8e*k4Ti~yi|`mp`aA=Gr}Z&b@}a}1y0 zJW3pMOILr|*v#h2CaA0_w5*1t%+yh*AmU0&quJrOPV$)B6rJUDw>QD>wve{INg5~gk_VK=`&Rq7%{ zo``s{tERa!G(Ie3a)kJqhMfB;W&Pa8`$9&Gh&r2W81*<*Q!xz)myA8`|sY}Wz7Y1!ql3c~;nLRHg*-s|#mG#VB zOvK|yPOd$*;DYhctU_DP_@r3Gp4+ezk@V2+0B|Q41~8$MBXHGR?JA^-)D$z$R@00* zGr9?(2Lrpf@O97fYEc};EWz|Os4B6p#bglayj2vcjl`8gW=S}0UGz+j6kgih)&$$g zie<3S)|d{{9GXljtWg}h#6f5odEnG>`A46OJ{^5FIulxZqtjF%6$U#Rl~^ z{b=R9$;Ltk528oUsytH+2;W)^&J*N}Gdb0A;=Wyxqe6U~yetflA(_YKnKVQBg{tzF zX*AM`6gVKFG}d5lQLcBJ0<9t_LK3FA2yzG#v{zXQ3&*1(i#p8OP3h@uMfUu>8{Ln7 z9-uMf$hyEg+XB~~c;KM(r3_*0oroVGP5{n_Zku9S!JMHs>#sR~p3RT2kjvl)Yynqr zC?*(TZZ#E)l(O(~CL#&>F5~JCDx`Ik~B$?C^-6zyPf9{noOCxSt#LJ^Hz*lJ$b1|vXrRjy1y zUFLfK3&S=>4JGLnd^nms^kzl`+3EOn%p^x2X(-OBn_3DD@J%Vg5xZ-UCKballvr#U z%oP{sry=M=skl~*y68Q6eljPfxBKUW;TzaF_@J~Pg1to>bv^AlTHGV%g;8j9=$Yc7 zC_XM~kVTP+jeMywKiBa_oUKmR#oCS5Gc*WV`p{$M98Yo1v6o!QLGssxl5u&f#<5iW zlHSOsE)IijJj&%-;K>GNm`+i>tahUT@qC9el_7!&<6cBJPv;;|F7)gq9LO`gPI>>gJWYrf z7xVLoU?#L?2{4H4M4aEYae&0xNt=?;-c(Tg#qJVlVxaP`R5=`u;@}bnQ2N5YSI%W2 zm(PKBkscU6+FAz$3rj2mMlt0tCpZ%~f|D@VEwb(rBQ$Bnr&XtM(=zEumE{}n$DNiN z9tINKHqa|)lg{cyMkx#S;;Iw^1>H>#%Px4?OX#`~22G{k}J8l5+DL+?2)c2aERb$gd zLEjU6gP0v=v@||PmT_+~Os@sJen)f=W`-p~hzZcaF5lOgiSel&Fyu;%^GH@@aL;KP*LVS!BmO~vI=ASS~R6cRL(pRw36qg3gb71gvpu+gxZ z^y( zS`q>?a2-b-1F;oi7|Q8VoKjd-v%2u=zLZFJBAT#Qb(6u$IU*_k9GXH;X!7A>Pb+#6 zke5#KfL3!dgn{o9i=KM?#<}baO*;-NqS2rgM(u z35keA*I8zmQ=txn>2RvOo^6m#PhFl(J`HQTsc{P z`SsuA@h`vn&wB&oSJ09a52aJ@g)*J4cVq%GwzK90d_;PuxG)5_sTC~P1vMgGI#SEc zyu=-JxX+~@qT(GMVFkAngr`{XOUtW9^2gBe6<^^nKqU1b)3dXSdi2g_@E&98+1T=~ z6z+wq47UJ#ywV7$;%pWjhgH7an~>lrGqQptUdWc8=5%61@&&<~;oXV30izvTFT(M< z>0wJFsuR-lUfL6)gQk*9b9xIKd-#2ZvOIh&|BAe*zQ4wp(pE;7=q%~l%eF1q(=B%D zI=eG2?HEM(?)3QO@$t)#Rj}H$!aH<5#xH?eVhf#n7FbHGPOwEmy(X%48*#25%*ktqKOXG+ulZqH7~;9Ja)! z2F3`u+jZ4s9om0rDcUbAhd!rTEXD)(iN_ogaux7de=16?Nx;d++zQkrddHKKQ;Ic8 z@n3pAFF)}a`QCBQ68s*=Ddq1cY{X38PuT!$pl`t1MU!x7joG|zGtM!FsS=75Jv@G~QglfcO;R$TSf^L8zH81(dX1am zu{VrZC=nfCgXS2$MhGgzE4Hr*!Ul93pg&^O_FNzywT3oyes9(L6JH&~wZ?5$B((b4 zut#L^^qY3r5R%52p$q*XlK0fav*$}&whV)ik2vf%lGiqM2!f6I83w#&jgbXw9olj4 zkBR}O5mAQ)HTmMfCY5xhuo;zHE3E*Ot@7KGbgF`NH-sHH zH8fGf^(MQY;?_9lF!LBumC>~$;CAGAza!imZlpdQ60rdeUu*khY*8klocLlEG|t zJoApRP%h%?V z7(h!7G-#RCaG@r^oAdyC#;)a*0m?eE%`u+ckh}JOm@|YN&hFcK{0~HkV$EliIOn~w!jTU_k*td7HtM!&Xc2W_}Vc@pVJX|GzkDw7cp5u8_>qi9aI1CA6}dvd1GL1&X~%IbbhIkiT}%^^09#N(!= z{--9oO#qtf-Jw}R%%RsA+cpfgC;_gqygr7=PC~I|WZ#Maxv<6zq0dFqH-bCp%eo7t zc#Sy{6mvGKwF{>!A#N!h`LXdJbF6J!?S~}?DvGxvV7cO?@Rd9+=WheCY&7n?%mYe? z8Qw)s_!a8QA~EiG+ViwVgBm!aa*~#^)JetV#9LdW9xY2N#tZ)Y@n~>4h}2-|6vkNQ zt)nS`SUj&VTfA@vfN<4PX{-Il0NWR2^UDj?@I0GI5)#dz;kJbpK`MbS$io<+qZMRXiOIkL{V)vGgr+v?2g))@+I^ zLvi}jq6rM-jPc-%Nt9$zFEfcENn~TY6P2V}0L3u;zQ%QaEIjG&;!IB2ZsnIwcIk6v z{w;^gS;Z4Q$JCO%?3;3FGw+c-pCNNjK2FhyjVXJOv~MzMrMhJO-Z@oM521|@&y%09 zFqtDKe>+da3i&5Zag~>OMPa|Fy)$g!GB6^7e}s~z>)Z6cc7ecwJJ6Atz2Lnr0xXal zC`gpXF)uEMU~XJ=C<(VsCl?B&povaFlVsR#4KCt9p*$wcpa_dw10!CIm4(681h)%S zjt_D2_@PAx5m%^x3JJPwZDsw^X!2p<3m)ly(_k;aKe zV}g1~R;r@;z-`e5f%b6|t}F_rmFNB~W!@4WuwX*t*nED0+t!&$Y5(w)NO?~fp1CaZ zDBAAT?R=4uqy2#`hb?g@Z;<7qmTT4^?+TTo>%t6M3oaESeL}F#}3`#M0RhBFPqa^V4uA)>e zI3%f2l2-x^@Lf(W{c_bnWhu2Kb5XKTi~X?xv2zYqMImk$nGN2cE$qEJ$=D!O#$yz| zoNkKq`)LEKSfge0Y-B^>IhDG|GSpRq_if47Sw;cvmhRM3?Hmc?r8n zbx-#K&p`-fld(o|cIMbZ1*;?8qM(7 zi_y`hllr%)6xnsk;S|Xa3Y9V_>JVUva+q&duh)9+N1IZRgEMv@nC+5FE zipg0(RpQF)+`khjgh%Rz%?lFMz9@hR21;G_;h_>I9}m2rI^r}*E#xCQ7dM2Va8ci<#%k$C!J7^*&9mvWVu_%@)^?U zEcP%43OmPgzG-52;D}*<9@u^6J~)!hh|}D2AiKH@BdtWNDB2kT-72(cfIYx1R(iJ` zl=UF!@f1|VB3uC|X&Z8cB-)aD-C9R#r7iMe2RG6zt_ zl?vfO=s6tBX57#KZrYB|BZpaM&}E|2Ae(|_|A-X?b{Pz1ViS1(h%6EDh(na#4IM!n z;ghs#h8`^>>q3+CAlou6@C!_4Ggh8U97V(B0W+!+g5wRDLR?|5u}g#xxzn*9C1Q+( z0Y6Ug<8*v{8JQ1_UdGy<8;rhV@PR5hK zNKVAMw#4&Ri3qHy-4WH*F!Q?^xkgWe-_P*3hNnz(Byb$5^-q*-RMWlYa%4Ej&1O9N z4-;&rb&VttuJCN33|IohFXcfLismI7=izPP2YLgvaq`hg463%qb5r9r9(7Ifyj4Ei zMtgW=+|I)u_OHr_TGVUfH$C#Yn&{uB!Fw{?Q=(2@6rl7!XH_{0Q;)!N&N?zqzCpVi zyk%kyF(qcrake~QJB~1TCj3A4;su}D9Z7rh*lx?uGn5=u*8hkCY%;@+k5=naQi)O6 zFR?cHH@TvVfpuz^UK%lpW{mj@YM?M^>aN;WC~GqY)Uz2}0J0|EWMlKi#+0jD`OVsN zV}$2}B6q}kt48r-nXQ}Dwi+53Gy0keQS@yMv43(r`HWegC{5T?;WVs}c@^w<`^)qm zlRt*clCfs19)ZGS_RC>EJ)^XJ^CI@{_&2q2V%o6W1AUpk{?G5;{Ll0sFMs$4TExI1 zYhwM3D8jWlwnDFRGW=8GSopaRr$c&UUtmrrde^eq>~ng00@48LVm+^bdC%*P1W{EP z^c6gGXSLOYf%#^*-|Z@Xti}qx zBYwLc4g+tsWf_T;;6yxZCy6tIynnJ2TNy=%vXy;jFt3wf3e246uRaS&mKn6KT-%74CDY|K%T!z&;$uiHB7Ug zEHue8$Oos^wekJc!_2^lk#yrI>BLyggr|T>j7O1j?1-caa{nQ;RHGK?WM3C=mCu)7h!SaCcE#%5O{~du$sZ14ekvR8}m=6ur*FY7dm^=(WW5C zZVhAp&MIcMwy{r#s`!%-!?+Z#o~evt3HuNTg={dOlx@_oHb4#w0)+CqcwtH&)L6M~ zBPSxU8xYVhHB{I315JnPzzqyKU{h|}pn+!(&86J#n~HAzK^S{YwL#ns7HoVkR8-3m zpa3iRB!~22YQ5PNU*is+c#EayZk8EbYkI!IH zu6F3nlkFDke3_+%7-;Yw)x)@*8%hM>rVykIL;Mu9tg;@Y{zGJPB7a z03o^jEj!nU#7SO#f6(m%?g1*yR|z+`QFH_O5L82E(#gCbhstOV849o!K+a@IyGqf3 z;?*B}o8vzAU+4S{#x=ZKosZmMbyRTeyU0go{?k6hYhMO=Nc(St{v`Z`G@)01|5>dAKsRi-WzBHLDrG?_NeNu=n3CM>IH*q@OIBc2 z8hV<&m!J1^o_N&6zwAkPj^5{1CI8ZX``oJLU)pboE_S&=PIhQ37O~z~d0}ABDJH;-xOsEL=F=mw^A(K@ z?wMpZ>*w{9Y)GKnnj-BRyWm;42CffSfmb~Xe>Ue7V^D#x{4x(e*AKaT@0DEuj;xs1 zY;ChHOER`0Q)O+tjFw`+!dgr9RHCaCz5$yTEHdZt-uPjgPLym@Er?;(;7}Gmm;nU;eV4rm4#PRIj=kK3e&JR@SZG(Ow zr%9ogx%Z^iulbXd4w6Pxa4~&yz}WnnjJ~OCymh(I&ZwN$@|^AK*`AXEJ;sBmvymYl z1FJ5}MdkJ4r>>=@f*^TPLR(6Rkr`R)+UOam>#xaH6kxq;uJ65l;%$1F-^H;~1Bx>6 zvh8*COq;m#V8{wzypx>`WXaz3BR1l)Lz*|SK!9d+VPFKx9N$h! z9}HOgh^e(2+F0|-DO6_T8*DpUZ9Mhlj6`)1+VT)c$86o66%t#G%+@J(8A?%h^CJ`V zF9g0OR4yL60e|@2H?rGuI6j#_=}FH>ONU_C<5(BRWzN&8arrcW<8#cf>qt3q044!i zmfc`mGwZNn)>#}#$ONm(GqIsh>$(Ku-Z;nG7FrU|Vr`9$!ro88W6Sxmi%nrODzAK9 z?kc*y_fLV*DvV=gACnKC3{1wKk3LFH_6T)&=}3UUUG%xx!JY-W;}oKk<72-W0o1vp zF=|DEE-lgHO5uRUIGlbSRo}aZljDzDuDEL5J3XtA6Rd!f>kBxXDZKK;cYas8$p`#= zxhO{r?)La4fLr5vhrX(#Sp4)Sd#8Y0x1NUe!&;+<(S z@mlQlBF>d@@U~8x*a)Jo@f5cVt|nLIu9j#(hBh_Tn0uRz#OW^q6yVIN>wDoPliLbC zsG0q4c{(hsa!WGRFhz{um3<#>2b1pWk3ptP{KNhrG?Kuze_kYtgH<8XLxVa9l@uOv zhanOyfTzox<3IhJvOhlF4DqM9=d1T{#Z4>wnts`}yo+ZmGpUvD0`6FM2ru^tiFAHH ztQ2X6M$(V*)OR+|&>w)yRNWFsR<;+*KLWE^Sq~StKR0eaiatITkE3X8Y~{JDs)jFWWjI@K% ztH~ZcLsMGMBR%U;RB-sXGLZ~^ApIzF!okp8JTr{sja!R^9jn$>K#2&?)83lW8;tNu zZoXx*$%}l0j8WsVYC$s`Q^oYMjBNw-_b@pUQa3)*ozRdG`3n}s*{B`w$%RM3X_>6a z1nw}OeFh-)Jd5e^BOn%X0xFE+)rkC-7e+j)P{XFM1P-F+ZV*@{?!u`7wQd+Eda;`Vuj5b!ZnF zyLM%7rFUe2S^ETDZ1LRmr!u+gY`vvs#1N*>UG0s89=4S?4{OYoNLv@Cw5pxTLcF2) zy?L6fM;i{sOnr>_HdyNbKK>}UtCqgP*<192=EiEU&U4XTX?S2gn>8x3HZp3fz8*X6 zve8+Otu`BVK4YT`-Rmt)g(3qg%HoL3PsQv5wH|n;jD=hpl{@zWFDLeXXEoBcTQlfm zx=?#&P;#;6$>^ms#zuj11|2ylhd0GnXF4e%yN;w`@}Sjq3>&sYSxa9>kYkUHO?tP^ zit{5ePtsM<`XLuVKDKgkG`YMuzQh4?t2FxKC&3tBE+xty4hU#9fOK2dIg(kgWKMMG zu5Y{fFcA&m@u0KKa=W+5RibUF+FG}_Y$Q+pc`wOY%Gg{T$1B32(`Ws>X(F(?j9NCn zjZG69Y0r{QPFmA8ABuJeZ!za`IN<_Svyl;Np|bh&5@(7sg$W;ZNK&;ztRdPhMlwqi z*!l+Mei)g)*oGYsLM(o{d`D&+;{MK1kQ-gN+@HavU^XKm;HMAqKMQ|IcW!e@2zuu4$kW+6QK-u1k zwk0q!t0uUO;9oBKel(nJ)4%pos@CH@tN3Y~{eiCu=yZwT)nx0Oa!U?dX0N(6KxHcG zt=G^`?E_xj#$pTa8vq8;>4elCO&&pOAC0}8G`LNC3o@5tgQ&?KH0mVF#qUCqzgops zg;vWlz>Opql%O#tm}}6IBp732jEgf)zD48cTRd9jW!k3yrk9{KD+cGL+N3;s3ewvV z(N%>N2T)?E#AKYUISfGQUc>a{!7a-=c?9?1B0qb3hS+#{Ahm37oE9yF)rpcqb+*N` zf8yW97~p*v;2Zvh#B>AybrDh1mD#$+uioydHsWx=JcB%urM}HvzUqqd-K?BQEsP`ZflE(&VMsEyWCPAm4 zGi}AaYsar?D@`D>iNn!FH^##QI%;n+s@ctd;9rafF_ceTjyVn0AV9)UEC-v7_nIH4 zlP&r%ns3DXqeJ3itN=qviDEWD|qw;Wj(qZhE)Ek{`b=cJ(c{omU$plfXfPfYX# z_`R*lrd*(S$G?uVt--K8jXNjqG$~WnmGmT;7z+PYJFsuM#vt|giEA!QXJBN7M!d*D zry{`V4`$<77r4(=^VCSwj>yaF>?atA$NMnH%)JqkZa7?pBxk^|5Jr3dU`%{jcOFzE z6rr7*FFJTICZVk-at^216HBzB&K5h|h*OR%q7%;J3}E`_O5PcYhPe`(mf5BZ4Wj5e zoq?uYdikO0N$KjnY+jNy^|p+K43ymRE?P1a&MSKub>vJmU3wB$THY`e(bxpL<2&>& zZ)o)q*HJl+ZE&v6mGP9{V-|q+7$_&he=*n&2G_v<(Xs(G{1{^U*q2aYM;vM@FZL~1 zBsUXpRTuavh->S<+aalkCu$rQ{vg$hXGXa9Wdt5}jch6n4BGE$685?N+iFY|k!bV`-_H<+}8^f%I|89On+^6Pgkg<~-G}%ykPO#w<6Fu~I(^{puq$=L=BBEb zpD%0MduiXx+7la`TX32cMx2+;jFIShW`WskD^Av2B}HndYmod!>Kwq^+mXfU{vD7L z$zK$j-~|aH@Vav4l0R^A!i6?qqTq$~ZazvdGDwl5Wl$^AhKz@v^tz~>Abemaby zY=R+f!duvLHp+TCn4p1heZvW2&^nvia^W}Y9c9d6Fqo0Gb7v6@3}1k`G(WyXwBy*s z3N>9y53^S%#}VzU2L!KdXBq%QtkMw~2)EJ&d%))kb=|!dEz_MasZVb^lE*=I&1ag)R22R&*E?WPcXSaRxqa6mEa(5k3z%>k2 zY(x(>M?9*#eF}em?pJs zW!O!WoF`3|_eHwN7j}H99bHedMeto~lcj|XAnX#9o0;sk7=5TFc>rZ1G2xlRjGUCp z;tc8(DWee-5lAy)86|v2_L6DgKef9)vj%JDdIIL zLNQ7j=nKkEBr^_F!F2Jm6zPHwGMj682bHTeW$mqPG(_16Bx>OZlPN`e21J1iDTNe$ z(wdIGCBX0_@6V3(MIyc+=vj=V9k`xFCof5wF@|eO%xAiWomq&y4ztv6?->-enulyc zzFhY=yT$c@1E)qZ&e4~M(w?_Zkl`F1hny~&i;R+BuUb;#E0gUz)VT)a?E8YyX#D2R2p!w=yN_GM(Ch0iGkP^x-I-v8uMT z?Z+zJ`d5omaFGn`p*UjhJYC$}rqz=09$w&gzKT;j>NE%1NJ1Nzq}9r5%3`Ufv`rWywT+1?in|>!80Z z-}}u#I_%T@HS0}IPM@{$4ZG{>b%^Ar3GBJlu?rv1dM!{=n{wMZ?@{b0)v-J1i=g%D%(Aa)om^c!5t&pFv340 z6HXf|?@#00EG7$)&Y-X`k4d^~N=#Hh*-hVvB1~Eo;WyJVE3ZPEyRrGzj~99mmNZH$ z-?wd#Hw|UxyoMNcp*8{X!voeF%fiUdGl@z|?U7do?u>UC+$q+`D3D{mXSRweta0+g zj*?Fd*`9zr5-FywRsWECk%wD-Qs$5-bBA&uDqmwt<7Aaq#7|f&T110TI`})EwAL2l zreGZZy6tJX zdR(2&jRdY9_}67P>)X9xR!?p|47ABC;<>WO_}%PlZA=jEqtl)unlV}|vD9QPRAZ0M zAsv~l*FscXuPc3c9x?QA;+Tyxb>fjLv*OS@Q%x#v_|)0<=Qho9f z89b!3*bao6X52R{i1BvZGb*e_&L|czj~N}twc@@IkEFYZEhb)SW7E>|b7?QY&8|IX zaK>Fq*(52tkB&5!NY^}Z2R=*p;(IHQ0;vvd3$W0?qtEHc`^uF(A}Y{T`^_ZkG)0HzsB^zz8=F|%VjpR&aqjo-J+NQgW@L9Jr$== z?%3Q{4J&PGrPt?3FV?Wga&Qadyn+WTInPu08MGBYi0)v?HY{<+CHrDW$XPEqj>FP6Q`y*ex@L9sV1I9*Zu4^)ZS| z@i)I>t`k!*10$HITIq0O^MH2nZ1(|_r`(T&Q)!=_3fg@v!;jEA=I=E+_AHcM zpEfM7VMIY{AodCP<0Ys20Q9{N=8one(DGN_?wPy;SR_*8W>i6C`JT8Mw)z$@I%8x zOpdDpqY&s2*C-HEwqzwlZPMqOOFD4#W#~CaSCFVXB_bty^!2Gn3Q&OjXC%8TTqDtr zy)cGWc}0;?ruB8cYGM(eti}hoC|zTuO2Soq6|{=;6gJHl*=IV`mI)s+vXMk21E`Bh zBDt@m@W9W~yC#K~Z$hTQLLfodK*52^iO8|P_@Q|{aN)0RvMKIS5~B3Y<#1{e&!KrA zAHC!x~_-Dy1xo@h zepRF}v`ppXwTOG=65^8S!a9TX#JeauLAonv$(#QvtM;ik6evAS@-d7{^=U{P=_##+ z8i_@BSF8s%Im=r1lSU#(nNmd{NA0-@Q5Mz?MY@m!AA~pQu zj-FNIh~(jl6mDUOSNrc$y{`xhniEiXNxY7kSZ-|#9jzBOrMyOBH*nkHXZj2^qz`Rz z9PzvOc$9oHNNy$kBqS=0*|Q0M^VXXomIO{8%j)^0w4w1X#TERpbXP( zSmDzwEvA?Nw%-jbnP?ALfuv{M;gOVI?gyRUfo~2#O>rCcJP;h)+Au|^A!@}gk`N#@ zL4{88EhTkYNR}`Qr>I$B97(sa7)0jb)NZxbN|+)6>{~VaZRppHL95W6IDkJ1qV5Kv z4R+`m9IgOMvur05wn=@2%u30FCRQF4ih?3?`%ik&F1!NXAw)WrA^?yd3q0r_eX^5AK3+%u3+WS!+s^2*$+^5k`cwl>k9`mMAgaI;~shS z+@XT793?~d05z1}qF_y+u0RU}|N5&yQOwb83squhnr*da{>0Y(JXy60x5|2hotk6Y zd-_nNab5sHfO~=>9EOav>k9sPCvO0=X$)w-*MyBJt01FXwfU_FS!=3c6*1jZ)1pvs=C&H191?qvEz5}{q867OO=7;Y~}kF3g|%ZVLc zs^VTyR{Mayw(=h%|L^5LHYF|EtJM@yK`%&EYO2(fU{5f2OpDX^B?Oqg7;m2r^p6f%6<95n!rAX|AB3ve0CX#)daZ@8>DyMK+Wi&ZHpaa{_I#r z_sR2ivTE@M?2sp2rD(B@`;OfuNZ>HHb`5-;^@usg|3A=`&GPBy&SImdlQJKE!2PgX zVt@CwuqS_s6%-Ef+${K|2$2=-?%bg#dRf9_HviHy9G=tvKfYx$CU0 z*Sdh3mqzQwvGlDKvm$zNLuO9dB$RDRXu$cl4bHVxTGSm94VSLlRd!jr$HBU39if-R zo5CsnIl?hZtOjxkG%*va{OX#c4{XYJ_yz-5{Bd!ctNnqSB}pANfk~H1kcVS?<|xB6 z_G{w0#7dN8aKv`O9NDo+grDrQwBVfD!4dLM$mN#u zUd2N}v3T2jMG;CDfaxg7F&>MHt}pA}_6=`sn{GdG{M)8={lq8E+G{+DULIySp?;Oo zm9JG8_Dl_T%^i7okWNOf-WoqAj|e=<9Vvs-P2HmNYDzA~sMBDpmOUP6s0OJ#A>8@1>`@Lms4Smp=^IKz3>gPWWBXPg;tAa;khW(ka_78rn&QbuCf!!;ryK z>^B1EfQ>yR5KV2+wSsA!Lr=jwQQ?gL7bsPp9X5l4?v3L*n?>Q9k0LV?;QSTgb} zMd|I9!o=~7q|Sn{Q;%CpO*K3^Y@ z?O||?Y)M)MWIZq;&ca;0H1Ig5k>28_rxBS-76KC?t<$YJY|t>dP%(`@@b#*BJ6cWOGnp8V$Ak7r5}j%R>YTV}fqkRX zpNN!+P8F^Eu^@JEw9qYVeH;6#On!#x@M8`%H}TX&CY<^3cF;04)^qSH5_jlzPA)1k1y_RgHQ($EGOI--Pedi?Mx|#qM>bB z6GzT`@DW;mWz{?ORx%BAnwzL&2QPa)`+`)g99?YBK>VmD7roy2Z3(1CvhHq8W$|&i zpe`=WcM{X9-(r>KzcQrypD+_T-@0OYURtz%Gz~y`NTuFh^Sh5>5VwoSM)q& z2BCYgpR{3qU`1n%kB073dke+}e0m!dS%|Ufkm^nA4495(J!Ec;FH=^6hV&Zy5SO>? zZkuD&Eu-+W${ngZ&wwMP2}o2eYGpRV2A0!u*I+2ev`RM^P|wAOF=`Yq@rpHnqTWs7 zwRI*5pYb*BBq58iw*!L4aGXS*op{fv$^P+J_(#9!X^hlrkV8d405yn#tq~z-922Y6 z=GelA`2=fm?6hch8PK-!I$NN>jjVyvG}I3Gl#j|d+%PB6lv`4ly2gMF*^-GrI$5A^ zM8!A205K?p2Xv8yLB6EH#Dw zf#og_$nU~XAAqpTTEpC_`}nKaq>3KSP}39zWp zW#Ape6^zAeNE!OW=uNc?I!7w5>Ce6m>&!TUNwE z8C8SuqW)-7a_dade8>d3CaP%0=7|=V8j>1$PFVuj?npA8X^!{aHH^m#v?7hSf_XMs zM$_Dh0>UMoaiL)`&_6~wboM@ngm^HvaRf99*kRVrWjPCp)Q%UQ zj*`zzoa#Vk&=q&VoO(c+kS)-X{8vc4Bx;t8<$as=DpH|zghtXD388zA$)Pf%#LEdx zg;tg)kGiynVf|rjYoso!W26~|zfG(YFGc%zbWr*y%8F4bSzB^}eP52`wNgb%Mh%@Z zK###@(%3V7>mV*&7cPQs-Q>WwPZ#B8o)>8-RjXnubyF$Pm1y5qL*sP>H;N*>!p5?> z#|MB|hUi1yrGe!l87`6@!33iIX_o`R%nG@ZqVP02oxuRjwB)E+?${nfD3Zx}U`2MK zB&o{VB1v!4`!T6pDCkTjrnFYG${Ly+ZxLwWSjvH&tycLWhjF#-Ju3f((!QNk_C|tP z*^F?jXQU6*grDb#(L~)IRGg?S&?~DB^v`j74<=>nuE=3dQ?}p83YDP;n~*rpxemuH zmaL*^qh&0urac)ZZ2Gl^7S~pB#~a=CyvNi9+MVXhyHT<=+t*dYG(eAuTH$J9GN~Yu z6p!#IR2*5|jvA1g=mph6i^i>{BHR{=rC^Dwn2?EA!fQ)QBtwCo8oAhNdav;>T)9>O zYS~-P3jwYO&_;>+tyEC@ueJQ`Vm?@7Kql=R(;qfZpYqzFEoi>vn1+r74efoYKG?oT znevbopKVxYh$u4?FTRlth{W6+B*r&I_piNTOnc-wOU8iMXNL)?4UbV@m%H_n(=B=q z#psxy;jMsD^_bj@WXyp>BOhZs5JN@8Y?+TNoCb|6u58e8?0~FgnTfmPOkyli_E!Zs zO1&PAN{!r&$9RjYPM-Cgosb^9*u~lFvAYB-K$GboPJC(db10aP#LGwu5WC8z+WysL zzvXm`)YuNfyl+fc+~^|KZ?L1ytigZ>(fy6_5K;&hqC9i?rpcjVMf{XE zBa;k4l@%O282?>OhyLgl78&Nl`+zauL;T;4!V1cd!Cz)=pZ&g=YoYZAA+D$&j1%zV zu~#zC)?`jH-4(YPTFrV_PNT&6AoUzOP79eNsm+b{Z)57*^Y z|C^7B!C>%oZ0wo7M42;YEn}-)ZWb*^jH3uP#}ljv&W4jE+q0XQd1p3?G;q$bDQ=Y1 z+4T7DMnVoqzbvh75YptH*h(R@$W9Tdw2z~>N&X4^>ttZk{YZOXOKG~cCKQndSmVW+ zby?1e@oj#SZ?k2dj?3!mBmDKzw^)2?i&JAi!nm`$Z65)}qw5a_$w#Dv;?CZ9hFU_wr8#Me104gmQf{)Q$`^D~sPg%aqfGq3Ab>r+t3$bHBh5 zuoCfRfPA0y z*`d1q|8;qFws+idH@$pi3IRc<8_AJ|CffX;A$7L+98y=Vlj8EmMjo75H4% zDUr7GBwWx)TaKXcGmoM;SavES1uFasPx()`v5d`mtW~O%g+7PyP zWKhZMOJC}BVer%8tT#V0(6Qd-vc)eo`M*GDp;*MdznHMW(bQSa+&Du*+NjY(p(_Z+ z@MdTvq9#b0^`=M3XH63avHs8Jr#vh`1R$PYG7T zc*TstP3YZ{-Cd`iY0EhMD4@us}S&K#B=8O`M8=uu14pAa;XGzn;(|({%eKt+~AIV-LPT zsI1qsC(aLZHls7wgEGls2eTQUN{yFW3LUY80T&xsW+CkDaha{*RH{S(dY##()n@JL z673A~rVT5O(Z+GkSO(ahIvfAHaBK#w{6iqiKLogu9UO!+An62-5iRCf{RucrY2q-L z3Pnu8!xhfV=3WTbQk1AhGcP7^3liF~9S)_o^{H1gUYdX&&UBUy=uFMpWSU&<)@#~| zwOLR$A+q6oO_pCxN@p{ccB=vV{qt*j^32(5nRpCCW4mHOMLVr7fr^LQ1IAG2%M9tD z-9r>u1|uuU5jV7}e{;JOG5Am>jFAxPYX>RJP>0N`NQt!sdPKtV+9bf1#v^kT8(eF1 zNXL(D#_u1N3#~w6!|-}j{X8)^D7_JLj#zG?k3Z00aa}HM^k8PQ@6nKbV@w)<^HBUj z$iUzX!6kWMEUAT`AFgw(2sYGff$clVT{*l>wJAQ?^Swo_J>`t4$T|Qm(D?MiBW7C~ zO`#j;cGnzW1I>Y-G!~ur%r7|a^+?W-$J(=jO?4$g5rrJ`-{>~cbyxiiN~UvWhR%av z-KGZ$UmT?K;CFg>=;51o+D`L|mngde2#|plz~Ctq6=nID`>CG}%(pSG)OWCSucdZ> zlip47@(1Kvhpbih&D;k+!0HqiPC-8_9%EXK>Iu76fG|_cb;{qwOt3Mwq^+fKVD&7b zeRz!P>s_;i8>>Ic-@*RdFg1bwH}q+u<9igJtcGBPJJZVu9z=6^?8|DRYt!k_@9dxV zeq;p5nNd5-cGtA!HSy{9zBI)BI%WO&edf-eWlxz|#l|S3(CZaf+u0eJ z@|JbkAHvmwRxqU_(Tc}s0&yr7*_va9!r4{zf`F+%je+p=`@X+(JOuaX#rbUV1=|2W8Jfz2`6HEtPA|FWIXY}TJ=S9wtoC$Y(wODqecAf_Kp zvCz#QFQJzGdyTRsU<{}%ltK!DCe%@LBfpOAN~$^ef(w#}_5;M)yDt1jU~sMKe7o+b zt$5o&Q22=xNfkD7i}5&)!^H*F*bipk6S)J%dET*yRs73Kn+BQv>!9GJLGUkzDMQ5w9}aY!cSz5RyvfQ#=T)w`&{OGp>N~y$^9(+89DG)Ck?GK4?y|qF`h+opzQrfe(lO2 zpR2hZ3Gr*%3RCAFcJ(EU0dSz0 zSa~5y)35%|7r$H>D5CMiAvZ}}j){M}?io()NOWg>?o`Ww-Bo3si0C?6wnU7L%07*A zL4dhETY->hYi;mIJslxQp`R#f-=P63x&cZi6N+B>^ z*5fbc0*dJKYN_&M!g);}CHejrkL5y1I=tSxYNuZSO##ct) zNGvX=z00KBK92L#Sjv2G_T2n#1m#@+)iQAxJ4 z6{QUUtHzqcSy}V`j=UT&zE@g4I%|)r}LS+)}E!Q?s-N z-op;~IM&l=`D&O(9+Rnr3|{1#=rM?jxQe+W)JN)#-Gme6yV%B*oX<^u8`ir)*2On( zs4$qB?7Xh)Ly}S(13UjynA5_0e96jANiY#v2M$U?F-byUIR~>fQN88>3bGvq%n+Bn zl8BEW3d!{|CA94m0_B7$^>kuHLxjrotXr_=!5RZ_^z;}JJHW4)KlT2n+j0qC9jFy; z*&7PumVFf_hxpEf=~n?+)sFAR5kVvymF}1EaJ_)M9;N{z+>i>?Hu{CoZ9*^^jL!Cy zL^g;q^M04pRZ$tllS(7dQ&qQJDp%M|D)~OmO@j>C@4+tJzPxTgD62g*&+8Wipq=m;Ta;Ct=fr^F43eWUQuV$MPf#TK}63~ z3=pE5Q7oPc&I*-|r2cD&r`*APLt+p&aFl_`uF?gE2}@y$rY`5|fJDR&M%fu7>h>yQ zmQCd@aggtJQBn;d!X_^EsG5KvyFwT_b&wUM+iB8fV_oic!nHcBUze>M^0tTl5hoSA zqlz}~zsHv!&ik&P_8fDHL|lIhZ?Z%_Cjq}`HK-Of^VCX@Z&n~gsFWkkVjwuqSJHbh zxCMx44ahlMoQ3$;QNJu0^N+-1+=h=}OuhZRf$i%;R%|Jg)n0zsy0r}ovm)DDoSz-- z)vq!`&)h8rcHw=lHR?K<*`q=M6iX$XNc+#RL;W)WYMjzfBv(ys&-Z4!z5DK%MbfWe z+S8I^i!tqs8`mY09#`gU5eULCxij``VTvV3gbpY=sPB`#={KP}^zvH@v4_6x4Zyr7 z=3zJHyy0_6TVhT`(XB!l2HLldeuw+rxblpyD0x^^bgc%d8k8}=mc6H^;H5=s(k6^` zKCiQ^=&q^V2|7PC%fH;b^g=*4>b4>qqsjz9MIgrCSu%8*soB^i4R+9(L^Pjhe>%UR z96-)PG!B{3@Y$k};C@khJ(@o=8>3vr2{<;`8n*+#JMBG2w6;!(g7fmox8|84TXPI$ zbg`a@?x$o%H&H!_Mm5-vduCF-UuA+9Y?9mu!VScoSLGuYyY=R{v6xoEHSNJq{2d!i zxr5ZMH!YUz5emV)NSo3a6+^|T>>w~IcxxJoql!ugMQ47~`~5M@J7#Hb>a^MW-C8}Wzyl%7m0T{{I9q#zYlWgB`Hvk`+)r)4+_mz6Fd%xY#i~oat zcVoOQJ8!EsbB)>DaVOOot#e~cxa@FmP&6Jq%;>k)uCT_$=)-@lL2cg-Y0zX@&{ds# zXc3-$^c)$oRA%FNJ;J|1g0UDq0a6OLj(c%QD?ef18Vb^iDSZqiifxaD{d7|KtMUpHp5%bf`jcau>p_8uR=$#O28iB+XtSD;u zZzhxBgsV4~)oh!nn{1qopLeY-bXOh0E|m5VYJuh@4Uruc$K68eD2aus+j_*8Bso|E zd5G11lvTizsbRNWjdbtu!MiVfoa5s||LTaojfOfkU-A2I?_BbZ>8Lb1!mbV`*?@b1ras%{yyz<2I7t{VQ-zU5Qd? zjU>-xH?DZ9=9!w>t<6>@w|9Fkp9qnVj5S4S3Cfn{*Iz&IB1L<$xqP^(L>57y(QkA& zTIc8IpSHWYX;mTCO}!QEof3`8^-dXKRNm^k67`yfb*q}Tu1h0|I^SEvMDa|db@+IR;3bqBUifA z?NR9MuBjgsqG80He1Q21w%y7?0Y=lQ07&AlZFg5MULfS@?%3V|wso_4VRwAtahTq< z+wvQW>Dk%&`T3b9wg^C=($&VC5j}ZbmdcW8Cluab=24sIxoLH0ef_8!qdWpT6hl?GN8m@*>h;k*Gkar1 zmX8`RgH@%>NoAj&+Is_>*zViGH(kE6W}p@N5m2q7sR6JXY2|7U%vRx9m*M-pAKzCR zlzOQikm?{AJN%EmY3=as+1Xj4)@1TYm68QWu+#AstpGdvS+)BHya7sGOsWY^*_zl1 z;CvyCkl+YR3$`olzt^u{GvLcqkbWlf*?8<<-^@}mPsQSvS9~If4S<6G*9rs%&$5d4 z)KzECRDd#DM7Frf8W`fMiXlAaGl$6K(|Dlo2!M#Dge^D;J6EvYagIfjIRBZFUANb> z6CMIF1Od!gfahzhcQyO6C5C1h!boWOILlaQ@u2ut%<)BkZ~=qUsik;=uO`CW)%&sl zp9*qus3AjJA#=1v*s%g$R;}6qCbHSkfiU&5m=JJay%AO23bO;>y4G;YXmputNl3S~ zm`%ke@Uj|2u|jxxL-qj^mCWzhwP`pEyyTF204j?IS>-2kGGL1!|7%go?W&OCa3v06 zG7*c;EDz{9@Sj(v;^K0AD*2bGUlR%b`&7In+0TY$56(FfD|vb=ogjT(K5I9FGB0J{ zmL?9s#PWkMC-Pteu%FSJx9{G6`1s>!>|c{+w)}iE`Y?h?AMxYI(J(c*MM9@tq{v%& zC{=YG^x2*ViNhLn{rWGUDuJ>$EV&40u{shtrd2yLCGDw5bFvJVqQ+XVfCPa74bhD% zkCxgG>$T1`43=X@$IpI`TKc-`}here$7!jMcP+u9&2bEG&&CyEMb1 z52h`2_4+&o27t2wLjl@;*ut?@s@Hz@=eFK`A`Sy%VqYG_cL&Dt~L~!iOR2KrbkCCyB$1bQzFOtCWsE>GdOhzQO`lK z>otT1EFql}K(KW4*?B~swgk2DHtR=myV4uuWq*7Dal`o+1)0b>&lu6eXwdnd(CA1Y z)IBARQXi%#rzZ>jbu?z#FA#}m8Hyj3l2~8btO`$3f`UT9<5<)fV)bk$>@||`Zxm~P zqz$K2SJBju64aqf`39J3^PoV*2~RdDZ8HY9Tu`LpMhT+hhl|i7-a!msT(2NoJ2`Wa z2Y2-&=xcSP;KNuCqY9lvsDM_2`Aeh#9{vp?V>f5aZW-srpjg2s6O0lNb`%9Tv|XYy zAjMco4H_ES4nzV$coms#Ww#24DHtxm2KU*91Juz$!Op8RZ0sH2X}rt2$DcN00LQc5 zm*hUx7Q-rcj;<7B=o(`f_Ux;@F53%mY**-~t}@_3=3SP>>9c~^voy7v12}aG$o1qC6j9BvMCTMkH&mp`rl44>xNu-MK= zRYM7vkhM};S1CjK2U^CdB@W_W(^Gm9n%nh;)SIXRsomZVD*ol|u!>@NNbZb+fc5cC zgTKrHQ43iBy{!g$F@`2W@fnrw$vx(YWmm}iDc49@C9l~wClHxN+0IFF88nqQqCDAd$cEo>^{*;y9qu8UhuHRG6!&N-ExB7lAE<)cZ%yS z=Bg_pDq14b*^m1a-N{l2x*W!=SHgS`G3zB^?|pcr5t`Gtl;zM zz2TsYz{IXeY+Ts>qDoa~tXPUpe{ZlvSGmJVt5gtD| zAA6*@rPsHURCI}nE2ifxW`Eb4&K`nJ8IZvmh_h@|Ik<-BnQB~x}$0u*31 zEah&^I6^O(VhltOU8Df+uv~k-WY8(oogBMGg%Ngl+#9sUQqJysZDG z;o+|Um{pntKj}zb%!ML2kH@#}P6;8vG*&q4?FFKwA^OkVu-OahkWcKrA{0+ov+^LlJu z9RQv$=e8#}+Fc%1s1I7NH+Y!PJ)L_$Al&T$VdhgqieurNJ)&Ta<2_}2abc_g-6sN9 z=WEn9$;ohF1I;6SXnpakS6r?@RrjQf?VNOgoLU3JE$~jb?@D1z5#D;H;w0V}%CjqX zrsaX_J0Hkan%^ke==Pfx!3`d*dK9jOZd63=w8Bn8*`uuFTm6d{`$4X?zNNd&JL8-2 z4zm01eDZc<^s9MG?|Y3&>ve9soe=7Jc!ihymtZA(A_C6%!ZGJrSe%8UFAlG&3@#P> zz%3QzXs02TZQlw6-jlg3+SHuXS4Vi*wLY%bBKs%ldd*Z%v_imIVKY58?t*G81z_QQa$OnY)L6Sv z4jai1sIu5{ud5r)^$^lTrKNas_M&|cll(JkCm$qQJMg%+a+Y{&oP5J_f_Az&{Xz&` zR?bwhH(!~^MvON8$taIdT;-^oz*9dlId%we)QAET%o|v?4^dSX zQ!2io@#dO2&lZAMvhav0dTBW2g%}f_Fjm~y%MWPLMM01b3!Hdb(op9Y%L^&THyJK~ zo0m3bB-#Qx{LZ1ZjIx1Q=>e3TgYs+iLM8NciaVyjTp=8+5QM`#buzaF40wBRyCJQ#dC1LbucvnJNmzIfX&c%7#?AUcp9RGH0N=&?VPIX( zjQr9fXWT%t#zGXX!Np$xM~NKlPhq+XsTNadzXCb@$?mYutBqC)stB%XAy7P%)e9tQ zbUY#~QDWDIIrl4O2H|0~AZRTo#F??IL9GW{FCBzu`ZtI7=00(I;Ybc;!@IP8CDPVN z!**zmq;o=G$ATo#Jky20rvklbQTDi^nycMEfw)S!BLV%foLX}3&vdByRYJJqb_dAr zjB8HIj8+UZv%bXk3#>HS*29vDm;qBTkAsyO!tJ@xHcNTLifzD%&D|ppwsnb6Bi~>z zU|s}xQMV@sx?K|?x6Es^^{0YIx7hDzmnluI=t6}?=L=(UiRJ#`>zlSD>hI&M)qNmGV!zL? zzj(aP%gHfL+Erneg2EWO3y8Z0qP1OnF!=i^ce(bK9aGJTHLr`Pr?Vo$^!A>RYryLBx*JL^**UP^ z65hW}@EanqMY9agjSH(b(+7pxNFC8=aui~#(;QPaa;kuSv4Yk1?0DD3Cp^I`^@-i6 zWJAje>!W(f(>$!n(OBBdNty|6A0FJ3CCgdvwM~^qm>NYXB}&hlw&&uDa$qu~Y$$BH z+*b#u?Vo7%4HUBeIOL(NPtXhf)HC6v;g<&?5U<2e*wr1Z^Os+;X~*?BcUv z{NKUuqr1;zR95o>!?56WoNq%I!WMR+W{cZf_l%e5_D zX0QWrGlF`FQ6uy>k@oGC&srt0?t?R85iQ?7HrV-+E)IT(6#jmVhjxDt7fq=F6DtS! z5?<9CdAR|M`pK8>1E3QgA$*f`K3Z0%^{DR@-a`*_qLZ<(`Rv{V*-I7y|!@@(%wJ+aCY5=Ic z8UxC))Q?!OUBrAE0XKNCj7d!c@zaG@UCR?DbU}yrYFwYe)TVw_^eWxCO>0hYnib_^W z1HJ$A;Lj3(VSwuiux(?!K?{^H<{pi1sHJKdmUH<{#_7Uf9N13|Y9Wtv-6`^Qc6BwJ zaIu^1GyDW&uEF02{lz&3<4*goU-5xY>i06UR@=KV6fN3VQh^DEgCNx#; z0rD~5$?K`g&@@&(jG$_)zW#}!bP8Lz{A z_sS!@6Mv`Y(mPC$@kFq=ftCBhCP{7WCr-{D+tR6n|7 z2Dl;_C=*F_!6r>~_C!5wXovFD1X!H)R@yP!M60v#gB$DGwYiCR(BX^ppWwR4E^%yE z(DRHpdmO?)_CB4OcBKwzgYL}V6w<%yAu1CYMeWNUZs+>$4DFoL`@1GD(EkY*YHd=% z(?5{z{{cqvKZ9jyXZgReil4F?W`GfW{efa^wj>N;`lS2F5H&m_6J{^PU{}Nn#s$@+ zJG#B(f{$lEz?)F-67PUx6R^h>s?ueF%dvHYSrf$JHc0>!O!(K9nmw{)vL{V3tM`C8 zHL#Wu<(`E>&8{BSoFBVpmgWe|JUqQQ``J%j_cJh&Ck}Gy400$m2=kKl0iSC z&&pv_aT!Oz0RZg%W7(z}1GnrT6Re;+lVx(rU4YHxYn+EezEme=%a`8fGavnu(a zjP=rJ25OZtqgU57P{N7B{vx;4RQ2#|?VwfqliQop5lwv8XxJ<+zesuy2b3!Y)Y>hN zR33bVtbt08$Tu=$=a%Ao(hytoznbH%9+Xft8P&X&#UFB9zZRo-DL}X0X-u-%cSuJL zEmxSZD2+JHQ@SKHy7FqP67gg<)8=o8ra{e>wNT7G;puTbm2{O5tf?^3aus>1j7s$t zu025wCuxb5r@Ohp*&DhYQu-l_IQ8ght3fcuHD*R#SY4Ym?z`O$NY>nyJgVfiK|A0> z@l3Y&5!7p=(;76T1T);TcT>yuCPetDOuYAUVz$aplJiBZNI@j=ArzLd5pnh7aOUE3 z>Wh4nr+?ZmMBe=Ks~)7?eLip{;{6_Al9kp((X??J>p>R8W46t)_W2|pZH05jm_)Tu zSRjkwp2SA@6(0Seh(cO=HM5{qqB&vyz!*aC3Dw3KUt{3CF@Ju9PjkQZ{?pp5=}E8G zP`Hy3QHXXLzB-$bs!}uCm$$r*RjrR&-S5v^-Cy50DG3-GknP(!R!<2MrAs`m&^|z1 zwCGnn&WcQevqsB6D}>OxorFbsCqQH8-q@U$_D&(1ZXk$NwuCY^Rn zn8#=IOWFi_#X z4LN@%m?kKr!MrEhlw-|1JqOgHkc2+J!ZRCCA1D(Ls?3HA1st9l!DS$QHjDFDY$+^0 zup2l)OKo7R5Z~1BTo{0VI?1*(MS$CTGun2R@b)GyU;J^t3o0BJUkkKuvOcZAVg>l@hkmb#Q}X@eD5y4u8tk=POc6fwhOUV&eCB0 zD@-qAqkZ0x!_5(`*-!o%NQ5KATUBGC^>C#(ALc(dZrRNmL!~f{5;Cr&mw@>G3pQu^ zH(UaBki)^O%AUS)Q7m^DUpOMrcoJi+?!8oiXf zhCGbaw}$9(W)HGBzd>!)1Z6iS?3teby7=8RH(&g1kc0`3oH%RjLA{@J2p$?tX(sAM zMW`HDpHk9PmJMuxoNm*Ymve>u6`@FIRUli02*v0z1JztuS~5dOGf|ASGgQz)XK>?H zW@S|`Zn>WO;*M@!f8oiIFP<=QXWPw|FH4r}fGxIV=lS+|KJxi+@xS!>uyM!zeR@9N z8dD#vj)o6>z(Lm+4^-6i$@J|;fg_Ky8W+5< zYX=p0g5+5Vbj#kMf7DQ`iyewXF-O3JaZ?F&Q&Wc}vv%AVWy~loV#M?w;!H{SB2I6_ z;_NC2axMf^N#uO-_0Ql7PngX)+@Dk2c^?@U+>SOEn9@h*8hxgfORLX7Y$&^=ev{$l zXawi}HpU8P!c#-c$ET5I%HQh8XFg)#~~Itxd?Twfv>fQ_Dqrm*4(SgYbid>w`W zSVP7$kERttA!Lr8Ztqy?RFxRXRn-7-o}p*X>fl@|cUV|Ak?|euS}veSRfC9Q;avC7 z-vsWMjL2$l0!I2g*f^3 zrm?NIKeC~}KG)&1^4ThNx=EuKTk2OQFb@EuNxRx3^uB{Jz|o@EZ${9xWoCW(>@_2$ zUvl`QciJ3kE3Uu3d9SRMkFyC+6f-p(Fu)4&s8|qJr31$#yCXvg6ry3naPzHu3d@9E zaZHUiNRQ3Yyx@dOMyIzo>lXqU*$RK}g zRZF-_%qVaO#fb36Su9NOr1(lSON{^ofbmEK6uj?HLUbHBkw#bwQv&H@e4Kfl=eKTA z`%iwVB`yUeBj0L;3QSjYEp2WTYo#4(OEy959hFX$1$Lrv;6e+7?Xfvs&~kZuQqOpR z9d_P~^N4tFS(}`b=I51^0RL3&_P6<8n>~R=UXtOEBS+}5@B8c5 zD($y@ucqg(6Z%8{_X{-Kn$BYnUwWKZUjB2~tLZ7r{63dtnAX<`-@0$Am|o4?-8xu|@|o3WFh!}-~@9Um5I ztG}fY*wrULDOT5;$?Z1&U6+;g;K`EQXcu7Ebj#?dC3x1S*tPLE8#CtyH;Q#qv|`MH zS~lZdPkcqCpM9oZ@03VV6G{MT$V`)ozo4!+5V-&zE~R3GYT)gVJg*XibTfX(@t_O0 z(ON7<^q!C^3LUuY1$!^v^5Jo;Qf$l(cB%cAvc`><6SCFUm*=r;LC<}E9j;m}g3~>; zoS34kEmwg`{HxFmdoW<|+<4k{xyR8_8NOq{!kBE8MEtKA2-u|9w%@Vl6S&ELgI$7; z%7P<%Z{@|wDB zS7tCWs+C3`PqR#&8v>8w%$YeGGOjSlCl~-iln74-LhXGppYjRpAvg7hcyLZ#Sfi${Hhyvm~rMpEIgzoF}O%VgjfG@U3!E zXRdeU38P|_WM3wm2%?E|@y^FMFXLPd;-kPH^;lVdmcT#LDTfYiy$Z0muLw0`1wIeq zw){2AcxjQmHiOI_ZDAYE`ZiUNo`igv_g@3CK>H0=(W+$Uv0bpZUy>ct{Y8@DBxN*GoUpsbT&@neZ zpg6?quCaPU_59Hf@q8z4CGE1yQ_VNUPYA|m+D4yzx%-WpUo?cRy0(!P?MbdmKWIh8 zav#M`t&3*j7)X94>HmZ=VccSG$Uxg+XR7+q;-$4;%!CNbxJ5 z15DrM-{l`(;zM-oYJRRsA7d?mFy|)nYWD?RJ!wiJE`H@z=@BOE&c||JAaTO`i~?u( z+?aVXCfRow=@#B)sJdTG@gAss2v6944}xJ&op)_{JqlFY9%flbKhI!=ySBRW;8*w3 zTQwMS;(dev=RTY3!idEH4gi3K_zqXs#y~G1?h2WStZQ%R#4>)mV9j%Z`k~a8u7aP|aCFitCt^ zNdxn{yvs^d+@PatR&0PiEe*A5f|@7m!xCXFF&txt^j(qX`WJc zvJ*KfDI*flQ^EwT77h&Kw%zV z1B_k@)tEN5w$oQ{9>lSx*p}_rS*EV8IybQsmtP$m{G9%eyy*6ixBBMx^s~EnkB`yJ zbWv9=6f2nSS9Jbf;My!&XL*Hap_U?M7=Nm^QC+K@%89Cn}FE^rCBo9o5Z1tgJc6$)n>})onpQ0U#ljZ@TGl4?~ng4QnzT=b|IDkz>PIllA22A4;G65DUF=Zu-*W- z6YeoF8e$>#5w+KDGH@_SWay@p zt)~>#Cxbrk{gkVEU8nvro4!6t^jmwnUuWJ?>=97vOb-j^a`*aahH(h^A*kf&n%PG1 zx0N}}3=$aDG+CVOzNn-^J;c6l)d8W%sLK_$>jGE2ja3DeGvhV%hK6awN}N#%(+Jf&iG_O4 zylIxwmN+swq=!T;SJiG5DmQM(FIYK1$nDjKiae6V-ZS$_1!{jPuIqu?9<$hXkV}@ZyrFM%j z*ufFV_yE(fjh~-tQ)O!0OQo>|-&v+`K)}rIR8@xWQsad^;h*geXVjYLZo zu)(5?C8ZNx3`ACnE7>ne-i6uw=%soXD@qrG<@wwhDgUxV-zM&>$4t!yu)uSRA4n-(iO0 zd==`8$3pLi%BT3%k>^<-Ps*&kp zs3Z}OO{<2{)2$w{x1&r_q~w=y4*u{g+V$8;*+FVm9%Car=h}YyoZUbiMtR`z<}kZqV+-Qb+t3+>)QFQpvunoh0uTHPV8kw*bUk&*CcF!E z`Xk*l!RKi2%Mpi9hN*7;X<3FmwDo}!CwJ!0uy$2CAb>VM*!N^DFI@Vi{jofMKtJ+> ztrt#S;h$CHM+}$|3@C#*~Q7#*u~Z9zxCS5yw*bu2x0EOQA3(I4l?H$7KQkf zAVO&&bwZ7Q+oFg%7yhL->TAkH@h=RTM53)f^v1g!+{3(-HY7kt?w!<}AeBfcYEBoZ zVPX{^1vjaf|eKX!h5(buW7g zAFsx&EH!OI!l-RPEu0*Abh0H}7?UOc+481+7iL#P%4vg| z4&Nv;2XhuCe8^mke&U&}eu9i1BXHMM8d~WHliIqC%(l}kh(%iri_DF6AN!rD-U5uD zJc@>lU1o`so}7L{e&RA?&WUznNB`T(0?BD41BZw6r-7qe>kL$ylZ?YY#b!>RA!^lg zXasnC(?O7_uNrEFp~(z(CYmc#=0SG^v_VBip`hiq)w2p}1K@VHXBGb0g!nCv1zuHe z2Z@)59^dF85DoNOB>=boL=!o9lJ$$f9*ZFojj_{?I_FEHC{jvlCacYg1Ke~C-9a`} z1s)ZY+@(lZNG~brSG4@->N;DW4CKe}@E|YBl}7)E&_la&EE&fnVAoPsZfP78!Z?~9 zGg*tnIK9R$x=fAOzop0UvRZ7Q%j!s9=FZu15>)xNHAg$e`t`Z0uqcu|k&Ud9I_)?c zhi#t1UuS2YNMAoQGGlFQf<$)E&{E3GgfbK?>mw!VuMCJ)=^k;&EE)a!2e1u3s^`qq z;8Ib~6ezuWjm_*?T&AZ!!kiKVrztL@Of6ZmbMI$C#QL9OB$}A{X;m4%!5@Hi5^4)w zWci7^Ff>|ih(S>n)hUp`uiSKml%%9963WhS-E{{JNJdNRC&k`l+r}`C?Y;HABO^ya zKfiCbMyKf{V!F4wP*shgzNuEr#Rgr_PZ@)NByJP{@=!LD8BJY00f+X~t=1k-vGBb5 ze8rFyhFxu}>966rAJ=vk5qIG=bPn1A&)oVg1SoPD@k84fVwr+ZF8 z&TK_95dsCWu*KZ7mw}Q!a!Uw1A_*mW-`BVN-a$!na}<%8ay58=lQpsP$v2x-4`n_r z35g$TRKZ6(6C?-iEMMj#1E96$OZ}I;sDj(bi zlwo>UNrf5Cm$TkDSUzZj718AA%5V9thuZu@E}D~*9LC^26z zq`cTVO=UG`_Jw6*{E8#yJY=7xYH zia+0+9Y(QD^Y-`iBf1961=PWQ?u5|MrJFZM7VSrJ=ahE!>E!@risTgze@t+(TqA^9+iQi=e)p8=NV0Ya<`M0F~y(@M=g4-E=6FR7i9rV@fl!9oV}O zxWcQ-_o||bDh0nZy>A4$YSx<2UhJ#tX5JNu1v98FG#!m8SgVF98l>&UStg1%aZELa zEd#AZaiX?jODLp_(ad17NTv#@iEH#?6O-&kg-JhNL;@6&Ng~n2^yr%qrIk;uYEDC{ z3-+%E4d{YnlGqPm!T{Qub!*j;`6Hxe9a}XYK)jG~L)v-3y>i42Q1u#PbB+uA1Os9V zhQ?Uo$j{uQQzS<1)IZZqo7OJ?h#iqixit=AYHj$cO{M~Pi3A|NLl6|04@?n%D?O1c z&|2u=1f~I)-d|3-_w?7ZbY!9`eOY(8+fv%ILShD$oS~Mp$XlXVWXF*7&{p;j#3cZ5 zvp&)eTSPB1GJfH97ovTkQzGdASFb^7UhKGy*p5dsFeFoUH(h*6i{ad}&~Ve`_C4^r zay@ctI_b~_-4*oWAoFLeP)!xbjv5I~%J zJnT4;Kt7H`HA-<<9urVncggT{@RgdP?{X!@fkGKsa*!q{Hbxap8>k~yaA&8UXV)FN zwgj$WG>tvUvcTFK>I`cq_{uET@%VrRiv*Nd%v{f*F5*D;9_Hzvg(3Q${RM^o$1wZr z2KEgCx%tXSK|}Bx2q!l4LExpN;2p4hA)m0NA|=b`ES!>oaT54Fvw99v{Y+!!asZVH1Rqme?Fa9 zerH0h(j$Eo-;#-XkaqMS$hUPqS1O#fEh`pSYqfR%@@P+!NGO{MzhS-c}G z6hR;^T58bD>sG$Y*ex&&+adwNtT`;BN=$1+84J=gS5i7y-@Rc;{ql2`DEdrFf2KhG zppaN0QmVh7I_nu#4F`&}=R>)TK_yooeL*9@NJgN=-J8t}WtIRwl}e#dYVTqsrmH`> zM9=@W=WQ**o49()CY5vRCa9s9nNsDuPEi+C!?B&tD z1haKKli`Oz2)9DwbPgV!NqPF@20#-#lf|DeTopci>JmRos7`dem`(FDpDf3>^x~rN zLwE8i_026k)`?%r~v+ zjJFJIkdPt43o%3w3oqwBNO?-OJc81FlZj}GxnFEH)_^-FWx6*o)6<2 z$haVIM;jhW)8+b7O*SZ=4L2$gY&V@IdWl;2s(`{E_gE8)wTj1iJhSA@<#+-|UT4 zzsUX;IhV8#tZ2szF8(77jzp6hL{5J^S(0jyS#34)lI*j_ayuI2i`%QWL!+S_6v*rs z=O!_?Wf`k|Q`9e65C9IK7(MttW6$D2|39~kvuuseXD|Q&9i;!?XQBU(D9g#z(bdw) z)YjC_<-aD_RP{}#O*RDIQ}u$U;EBdRl3eF9VwHysOvzS7(bN;2Du)gRh)tPFB|rj= zx?{gPzyT!!Qa7UXL;)k~+rc9@2LaP{%7ST@qYyvIurm^AbQ*LTLTsLYI1*Q5Bu3SP zP^5VwR$T)70}(G1;A5g&#&dxmobOtME%GcH*%ue3$Ox22pNQLM2QGZv)zCI5bhJT}MfXA(L5VMD{q&t#lnA=P#rs@=ny3EryzDdSO;lpigK# z8;Kt5VqKN$;FSouO?uK8ux^wD&6W#*g-eauAj#ORHBl5M>;whyYHm@=LXQxg1Rf5s zT_OB>ja)NNYKp;wQM6$`2Bw#|p3Y=6(YNU`@>rdb-A3$YPRD}CPcGp{qZ#qhdO+wr zyi$S8z>0U!wq&q?ig+5sl_fi`IQ-7#8;ZW&}N+9W%+8F4!IEm#i|%|YL~wW8KtUH&zU zlbAc;SkTJb3g|Ko#JEa`RcMR2G)kt-ERC8B$`Lg``sbz=gf;E>XK>wq|I9}sjx{)s zkf^{Yv5c`uf-0vtDW3o^St%fYFk5oX8-J$3cCXWU6@J*P_e2KbuRB@nNc73U9!-u2 zar05@i>9=nb0s?-oN)7kWt~j1VLv-w%#<&EcD149@a0L1vm4*V%|LFxSEHTtS;XbR_GAKW*c-~ z_9AMq?tJ+=i46_s?0ZQ(rY|JV&1`={H1X=Ij*htvM?Or-Gjl~qjxj*leF48}4n{{9 zYuF)ivkFy?&{8%0XGLF9UTE1?eH_k);}i!f!@xU&Y*_)h*cz|@PfJ@1+%Lh26_J>O zD?$n2(QZuQg@3sX`q}M*ngLQ%66Wx_>U7(ix75~t($6+E-x9JJ`f{MB{{LsAl zrNlF7Q{qdKCFC3KL#xDNWuMeogt5ub5w&Pv`k1|C*b?-Mk(|9zs+@pOfYxa1f>epI8O@xkWuzqZV>%*Hoar#rLs zDk$ltD^-oIy32z?6}s~C?90C3YIO^@H1ufLYCpj_FSpbsWhu1{LoJ-8E0P z@5@8TL(+fJNa9otMjFXA+OF1aM#HA+4wlH}^%4~mnUQffjQrYhEAZQ@xSk{iu7N(E z?aH**)VQl53}|7g7+zXKVJV-r@v<;Xt5it{W_x!JH*!EV8wJdmf5neRM&!Q+uamsd zYKE7G41rhOFA5K+6hy3?_E;O9JJKZ5z2JPs7eQquk&N-Wuf)TUmhtsE|Jq*x@3>hL z+`0WJ#KT8c=MCDrfdfpiFSd6I?jO0IkRSV;`BER~~o8>9(_>96zRQH!WR=E9mBmI(E7_3}g2G1Iyve1z_YR3~4zJ9I3)Xl7ly zYqfy>Q-ZOnyojeVoAo@IcJA8&TzYKpddF$!hPlxj&01 zpXV;G#Ai~7?Yy;<{zU6gV-Q8W75Nsn1l{`SSYItIuwEJ%#ymK7XmRR3r&KMWw*Av} z@u|)C+j@F;`c3_dD$mje9^AKj-6Q*dw$FbLY{Aa3008n_|1XYX&JO<^70fLEoBp}x z{r)HRZ0x_R7pR!cNU`MEtncUHRjxejz@6!EBXc|SB(A1`$fFQJ7yv4;7p5*F^{yWVzp-r)k#%UmNY7B zRaaf{Ll7U2E*a(5Ehs#;_-^Sxy);#1(&nWvuSTkc zGMdK?o^b%DHUHGb0yl1l(7K1&T^s{bJ;a6>d`WSdIuo#^l zYlBg+P8N!3VyR@_cR?9@))|kSKNGQjg=mu9Q{NgamiSaj)$-sV`&)mfAC|1g3N!bl z=jYd+{fJZi{b7Y&)g$n?Bt6{Dd_OGs4STR73w7XMvK^XY;AY7BG#Rr1L%iHvPU<~M zM1{ot-Po>p)OGn_8tbV;JmhN#C)-SpV^$Snc)aA2`2wn`BvtRi@J06az8H+un z1gK#foLZ|4@+$f%RX%XOE`dynV*5OQ6G5MA`B?4=&sls(uVncsYmIuQU-{|31~3Dk>`^Qj8EJ zl}asC*&rVa(5WJj2j9{nrq1!G;(%=lEKDjM32l=n-J7LbV#w-x%+l85hye9+_%ZFnkn9`}=LR z-^ptQIhceB;=s&4GfwVm)LpD?LMj+_6mfH0S%Nx%66;fW;LKV>|drs-)JbbPueOz$Vals`vQxPCshWSFyKc1hMoxuft^xOq8i zS#^V!2*Mx4XaK{aCY%h3<0)5$dimSYPB$xh|BX z-?38K=i!+!RW3{s{=r`l9B`*lVCnP4^{*nSR$cAVgOT&a_QKiz48Z5x!H$8$d5J3T z!Ey@5nS{yhwD|B)Oszh4Fo58~7-8Vhh7&*h8QdU*ibd_f5vvC*xVW$x8?~s;D5=z9 zOS;*~8fI@m;*`6h+=$X^hP!pKaM-_jJ_42{%kxq6#o@3Y*l|S+Lfv1eQOLqi9kPR( zKwhdG7XSc~_n19T2{GUb-HkfZk}by%#|QA&gDJQNB>Upv!W@6Ldo+3i35Lh#_rV!9 z*fxX?7pD!5sR6yW*;(rP!%_!&%cx>rh4!*8tYAPG??o}n!-YT5YV)l31j8W~?2za} zaJ}y}U}wgtcy5OV*?I3oZBi0R-&IIL|XJY7W>Z> z3Mt@(a4dIFzz6_dtH;SSy}T1c<{kl>%&ZD@Vk4~C$@51MD!+YgcFRc6va)K)RQoRf zZPD>4zuX~qwsK;h!M@#Yde91kPcp72x4ThXIBThAS2K>Y?Qb18+hxRF&K0?+M->p~lDsJB9UqKU- z5X&|_2Br!fiVrIXfc#cG?9FQprxx>1orC>&X|CN0DG|LQLm}irI1ZUy48eg+UPQvv zK!oaI)!1VCWNgv_(lZ4W*)FRyfzNn<7`!of@H5x8ouxgK2amZZ`G2v7@{pj#|5CUJ z*r)~mv?85;dbJKqAmVA@O1;N50*s2_St~pyrG$kY0sz|g3=kGXc~&ZBsh(3=gEaK$ zm{8{18E|3u{UOdqK~fjz6p3ioYT(C(enOmU(i!ji;+(K1wR~c+9mozZ9_lG6MytN4 z0dq09JxK}*u|7p0Gni-=z2yJc>dY40$Gy?0UGwSMRD#A*G;p|ja1|%SFwel~d1QSP8UPXr2a_vc z_mG=*K0s1xZH+Y8RHkwwoK8i-=4gO&a8W1)p3Fd(ls9S|s6q{TS-P~OQL0;9Sp!QA z=FkR;zK-k;D`9c%4-l)5Mf;i0CX_IR#2x}LU|3S zV8tC~T8ZSG>lP9!q1XUGEwMrb5c3u{A#Fv53xYuEh`yO87@Ex%@fqX`FdWl+I|Oby zihbeWluMIVo$jVn?w&lw?7Xk>&2ZkP1@O^2j#~j^>7fEjc!Rj4_MHvZIna)-8Q79Y z_mDWhi_*#zCA`2t;PQ|8JLNRfh`kqxZAxN0TU54}4}1N!raHu<@s}EwS^{_KcnyLm zA@od;#aOKLFNaD}K!-hEZCc%Q5~jBKKpynonRMzjWK`-NZCh1iNMS%~|1}*g?|r|q zOF#)1&q$rbrC7)xRW&~Y`^yzWMdh*|HarjHi-gsNxE&@wr$(CZQHhO z+kM-%ZQr(SYwtTBHex1XWA-;x)HzXE`DBJAPh6uXZ;>Z&A-}!8h~QxEu87ZaV`U?Q zZ#4DA|Gw(-a`6uuNP~q#PmM{kj6?1UQn%Q?%+t^g%eQl5tOD|h;RFB8yj5pC0iHs& zYckAgS%nQs_8K@ZrnejZKzjS5M@C7-j_`DOC8%{`DyXkVzJeMSvVM*EIw)PlLT{bK z;-EeNUsQT2x&mgax<>)U`647FJYXU@&)y-&Qd83r&cb4&Oq~JYUUNL;R&Iln!H&zW zGjeujvPY^C+&3f#SM-@gdIK!ozr+tS%JI~7y6g9R@%(s(#-HaPcVs8@XA&aLz`E|L&%dPCo;f?-u#j2?N`M(UA=6WP@*SJZqJITiy>SiIS^K-7P;gjk%3S;;x_8lm z2nJU`gU6(>KKaGb_LwW=izqZ>CbnZJf#r0Uy|L?w z#~Z@4gy`e(ssp(oQ`6)yQP57jaUACUp&`PTJtVH!0YZ?!Qy^+tVrx`_LzCeRGUzAk z$I7;PYUK_{@@NP1OF-Fym(YHO|ArSh61>cN*uMpD<*Ls5^)La#4pZ1Yh{J^(5p4^k zy#Pos2Y7M{<0EzV4%yPS$^V*r@3?+>b030<_StJqcU};~-!00A2sD5j7RyG_W$hZj z+Q#j4@CP7~WNL9Nt{={M{U%Dcu3IJ0X5!k=f|a?HLLM#jtM$8OL?59{lJi}|Z&=XH)cjQ#p2GY!lyGz!-`iX5KJ^fCQ zb%GXP_}7l9DJae3 zxy&Nz)gs`4`~6_a1?^o`R?Jj+G{9mP+N3Ko0RmQ)bhb%!HG{zoAS*I<)hh7(-?VsN zP^D6gCxkS3jlfbu8Kmsi}ZYy;E%J)yigX-_rZf}!#{Q-JH z$>FZcwuGhS#Im_huF#vIm;n505SwGB;q>(z>W+#1%~je&)Z5LlvC>~0R&3BkFZx&5 zd{sK2G*(96_zGx2lBQB+fWiz5j&11C|MBV>SiYZ!AAe>jo=+ziH! zfi9L-pr>jA$HpC;oj$^QXgIi2`Q~1J?0$Uzo-#&{EA^Xruu}_~s(9_6&CoTPWA`Q3Fe>nCg2>^)e9uz&>u8pHcm8Y zwbKz2xXjfK*zh4-iLEelM*BpVc?Wa={2}*%qjimip8qGIw1kqykuvUDneN~{QE~*{ z9-p~80m>2%(HmneXaPok7xfPYc)0?OPQMin>NTVeJ<0Gy^wBfZn9K9)i_O zeISXtX04!Tn)e@$GwJkzM9(-*Eu3Aw4HP>Uf`S;ypE?_wE%-1Sv*?JGKs^vNxC9-_ z@r}MB9v2JB`&KKz20w6Mxdr&f?3A_Ey+`Mo7L~JV&?$-sR^jkJxKVp+2&q8t_~GxOdHgt`e)kCOPe!YVq%qu@Me;}Cxhr?`uq^Ko_y?llu*3*UrtXH;hj z^YBpw8ZV2RCSk51#xQ6@c|2t3<E8Jv^Wqaz5*q#in9<{F|=E^0D#3}oot;ZM7)_xJKVIXxKncfcI1<^1AP3dCYB z$vAzfXl?ZM?BQkHB{pu&oAv!%ae5N&A#&{u;Zc^D==FOd(<)lC%4nJH4~N1V&!FGN zARPmWIe-TkO_i#NhUh7DjI7idco8DK63(Jdht?|i%`CB0+YYf?bjyh}V#?L04WrolfxtkZ{GIV%~PI6fD zbgQ1A2-l=+mxlL{2{7Nl#KwmHNRDI3f~>$79YAg`6NE=4wKo0$gw-D>Z3?`1i+q;u z1V=-_1k3U6G=nj@R2lUEp&h*^G~Vbec^FrBxy~b^OT#s}QI0Y+=ye~GDHcP4TT3Oa ztp+ycHS)$_!B2~rUXSd?xl=xLlFb;t1j+q1U4Sx-UQ!r|=J0yhy(iXfrrq1nUPJW3 zom-g^=EJ$XuzOq){;*mmq|c4+biGzO$g$Tw08U7VnKdXt>_^;`o2a>I>v0$5#`dy; z>OeOY#&eO}ihPx;zz_;o@LI>w6$h-DdUm@*tof}tc5|O{B^bHqf#34fa=_IU8@b^h z5%_9dNhurdi!S4ON42PGv~yEY1rj@}^>s-F7}2^cS<#BC^TIe(F*JS7=-Vo)-Mh5C zsQUg$Us9ig&P{cKtV<5613yMh*L>j0zC`kxmX)S(sac#7G6yfsiQ(iwL2+CdX>~h} z32WbZ!7thkzA(Z^rPtMm8NMn%z$LX)Mkj>rovWOKryKFe?7&)tQ_zNe3Z5D2sVjG% z1_=kTaZ&793uHZoOR=&Er#-d8vr-3y{(3fotBDj9v}@SVjTI02XgaOqnR_mxssCdH zTCbaB;gx+Opt>(U&gKF|w4!M~+hd)r)zmh$x&Kq`+-bUiBxR)%ZTTuz-*at1Z_Z^# z+l2s{E9w&F_`ztpHJXxwtz2Y3E!pVIZxu3uh1+Hj9N4O`1+nLem|M!diNZFrmyNH? ze3B3E>@eKbzsHW&=w|mL8DeNPoNi%W^VkZ&^V7UM->0b4fz485bzBzw1ZFC`CcQ>Q zP|Zt0tLwrf%LaT&Gj*-pFhh=3vq=SVuRzi3ujn5hOd0O$%``8ZD~1o($HSHiNc?>T z53C(?3)Xo}i(B0AC;wP;OSoL=naVzHYs?22yH6M)_~2 zfQ>@MBg#HP@NF2nnP^wJ7e&=f7ohrgUa!U0YzccpADfBeVvsOy0}Q1TVyAReEXLJ5yp-$Y#{&qXx#Pl$Iuyl6f?KqY^e)f*czUU@XZd0O`gu&iR9A{hZp>T zcxc4XLIy$1lN(eGA1Y2DMrL=cj!e%Z)ZPRp8Q*68EFMs7{G4|~iTG38+hT8tA}6ht zv(wOUpriv72on~g4@eiI2M0%doB-7hJbqj;!V$P4`WOIi+u)Ph8v)D0c#rnMt%O&m z$;e$rD9fNMY#d?$WR*Ynaf=mK&vOh{i#ufxfb}KrmAh?IY)2y&8d$z_w!z5wZ(bm| z7iuMluB*4ZSl$7Y6((SvMaM~8tjSEtZzSwF3&^&-Shi6=!p2@-4W&K3=y-6uq`oCR z#8C^I?#&w-h!whGPGRc32LloOObl;&^wGHRZ>Is`U&P=#Efdvkw99?Wzl7;6Lmv0I zF^sAKBsiE7U)&c(Nx=#nqoaA|h2D~}>i*bSA zTm*~LgByEcT{>Bjeq>yqe-{2`3|&SO2kejJ$Yl@9t-ka3=oS?Z@JWXcH`LiyG3xS` zH->0Id3S9SdpJhNe> z)L*aZ{ZS>^IV!$MNU)Gh>|))9AQf!8$8seSs$9Ljb_qZ`Yj0czJxH>n?y?s&hDYfv z|KMiG2$}zZNp^(;UhZwZ2HmZN$K*Mbme;wi#4($1q47W<;d1<=Numv=>##muHprE+ z{@qy3wOLV}(4W6ayeeaXAvgKS3 znqWEuGX^uCXBm{f_lUzbkkNeJ5~fRg_J?*8n(|*!y7YeCM_rz}iX3l5OyQAU zhu%`4urSWgBg@}7kfFqY{1eraBb9WD1=~WB_`KdPE~&aHqkWUg^Ocw3^=B_&zr09t zFPtsd+YMF+F1FPe8@w*0KpoB$BSxr7l1ID#Tr|^XUJh z)o&(TZL;cQs+%U|lslos@gY&}tQcv8#@lZZXw`lqQS11d`yBl-28Ms9n`oOHcb)cL ztJK!L?wH3VS4a&m*S2@a{Uf6no-8BB@^?CO;tUnFa66_yx=Bs5taNwm!Fzo0`ca+ zhK|{;t^Cb6379WrPnMMVeBk$gnA$rbZJlHOfn>_O001Qan^)S!(EL9(lWp!#`@iiA zeYg68;}k`(Zm3(?CrZR}mn3p?0(5M%a`oRZ!il7HGdXIDkxAFQL%-hUVI?9L`{LfO zsI`e#7mPS?r@X>9VB8%jNwlJqm_FpLDUB+_JjpzUu4#8ks_8kZ-8zzK^yg;v5k_wx zCH-bs_T4E&b7a^y-0L|F6w(k^+xOtW$bXDy&-crNUqAEXU!OxTd8r?}mD&S?lF&O) zRQ2ircbVulbLyi~)N@F?qeQ5JCq!zZx@$DD^mQVx2LGa2stg3AcBETd>W+H0qM#?6 zX4YqTWko$2fKnr3(yx7BZvB2j&bvFjaq|2;+#e3?zQ(U4Sn2kwfKBEzynPZJSc$3Q zPkpK9;X3RaWFcuh;{X6)-T1t_IEh8UM4 ziz*pZK&mUY%89D&PVaT5QR>Q*jpHZm))}fe3{=ZMO~Vh-Xx%e_=!jolFwHf?0InlA zQ8ixJJP4z-)kjeI@EJcjIo-XR{EijlzwR^h{QTUFCEq>nz<-W$4`(TBrZR)!n=?G6 zq3xlvWVQvX@5D5~zNo`pp*t4rjL{0{crY_V1UO1Oillh13Pqi~x1DUT3-EVj%aH9G zar?MCAZe8VaTXvDd}34j9be7RZJEvGH;u3bj9HS9a!1m+p@_{D-|{X`B}wP0B1+9< z2%+l!sY2;TTU?3I)pyDZib~pJ))eiRocOne@ywM1cms7KSE}k1{xy0oLmepv5U}@GI%+`C!L3JHjC9jz);W+lm>wnP`4xw;vlJ#8#Bc305^8#UyXFtUyV})PTak z?J*VfSVCtZ2W^_9A1sv4qm@XvMtuh@D9$zRm;mGV?k5juRvTlE>nK+)1^x?!g4$iP z8Y`xC2uW;-HNQZG)m=SRQ*UpKVfZm-0Q83uChTIYz;ZCj)c7lXbkHdQVqMMeCw2_A zkZbO-d4x2LCisp*z&(}y-f|emcexp~sq8yP9UOy6am%1H>m0gckzG=WPC~u9VFK+cG|u@Y242-wtK*o_Yr2(vsWB zs!8uXM9qQ0NW=lcG9CnR3pkvl_sPzCd3(k_yM=Y_U&w48FYstac)5o#$IZI_daVS? z-L`f=GvQ2()P%4DEZ>(suXA!ig0h4079w2Y5vIUGJ%Jc0%9;blQ!Wxa1JNLCFnU%p-FP7=ZF|$ZnbPwURSN0t_%UX(nghq zf*BEkSLtRpY1K~41pBAYp_iH6uOUbbDM3!9=KcwD2+FaS*^H@ejXmz*CFoqUQ8cqt zNIH}z>=F^jAT(@=P5Z{aw@XeHVnthqp z6Q`^JTscLr&<$!h~0mLTw3(nLPDhcElM4m2Kk&=<5RN_Kg`-{Jc zTRpy!FyfwdDXDAFWi$jtmpRY|TCEkmGAZY{n&mdMTT7kPYCt~h-81_#8m`T@xpK#z z4?D$Id8$G+s0~pIS?fgu)M_X#%*UGHb(Ent2rzR4MZtl%KpLcIks}9S-eoGCgBJ{d zLM0w1g?u}keA!m)u$EDn=boWXBljEQj-}rgYlentSQK=d9^+Q`!@u42e=aIfsdEs_ z`tRuvyTg{FmC7rs2v#(Mw;lk5Q`Hr%0Gj(Y4frEr9vCUso#~p)Q9Cq(@od=aslbgw z)!?62L~uw$6avYyu=^_etqHKz65z`aU_+oFPH~pW%7s|x|D>y`j_0D&(-~Agdje$W z2?V0`P>9?MNoYF18#Q?JtQS~&M1QdDe%Lj9Uv#PaZ`!57C=+cBl2EKhhF@?fcv+Jh zIijK+YPYo--{Z;w737&&d8!j*(ci;3NmuVAeDt>NSyD-F@+SVcI6U}zJjLU`@cDB2 z+>Wo5^$Y;0bih9W>HONup4IYTYsasPlDjNtMm&P(V5+qaQN0~M4tx&5f9~H8{9eCO ztUk6|xNS%q`Or&n8nn{5_}1o#v_AsD+$bJ5>cDUIF!?2e-7cQi z5PGfYOh;sPy)A?ZiiRP>ChA=`#14&K4Xnwn#j2HAyI!ez87UeYlN6l{CPf+*_qiyj2V+uP2cF6) z+xGAj-pcbE&a^o~q+G(2E)?6|VatR-^Ik$<+R+;D4fV+S&@|9;GSCQ&I1q&B2 z;>E$lD*__fbi@cRm_bo+IuG zB@1^wrls&e1`Ob^_D+yKVv+kf52D4)xhS=qC<&C3{n8o}spHlga`M_$31ys~X7W9% zSS(3E=X=Mfmwt;Yvh7@VX#FP}+lOV=Kxw!YUV>J9D5ay6&$v=90GUcr6;doV=Bhy5 zJAIm^yoxwkn?!5ATw^Ycg-O~RIWeayy=is3T{ zVOUpQEUSKCFVpi@cn0)yU7p`mKF^EJ7s}Q29W9*3^x^E~u8Nj3XbQ!2_wu|cR#8rx zVyFh{=+U;fGU`an&@N{LY+rFI{YMuEcvu1)aMWz;6Z_#qxG$N9ai+6IE>;Vkdg?X} zyx_S8;^Mcdh5Hf?KBjv5I*qk62A^}n(w^064`Y-~F#8ji%$zX?*S^)5W))=zD@&MM zVt;RO(VET5UIOV(ALzK$TI8w)QaDVoXa^Ow2|~=ubJrUm2RyBxcd71D1!v zTh=}$Q6t|3f3XaasWX{|3;%F?ntX_Dou0&ms#X97ID>10|FtaXQG$(FIZ`-LnrTyx@sOM(htFA$C4c+mBX8-;Wm>`DRisP zY%opXc$G?F&)lb!-L^1++bUmFJDc6nE)?WcIDX>0mlkLa0#@XC_<(RPAKC^PQJ1X zd-hOqsDh$l#V_jCXHr+IpDKh=pt^C-YoLgqyEdntapNzES}{K+*61APshNevI3#fH z+0C=k+=dvTmoxdaod=_E2PYVzOZT~!K48I7LpZWUsKI@F35xr5Ve3&5tNV{RT`H6pgnon&>LpG;0+the$P+)eXO8AFn|L zN+57nM}t6b#H|v%IMxmr!DK%DS>=c@IREXETGFgs%%9m6H^-ti1SkUH`RKLlkx1T; zLw){}%@(XiW{&Ow?;LmH0P=zCFn1wBbIoIGyMK#m66ZYxz#X(HWI<;51;%7;O$B}O z`GqAr)`!%1ag zSh~4IRcD!&=7nql#_V4lO-$#0xe`MQW&`${cV>Hk%g%%+{FDp}@#`l{JjibRFVCoN0^%ZCtG^YW?`xFxjIS7`Me$~^w{r;51(y4K(4*lwm}5j%N$oouUJ z=PA&>4f0Lk+@nM*!+3=F8z^4RsoZiI@1yA>OV+f6iYf!4^o5YBUeqj7dTr9q)n+nY zktILD)t81B8l%b><_chp^`G3SCwDqaqlBxYj#Jdbgv&Rj_02H0@!JG`5zA_G!Uk@O zikuxho;9ABKT{a8a&CF`G+)4XZ1#Koepb2Rt!^UvE>1hig}1fMWcNzBJR8a80`r)^_kxHC5k);I0|lXifHbSdWvu-6e!ovw2+|nw3M71cwYB5 zRr<2wfJ^IQA9HMD)no9G_%#JPHUL)Ktfq#T-Mhx=lc9LJ&hZ~GPI356ts-u7MmBSE z?isBSIv6bvc$r;X{@gF*|L%Skd^}^G{TEMQfdBwN`oF0;t}d1~|HZwlZ`o~${f8Qo zIR_vzj&jfe2L)*tpo25$cL?5;#6wXnm`H4f95HoIPoux$W#BY8Pk@H!r`Ho28e_85+!^q?EPICQ{IlqK#2$GqEQ`EpgI4u|QyA zi5z#m@-)(wGL=}?rsx23){ZiQym<;va@Wu)h}^?rPj4d?_0UX=gy2I(F$1wIidC;3 zCDXhRdt}lSQy`N%%!$kGcg@uycGl7%?-St+d%{oV5jUCvc6_m~@11q-4J)wBtUJlSZ&9kdv1Q6D ziWuh(LDUd6*}_T{!%toet~je??qWAw{Px$#%hT55j!;{=Cqs=JGT6m#P})@@c^leX zE1vx1Ngq7K4=}Z5z(#?BH&{nOGBg!W8l~nk8{Bqqwh3B@G`dC{*BSH-<047qbZeS_ z_69*33Lr%V)(MqlVc*ybgLl(q+t*P2msRtSyHmplL+Vg=%CxOle+v`%S%=J$w!IYA zLoI|hT|yMvFJM%4!g2$A!@7p1EwI%HkDFx+uAEt(H9_)H8Fg5I7Nr;;us)ojf&RP& zN2N3klYzm$+i1S8L0g@zPv?jRZeD-x%4ivfsHCdGh{SilxP#!t6Qwp!FMf~W?4h2? zHZnelSAB)4k1zh0Lwh9@zzrBXp{aLv9xNS;x=q9N(HF)2^;|ns9V+e-j7R5-TJgn~ zd^ZU(uig^2c+O(+xx3c8+9O~2%fg{|UOi(v=}`=~u8F%3Pd$md-lg+*j%1gnY%na9 z=Eo%M%+t4xzT4_%I~{WNb*<7cy^BmM^ZD*ffWQ^2Ud^Bw9%<_5=D#P^X?|IP*sjTb zQu^jilF3Nr^B8fI7BePDZ}(=YpS(x~JEdT|oJ!#CF8ld6c}0Lb7@Kw&D%^r+S@G)= z6gmCA#Ls(eqc}>nKaQV{T$uPXS3@)l)XP2MEVfmH3`60vesW<;C3UcIL>}LLWi5(H zbfv` zN6yy`;v&Lv-0foiIqcBI5tp{@d(Lk^<%v<`O6iGsQ-faN%ryFHq9%l>wO1GsMxLcqYF6#lDtgf;xdow+=S!; z{Fg6%GRQ9q?S@WlHYV*)VQ6Gz{CSjSlphl&H7a~&{EH&ZmYOA^t-UlX+Bc{;p|HwXvW`Zugg$DqTC!dTkd{YT-~w*40r zhxAjYA2`pB+>q$$w%KLP+OWiO@5+46K@v>TR^r~$})**f?IgijX- z))ILt7P)D~ z3cM@c8(#y%SPZEU)H9L#twzX%)na zSI-Q%>sN17+BN0W@}?`vFEG?{-imY$X@OFd1S`Tc(7mW#BArpvN34OeMOvSJPLAsb zvh#p}r&pzVpH23f5yNuU!-p_B`o3Mi!edkl_|TFz+W>=zV6j(h7qPsi>_Dk9rp*p& zCQe9`sN@F=RZ%I0338<#NRg$Rg@X(YZ2?xC$2KxFfQu4t2+SsP7|L3^R60a~A}=IB zjRedyRmjSzss(JZOTmfCY$`-nrk{?&r7j&k-OLd$#{f0+Q(2 z3)FWMha>4FJnobwh)Z(H80ru@RRF4|42K#q$~+6(ui{p$<|pS0&t^~kd*?_!`vrga zbbyTS)L*Ux&+h1TuCg^8dtFxR;9GcQFOgd9kV5x#n=w}p`j}_MN{jKCM0PoglehGF z9~|U3ER_|Zx*X%ufE5lMQ|}4a$G?Xtdl>ww^mcsEJCnM^93^2JH8C9xIdm`bPZsrc zIHiTYxMK|9eus-wOTcfAR(wuHwi3;eJw&DI&ptsnlM3SseOAwNyS_RYL?NES-8vM- zZ0BV=Mf8nGp6A@(TA#1TJ%0WdcwX7dF&cSh6^ZI7r`8+-7T%0Xwn9h{W5Zsce++Uf z`0n<%?6_I}>RFwWnp$#2tkFat1ortEdI53UH;~P2U>^WK)u@KAbVywjlgkg~p%FD9 z#KEOPkPMzkg*k52LK7pYs)no5V9K7o6Y6|61giMWGrvrJgtjA{JAd5SRQR6S)kg&c zK9v6bj z{@%Mdk3ZY-bjD?76d+HkXrIQX!B%&{#q2V}vLGSHgV~k{5{iUkVRH+>kOeqx&1hqA z2h}GCmqAEYJsV)`ga%zgxJTeASObIXUTgZ~0Lj_o{!hf)KiDwe?{jqAY4M06nXhuLJIG(xv`{(tNp`?Ie2+rabTb{=dCwr~BMB_vSa#CrW zqbtEbw?gTMRfHk341!w7$fc-19;v&nhl|zkaHH1cP?tJqbtBTatDC8`qX znz+)jwQJ5*h(NCyO7JcWi%Adg9!dghEFoLD{|GGqC`$2LZkvA@$vf}{$|*pl2{ZLy zXs$@3X=RtkGXpcjQ5`+epJ1ZedC~Z+34~#a%*-I`X@nU`kOJh|CR9evf9U(a0@>Ws z5yb3ch_{m>8QkJ@e}$1i+!>d^DyxB+X(c_PGiPVIt{h>Wj;tdleM`G_jPSp#CXdB=+ZDD!x@b1gPaHjJp1ZH% zvceDq!T@^W$D;UJ=j^cp<}^ntRF#n}@ZmToa6yGpT2oY|(g}R)(;DZZj&;Mkv+jlo zCWE^eb1S3OB8VoItM#71;Y&>EiZVoB6%Wnx+9f1z$f$lL?F%-rS&^J7txc`we7N1N z52gB(F<5lpS>R2$xJr$I^F5SdrFEllNqkp)p4v>%PR`@&^aSse8}R54&8E}%5Zc=d zxW#}2GzB>d3<-mHqJM;xlI@*)a#9Vj!7-}*Lz={p(+|>ZGj(`R`M*yupAWo$-_M!N zzVCeOU&9xWe-nSZt*fhIH9tXR_n-bf(}V$7_(8%}+5ON#t8GKGl1;gr3u3~x%j_3` zzUm53uMXaC-h>&vZn~MD#_kREcjWAbws^WtPkp3k-_eBI$N)ZndLl{H>@N2=)x(6W zoPSxb9porFS3xFjw1N&zcIB=fytYIvDc#qsF1m&Io=(w<+GoDQi^=7;hzjHTBn8Ix z@tRKqZd2yUY=L-ILw;}DszG`^)qSl+@beHDPUpi@;I)p|Osd)c1Wp#XxlGy?E7$J? z|5Z?Vw1JRtc3qkl{rxQ5>n^r@kT-b1_=rwUB~l+5x}PJr-@)tg8PKFs?Dg-_n=lmb zE^nnKWjv~|v0?dXAy5|;)u3vWAPiCSfYx+ESQW*sr=UogR_t!M@J&Wwk}8fTB$in? zLz=s?T+MnP%b#AGi|6f|{nE@lnG8A2iKA0Cp~_Od^uB)4C^3s3#N%w&1$~JI*YM2W zfIIQ*oc=hG7<{#q)dkK`iQ;WjG-&=507ovue7|}jmV(7$YF*mP?#7X9y6sxtD}$5a zLaave)KT^2PFZL5`VnZ}A+t?lc!FiojvF8ygDc~WcC$nPN84b0Sa!B;8-SB};iEPY zpU=v^?r9NfU5=vQby->lmvpre-}Y039P>NUT<%@WthXhnmHf5Pj%F$MQ*rN`BKd)H zkCOu9dR_-INHM{N_*YWS&}z8F5z=m(QQBO%;W`(#GOD(+P0O4M=#-_ql|@XR82FC_ z?o{(|A$ZXlJ2dfUzFoq4dn8^P>fTP+;XpAc8?d)bd8*v?EROvQi^)FE`hLLeEXS>k zJI3k~cZK1UZHryX^VsSpSjs@&>h)BTQn_KjoHjm_N8K@3H>*df8f78&Y!T|pjT`*w zF$caQk6y{RbmawWbDNkgBYyTh^?tC7J(4khT9evd1!Z~qqjr)39{$t_RTTHlUcLg0#M> z)g}M>#V3xm7X)bI_XOg3-|OGY{t@&T`5PYaKrr`|pyr?6RMuQat>BxA95`$6#3~2T zsn!@tm;Y(YA69h>@)XZPqNX)c1zYrZ<*STrlS3ti$FlNsQkl2IshUv^pK)=1QrTNu zR+X>df(rkEi(UYHaU**sxI411o~$bQ3ShlPBi_>$BtDl>QmEThr;n0Ljgr{WpXJPK zJ80`{#V1a9vBAqkqG`{T*`-!9!)o+*cL`V01is>OiQz!maWtM(= zJ#afKO5NrgsPsnM$iXyCIYZ4T1^NaiI)NhuTtlTD3*qSreM|7h7C|JDE~Q=W(bBLK z5tzDAsBBzC23M0V{XH%KFlC}yEOu^K`Hx^X$^q69i4wYkc6|VLE-EKX=~PY#kFsao z#V}0*F<(~+@V+B@{lZwS+SSB!Lr;{hh}DiX@-7JNPgrZ7EzW7r}iteHgU z%oAitm3;H%hV92aSSD6URpQJ??$%II9edN7%gjK)TRP^avzMIRegWGX5Fw5}Mm`xRj!Mi9F#ase%W--o2Qz|`qbpC1i+awQ78Fv*a^n|Cm)Tq<%la>|7gov3E%+$qnx zqsRHVgy~z-J3_3DyXZ-F-8D>j=<;jBhUdW9JWE=7o&bCZx_8vZ~VKDUHmbFX$_U z8kV&jxeVUenKBWb_N^n)wqIE&y`J^;h6PfeOLn4}d|3=J+0%Lh;zGBc?8xVt5$6f! zh1ed*n&Gy!K1*An*~tr|W;76NoD3#*5F>Y9x@v^UjPY zvp9)M=Em|aZNJ>VNE5(i-J!ddwS;RUY|t*qYi7IHGEJwp_uZ-LL@okHtM6T~A$0e% ztQPCwP`Rh9fCWFFMRMCN8@3D!2Lk^LzpgK_oIydE>aRL~r>hJzAx6r@%UA3%Sk~)2 z1kdeV;Rg}ub4uC3Z)5SRvngawJErM~J}mnu2YAkh8B?_8&CxMJH`li~;ldrWrZ0`x zxav*FIiu}Va!tLnD(px+OGZaq4ncfB5Rqu&kqiH|DntPHNrrq}>u;^hZD)AUPE?w6 zp1g#^ssg`20o&RFs~rXI*S+%pcM*9?Y8hW2764$3`2XEB=jmYhPb>JZTEPF?H1{t* z^}j@eS^Yo?X7lPoRe3J<13y-Wj$^1R1-Gw!?F^b(-Xu zG4Hep6~ka1bDju7OdpO%g0xjLZU!Z%WZp*=gO0g&rA25C4kmpsPm+Tea}r175TS-c z8*trq1I;T;m=*&4y97|iH%K+PhEsyA2_EB01x+lE;gL}y`hWLQyn_Iys31WIrkNL| zVFq z%&DJ*aLFvRq50}GH)iuRu#(LaOStClxsX(*+|&C+_GQRx_PHt&oYyOUSyFx2RKo9D!t`gM<&L|^ty z-K3FR{9CkHr->72wvL``xg6pv$>%1|3ufxcD>3bQf!7(^vFOzkBi}CF2JWxXUGIy5Q0WFd+0%7s35S2V zno#9HCJLBN!C^KY%y@FG91p#73=3VmGj@G-Wa{kIuFUv)Tm-)M1iJ3SD~&^D_>{=x z#*($Ob>r;E*5Y>9!Sh4)G%Vg64lR&K;_kg0vZl>VvZLQ^TKW@gnzHECR!+hv78^D^ z7&Vg&>(HDb2!@R2beaZcGmYO879^eTD!PM3UD7^Fl`oyoW6JkhORiD{h zxXptH`m5&4Lh_N_5Qzp58By#K1wP&(IuXGpI3f#DoAX1U+1deBfadW`us-U+t}w8a zK{ty2SO}v#1RaX59v<%H9vIp=eD=)jIPR7+L*Drq|Fz}!aQ|LwRynE%hg01nj;e}tq{gs zfcPS%E~0p3*l;vm?V($$aY4A6puW5y^$NHuof$K`P3SQM_73px8de7$au>HNPO<-# zpCjeab?atE4o-d*aHlmc(Y?u9%6{MfBQZ%tr;wSPbK%fbl4@=jX+(azQBEw&)wq!; z`+J7@;o8L8_uS-BT-ZIp>AK6zTsITgLr9J=>-=JycDof?<9>@W<`RE{7;HznT(GqH$Y&bQ z19oBLQE8kP2UkZN7sc5c$zaUR3^0zVAbJ!NrhPosN%Ds zbe+?ZAW)lZ%eHOXHoI)wwr$(CZQHhO+vvjdITsT%6Y;;ozSy5KSHeA@&=9-U!5}L? zBNdm|hoj4$$g;a}f512xe)LcpqLST0eqVpYH~#8gsN>n_sgv%FVX_R81M2HRq8 z4?(@csB>+UA_?pzn+Wh*8Ha=UCKitk$6g!H$^)^@1Dcmp{}MJOF7S&|on6#OhnTK8 zkMN+4NGsV41_?9h`{BV{*JkqxFr;v3A`heUN<6^;7)n?ZnTuaB{0}xRD7a%vvFxmXA(J)|A(-tym1|hhRAj<*u0KR?C8tBc1K5HpVp)3zWrASE z6UI^)_71?J#2N=hS^CIstIB`N@>Jp&+?TX=(Lb}wy({&v2khyGeVjHJ*4lv7A=*vq z-`iw0qN=Nqb(q$i*4~sGj0Iz}4*%OrE?zRpm_Dj;W&;K@jDVcv4Yvz+Cyc#(-Ae~4 z4f9VuM|WF<3U1?hR#b;kGD(yzB|*$VHGOW?I*vD0z zq7K5!IihpdLSQlZeYh0+ffHNKxtF@dG&iy_?-g6Tz_NzX!r5`*K-WI&jXdcG=qAId z*E4!&oqaohB6EwY9m39!D|m6%d%eBceC4E!x`#oBh85QiACv)WXbK18z=QLvScRz$ z!P{@zeFD51ynko1S|4|!c+_gCcOLxdI#{8}XQdTf#`w-9;dpyb(+m5aEiY~@hj1~# zi2X#Dcfj>Y74(JyJnQS0ymInJ<%e|{h{&VZ`@tn4E8dnN5Yo#yg2h%HGpPRbPv-d~ z+MF!4vv##?>f0)rVZ_nYsgkGm`c!kBdXw%8$@#gtex~ix(}BT~vQSaeTv~rwRGDa| z2A7(D0IrSx^L?nw)7Ic7f#$Kbz~-qGFvZ`B2tSBOaLS8i2TMwh#6lD{9S}&ib z73MuYPjg;RLyH2Q`%G;USrEl#(&WXge(z3Q+SyT)(7g@*I$}0}Fk`&hf9DA8y5+njG_2;<$@z7t$?VY0iL%%ou%DN*bgom%%fU3#D13%X3=1ZaggCHBtU zP=?ngMfZ6W86B!VW6Tyo9eDvdbwFBcbHd&dyW*B?{MXUGgno1IcRs%uMeXEXv-UUy z=BXUXNv6h)Gkv%>pC8;CqU5cF#1&4U%HwT@ovHIgF5w@Q10zEJa{r*|WBoyG$C;AA|K+`(p7 z8g89_ShYJj=p>CmW5TkSlQnw}`E`nC!Hj;4HspD~(4DBN`d7g1%W@uq_0#rGk%5$| zPm)!s!bi*b3!0mOVsD_l^UZL-)T=y@50r2EGw(5hH(TX#T!Xec)(T^yG(ja)H zs1GNBkc=7-l6Jqx5TPkh!UxK@_664?wvqvM-}IG+m2h^^>$_o&oz7Cy3UUjk1E~#$ zHh=MAkTGlCal;x+uSlQWD|Q__kRsv)xj~`u$}q`r$w~>hKV1zu#)Vzg{GyGgxQ*Yx z7*WX_Rn|o(8FsYfRN|&&lB~7E)|yJyTGF6r*Q&KKs`bywMCl;f9UyH_F=vOBa!$J} zR@fPz`@=$s1DS^cN-5c)8qL<;AvJR${rO5!Ou%&PhhkT)vJ$TRG+wQ@?ZN=;kv$Kc zT2Gsmi*}e7R^jp7ZBDm6G#R6MID{^*C+7u=0M!~ei1gC9R?C5H9E!DkcPXfmD7xVV zLOazqr84-HQC#^eBf#U!Dk%bb$hpp{tUEp#mMpanQHPxkQI2JDZtFKXgElup>4Kpe zE{-RowBY#sUZZRsXM)pOf5b9qhLhoDc-?HcPHm+2Xf4M4y!J}Lt}({-1-Jb?FB%*F zqrZIH9M0B^5A%b_pjUER@e5~)D>mrM23`4pLT)TaeD3Oa`9uG>XJM%I2bG~djYca)Jl~}9eQC*lfy2XctN%B{juQT@(Es1i|q6rc#F_}0OYDrK< zBux12-Qh?!{xcAM&WC}j3K&N4@bIMFX^#UFB9~1KimjNkNXleH{n;U_JQOT=s$`Mv zP8+Rka&0H9%9+&+ES?rCQb?4r8o?KB{V4jg>`ZbGBG})T7gJ4TBBF_vrC34~>r$YD6Q*i%A#yxfGi4%eHR@~T*Hax7*o26y*;KWj?nWl@9m{ptM*=mU29G7BpM6U+fv3eCX z`pCJqy4^!}H8!0JJ-RLP37~3csZ|t!w@gEIH$DqAUXe_b>;85qpub+;XDte6HwtXK z_cjz!B2g->+9*(gMhC_{bi^HEd{0@-{rT2J-4K^Rr8@LIxH(bzThS^%`~xY*d0G@o zt3srVs{o_?N$5QAWl0nin$zX#RsT&BGsjk)=4u+sls+jC=wK4gKnTS*_I&iPEQ7+e zzHu#qw-hi61~{OL3d4P|WpH-~98nn@@_LD*QE*yybhKDZB|}=-yJ&~2I1XdWd#PL^ z7!@xn1MF+zj> z8@og+mh^Ux+;ECWI^wxSYILwV-CneRBnz}=YTuv+4g_)XL!cvMtaN{!0lPF{bhcZ& zWGls4W$k9XzU%$?v^A<9#WdLs`}AYieFg}7AkexJio%t|Fei)J>bW)PUSqInAIfgo zR|hlP@R3j=DIyseJo}Q!!YGoewEYrn20Hv>kvm4RN=qO-mo>3%E>K= zcg-@AFetYgW=G_SdatMerD1F(%73=h^qLmglh=cqcj1ok3qFy{gL=Z9AabIPE*2c3 z7$U)p?ZO+%bD-c$GyqM*!dOt~T^=De^;?H2l+linj}d!nq?%7`DxU9;xGxTepVpVF`tOR`#h=T}JxRzF}( zv}{rfwJw;6-u|&emd9(fufs#;?$9hsWm>C)YLM$2;}2%W+{m4f(s%d1e<1N?NP0v~ zcgT&2!4k{JMlIxGg%rQjLgM67C&dnd(Fb6?c$ZceGL_AazilgaYHd~pyU9Z1hEq1T z3D$^I)mTfc+_46U)z6*~PBl@R`p;LeZbrTNEMojbSQ-&7TPK|ha|o2(FV3EZgcY&E z<7-)v^*98!CYUXioNFQK>&dODckSdm+w~MrGYJ3+S_^UTc0sT2^|88ZYN(w|fR@!$ z5sY+)|9*6%)-{3II1O7us}Xy>yg&yH;&~AuHpM=;6PaJ0EH{lQ8v(8NZ{4gd^4!ZD z@%)s_tB9D)uW!o^msT%~3F1hy9#d8!#P233qbu0SxqWZ9@?>++ZaUvQw-8~hF3<9d zbA#iPFIIvn_LUvdZvy|ADwn}N`0`KM8w3}E3hGVKYD{qAOI(z>7;}~A_{qO`;FOoCvMe=BRP#h~{ z=J9&5nNRJ~yu3{49|LPoe(wWw9k8Wjf>IZy4NNq+)9QvBJsi$FfzyBuH);lXK1y~E z?>!v9BYq;cfwiy6mr{7#@Nw}k$GoHrOoR9}P?eA1nRYPrOK<%yIqk#SMq>;N5|!1Q zw6yWv>^`9h4~Pe^_4JuZ6R#uG9pr{ul(9U+tY2lGbBkFrSJt02_-c6-wkC9jfhST84jJ6(9E1rwqnhU4tC) zXHSRUHhiL;l8MhzU8G46;ox+mz{Nm_Hq?F75%Z?O^E5R{vZ>j;dE!kinW!<)ij`}* za&_6O<}v%*uradOTVQL9Efi!6R7P*f(fT(@3}0?YyN6? zRySA;*@4%TdmdZE|BS8;d|0v-mlb#OGiT*kbwbNfl0 zFym+M8!>>2BDZ@RU=IH&t=l7?Ezb#iQy&! z0o8`CylLJt>AakCr$g$qK|hzU)1K_}jZSm5p4_F^T0DLfJ9maUlFuV?TCO53>=X|F z+BH!pSlAE00Yw)TH#87#n`dyYv@7MJrie6*022vHAZJvl%Q4w=K5EEhGLH$b znbA6jHalucCJ`Yt_HId`#+C8!8*X4-0Er3LP2O~MB=COibj)d(4ykMkh{E|uHSQ)7 zsPGdJNMc{1O;DW)QlQ zXfMHtw)VY^jSW%@5Mac-reGRHHm&#Iol!_BC3+|&L!f!+x(NK8`eA4D$?&5k7E;0x z6NY03#~}#NQe-h7zm&N%CwfwppQs26Y24N%+GsUK8T(lhWS@HB{Y91=S}7)xz#?me zi%dQ(rW9(vvTP7%(b8)DO=!?uKia@`X-*jq$ADx3I&?%4hkhZxb;KoUBs!o}ceo5u ziFhO*f^=+c4??rG{Hvv}u?>|l6e9|K&&WIgRP#Tasa$yaZ>Ii?(HtlJrH{JE06%O|$FqD~Gf z(COhzC?EG3;qcUgK-=#4eBFJwo2Dwv+4{Ay2%Q7n%+&O4ZDX_zbS9-ik_St zs+L9uov?|^DJ)B2*bvaVKw!U>0mw<^)%}c4h#u-1d3*b3$d?Ct{!IDQQ3Ok+-cOzD zv@XcNJwCAeihPVNsP#{*3ZiuL5uQY#_w{)H4w3fAVgn7Io1`t6p|Oo_pOYnvkKA8r zVGZ+P9}^v_yfH#o`%EHHYXqm!oK*C-wW-ODTA>ety(5q-5aDDPQ*+r5p-Vt$2`tY`T6e~ z9+HvajV1cPCw)vr4p=iEaafi_M~y!#GL$$upS-cGju42647Gy~p+%s62HyP)94tIE zoss=8tmuubgEjO|2`al?k{_x%;f zEb82o-;Twn?#80Ol-AlhX=#Tid=h zf2}d6Y@DUNl^UFI@}((Rxd(s4g&#S@JGl{he)YL4yn2m!L?kh5eug<3EG~*cLLVMZ zk^~?G*&po)=sQ(`VA>5D$RzG6k?;=h@K`D1}kY968$@qG1BeJ2$^7u_GVEZD1eVcXk zl+abDLY_bpQkngk4PNmJm?eMjcJ#m*VJHGV_z~S{&O1IN1{qbJKVBMHW7mc{k@~Pn zuBn!E+l!WF4Go&4SrG*!bfTFi!mNQ^+ZKE{Pr8%>l7f=pA$QG@(HUX9={OYMa3}v)~(!qD~H zn!g>xI?<g3O23Z3I!tI$CGa^rs>y;ahSBy)!k z>vg)|z7tkA#OR$Jz4qGi{$uF&=@!b@c$;VJ&Dp+$HGs(-COXv+uNjK?eF=4m^aY-P zj^r!#+11J9h)Gu12eCCN1=+9b&%tU&Kf^vgc#xwyl}u(C$e2Ov?MK8;wE#sr{a0iS z49i=EA&7@`j-Ew@&5=Hq5&T=TU3o${0Tc!T$EuT7(Rp?t55jvob0;j4nL2-;k!FRH9mY{Icj|H~ zZa(u<;1g3@NMxhjq@WSFSF{|f@vcZe@}MSJ#Evn}g_`_|4YXzBkHIx7a>a2qr(})^ zC>SCkR2{cS{H<~a92tE`+8^F8Hu1FY62CHd@KjDVO974m8`OW#Vf}FRM&DQGL>(}G zb0hF6=j^>G^vy!#)M;!yw~eeYxk;TTB3L{f^3FDLv;c{LgQsC|-I$@xaX19vgO)$z z5Z%9-c2QBGkG^2=2N&MA6#TjriJdoP15%pm)Gv7`2%bYUh$M^)s-44)UV~;Mx2O(bx#@^5-{SI99fiALIPR6aImkLF2xX z|5Uj|?mJ_a1j8$ydctcf6Fg5ZyB0%cR*VkEL)|kIBCzJz$v3C5E%-{35oAhiZ z&y%>|ks?h${i$}JDX8E1U-7BI-UCjrb}DaV?`C6z!31wxa_Nbo6)rcIEBCp z$nQ7k^I51so*obb&%N_H!Bw3Le`upHHmUh$htM;}qMX2gBo3^q>Y3`PqL${|ClAQ$ z7;JdyEy#8EEz5f3J;%Dl1~qM))Fk{hIs4P3|1^~xGSfE4OF#>=>|C>;PV6OBsFTeSKP=Jgk5+x?Nw__DIhpq%MA=nnZv{;9I*Ho61@>ZtfDTY8c%y9z* z`NBx)Ca85A9AeJ59!04;GT$<#mWj2;k@HzEh1s zTcE5=DT2#U^A$2hR@m`m2rOAW<(CVrp+ihe_j>up?s0b7m79x6?rLZYq^5$ zh}j&?E2MQNppv=0W9hX6>0HtKUFJ&at0Te@e)JHsl8in78|45~&7%>rOWq)_mWfiSN?NCJEsrciG@#v)COJ1= zr3TuTcAkQew`#o_w38=oN|;1w7%4EBYI0;sC9aTmH_98wrlDBOD=i#|AajO^l*E_W zXPs1(C)nBRcEPz53b2ILLh(A6g{z>8{kAaAhsyz};z=6GOi13N|@+mBH$|OF?Xit>=bBT+e3U&FGmUVbQ#|vaOA)_F`4k5&@6Gm z^kcn8@*{J~VpminC=n5;W?LbQT?FJldwt0I%go+{H0rP)V56&@&0C(qV8q2bdY2Qy zBYe?paJrW_Q{$(2nAP86{>JO0vlf%@RFhZc^hm3)vGwtrxa}9fW42fKznY=~?1$$8 zCr8oa0Vwn-r>6}}pawBc?Jz%HA76p|8~9}!e5r&cdZ^9cjZZBgXur*+eA!_%@D1rg^8_3Mg1 z;9wgTW!0~PVw=ncGJYAA^We`+AiO$_8-eD2nOMjN`9e?6O`FeO%57rN))R33E?i>a zZ$tC+2gjK#f!Ih?0fjApz%*JS?|&$fmE>!vn{Uf%*2PtA7J4h^rtozq4xmswMe{N$ z0CF;AKXbYgTy(cOGPxtvejddQZxAIwNU}pw_4=Hg&B}>x3&+AyuoD|+9ANF`VJvqJ z%ARzXd^N=%uL4P{3bU4CjYuv986T|QEzs?k6Q+?oW9r831nQ%%qBzYk)UUc;)=Ui` z%@lKaQOLE`aopqi($VYabB(|N7Cn^8(Lbn~etCWs_U1#88$S3VxSnKwR29Dq3b?LR zR)xx24l7s&#By5w5i?S7`gj`)+$(BOSgehsTWH?MH zROv*M>>}i>QsbRisNjb*4VA#4W$naxFan&(oYQ-+jadyJH_h79MrYm6_WrlDiYIW) zU!(^BfKL$kKhoCz$EfUR@^58--D4$;E#6A;nWMLmFvpo_O&FA8jAY0o%plti+{zv= zVQM7Cq6p2E+L>~j%6Rnt_1dNTa&0N0&+T^SQ#655(PgQ!Qdy}|wfeNX*<=1MtijK< z$<>ZFXZEo$@=?*J%GT7vwS$fBvBEp1_hD_vohgET zIV$HmwC^k4SOQVaV}QTrpD0mdV(3_>s}`YTJo^{c#R=!Ve0LweSAMESa3zA%GfhQ86aRU?rfue@=2lsN*nz_`chR* z6e+H{f`eu zVYs{>`{l7<|5PghG!wFFs~b%j5!mVb^Y%n86Frux&&vQa*3dZ z0-5+%H9G8d9)H=&%G5)o<@(`^U*w*bLf;;LP#~`RRur9WW$|_GKxsGn&EO}^;uLjyy8*jrbHjuC z_rhqAIHI#FUxe)E!ohu*2NX3bbf09Tg=Q+lG6ii>Rq-D>+d`@IU@FX)LWcwr1-@8& zF1mslsQ8Q>k$N1d@_0REhsY`X{o!WXdTSR@|4DD{f!#m(?-2KTr$a1Y;R_V_vt<&h zBjMZT*|LdDm&$7MY2_|7E}A-)=E=kLK+OJWB9|)8uzzOG+UM+P7f@dE=k1yB9r%?4 zB)DWsP(cLVDG;x_gB|qsycSsSON_p<=J!pXq9h`rZ**BC5x+*d1II}D@W?P%gBEy# zZPdwz0K{V!wjvoTY^|v^6V^NcRE|0k5T2+o6$+mDb6GyApRBb<8TiF0YG!J&1d!je^^Wh6u~6i`(bVOSZ6jyLWMmk7sOSRr#Lyw!Me~~D z+2d**QPrcHfKn5NMD&wN{T;xz%j14H(sllN{Fs>I7WZ2Cad^HwKjDAPyWx$}vIpq*!z33vatK$@cc-z$?xq_-}hFH ze$%(k`+l+U6NO)RS8y7YM!qocbMOP{&+8!}16BXcTmFXQk8_KA^8*3z+PlZU&i`RX z@7e432vooaUeCQyl~a`Ty^{y$8e6EwkK5zv(G9NS4(6|S-RJHLa&wJ)+rtrnC^&V` zviTSMD>~M1o0B8|)YUhT5k~>vO|SR!Y~crFElxAF~XA4fs(;$V*dc7fR30sLo+cf;=k$f4=)Ml)bGmOS#WxhVnuep@*=8co!Io3f+; z78~_p2*H#KC`w%Q-iLR^np&W#p z2(3@>H^M8lW5|MpzbaagP)4Oej9^B|%%}|5J6>nt1bdbihbW%BE%SDpD9~-}N1_iU zH{v9~>c$xhy;QH?3+3J>xU4PYqrEbmaRhCta&?8E<(tKPICns}eFk++G%^sbeM5Yk zfDV2T-npb_CloB~dpyOa6iToJ>jqBV0t|gbg_-9Hy{}X-$Tz*#{vo_vCp+7er zzzzyUc)jpXOBhfy1XfX1pGLZr9CVq~L-*ubiJo!@8+<%@cWGjCUE-}i`gv~+m$YGq zpU!QHz_2rLD@xPN0b;pA}e9FaeW&nglr>FuePUW7mG*zC2Dep3Q8Xo6`qeWwc z>_M&YV1UIN9b5Nw*lnj;Y-&ducs0{?Jh~BTACIculWJ`z3cb1+{2$ObnX8a7%o~Ja z$R$HsuZ|CJRxatc4_Kg{%oFtT&V_fTq0lEPuxd(9L>m5cT|VH2ht4Y-wOvbUWjwCy zx?XKp56rb68l5yfmgi34u$qCY>#|Xv6>Xci30E(mpC0s`lHw7n81>gcp8OBRJ50rb z9w~F=^_3XeU?XqU7v=z4Iru}L#)7#NQlFCK_E5ArFYX@X8(RZg?eiwOiaG8=CaVx? z=pK9JCYUUo-A>OyCjK?I znrph!1>g3Ja^ywkiK(cMcpPxs=_8~)<%-tv?@F9ErxeaWzEN-ye^98cfNR5weey2{ z^7ozqPL)y_WRh#krlFN3Ah_fUi+yF9$?BOd2NWrRj7lVf9q!XCs0jYGQ@fjCEiD5j zi%hxO(+Cg6o>#y6{5r&VhT^!1#T`5@ENNwB^(JnOSxvcb>#9(!C=yMT=r!`O&b%`r zbM0welA`tbMSloVUs%-1mObnBjr2;IonJk&Wmzl)r=%z>YB8Qitoft8Dzqp zGVgnbGG4cW-$D~9yc@#CHdhm|QY+V95d8)37ckB8QHrG2J}$~yp}I)4vOi5~wljKK zIHK?S{G{LW-qP%n+?_D`1Qs8eee0Tg%^gD*<`CB6p`j!c_7)IbGXQY;4^%F$WzyAwgHI;RfjvEWQPCtlp}`|F6IcMdw}*130BuFxaNwG3jTY;Lm$G_4 zb&pLO!!}PLQ-@psJ=JoapVWMnIP8WCbci zu|c)er5>q)PvJ+E=CkIQ1KtkEE1bdmf-2Z7(t|2gOtCat=z8Yv=Y)(2&%9} zG+NGgs;b3_ekAm((5 z%(dm^LI&LC<$!1IC#70CAd9j@%&tW4$L~JvRN<0QW*<{Z_xI*0%>(~S{|Ywu`mb~6 zhD2XCE4jFxGV?;Twv`thz7 z*`+6c#!1NoLeINP%zQF={whQ7TKI`N@-aU;E6P!;dyVx}HG^v?xO*!cO1pRRyW2p& zM-1@Nmmw0y@D1=HjJ}7f3li7KHr9n`T3^PQH)aFk+X1-5@NMz{6A_6kwpyjjoB|lQ z-X60mZ82`*A?9rEc{Itu!uy~C#cH}}v{!LB;)^$-@|3haPX@5baj_!Zi8-~;-pv%> zDf~{q(I7fje~kpPhY4Ip@DRw z4NJ6$yL96jwQONs{~Ee7Sn#+4nh3o-d|AST5iFJYLDnND6twqB2SHZ~)Eu^klL*(1 zwydUupy~5-AM`eKX-NAH_keS0j{&V1WbuIP)X$PO3XkrWf6OU^k1}1FvH0+T&ukFM zVG^mD&;g&rLb4=wg|;i|jFcv!TAEsHt2=X=vV7g&0uX+P!#Xx;oG*uF#oH|fgIt>H z9wRJ61BLWr5z$Dj$TsDJmYakCUWz3<(OwC~8LB0z1i!6x1G}?-prUs5gqa;Jz@Ks> z+1CwJu9ge_5Pvs_RUJ5CHZrpKvUk;p``#(9#H zL8igdSR^#IL6BV!dckrALqT@_7~pRimUNTDr!9cKhTID35HP7l#4ZW@ng=5j(lxD7 z20@cZqGjrd(bH2SP+%sJTiNN(G+shxPb z#-%YTK4RGTNE-bfHV{IvvP}_6e!<1{lSVZSP$3!a4*-dxsaICfAlMy#bD3B9(e5EM zzGQye>HsIj^|?g8~&d>te#*0Y)WUC zUYA|J^Pb;%pB&NqpxNC5Y&E+NlgNx&)c&N1qT~H!tY!CQADdF?YEXS!7 z&i1Q89k!l0b#}{ue%(+~ptG63@Sc?I%yY~#K378;VS^pAZCXP~WIj~}mL}N%+q6>J zj~({~X#qV>>5nh>)X49&*fO(RP)9HkFfje~r0=Hd^~a5z^`&r+*H_R8x35j!xZ&HV z`i->S=}2cs8jN`ft5JK}hYbk1L#uA zTje*T&)t8-jiWQnnX!Nw3;{Ff`rhcoTCJ_7PDbxoRY^lwzi&n5WLve-3)VJHRIt83O&2c>mly_@*t#v>3fa0x`0w$4 z1rlB}_LR<5M``Bj`auR*$pfB5xPra0G?=0T&Zf7ctaL>8!u`~7RI2`Zh?xaTzVdYD zKv!$2EAA@qMx8bxGOeyACwzsq>uViZXOzcx&|XDEe?fDo(#QhwCLAV=ZZdyMjwx5i zy)~Lecjh%*=xEjqJf)B1cM;8kWdgD~|9h9Jpk6mQz!Vu}8uZHW^6Nt*UgTL9#DX-HFn#9Fm|QWTPC>Ke4CJ8_S1 z%vqH|La&d;6S)bqc~|4l8_fBndNxGaYwolXY~Quq`Fh>5!?)%0e0N{cEPF>lzZCv5 zdrJ8EbVq(OI1=MQlkC&)3o%ns`KpV86a$LkZ{FS(1e1l>ZcAEpl^~#n-7A`keNbzr z1M@yE46bwSe)lYAu0x7=&#K(WB<~|~M1y_diCN4@u=IpOF@X_hvNyWjuz-#J!Zc0A z3Gk+oqn!Z4%bA|s30mkDrGm z>L#*V+?Weh^)ghWQY223ngfNG6WqLJcZq{Ug=F!U!09EdgG#I0Gb*0ymPp)?@Ky-j8|=tNx1Spg3L)P;s>>qF+gYx zK`t#%TyP73Fkdw<9MzhoHlIa~GwnVn#lR4zPf<_TlW5{}$%S1i_I0s=Y&~kG=xLG6P$AsXkoSK7`zOoFUL09 zrHfGC?;jp7hc|~VVkwIds`=cvx#Qtn>Ue7z?Xvl27pm3a-N6PVi|g4#ST`4!w|YeFgzxb|2Gm9SI z@8v{IPfKmLXYcf4%RO)kJcP$Oyw1)b=aw_$eMvMu@2Ds=qV4{@LLOt2a|lz>_F8xE zn)`3f3}7Yln5T26%V~1!I+)6)r*WDX`=J=wxRVi3KmL$4WCkF^DkZR%gsdAg0-|aoHLRyt z)`7ls__2;A*4=?WI<&o{!0vimJN`{vQ8Ii9NFA^FmeL6pL1QHe9irN?0grHr-Tt;K zZ|wN+>DP9i)q=)h*z&~L*$>K)tV!&c*wR!|PYnS}4Sr0~-}dY~>Se1#e7@+y>_IMX zGh7URK&Z3<8oCWk8AYVj(F_HO!2y`)h-^{}yug&)h7M4Oi~W0KOGwh-qv`hpiWnNA z0URHezpMSfkWaBQMP8V<*mfEB7viCo=;)%4sl;CSJ|LS*R0Klzn(Aeu$?_Mk5?h#WE|}K$L3YSAe@_JrmFl5kAiRTug0$;qIK!(@iE$ z(Ak@J>Y8t&_=oe*(c`K6pF4~5%qCcWRLAh}Kls}D7={j^?DyE8(T7mK{>9T_vw$I< zZ;ut*$lVv*C|?upqN1$q(plr*DK7AG85E7#f#f{rcbgN&XN+s+RykvH+B5&Z*PcC-m)kJGZWLLbTdr&XtO+Dnph*_ za7%iNPiZrMO4v|)=tz2cSn$0dj_no6W~wKtKR8j11pNLm8om)Pa-I?sfQOB~Z$p!p z=FhFJrU|qU#Yzh|8SA02KZE@4w_hlYo|@Uul#wrmnFU*5h*Bq2*s#Ust%{z)YHghz zyE8LWTYVhIJU9F^&SgdJ@k7=td8jaPKtkFtSO^>I(g&l`7OZS7dvWL-eLtK51f+D;FbI%a8N1?Gq$Q)|GAh1rp5Hu zR=k`QDDa%o^1O9ceC6*?(q6sa{vp%4jhyh7pjwq4{(H3TDc0F{<2My1xBB$Q6Y(EA zzs!J74@O`h-14jOZ4@VjmZ)Cmvg3NZ@V(2*EZLb>2;DUaX~qoaWmZ^T-thUj1VfQ^P5;7n-`Jc~ zuS3~~A5u4!;EM}R;htx2xoy1cm8!p~$liWs@;EKKt=&i6D@{>tIP&+gBk6F-q@S;u zwhzcqSgvBk;*i?zKrr}C zlAdLVJ~_$`J38JfFH1d?Xo^SsAsi@0vdy<2HWPMg&1d zY3(=pM*8DXwh8?D^T_j>6@Yo%w<6!AW%1%;aUFXNl-yJE(>@|}qK5{7XPA&L07z3< z<3cm9?TTxEsMkS!e;}~2jN9V_$~W3Tq&j>n4V+@iw$ft^gu7mC+jI{@kYmc@gGA&> zQ}(3*E~m6&cv5b6YtpF_tgZJ3H#O;lYRoO%ir~b2IwPaZiTBOj&g8;?8m$d?Lnl^E z(+}*!Uk&+$H_BJI+J~jKexqa3URz~GPcTm#@@1~Ni^&h1u=#%^e)dkE2W&!vmrSUd zjk+2D`dU^8x9^kHMUKUdDPZiS;1&)utf?s0nFa+q3{D|Gbn4!ye2Hr{ZL1Z(IFNi@ z*Q6qWKwk+RzFq(D=^>9@AHb?k@2Z8@GOG1gy>!Q~VbII6%k0 zi}NM3p=<;j5yl%wEJNIR_QqX<={k6LH%qKLNpN|=zZ#T_J+ep~47Ew3;}PPQoRFq1 zdSXE1{#Afa;oTW74+~};vj~6!xGY93;&mU`p%89;y8;W>23F58$Die8)i_r@R`4L3 zUk9aMsTeVTn-w|ccrtsFI{Sjti1`+nw>5~M>U5fLTC94kLDR#Nqks0I!=01eAK_fv z*+0OTX1xeFibuML@q^yB9a~Tig&I878?z>0QU|KfwS{9ZKg+|qs5wmeLRxmW4@YBw zKV9ul&PXFvg(D^eA|!Y$Zjkhl=et2Qi@$yUkOnePBm--Q>P^3dBsB+sG5~SO`)?(H zH7N+t`GO0F22}H<=^HP;V8aV4SfjB!(34f%z}KlxxZX*q{gEL)-F6mKLqM#i{^G}M zPfec;Z7`jd2793;ZGVLPo8C6JyiBBQjjLz7VDXRJEQn7uMj4yAEXR}_C=@46Hl!&k zp&eSx0N!S`kr(H!mK)Y+4q>)@LQD2T5J|4QAt>p+3k|vh z{RuC%X1cQi&H4DP-nh*_;TB(Udw>B09=nZh*X(Ztmua@@*v^F((5mOJdz>?h}4=Sg=U4 z=(;@$hf>53%0(GBcGxsd7-~N@$XPtP6_;=5BTIT|x!RInS|hwAmRG~;QK=FscGQ;Z z*u!EQ{_YB*#fJU2xMCxbT+S!pM|g#(#w+0R!f<%b8WRR020V$zoI0>UsT??0&VD2gl!SGo7j5WF4z^vvWm1(IH750-SQj|>A@2em&_k>D zqICg#osfS6BL`DO*o8>?fTrX*;5M1O6(wN>C`TnCC68WLiYzf2k@U`H7CagFA1(p^ zasQ+j9qu0=i|G3{qH#39pU-g71p8_CD=2dy>^mCYetj``As}R#E~w>{XBUfYu1ET8 z?sV;-)Zq!ZB(Oh}0TF-H3G<>p)A~F`jGl$V>^JhLs;}0mqf{cRx=Z>X?UU&H*do5f zwl)Y;6&1Au=~!xEcH$u)TUzasfguQrky&cA_n^_f4z%C755LIZY}H!=jj2%zTyL#I zIHlYl{B840tabQ^YG~JT&spJ;vV1kbCTmy>4vS{wnYYnNEWGoqrm(PhH64MN^@58o zLE3V*xp_wcY>nCCx(UnHF&Hq^y&a+!Uxk-SsqTJPrf!CCDnoQpdrOgn`mBz7`~>lj zA7&(Zg@;710~G|OC!xoIE-lzg{2<`Gu==z$+(__qrxm{7%Az}GPu4(<)ZAKl{3}k| zC)q0XD}cTY=^5cd+PmC2C>Dk2b=k05Jl+LVtWO?*mWAVTinm44{3sR`D!`p_Ev+38 zhr4w=u3Yy|VTK^?Nit?DN9mvsZ~v6^){>|)_o5m8Mvht zaI<5wJ|-h;@w218$K+|(4BXrhb9NUcPi5tIiq{4NP=<}~{kgT4X+xQ1)7VgJ!NLfZ z<_#8lyux;qG^uV+%|?*rp8h+LtWC8DxxlrnsJIkc3}$1PYIS$aYG-c@9eGvW@mI`i^*#6vWQ1>ifx%@=w5AGQ_iz0ok0C;q^@6+JVR$q zZeoSVixNdeXOl*jdFB+E&HC=@2v54_Hn!(R1a0kk^4)Ac_Z5Y^;kYkr zW;{8po~Z;qbK&r=pjZPr=LQ`j(HCi+l6CPNcLO8DQ}hD&-QeA=4v(}S{P{WV zVDy4tSNK8OE;!W0ba@Jd)S8GOzGU1gWXE@SASl35$8x=Pq}aMSij7wXYYpssAtChx ziw~d@hJ{i0FrX}DRK-lMDP~B7^FW;%ibS~6N_WWX+)v z3%`zQ_9dmXi!*55bw$((X{_}X3{|#}gF-&?r%X^)Gb9JVC=ROvO8 z_d$o-xgxI^!;|M@4BUy)Bay}9pfB(6B*yf*WtZfomeszx!Nfc%Be@Kl^$T~fBp!*h zGK^> z3C4y8Kx$xN3)F>*g8~d2h1V(NlHlGF%2|?(<}-7an%J)TFeS#!4-dhQH8350MW3J% z#XF(n4w*O#^OMdv%#P z4QJ6nY`)by#8)}@8<~dxKX3rygXME`0{HG0tjMzKaZTQ}GP6;K?&}#1yRqwC^%NC*b*gEg*WHnd)UwfE{9 zy?@dPWo}o8CkNRZaVYcg9FGXR1)^NRYJ#?H>HEJ$M`F5#S1&yx4j-w){rMrSNEc3< z)(q+TDxZV~ChnG7c8n(qdbu>ZqGA~7+{QC`n5gJqaYUiA&wKcd;>@Asz}hUBADLt9 zu{=h_mRC99CAy!iHHi*Zx`Dyn&~-H&Sb@1YXqLi+%)g+b=b;sY?dlLMh+r$8FRye% z7)utGT5+!_;I9@8NfSIqg-T9!vX_m{J6)R;`e$l+qPhx(ZEmT>fW7`V1w;TRBbOQ4K>#QORn-HbbQj{?Qu zEdp*GxC0xbr#a}m0LC>Z@l2+f>T!;OO|q+V`1%Rul2Q|evp!(7;1nTCsD~;taKDP4 z+fG>vGiShA(iWWroS@sdv%=y`dudIK zv)RdM99X8bn%wAEe8`$fJU;5Vi}J10$`w-y$vPbkhPE+Gnvq+%A?1hb0dxWWBk zXF}JskSU>c%4pxy<)_P?5Nz=_o{hkXvIU7cB*26*CX!!_v!fYi#+E{Rw-M`1-Ft@| z4cbd(Bq6AhcNGd#&^x_-(T+@9k*~TvHyp^<;cy^|Ge7~m#-Iwe3D3PKw@b8A!g90C zu}Nwdu#q%xt?DaA14zQP?Z#COzkvHXdm*c@)+u0tswvn5&Q~=P&yAW5m1etYockTT ze~Bljw1pi?VWf`ZK!EvjS&)N;W>7VQ{n~9VkZ8KrhgCfq(6|bBBh&JAZND%5AuE35 z1bVDTO*#LzrG?Vbk*GIpe--Wxg6;Ehq&8;9%>~$KQtKOCmuNT~y!SYQJahlikEiiF zlP`&dqJzVoUk3XxPD~+82{egkejax9`o8%}wjE97psmA2P0{7*ha^LOEH6&kIMTJo zB~wY%yxPeV&%&3mV`Nflr?5)QY=>;YIAt7QULv?qa4j8l+ZuqA*Qv)rZoMe5NDI{y z6o)cfFGjA!!senv)^N|yt!Z!=0Mgf|Gn!xuaZ947sGYT))0jvuMtB)pFlE-{jsujM zqK-@OVR<>ziYdx3r0!YBKsyq~7do0Hvxhirf3VyYRT*z)oMdx3Pq|V&;D$KBX1Pl| zU_x;M+&+cUMoPL|8dn1IMA>6ol0vrwsXvT_AlWfg z4%X8&%{t~m&nCD3AG0ZU<5S>^iIx&(R+a|kVP<2)mI~93f1dd~h|3n5_mZPWy$!H} zzR+^2XT-EyqNaXFafU0MvIaqs>2y(X2P;gX~;Kky<4jCV?ctBT$tFUR#r3FCx~_uejvUo5eO`&C*^l8&DPlut7N zQX52zk{0j)u4xyc+zmy)qqIb|01EV`@hFKdCwalf-Sg>`9YRSSTF%Kb^CmCe^jFBK z{Q}zCFG&LXGq?A09KD40o|*OzvArKud&k_~_cyH1Jcjn5%0IEa;3fmguodC?dJ1Da zbCU_6RC3Q@+U~J60Fp-_ZEv-uDJ6a>c|WEZI^d$Q&2^lST1KH!7gr||2UW13Qwn2a zYE|O*IK8|=Jyvy{V5%%{PS|V45Cup6qB&|`U0>rB>9W|v#5IPOw{M2#6eTjYP5%Zi zihxcPDA|OqL^N)dXTjiMRU;c`$6jz9R2!VYqaV zzX?dgxvoI;-Iduo#MXf`%cA`Pg~?O>`yh!&_U|8ZxWnypJ`C8tL-c@1t57a+61>i* zoi3$I1a3!VcoiGI2#)H@L>q*V0YDt#CY&VBT2!e(>%&3tpL0k{S(MY$Hn!6~>qVz+ zY=^&L3;YdX%Uk|qHPAkDiLb!wMGOi45*+wTQ1Cha<3RXCV!);-H}*8tMI5KqEm#M; z4>lX&;^5CCW!aGeRJFSOQ9{+4&k-@t8k8tGK@C{Bg2GKI9qT&VR#{J>M)%;QYBOD4 z8C8=}6ZG8JGa8#1J|XOcq-eFKM_@Sq1t$id6x4)&Oc-N)w%;Pw9SfGslD1c*mV= zbl%5QaH*ADmH2_6TZPFIBKD6Ym6+Px=s}8Cy2&|NY00izzA-L~B&j^{fTe4CyR{S^H!OfUElTMzOGfuw-385fCInoCX)4(mi~Ny}hPDFP=JDGG z%dY$o4=2fNg?52tgARNyEGue4r_3c6I<|xEsXWSaOYCXcBgZ-&9_6yLI@;)=!Z$J) z#@+-jHf34{8M(nLHfl!nb*#vL0>qMb5WGf-2e+nlp%cb88({6?%HZlX{c;_?v!DGK ze_r;@8kKA9vO~}?pI)F8TKtm94iIW#7L0lTF`Wh@D1yOy()s>ifRjBK)Cw+1nh8{_ zb83;yv#w21i_b|?DZU?i7V#sBUdpLYmr>9=EhpK9w2=HwSnAwL0`kwr^(ht?BgaNB zFROBX@hMl;y0xl$!E;)yoG8LECgf^bNq-t?Z^j9Cs^FwD}Wl7ks2ZeCk-C-L+< z6>h5ME&6b~NyZA~7*}gLolh;%64uf{^5Jk^a2)EsxJIJHL%AQBq?lq+eO&-`Z0rK8 zwExRfc1Na9QDR&zzL!9dqSH2IT`D~}-P$~hwgG^G-)o@t9cV(IZKs=CXYifJ(e0jY zJvv*$SEe=k4zxk2UfDx2o%(^&FRrt(+F-){rFWg2aHtMMHAWI9bF2=db#;#{XXuK- zv-c1W+AgkU3j-)N`q$eNCaClj!hw-e_)ZG$Zsu)sK_hlgU~V_+CGaEXm9_25U;;M} zT0;&~fo3Q`7+ABW-R7$9n-(7|?qG0bxcI8Q-8>7eNBk^XllAGe%B*kO^}Sw(M!l57 z!B0yfY{>C>2hF*`t=riRy{?SPLOc7*yYN_E{725J!} zw|tDi%&j!SJ8^I}>9VFUdg5;#9?3sYNF<>@7WW)@r7XE*hZhnpxsgBY)w8^i2iujLS0Kd&SwhKqxu}Zf*JT#yIHodbKY81s5vYff-v?_WMMC6Jw zhN%jjNygNnK+<@7h@LK^J2Os<0ra8{6!@3TfGf;WTBLw_3Un7e!47-qYwo+;qC(xa zPuR(RTlwll|v@|1Y%=7&-r{?RS`%Pq_sC z&*J@#fe!wh=+8RQh~kA>=+8LefA0DJQcHo6^M7i4J|&weSp^?A{r`9Iet(fyJK0Tm znx&Im#J&OF(*azet1zL10m>E73Aji{Xc~VR4{wwfs!V>HV>rNgV!0R$2A4^N5+~KQQLHGIxVj-us$nBbLy|r7Cb1K#+XG@}$=ds7Duu{tcD6u=lLb^Lr_)}vuu^C0DSk{_ln3I>)@;GE8Z37${(*X}Q|R5Y z!F^h-)~VnF>6tv)&`6@xIk(qwoo;Ffx6^QG-K1^4XK7!Rd0#MqP7QB2A9^Ljp%CpH$w252zkp$Q@ z$w|d%F(H}$`w!j42NCq(bnC0LUerQU&eQiF&UAUz!LHZauUPffYSjQX%Ea%nTNcdJ zBb{Z$J}Hz0^S-Fus8^59mWkca=3i58JVePeLa6-eC*LvB?cto=U9`Vjf?>SLIF!!k zbIyK=F-~C*VDvz3^)06UZn#_6I#`Pc0Q)jXVk7kWm9UxZ`)w$IVGQG8CFY}9poQ~u z6+uh4z_I<2-s#x4q2{sme417jZaz+RTk5!-YN!~QHW0M4?hRK-9^9nqqyTbNP;BCD zFA$Z7%uWmcC3`|Dhk1_B=6byqDqH5mG8tyMmo2HGu?4V$pgi6bD=WUXt{HU%x6sog zlcc_bHCKqRM|C-UqUHAkn--acTk>qjQcXfFEAy#6U+X3MNt0$)rNLRYASys) za51P$(Pvu?Zpy>pazN5++8^L_l%6vp%~81}3GI&)j;%rL)LD;WoDXDRWmA%am6p&; zxeu03RC5bC)Q`Jv1}Z|pb`cD*A617ycHKfaqG#Ot&vtodq>HiYMF+nni8qK)NYD&6 z#a0E@azn;d^GfnVzpNHpxTSRv0lWO_TYneGU{3L!;4q#| zVoKLRW4t8J06G$1CS_>H>z(e&_w2y~?OV4z-z}f@D+&f`(;P}KfN=)w{5juQvnkHv zlv0hjER`$*6J}v#M4-?ECrq6Rro6?Wu1#ZGuHf3rd(J1gBcP%|IWu*eVFB?`^Ncw! zZa&Gt7{~tbvQh0(eZ&VcV(!L(s>FeqqxPH#n)g%-pK-s=2a1DNc3sG7O*_ z81G7)h$f1{j9`Y2kGj%+1SK-u6>#aeZlEumKu=#vD|H9$nSd2mhP^w)DkSL*OKs>0 zhVJpiHY#7{wh_KR?wdLCOfs0(Kp|2w3a&WA96$)g#t{siZNF=I-9-CZoMQ*@^o3@WrppuRX{!l zkYBnWO)MRfB#*XqHWgD_=TG_4&!6&Dpnvsd{{qc^v(iWaXRD25a}%-i=p)7gmA%1i zK3-`wn_pqmUw=%~wLCNkPQyDf(m9~**BM9Jj47AcXg*|@IQyo{G)HCGT91arn|O~o z;+7#+Diec*(XmC@4y$(Fk6smWgOrTGc32uGQrr3YHRT4^2TD)+=@BC+*kbHH!LqoS zpDOe|$)0weAa0)ao&ai|c3al*g27)9C78P{$yBr)j#fc*J{gsircU4|qZaDNq*Ya$ z65o@?s^!m{-I!mkAMK#P1{_7VG3$c3V3FBIJh^hEkaQ8qUYZnMdZ?r`05tx*)!AA9&v^acI9tsbRPltX-!c~54%BC5KEN%!^yGJn zFFWb+v-HZO&i^G6w7+p)!0JY`1F9EvvT3o86BIffi!wpVz7X|8UG-2ertD%aIj&an z%)ILaZ*NX@>9opX=A}6g0;M4|+?_~1Ny`mZF?o=PRD)Cz3|%Fpg5{0)!)7D+EW$&?yfi$vnO2&(t$aSTOUQZj+txJC6H|88WsCWY8+9*JUKYxd6loLJvVX@<|qygS{3QA9~r$RE9r%Pna$^EHLS@`bp^|c{ag@jh ztI=9{7RH#^S{^%D+ad~Oh_-XNDkEO9R#KYEWM!rTXjL);Vl_ftF^1d419CXYOQSs! zty6ev6;{+n*s*ePB4SO$wP5xs=?^G901BV{3GQQmIyD2W9hJX2V5KD?LzArI1M5Yt zqSez2Vq1Obq7}`!E}5@&&hJfAAYNMP>xcGKu5=44}ItfbL+B{N@?J*O+ZuzN97$ z&4qK!Gz5)kPz>3#DW+ShhF;oU=G=w`7TT+GD{oOb&j;D|HvjT8KvIyeEf$8Z;_^zJ z-?eit9r@?B8i`9{qbeyq8FZa4;#es`PK^v|EE5sLhhgG($Z~W%Lw=j5xICa)u_lRC z`uX@0_0Q;sfNzz0JNhA)niQ?xVkxr;saw-wkz)n25Qan3InY?Nim}Z{VgNP4G&Dk_ z>=eqc(99!2g|-_@$U+dQ1d!9i?y25-w+`xQ%-D9|XtWX(JH{}Jal0rVz*NwrNnjKC zaKcMcKooP%_empPD&eKzPPVAld5gEbqM|~2!M8RyHX6+9LS!F_#tL-5P9c%Qv{2l& z_gI}=S}WY$;7w#SxaYjB1gIPk8k^V;dg<^SIvvf~B7TDQjealM?=4YU_m#)|DZ}+x zSGL8$bT_Sg7Sn?Iw!vsVoi#K0T|WLRP5XO@?epJ*%Eg+bvJ=u|OW zhSw3BAz|BHj;%gYVbW@)=`g_EJm6SMs{}R=(jpg8&z9inXcaV_EW^^PJ0Xb(CTB24 z(6XfX0RiAu;p#B;vOa^)-Pla@sVP!+r?AK@W}v;wuaTl8u|>JCNY4Np=}5cmNLJVl zA;K_M?|%@5Ct*um-bB~&jh#XXc3Uuvu_pd1xNb?5O!aR?N?j6lwSaIK?!+4_(`Yo* zp)*9n)_W-VjOk}?== zp*GTi9n4n4PVY4RS%3z7t=9>#u{0NUIu$!wGxafp{;^3iPKT{R2eyj09NT{qXeo_g z-6^tZUt|AR)5jAnx*W8%t48p{9jZ+xYv5F30EK@X$XHD4nHwPkdnFaam^%QkmXw9M;&h=^%)VTP-IG@a?nZyLN7_TEn+!kQ2BlFTz^U+lyF_~h@ zYis3@4iSTi^U4u@Sz?sl9TW!;dBx$^*Cw!_bRp^KY!_;eiCL#b5+@|I$7qH=p>LOJ zT9@&YJp6&MmHHA$CV_d@=hu#Vg!*v5P?&5$^bH5rZnpy$(|LwEJ0r}l6#-^7P)!Hi zYO1y#t~Z|Kv1I5hhbc--#_3RdiPkE7-QReWJbD}eq-5_agW62iHy_oW0#ZWhK3ZZ{ z*TOZyc*QVz?AG<1R?8QyPl0|^E!`N4-w^iyGf-`smLwUNBr#pSM(Jf*DZx^^UvFu> zAD)jYM^$!q6Rh;Ozxic<^Q&(|SnIjGu6Jp_J0`={B1_h(KekhNaOOi;xMXX~^>jT1 z;}**|v~*AD;e$tyYk+UHoa;;Zlpc9d1@nGWi3t zJ@(aLU)GYN-D&~X7w^J8y)P0t3?;N|6GEfkBfHq|k-NM;ELQ4yqiNhljXUV}NDY}G zEuL;`PL=LW!4% z1wr9WNLFHz#G+M+D-u_H{n|=su*KWN&Mo#8fDRXowd4sOw%Ik zm9u9{o^W!|>QI@k@>lt74jXW!1dJN&_b(4oy7qcLPR3(vE8*nnNvr8!6y9weJ>LuH zxt5>8%t-?IyfDL6iHid{l~oz#&QU8sbK`93e(hS*smRU0_MBOnss^(jO%(47X*N&% zaX0olP+Srj*9zmbpbt0v;kd)b{mNjrRB;LF_Fx}5dKchXXghfe5hh+(T)`?`?5 zS}s*zsEC{e)P>`?itz|(b)N5>>>PAk9s!#rA_RSo1vR*CW7r8RPxdV7!znz0dut~! zP^(~znG&)&stTwVD1IlUscJ_h3s;ItiK;QEF0hjWqrn^u0!g*uTJ(~zSxT1f589i&>(ck0T2_siu_9cKpdhb_;Vr=;Ja81YQDoQ zAjMnQ3T|P|e>BFLP@fjtz(Kn$mIik%46c42>mJFdBb2H?mlZ!6|`LGP{V3&+rU z|3M^ywe7qVr+R5w`<-ckLje}TX&%9CB9q?%SvFnsrCM~DS_-{7=RiDd$8a71%}<7I zcvaPowFA303(V#rO2}*K8I>|$HOb($h^I|@Wfry$uBz!oan!6KRYq+TjzJekej^>m z6O|$QvE_Apm0vsIb{aL7RPwUO=d)%d>-{&^adBB%ipmAHgz8d_@sNr<9z`-}?Y*#~ zrG)d0kY zl++RwzcQ|rrKUYxvE_6$Yks3V>%rFKmC0Rwm0n&=;Qy7%xEg2CJe$N93F;uqc>xtD zK0E+>ryIiDz@p}n{;yjoeUsdS2r^x zv4}#YiW!g(6x5!EKY*vW^mKKh{`*vi%nd2gSTLW7J|Y4!-bkQxem(>CpN`zg#9U)e zrDx?CJ8Y_jtPG<3EmeA1I(U4kbv^g&t!?Ft2DWWuz;p6-$P<3lg5OqOJm=opV&1Ml z3RL0swrzcP3(0^7Oo+B^dPE~{5Smytq(?-A32E2kW{jz*Q=xTjTZxLjFd2!G;{utq z)FxQJVo6EIUr_o%*R~e)&&7Mubprp9!7WFGtI@t*^eZkUj=BhoC3P>3)<{<9$r{gg zWyi#!a5GjQ9qoPP#}cB-Y<(wEner!+lW)sY72>xX%(b%Hjj|>!*vmwf`W_bV8+m_$ z-_;A^T-Y~VUfTj7Dix1LZYf_(q)P4P8B;1LGgQA-W2p3T+CrYo1_HE32_fODC3Xaw zMlW8VV0;^YN)Ix4Kqc_nU+to&KD?(N1M=Iam+TyKkc=yBEsysYcA3Gb&4WTcx5~eQ z%M(xzQ*y=+s0cOB;g*%iR|Eq*TIiyFi$9!~Nn8xC%xn5-7tm4)UB;JND3pd5S#WVt zAAg2jD#3%i*h^;hdJzmfZ$+n^T|n_^me+~nT_g3Zm8u_8SDv%*)Hp8iyv{Qv$=2!v z-YX=BbmCamLg-OJ3gqUL^FzC>t*y}s=;mh$*%{w67TF{jMJ5N%6s`^QgP5LJLediH zY4`j6HmN6+wTCv%m6%XHft+WUATi^JH%{ZadXJSIcGJqHLqxTTv5-8~ns>&~*J-7# zzfm1ii+-U~(YQRU#P><@E|am7e>Q zYVAR^H=R`&mZvXB=(OlbizBzT9259krXuJ3-W1V@6Msu!a^pfsEjXFL?Q_%}dniSh zde;dh%u_Prz5}6BJaU-<`cGFvMx=Y0J0MpaoQCDBa~GbKVIk zMD%Rc`}q5!dKz_J7+^P4b$D#)b|8K3_V{#&?;$M#Q;YLO5~ymN{5qM(?hyl zDRU;&c*JAO6N)mssRRL1PB{e7Zu9R9nDS5f{ZQ|gZHyi_V|$8A#Y$`>nsVaJ6kOD{+uy#F)boYZYAJ9ZFRx<0?@Yy#08s*!+$XJn2myk~rCU zXS4ZaqHKvodH`EU76XL|S6ru(RJOWJ1Y=1QhcJ-}ke~)qtIFJqUL^%d2Js?M%`=+i zX+BEFH<%Cr*Apj{!4);EtctNATx3&@fgY86AlizpYnws#Td#AtdJeavO*WU-ha28r z1aYCLExKdd(cqX`!?~0ScRE)MFG$_;o#O96o>3qsMNgq5@w1@?NO_;6V4q_5lw>+n zA2#)jnl+42(5((*L_Khk+_QdusuQG+`i}gSZv6r1TQL63PdjE;?H)*;Wo)A~hJ*lr z+!@QskmLaAG3%3x3^uK_nPxhjCZiMiq6x4J5ShKXus8Aqn$Hl=hDjMI~yZ1ggl-0b74zJ{r=vuRT z`a!NnwN`A%+!lY2-feHf?;fXOf(MrN%>;n>8o@`bWer8*hYKP)`$Y2Nn&U#^$?2N47ypQL(0Q3Xdwv^Fs=X9(tR2V7l4V2a59e2 zsH0lF3e9JK&f>M^HD-R)$`W*^Fs8LI5AG(y`Sh%&o=gdp zTOp3}OrcA2X3jhWg}u~~?Pw#C@SD1Y^=Q+;b0YT}npFcRK%3325b{&rx~eraHF1W~ zSlRDlYu%y&!H-To}Lx4Y+XgEk-7SVh*;10WE+=o+mp8hFbZS6MeEwqWXI z=#Q{gsd+^A&{%s&`GZy&jWZHe+8b z(%OiFD|?kIQLPf$z1MEswPMzSx9_3e)zec(+vcTz*hKA zvapCOERj}ld%eh$Rbb7(m1v+i^uiF^)#g} z;RuEcIelaaY4cHWV=X0>LZ(vA;Iur(6VQ9&s+we`Ng~r@s}W?tk>{aU4oPKFaG{^+ zmLtAb=AgFX?IKZ8VH6M@d6J-T>#D^UFHdS^Id2#`{x)CL{UNt@51+NV4S5-c(@_NP zquuFf(+)Z&_jq`P>7cAX;zQoq&9kb&%+w@DO1K+N{@2<~yz5@YKdn;YE>}YTmK(Z8 z*eH307Gs5El+ns#kqeqtUUIBiJO+-P{seEFOEmzWTCln*b01*pm!56*s6Um^*;_{) z`Ri?ARSL~!IpEf~MwFKC87-&!G<)Xun?)-U7j2e5OcM3^B~7;!Cw=N&-m}{5X^Ddb zE71!O!}10#6m~FbXv*;-;6GoQt`k>~Uvku<_`WUmn{lCp`)Pp2b>-bajVzHEUpkAy_9n)If+Fd3K2;$&^0CaRsm5Y%7KaVG*Mwmv}x_P*3QW;{P)Ao&dCoy>{zt6p6k*S z{e_A$Iqsaco#*YdUi7|ghSA=NPEWr*gQsnUDty#-+HIeGSlaS0e#;>%6Ax_Eq0K&@ z;aqH5Q@bQ#g>~W(ZoQDVi*R$&fSZ#h+^m8ct3O2I6dSF!1rP9%HNe%U963LmQfxoE z{Zz<6e_6N)zU)OSuY->}mhD&e(3ErGf;0HtVXgFLU2(K+hsfUwSEtj{ZXMY~|B0Ur z!-3Fz!q(IU^+UTs`BLj(sJSME#upfs$=XrxKiFF;?5kVrU@y=WUBgdpy+DDnsuH9@ zmtt1e>S~78`wv@)gcX!Ju3qb-Zx|#z^c4sdof%tm-`3 z*5KU>inr8i&>9PKPuw74Q+q9Xp-KFu8dx+=`LV~I@}*}mMS(y<%6&{KQWG)#JDqjx zyW18c;LN=$FO|@i#gJ-XM+ei80C$0IC|T~CkHkF_A^Vie`m8d~eneCkoiMj51WZd0GIpwV5Q{(5;35UCeBwJyk$`RC9G*4B zktt7G>I@U1M{M1SB-1lgcJ6u3z?4u{1KPA8#P1k_e^XoxVZ%Tm{+VDfCw+Seaj8Vl(iOd= zlnTK@fr@o(wNI}1*7W*ocZ#6^Op;Q%?|&b!&XBphKzS;X08Lfc6C z<2dU`B3Fk{IC0~h(oG3G%bw(TrN&IyPrT}{F_pZWPv8P(IWGCMiOTIn9C;ZjE{a}g zgXfM-8n<0nFASCJm;fmf8<)KCh?KT=Mk8z<%_aNMQ8GC}(jM9iuhOQpB`s4@ z<)TQk;SC%HH`9xJf^tl}4VJ?qonc_gQ5wTn3SUt+bVE}U95}2Y?2PfcHk}bFajque z9CNM{D$jZCoZGO@DG2}_!zw}x>Gt31{q|Fq4)ak$dzp*~%yKf(4(D8Gk!kEbMI>!@ zhT;`l=4^qK?I^wZZJxf3C$d9%!*6Updi>>AU;pKsZ(9_=lAbb2gqQ2^v>Rw!{JE7? z_As8M6$Z9Ny!<;UauScDfR;FQWb`em0hJvP948sQQVI1U`7La|(}AnJtT>hqBitA( z_auJ5^od@{E?+lckX3!R>7HYe3+0_Qfkwxa2!IGe2TwM(zXmeFZu31k;cx|WR>f)h z&OO$xG+zWx+HdXuH>&ZQAvBilC$>BiMV2#$f%#ys7r& ztRn1_Fa%~+oSSFOthshCZKjF)vg>+USMrN-9!t_{{+L)e=B&1sDSFx?@(EK-uT zN({d;FMzMGFyo5p8ahHC^}8@g)3NS?y0uZ5MIFvSzob=rAWK`d)IaX=R@b!i6X;Svs6fXR*kKz%xNz;r1fGoJnHQiezY28Kxr zzQVVfb^wni&DaqFzW72|99IC#@J6b{@0QJoE;~5f`DL*G;$+R;I>_=bX~ifO!yV`M z?x=3H6OQ1*0@Wg!B_tJYJ*eAAQg&9Uzqzb_ zsCtwAr>XV+J)9TsKYUmr8mqND;O^S89FyOPk+fQjR`Pd#8H5>#n9NpC+U~1$`u@Y& zvOuweVLq9}Gp)uPP?SJm_&GhTnH?*kbR8G~Ni+R6)*NNM3=MCFi zk2Y7p>iZ9?;I&BlNeS1Rq*Fi48c?}xD$I%VaZ?e(&c|Zh)PMB3cG{gM45#al*b0Bl z{3*I&E(l98P_$lO=z~T-f56XOy;(3^xzs~QNgpK*=|q;b0v1dvfLoyMV(0?I3(5-1 zQz{IU)1CZo@MkD%VH@y_JHlh{cFJvv>5MbBQyybXH}6bClLd-y#j57buU&os8(y#^ zPysez8lhq|+0_-n6xE_`sE!;JO6zpX?a_Ml_zYc&G5*^MI96aBUdZDBzS#CoaTm-* zOp!5LKW}yL9`*i1gXIH$Y`l8AtM)FyYvX4T=k0XGbfdXdSL8ApDehLu%iUCG`t)Xg z?mR@(7!MTdYBVZtm3v^El8QY;*Gov%^wc@^wCy5lHMXJt83zVL8itcv{vhZ zL%o5AXy*dD!I^MJUX$jv9h|ds$CCEgFZeO?8c&qv$;}8tO}?z29_^n!!wnJ=KK(=^g&j)2*B4uCFkTD%sMgDt1^JMjjwecgw|@9-n?% zT^0GYN!Z|DmBdGIUHbmS-cK&*8Xz~@yuIGdWgGj>gVBh-&2Uz2v*ElC`YiH5pGNhp znoiHS7`aK>{i{_1%H|GmG1%IGU7}sz$zc@O^XHcMw0p=lNeP(Bm;gkYi69}zCx|-a zrfyQ~jobH{h*MIreNq(gu9cJ=Xa!Xxk(R+upCY$+EFT4!8IQ|4pW%*9tU-%7(l%Q&e# z6WY(NWcZ9qfInVX@2prssGjGZ>BP4F)^nQL4vLCBxwwDt)6Br?mpf<2HBjBq4eR{} zxJ@~{NBwqmo14_)JCE9YOpt7=w<2uzrYsHEut$tR*w#wSP1bm>mFY!4dM3(i&Qr@{ z6)7-z?vQ^=%~C~zamAEY1quxF%Z#G+UEGL$$Y_#YM6YhDD<~bEqhm=vn#2Bma#dBc za_iy4Q9dmDGb+%}i_3?PA3}{HE^Z#e_%W%$)AIrE;(g1HRRo*jO;d_TjN~}!C`~+D z-T<}v>#HYN;wdnpKxMkhB`Q%~ITs11>MP#jA+NwW!F|QVQYq;7$97T}?3WBuhI|fV zJwI2YrKGlLd8I6N;%JnP$4P-2`J+84MQ|~*{FSnHLm)6r4X4W)WKq65$|Fpwa$_t> z;0;D6JCYilQiA4F=1A7y2wUWMVR305DqKm6&2|Wwt~i@dVU_ZFELx`z*3bU>di3CR z|Fsiw{2r7YZ$)aRDUn?MHYvuF{2F(}!{6qZ&K6F~hmXGg%j0jqeR!2$uaEL|7|J>= z+jWf7wocl*b<&=%i!#1k$APWK>#``<&7w3N6?MDn=HdH|-j^RbyNAE;KKuRIU*Xr| z58ci$yTAW(@cY4Ef05t&zx=-ckKh0C*M0u&s^@uK04q2daVR%ghbHblo}l&`^7G-2 zF!_t_QyW+2O%fMRUyt5@`Juaxzo)RMui(M!(O>z&D87-Ou6Y73kt5y*L?74(d?*5$ zc5QNH6GM4x!4dJ}v^n%nKa{)x+tF;+m+s=fnv@mo(~b3S&)VHPSP@9j>#b-fyD?8O zUs0*jWWnyIR-eN|WV5QXn%1ATJ4JSHIy0dVyB9AHaTb?9Ah?5t&<>k`S*I8ka#N$P4Au=GMk&5jQN7^zMoLp~xjcSZxIG$%i$x*kSmi_2BNi4FXtKXHxs!C(B zu(Q~K*(A=y^OWfvFEBFbQ?biAT_cVu9D`wjGT%ZwaVO>%^CxDG{b``${EdrR?wGWw z-5iMA)y8DY!f~sGS(iYp7%h#~Y*VbXI$tpeOGbU3gMLfja7XgDdKH=jC_sPh7(g(* ztGI+}g~3EizF`6+n7{gaLTIZSV28NdjomOk^#>wv`nMl}FBaknIf0pM(q%JgoW?gC z?Gwne4#{aUlcrwmecBq=SBRU7vioHw!6SSAKPuqE&pi#_pfuWQb#2GayLlQO zC9X){L^xDfF;&X_(1p`C$eO)v5F=HAsj$e*|JYfvkzFBCavwr$8cP7)Yyr2 zYX&lky~Rr?_g2MO>E411zsFEW-k}=}T)^>z=3Sgf*W7PAudg3;w>tg%f9-Cyy40bf z_2l*D)7OulJcK`9Dl4)K?`S}MKdE1*b+x%QrC23t1wCkaHjDQdLK(H5Tx~uz1)n^G zpJpcPSy{@S_)ML$M?`iS$J6C0rjVRLJk+_4DT&?j7++BYB|xHgMBl(r|7j$LJDqW7m8XMI>-G3C>S?)$v)T_7tKfR+laTHRJ48#WEZ&m}gC zjdI{W<~i`d%I1jJ%%&$(6n z3CU^2a!AtZ2NNZSK&bASuIna}a%dVb`UxN_+W3QEl$4X5lT1e!@$gLv=u=F*_F9bU zo~+mcLEtfVE zb!Tx$DYZ66lcA0-i0H)lAcLC+A{z}p!HNPfN~+>4E|a07j^rrXeyUue?S)A_F+GHTtpLvGRp1!=4X^nQ$!NFQR?rg)yn%XGT9W^>a)=$LeQ6 zKMUv5w@m(QW*x)=KN?R3k|K@_mH;R zjI-Taq3l0yfiXeI(K3Aehw0&Muwl|M?=|9LwX7wA1yr2NH`JNSa;lA{e94cR}jF=zEG#Yp6b_HHaljCSKH(=fV$y$Fr`X7|zRpDv9$#cBRF z;j<@V$5@J+$mE7?+t#D&Ji~-Y#TzslxsGoZG)F)BNLgofFGFjG1?~&BKEMKOTnUj5 zI_`w-<-nPhVAdLM8Us^S7kw_6`r0t9p*kCAxrDRjG_%@}=??MR;_i zNkJG%b~+rESu~@jxuEHT{nSr=<8S@iYk$wX1(xh}xA1~(+VskvgqiD`k!D#^42;sI z)p8f9BG&GraVkAPyO{SMI)B}=#kJ5<&+?8@fNIW<)SusLt=1P}bEEx5t%=0Y3&`sARKl6 z`UT9+0y};6@keTn;dCoKYw&4VRx{mdsu_;FMj?Gr{LDcq8c@29=@>V9(R#o=D2S-8 zuhg@Dh1a6t*y^iADJ)^+hd&*h>>upE*o%J0pU+;N>>M1dw0=+j_5Q>A4`&Oe1{Zbh zp`5A%GR$BTH%Yos$NokL`JHA6dU>0@SP#_MYI#7HI!G&YZLEx!*V*ghe+X_|B5o7h zz}`I#NbQ`>rO(Jf=W)Zg>W>{f2WoZi2P!St(_YKwu(ie-&SDodj9jXRU1S##D!9an zY@u5B7J($xOj2mr+beTFyInyz>Abluub`1tl5C54+YYc)n;15h`J@BI~`(I@_n)p;{6BY_pF}_LiO5x_6O-N@=u~=cKfg(8&|y> z_|ciTmMQ-51Ixs*IQp-o7Bn6Q{>t-&0ItI09?dyMfE$a1$zNd9LUmfdU2H|`A&&pd zZNRlAE6|+1VKH-e#4Mp%!0LcTqXpu0pr3jw8>JJC+|qS9NugucCEY@mKN`!{7G@G- z>N46(DEvqSr1SLcy!3IdnN}OKj9nKq`CpmT7S8M>JET_{m;aavxVBasb zt7=z$#fHcxyc6P7cE}c35D2ZshiTRIhgFX3do;5ovPI{y@K9JbI>Wnvazc+$BJyFP0u%%+Tkk3`SG=tR$zz(t z)I*BD#sIOZos?Oei-EooavZu_)PVeHKvabLjDa-abtcTpCbyeHU0g3N_#%m7xk-3ZUa{Cu2a{OP*tlbg^5HIm+9P4@-UmG zs)4tm!Eek zu!ZXy31KbvU$4gj?|>#3JF^O{(L)W6QxGY{J`c+RpAnh^I&8V@zbg577qSxWMV-#U zEv=%cTj1lND95Yb+MMDYuzJCH#0J`I=jnoOa`uAJ}foh-rpcA|RB82-_cI#i= zZ~xbF0ViVZ^JlNbVwx5?yMIW`+UtdLMq$;OJST7J!m9;s#-H`Px1!c=)Oz&l<<}OUfJO%R^!5H@_wkG#Kl|2wn$y!KNAA-x zJ^j{8yWHB^-=a4!9{ZIpw?F@q-yMGU{r>a8tC#yv4&cB!`m>+z%dG=S_x$k1cZbiO z?!OrP=iv_r&jzm!UhW_5zdrPuvfSC);(`xe4F2QI{x{{<+x+@@#p@lFo7z-jRM^ZTQNgUy!*N1N3tAM&srzBy`0_&HD9)4w#N`+^I6`rVtOgQ_%NQks`nPQ((e82zns4B%{O7Yi&qr<@uPrrHneMP#RZ+V#n*2&J+Lw@=E zdFkDKHPuhQIXL|8X#eH+PoKCo{8AYJ_sX!c5p3L?Ol%yc*=3eJCV36MmuLpjQpkAa zv9K6d*|HH}<+?-dm1cZMG+=0S8hVeTEw%%{V`}uY)5C0jt-?6-0dC&gPRmrvB#GZ8 zR^!V33aM0`B&$W-H6{LcVr+DH3Sx#pir-i=e4^3-F z?_x3IwgR{eDKl#SOlbB$Sz&9am_>X>03CTk?)=3tkI4wGM!CWp21=i0MBUdIlp$Hj zQC4d!<_S%5XeYWm4>ER~>FjF6K@30Yte!?xGbxjDGg}QLH-s`Q+X~YSP$lye6H|DE zx(gHDK4taDx=305wD1oTJ8k`txLT2L*BmNh_RPnVN<@#=6Ye$Ao>i6Z>x!9Ng$}e{ z!{S!7I8jF@?|_z1PiM&$tG9viT!nqm(}wCBvnE@wXRM~ol4I{RlJh`d626WqY) z;PTwWH|20O3mtNqBDHbAP3x)8B6U&ZPUH>N#LzB0ByP3t0swSkijNK5koBU>nB=4 zgah)yVq^o_UGuy@f^{5Y#27Sz_ZVm(VRHg$5wM9cOYN2DTP~LQR6fsPh2n6vZbIH^ zQEs~@j1$B0cMoa(ty51ThP1mTimS$tTfiDwGrs|p?V70qc`8`BQgvOH^pp0wpVr?B}a+j_Ey_xCDN_~kiamcxeg7< zA<{3BoK)UFE{lb&VkQom_;upJ{WU8!QQrde)sH)J3k%VslzX5_EC49YF0iTwd;BCdKw1h&Kt|~!Le&U zR=mpzo`m09Yfh&^ZMZIy;x?H#drs(Mv?bRsS7&mpicsLtzblEw3$!9y$RNt0!BIay z<*^aOG`D#bjalw?tCUCLKZljM;cUO!@qvqZHBPxXTQAvyP0dK4s|X+sG_`UAEb$G`KF&29|!f=9A^(DvbY46QMMAHW)}id6prb;M_F;C^Mpmvl1(Ux4NIlxCD6TBGX3733xj}CeaE{ero4DQN1q=i85trm z)j|20Li&=Cv$zSA-t7fPb$48vtk#%DlvMTH9PTUdL=NmnUHfcIyMy-&XdoKF`Nacc zqzu?niCsmMSsWgayGdv7GPIEkX3m@&Mf9H#TRn2e(4190~zi6Fz?+UWPt>M4PD#1+Norv(WjfsQu)7$$t?FeFkb(($y}**HM6-Yb#SRUCGSPA zmU9}!vf`T(xB=SgECk%K_6g5gLt+n0$FKQ#bGz1Zy}2E0O-n=l!D(5?fa~X90tWUv zE+>3Li?_jmj^2)GunpP;Z<2V5!kRgDs+R!EHad%kUR>&rJ)~AeUH9I)b~uxYj2n@1 zhKObfInXKTd>;hbcA-R8!j(P6haL4V?nP%90~7v@x{SQY3Gf9x=f_q}cv(+q_N*(& z6EgLlWe$=pISmOO6wVo5)>8|lc~C*SunO%=(#zxug%=zH)%e34+m6&tJs~~Cx9Efn zZ%UpW)}#hv1M@E2v-yLq6Mw4)q`A^YcNbRJkOnt9C1)o#mPdmrIh8e53Wcem+);A2 zJZ};R9eT_86lWCO6X}2-Y@d{4csBAlPD0N_?Srb&eO{T@vR$*Yn#XsVW)sNC|D@@( z`CRBa%%?lS|1#5Ab!9}R%0jEdV8DiQlLsxF6LNy9pRaRZ0`{<<6*V;ZO>rijqN~qcwC59Kt@bZY+m2B2IKC#XvVw0LqB(VsQ6NWh}`{lZP zSIA6cP$Y{Zv$kcl@nG$dsJK6wh$?x{*RGUy<6tmK<8wHfui|_*SkA}|Ga1n_JsPm` zXOPaw&o3!&INUzpKmoI?Sfs<^hNaj{Ss@JE0EPmui33r7*)YFL69 zu&aqpQz}z^{D61^lhln$#ptMy%0MlthWbLr4b{g4lOmm@CBakeCTX)DNMmXF}zq7qGxfz3}Bj7cc<#kEvpU0($PbLW7 z>1q338-?;YYlKY}66EXhZQA*ISncqFuB)gBwOt9-9rf{-WPdL`C>imlvqf@Fj1*pf zb?7=wzocbII#GE|S7t@`c)J(%`+WaLMu5xt7$8dAIenn0la1@s+foE(;-5@M~?&)@Czy1uK#V(4ZUKmuQ!ht~(#$yAVft zj5Rvq8uKD}WE}v>o)_d^90g8NX3~z!>Y%h|)b$*ab0N13f#XPOL}pIa7e2F4vm<6j zB1mrfrmW69UZ(R!#^dR99~ny(eeWLk>o_H|-fo4o;&oc7onJu>ud|M+sM~1`*y0x> zorW2Pu!W@h@GYUaAgn(E1%E@6Bi!VIvZL-}1k(&=0;odu@my|ebvvyQz~S;QA4G)R z!*nI(ieCHbqO5d{r;(S+>n$Yv?BOBON&LqFE-;8{?4!{s-9wK({Hx@=X4h0FxhmB* z4i2Vv4Tjyk_)e(J4>iSi@(nFr z1}}L#;KsFdTs2Eh?k4M06-rL9*qxw0A?b&23O!K7#L%Fg)8LiV%%pB;QdKAt?b2tj zkP5*8sdX5O-2Nb2pU#$HVW?90qL=Fptoqaqu$|^+1C5`G@xYH&68bq?zwX&n!)HwO zdF7|9RRI}=L1-E1X;SKulU4QH8)y$ju=o+`gMd#PJ)UI4%R+@7p66+1+ip2J7I^rs zhbC&+oS)LUwWxY_2e)_q^|gV~)!rqz-!VJI83rSPmPi1>tz?5CqimLdBrA&K3_ zdL?&IFMh?bfR_u(q3@m)q>9f2CNt%W<-B08Ajli!W71IvUUhjce0wDIIfG%p3`}Y= z!}wVpDWkjy-HRJ416>DC#+EX9ANa>T!_Z})%9!d4d82AkO*V2GDNqNS#JQrS&&$x+j}U@bK~iy3R%ay4MjxdM?3v)dm%(;{U{ zb~(Ytit{2aE|cqu0KR%>-`lhD_$1CF1CFu-51)Z!zR_T?z9_+Tp#AuifgU2=18Q7F&q~Q ziso3UyG{#MTlb@`VnQhL+?h8FOr#F`U}l(T3D#rpp#KKaZWRd10nRF$C1Wi zODP5j9~2i^zEI4N+Yrj7mN3HJ>_ES|9@0Ih@-+f^vYB9D1N2POw;p=1^U}UcXZ5gpg0%VRW!v|>+s-O#zV}4 z3DB?al%slDz({mJaNC0uVtSrn2$arN7sW8rqY9k~NeG&HhvsCKMdM{oO#@bNlxmw{ z*N7PALOMc9qeP5tl#{PpW<0_8Eb$_JhwfFZNM;2UcUG~p?1Zl#m*p0CrHmeA6ppt} zjsr?{In#88W?|VoF?hit73-C$3Z4>>f16pyZ4)*nY-)x{qepwHRA_Q|Q*S8cTy%l^ zBIXPN9*$zcOoOZOh+%k+cPKGmv8DH@Qg@=HbQUDm(lG7dM!Y1I19tY~6im&OpK|<* zkalWoW!4KA0Di|G#jCIB87^S0GTWuK_KO!0M_bh=086F&kbFza#Ck@LF zKW5=ut?@~SO7z)Y)KU8*s5=TTIw&D@uFE0FuL8kP@gr=CrhIZ+k?cmBNxy{o=2V8t zXn~B82ix=@JQmdzb-1Qpv`KCas0DHPt8Ul3yn$83oL{tO+Tx^OrK3*g<2#$>YTfAV z`gIs}C>v{A%ExeJIzx@@5cFCv53&c*2}g)>hqEX@of))vTLCts>xk#?v;4QGGd#?z zRfg+0L!thu75!}mO`1|r>1sZijW-3colg?Wf|f06^#rbB(7H3S$h=4udp#%0n=rA+72z1!Fic%ppn+hN^ z$}A*$rWwwUN`-C~Qa6SUk=UM9Wg2U76$u0z^&MJ(Hye$&R-Wn_gYkM}@s$n5D=fe3 zt-e3n;#<_*#!>GRtGmfynAlcw&@l_qNO*cRU}&VzF^RdQuKlj_cgy-$(D~n@m-ebdd>h*RPd-g$ z3G+8|Q_!#qDktt&x=_$BZ>GhUW+y?LCH2wGu2PqTUl<#wz_D)s`sZH-l+AnAR^6|x zk6BR{^Sg>YtYZINPw-n*6IlH9EvgGX{H`weU0o3FAAWvU7nIBVU0oobk5U&L#KVgf z6b0-0a`y@1MSg??;C}ys*QBT*UK)&Kj%G zSO4*5|L7ok^7QBlWPg416v~G$uU_vTMc*I%W&gXw7t!I9*Z9{es@4&l>p{;9w9ceo zyM)f7>+kSWtH60y%ybs~K{;q+bhK;sd-Bw7_u96<_BF`i9m--AM?d;6K zRmVQirD@J9c+`_6fG@EP^iqW<_QxAT?;*cn2LF%NsQxj+==NqIXj)EHIn7SBP^?rrZ3vw+UiByJ6oY#vf5~*qla52J1k_*{cx-IrJI%0 z@QSC5J6lqmUbK{TXRG(X&FMG2(r9!2J{`9?560}`Z1|0H;y22SUnqZ@v|U?U_@IaX zK~ZfBNo&)o(|XLc2l86|+Kk>)1D!|LyH0aA-7elKb$#85vHQbdNp)ae(;>|%|D7=jRKs+ps!%zD!dz63op_uFLIY&J>{VyT18suSc6%D5>)a?E26%IHj%D|1 z)Tabx;IeZc9K5bv=l;Sv8F-Bh%T_M(#4iOcfR9T}4w%|D2zN4KrAZEJeLK*WUUUSk z)B9fZ*Cfvl^XFNfcqS+(!LcUJhR`Q*4DL}U0t*F2AUk!Slhh4D#SpoY#F>tZgGCYs z2u_oM-2VkEq1PB7cN_-KMN%XArLp(aDaHByR{L}~OJp{ix>MhiszqJ3n#?k?+pu~g z?(GEzxtzX4fi0AI{4A#PXDWEF{SZXXkF%`T|~uXG?N531MqROjwV7n}@Saep{T z;@tCn7kjqgE44UOeQP)%>nRGmKJe=%?+5(c;MxN}D_?!6#Ld?q)@apvLvS)0Z-s@l zqUCFq!C_Nbm3F3Pk@l@X3hFTJpC=1CH@j>NA1Z;-LS|~2Rhx%O0@!xb>|GLSCO6e8 z5LRn#dGNlXIBgJ$Bhyu}{?sZB=s>+q>5-ESf(#M7kn7M=a}a@kH&Jy`)S0LTm(4Wg zfI)jvtEa9mj{Um}$$8QZ)V1Q_fM z6^}-=oR%|Y07l3h7RDolJUYmnUtqlu!g!e!>f$SO)ZD9s^(k|r7Wk3bbJkh4$Y8=0 z6Qgc2MgL1!#(G7m8ckbDj&!}q6tpG;f!hw~q?;;y_;*PXW%U8@{1s`4_GlB&_@R9&g|B0J8Z{SgPB z%DdPA=-|Yy(_F0dDvPPESYlKK>j|B~P3?8c3&blE&l-EE6(DB#5?{&h7LGd?;i0&P z^0+d;%2b6K&uWmBzz(UX>fq<}ItXD{Bb$eHIV_h|0~VHbH=IL1DW~@E2D!1;vw-ko zVx_<&E)*E1{oK0mzj44U69(eM(G`WD?{800Q@{NDSYA!1KnT{UPCd0sq{P+>8%aYQ zrY#*sJmLCvc^{H@*{4K=GS}7LQKYN`1CxxO~eSAV=^a-dn}(eE^pV%PpD;dz16tY%NLpUB2xAbW?Lr+H z-uAyiUnQ|ZN~sz$(2B@LiUp}RMKWGa7_63|ETaYRZ-~Z_6ZYkD2m?oJBn1X4Wuqgz zFp7s3y}Vvrz>gwZ=0h|-8YNv%Qj<6a+}%}z805(qqn7NVDNIuYg8-jwqBJEcN)tC5 zM+M4VPSLV7fM#YS5AKB3q#FKyj!dk0k*5^diGsBS!ZheSuvP3Boa6ON>2 zmd!Q|{X#Op=4Y^iBz%Nb3;}Z#7uj+$Qa~oM^w{PRf%;hYJed$wF$sVRS*h?2c?Ba2 za~}tcTqU(tf>&A1D3ZiIh7^(wYz1o5GRHB*d`!(Y^+g~%TFMfLXHilz``?f|XpIkZ zmF1T-_X(=5;{4j3FFNEx_d=$3VF(r;6x>wMd)#VvhBCs?JW2AwC|SVXAJ{U3qP?a# zrw%wnRdN#!q*Rs#;a)oE2UXI`@@ya^$Zd)uigt_aj2wbsAu$^E4;07z)f7yuCwGEriQL?7#qu|=D2CLb*Wpq z<%rDvv%QR4HXUa>)##XBoUC6SruEAtl3I8gEtgqbU#;K70eI)Hr{T2jMn6(vh)2|C zd(qYnba;gDM{(U?h6UKR!0~OBWoGH3X=n|SmtKF*;7n~=eYv~*;@PSzFs37$I3e+3 z&}&jUQ|W84V2Gu5yZzQIu>E~zBCu5FDIU7zH~bELC~z1RE|`A(SZ5{OC~z^8>u^dm z*w#OgLm~ZB#~!^ll+{ME0pqeb9OH|w=dO=k@_2W4?q5_IfFDz_y{K(^XIajgw@&}t zvM2u=>>QFI9F7Jz()P!0BwCfXxQ)KeCX?(6n2_sw8vZQHF5`M^mj>~j#C9;OJJkfT@3{=ghL?{0o&!SV7xxd20%hvPV^|6 zb|Fp*y1Cs&2K_Ed6UqgSC5qvYf=V*?jiuLto}e?0>4QZ>ve_PG>JoS8M7wE6ZL$Ec!9aDDDq^O0kT<%g5Mvolk}>SF{+x+j9YQ%3Xt}Ns zS_zeFd{^ih7LSii1*-y@+#bruJr%us)%(u9fc*<}42wbAQlBP^ zQO&{_pMda|j8-GKX9MBLWsv2aP zr!#w@E;79$pcQq)tOl6EIY$_RNb@7^`08Cmr?ow@jA&MKTL0(c&0=vqNuqago}x#W za1S&{Gfv-IszX>F14xaAeuj{=HprWIel0tDFwCY?*jp(I{n&A%GeE1Za{fOw z=C3)Sf@<&@gEg5Q?arpO6&SzT35&SqspcCLgzPz1ItcwFjwP0hnIx6r682xMVN<8p z>z)pO9J&aRTAU_|ZJbw)GD_=3vQ4{{6^e}*EYxSo?Bgo^fw(oZ;k#nH$~C-)@=*dB zJm3Gz;OUFk4Gnt#vCVlY+cIQ_XlmP9u?}%ZQQ2&gWHRcTDkMyE*4ai)4yC<0OS~zQ0ireA@rTKDsqyo!qQPub(St0dX1Q~!<-iujlY8bvMb~$=+53L zWMKi?8wz#LQ5-viDD4~2{E>p49~?u)ovmJ==iO)*pSsrkaPsPUZ#dR?mSy8H$Xdup z=NJi~1CrDO7 zP=1a_BgT_uRfdm!WH|ZLQz&{ipn5^b*fe*fY#XBdJ1lOP^udLjADX&iZb)hJl2-_2 z#I^$UT*ewu$#H^s4BTa$lMzd5g$Q9Q7C}5Jpuk73_aA=^1sZ;}7hPvdk-M&=D-6Yl zK|Jt6I_R$;3K5){~xj(rqMnC?@ z-!6araeHTHrxjEyPub14O5L)BiWDjobt(@nwepwrhO5DM+xE+Cc?(tJyPf+XZSzf) zAJ*w)lw|DcA~8Li&ZCu$s$o+Nbg8btj}*jjsmUjye8(-b8(PS7)3;zkTDp{`92?Xv z4OTp*vqwO&43<~5f6$VUrVz&p0UeV#GNNc8*gXV_*8htr5bCeb_k|(3dVF|BMm&4VqtvSDKO^#K&sFN#I z==+l*>-jCGLO4J2yHWOzRG%@$U9up*?0l}`opteL<$EJO*gsao2it$~O)ok;0(SZE zb%f!E=A9>SSWjROM1<-^El31uFiERl%z@eNbRF}YMSRKRo3G+B^pd1!ms~_a1k(uB zmQ*iR2mk0`9Urik4_HrE!EF1K7cIt;7y+g7X~aerlAMaNTLoi%9S!s4C{elWV``Ja zZY}5YEGLBqWWGoWIAG7&Z(n(_aalZ&nC}AGk2LbK|_pRBON$CE5xI9ihu#u`-l4-{5Akh%No zDd0C?N6;$6VI$gDR#MPwuJz81sR=KK`HqMlB*Ddbw=B2Hn+@p$!Nue)5L!~R;8ZQAl z>0y~M#s?QrrJ=(_l`1-2L{jCqiV6H(NA;;!dKTre5Egp5vY*i>XeChXfy(#~{(_cT z{Ka=fbnrKB6-NqF(?Ky%#uz@s>?TE$HXwfm)SPPuo1Q<_k98h$xfnPDWIAqj(;jy# zPYGduU=N#H99qTFWZDOqx{Gk4t#t4jixF_ewpU{P5mUy?y+C$hmQ4O+pN6oAfXzbi zjPCjkt_qJ^7FVqKSOEs0r0fBf<*9M#f--TC@t^PO<>X@IoB;SnT?g0ds8yib#0ngm zJTXCr{dLz=N42I#7aIyZ$a4YbaPxFi1=Ppg>h{5G-Zk^G^$HzMP3+t{^=d zL7QtV3)@lLGFk5{&-1|SmBvB8a3Drp+>2la1|YE{_{vltKTh6wt%Rpuv2<6!Ovlgd z;HFba*e4LbO8T{#3$o(SZpZT z%0O`}G|#$_TjPayBYlD_AB~kxt3(eDp{c*i(h;=)mkd`T*7%v|IGzzf#j8eg1eAbgZCA3@H9cTY1$bMtucY2D6=(4MZ06JCJ6!7#^){0+3 zBfYytVrNmhFe!HFUsR;ibP|&Rp1N$)%lEWKxA@;*jnk6~_Daf|U&ki7B$M92SHeuo zngWk4;&`}xEY0lsmt!}?fjABmg%gJ;3|=fJ6EcUg6^f{K7cF+2Xkv zrR-Tdzq2xqMU4TkY?|F@e};rQROzZ`gMzW}EF8-Ee53OSApME=I<@LQY3uH(M*b>? zjMmNB4Xr+cD)g)$iL|%w;Uohzcqao^8bl{G5I;AAkUZA82Ub8(BW3zpX%M1EEo|W8 zG~y(zuoA13U}Yy}X>b{9C~S3;yjI+4&Tg`r)U^uG6%K#KM%eT3Th;3g66@w@tq4_( z;ADykk%RyherX%&h4t-h>Nvx@sIQ}KQs>dnG$U z?{03FI?J32CqxDXSq9ApkR5~OAzodk^Viu5Yy=TD5)V){KPNr{4NTDV4RH_HABZUF z5@dl1o#IoAPPqrUeTdg`9E&(VPZq9+X@03}PZR+cL0XszYN1q%g{8CMWI1BfK-eFr zr$|{&Ps#fwPyssVpcu-ggG%lpF^3E0Zjw)RDKm#d6J~}it#&pA8CyysP+&*gAtD3v zPT#bcZcC`aAr;k`Rbx*|f<-gHQ|8Gm19c)~G}vn@=}>jYf_yTZYx=NH=O zF&bk_v`?AXew8|@n~7IrN{9@#Q`%?4i)qUe@|P3i5}LLpk^Ry@skNk+! z!rqPkH!z($z_Hx%iPQ#Snj~l(21nzE=$oV%0{tMJK>g=K6n%rXT8DGbXJZpT_cry% z`r7!h)4DAMjti=M0?ot)1z(@eNGpI^890!xi$yYxhIw3Egj%XTpL^Z^>H!v-6|mjY zA&$g6nILouhNMPgcr2wYj*>MZa?q}{o*Tl`#gmm!wFw;;|jC|yh8sr z;JFELVv(VzHo1}GL={${55DmEUh4#?2_5=)4e-MXTzw0cS)12)Hc1;f5;HO^}HR}ZM!LQCL#tC5(rFbd^^%J##n zQU_Kjw4x(lJqYwewbts#7hhpNhndS|MY%0SE*6K1+{)Z5>uo(;XD&F}Q(s`MNz+~7 z+Sv1GAlX%e$O~6&5^Bpm6V=iz>ZZ!g`3{p&8dsLG<<+A-JP$3G4? zMPpS)KC0Bn1Zs2Ryp@fs)rZ{;gMA2%e?uP(Tr2EcVJ$5Yt(2qERFI~j%J-CBsyP6H zKz+ZeYHE1^f@M{@cUD&&7_wkft1bSxLH6DjMBzFGq1D>em4x`&Ku}m(LOne}ICf~y z#z=S-gL@A_e4Xlpy0Hz-wWB~S9uDLJQC7}*V;6MXj%TFv@{};PD-;=MWy^)RcyemS z?cfx8Lr(%rjyYSVlM#wjq6gzJVLAaXMIJUo#IQ|FEwv-KBHFu-(>JDM9jC7^Rb>Pa zO6_wrpr4+`O6|Ui5peU;v)XtM9jq3%BEu*`O)?9jF29QNRXmR+B^-;8Qyi5tAN7$H zaY`*XA>eS5V2gC)s}W1Rj~+n*AEGn( zH{{nO*=zSLn4ko=2s#u)f9x_kP9a^l6l7eJvug@ZfCF$ws?cGCd!4PDKtRQzjVCbe zXh!lbDf&_LRPdl!1Bog=(q1T!YN&3K4$}p+jBGJ!P9)MF?1&_1RQmFKR&~CkdoLUF zNj8I7S;(X zdplh_wq;nfX}EWs6c_1uF(9N(K_jxdC~uuky5{GwJjr)%Ae(xS!D^|q_GV? z8`+HGuMfymiXkhcABrwIxryf6t=TILXDNNjbz$8~Z|33A;H1!EvWrKmIRePL0M+V3 z_TfOgCSr~|lHIZC*a$cUST^@Ne%M=U3E-O6l#{01qaLzM2p`5Q4xnab<1ihyLOk2f z#nobzXLNaXmJDNTG8{qey*3&q6Z=9DyfcjLl-rik)G^dR;gD3XA4AAH5*>LWf3dkl?Ac)}mM~_stf`1}u}w zC2wZApR>))fk!|udHut_k|DTGpvSWUZQJCbzLa)q;UdRuwNhSyc8!5G)Uw(Td~LTX zl)!JKm&P@^S)4T=Ia^z0h_e)g{d`KEX0zp#3~o9(-hYB5*jb!)1(|0r1Z{?zwtU)W z+}W8KuCU_AP+k=05iPAoon}7?>r9;DcGfyl6y>m}#8r$@e#mA<$)+*OH$4_K2+&Y) zoUd7xQh&ObuT{s41SWDZsRrngp~Bl_2q}cpnrBP)5fFka*q+Ve;EDwhA>5D<>6{o@+e!tYXQC7z+e4BvvPA2&{$Q zJQ*hn%XbQ-fkf2TXckR2VH1RSiDA#$MP?v%%tn(W(qjj+k<1YecQ^V$A_ibv;dszV z1Y=j6NTE4Hi*#@3=Zh=C!t3|@J)t&aNNsA$#$!Zgnc>LH;5=GH9XRZPbLOxbINV}D zL!dorVAu%bk!>ATy?R~kZ~$SpJ6PK zc?P=@wH6F0%m8?Zfk#s==>5}V3M&S;OApoJjui#0)_3HXN|;eV;L>baDF2tt7vJBQV z`grmE0#Hh}roy3L7WN*wQg4-l#8b(i(jsBUB&g-oXkw@L4NBJZ*VY@PE6s5a1(#lG}+iaHPx!CC#73j^$4Bkc(v zjZXVRBnVe+O|P8hRIV>PjP%}bXa#=ismO}QUy0Zll~@Vskr{$=kZBsU8eF;X^@nRL z7raF%#fZP(! zI#Rca4%ihp#(IOcn!6FZ*qgfE6bijBXGAHKf?-K&Ym_N^Gx<=@vM~6<77M0g_2~Ol zb@d^(3w13>k9W7XwzgJrUUV9U)tHvSh@#Fate|7pP%=Xp3^cA3`u**aMXN5?%qJaq zE9~hNdhe+Ty`waU{EhTajE%abcaI+Jm8F2-MOXuP-2g^xFufUk9StE~n4@xZy-SJJ zvfk`Q!k>}wT3i88vTfZb!0OPp)o_CZ}f4~)~Vt> zj_6&e1U;XqJPM9Sy3=S5Q4kWWmwNX>Oen(4aEujwI zsK@(`u#LI9)nl%!)|A5d*?o|Ep=G>&c0a@?+Rhz zq$#_&K9LErE+5tUbA*ndgA^9@O3Lw#64&yNa&Z<+u~2~Z1I|SIm+w4cb<3JFb>v!6 zF*eD4lwb`~8%@-Y)KPFy)I8bbTT>4AL2Fu89Y$WV85oS8sz$FY4>g4pP+6hZ>gzg! z9VMw4J2#ORqTPjT;e*UENn3$)40qeT83~kJ!#%1+BDuo$Qm)L0NKou*5;SfhqEDxd zW1a^m30h?6w?1Plv4}Al#v}G~-t!y;oK76KS~MjcQ~Dq-cuw$m>v)sa?V>&{8^seg z?V+zyvSAg=t_Kz#3-PMbxGFGe8NFjkwnF$GNvV%vMyy=v5S9`wj1YDF>fl6tp@lKJ z#-fkrOx96t@iqpFkuL+w0D<-<)-ld3ps~}_xWIZbDo%dBB-1#e=@_05nv6Sw&o$F{ zDn+;^yZtY(7Z({v&#~?5ViWw;Ss&FWw+dMk1bKyHEDTB@@oG5p2TW%~$>nUQUomnS zMzox!=zWjv?NDSG|8T@?UU2vEEQ)~`_975)TV31wgO18EA%MpC-x(d%TU+)??X`oK zPGxIusX51fdsYnz?=iQ$P+WK9HN)suhtXhxJ}!6-NeZsUAfaL=D;nqG3Agi6&0pq{GEpv?9i6(|Q7^T_8) zfZB{3;#6bJnQ1%`x1KP{yq;;VF-d17s8oZnX82CT!{s8|WK&2EBWkfxaw%yQWZH2=+-u?Qt={ zyt)A)5EdUs8@>fVw0n_(&^F5uf5}Ru(~Z`mC8ORLrQ524UIZ$!(MM!|*x9VNyq)aI zte3L$RP(GidW)$l^*c_hfBr1(-t~uuy1DC*qw0$(7#{L4nRfhQ{QRcuBu|v6Kx?d! z6vWHw?Ap<>uBuim@f^5_eifdBw&V|^?O1Dg09M~<-t%y4O8y9Tz6#I8}Zj4P}&vcN*<(Zxj`;U^#d3ABER$6~n3qp&d9xQgf8es6;bzTyTaIzcZ3UjER1obT> z#RO8XCA+LpvcYjx%w@BPLqr)BXiD@@rxUZ{yemqu@BuEo$d);&99t}T4|^lC?yKXO zU$JPv4ezgzFYmN_sF}YSNjzGWj+rQx+GX~*YL}%WV{*jJW(9&B#a0waqh+qHxyTp+ z-u$>M7WM@V7j+e1M==z~Hmht|twtDy9{#}UFj5bP5fIp!Gs-tOq$8Zn?pVnBVr zcbfbC$_AzFi1Q(o2&Idpr}W({@1codU=A@-G>*ip*ZW7WVNFbucVxMbr5?Qa291wX z0>Z;5W}eCCWq_Ex4#wVW2W zoHkhpls0?lIV}lmu=UCjm{G0`*N_XrP)UMKXSmUF&0uw=Sf2fpJF~fdXSmURXKr>s zLMN3Ku31r-Myn#{j^++#C5KX1$uSn`hmB!Par|2!Y2PHnjGgt#m^wLIo}X(o2IXfY z$Cri-a*%H6`h7A94X?FxTFo3 z!Vvnw*S+WwcMC?64Abz5Tz5!-!LPe51@aPZA-QHH3)Dt1z;1N|A3cJyoPh0oxC<7! zuvY|0b1nR~j^k3QmzdI;C@baTUBCMG@{AhAU4k(A)9hU`7%kc7Okt7mfP{BJo0VQb zzYzqegZ!L&B-y(5nRqoS=(yGDt&$oo+y-BP1Lb(P48`Pf^kWefAX~sc_-`~B<9|Pn zTh;2FufNs{r=st)hN52Pjr^`g$PBq3$RWF&w1FQk>fkQ~VV&%apo`OzZ<))a0* z1S0|mM0+&;@p4jF7}m$?k+~|tzhgWTU`(ci7=g??V~e8v)VVv4_w#dmE^&8#%U3?* zvI!R~?g^}K^!1>O$D8+e9o!NWY^2QS>*&5`HEYV2>{}-l7Lk24h*arK_16Um`=cb! z`xtgEapk3!HGMz-B2$HSayZ02`qq7GY~57pJ%VHCK);GEch3xJO)zJ+j~weEGz8ug zkjd=+z2}}%>PgE?{LjBcoy6Fb{9Ms$NYZsBFxS?;sR~+0)q?`Bt>S&d&Y#R|l@^Mm z{RxhZ4K`YvrG$t^CQ!g(6?6>1d8R@V*_f7zfF%(!Qim1mM7~?}2AEKst^s>+??unx z$1D8qBsED?dW1gY)CaRsIW4?~lmZK`%H~`Ba_M$5lZ$KMJboP}38cR>NQz+$g1}4O z3q+g;X9aA73mEs-+vAhXyZt}h``f>Dy8nn;DnQjv;F5vHdlFC2MzPwPyU_x+)$#Vp zovyCv`{X^MK0#ea$$9d=19iOJ`nTive>pkc+Wacs9Pe*_dvdR}Y6Zg!3?&YW1^4fS zwQo@5*83K0pzY6L*_f&ihl_I6Q0o^rtnYYx7f9xpTn8KfN%@@D8QTw$KLX~7YS@Q} z0I^EVe-H9IXZK?yQ?om8DN70KfIP7Yz%c9mMfyi5LA$OiUCRfmf;6QUDpD`X; zr*$kc72of-{w6~ra=t8{S#l2KU#FBCcoW3ewD5ydd#Egwv~)=rZ>B5EU6Er6oq}x2 zh>?T8OtW%0OTJGgbG~#<;sT>ZO280h){mKaTa$0|Op8glxEaS$8$hC}B6^(Vd3FUy z==E$7zh{M7jw@u2R+PslXgO&Yt`04fTFCFpR&Q|ITez4{S{R7}dHgMkWA^zMUw+jp zr;Im$GAZM;A(VW6k;3^oon`aC=fz_A?&|&ZPvM+@7+~J|oPQX!%pI)*wyJ!Dfh10{ zg25Z0zeP_2C}>X5vWH6xb;}$R41b zrkkb=U5$D%i)8;;Eg;AH7>%PT#tOPO5;2Q93MKUP^zEj=c}B?C!tWCd8(J##B6(k3 zFf5F>@7ubZ4wUkKXB)va3E_bu5+KoMxOj9aT}rt1eq%%DRB?k)7$QcMRxY+1)kp>L z@*oGCr4wM805b|@E=ixG`7njLTc zgeap@W3m|bO|!4DKW7vrmR)Xid7L##v*opwn~U4u{3~py!5;{`)D)=r%7I>qws*Qv z?)h#sx4A;^Qe<9bT0$yQWpsyBf5@>+2wa&rAfAt4r@Xx4kq!)rEfXjU)IjobP=Gx+PPjP? zPA^9#)r~;A5vMG&Kw(n>($F$C3gE=9qsHyaU6a7ZL}3fTcc<@cG8%zq4=Sj_kgudQ$!!iXEjcj zqx)9f%IS54LE=Vm{&Ps{i!Ap%hTTS%6dFyfTcnFg(zUNOs)t-#?bNh*mR+gi_==nd z2r7D+qh|;qFwGE2eFQsXlH~*~R4k`cNJfgD6n_#KzRvQ?ihh<=6HSwOyafy7i(Yj9 z0se&_I}abCi6#8I4?jM)?jajS{J8!6zfeE%=cg~e`{wXDe*O0F2>O@nHF)i5E2CGfkaf>%G zGvVnZ&tkk~ju8c(c^1lBs6mV>C`J1vaQIIj4e(b;6+1T(YzktnwatnF6k z-*%7x)_Oa8o4Tde}>(a%peH?8{g_*D-$`gP?h54wN92Gv3BDXJgFy1*ZN2Q{Pe1HOQv{b~pZ7Y&uT%yv2dUpkUzhB3OVfV zJ`18iu)N*v@9jG$)Eg1YT&YY9QR$?A9?z8v5FYw>;CNt0bic5eY)GPC4C2DQ_Lwav zlW*`|N~gsq1G=hGX<%#qhrOI&I{eLwM8!)}A~SdX?j~?w${Nyd-6cu7%vYkGG)hi- zd_ej~rOgzrq)Kb6EaeraH=4;ibQ|OjSm1)_{{v7<0|XQR000O8Rb)<8$u=N#%?bbj zKO+DDDgXcgb7gdOaCC2PY;!MPc4cm4Z*nhid2nHJb7^j8FJ*XRWpH$9Z*FrgaCz-n zZI9c=5&o`Uv853lX-n*>Y28@14z&$8NRc{5>>wY`7ivYWB<9E^vAevp;QGIJW|mwo zCF*=m3$z7#A9Uot%*@WqGc(HvOngX1ZSqR$xZY1Dd0AJ=FeSPtz1Q8N+1I(;P9_^w zl`L*dUa)p1t%@ltaw+Vutfnl1v4YoHB-$w0mY6D0TyBN#_RBo2GSQK!_cd1<7j_d| zv$}33lSx`|t=X$i(4Q-n{bbjKups`Pn_SMP%soH%o?qDKZOCU$!xq}MJ;Zec}7zEVI|i8!swIxj>RgqHz( z#74M3V!_qN`E>sHQ}mBGh@2YUfR@Ayu7#7Jm!&;Y5Cm&j(3_UotsCIZi-NU^W~z}U zFTHgdc20=I1NKHJSYL9P3TD70a=T!+0xT^-7fosyXAg_YJY>~|nVryJdR?(=A!>Nd zbxXx9N7kC@68UqPu?^RTEL>@wuM0uzGqGVwlFQsANk}93r$w=uy0;qWEg1atLq(M? zSS}5y_Pif0HArk-HvWN*$BRqYcLmE{SKz8{r6@$X?1x${cC2F{4_n~Z4d)xA&T>tJ z`sHp5&MryR<2f9KNzio9U!Nudzb9!77}yE)4wc}E1S!NDedPvmdbp3PEjoON6sLIB zDKd_%GyFvx2&J?XW>;m-P~t;f@Lcwe9>UWUrfRcW&L4YP47{`coro|~F~hGR#--<_ z=ob(MQWx9^bSm~{5342GRwytZ&Zc6`(`y{6zy*t38%NuEVvi&!q7vX=;Dj*40jGGQ zMMkT7wm@htnBqB1#S=#j0*%9wh0=?DaEANrZ@b&>V_Aa$;X*5v0tRJekTkbJ>%w#j z(lg!EhNapJFUf=n$n%1L5tHqebi%02jqa$|9pZ z=Tlb6V($^B{X8#FeYva~(=y_tR#rct0h&PvchK0`{~ z78C;ilYjYvp^?S!0jP#YY_-%!YbV2*_KzBmx_g`4a;a;P_QtjuFs+nJe*;M-KGIlw zj$)0ST4Iilx56lqHVREv!jvAU?pmjoahA5)GLFk(k%DkQr`> zQKiwT1py1#Lq_W$g*K%G7o10!(|!pCVz~_;KP}kDPeDvM$Ao~}Bv%wC30fgZrl|NR z8d1#!J0D7#LXv^7g(J6mN9E*FLPo=o)+ASwI50utkf;nK;U$rb4iHyJLQ-F)WJU0m ze9AT(bP)j|CKLcy*s{Nz5v|45fgY{>OQ5*fT%KP|jwcg@WSm!Jyh#9zc|rCK1Dpt^ z0&cKPUH&pS`b1#TOE`~=SJ zx$eou0|~(Y$|`FL@@#*!^L8uRNn+zNkDOZ+XkF`403vAAV<0&a?+X=V_25)+-&2m+ z>9`o`{-`NfdY*d9vj$#F9(=1%P=)^c%nEdIFW0@tx!s|Cu44zYU^QE^`B>zlT`XRV z@?0yyuO~ioLVjbxdl|&PR=Esepexp>)<3A#5==N=rIr>NnjvwbMswxXhB}r#D_zm1 zAzgt(?O6%}Q5pqbB3GgEWl-h}vmJ*M?w|yjF@96!nPxkFgZsOBA4qQ{hhtHXv4I8+ z6LML>65XunP(qK2+bRRj6oPNr3Kkxyh=u=9$I|~n5!@-ORu%Y#**i^PS_>^I%`UKH z7*~-kFsO#0+5$^YNFVGLjwlZ5%PNJmtgyDcLwd*8%I&KBI|Y?hFDe-Av!c#t*cWD2 zrNO9HjKmk16E@PQ9&WnoQ#*w0*l@l zkJ$X`F7<~_|6i$qePy4cSPAIZp)^#%`}dd%;kTFVSSH_|M_vb+4+YHtzg#YT-IG4O0SlXLCGp^!k?&h$I5n@p&^ zOdRBPJ!X5$N4HDeB@uhr&Az3{WpMGkXTjac;gxkbeGttQ?vx90+_t!uqit@HO`qWi zAX*aw>i`joMCs9L!#FEa$ObUFyTv&_euUy=_YG9&^tQ0#9(`W;|51btd^X) zhLbJQEqx1O6F9g-^GFX}&!Zo-70!{rhuxyfg~#z~Xs)Rvb?GgFo@_uaI&_?FQ;b@v zL(hNOTd&q{+-29D{@~qt{kPw4{r~dlKXiHIfd_{YTPzmC4gyt*H@vd(sf~=Y4d@C!kZi?jxdJwrsF4LmPoc%G~2o3h;_IlOW|qw z{8Vy8rt`!SZv=Ous38{6(f3uuAg0+$3qy_N3P?E)+x!OdNCsr`P0rUv7csyMHY#7L znEim=*Das`3cR-*8~euEaBmOU_id27p-;TsxU3F{4AZl!+(B1>c;|eXO!SD9=UL23JTD6|ITD7(Wy;p22 zOph~dAp7WQ8$_SSlnj8fL9gj!b=S|FuGt|fb?8nIg4Rku@OJpPE{ zC6?At5yQSiOd}v#9+oh}FN6J8!IKxdoh*G|o1Fp##1^Fgu+Xc4WtGtK%rILD9~Li@ zme>(&9YGNx7r|EC`EwXx_S*^-Lj|J+U)P&*43gdPCB$Y zLMn$ct)xA&oF5{~yyx1nnope02X^`^H@x@)WBmjUHzPYypo>x40a$_8VxE+yH6z_? zOIt`x5lpmq|W$AVL#drF*o8{D6$}2@BCCh z9*gV!P-{Kf@FLGZ`YF#?ubl5X$JwBxpcLcQ{%!!{A%L1w9h7CGtIZ@!^MffBs#Ivxj@`d+X7)u_sM6 zK#6ho(d3^{O9KQH00008099m8RT_;4Dg-P50NI!T04D$d0CQz@b#QcVZ)|ffUv_0~ zWN&gWaCvZHa&u{JXD?`FY;a|Ab1ras?S1`s+c=Wo@A@k+%0()wwYaGl*-++nTBowog{9Qr>h&_suY0|DSuDg*sM0u|rO9<1tKw-< zO8sa@m96SDGu0USN9y<;EY5w#71;Af(bs0$e49IzINC6YiQiDFJ9l2rwWRANum zH`3H86?NvxDyu65(;xJQ;&iRc22`B@N$$E5Nj|dxDltuRf^w651}4a%?6b^aEaL74 zDpbp4DhJdC2ulD4VzL6px=E?6m`G|~e3oUI&Snxy)?%3ez5wIuN=?W3yj;nvE9ihQ zn!;G>ay6}sawuNS34*DM)hbcR8V7WB#VvUxi=>|3AmF;Vl|YW981LB74{CrN)G`jZL%olg6gTcO^_FZpUwMFW01?vJ3E z%LC2+PEJOrr=u4yMlWBE&dzMFe!1!uRt)`5=Rl?uSSZP-GQ{;Uzzq^e)DMb|emL87;pAR*m@ABwNX|vMkCl zz-o&XFziH%YoI`lQtk%C#nT`%O|jD6SR9yslP_EQb)Jz#!um&J66^P&12wzQ8Hl13 z@^33pRj}Xykc%C(G1&RM9xKkGf4hR|2VaPfE&$8`TVEQ2c4~xg0Rjs@tR=ESsS zlI4+j!R28GB;Y_<$2stH$gIr+M0RO`>1f_=-6K^#Emk>JOv*A@yPDivY|M?IRAPSE z)T%8l-qNqo_UtiDAE#^8D7rMQ5~k;<=Gcl+%~0?!(Fy{Bq3j3AjLXy&x2Q$0p#jaL z`2&K3tK5N_ku1_>GD8ic8`Lt(pu6G@*e74xrds>Y3uL6B!c3_sz+Y)7p2mtm)5Pd8 z85L%<7TFO5N8>=WP&zZ+q_gx?Dm}H7({!H7*+8VVsBVf?Hp3ML1X`n%N3a%sf&z=K z7R$1jt)@uH+zkCQuGY;O%;&c)3ao!9l8Knkgq-&yVRRU4uUY@nf_%cp2#kXOl!MMG zA-r&~*Xd`Z445}*o|Nl>1E+uRv=2{a=`^XyV8B5ha#OY&l-Wbrn}!T1CR->0+K&Z| ztN-+%&#RUPmQ0c5!z@`$W{Idrh+0@*JiQ!0~8E-GpnBqUQ&2V5WOXLuSG@Pv#ORzlLnWN{GQ*hBo zI5^4rKY?^iJ>UeMqtOE^Bl;t-8UfS3Z@RHSXKK?o(7>8VY|-MFwTAt%DDM&=skY9v z>WPU%{1pNWl))l)48Xj|vtkO$-NLlbkjSu#Oo7wy5m*&u#fcq}lg*X0fpxZ6)?n2+ zL!E-aD4B_2Rn>NbbSvdjpcF^uooQBfl|FPovNnPy2Z)-6@na}P%td_l5b+RoY5ErV zm7VI&jn(-9(d4z%W|6Lt%o?QMG$&yDgY6T~R>-r`|IMS$_C zoF=PElG5#&9@wJNLsYm77%WJZLcw;FvvL=xzL3QH<0*CXYR+0+?G|RTg82dy1$w52 zqbctBMpq3YkXbVnFAK2)&33RlZ|0ZD^tME+g)JIhRCzMV&@^&I8_d}ziM3qE#24^4 z=Bbrshr9wYQ2SdMC;|2lfp5p-=B`Wkd359pvi7RC;z~L2gtGLiR+SoSz%aC{FRX`2 z#T$Ib*l2WrlF!1|iiv8#6&P96HR)mmW81aSQV_IYH9Lte8Pi2YmM||#z??Va%hHu1 zIMEF;;>jVX-YreA>i-ud4-_Rttp7GSGFiLZB_%_6Ik$v}?L?_IM~FP9itf$}jd+O$ zeS-T%8pJ>wq`CGx1G}Q2sR{xW@Fq!@voOI2ET&vRV?BorVe>FSLu=+x`6FC~&Wj7m z4}XI&B8r_e3vQAJjyW@@9YD;J4OD@J%lz8`S}}Mf?*Z@DPv>5fKa5=jI|L*7fM|K1 zeVIyf8-%S|#L9$T05%9LMVP0r-v_XKR{89!_3=4f4O}$Z649ZF7C@d9+d!mlG4_uj z4Z#+Ti#d}H>Q?#~Mmc0&q0|Q!#bcRE^1`Y!n`u(X43GrigZyN#aMStoU9v)-?@$%@5QEI>l>ri<)}qo6=RFLZ}X~#?X@H z@9HWtpbYykzT`(LV1+NzUlZPSI39v)nL`J)bjU=kb0vz&CqVwWd+tLDL$^=>y2;Cp zVfQk3#->lXfH+rIh7rg51Pgb%noLuq01~Q&7D=v(O$H^nq6S46pe2Z1Gei-Y!-P*Q zqbfYE_NscFIR{&0ipU0?W{va4tutZ92>l}a)7-pQQ=<;d5;kmL@Bnu2-PyZ;W}R54 zlN4s(c+!xqiT)F8wkSSplV`rFR|E<)H|WaEF2cn!E^r->wa^NV;QKM25gd;}V>mvN z&xzSkD>sjI46GItS$3N}z^iz0f~~))ieCRonN~%vZ5^t;>masEMGZ$yqa8@;qy+7t z-94uO=-^O@lauk`GjVz}J~@H!#|MXj*1zn}aY=D;(LY7c%ozV19QHvl~-OO|YPWC&B0>glwc!p}`E3$`KxW?;YRkCxSreBdAnSYu_XY{=)uAlqVqll_&#fD^wSB zs!iT@#a{y|349P@dQ+t2+_p!=WlNAU=wRTrh2ewpk)LHYKD1Aq;~%Y39is8!)mSM1 zPXg*;B$DB33H%n)u5qG&IF?;?TQ%F5YC}MytSdA}Lj%b1E|N*b3Y1Py0niJDnC1vP z@-jcjai(i1o!RA?+AtIv!hNW_C~rq~Gm08Dwsh8uNs)o^@){f5YP^*467vwJ8i6IT`;sM)d_=4VyxGBen-acIrOj2J749nS4n4O zrCBVr`KfM-5>E{P(@KF3Q7aTVSY&MfH~K)(i0UUid{AK@7={E!vecx)naC=L4HE8mz`B7V1eAWo)Bx&Dhr_( zh4TM-XR6u|SYDQOm}mH+x7RhS9OFy?;J5V&7D^KyL1Mb2lE0C*rP5mMjZCP6UZ&;ss#H z@|FU&=Daf_wOk2hb5yOFGJC*HIF`Z3N%-f{*YDBCiJ>7rYoG)o4{8%z(c^(2h8k}!)pNRRN;2;u*YYWC3ugILQ{!c!$IDmJ4!wvCd}uoSabk{&J>}@pMiCG zBgvA#)q;D87YVwTzQV6zR@|ZXAJM$E=kI%mL%44HDwMKTexQ-l&jmWJbuX7~+OsR7 zw&lDf!i6kR)A?lFV%gy*FpeO*`(oP^N2b-|WR+&*AGEu@VBnc%9$=#c!M;GeDo|kq zUghYbv_M?%iY*OWHp<4eVmZwq(7|#&g%k(erqdetL9kAmkvSZl@LOEkun9{+A5%yu z9)7ys66_G;bILXPVwqLfn$`GR9t+8hqQqOprv>l~uq3D)3L?Zg`BKPyP*%KI`&eD? zZeK#5u({Sh|6P{F+Y$}=EAr4%L;dilvREyzv}0Yx3M@<7oRJMP6788u3!G^Gt2ZMc8X35fSoM1$y-ZX=>n1EfeYoinU zqduPazRe}iYlyKEF^YFwmj&#t^D#B*I2P}VKCKUT14FxR)8)m%Kn#b&OFzm2QH|Qc z6V!?k#61Z7_aAYz(D--8-3{KTfcLV579!3ldjp{m=BOm+uV7{7*gz_xL<<8uhJk~0 z)G_`B$r=$QT@Nq%#1#F@4Q=TuMHVUl86uFv5K!k$(GUaD+~VG$=mwBfF^(hL>ib|E z2BOcb$&L-=Pb{+>%H_nS_`otMKTzCC!Oz66+8ctOJqluWMv>M% zMVVfwd6LBlIR>WO93_hGBj!8bpD%Xs(TDbvhxzgq$|wXiG6S*7Nyw$YqPRmrHYZOu zZ7U6e=3w-fO3qgq1B2zN!ZuZin+j6H(}7(4eEyf$g4__S>k#G^)yt*}HNv z#BeGMlqI8RjCes+CP~7M9~~SC2p5&~ z0IL{P6YMMr^al;uIPBfo^<4TLp8N;;@i*HSRXIiTLI?5SnVC469D@MJX5uJ4MoJ#- zr^n)GA4+pncNx!@wJ6A@q%|nQU;+kwkOqytIT(F8Ia4yAN=cy%w=%|jx)@qkA^h<- zy=v>&7HkX&O_tkqd0vDJ5%s?M=7S-9hQJ!Gei(OzaeEszTYn=JoajraWgqsN{(GKU za^I`3v_3R9ac5aE{R>&PP)`NsYz#QWOR}L@IUtD}L@M_J|2c5oicoI7n?|WP`^p+!G3RXBwl=I6^{~;W7zwuw zz+XC!Spyd}p#ytUEX2i#{L9$SvRHNv5W8zUq9I+X2vS3-_DnhbM~%9$-vFhCUn?Cx z;uJLjE2B16`|R*#nn2~MPN%%(j#v3L8U%7i`_!3=ZHUu6wkO42n1KPVj0OeZH-}rT z@>yY%5BinXdxF5KL+z8?JL6=jB`La}oP2_P&Qf`o^F4`cpc#Tg_)`?fiy}uQE>#@G zM*jyeQqAj|#)^^2wVa(jKD>?IhEO14f5*vqLz433bJ;x+dpNFg!x z-T1U=p-#t5$UG}aQb=H|uu-EW1@N5S&J+HmyVO3~QgjLLSiWe!0GoV7RimX&it|Iyw~vJ31#? zkeP`jRKm(o34c53*x}U`5Ya@e0F6|z3a4$8!iYLTrL=_LSt1dkdoycWZ6_V{6r;Fd zG}L?aoE&fz;l4d*j-sb%vZ+r!qDS@_J-$!o84fA3(sIrR#tYuFDB17MM@R3-RBqgm z!&;r-@iA#@JDVLd+3HA3Pmjr3-Ja=QIr;B#dmPp0qk@%Q%^LyWDm7tQ7N66Z>P20P zfD|{V3`~5MqOSvkdY>js>JC+hbq_dkCJG{N%w&BhW$rEo?-~Q+gzz?nzbG@JIcaWa zf%5;m`&sfoFI2Xp(uQU_k*G~BR!x-gg5&|xQk@Sry~t!Gty9?_lgu zi*VMRD!T=5DEwyl%YAPC+bpWxVfw;Jg zFvst@q8&7nVLz5Q+zN(zUlY-UWX}3-?*5~Fe^}e ziNx0yLON~m%MXXqbMNW*UJDpd72^PJfq^a6WU2Pv|jfwm#QckaCT5RIrG$TJlRR< zwD5x;LS(cEOs5}0igK$WTyE7!{D7QPMO7evpnlM_H4VLu0M9F>d+Np)7k&7J>*$Mn zwqhr(SsO`$)rmIE;8YBgGWs3!LtOjSqG79eH5$#wElZWB&Q{TVD(4?GPzJf_s(lSf zmpQ}m=`JO$^zbCuE^NB@gYANLZm<_ds6Cn{7?C=118WJx&S*si4da^_j0$l=2w13n zn%!xLKJhy5aB)9+JXUjTkUPRTIo((VKmXa7m`$Hu@dD$X-W2t#4e3Dc$2fMCk9fCn zm(a_zA5VUHeIEby=U3-v@r$2N-hUX}3simqdu4pEz2YXBzUj%WBPicA#*rI@)ST=M*JwF7Z148oo(wgd2vg++_@Vm2Jv>I+EA&q@ zo5`HD@;JtL#(AzzH$R}u@XI0_n7Fj~_4(M~5gY}P^XMn{(J|Qn#!dGsr`$+=+b8+5 z_5F^W9vnQF_42eis6U|xw5931=TD>DVZ8vToUiTUO6CFow0R!}h)LN)Rste)&!-P{ zh`-pPg@Tj1F4bLu&R*8p$6}Uyyf?CD9CR~sF+&Ldsv^c_lPvZuPIG}^b78Z)i7PuU zek3%^Ebb*e?sw+aE8kUvf~{t9-Pl9!a-5IDuFTTzsEnOMbZF7GL}S~wZRf_eZQHh; z8|TKhZQHhO+dr@QTK~0opMwIPBcka~|Dn6( z8tZ`I3fVyB9{15ivav`2+J{lpWpQhFx`48i9kob9R9YH_J^z7Xwx&Y4Lvb7fd^J*+ zgpK}|O(!uY^t?JQzvWq@f@O0Q_L%G^!WdIPAM0BhtH4bmFr4L(4~T1r3#jaE|4R@k zYRd_WLwCE(WIg$K7iCNKRgvr@$NFk)D!qXc2)IuUQ@)VjjO*P?HoyVCcW*@)iJ6rC z6FYF1afpPqfbc$j`;QjGAnC6^CI~>MQ+p#+dok;1 zF*5HCg5v_)pBFe`HnG8%zvpX=MF=Htod{F_KNN`UMVWttGTL=j3%m%CmH8H30=8!q%`Of^~HB`}kiA#x+aj_ESJ&_=f)W8B>xq)D1vZ60^&Jr9sv;x5GAJU0rVv*#0tv^Xc42f*W3)i zbBiI4#`hK71D7{c;hpX4p|pq+_3Rq4wj<)9sGIYENJTGXxukAA z>D36+rugx8#Bc5Gyw-7fjV;&l72AePoY!n%-L+EIeT>Z)Nzk0jym=a2EVYGP^!+vM z1H33TBtaP%=>!_3VF%=xPhD$~J4ww&qLRvIO_JTu15CDw7h>|lYLH7*G%m&x88{Lu zfq54-|J*K(7FAf8UW24T!VKB3bfSu8X`C52WI^I>u&X?63}IEROp^e?F~b@#K-IbvD9u1&K&89TL*wn=!)##a8}+N|Ui%F7}? z0pxgDzA2?-i1qkAuD#b^Jr{6$ICWvm%2_PL(;=d?5n{Y8E{a!3CFCV|Axj^}WWV83-aGDlsi>Pc?FJ%xX(>RB z3dfpIp!vw6DHkOUXe*l1bl5%>I+`~jJOwd-;|6kI2SdHNj=*?OnT^>AES z=U?f{JwI};8i18`*XW)BYiY;E`kJO}DP;(9W#7xJ6?YU$B zR~Q%hp@xp}Cf_p`RNTCH_xRwx)6)e2Bhl>IKIBBu?&{9;^ASY}PPZyDgH z0}Z-PJp(^@WFD}7zXTFS|c%58ns&VR2A5V z)o|g@h3keazkBZB{8EKxx7HRn`(0E(0{JLv&$B+mv$vCtKLkCgQBi!b!hY!Mdj4qF zH@&HT?VZlL?eoHW{mt&K7Fw%du%EeqWCjUUhv`2bc6aL$C0~MpChii@7znAlw^csH zEwmh6+m8qQH3*krKSIbq&$v)<|6QB7Q?{^O|E{6sgrH{~j`w0?a=QYLkQ~c-vH=<* zgvyE=0@>rdw=4$`!)ZfV+FaU9^YA^dzLYSVHppAiBOU!W7|8fUaE#z$h8{RhE${`* zq62v=MBijT?7(>w-VQ?9PR+Gk8)>m^Bm~bZ!W4_-V2|{2to@1=Wl!g*=FW>y35i>2}(b z%|Dngs61;+y;^P}c|Y8}d^^rb>u2~!gAqry6U z;wnUK`GU!^DgRiBn9mpK*{}#Q)qojmiy&fGwt>aW)rMtUi|?S_2IT;7>(Gv(;qzgi z##}Z`*wHM3! z;OJW7leCq@+Q7XV<7Upvo^<{p{nTbO-|7hMolBW3OfIS0SfM>Z!G6 z=YkgeI`nQIto^4j3Y(oGuw~+St@IlsIaq-~rl`Tfv~^p4t2%F`r>Md}{Nc36MWYGP zd$XSD>W4aI$xcYM#S==wm-j9wX0Xv6ZU+N(BYyDHDJ8VQ~<#$iKCejUZq zvx{cfs`mz(RQBTinTx4U<50??v;H^%r5N$R^4-O>56?qd<@v!_rdl4ZN}a^Rk(T#; z7N*QrD6uoT##zCAZ;5dGkRQL=Nqw)RMnWlfkuySetlHLIEA6!432a)yh=K*GvtDkV zw%~ZHb$w@AsVK%s3blE4yL=Vie456HxosOOwELADI zXOax1;>bwx!#@M{^=fGTi%|lY z^tBC)c!c$G#F1rr0v!gZPdsPy(i&iUi0nnXd{%aiN3ba!=oz1$wC<~Aw_po#`ddXP z*m3NwVu$2&CIFLIqZ z=wArTC4NJE3P1A|ocC6`k8*IQP}(=Nf^s>}^li7~O74!MCXXTCd_h3y9D=8u;*GUD zyjOzEd0K8~O$YFT7=tnW|G4;T$q#qnT%0U}QRPn=>M3j{*#$cTKA>ANz9+my0}V^9 zX!LGp-U$a7RtpyEPk+|2fXC@VYHnIzq?--uwa0O46dA0(3=8E1Ifmh2)ygj;O?&>l z8R3?qdx57;Z;;p>K0aq9k!GN8-84?!DuQ}Ci7xPp9G6o9>HGv(P@7yJ^|VSW%y+!vWnxk6CubNT=3@=;^$(mw19(@;F)& zymIB{Au?y`^w^rLFbt0ol=8%?VJlnz=nzjM0%(DJMaQ>aDO)Mk(Yg@A_U$KQ{CmEgS*0MfL-28fds{}>erNC5h2{ue5RT1J2)($wJq?=gp7Zl01_J}KdS2&(<4rV7XZ#5$o;n;4n{OEQ}ao{PZ@3dTV z8$*7W-<87J^SPppKdjJPfi%D_)yWoR3#;=Y#l@*t(Z$pi7i9R7n_k$Wy`w08E=ZDN zFp9A;XSJDjSP10U=!1Fbw+Z>f)BgH5Yr^jJ3jRZ(aUkVq+LycaJ7l-Thsqs81HV(g z_Dg=`3%5~uX!?6eW%fd$w@XCO&G#{^t1Ig7(g=Jix8L>#_j3X~#klTELmhT7Kdyk& zIb_Y^-zbmFyo=#ymSBN9()8F&XSq}$Yw-;qbBHg4bCxL=@b!-m{`$Z8e8)R<-v>s% z5g<+gS2sI<*%k!~g}fhNZ=259@)4y|Ct?~z8*X#Uf@DOjAb8QI&^tO}#vbcbH0*+F z;ry*?6WwHVD%f!*$n}So^)-PnLGf=lQ83n=7b^pMQx2W20u~P4nI2CBK2DpX=hEWI zGsrd0HI}&2Da##Udn|D&rh0=$f-gHYT%;iIYs{4{qTx$Iu$;R{ zgl_+U{kM@AQMc+85EB64%kY0N5<8kWxmY{@$4Gp{JD0G*mT>ccs@|qZWE0DS^+8%L zeV(~>sbkwEOEtax$6N)4RFD}*p)iGjby?aCAUAnWrF)bHRQ8kjLIRV2U@yjtUFCt%mo%h7sXVX5D(USjVLaPPD{?MS!?2} zF+|TyWws&sIy7l|w3=9HBnhyh1#=_qmdmraa%*@Ktn?z4bZgyI@EYT5aNEWV2G%2q zg0)Dd-d)E4^>mQ3J|iX^YN0fHLXq?synpH@?A8tz%mW`Km4p0&5rGjy!5knrAv`o4yf_@8kGyto z^AZ>p?0J;`5Jqx}l*3wzYD_2*Q}b&NmT|QQnYO_9D-8O3M`{a07>oyViWW|LM+@VL zaa`P*d2adoFyqo^rUlL!VXqC+E*zw?R&P1t@Sy^3HkY#dR^CZ1*%ye~eX5_#NYJ_0 zfD`qaMV}*K-277f+Kq!3Ch-PHg)Gv4%~-rNV_4`i*(1Hmu;`xg!O0C;#C%DhmH(V( zV~GD{@khlp^*8axh<}R3-vI>!1#f#M^Z!+sQ@3+7Nk3f9Xy4qA?zow^w&{sV4nP<= zZ_<1^BznY41KY!J3>{e6;WI7uToVFqhCJ0;gGk9oN%tpUPitL}f~~@qoa;kMT9n>Q zmdUP1trWe@Rs+v&_IIES451ralN))jrYYqVcTf#aC#R&dq>gHH>^=E%3U4|OM3yzN$|nADJvH)b#J1>}GfG`5;2O#8?1&ky&#@~kbs0{=O$yW6|X z$DWO!Um_^7+{D;|AuI(7Q)OvgqEA|adtrFKlIa%_Co(un8DCM=Q>o*che7k)n~MM= zKzLwA2Fb5RXgV*F`}TDJe;C$K12?b`_rb%e7V@x`Uz0JN%WLuY$IrgDuTY>&b4{fm zx?!JrQC<%ny$j2{ViyhYPxR38s_g`)d!O$YuKnLr`&{ zB|&tU-^0g@XOR=c9v%-2!KXlcTkv!>@dLE>ZUc{;iPZpCa|xAG$wXh-yW+W^Oewzb znH5Vqkz;YlO(B@p@z04c-$}Oi57pED@F!aQuSXNyoNkPtnS&_TnG>V+J*G*e5;0}9 z5$3RU!gKQV64sp+npbGP`AB@1D8E5pesC-wzCMWO@xaf&U+^pV{lD*a=CQPEEs3>$ zlf=G+7C=Mvf^xdWqxC{E^O*bl;g<`Bbciigh^iFK%}VtPDE}Ni+5hlpA@c#$wYm6m zY*T#uL5b%4wgWQX;&q=QJc+cXEO1v zslrV`W8lafw53eE90jk^NKoLq@uusLr}0JXwnLo}g8EoG{IKl8DU1ca(m=!=g#tC*%!!y5tu-d^VGDbus*Pi6px?<^apvM@#z7+ezn4Oj$< zu&;YZOj)jRRxfEf1b38UNvjauh6cx?AYFBFG6B3HKzQR(0q>-jAR2hyjO7 z{upU`E(0LA9&?ld;L$|X8P=%;Z}|4HGpe%qVr6=aF29$pmm5l3I|L7^puc!9b#+18 z9d0`=5ak4xr|BVnz^X+NVz?>l@#HMXqz2)8EZFq`%N#|k-ka1f^|I{i&cw@P#{#K% z^@9jW3`>F^HMi_-W@`Vf#ZMV1+eh9Tt@| z(~VJWd^sNTLK>t#>qAGan)b4knnDIX-}KWAO`d$* zj0&kG{3@{>8fc*`MAX-TM!UO(uKX*uY+U`jPz6BWO%7{nlEzQb#!Y=n*fdy&A(|ZK z0sTQI1|ct@nWzw0Uu7?C>1<_nwBeh4jA&f(8+200Q7w6!2#9c}H4)^<3K3O0cbv8~6Vf z<+#N@mOY6IH_8n;H%5mGR7VkANfePd!1!l3%|BW5t4L1}_q13dXH#bC*y%OPIZ2?` zwb<=s6K7e%3`*hV+{rafnFanlpj4C%;F2MKb;FdfB_5kLZ1H9fkvL|uT#UDrz6H~8 z>7z*KdTrw?W`J;`C7Z@q` zXE_G$2HS_$EV$AaZ8}maRyZ+2s_~bFpZ=-`7?8(?o}o%@6A;y%v5pq1=R9j1F8Y6Jbx7sCtV*8{AFgNIK(;uabD=q6$NattR}D{u%;BNh4)j5yIL!wp~T z+pM=Sjz4uJeWC{Q1?f0wk9MN)4HQMicA2_tHSVEwaTa6Ag?QVJ%*_o!&93Dz{ zA7#ryW`J}TPXo%uN2sBG`!zMHEj~Uhfkzh2fOA5$q?KPwS(Y#eg0>sexC z&QpO^TcdU#H#~^9!db0@jG4*anCDg2BR{sw(X$7sMuXdT7-rQZ+-F zj6FarF>D|#8tt+!p4OsgYMJq*X_hq-jN;MWW!Bc)^SE`l(xs1soAaczwz*ANkeNF+ z3d9H*&^}m70;)!VlXe!Qic-3XU#EuC#5sjWtd=bkUjq3wre`vLPK-}Wa}hm@@uJEC zu&F-hejDYzu;HP9TgEFR%)Jmv&RWcNAtb{~nbdk3q&gn5+Rwq8q<%D#-g7B1=0rmt zwrj*Y)aHb~0LLh{oNLW5vepnFnd`X8iY9@UQW_^~D>B5k7%D8nbrA+y>_qu>@!mIb z2;?Utdu8Sxyb8Pw`E;RO41YXru=pHK^$bb2a)2?5H?zt!E2h2^dg~copjK1&h1!)= zVs=Iw&<=+#w~aV*jvzt~KJ5V2gCl<&&MN;lj!D}cRA;fc(a-{A#%dTtlmC7w*;>|= z$$TJK5~I(qXfqZCbNf0RyRsJBV6-+G91Hj5Er%w zu88870JD2@F_%bMH|&eqFvO^1jh6cQ5bIiF`c-OpQD!sk|zd2yLW*JixQLT>o_5n z2R>4{n&fX3RkP!_N!MkAJ<{0KZMtywc>n%>56g2o^z`(|4bJCOL%jFI8nM{acxV2G zx?Fo_O@n*wo_pFBjEzB=QFmdLioRPEu)mwBv~lL9I|WeQkl2iTqDNy;XoOze$-RL}0{X*(V2&;OvkjNhYD?d{+sHj_m!}o~& zP*hUc2&eu7`YLNeO1{oVW~zm4PN6bjslS2b$2?s-0x4@M)w(vk7lY zAdfac57%%a5Y3$p0L%u)1@t|ds;A10i`Eki zEbQkc(7Sz{^MqyU#JbKq)}RMTFXBy&l8MImOY*gbV}3@B{F(Uujc;nSkQ!c(A)|W0 ztgyeF!R$Cqz+%~Fx~?w=K;NgcFjT)U-?4GQwIj-u7?lcqpw*^3NvGcK`rMP=v_`Mw z2Vij0MZ(3K)=KvJT<80WX;{lVJ=4v%ZMjiyL0aRPixs6iUtkdz zl(6v8f{TAm#Oyw!*3*Dh6lbRPQ|au8IX@&Qo5-EHQ)rcC2ut#71+{-tUukWv21NYB zXBhArv6R&sqrVQEN@t)X+F=R3fwX^3Avmfl>6geF2&p_WqB8n^`g+-&`uI&kAbsMtN^IN|klj)E(GVJ>81QHq!fa3OD!Y13r)4 zO{vN@v4?}DmxMNbg=Thxt(>LUd%mXIl%O%)kwtstNknHdDjEv+6zbo<8@6Qa!`>En zgSGV#837GPKVUh=F#9wlL9S#r|QwUS|kiyXOOU-^qoX*1j|j5%5>J~C|6BN z%(gr8muAuh?M`WAA>>acHqAvqI564>ljyjHT|A?G2c^yU0$*NGzIq(T40~5;xDU7} zGo0kY;3Gu@AP)nAE!Ok^EaZcm<({^87jIgupt}`d)+LA?fIMsDcn?VxQJ!z)m~P5- zI-Zd2yFt;==K$kFLm^)?^3qhkQK?GG0ZnFI_TMs*d6qx0|E;2I+_83R!2$qiviuJ! zinEE6^DnFLS4COU^s(D)#{AjI3GC9ZUCgX;ov)gJU11g9YBH~dvj{Z21xh2oyH>xj z$w&D(e}{&_sGVt*t3M&6j6k8>YP;Y=je8|Yn8Eg&!7d^%G|fMLb5*#OlVwwhk8d5d za#btwmT^}_Q`!16W-i-O$u%c;@jF;Q=8I@6S7za7BD8*sQumclB$?3EoO~5bbo@(Z zrFVR~)N1abEf?MrR_H%ti(Kz$9hKBP@Nsu^L@H5+P`s8R0InoP@u4)EHf4TeFTq46 zjlooKVizg$WfZ{bW0R3|m$jvirAj0_XKwLzL=p4$VSVku^U>EeXMsjq{ZYMN@Ct2>n-Mlbu#^>@u3Vu^vP6@;pawo0&~iYoj5e}l zGwKwRCL)x%NFB50!@uIQ?C@WhBXOlesg}6zEzc3BS5;f5&|Kin)Bf$C2FwCeJrSQj zBXD{OH) z4Z2-i{ZrPFa1x$v&ql6Ra=Ys+E4zpJ9WYXI11=cUiyaqL%YB4dcO~%Pi?3iGQmtuI+RRIn zEDAo_S4ex*c9gyaYYz_Lc-u(DB;3jL0^AB(|NCgOE@Rk8WRMLGNh}E4g^>Wt0f>cjVN`hRRyNERpOQ&G*0gI zVkYBPTBw%4Vp^$f?OR+Btj%S_W@`q@jb-9cemCNQPXh_o8ZsB{Q0cvPd;G)(C80#C4roveoTE&&nRuVu#w#A1|*XB#3(Y`sA>Xj>P%e5noM>rsg zS(6;P8D4}Mqi^uWK z^8%p`YUMM*_S1h}@bM<9{WX=N;3$m1bc%%zw^F=xw?aVsLpJtvS%U4^ubOt7kAnae zn-OP)P(XZQF4yUssJ=mK2)&0?stK9h>8OFsjEyv|L+NpD90$x=hwbzWwXN9w^KT{8 z9na=}-PlVdIdIc<3skRPAW?_`J4V#5-axfRXI8z56qcQcq6#Vu)L~+ChBkhWgj#01 zgO185%A6}Ohot{m^Vb85^>v~hz`=$9fR)O1M16viA~?|KKX}$4Yo@N?$5NkC#;tL) zNwqVl#8%+PWy?0EeA3X(*w;-o{35PZouZ$TAe58n#aUTN$z54-io%{s%y#Y;v*OQ` z<&v7%H%_1`_w?!dw+Km;P71mw*qmsd8b7W?N#8ttCB@Yuwaq?MZ#?$So#VSU8hWgyaX~wAx-hxUib^32Z zv}YDUDHb%VF|rQ{o`*goy^&}S`M|w*-(L)1oI!m_M=K6QNn&W=!m5!+s6ev2b{O!8 z#Tx}WJlVW1BuQP1rna&~lptD)nbUlh&H1G}_{b&Kjl-gz3F5Cr;Bq}&Odd9}*gzCt ziaWnO%5=A|{vRYWsLdXSOo^diM9M#gCyLCjPuKzJVsdz}Vg2XgF~$tb^6kpi!+UWZ z{;$xJS1@K1u`GGtt-{e-jIe}o6qy)xDmGe<_WXLqeCWZEKyP3y#I%6Om?40itT7q| zb`vN{_}s=L04sft;DjQCTsX-*(e9Gohyj{lpU4yUKfEid$X|eVcYqz`i~3}^;w%o6x##m)iT)0Q z9P>>O^nG9~POd&>kC4kE@zZ0;?SM6D$V#d}u$nJKk}&iRs4TKzj+A+wEhK4 zMO8rMLhXQ!oDt-@L^jfTTDx7U#_p335HJv(8bc=3SyFG{{_N@9I;ddz9^ri-giO`2 z!fxpG8ZamuP73JMU(bOs)dB4@^b-7fhSgqZb#&1W7S%mru?~*3Y5L=sZIofqg zklWH@p2jqOhB}@Kz-zkpS{?mS9BTl^z`*{F#x~Lxtjaa`SdQ@`ma7@A5bSDHd%ZiM zwZus-D!>OK)BSsgLBe&$y*$M!^_{wG$gMrH4Jf#=M(YEVMh=hltGdvASZ1Xc^TPRG0Jha6MX#8- z3o&TW+}ccoF9JBx+qh&aj6wH=e06V3W#nTxDIweF3=5!J}qO6S1MdFe0jmQoYXw4V1F|(UPGnkts8rUBfC8En_@G943 zCeDhsrDri4w5aQVL})ou>=`R zcg@pz*ISc?)B%vN_+r6%96v$#C>5*C9`fZ*96U5Z@KB4XSY#5;(3oD)a*#|{e}YrH zHvi6HKf}UMAhID+$s}Dq|E_|}5Z_dGFb#9I_M2k)=-?=(BCkfG<?edQ|90m=}(f6X#8DJkdT1zVyIg-YOnqYc1f$hPtTjq`)i zu%>6t)r)~z%}Dy<-;HD z5?D_TS2(_nBgiZ}^}F7(*?eIM>N{J!ACEYAdwT9Tf85W$q_63-eVUURvUOUWHkqnn z@&9dDcfLV)h?SY9Nn1uxjWciPj+hyUXD3j{eS8rHEXhh1Q+9uX8f1l0-@n3k`{iBwegh@Xd)ISTx9&mui`aa1Tuj+6p^ue^SSJObgIpY%GfkkY)L*C>p^(oo4vmo1adHx(0&*~= z|LDb|(_6zT7ybdaw6zuwlR?$hUs~HA0ovV-A#L~w`{=$=Lh1%!hi*lQ`Ha=h%=w!G z=(MN?iqjZI`bD0zyUr=^u+kyNKkauofL8T&6j;&{gs8PN06oItS^sodW>pQTG}W#b z+9ZwL1_e9mgqGR1jHynB6KSMLf>Zh?osa4d`aqY>`}6qX_j>u4ewwsj)E$=6((ZQc z+>ju`^eo9O=>TKXwJq+a5+FBWnuQ0pa^#s#th|{CoY_sPR!uYg+lp1~92z^6Pp+NDC(R9IQRtpwT|% zeRo0Kf&(|~7*3NFZ$DQmQvtuVt-}w#Q{=VtNi_zlEk670xU?^e$!&8DLc4uIC&YzM zevXH^UXmTSRB!kbKo(p?dtPHtXtp5iaD!CN*k(?+E>3-^Ai=%P!QUWlPR@;yf?zk| zYM#8ascEPlt2`yi7F&D;g4Nuk40Mt|0s~)1?PWrn{tOuJhU0pyNZ@Q32n0rQ6o==c zvlqf=f!Kom4Xw)|E`AK2Obw_I?=H+#vDJXOXf!h~)v{~~5 ze^`{O_EK;!pBtb(WMUe0*0G}bKsziU02*mnFvY~9_yXBHg}NOjKtU^k3!5<=42OLL zQT99lhgJN)zG|Ha-`zrWh|x{)$HcWGYt^Y@$c~gtWiDA((xxrZQc1Q9JnU@r3dt*( z9kS{zII}iAA2S2SOc$OBP-59tO#AZ1^f$V;Oj*W}&~BSh{Zhevb_})*T zrs|1I9%#b5Fq7z3@xlCdH@*6Hh<+gZL)`|m$POQ! z*)i;iIXs3(!gLJB2f9Gx{!Hgdwf!Ym`9}=-K(JjENy*q{o>4wRN-X`>mdd(zrgGAX zL^LNWnubt5nc5roO6Rvf$hb>96NXK)6kttsX_7-n{-Ky&oQ++o33Af!-`Z%7xO5HU zze)8Z<;u)SjVJ;h(r5!{uv)z}T8b|Nq~bzFC3oAn8Y8+4MjiCXTy`%a|JfWA&B01R*Ueq)5qO$kyD(+jsZb-hSFA)DVb;WTkXhh^GtArz9#z z0s34b>hMzLRIWG`Gz(5>+1EfWM@;(jVTnjl;p(eJPbM8e6d7QM{ljkx5vbYu~wRMjfM3R=`W zf5li{fAAFvbGmNTQcUWLx64iU7r5@*dS4Cx`|uv|&gXJV&x1~bMZgXkT9(nsR_w}^ z&kTHj5i)tIny!!iS6>$Riz!(|Vach5XK1(R%sl@5${FW7@jDo=oS*bgAzvO}5nlmc ziQSyutlqrd9P}g67pqUkcj$MDZgEe+&Fszs-z?w!Z^GO;S-0qB{^gYQ{ZE%HUoQKp z%)8k;x@VNHIA6YBQOgbA5wv8U82UaQIOdg3dl8s%m)4*8mUMa)DdWiz0=wGjO#Ft?0Z^Td&6 zsj#mwPmRQqH|#LJDlMX9So}Jo40X|N z0wY7psQ{H}Qx(K=<*Sm%)uSz4=%lI)miVb7)y;N$xn-X&SQ7M%~ zMdV?t!Vkmql1Z9E)eBJwNpSe=gH#b!;z6O1uuD!zdBc`5S@G{q5d8(Sp^jAKyTfOR z7gV~Ege(zZPDs0=ZQvMaT)~?(N1DYjmQ8w}Jkj!me9)YQuz$PDwobQ>8dqbE<$&zc zvslyj7wcvoV>vDAM}E^j3(P~@4?d>mcwyuo+5eC(9}ejC+b$s`3nHCDtCVd2kFawH z5-sYMblG;*E!(zj+qUhhTefZ6wr$(C?dsbdJ?QsGcfY}zp26M`J2F;geoIQm5WGDe zWo}f7e`ZXg>L^dAUoQw=I`Zq8dPRg=FTuavS{Ly`Z6tmtSD`!%bAui2lPO9ao?IeC zA>ukXq3CSAiZQ-q3>U(7go!)Ds0_K+OFtJv1}JG3j2!ZaZu&G{jA~f|cbT}%FjJRV zh{0GVmtCkj9MiIjD1j-@gfi^W*4it|yUOg4_hvE4PCpsY0zzWidvoMRlH_Dbm7^u?)J*zr+9|(<45Q_z(MA0cDA5 zg&kEvTCP58x=IwQ?g__rwdxd-hxWA8<`w*tVaHm^mmRjgX(ObNBNG7? zAcKKwM;f6HWM*QPN+aV-(L8GV@iJaMiJ05HO^QZIC=E&-+z_0>owZz#k9I*A26}~U za|Xp1_{S4Y!V7~&ic(QtAEi<-gto(=jc}Sa>Vz0og-kDLDg3@{olL(`m;SpP*{rXA z+abO*#~Rctu_Sp|L6r*lX~ZUcXQmO)WVi=!Ojw14=?y3JEyXCYyo)Xdl8PHHK^T$Zj$L;WHm)!_w&@<^U9$$v_08nGYi8*l)CWGnyx;{T3F@8WD>{ZC&{tJ~NevLgLk(A4kL zD_%xq?WyP4LwYvZ%?6uj`X#~10Rq=?eSn9maLIFNvk-e#J=1kz~lKxO> z{^6uVRxS;{_lXEMzd3W87yeh8BOs8j3I8!kYSmPb=(6zu(In9)K@iKO8|U z;nJ@3X`DLQy$u4ySGjz#iR2=c4o%m*C~91%#EjU~URI=}l}zP^(lAwLrFHwdG)i8E zM=wwK$W37a=sK99qhVGvA699#+pY8($3w#3Bgt4t(Nf)&-yDBbV;VHO-UGBHV7BF_ z8Zi_Ay|`5)BD!YfK=p`4$j9+fmVJv@F$B5cZY)kFlIwbJ_<?M*{v5^UQBlvs>zm;BM(0!z%{{sG+XZ2VYQcurQjZ@{L3u9H<5#=vGAP- zdW!+UZM7#f`f08=7U+}2fBCIDuAUe8LZ~m=#mX4wldeWEo_)aTfb+ms1lekXO zfowZ4tsk)n@fFtQ<${8EihXJ&QdOMl9K3dzq#=TZk&&qPKNOSFh^zY8aRY6O{*cGj z_iLalJ4a}Md2N*w8NvY42O8Xis(~jzNh#=-8VaziEzP|@v$Do=4MSvqi=R}8DZ9lQ zKa%A>Wua0XE7}1WK*~Tgf?%(h9MI0WuF;R?+AA#5Q{kUcH{>dGOEXqYJc`z=ZxM2&u~ozk+SvmTaJG

    ipvPTcR9d$(1o4+b>O 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

    BXK^;`2rp%} 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 H&vpL;_cN&o diff --git a/Lib/test/test_ensurepip.py b/Lib/test/test_ensurepip.py index bfca0cd7fbe483..69ab2a4feaa938 100644 --- a/Lib/test/test_ensurepip.py +++ b/Lib/test/test_ensurepip.py @@ -20,7 +20,6 @@ def test_version(self): # Test version() with tempfile.TemporaryDirectory() as tmpdir: self.touch(tmpdir, "pip-1.2.3b1-py2.py3-none-any.whl") - self.touch(tmpdir, "setuptools-49.1.3-py3-none-any.whl") with (unittest.mock.patch.object(ensurepip, '_PACKAGES', None), unittest.mock.patch.object(ensurepip, '_WHEEL_PKG_DIR', tmpdir)): self.assertEqual(ensurepip.version(), '1.2.3b1') @@ -36,15 +35,12 @@ def test_get_packages_no_dir(self): # use bundled wheel packages self.assertIsNotNone(packages['pip'].wheel_name) - self.assertIsNotNone(packages['setuptools'].wheel_name) def test_get_packages_with_dir(self): # Test _get_packages() with a wheel package directory - setuptools_filename = "setuptools-49.1.3-py3-none-any.whl" pip_filename = "pip-20.2.2-py2.py3-none-any.whl" with tempfile.TemporaryDirectory() as tmpdir: - self.touch(tmpdir, setuptools_filename) self.touch(tmpdir, pip_filename) # not used, make sure that it's ignored self.touch(tmpdir, "wheel-0.34.2-py2.py3-none-any.whl") @@ -53,15 +49,12 @@ def test_get_packages_with_dir(self): unittest.mock.patch.object(ensurepip, '_WHEEL_PKG_DIR', tmpdir)): packages = ensurepip._get_packages() - self.assertEqual(packages['setuptools'].version, '49.1.3') - self.assertEqual(packages['setuptools'].wheel_path, - os.path.join(tmpdir, setuptools_filename)) self.assertEqual(packages['pip'].version, '20.2.2') self.assertEqual(packages['pip'].wheel_path, os.path.join(tmpdir, pip_filename)) # wheel package is ignored - self.assertEqual(sorted(packages), ['pip', 'setuptools']) + self.assertEqual(sorted(packages), ['pip']) class EnsurepipMixin: @@ -92,13 +85,13 @@ def test_basic_bootstrapping(self): self.run_pip.assert_called_once_with( [ "install", "--no-cache-dir", "--no-index", "--find-links", - unittest.mock.ANY, "setuptools", "pip", + unittest.mock.ANY, "pip", ], unittest.mock.ANY, ) additional_paths = self.run_pip.call_args[0][1] - self.assertEqual(len(additional_paths), 2) + self.assertEqual(len(additional_paths), 1) def test_bootstrapping_with_root(self): ensurepip.bootstrap(root="/foo/bar/") @@ -107,7 +100,7 @@ def test_bootstrapping_with_root(self): [ "install", "--no-cache-dir", "--no-index", "--find-links", unittest.mock.ANY, "--root", "/foo/bar/", - "setuptools", "pip", + "pip", ], unittest.mock.ANY, ) @@ -118,7 +111,7 @@ def test_bootstrapping_with_user(self): self.run_pip.assert_called_once_with( [ "install", "--no-cache-dir", "--no-index", "--find-links", - unittest.mock.ANY, "--user", "setuptools", "pip", + unittest.mock.ANY, "--user", "pip", ], unittest.mock.ANY, ) @@ -129,7 +122,7 @@ def test_bootstrapping_with_upgrade(self): self.run_pip.assert_called_once_with( [ "install", "--no-cache-dir", "--no-index", "--find-links", - unittest.mock.ANY, "--upgrade", "setuptools", "pip", + unittest.mock.ANY, "--upgrade", "pip", ], unittest.mock.ANY, ) @@ -140,7 +133,7 @@ def test_bootstrapping_with_verbosity_1(self): self.run_pip.assert_called_once_with( [ "install", "--no-cache-dir", "--no-index", "--find-links", - unittest.mock.ANY, "-v", "setuptools", "pip", + unittest.mock.ANY, "-v", "pip", ], unittest.mock.ANY, ) @@ -151,7 +144,7 @@ def test_bootstrapping_with_verbosity_2(self): self.run_pip.assert_called_once_with( [ "install", "--no-cache-dir", "--no-index", "--find-links", - unittest.mock.ANY, "-vv", "setuptools", "pip", + unittest.mock.ANY, "-vv", "pip", ], unittest.mock.ANY, ) @@ -162,7 +155,7 @@ def test_bootstrapping_with_verbosity_3(self): self.run_pip.assert_called_once_with( [ "install", "--no-cache-dir", "--no-index", "--find-links", - unittest.mock.ANY, "-vvv", "setuptools", "pip", + unittest.mock.ANY, "-vvv", "pip", ], unittest.mock.ANY, ) @@ -239,7 +232,6 @@ def test_uninstall(self): self.run_pip.assert_called_once_with( [ "uninstall", "-y", "--disable-pip-version-check", "pip", - "setuptools", ] ) @@ -250,7 +242,6 @@ def test_uninstall_with_verbosity_1(self): self.run_pip.assert_called_once_with( [ "uninstall", "-y", "--disable-pip-version-check", "-v", "pip", - "setuptools", ] ) @@ -261,7 +252,6 @@ def test_uninstall_with_verbosity_2(self): self.run_pip.assert_called_once_with( [ "uninstall", "-y", "--disable-pip-version-check", "-vv", "pip", - "setuptools", ] ) @@ -272,7 +262,7 @@ def test_uninstall_with_verbosity_3(self): self.run_pip.assert_called_once_with( [ "uninstall", "-y", "--disable-pip-version-check", "-vvv", - "pip", "setuptools", + "pip" ] ) @@ -312,13 +302,13 @@ def test_basic_bootstrapping(self): self.run_pip.assert_called_once_with( [ "install", "--no-cache-dir", "--no-index", "--find-links", - unittest.mock.ANY, "setuptools", "pip", + unittest.mock.ANY, "pip", ], unittest.mock.ANY, ) additional_paths = self.run_pip.call_args[0][1] - self.assertEqual(len(additional_paths), 2) + self.assertEqual(len(additional_paths), 1) self.assertEqual(exit_code, 0) def test_bootstrapping_error_code(self): @@ -344,7 +334,6 @@ def test_basic_uninstall(self): self.run_pip.assert_called_once_with( [ "uninstall", "-y", "--disable-pip-version-check", "pip", - "setuptools", ] ) diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 7cccbe84f4ebfa..333b97688af5b6 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -227,7 +227,6 @@ def pip_cmd_checker(cmd, **kwargs): 'install', '--upgrade', 'pip', - 'setuptools' ] ) @@ -745,7 +744,6 @@ def do_test_with_pip(self, system_site_packages): # future pip versions, this test can likely be relaxed further. out = out.decode("latin-1") # Force to text, prevent decoding errors self.assertIn("Successfully uninstalled pip", out) - self.assertIn("Successfully uninstalled setuptools", out) # Check pip is now gone from the virtual environment. This only # applies in the system_site_packages=False case, because in the # other case, pip may still be available in the system site-packages diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index 2f87c62ccba866..2173c9b13e5cf7 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -13,7 +13,7 @@ import types -CORE_VENV_DEPS = ('pip', 'setuptools') +CORE_VENV_DEPS = ('pip',) logger = logging.getLogger(__name__) @@ -523,7 +523,7 @@ def main(args=None): 'this environment.') parser.add_argument('--upgrade-deps', default=False, action='store_true', dest='upgrade_deps', - help=f'Upgrade core dependencies: {", ".join(CORE_VENV_DEPS)} ' + help=f'Upgrade core dependencies ({", ".join(CORE_VENV_DEPS)}) ' 'to the latest version in PyPI') options = parser.parse_args(args) if options.upgrade and options.clear: diff --git a/Mac/BuildScript/scripts/postflight.ensurepip b/Mac/BuildScript/scripts/postflight.ensurepip index 36d05945b6fd90..ce3c6c1c2bf9e6 100755 --- a/Mac/BuildScript/scripts/postflight.ensurepip +++ b/Mac/BuildScript/scripts/postflight.ensurepip @@ -56,19 +56,19 @@ if [ -d /usr/local/bin ] ; then cd /usr/local/bin - # Create pipx.y and easy_install-x.y links if /usr/local/bin/pythonx.y + # Create pipx.y links if /usr/local/bin/pythonx.y # is linked to this framework version install_links_if_our_fw "python${PYVER}" \ - "pip${PYVER}" "easy_install-${PYVER}" + "pip${PYVER}" # Create pipx link if /usr/local/bin/pythonx is linked to this version install_links_if_our_fw "python${PYMAJOR}" \ "pip${PYMAJOR}" - # Create pip and easy_install link if /usr/local/bin/python + # Create pip link if /usr/local/bin/python # is linked to this version install_links_if_our_fw "python" \ - "pip" "easy_install" + "pip" ) fi exit 0 diff --git a/Mac/Makefile.in b/Mac/Makefile.in index f9691288414538..69ab4198988570 100644 --- a/Mac/Makefile.in +++ b/Mac/Makefile.in @@ -166,7 +166,6 @@ altinstallunixtools: -if test "x$(ENSUREPIP)" != "xno" ; then \ cd "$(DESTDIR)$(FRAMEWORKUNIXTOOLSPREFIX)/bin" && \ for fn in \ - easy_install-$(VERSION) \ pip$(VERSION) \ ; \ do \ diff --git a/Misc/NEWS.d/next/Library/2023-01-14-17-54-56.gh-issue-95299.vUhpKz.rst b/Misc/NEWS.d/next/Library/2023-01-14-17-54-56.gh-issue-95299.vUhpKz.rst new file mode 100644 index 00000000000000..29c30848e09a83 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-01-14-17-54-56.gh-issue-95299.vUhpKz.rst @@ -0,0 +1 @@ +Remove the bundled setuptools wheel from ``ensurepip``, and stop installing setuptools in environments created by ``venv``. diff --git a/Tools/build/verify_ensurepip_wheels.py b/Tools/build/verify_ensurepip_wheels.py index 044d1fd6b3cf2d..09fd5d9e3103ac 100755 --- a/Tools/build/verify_ensurepip_wheels.py +++ b/Tools/build/verify_ensurepip_wheels.py @@ -14,7 +14,7 @@ from pathlib import Path from urllib.request import urlopen -PACKAGE_NAMES = ("pip", "setuptools") +PACKAGE_NAMES = ("pip",) ENSURE_PIP_ROOT = Path(__file__).parent.parent.parent / "Lib/ensurepip" WHEEL_DIR = ENSURE_PIP_ROOT / "_bundled" ENSURE_PIP_INIT_PY_TEXT = (ENSURE_PIP_ROOT / "__init__.py").read_text(encoding="utf-8") From c3d015ce62f791e703bfcabb0907cfeefac768a9 Mon Sep 17 00:00:00 2001 From: yuki Date: Tue, 18 Apr 2023 20:18:53 +0900 Subject: [PATCH 197/349] gh-101100: Fix broken reference `__format__` in `string.rst` (#103531) --- Doc/library/string.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/string.rst b/Doc/library/string.rst index f55074cc582718..26b3f5000634f5 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -254,10 +254,10 @@ Some simple format string examples:: "Units destroyed: {players[0]}" # First element of keyword argument 'players'. The *conversion* field causes a type coercion before formatting. Normally, the -job of formatting a value is done by the :meth:`__format__` method of the value +job of formatting a value is done by the :meth:`~object.__format__` method of the value itself. However, in some cases it is desirable to force a type to be formatted as a string, overriding its own definition of formatting. By converting the -value to a string before calling :meth:`__format__`, the normal formatting logic +value to a string before calling :meth:`~object.__format__`, the normal formatting logic is bypassed. Three conversion flags are currently supported: ``'!s'`` which calls :func:`str` From 4e04393b2f64f9e44aefa436cbdac42db98d4ef0 Mon Sep 17 00:00:00 2001 From: zyckk4 <100814967+zyckk4@users.noreply.github.com> Date: Tue, 18 Apr 2023 19:21:26 +0800 Subject: [PATCH 198/349] [Doc] Fix a typo in optparse.rst (#103504) --- Doc/library/optparse.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/optparse.rst b/Doc/library/optparse.rst index 3e29fed0175e04..468c3efbe01148 100644 --- a/Doc/library/optparse.rst +++ b/Doc/library/optparse.rst @@ -2027,7 +2027,7 @@ Features of note: values.ensure_value(attr, value) If the ``attr`` attribute of ``values`` doesn't exist or is ``None``, then - ensure_value() first sets it to ``value``, and then returns 'value. This is + ensure_value() first sets it to ``value``, and then returns ``value``. This is very handy for actions like ``"extend"``, ``"append"``, and ``"count"``, all of which accumulate data in a variable and expect that variable to be of a certain type (a list for the first two, an integer for the latter). Using From 78cac520c34b133ba32665e601adbc794282f4b7 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 18 Apr 2023 17:47:08 +0100 Subject: [PATCH 199/349] gh-95299: Remove lingering setuptools reference in installer scripts (GH-103613) --- PC/layout/support/pip.py | 1 - 1 file changed, 1 deletion(-) diff --git a/PC/layout/support/pip.py b/PC/layout/support/pip.py index c54acb250a252e..0a6582acf348a3 100644 --- a/PC/layout/support/pip.py +++ b/PC/layout/support/pip.py @@ -67,7 +67,6 @@ def extract_pip_files(ns): "--no-color", "install", "pip", - "setuptools", "--upgrade", "--target", str(dest), From 07804ce24c3103ee1bb141af31b9a1a0f92f5e43 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Tue, 18 Apr 2023 20:41:14 +0300 Subject: [PATCH 200/349] GH-100530: Change the error message for non-class class patterns (GH-103576) --- .../2023-04-16-14-38-39.gh-issue-100530.OR6-sn.rst | 1 + Python/ceval.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-04-16-14-38-39.gh-issue-100530.OR6-sn.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-04-16-14-38-39.gh-issue-100530.OR6-sn.rst b/Misc/NEWS.d/next/Core and Builtins/2023-04-16-14-38-39.gh-issue-100530.OR6-sn.rst new file mode 100644 index 00000000000000..5b1bcc4a680fc3 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-04-16-14-38-39.gh-issue-100530.OR6-sn.rst @@ -0,0 +1 @@ +Clarify the error message raised when the called part of a class pattern isn't actually a class. diff --git a/Python/ceval.c b/Python/ceval.c index 8c43e3d89c2c2a..d8495da81e94ec 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -416,7 +416,7 @@ match_class(PyThreadState *tstate, PyObject *subject, PyObject *type, Py_ssize_t nargs, PyObject *kwargs) { if (!PyType_Check(type)) { - const char *e = "called match pattern must be a type"; + const char *e = "called match pattern must be a class"; _PyErr_Format(tstate, PyExc_TypeError, e); return NULL; } From 700ec657c80e78fb299963ffaa684c859ddb8f87 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Tue, 18 Apr 2023 16:19:23 -0700 Subject: [PATCH 201/349] gh-103596: [Enum] do not shadow mixed-in methods/attributes (GH-103600) For example: class Book(StrEnum): title = auto() author = auto() desc = auto() Book.author.desc is Book.desc but Book.author.title() == 'Author' is commonly expected. Using upper-case member names avoids this confusion and possible performance impacts. Co-authored-by: samypr100 <3933065+samypr100@users.noreply.github.com> --- Doc/howto/enum.rst | 14 ++- Doc/library/enum.rst | 7 +- Lib/enum.py | 86 +++++++++++-------- Lib/test/test_enum.py | 17 ++++ ...-04-17-14-47-28.gh-issue-103596.ME1y3_.rst | 2 + 5 files changed, 85 insertions(+), 41 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-17-14-47-28.gh-issue-103596.ME1y3_.rst diff --git a/Doc/howto/enum.rst b/Doc/howto/enum.rst index 56391a026cf889..68b75c529e92c7 100644 --- a/Doc/howto/enum.rst +++ b/Doc/howto/enum.rst @@ -36,8 +36,10 @@ inherits from :class:`Enum` itself. .. note:: Case of Enum Members - Because Enums are used to represent constants we recommend using - UPPER_CASE names for members, and will be using that style in our examples. + Because Enums are used to represent constants, and to help avoid issues + with name clashes between mixin-class methods/attributes and enum names, + we strongly recommend using UPPER_CASE names for members, and will be using + that style in our examples. Depending on the nature of the enum a member's value may or may not be important, but either way that value can be used to get the corresponding @@ -490,6 +492,10 @@ the :meth:`~Enum.__repr__` omits the inherited class' name. For example:: Use the :func:`!dataclass` argument ``repr=False`` to use the standard :func:`repr`. +.. versionchanged:: 3.12 + Only the dataclass fields are shown in the value area, not the dataclass' + name. + Pickling -------- @@ -992,7 +998,9 @@ but remain normal attributes. Enum members are instances of their enum class, and are normally accessed as ``EnumClass.member``. In certain situations, such as writing custom enum behavior, being able to access one member directly from another is useful, -and is supported. +and is supported; however, in order to avoid name clashes between member names +and attributes/methods from mixed-in classes, upper-case names are strongly +recommended. .. versionchanged:: 3.5 diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 07acf9da33e275..582e06261afd72 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -119,7 +119,8 @@ Module Contents :func:`~enum.property` Allows :class:`Enum` members to have attributes without conflicting with - member names. + member names. The ``value`` and ``name`` attributes are implemented this + way. :func:`unique` @@ -169,7 +170,7 @@ Data Types final *enum*, as well as creating the enum members, properly handling duplicates, providing iteration over the enum class, etc. - .. method:: EnumType.__call__(cls, value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None) + .. method:: EnumType.__call__(cls, value, names=None, \*, module=None, qualname=None, type=None, start=1, boundary=None) This method is called in two different ways: @@ -317,7 +318,7 @@ Data Types >>> PowersOfThree.SECOND.value 9 - .. method:: Enum.__init_subclass__(cls, **kwds) + .. method:: Enum.__init_subclass__(cls, \**kwds) A *classmethod* that is used to further configure subsequent subclasses. By default, does nothing. diff --git a/Lib/enum.py b/Lib/enum.py index e9f224a303d3e5..6e497f7ef6a7de 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -190,6 +190,8 @@ class property(DynamicClassAttribute): """ member = None + _attr_type = None + _cls_type = None def __get__(self, instance, ownerclass=None): if instance is None: @@ -199,33 +201,36 @@ def __get__(self, instance, ownerclass=None): raise AttributeError( '%r has no attribute %r' % (ownerclass, self.name) ) - else: - if self.fget is None: - # look for a member by this name. - try: - return ownerclass._member_map_[self.name] - except KeyError: - raise AttributeError( - '%r has no attribute %r' % (ownerclass, self.name) - ) from None - else: - return self.fget(instance) + if self.fget is not None: + # use previous enum.property + return self.fget(instance) + elif self._attr_type == 'attr': + # look up previous attibute + return getattr(self._cls_type, self.name) + elif self._attr_type == 'desc': + # use previous descriptor + return getattr(instance._value_, self.name) + # look for a member by this name. + try: + return ownerclass._member_map_[self.name] + except KeyError: + raise AttributeError( + '%r has no attribute %r' % (ownerclass, self.name) + ) from None def __set__(self, instance, value): - if self.fset is None: - raise AttributeError( - " cannot set attribute %r" % (self.clsname, self.name) - ) - else: + if self.fset is not None: return self.fset(instance, value) + raise AttributeError( + " cannot set attribute %r" % (self.clsname, self.name) + ) def __delete__(self, instance): - if self.fdel is None: - raise AttributeError( - " cannot delete attribute %r" % (self.clsname, self.name) - ) - else: + if self.fdel is not None: return self.fdel(instance) + raise AttributeError( + " cannot delete attribute %r" % (self.clsname, self.name) + ) def __set_name__(self, ownerclass, name): self.name = name @@ -313,27 +318,38 @@ def __set_name__(self, enum_class, member_name): enum_class._member_names_.append(member_name) # if necessary, get redirect in place and then add it to _member_map_ found_descriptor = None + descriptor_type = None + class_type = None for base in enum_class.__mro__[1:]: - descriptor = base.__dict__.get(member_name) - if descriptor is not None: - if isinstance(descriptor, (property, DynamicClassAttribute)): - found_descriptor = descriptor + attr = base.__dict__.get(member_name) + if attr is not None: + if isinstance(attr, (property, DynamicClassAttribute)): + found_descriptor = attr + class_type = base + descriptor_type = 'enum' break - elif ( - hasattr(descriptor, 'fget') and - hasattr(descriptor, 'fset') and - hasattr(descriptor, 'fdel') - ): - found_descriptor = descriptor + elif _is_descriptor(attr): + found_descriptor = attr + descriptor_type = descriptor_type or 'desc' + class_type = class_type or base continue + else: + descriptor_type = 'attr' + class_type = base if found_descriptor: redirect = property() redirect.member = enum_member redirect.__set_name__(enum_class, member_name) - # earlier descriptor found; copy fget, fset, fdel to this one. - redirect.fget = found_descriptor.fget - redirect.fset = found_descriptor.fset - redirect.fdel = found_descriptor.fdel + if descriptor_type in ('enum','desc'): + # earlier descriptor found; copy fget, fset, fdel to this one. + redirect.fget = getattr(found_descriptor, 'fget', None) + redirect._get = getattr(found_descriptor, '__get__', None) + redirect.fset = getattr(found_descriptor, 'fset', None) + redirect._set = getattr(found_descriptor, '__set__', None) + redirect.fdel = getattr(found_descriptor, 'fdel', None) + redirect._del = getattr(found_descriptor, '__delete__', None) + redirect._attr_type = descriptor_type + redirect._cls_type = class_type setattr(enum_class, member_name, redirect) else: setattr(enum_class, member_name, enum_member) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index e9dfcf8586a823..fb7a016c9007f8 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -819,10 +819,27 @@ class TestPlainFlag(_EnumTests, _PlainOutputTests, _FlagTests, unittest.TestCase class TestIntEnum(_EnumTests, _MinimalOutputTests, unittest.TestCase): enum_type = IntEnum + # + def test_shadowed_attr(self): + class Number(IntEnum): + divisor = 1 + numerator = 2 + # + self.assertEqual(Number.divisor.numerator, 1) + self.assertIs(Number.numerator.divisor, Number.divisor) class TestStrEnum(_EnumTests, _MinimalOutputTests, unittest.TestCase): enum_type = StrEnum + # + def test_shadowed_attr(self): + class Book(StrEnum): + author = 'author' + title = 'title' + # + self.assertEqual(Book.author.title(), 'Author') + self.assertEqual(Book.title.title(), 'Title') + self.assertIs(Book.title.author, Book.author) class TestIntFlag(_EnumTests, _MinimalOutputTests, _FlagTests, unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2023-04-17-14-47-28.gh-issue-103596.ME1y3_.rst b/Misc/NEWS.d/next/Library/2023-04-17-14-47-28.gh-issue-103596.ME1y3_.rst new file mode 100644 index 00000000000000..2fa27e60b58efe --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-17-14-47-28.gh-issue-103596.ME1y3_.rst @@ -0,0 +1,2 @@ +Attributes/methods are no longer shadowed by same-named enum members, +although they may be shadowed by enum.property's. From ffdbfe197694cb6f2509b94859ccf3534daa6fd1 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 18 Apr 2023 20:30:54 -0600 Subject: [PATCH 202/349] gh-103617: Fix compiler warning in _iomodule.c (#103618) --- Modules/_io/_iomodule.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c index 5644cc05c45800..7f4f1d939fb7e9 100644 --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -616,8 +616,9 @@ iomodule_clear(PyObject *mod) { } static void -iomodule_free(PyObject *mod) { - iomodule_clear(mod); +iomodule_free(void *mod) +{ + (void)iomodule_clear((PyObject *)mod); } From e989e0b62aba9b487faf24d8694d28022d35a776 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 18 Apr 2023 21:08:16 -0600 Subject: [PATCH 203/349] gh-103583: Always pass multibyte codec structs as const (#103588) --- Modules/cjkcodecs/multibytecodec.c | 10 +++++----- Modules/cjkcodecs/multibytecodec.h | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 55778cdb59e4dc..c42daefbd32813 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -67,7 +67,7 @@ typedef struct { static char *incnewkwarglist[] = {"errors", NULL}; static char *streamkwarglist[] = {"stream", "errors", NULL}; -static PyObject *multibytecodec_encode(MultibyteCodec *, +static PyObject *multibytecodec_encode(const MultibyteCodec *, MultibyteCodec_State *, PyObject *, Py_ssize_t *, PyObject *, int); @@ -221,7 +221,7 @@ expand_encodebuffer(MultibyteEncodeBuffer *buf, Py_ssize_t esize) */ static int -multibytecodec_encerror(MultibyteCodec *codec, +multibytecodec_encerror(const MultibyteCodec *codec, MultibyteCodec_State *state, MultibyteEncodeBuffer *buf, PyObject *errors, Py_ssize_t e) @@ -375,7 +375,7 @@ multibytecodec_encerror(MultibyteCodec *codec, } static int -multibytecodec_decerror(MultibyteCodec *codec, +multibytecodec_decerror(const MultibyteCodec *codec, MultibyteCodec_State *state, MultibyteDecodeBuffer *buf, PyObject *errors, Py_ssize_t e) @@ -479,7 +479,7 @@ multibytecodec_decerror(MultibyteCodec *codec, } static PyObject * -multibytecodec_encode(MultibyteCodec *codec, +multibytecodec_encode(const MultibyteCodec *codec, MultibyteCodec_State *state, PyObject *text, Py_ssize_t *inpos_t, PyObject *errors, int flags) @@ -1953,7 +1953,7 @@ _multibytecodec___create_codec(PyObject *module, PyObject *arg) /*[clinic end generated code: output=cfa3dce8260e809d input=6840b2a6b183fcfa]*/ { MultibyteCodecObject *self; - MultibyteCodec *codec; + const MultibyteCodec *codec; if (!PyCapsule_IsValid(arg, PyMultibyteCodec_CAPSULE_NAME)) { PyErr_SetString(PyExc_ValueError, "argument type invalid"); diff --git a/Modules/cjkcodecs/multibytecodec.h b/Modules/cjkcodecs/multibytecodec.h index 69404ba96aa1f0..a6ab9cbe61a266 100644 --- a/Modules/cjkcodecs/multibytecodec.h +++ b/Modules/cjkcodecs/multibytecodec.h @@ -62,14 +62,14 @@ typedef struct { typedef struct { PyObject_HEAD - MultibyteCodec *codec; + const MultibyteCodec *codec; } MultibyteCodecObject; #define MultibyteCodec_Check(state, op) Py_IS_TYPE((op), state->multibytecodec_type) #define _MultibyteStatefulCodec_HEAD \ PyObject_HEAD \ - MultibyteCodec *codec; \ + const MultibyteCodec *codec; \ MultibyteCodec_State state; \ PyObject *errors; typedef struct { From f4d087964e3deaabc902a155efdf0e7f43f78d52 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Wed, 19 Apr 2023 08:02:48 +0300 Subject: [PATCH 204/349] gh-103582: Remove last references to `argparse.REMAINDER` from docs (#103586) --- Doc/library/argparse.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index ee68ac58d3de75..dd59181a30702e 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -67,7 +67,7 @@ default_ Default value used when an argument is not provided dest_ Specify the attribute name used in the result namespace help_ Help message for an argument metavar_ Alternate display name for the argument as shown in help -nargs_ Number of times the argument can be used :class:`int`, ``'?'``, ``'*'``, ``'+'``, or ``argparse.REMAINDER`` +nargs_ Number of times the argument can be used :class:`int`, ``'?'``, ``'*'``, or ``'+'`` required_ Indicate whether an argument is required or optional ``True`` or ``False`` type_ Automatically convert an argument to the given type :class:`int`, :class:`float`, ``argparse.FileType('w')``, or callable function ====================== =========================================================== ========================================================================================================================== @@ -2218,7 +2218,7 @@ support this parsing style. These parsers do not support all the argparse features, and will raise exceptions if unsupported features are used. In particular, subparsers, -``argparse.REMAINDER``, and mutually exclusive groups that include both +and mutually exclusive groups that include both optionals and positionals are not supported. The following example shows the difference between From d1e4917e06d5638f1a7fa189d6d63ec9c2a27753 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Wed, 19 Apr 2023 06:05:52 +0100 Subject: [PATCH 205/349] gh-102778: IDLE - make sys.last_exc available in Shell after traceback (#103314) --------- Co-authored-by: Terry Jan Reedy --- Lib/idlelib/run.py | 1 + .../next/Library/2023-04-06-16-55-51.gh-issue-102778.BWeAmE.rst | 1 + 2 files changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2023-04-06-16-55-51.gh-issue-102778.BWeAmE.rst diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 577c49eb67b20d..04ce615621ee7c 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -239,6 +239,7 @@ def print_exception(): efile = sys.stderr typ, val, tb = excinfo = sys.exc_info() sys.last_type, sys.last_value, sys.last_traceback = excinfo + sys.last_exc = val seen = set() def print_exc(typ, exc, tb): diff --git a/Misc/NEWS.d/next/Library/2023-04-06-16-55-51.gh-issue-102778.BWeAmE.rst b/Misc/NEWS.d/next/Library/2023-04-06-16-55-51.gh-issue-102778.BWeAmE.rst new file mode 100644 index 00000000000000..64ae5b5b6d564b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-06-16-55-51.gh-issue-102778.BWeAmE.rst @@ -0,0 +1 @@ +Support ``sys.last_exc`` in :mod:`idlelib`. From da2273fec7b1644786b9616592b53b04fdec4024 Mon Sep 17 00:00:00 2001 From: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> Date: Wed, 19 Apr 2023 15:51:53 +0530 Subject: [PATCH 206/349] GH-88342: clarify that `asyncio.as_completed` accepts generators yielding tasks (#103626) --- Doc/library/asyncio-task.rst | 3 +++ Doc/whatsnew/3.12.rst | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index 41d09e1e79705c..b81d89acf7fd88 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -829,6 +829,9 @@ Waiting Primitives Deprecation warning is emitted if not all awaitable objects in the *aws* iterable are Future-like objects and there is no running event loop. + .. versionchanged:: 3.12 + Added support for generators yielding tasks. + Running in Threads ================== diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index bd95bfeea80c71..b3bb065741d037 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -250,7 +250,8 @@ asyncio :mod:`asyncio` does not support legacy generator-based coroutines. (Contributed by Kumar Aditya in :gh:`102748`.) -* :func:`asyncio.wait` now accepts generators yielding tasks. +* :func:`asyncio.wait` and :func:`asyncio.as_completed` now accepts generators + yielding tasks. (Contributed by Kumar Aditya in :gh:`78530`.) csv From bd2ed066c855dadbc739e89f9bc32e218dfc904e Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Wed, 19 Apr 2023 08:15:50 -0600 Subject: [PATCH 207/349] gh-83004: Harden msvcrt further (#103420) --- PC/msvcrtmodule.c | 115 +++++++++++++++++++++------------------------- 1 file changed, 53 insertions(+), 62 deletions(-) diff --git a/PC/msvcrtmodule.c b/PC/msvcrtmodule.c index de9a88946aff3e..090254befc934d 100644 --- a/PC/msvcrtmodule.c +++ b/PC/msvcrtmodule.c @@ -564,88 +564,81 @@ static struct PyMethodDef msvcrt_functions[] = { {NULL, NULL} }; -static void -insertint(PyObject *d, char *name, int value) -{ - PyObject *v = PyLong_FromLong((long) value); - if (v == NULL) { - /* Don't bother reporting this error */ - PyErr_Clear(); - } - else { - PyDict_SetItemString(d, name, v); - Py_DECREF(v); - } -} - -static void -insertptr(PyObject *d, char *name, void *value) +static int +insertptr(PyObject *mod, char *name, void *value) { PyObject *v = PyLong_FromVoidPtr(value); if (v == NULL) { - /* Don't bother reporting this error */ - PyErr_Clear(); - } - else { - PyDict_SetItemString(d, name, v); - Py_DECREF(v); + return -1; } + int rc = PyModule_AddObjectRef(mod, name, v); + Py_DECREF(v); + return rc; } +#define INSERTINT(MOD, NAME, VAL) do { \ + if (PyModule_AddIntConstant(MOD, NAME, VAL) < 0) { \ + return -1; \ + } \ +} while (0) + +#define INSERTPTR(MOD, NAME, PTR) do { \ + if (insertptr(MOD, NAME, PTR) < 0) { \ + return -1; \ + } \ +} while (0) + +#define INSERTSTR(MOD, NAME, CONST) do { \ + if (PyModule_AddStringConstant(MOD, NAME, CONST) < 0) { \ + return -1; \ + } \ +} while (0) + static int exec_module(PyObject* m) { - int st; - PyObject *d = PyModule_GetDict(m); // Borrowed ref. - /* constants for the locking() function's mode argument */ - insertint(d, "LK_LOCK", _LK_LOCK); - insertint(d, "LK_NBLCK", _LK_NBLCK); - insertint(d, "LK_NBRLCK", _LK_NBRLCK); - insertint(d, "LK_RLCK", _LK_RLCK); - insertint(d, "LK_UNLCK", _LK_UNLCK); + INSERTINT(m, "LK_LOCK", _LK_LOCK); + INSERTINT(m, "LK_NBLCK", _LK_NBLCK); + INSERTINT(m, "LK_NBRLCK", _LK_NBRLCK); + INSERTINT(m, "LK_RLCK", _LK_RLCK); + INSERTINT(m, "LK_UNLCK", _LK_UNLCK); #ifdef MS_WINDOWS_DESKTOP - insertint(d, "SEM_FAILCRITICALERRORS", SEM_FAILCRITICALERRORS); - insertint(d, "SEM_NOALIGNMENTFAULTEXCEPT", SEM_NOALIGNMENTFAULTEXCEPT); - insertint(d, "SEM_NOGPFAULTERRORBOX", SEM_NOGPFAULTERRORBOX); - insertint(d, "SEM_NOOPENFILEERRORBOX", SEM_NOOPENFILEERRORBOX); + INSERTINT(m, "SEM_FAILCRITICALERRORS", SEM_FAILCRITICALERRORS); + INSERTINT(m, "SEM_NOALIGNMENTFAULTEXCEPT", SEM_NOALIGNMENTFAULTEXCEPT); + INSERTINT(m, "SEM_NOGPFAULTERRORBOX", SEM_NOGPFAULTERRORBOX); + INSERTINT(m, "SEM_NOOPENFILEERRORBOX", SEM_NOOPENFILEERRORBOX); #endif #ifdef _DEBUG - insertint(d, "CRT_WARN", _CRT_WARN); - insertint(d, "CRT_ERROR", _CRT_ERROR); - insertint(d, "CRT_ASSERT", _CRT_ASSERT); - insertint(d, "CRTDBG_MODE_DEBUG", _CRTDBG_MODE_DEBUG); - insertint(d, "CRTDBG_MODE_FILE", _CRTDBG_MODE_FILE); - insertint(d, "CRTDBG_MODE_WNDW", _CRTDBG_MODE_WNDW); - insertint(d, "CRTDBG_REPORT_MODE", _CRTDBG_REPORT_MODE); - insertptr(d, "CRTDBG_FILE_STDERR", _CRTDBG_FILE_STDERR); - insertptr(d, "CRTDBG_FILE_STDOUT", _CRTDBG_FILE_STDOUT); - insertptr(d, "CRTDBG_REPORT_FILE", _CRTDBG_REPORT_FILE); + INSERTINT(m, "CRT_WARN", _CRT_WARN); + INSERTINT(m, "CRT_ERROR", _CRT_ERROR); + INSERTINT(m, "CRT_ASSERT", _CRT_ASSERT); + INSERTINT(m, "CRTDBG_MODE_DEBUG", _CRTDBG_MODE_DEBUG); + INSERTINT(m, "CRTDBG_MODE_FILE", _CRTDBG_MODE_FILE); + INSERTINT(m, "CRTDBG_MODE_WNDW", _CRTDBG_MODE_WNDW); + INSERTINT(m, "CRTDBG_REPORT_MODE", _CRTDBG_REPORT_MODE); + INSERTPTR(m, "CRTDBG_FILE_STDERR", _CRTDBG_FILE_STDERR); + INSERTPTR(m, "CRTDBG_FILE_STDOUT", _CRTDBG_FILE_STDOUT); + INSERTPTR(m, "CRTDBG_REPORT_FILE", _CRTDBG_REPORT_FILE); #endif +#undef INSERTINT +#undef INSERTPTR + /* constants for the crt versions */ #ifdef _VC_ASSEMBLY_PUBLICKEYTOKEN - st = PyModule_AddStringConstant(m, "VC_ASSEMBLY_PUBLICKEYTOKEN", - _VC_ASSEMBLY_PUBLICKEYTOKEN); - if (st < 0) { - return -1; - } + INSERTSTR(m, "VC_ASSEMBLY_PUBLICKEYTOKEN", _VC_ASSEMBLY_PUBLICKEYTOKEN); #endif #ifdef _CRT_ASSEMBLY_VERSION - st = PyModule_AddStringConstant(m, "CRT_ASSEMBLY_VERSION", - _CRT_ASSEMBLY_VERSION); - if (st < 0) { - return -1; - } + INSERTSTR(m, "CRT_ASSEMBLY_VERSION", _CRT_ASSEMBLY_VERSION); #endif #ifdef __LIBRARIES_ASSEMBLY_NAME_PREFIX - st = PyModule_AddStringConstant(m, "LIBRARIES_ASSEMBLY_NAME_PREFIX", - __LIBRARIES_ASSEMBLY_NAME_PREFIX); - if (st < 0) { - return -1; - } + INSERTSTR(m, "LIBRARIES_ASSEMBLY_NAME_PREFIX", + __LIBRARIES_ASSEMBLY_NAME_PREFIX); #endif +#undef INSERTSTR + /* constants for the 2010 crt versions */ #if defined(_VC_CRT_MAJOR_VERSION) && defined (_VC_CRT_MINOR_VERSION) && defined(_VC_CRT_BUILD_VERSION) && defined(_VC_CRT_RBUILD_VERSION) PyObject *version = PyUnicode_FromFormat("%d.%d.%d.%d", @@ -656,14 +649,12 @@ exec_module(PyObject* m) if (version == NULL) { return -1; } - st = PyModule_AddObjectRef(m, "CRT_ASSEMBLY_VERSION", version); + int st = PyModule_AddObjectRef(m, "CRT_ASSEMBLY_VERSION", version); Py_DECREF(version); if (st < 0) { return -1; } #endif - /* make compiler warning quiet if st is unused */ - (void)st; return 0; } From a6b07b5a345f7f54ee9f6d75e81d2fb55971b35c Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Wed, 19 Apr 2023 10:02:17 -0600 Subject: [PATCH 208/349] gh-103583: Add ref. dependency between multibytecodec modules (#103589) --- Modules/cjkcodecs/cjkcodecs.h | 44 ++++++++++++++++++++++++------ Modules/cjkcodecs/multibytecodec.c | 19 ++++++++++--- Modules/cjkcodecs/multibytecodec.h | 9 +++++- 3 files changed, 58 insertions(+), 14 deletions(-) diff --git a/Modules/cjkcodecs/cjkcodecs.h b/Modules/cjkcodecs/cjkcodecs.h index 646a9fd255ce20..1b0355310eddab 100644 --- a/Modules/cjkcodecs/cjkcodecs.h +++ b/Modules/cjkcodecs/cjkcodecs.h @@ -284,18 +284,45 @@ getmultibytecodec(void) return _PyImport_GetModuleAttrString("_multibytecodec", "__create_codec"); } +static void +destroy_codec_capsule(PyObject *capsule) +{ + void *ptr = PyCapsule_GetPointer(capsule, CODEC_CAPSULE); + codec_capsule *data = (codec_capsule *)ptr; + Py_DECREF(data->cjk_module); + PyMem_Free(ptr); +} + +static codec_capsule * +capsulate_codec(PyObject *mod, const MultibyteCodec *codec) +{ + codec_capsule *data = PyMem_Malloc(sizeof(codec_capsule)); + if (data == NULL) { + PyErr_NoMemory(); + return NULL; + } + data->codec = codec; + data->cjk_module = Py_NewRef(mod); + return data; +} + static PyObject * -_getcodec(const MultibyteCodec *codec) +_getcodec(PyObject *self, const MultibyteCodec *codec) { PyObject *cofunc = getmultibytecodec(); if (cofunc == NULL) { return NULL; } - PyObject *codecobj = PyCapsule_New((void *)codec, - PyMultibyteCodec_CAPSULE_NAME, - NULL); + codec_capsule *data = capsulate_codec(self, codec); + if (data == NULL) { + Py_DECREF(cofunc); + return NULL; + } + PyObject *codecobj = PyCapsule_New(data, CODEC_CAPSULE, + destroy_codec_capsule); if (codecobj == NULL) { + PyMem_Free(data); Py_DECREF(cofunc); return NULL; } @@ -323,7 +350,7 @@ getcodec(PyObject *self, PyObject *encoding) for (int i = 0; i < st->num_codecs; i++) { const MultibyteCodec *codec = &st->codec_list[i]; if (strcmp(codec->encoding, enc) == 0) { - return _getcodec(codec); + return _getcodec(self, codec); } } @@ -352,8 +379,7 @@ register_maps(PyObject *module) char mhname[256] = "__map_"; strcpy(mhname + sizeof("__map_") - 1, h->charset); - PyObject *capsule = PyCapsule_New((void *)h, - PyMultibyteCodec_CAPSULE_NAME, NULL); + PyObject *capsule = PyCapsule_New((void *)h, MAP_CAPSULE, NULL); if (capsule == NULL) { return -1; } @@ -417,14 +443,14 @@ importmap(const char *modname, const char *symbol, o = PyObject_GetAttrString(mod, symbol); if (o == NULL) goto errorexit; - else if (!PyCapsule_IsValid(o, PyMultibyteCodec_CAPSULE_NAME)) { + else if (!PyCapsule_IsValid(o, MAP_CAPSULE)) { PyErr_SetString(PyExc_ValueError, "map data must be a Capsule."); goto errorexit; } else { struct dbcs_map *map; - map = PyCapsule_GetPointer(o, PyMultibyteCodec_CAPSULE_NAME); + map = PyCapsule_GetPointer(o, MAP_CAPSULE); if (encmap != NULL) *encmap = map->encmap; if (decmap != NULL) diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index c42daefbd32813..8976ad331aaa2a 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -720,9 +720,17 @@ static struct PyMethodDef multibytecodec_methods[] = { }; static int -multibytecodec_traverse(PyObject *self, visitproc visit, void *arg) +multibytecodec_clear(MultibyteCodecObject *self) +{ + Py_CLEAR(self->cjk_module); + return 0; +} + +static int +multibytecodec_traverse(MultibyteCodecObject *self, visitproc visit, void *arg) { Py_VISIT(Py_TYPE(self)); + Py_VISIT(self->cjk_module); return 0; } @@ -731,6 +739,7 @@ multibytecodec_dealloc(MultibyteCodecObject *self) { PyObject_GC_UnTrack(self); PyTypeObject *tp = Py_TYPE(self); + (void)multibytecodec_clear(self); tp->tp_free(self); Py_DECREF(tp); } @@ -740,6 +749,7 @@ static PyType_Slot multibytecodec_slots[] = { {Py_tp_getattro, PyObject_GenericGetAttr}, {Py_tp_methods, multibytecodec_methods}, {Py_tp_traverse, multibytecodec_traverse}, + {Py_tp_clear, multibytecodec_clear}, {0, NULL}, }; @@ -1953,14 +1963,14 @@ _multibytecodec___create_codec(PyObject *module, PyObject *arg) /*[clinic end generated code: output=cfa3dce8260e809d input=6840b2a6b183fcfa]*/ { MultibyteCodecObject *self; - const MultibyteCodec *codec; - if (!PyCapsule_IsValid(arg, PyMultibyteCodec_CAPSULE_NAME)) { + if (!PyCapsule_IsValid(arg, CODEC_CAPSULE)) { PyErr_SetString(PyExc_ValueError, "argument type invalid"); return NULL; } - codec = PyCapsule_GetPointer(arg, PyMultibyteCodec_CAPSULE_NAME); + codec_capsule *data = PyCapsule_GetPointer(arg, CODEC_CAPSULE); + const MultibyteCodec *codec = data->codec; if (codec->codecinit != NULL && codec->codecinit(codec->config) != 0) return NULL; @@ -1969,6 +1979,7 @@ _multibytecodec___create_codec(PyObject *module, PyObject *arg) if (self == NULL) return NULL; self->codec = codec; + self->cjk_module = Py_NewRef(data->cjk_module); PyObject_GC_Track(self); return (PyObject *)self; diff --git a/Modules/cjkcodecs/multibytecodec.h b/Modules/cjkcodecs/multibytecodec.h index a6ab9cbe61a266..327cb51129d945 100644 --- a/Modules/cjkcodecs/multibytecodec.h +++ b/Modules/cjkcodecs/multibytecodec.h @@ -63,6 +63,7 @@ typedef struct { typedef struct { PyObject_HEAD const MultibyteCodec *codec; + PyObject *cjk_module; } MultibyteCodecObject; #define MultibyteCodec_Check(state, op) Py_IS_TYPE((op), state->multibytecodec_type) @@ -130,7 +131,13 @@ typedef struct { #define MBENC_FLUSH 0x0001 /* encode all characters encodable */ #define MBENC_MAX MBENC_FLUSH -#define PyMultibyteCodec_CAPSULE_NAME "multibytecodec.__map_*" +typedef struct { + const MultibyteCodec *codec; + PyObject *cjk_module; +} codec_capsule; + +#define MAP_CAPSULE "multibytecodec.map" +#define CODEC_CAPSULE "multibytecodec.codec" #ifdef __cplusplus From 1ef61cf71a218c71860ff6aecf0fd51edb8b65dc Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Wed, 19 Apr 2023 17:18:16 +0100 Subject: [PATCH 209/349] gh-102856: Initial implementation of PEP 701 (#102855) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Lysandros Nikolaou Co-authored-by: Batuhan Taskaya Co-authored-by: Marta Gómez Macías Co-authored-by: sunmy2019 <59365878+sunmy2019@users.noreply.github.com> --- Doc/library/token-list.inc | 10 + Grammar/Tokens | 4 + Grammar/python.gram | 54 +- Include/internal/pycore_token.h | 22 +- Lib/test/test_ast.py | 5 - Lib/test/test_cmd_line_script.py | 6 +- Lib/test/test_eof.py | 4 +- Lib/test/test_exceptions.py | 3 +- Lib/test/test_fstring.py | 311 +- Lib/test/test_tokenize.py | 28 +- Lib/test/test_type_comments.py | 2 +- Lib/token.py | 27 +- ...-04-17-16-00-32.gh-issue-102856.UunJ7y.rst | 1 + Parser/action_helpers.c | 539 +- Parser/parser.c | 7846 +++++++++++------ Parser/pegen.c | 2 +- Parser/pegen.h | 18 +- Parser/pegen_errors.c | 16 +- Parser/string_parser.c | 1089 +-- Parser/string_parser.h | 39 +- Parser/token.c | 5 + Parser/tokenizer.c | 489 +- Parser/tokenizer.h | 29 + Programs/test_frozenmain.h | 8 +- Python/Python-tokenize.c | 4 +- Tools/build/generate_token.py | 2 + Tools/peg_generator/pegen/c_generator.py | 1 + 27 files changed, 6425 insertions(+), 4139 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-04-17-16-00-32.gh-issue-102856.UunJ7y.rst diff --git a/Doc/library/token-list.inc b/Doc/library/token-list.inc index 2739d5bfc1dfa2..3b345099bf54b5 100644 --- a/Doc/library/token-list.inc +++ b/Doc/library/token-list.inc @@ -201,6 +201,10 @@ Token value for ``":="``. +.. data:: EXCLAMATION + + Token value for ``"!"``. + .. data:: OP .. data:: AWAIT @@ -213,6 +217,12 @@ .. data:: SOFT_KEYWORD +.. data:: FSTRING_START + +.. data:: FSTRING_MIDDLE + +.. data:: FSTRING_END + .. data:: ERRORTOKEN .. data:: N_TOKENS diff --git a/Grammar/Tokens b/Grammar/Tokens index 1f3e3b09913653..096876fdd130f8 100644 --- a/Grammar/Tokens +++ b/Grammar/Tokens @@ -53,6 +53,7 @@ ATEQUAL '@=' RARROW '->' ELLIPSIS '...' COLONEQUAL ':=' +EXCLAMATION '!' OP AWAIT @@ -60,6 +61,9 @@ ASYNC TYPE_IGNORE TYPE_COMMENT SOFT_KEYWORD +FSTRING_START +FSTRING_MIDDLE +FSTRING_END ERRORTOKEN # These aren't used by the C tokenizer but are needed for tokenize.py diff --git a/Grammar/python.gram b/Grammar/python.gram index 2498251293e80e..3a356c65a75195 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -194,7 +194,7 @@ yield_stmt[stmt_ty]: y=yield_expr { _PyAST_Expr(y, EXTRA) } assert_stmt[stmt_ty]: 'assert' a=expression b=[',' z=expression { z }] { _PyAST_Assert(a, b, EXTRA) } -import_stmt[stmt_ty]: +import_stmt[stmt_ty]: | invalid_import | import_name | import_from @@ -415,8 +415,8 @@ try_stmt[stmt_ty]: | invalid_try_stmt | 'try' &&':' b=block f=finally_block { _PyAST_Try(b, NULL, NULL, f, EXTRA) } | 'try' &&':' b=block ex[asdl_excepthandler_seq*]=except_block+ el=[else_block] f=[finally_block] { _PyAST_Try(b, ex, el, f, EXTRA) } - | 'try' &&':' b=block ex[asdl_excepthandler_seq*]=except_star_block+ el=[else_block] f=[finally_block] { - CHECK_VERSION(stmt_ty, 11, "Exception groups are", + | 'try' &&':' b=block ex[asdl_excepthandler_seq*]=except_star_block+ el=[else_block] f=[finally_block] { + CHECK_VERSION(stmt_ty, 11, "Exception groups are", _PyAST_TryStar(b, ex, el, f, EXTRA)) } @@ -807,7 +807,7 @@ atom[expr_ty]: | 'True' { _PyAST_Constant(Py_True, NULL, EXTRA) } | 'False' { _PyAST_Constant(Py_False, NULL, EXTRA) } | 'None' { _PyAST_Constant(Py_None, NULL, EXTRA) } - | &STRING strings + | &(STRING|FSTRING_START) strings | NUMBER | &'(' (tuple | group | genexp) | &'[' (list | listcomp) @@ -877,7 +877,26 @@ lambda_param[arg_ty]: a=NAME { _PyAST_arg(a->v.Name.id, NULL, NULL, EXTRA) } # LITERALS # ======== -strings[expr_ty] (memo): a=STRING+ { _PyPegen_concatenate_strings(p, a) } +fstring_middle[expr_ty]: + | fstring_replacement_field + | t=FSTRING_MIDDLE { _PyPegen_constant_from_token(p, t) } +fstring_replacement_field[expr_ty]: + | '{' a=(yield_expr | star_expressions) debug_expr="="? conversion=[fstring_conversion] format=[fstring_full_format_spec] '}' { + _PyPegen_formatted_value(p, a, debug_expr, conversion, format, EXTRA) + } + | invalid_replacement_field +fstring_conversion[expr_ty]: + | conv_token="!" conv=NAME { _PyPegen_check_fstring_conversion(p, conv_token, conv) } +fstring_full_format_spec[expr_ty]: + | ':' spec=fstring_format_spec* { spec ? _PyAST_JoinedStr((asdl_expr_seq*)spec, EXTRA) : NULL } +fstring_format_spec[expr_ty]: + | t=FSTRING_MIDDLE { _PyPegen_constant_from_token(p, t) } + | fstring_replacement_field +fstring[expr_ty]: + | a=FSTRING_START b=fstring_middle* c=FSTRING_END { _PyPegen_joined_str(p, a, (asdl_expr_seq*)b, c) } + +string[expr_ty]: s[Token*]=STRING { _PyPegen_constant_from_string(p, s) } +strings[expr_ty] (memo): a[asdl_expr_seq*]=(fstring|string)+ { _PyPegen_concatenate_strings(p, a, EXTRA) } list[expr_ty]: | '[' a=[star_named_expressions] ']' { _PyAST_List(a, Load, EXTRA) } @@ -1118,6 +1137,8 @@ invalid_expression: _PyPegen_check_legacy_stmt(p, a) ? NULL : p->tokens[p->mark-1]->level == 0 ? NULL : RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Perhaps you forgot a comma?") } | a=disjunction 'if' b=disjunction !('else'|':') { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "expected 'else' after 'if' expression") } + | a='lambda' [lambda_params] b=':' &(FSTRING_MIDDLE | fstring_replacement_field) { + RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "f-string: lambda expressions are not allowed without parentheses") } invalid_named_expression(memo): | a=expression ':=' expression { @@ -1241,7 +1262,7 @@ invalid_group: invalid_import: | a='import' dotted_name 'from' dotted_name { RAISE_SYNTAX_ERROR_STARTING_FROM(a, "Did you mean to use 'from ... import ...' instead?") } - + invalid_import_from_targets: | import_from_as_names ',' NEWLINE { RAISE_SYNTAX_ERROR("trailing comma not allowed without surrounding parentheses") } @@ -1335,3 +1356,24 @@ invalid_kvpair: | expression a=':' &('}'|',') {RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expression expected after dictionary key and ':'") } invalid_starred_expression: | a='*' expression '=' b=expression { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "cannot assign to iterable argument unpacking") } +invalid_replacement_field: + | '{' a='=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before '='") } + | '{' a='!' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before '!'") } + | '{' a=':' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before ':'") } + | '{' a='}' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before '}'") } + | '{' !(yield_expr | star_expressions) { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting a valid expression after '{'")} + | '{' (yield_expr | star_expressions) !('=' | '!' | ':' | '}') { + PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '=', or '!', or ':', or '}'") } + | '{' (yield_expr | star_expressions) '=' !('!' | ':' | '}') { + PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '!', or ':', or '}'") } + | '{' (yield_expr | star_expressions) '='? invalid_conversion_character + | '{' (yield_expr | star_expressions) '='? ['!' NAME] !(':' | '}') { + PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting ':' or '}'") } + | '{' (yield_expr | star_expressions) '='? ['!' NAME] ':' fstring_format_spec* !'}' { + PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '}', or format specs") } + | '{' (yield_expr | star_expressions) '='? ['!' NAME] !'}' { + PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '}'") } + +invalid_conversion_character: + | '!' &(':' | '}') { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: missing conversion character") } + | '!' !NAME { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: invalid conversion character") } diff --git a/Include/internal/pycore_token.h b/Include/internal/pycore_token.h index 95459ab9f7d004..b9df8766736adf 100644 --- a/Include/internal/pycore_token.h +++ b/Include/internal/pycore_token.h @@ -67,14 +67,18 @@ extern "C" { #define RARROW 51 #define ELLIPSIS 52 #define COLONEQUAL 53 -#define OP 54 -#define AWAIT 55 -#define ASYNC 56 -#define TYPE_IGNORE 57 -#define TYPE_COMMENT 58 -#define SOFT_KEYWORD 59 -#define ERRORTOKEN 60 -#define N_TOKENS 64 +#define EXCLAMATION 54 +#define OP 55 +#define AWAIT 56 +#define ASYNC 57 +#define TYPE_IGNORE 58 +#define TYPE_COMMENT 59 +#define SOFT_KEYWORD 60 +#define FSTRING_START 61 +#define FSTRING_MIDDLE 62 +#define FSTRING_END 63 +#define ERRORTOKEN 64 +#define N_TOKENS 68 #define NT_OFFSET 256 /* Special definitions for cooperation with parser */ @@ -86,6 +90,8 @@ extern "C" { (x) == NEWLINE || \ (x) == INDENT || \ (x) == DEDENT) +#define ISSTRINGLIT(x) ((x) == STRING || \ + (x) == FSTRING_MIDDLE) // Symbols exported for test_peg_generator diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index 6c932e1305e1dd..a579bfd7930784 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -774,11 +774,6 @@ def test_parenthesized_with_feature_version(self): ast.parse('with (CtxManager() as example): ...', feature_version=(3, 8)) ast.parse('with CtxManager() as example: ...', feature_version=(3, 8)) - def test_debug_f_string_feature_version(self): - ast.parse('f"{x=}"', feature_version=(3, 8)) - with self.assertRaises(SyntaxError): - ast.parse('f"{x=}"', feature_version=(3, 7)) - def test_assignment_expression_feature_version(self): ast.parse('(x := 0)', feature_version=(3, 8)) with self.assertRaises(SyntaxError): diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index f10d72ea5547ee..d98e23855e0c19 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -636,9 +636,9 @@ def test_syntaxerror_multi_line_fstring(self): self.assertEqual( stderr.splitlines()[-3:], [ - b' foo"""', - b' ^', - b'SyntaxError: f-string: empty expression not allowed', + b' foo = f"""{}', + b' ^', + b'SyntaxError: f-string: valid expression required before \'}\'', ], ) diff --git a/Lib/test/test_eof.py b/Lib/test/test_eof.py index abcbf046e2cc22..be4fd73bfdc36b 100644 --- a/Lib/test/test_eof.py +++ b/Lib/test/test_eof.py @@ -4,6 +4,7 @@ from test import support from test.support import os_helper from test.support import script_helper +from test.support import warnings_helper import unittest class EOFTestCase(unittest.TestCase): @@ -36,10 +37,11 @@ def test_EOFS_with_file(self): rc, out, err = script_helper.assert_python_failure(file_name) self.assertIn(b'unterminated triple-quoted string literal (detected at line 3)', err) + @warnings_helper.ignore_warnings(category=SyntaxWarning) def test_eof_with_line_continuation(self): expect = "unexpected EOF while parsing (, line 1)" try: - compile('"\\xhh" \\', '', 'exec', dont_inherit=True) + compile('"\\Xhh" \\', '', 'exec') except SyntaxError as msg: self.assertEqual(str(msg), expect) else: diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 684e888f08c778..4ef7decfbc263e 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -155,6 +155,7 @@ def ckmsg(src, msg): ckmsg(s, "'continue' not properly in loop") ckmsg("continue\n", "'continue' not properly in loop") + ckmsg("f'{6 0}'", "invalid syntax. Perhaps you forgot a comma?") def testSyntaxErrorMissingParens(self): def ckmsg(src, msg, exception=SyntaxError): @@ -227,7 +228,7 @@ def testSyntaxErrorOffset(self): check('Python = "\u1e54\xfd\u0163\u0125\xf2\xf1" +', 1, 20) check(b'# -*- coding: cp1251 -*-\nPython = "\xcf\xb3\xf2\xee\xed" +', 2, 19, encoding='cp1251') - check(b'Python = "\xcf\xb3\xf2\xee\xed" +', 1, 18) + check(b'Python = "\xcf\xb3\xf2\xee\xed" +', 1, 10) check('x = "a', 1, 5) check('lambda x: x = 2', 1, 1) check('f{a + b + c}', 1, 2) diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index b3f6ef41d77b8f..f571233da07b78 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -329,13 +329,13 @@ def test_ast_line_numbers_multiline_fstring(self): self.assertEqual(t.body[1].lineno, 3) self.assertEqual(t.body[1].value.lineno, 3) self.assertEqual(t.body[1].value.values[0].lineno, 3) - self.assertEqual(t.body[1].value.values[1].lineno, 3) - self.assertEqual(t.body[1].value.values[2].lineno, 3) + self.assertEqual(t.body[1].value.values[1].lineno, 4) + self.assertEqual(t.body[1].value.values[2].lineno, 6) self.assertEqual(t.body[1].col_offset, 0) self.assertEqual(t.body[1].value.col_offset, 0) - self.assertEqual(t.body[1].value.values[0].col_offset, 0) - self.assertEqual(t.body[1].value.values[1].col_offset, 0) - self.assertEqual(t.body[1].value.values[2].col_offset, 0) + self.assertEqual(t.body[1].value.values[0].col_offset, 4) + self.assertEqual(t.body[1].value.values[1].col_offset, 2) + self.assertEqual(t.body[1].value.values[2].col_offset, 11) # NOTE: the following lineno information and col_offset is correct for # expressions within FormattedValues. binop = t.body[1].value.values[1].value @@ -366,13 +366,13 @@ def test_ast_line_numbers_multiline_fstring(self): self.assertEqual(t.body[0].lineno, 2) self.assertEqual(t.body[0].value.lineno, 2) self.assertEqual(t.body[0].value.values[0].lineno, 2) - self.assertEqual(t.body[0].value.values[1].lineno, 2) - self.assertEqual(t.body[0].value.values[2].lineno, 2) + self.assertEqual(t.body[0].value.values[1].lineno, 3) + self.assertEqual(t.body[0].value.values[2].lineno, 3) self.assertEqual(t.body[0].col_offset, 0) self.assertEqual(t.body[0].value.col_offset, 4) - self.assertEqual(t.body[0].value.values[0].col_offset, 4) - self.assertEqual(t.body[0].value.values[1].col_offset, 4) - self.assertEqual(t.body[0].value.values[2].col_offset, 4) + self.assertEqual(t.body[0].value.values[0].col_offset, 8) + self.assertEqual(t.body[0].value.values[1].col_offset, 10) + self.assertEqual(t.body[0].value.values[2].col_offset, 17) # Check {blech} self.assertEqual(t.body[0].value.values[1].value.lineno, 3) self.assertEqual(t.body[0].value.values[1].value.end_lineno, 3) @@ -387,6 +387,20 @@ def test_ast_line_numbers_with_parentheses(self): t = ast.parse(expr) self.assertEqual(type(t), ast.Module) self.assertEqual(len(t.body), 1) + # check the joinedstr location + joinedstr = t.body[0].value + self.assertEqual(type(joinedstr), ast.JoinedStr) + self.assertEqual(joinedstr.lineno, 3) + self.assertEqual(joinedstr.end_lineno, 3) + self.assertEqual(joinedstr.col_offset, 4) + self.assertEqual(joinedstr.end_col_offset, 17) + # check the formatted value location + fv = t.body[0].value.values[1] + self.assertEqual(type(fv), ast.FormattedValue) + self.assertEqual(fv.lineno, 3) + self.assertEqual(fv.end_lineno, 3) + self.assertEqual(fv.col_offset, 7) + self.assertEqual(fv.end_col_offset, 16) # check the test(t) location call = t.body[0].value.values[1].value self.assertEqual(type(call), ast.Call) @@ -397,6 +411,50 @@ def test_ast_line_numbers_with_parentheses(self): expr = """ x = ( + u'wat', + u"wat", + b'wat', + b"wat", + f'wat', + f"wat", +) + +y = ( + u'''wat''', + u\"\"\"wat\"\"\", + b'''wat''', + b\"\"\"wat\"\"\", + f'''wat''', + f\"\"\"wat\"\"\", +) + """ + t = ast.parse(expr) + self.assertEqual(type(t), ast.Module) + self.assertEqual(len(t.body), 2) + x, y = t.body + + # Check the single quoted string offsets first. + offsets = [ + (elt.col_offset, elt.end_col_offset) + for elt in x.value.elts + ] + self.assertTrue(all( + offset == (4, 10) + for offset in offsets + )) + + # Check the triple quoted string offsets. + offsets = [ + (elt.col_offset, elt.end_col_offset) + for elt in y.value.elts + ] + self.assertTrue(all( + offset == (4, 14) + for offset in offsets + )) + + expr = """ +x = ( 'PERL_MM_OPT', ( f'wat' f'some_string={f(x)} ' @@ -415,9 +473,9 @@ def test_ast_line_numbers_with_parentheses(self): # check the first wat self.assertEqual(type(wat1), ast.Constant) self.assertEqual(wat1.lineno, 4) - self.assertEqual(wat1.end_lineno, 6) - self.assertEqual(wat1.col_offset, 12) - self.assertEqual(wat1.end_col_offset, 18) + self.assertEqual(wat1.end_lineno, 5) + self.assertEqual(wat1.col_offset, 14) + self.assertEqual(wat1.end_col_offset, 26) # check the call call = middle.value self.assertEqual(type(call), ast.Call) @@ -427,10 +485,14 @@ def test_ast_line_numbers_with_parentheses(self): self.assertEqual(call.end_col_offset, 31) # check the second wat self.assertEqual(type(wat2), ast.Constant) - self.assertEqual(wat2.lineno, 4) + self.assertEqual(wat2.lineno, 5) self.assertEqual(wat2.end_lineno, 6) - self.assertEqual(wat2.col_offset, 12) - self.assertEqual(wat2.end_col_offset, 18) + self.assertEqual(wat2.col_offset, 32) + # wat ends at the offset 17, but the whole f-string + # ends at the offset 18 (since the quote is part of the + # f-string but not the wat string) + self.assertEqual(wat2.end_col_offset, 17) + self.assertEqual(fstring.end_col_offset, 18) def test_docstring(self): def f(): @@ -467,7 +529,7 @@ def test_literal(self): self.assertEqual(f' ', ' ') def test_unterminated_string(self): - self.assertAllRaise(SyntaxError, 'f-string: unterminated string', + self.assertAllRaise(SyntaxError, 'unterminated string', [r"""f'{"x'""", r"""f'{"x}'""", r"""f'{("x'""", @@ -475,28 +537,33 @@ def test_unterminated_string(self): ]) def test_mismatched_parens(self): - self.assertAllRaise(SyntaxError, r"f-string: closing parenthesis '\}' " + self.assertAllRaise(SyntaxError, r"closing parenthesis '\}' " r"does not match opening parenthesis '\('", ["f'{((}'", ]) - self.assertAllRaise(SyntaxError, r"f-string: closing parenthesis '\)' " + self.assertAllRaise(SyntaxError, r"closing parenthesis '\)' " r"does not match opening parenthesis '\['", ["f'{a[4)}'", ]) - self.assertAllRaise(SyntaxError, r"f-string: closing parenthesis '\]' " + self.assertAllRaise(SyntaxError, r"closing parenthesis '\]' " r"does not match opening parenthesis '\('", ["f'{a(4]}'", ]) - self.assertAllRaise(SyntaxError, r"f-string: closing parenthesis '\}' " + self.assertAllRaise(SyntaxError, r"closing parenthesis '\}' " r"does not match opening parenthesis '\['", ["f'{a[4}'", ]) - self.assertAllRaise(SyntaxError, r"f-string: closing parenthesis '\}' " + self.assertAllRaise(SyntaxError, r"closing parenthesis '\}' " r"does not match opening parenthesis '\('", ["f'{a(4}'", ]) self.assertRaises(SyntaxError, eval, "f'{" + "("*500 + "}'") + def test_fstring_nested_too_deeply(self): + self.assertAllRaise(SyntaxError, + "f-string: expressions nested too deeply", + ['f"{1+2:{1+2:{1+1:{1}}}}"']) + def test_double_braces(self): self.assertEqual(f'{{', '{') self.assertEqual(f'a{{', 'a{') @@ -559,8 +626,14 @@ def test_compile_time_concat(self): self.assertEqual(f'' '' f'', '') self.assertEqual(f'' '' f'' '', '') - self.assertAllRaise(SyntaxError, "f-string: expecting '}'", - ["f'{3' f'}'", # can't concat to get a valid f-string + # This is not really [f'{'] + [f'}'] since we treat the inside + # of braces as a purely new context, so it is actually f'{ and + # then eval(' f') (a valid expression) and then }' which would + # constitute a valid f-string. + self.assertEqual(f'{' f'}', ' f') + + self.assertAllRaise(SyntaxError, "expecting '}'", + ['''f'{3' f"}"''', # can't concat to get a valid f-string ]) def test_comments(self): @@ -618,25 +691,19 @@ def test_format_specifier_expressions(self): self.assertEqual(f'{-10:-{"#"}1{0}x}', ' -0xa') self.assertEqual(f'{-10:{"-"}#{1}0{"x"}}', ' -0xa') self.assertEqual(f'{10:#{3 != {4:5} and width}x}', ' 0xa') + self.assertEqual(f'result: {value:{width:{0}}.{precision:1}}', 'result: 12.35') - self.assertAllRaise(SyntaxError, - """f-string: invalid conversion character 'r{"': """ - """expected 's', 'r', or 'a'""", + self.assertAllRaise(SyntaxError, "f-string: expecting ':' or '}'", ["""f'{"s"!r{":10"}}'""", - # This looks like a nested format spec. ]) - self.assertAllRaise(SyntaxError, "f-string: invalid syntax", + self.assertAllRaise(SyntaxError, + "f-string: expecting a valid expression after '{'", [# Invalid syntax inside a nested spec. "f'{4:{/5}}'", ]) - self.assertAllRaise(SyntaxError, "f-string: expressions nested too deeply", - [# Can't nest format specifiers. - "f'result: {value:{width:{0}}.{precision:1}}'", - ]) - self.assertAllRaise(SyntaxError, 'f-string: invalid conversion character', [# No expansion inside conversion or for # the : or ! itself. @@ -655,7 +722,8 @@ def __format__(self, spec): self.assertEqual(f'{x} {x}', '1 2') def test_missing_expression(self): - self.assertAllRaise(SyntaxError, 'f-string: empty expression not allowed', + self.assertAllRaise(SyntaxError, + "f-string: valid expression required before '}'", ["f'{}'", "f'{ }'" "f' {} '", @@ -667,8 +735,8 @@ def test_missing_expression(self): "f'''{\t\f\r\n}'''", ]) - # Different error messages are raised when a specifier ('!', ':' or '=') is used after an empty expression - self.assertAllRaise(SyntaxError, "f-string: expression required before '!'", + self.assertAllRaise(SyntaxError, + "f-string: valid expression required before '!'", ["f'{!r}'", "f'{ !r}'", "f'{!}'", @@ -689,7 +757,8 @@ def test_missing_expression(self): "f'{ !xr:a}'", ]) - self.assertAllRaise(SyntaxError, "f-string: expression required before ':'", + self.assertAllRaise(SyntaxError, + "f-string: valid expression required before ':'", ["f'{:}'", "f'{ :!}'", "f'{:2}'", @@ -697,7 +766,8 @@ def test_missing_expression(self): "f'{:'", ]) - self.assertAllRaise(SyntaxError, "f-string: expression required before '='", + self.assertAllRaise(SyntaxError, + "f-string: valid expression required before '='", ["f'{=}'", "f'{ =}'", "f'{ =:}'", @@ -715,24 +785,18 @@ def test_missing_expression(self): def test_parens_in_expressions(self): self.assertEqual(f'{3,}', '(3,)') - # Add these because when an expression is evaluated, parens - # are added around it. But we shouldn't go from an invalid - # expression to a valid one. The added parens are just - # supposed to allow whitespace (including newlines). - self.assertAllRaise(SyntaxError, 'f-string: invalid syntax', + self.assertAllRaise(SyntaxError, + "f-string: expecting a valid expression after '{'", ["f'{,}'", - "f'{,}'", # this is (,), which is an error ]) self.assertAllRaise(SyntaxError, r"f-string: unmatched '\)'", ["f'{3)+(4}'", ]) - self.assertAllRaise(SyntaxError, 'unterminated string literal', - ["f'{\n}'", - ]) def test_newlines_before_syntax_error(self): - self.assertAllRaise(SyntaxError, "invalid syntax", + self.assertAllRaise(SyntaxError, + "f-string: expecting a valid expression after '{'", ["f'{.}'", "\nf'{.}'", "\n\nf'{.}'"]) def test_backslashes_in_string_part(self): @@ -776,7 +840,7 @@ def test_backslashes_in_string_part(self): self.assertEqual(f'2\x203', '2 3') self.assertEqual(f'\x203', ' 3') - with self.assertWarns(SyntaxWarning): # invalid escape sequence + with self.assertWarns(DeprecationWarning): # invalid escape sequence value = eval(r"f'\{6*7}'") self.assertEqual(value, '\\42') self.assertEqual(f'\\{6*7}', '\\42') @@ -809,18 +873,40 @@ def test_misformed_unicode_character_name(self): r"'\N{GREEK CAPITAL LETTER DELTA'", ]) - def test_no_backslashes_in_expression_part(self): - self.assertAllRaise(SyntaxError, 'f-string expression part cannot include a backslash', - [r"f'{\'a\'}'", - r"f'{\t3}'", - r"f'{\}'", - r"rf'{\'a\'}'", - r"rf'{\t3}'", - r"rf'{\}'", - r"""rf'{"\N{LEFT CURLY BRACKET}"}'""", - r"f'{\n}'", + def test_backslashes_in_expression_part(self): + self.assertEqual(f"{( + 1 + + 2 + )}", "3") + + self.assertEqual("\N{LEFT CURLY BRACKET}", '{') + self.assertEqual(f'{"\N{LEFT CURLY BRACKET}"}', '{') + self.assertEqual(rf'{"\N{LEFT CURLY BRACKET}"}', '{') + + self.assertAllRaise(SyntaxError, + "f-string: valid expression required before '}'", + ["f'{\n}'", ]) + def test_invalid_backslashes_inside_fstring_context(self): + # All of these variations are invalid python syntax, + # so they are also invalid in f-strings as well. + cases = [ + formatting.format(expr=expr) + for formatting in [ + "{expr}", + "f'{{{expr}}}'", + "rf'{{{expr}}}'", + ] + for expr in [ + r"\'a\'", + r"\t3", + r"\\"[0], + ] + ] + self.assertAllRaise(SyntaxError, 'unexpected character after line continuation', + cases) + def test_no_escapes_for_braces(self): """ Only literal curly braces begin an expression. @@ -843,11 +929,69 @@ def test_lambda(self): self.assertEqual(f'{(lambda y:x*y)("8"):10}', "88888 ") # lambda doesn't work without parens, because the colon - # makes the parser think it's a format_spec - self.assertAllRaise(SyntaxError, 'f-string: invalid syntax', + # makes the parser think it's a format_spec + # emit warning if we can match a format_spec + self.assertAllRaise(SyntaxError, + "f-string: lambda expressions are not allowed " + "without parentheses", ["f'{lambda x:x}'", + "f'{lambda :x}'", + "f'{lambda *arg, :x}'", + "f'{1, lambda:x}'", + ]) + + # but don't emit the paren warning in general cases + self.assertAllRaise(SyntaxError, + "f-string: expecting a valid expression after '{'", + ["f'{lambda x:}'", + "f'{lambda :}'", + "f'{+ lambda:None}'", ]) + def test_valid_prefixes(self): + self.assertEqual(F'{1}', "1") + self.assertEqual(FR'{2}', "2") + self.assertEqual(fR'{3}', "3") + + def test_roundtrip_raw_quotes(self): + self.assertEqual(fr"\'", "\\'") + self.assertEqual(fr'\"', '\\"') + self.assertEqual(fr'\"\'', '\\"\\\'') + self.assertEqual(fr'\'\"', '\\\'\\"') + self.assertEqual(fr'\"\'\"', '\\"\\\'\\"') + self.assertEqual(fr'\'\"\'', '\\\'\\"\\\'') + self.assertEqual(fr'\"\'\"\'', '\\"\\\'\\"\\\'') + + def test_fstring_backslash_before_double_bracket(self): + self.assertEqual(f'\{{\}}', '\\{\\}') + self.assertEqual(f'\{{', '\\{') + self.assertEqual(f'\{{{1+1}', '\\{2') + self.assertEqual(f'\}}{1+1}', '\\}2') + self.assertEqual(f'{1+1}\}}', '2\\}') + self.assertEqual(fr'\{{\}}', '\\{\\}') + self.assertEqual(fr'\{{', '\\{') + self.assertEqual(fr'\{{{1+1}', '\\{2') + self.assertEqual(fr'\}}{1+1}', '\\}2') + self.assertEqual(fr'{1+1}\}}', '2\\}') + + def test_fstring_backslash_prefix_raw(self): + self.assertEqual(f'\\', '\\') + self.assertEqual(f'\\\\', '\\\\') + self.assertEqual(fr'\\', r'\\') + self.assertEqual(fr'\\\\', r'\\\\') + self.assertEqual(rf'\\', r'\\') + self.assertEqual(rf'\\\\', r'\\\\') + self.assertEqual(Rf'\\', R'\\') + self.assertEqual(Rf'\\\\', R'\\\\') + self.assertEqual(fR'\\', R'\\') + self.assertEqual(fR'\\\\', R'\\\\') + self.assertEqual(FR'\\', R'\\') + self.assertEqual(FR'\\\\', R'\\\\') + + def test_fstring_format_spec_greedy_matching(self): + self.assertEqual(f"{1:}}}", "1}") + self.assertEqual(f"{1:>3{5}}}}", " 1}") + def test_yield(self): # Not terribly useful, but make sure the yield turns # a function into a generator @@ -1037,6 +1181,11 @@ def test_conversions(self): self.assertEqual(f'{"a"!r}', "'a'") self.assertEqual(f'{"a"!a}', "'a'") + # Conversions can have trailing whitespace after them since it + # does not provide any significance + self.assertEqual(f"{3!s }", "3") + self.assertEqual(f'{3.14!s :10.10}', '3.14 ') + # Not a conversion. self.assertEqual(f'{"a!r"}', "a!r") @@ -1049,16 +1198,27 @@ def test_conversions(self): "f'{3!g'", ]) - self.assertAllRaise(SyntaxError, 'f-string: missed conversion character', + self.assertAllRaise(SyntaxError, 'f-string: missing conversion character', ["f'{3!}'", "f'{3!:'", "f'{3!:}'", ]) - for conv in 'g', 'A', '3', 'G', '!', ' s', 's ', ' s ', 'ä', 'ɐ', 'ª': + for conv_identifier in 'g', 'A', 'G', 'ä', 'ɐ': self.assertAllRaise(SyntaxError, "f-string: invalid conversion character %r: " - "expected 's', 'r', or 'a'" % conv, + "expected 's', 'r', or 'a'" % conv_identifier, + ["f'{3!" + conv_identifier + "}'"]) + + for conv_non_identifier in '3', '!': + self.assertAllRaise(SyntaxError, + "f-string: invalid conversion character", + ["f'{3!" + conv_non_identifier + "}'"]) + + for conv in ' s', ' s ': + self.assertAllRaise(SyntaxError, + "f-string: conversion type must come right after the" + " exclamanation mark", ["f'{3!" + conv + "}'"]) self.assertAllRaise(SyntaxError, @@ -1097,8 +1257,7 @@ def test_mismatched_braces(self): ]) self.assertAllRaise(SyntaxError, "f-string: expecting '}'", - ["f'{3:{{>10}'", - "f'{3'", + ["f'{3'", "f'{3!'", "f'{3:'", "f'{3!s'", @@ -1111,11 +1270,14 @@ def test_mismatched_braces(self): "f'{{{'", "f'{{}}{'", "f'{'", - "f'x{<'", # See bpo-46762. - "f'x{>'", "f'{i='", # See gh-93418. ]) + self.assertAllRaise(SyntaxError, + "f-string: expecting a valid expression after '{'", + ["f'{3:{{>10}'", + ]) + # But these are just normal strings. self.assertEqual(f'{"{"}', '{') self.assertEqual(f'{"}"}', '}') @@ -1314,6 +1476,7 @@ def __repr__(self): self.assertEqual(f'X{x =}Y', 'Xx ='+repr(x)+'Y') self.assertEqual(f'X{x= }Y', 'Xx= '+repr(x)+'Y') self.assertEqual(f'X{x = }Y', 'Xx = '+repr(x)+'Y') + self.assertEqual(f"sadsd {1 + 1 = :{1 + 1:1d}f}", "sadsd 1 + 1 = 2.000000") # These next lines contains tabs. Backslash escapes don't # work in f-strings. @@ -1335,7 +1498,8 @@ def test_walrus(self): self.assertEqual(x, 10) def test_invalid_syntax_error_message(self): - with self.assertRaisesRegex(SyntaxError, "f-string: invalid syntax"): + with self.assertRaisesRegex(SyntaxError, + "f-string: expecting '=', or '!', or ':', or '}'"): compile("f'{a $ b}'", "?", "exec") def test_with_two_commas_in_format_specifier(self): @@ -1359,12 +1523,11 @@ def test_with_an_underscore_and_a_comma_in_format_specifier(self): f'{1:_,}' def test_syntax_error_for_starred_expressions(self): - error_msg = re.escape("cannot use starred expression here") - with self.assertRaisesRegex(SyntaxError, error_msg): + with self.assertRaisesRegex(SyntaxError, "can't use starred expression here"): compile("f'{*a}'", "?", "exec") - error_msg = re.escape("cannot use double starred expression here") - with self.assertRaisesRegex(SyntaxError, error_msg): + with self.assertRaisesRegex(SyntaxError, + "f-string: expecting a valid expression after '{'"): compile("f'{**a}'", "?", "exec") if __name__ == '__main__': diff --git a/Lib/test/test_tokenize.py b/Lib/test/test_tokenize.py index 63c2501cfe2338..283a7c23609e67 100644 --- a/Lib/test/test_tokenize.py +++ b/Lib/test/test_tokenize.py @@ -1625,6 +1625,10 @@ def test_random_files(self): # 7 more testfiles fail. Remove them also until the failure is diagnosed. testfiles.remove(os.path.join(tempdir, "test_unicode_identifiers.py")) + + # TODO: Remove this once we can unparse PEP 701 syntax + testfiles.remove(os.path.join(tempdir, "test_fstring.py")) + for f in ('buffer', 'builtin', 'fileio', 'inspect', 'os', 'platform', 'sys'): testfiles.remove(os.path.join(tempdir, "test_%s.py") % f) @@ -1937,25 +1941,39 @@ def test_string(self): """) self.check_tokenize('f"abc"', """\ - STRING 'f"abc"' (1, 0) (1, 6) + FSTRING_START 'f"' (1, 0) (1, 2) + FSTRING_MIDDLE 'abc' (1, 2) (1, 5) + FSTRING_END '"' (1, 5) (1, 6) """) self.check_tokenize('fR"a{b}c"', """\ - STRING 'fR"a{b}c"' (1, 0) (1, 9) + FSTRING_START 'fR"' (1, 0) (1, 3) + FSTRING_MIDDLE 'a' (1, 3) (1, 4) + LBRACE '{' (1, 4) (1, 5) + NAME 'b' (1, 5) (1, 6) + RBRACE '}' (1, 6) (1, 7) + FSTRING_MIDDLE 'c' (1, 7) (1, 8) + FSTRING_END '"' (1, 8) (1, 9) """) self.check_tokenize('f"""abc"""', """\ - STRING 'f\"\"\"abc\"\"\"' (1, 0) (1, 10) + FSTRING_START 'f\"""' (1, 0) (1, 4) + FSTRING_MIDDLE 'abc' (1, 4) (1, 7) + FSTRING_END '\"""' (1, 7) (1, 10) """) self.check_tokenize(r'f"abc\ def"', """\ - STRING 'f"abc\\\\\\ndef"' (1, 0) (2, 4) + FSTRING_START \'f"\' (1, 0) (1, 2) + FSTRING_MIDDLE 'abc\\\\\\ndef' (1, 2) (2, 3) + FSTRING_END '"' (2, 3) (2, 4) """) self.check_tokenize(r'Rf"abc\ def"', """\ - STRING 'Rf"abc\\\\\\ndef"' (1, 0) (2, 4) + FSTRING_START 'Rf"' (1, 0) (1, 3) + FSTRING_MIDDLE 'abc\\\\\\ndef' (1, 3) (2, 3) + FSTRING_END '"' (2, 3) (2, 4) """) def test_function(self): diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index 8db7394d1512aa..aba4a44be9da96 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -272,7 +272,7 @@ def test_matmul(self): pass def test_fstring(self): - for tree in self.parse_all(fstring, minver=6): + for tree in self.parse_all(fstring): pass def test_underscorednumber(self): diff --git a/Lib/token.py b/Lib/token.py index 95b107c6643b3f..1459d12b376f82 100644 --- a/Lib/token.py +++ b/Lib/token.py @@ -57,18 +57,22 @@ RARROW = 51 ELLIPSIS = 52 COLONEQUAL = 53 -OP = 54 -AWAIT = 55 -ASYNC = 56 -TYPE_IGNORE = 57 -TYPE_COMMENT = 58 -SOFT_KEYWORD = 59 +EXCLAMATION = 54 +OP = 55 +AWAIT = 56 +ASYNC = 57 +TYPE_IGNORE = 58 +TYPE_COMMENT = 59 +SOFT_KEYWORD = 60 +FSTRING_START = 61 +FSTRING_MIDDLE = 62 +FSTRING_END = 63 # These aren't used by the C tokenizer but are needed for tokenize.py -ERRORTOKEN = 60 -COMMENT = 61 -NL = 62 -ENCODING = 63 -N_TOKENS = 64 +ERRORTOKEN = 64 +COMMENT = 65 +NL = 66 +ENCODING = 67 +N_TOKENS = 68 # Special definitions for cooperation with parser NT_OFFSET = 256 @@ -78,6 +82,7 @@ __all__.extend(tok_name.values()) EXACT_TOKEN_TYPES = { + '!': EXCLAMATION, '!=': NOTEQUAL, '%': PERCENT, '%=': PERCENTEQUAL, diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-04-17-16-00-32.gh-issue-102856.UunJ7y.rst b/Misc/NEWS.d/next/Core and Builtins/2023-04-17-16-00-32.gh-issue-102856.UunJ7y.rst new file mode 100644 index 00000000000000..35eceb83816bcb --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-04-17-16-00-32.gh-issue-102856.UunJ7y.rst @@ -0,0 +1 @@ +Implement the required C tokenizer changes for PEP 701. Patch by Pablo Galindo Salgado, Lysandros Nikolaou, Batuhan Taskaya, Marta Gómez Macías and sunmy2019. diff --git a/Parser/action_helpers.c b/Parser/action_helpers.c index 46390966892d16..55c0f6fdd620f4 100644 --- a/Parser/action_helpers.c +++ b/Parser/action_helpers.c @@ -1,6 +1,7 @@ #include #include "pegen.h" +#include "tokenizer.h" #include "string_parser.h" #include "pycore_runtime.h" // _PyRuntime @@ -853,96 +854,6 @@ _PyPegen_seq_delete_starred_exprs(Parser *p, asdl_seq *kwargs) return new_seq; } -expr_ty -_PyPegen_concatenate_strings(Parser *p, asdl_seq *strings) -{ - Py_ssize_t len = asdl_seq_LEN(strings); - assert(len > 0); - - Token *first = asdl_seq_GET_UNTYPED(strings, 0); - Token *last = asdl_seq_GET_UNTYPED(strings, len - 1); - - int bytesmode = 0; - PyObject *bytes_str = NULL; - - FstringParser state; - _PyPegen_FstringParser_Init(&state); - - for (Py_ssize_t i = 0; i < len; i++) { - Token *t = asdl_seq_GET_UNTYPED(strings, i); - - int this_bytesmode; - int this_rawmode; - PyObject *s; - const char *fstr; - Py_ssize_t fstrlen = -1; - - if (_PyPegen_parsestr(p, &this_bytesmode, &this_rawmode, &s, &fstr, &fstrlen, t) != 0) { - goto error; - } - - /* Check that we are not mixing bytes with unicode. */ - if (i != 0 && bytesmode != this_bytesmode) { - RAISE_SYNTAX_ERROR("cannot mix bytes and nonbytes literals"); - Py_XDECREF(s); - goto error; - } - bytesmode = this_bytesmode; - - if (fstr != NULL) { - assert(s == NULL && !bytesmode); - - int result = _PyPegen_FstringParser_ConcatFstring(p, &state, &fstr, fstr + fstrlen, - this_rawmode, 0, first, t, last); - if (result < 0) { - goto error; - } - } - else { - /* String or byte string. */ - assert(s != NULL && fstr == NULL); - assert(bytesmode ? PyBytes_CheckExact(s) : PyUnicode_CheckExact(s)); - - if (bytesmode) { - if (i == 0) { - bytes_str = s; - } - else { - PyBytes_ConcatAndDel(&bytes_str, s); - if (!bytes_str) { - goto error; - } - } - } - else { - /* This is a regular string. Concatenate it. */ - if (_PyPegen_FstringParser_ConcatAndDel(&state, s) < 0) { - goto error; - } - } - } - } - - if (bytesmode) { - if (_PyArena_AddPyObject(p->arena, bytes_str) < 0) { - goto error; - } - return _PyAST_Constant(bytes_str, NULL, first->lineno, - first->col_offset, last->end_lineno, - last->end_col_offset, p->arena); - } - - return _PyPegen_FstringParser_Finish(p, &state, first, last); - -error: - Py_XDECREF(bytes_str); - _PyPegen_FstringParser_Dealloc(&state); - if (PyErr_Occurred()) { - _Pypegen_raise_decode_error(p); - } - return NULL; -} - expr_ty _PyPegen_ensure_imaginary(Parser *p, expr_ty exp) { @@ -1054,6 +965,18 @@ _PyPegen_check_legacy_stmt(Parser *p, expr_ty name) { return 0; } +expr_ty +_PyPegen_check_fstring_conversion(Parser *p, Token* symbol, expr_ty conv) { + if (symbol->lineno != conv->lineno || symbol->end_col_offset != conv->col_offset) { + return RAISE_SYNTAX_ERROR_KNOWN_RANGE( + symbol, conv, + "f-string: conversion type must come right after the exclamanation mark" + ); + } + return conv; +} + + const char * _PyPegen_get_expr_name(expr_ty e) { @@ -1271,3 +1194,439 @@ _PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args, asdl_comprehension_seq "Generator expression must be parenthesized" ); } + +// Fstring stuff + +static expr_ty +decode_fstring_buffer(Parser *p, int lineno, int col_offset, int end_lineno, + int end_col_offset) +{ + tokenizer_mode *tok_mode = &(p->tok->tok_mode_stack[p->tok->tok_mode_stack_index]); + assert(tok_mode->last_expr_buffer != NULL); + assert(tok_mode->last_expr_size >= 0 && tok_mode->last_expr_end >= 0); + + PyObject *res = PyUnicode_DecodeUTF8( + tok_mode->last_expr_buffer, + tok_mode->last_expr_size - tok_mode->last_expr_end, + NULL + ); + if (!res || _PyArena_AddPyObject(p->arena, res) < 0) { + Py_XDECREF(res); + return NULL; + } + + return _PyAST_Constant(res, NULL, lineno, col_offset, end_lineno, end_col_offset, p->arena); +} + +static expr_ty +_PyPegen_decode_fstring_part(Parser* p, int is_raw, expr_ty constant) { + assert(PyUnicode_CheckExact(constant->v.Constant.value)); + + const char* bstr = PyUnicode_AsUTF8(constant->v.Constant.value); + if (bstr == NULL) { + return NULL; + } + + size_t len; + if (strcmp(bstr, "{{") == 0 || strcmp(bstr, "}}") == 0) { + len = 1; + } else { + len = strlen(bstr); + } + + is_raw = is_raw || strchr(bstr, '\\') == NULL; + PyObject *str = _PyPegen_decode_string(p, is_raw, bstr, len, NULL); + if (str == NULL) { + _Pypegen_raise_decode_error(p); + return NULL; + } + if (_PyArena_AddPyObject(p->arena, str) < 0) { + Py_DECREF(str); + return NULL; + } + return _PyAST_Constant(str, NULL, constant->lineno, constant->col_offset, + constant->end_lineno, constant->end_col_offset, + p->arena); +} + +static asdl_expr_seq * +unpack_top_level_joined_strs(Parser *p, asdl_expr_seq *raw_expressions) +{ + /* The parser might put multiple f-string values into an individual + * JoinedStr node at the top level due to stuff like f-string debugging + * expressions. This function flattens those and promotes them to the + * upper level. Only simplifies AST, but the compiler already takes care + * of the regular output, so this is not necessary if you are not going + * to expose the output AST to Python level. */ + + Py_ssize_t i, req_size, raw_size; + + req_size = raw_size = asdl_seq_LEN(raw_expressions); + expr_ty expr; + for (i = 0; i < raw_size; i++) { + expr = asdl_seq_GET(raw_expressions, i); + if (expr->kind == JoinedStr_kind) { + req_size += asdl_seq_LEN(expr->v.JoinedStr.values) - 1; + } + } + + asdl_expr_seq *expressions = _Py_asdl_expr_seq_new(req_size, p->arena); + + Py_ssize_t raw_index, req_index = 0; + for (raw_index = 0; raw_index < raw_size; raw_index++) { + expr = asdl_seq_GET(raw_expressions, raw_index); + if (expr->kind == JoinedStr_kind) { + asdl_expr_seq *values = expr->v.JoinedStr.values; + for (Py_ssize_t n = 0; n < asdl_seq_LEN(values); n++) { + asdl_seq_SET(expressions, req_index, asdl_seq_GET(values, n)); + req_index++; + } + } else { + asdl_seq_SET(expressions, req_index, expr); + req_index++; + } + } + return expressions; +} + +expr_ty +_PyPegen_joined_str(Parser *p, Token* a, asdl_expr_seq* raw_expressions, Token*b) { + asdl_expr_seq *expr = unpack_top_level_joined_strs(p, raw_expressions); + Py_ssize_t n_items = asdl_seq_LEN(expr); + + const char* quote_str = PyBytes_AsString(a->bytes); + if (quote_str == NULL) { + return NULL; + } + int is_raw = strpbrk(quote_str, "rR") != NULL; + + asdl_expr_seq *seq = _Py_asdl_expr_seq_new(n_items, p->arena); + if (seq == NULL) { + return NULL; + } + + Py_ssize_t index = 0; + for (Py_ssize_t i = 0; i < n_items; i++) { + expr_ty item = asdl_seq_GET(expr, i); + if (item->kind == Constant_kind) { + item = _PyPegen_decode_fstring_part(p, is_raw, item); + if (item == NULL) { + return NULL; + } + + /* Tokenizer emits string parts even when the underlying string + might become an empty value (e.g. FSTRING_MIDDLE with the value \\n) + so we need to check for them and simplify it here. */ + if (PyUnicode_CheckExact(item->v.Constant.value) + && PyUnicode_GET_LENGTH(item->v.Constant.value) == 0) { + continue; + } + } + asdl_seq_SET(seq, index++, item); + } + + asdl_expr_seq *resized_exprs; + if (index != n_items) { + resized_exprs = _Py_asdl_expr_seq_new(index, p->arena); + if (resized_exprs == NULL) { + return NULL; + } + for (Py_ssize_t i = 0; i < index; i++) { + asdl_seq_SET(resized_exprs, i, asdl_seq_GET(seq, i)); + } + } + else { + resized_exprs = seq; + } + + return _PyAST_JoinedStr(resized_exprs, a->lineno, a->col_offset, + b->end_lineno, b->end_col_offset, + p->arena); +} + +expr_ty _PyPegen_constant_from_token(Parser* p, Token* tok) { + char* bstr = PyBytes_AsString(tok->bytes); + if (bstr == NULL) { + return NULL; + } + PyObject* str = PyUnicode_FromString(bstr); + if (str == NULL) { + return NULL; + } + if (_PyArena_AddPyObject(p->arena, str) < 0) { + Py_DECREF(str); + return NULL; + } + return _PyAST_Constant(str, NULL, tok->lineno, tok->col_offset, + tok->end_lineno, tok->end_col_offset, + p->arena); +} + +expr_ty _PyPegen_constant_from_string(Parser* p, Token* tok) { + char* the_str = PyBytes_AsString(tok->bytes); + if (the_str == NULL) { + return NULL; + } + PyObject *s = _PyPegen_parse_string(p, tok); + if (s == NULL) { + _Pypegen_raise_decode_error(p); + return NULL; + } + if (_PyArena_AddPyObject(p->arena, s) < 0) { + Py_DECREF(s); + return NULL; + } + PyObject *kind = NULL; + if (the_str && the_str[0] == 'u') { + kind = _PyPegen_new_identifier(p, "u"); + if (kind == NULL) { + return NULL; + } + } + return _PyAST_Constant(s, kind, tok->lineno, tok->col_offset, tok->end_lineno, tok->end_col_offset, p->arena); +} + +expr_ty _PyPegen_formatted_value(Parser *p, expr_ty expression, Token *debug, expr_ty conversion, + expr_ty format, int lineno, int col_offset, int end_lineno, int end_col_offset, + PyArena *arena) { + int conversion_val = -1; + if (conversion != NULL) { + assert(conversion->kind == Name_kind); + Py_UCS4 first = PyUnicode_READ_CHAR(conversion->v.Name.id, 0); + + if (PyUnicode_GET_LENGTH(conversion->v.Name.id) > 1 || + !(first == 's' || first == 'r' || first == 'a')) { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(conversion, + "f-string: invalid conversion character %R: expected 's', 'r', or 'a'", + conversion->v.Name.id); + return NULL; + } + + conversion_val = Py_SAFE_DOWNCAST(first, Py_UCS4, int); + } + else if (debug && !format) { + /* If no conversion is specified, use !r for debug expressions */ + conversion_val = (int)'r'; + } + + expr_ty formatted_value = _PyAST_FormattedValue( + expression, conversion_val, format, + lineno, col_offset, end_lineno, + end_col_offset, arena + ); + + if (debug) { + /* Find the non whitespace token after the "=" */ + int debug_end_line, debug_end_offset; + + if (conversion) { + debug_end_line = conversion->lineno; + debug_end_offset = conversion->col_offset; + } + else if (format) { + debug_end_line = format->lineno; + debug_end_offset = format->col_offset + 1; // HACK: ?? + } + else { + debug_end_line = end_lineno; + debug_end_offset = end_col_offset; + } + + expr_ty debug_text = decode_fstring_buffer(p, lineno, col_offset + 1, + debug_end_line, debug_end_offset - 1); + if (!debug_text) { + return NULL; + } + + asdl_expr_seq *values = _Py_asdl_expr_seq_new(2, arena); + asdl_seq_SET(values, 0, debug_text); + asdl_seq_SET(values, 1, formatted_value); + return _PyAST_JoinedStr(values, lineno, col_offset, debug_end_line, debug_end_offset, p->arena); + } + else { + return formatted_value; + } +} + +expr_ty +_PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *strings, + int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena) +{ + Py_ssize_t len = asdl_seq_LEN(strings); + assert(len > 0); + + int f_string_found = 0; + int unicode_string_found = 0; + int bytes_found = 0; + + Py_ssize_t i = 0; + Py_ssize_t n_flattened_elements = 0; + for (i = 0; i < len; i++) { + expr_ty elem = asdl_seq_GET(strings, i); + if (elem->kind == Constant_kind) { + if (PyBytes_CheckExact(elem->v.Constant.value)) { + bytes_found = 1; + } else { + unicode_string_found = 1; + } + n_flattened_elements++; + } else { + n_flattened_elements += asdl_seq_LEN(elem->v.JoinedStr.values); + f_string_found = 1; + } + } + + if ((unicode_string_found || f_string_found) && bytes_found) { + RAISE_SYNTAX_ERROR("cannot mix bytes and nonbytes literals"); + return NULL; + } + + if (bytes_found) { + PyObject* res = PyBytes_FromString(""); + + /* Bytes literals never get a kind, but just for consistency + since they are represented as Constant nodes, we'll mirror + the same behavior as unicode strings for determining the + kind. */ + PyObject* kind = asdl_seq_GET(strings, 0)->v.Constant.kind; + for (i = 0; i < len; i++) { + expr_ty elem = asdl_seq_GET(strings, i); + PyBytes_Concat(&res, elem->v.Constant.value); + } + if (!res || _PyArena_AddPyObject(arena, res) < 0) { + Py_XDECREF(res); + return NULL; + } + return _PyAST_Constant(res, kind, lineno, col_offset, end_lineno, end_col_offset, p->arena); + } + + if (!f_string_found && len == 1) { + return asdl_seq_GET(strings, 0); + } + + asdl_expr_seq* flattened = _Py_asdl_expr_seq_new(n_flattened_elements, p->arena); + if (flattened == NULL) { + return NULL; + } + + /* build flattened list */ + Py_ssize_t current_pos = 0; + Py_ssize_t j = 0; + for (i = 0; i < len; i++) { + expr_ty elem = asdl_seq_GET(strings, i); + if (elem->kind == Constant_kind) { + asdl_seq_SET(flattened, current_pos++, elem); + } else { + for (j = 0; j < asdl_seq_LEN(elem->v.JoinedStr.values); j++) { + expr_ty subvalue = asdl_seq_GET(elem->v.JoinedStr.values, j); + if (subvalue == NULL) { + return NULL; + } + asdl_seq_SET(flattened, current_pos++, subvalue); + } + } + } + + /* calculate folded element count */ + Py_ssize_t n_elements = 0; + int prev_is_constant = 0; + for (i = 0; i < n_flattened_elements; i++) { + expr_ty elem = asdl_seq_GET(flattened, i); + + /* The concatenation of a FormattedValue and an empty Contant should + lead to the FormattedValue itself. Thus, we will not take any empty + constants into account, just as in `_PyPegen_joined_str` */ + if (f_string_found && elem->kind == Constant_kind && + PyUnicode_CheckExact(elem->v.Constant.value) && + PyUnicode_GET_LENGTH(elem->v.Constant.value) == 0) + continue; + + if (!prev_is_constant || elem->kind != Constant_kind) { + n_elements++; + } + prev_is_constant = elem->kind == Constant_kind; + } + + asdl_expr_seq* values = _Py_asdl_expr_seq_new(n_elements, p->arena); + if (values == NULL) { + return NULL; + } + + /* build folded list */ + _PyUnicodeWriter writer; + current_pos = 0; + for (i = 0; i < n_flattened_elements; i++) { + expr_ty elem = asdl_seq_GET(flattened, i); + + /* if the current elem and the following are constants, + fold them and all consequent constants */ + if (elem->kind == Constant_kind) { + if (i + 1 < n_flattened_elements && + asdl_seq_GET(flattened, i + 1)->kind == Constant_kind) { + expr_ty first_elem = elem; + + /* When a string is getting concatenated, the kind of the string + is determined by the first string in the concatenation + sequence. + + u"abc" "def" -> u"abcdef" + "abc" u"abc" -> "abcabc" */ + PyObject *kind = elem->v.Constant.kind; + + _PyUnicodeWriter_Init(&writer); + expr_ty last_elem = elem; + for (j = i; j < n_flattened_elements; j++) { + expr_ty current_elem = asdl_seq_GET(flattened, j); + if (current_elem->kind == Constant_kind) { + if (_PyUnicodeWriter_WriteStr( + &writer, current_elem->v.Constant.value)) { + _PyUnicodeWriter_Dealloc(&writer); + return NULL; + } + last_elem = current_elem; + } else { + break; + } + } + i = j - 1; + + PyObject *concat_str = _PyUnicodeWriter_Finish(&writer); + if (concat_str == NULL) { + _PyUnicodeWriter_Dealloc(&writer); + return NULL; + } + if (_PyArena_AddPyObject(p->arena, concat_str) < 0) { + Py_DECREF(concat_str); + return NULL; + } + elem = _PyAST_Constant(concat_str, kind, first_elem->lineno, + first_elem->col_offset, + last_elem->end_lineno, + last_elem->end_col_offset, p->arena); + if (elem == NULL) { + return NULL; + } + } + + /* Drop all empty contanst strings */ + if (f_string_found && + PyUnicode_CheckExact(elem->v.Constant.value) && + PyUnicode_GET_LENGTH(elem->v.Constant.value) == 0) { + continue; + } + } + + asdl_seq_SET(values, current_pos++, elem); + } + + if (!f_string_found) { + assert(n_elements == 1); + expr_ty elem = asdl_seq_GET(values, 0); + assert(elem->kind == Constant_kind); + return elem; + } + + assert(current_pos == n_elements); + return _PyAST_JoinedStr(values, lineno, col_offset, end_lineno, end_col_offset, p->arena); +} diff --git a/Parser/parser.c b/Parser/parser.c index e0a88a9cc72c8b..771366844fc489 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -17,52 +17,52 @@ static KeywordToken *reserved_keywords[] = { (KeywordToken[]) {{NULL, -1}}, (KeywordToken[]) {{NULL, -1}}, (KeywordToken[]) { - {"if", 641}, - {"as", 639}, - {"in", 650}, + {"if", 642}, + {"as", 640}, + {"in", 651}, {"or", 574}, {"is", 582}, {NULL, -1}, }, (KeywordToken[]) { - {"del", 603}, - {"def", 651}, - {"for", 649}, - {"try", 623}, + {"del", 604}, + {"def", 652}, + {"for", 650}, + {"try", 624}, {"and", 575}, {"not", 581}, {NULL, -1}, }, (KeywordToken[]) { - {"from", 607}, + {"from", 608}, {"pass", 504}, - {"with", 614}, - {"elif", 643}, - {"else", 644}, - {"None", 601}, - {"True", 600}, + {"with", 615}, + {"elif", 644}, + {"else", 645}, + {"None", 602}, + {"True", 601}, {NULL, -1}, }, (KeywordToken[]) { {"raise", 522}, {"yield", 573}, {"break", 508}, - {"class", 653}, - {"while", 646}, - {"False", 602}, + {"class", 654}, + {"while", 647}, + {"False", 603}, {NULL, -1}, }, (KeywordToken[]) { {"return", 519}, - {"import", 606}, + {"import", 607}, {"assert", 526}, {"global", 523}, - {"except", 636}, - {"lambda", 586}, + {"except", 637}, + {"lambda", 600}, {NULL, -1}, }, (KeywordToken[]) { - {"finally", 632}, + {"finally", 633}, {NULL, -1}, }, (KeywordToken[]) { @@ -224,341 +224,370 @@ static char *soft_keywords[] = { #define lambda_param_with_default_type 1144 #define lambda_param_maybe_default_type 1145 #define lambda_param_type 1146 -#define strings_type 1147 -#define list_type 1148 -#define tuple_type 1149 -#define set_type 1150 -#define dict_type 1151 -#define double_starred_kvpairs_type 1152 -#define double_starred_kvpair_type 1153 -#define kvpair_type 1154 -#define for_if_clauses_type 1155 -#define for_if_clause_type 1156 -#define listcomp_type 1157 -#define setcomp_type 1158 -#define genexp_type 1159 -#define dictcomp_type 1160 -#define arguments_type 1161 -#define args_type 1162 -#define kwargs_type 1163 -#define starred_expression_type 1164 -#define kwarg_or_starred_type 1165 -#define kwarg_or_double_starred_type 1166 -#define star_targets_type 1167 -#define star_targets_list_seq_type 1168 -#define star_targets_tuple_seq_type 1169 -#define star_target_type 1170 -#define target_with_star_atom_type 1171 -#define star_atom_type 1172 -#define single_target_type 1173 -#define single_subscript_attribute_target_type 1174 -#define t_primary_type 1175 // Left-recursive -#define t_lookahead_type 1176 -#define del_targets_type 1177 -#define del_target_type 1178 -#define del_t_atom_type 1179 -#define type_expressions_type 1180 -#define func_type_comment_type 1181 -#define invalid_arguments_type 1182 -#define invalid_kwarg_type 1183 -#define expression_without_invalid_type 1184 -#define invalid_legacy_expression_type 1185 -#define invalid_expression_type 1186 -#define invalid_named_expression_type 1187 -#define invalid_assignment_type 1188 -#define invalid_ann_assign_target_type 1189 -#define invalid_del_stmt_type 1190 -#define invalid_block_type 1191 -#define invalid_comprehension_type 1192 -#define invalid_dict_comprehension_type 1193 -#define invalid_parameters_type 1194 -#define invalid_default_type 1195 -#define invalid_star_etc_type 1196 -#define invalid_kwds_type 1197 -#define invalid_parameters_helper_type 1198 -#define invalid_lambda_parameters_type 1199 -#define invalid_lambda_parameters_helper_type 1200 -#define invalid_lambda_star_etc_type 1201 -#define invalid_lambda_kwds_type 1202 -#define invalid_double_type_comments_type 1203 -#define invalid_with_item_type 1204 -#define invalid_for_target_type 1205 -#define invalid_group_type 1206 -#define invalid_import_type 1207 -#define invalid_import_from_targets_type 1208 -#define invalid_with_stmt_type 1209 -#define invalid_with_stmt_indent_type 1210 -#define invalid_try_stmt_type 1211 -#define invalid_except_stmt_type 1212 -#define invalid_finally_stmt_type 1213 -#define invalid_except_stmt_indent_type 1214 -#define invalid_except_star_stmt_indent_type 1215 -#define invalid_match_stmt_type 1216 -#define invalid_case_block_type 1217 -#define invalid_as_pattern_type 1218 -#define invalid_class_pattern_type 1219 -#define invalid_class_argument_pattern_type 1220 -#define invalid_if_stmt_type 1221 -#define invalid_elif_stmt_type 1222 -#define invalid_else_stmt_type 1223 -#define invalid_while_stmt_type 1224 -#define invalid_for_stmt_type 1225 -#define invalid_def_raw_type 1226 -#define invalid_class_def_raw_type 1227 -#define invalid_double_starred_kvpairs_type 1228 -#define invalid_kvpair_type 1229 -#define invalid_starred_expression_type 1230 -#define _loop0_1_type 1231 -#define _loop0_2_type 1232 -#define _loop1_3_type 1233 -#define _loop0_5_type 1234 -#define _gather_4_type 1235 -#define _tmp_6_type 1236 -#define _tmp_7_type 1237 -#define _tmp_8_type 1238 -#define _tmp_9_type 1239 -#define _tmp_10_type 1240 -#define _tmp_11_type 1241 -#define _tmp_12_type 1242 -#define _tmp_13_type 1243 -#define _loop1_14_type 1244 -#define _tmp_15_type 1245 -#define _tmp_16_type 1246 -#define _tmp_17_type 1247 -#define _loop0_19_type 1248 -#define _gather_18_type 1249 -#define _loop0_21_type 1250 -#define _gather_20_type 1251 -#define _tmp_22_type 1252 -#define _tmp_23_type 1253 -#define _loop0_24_type 1254 -#define _loop1_25_type 1255 -#define _loop0_27_type 1256 -#define _gather_26_type 1257 -#define _tmp_28_type 1258 -#define _loop0_30_type 1259 -#define _gather_29_type 1260 -#define _tmp_31_type 1261 -#define _loop1_32_type 1262 -#define _tmp_33_type 1263 -#define _tmp_34_type 1264 -#define _tmp_35_type 1265 -#define _loop0_36_type 1266 -#define _loop0_37_type 1267 -#define _loop0_38_type 1268 -#define _loop1_39_type 1269 -#define _loop0_40_type 1270 -#define _loop1_41_type 1271 -#define _loop1_42_type 1272 -#define _loop1_43_type 1273 -#define _loop0_44_type 1274 -#define _loop1_45_type 1275 -#define _loop0_46_type 1276 -#define _loop1_47_type 1277 -#define _loop0_48_type 1278 -#define _loop0_49_type 1279 -#define _loop1_50_type 1280 -#define _loop0_52_type 1281 -#define _gather_51_type 1282 -#define _loop0_54_type 1283 -#define _gather_53_type 1284 -#define _loop0_56_type 1285 -#define _gather_55_type 1286 -#define _loop0_58_type 1287 -#define _gather_57_type 1288 -#define _tmp_59_type 1289 -#define _loop1_60_type 1290 -#define _loop1_61_type 1291 -#define _tmp_62_type 1292 -#define _tmp_63_type 1293 -#define _loop1_64_type 1294 -#define _loop0_66_type 1295 -#define _gather_65_type 1296 -#define _tmp_67_type 1297 -#define _tmp_68_type 1298 -#define _tmp_69_type 1299 -#define _tmp_70_type 1300 -#define _loop0_72_type 1301 -#define _gather_71_type 1302 -#define _loop0_74_type 1303 -#define _gather_73_type 1304 -#define _tmp_75_type 1305 -#define _loop0_77_type 1306 -#define _gather_76_type 1307 -#define _loop0_79_type 1308 -#define _gather_78_type 1309 -#define _loop1_80_type 1310 -#define _loop1_81_type 1311 -#define _loop0_83_type 1312 -#define _gather_82_type 1313 -#define _loop1_84_type 1314 -#define _loop1_85_type 1315 -#define _loop1_86_type 1316 -#define _tmp_87_type 1317 -#define _loop0_89_type 1318 -#define _gather_88_type 1319 -#define _tmp_90_type 1320 -#define _tmp_91_type 1321 -#define _tmp_92_type 1322 -#define _tmp_93_type 1323 -#define _tmp_94_type 1324 -#define _loop0_95_type 1325 -#define _loop0_96_type 1326 -#define _loop0_97_type 1327 -#define _loop1_98_type 1328 -#define _loop0_99_type 1329 -#define _loop1_100_type 1330 -#define _loop1_101_type 1331 -#define _loop1_102_type 1332 -#define _loop0_103_type 1333 -#define _loop1_104_type 1334 -#define _loop0_105_type 1335 -#define _loop1_106_type 1336 -#define _loop0_107_type 1337 -#define _loop1_108_type 1338 -#define _loop1_109_type 1339 -#define _tmp_110_type 1340 -#define _loop0_112_type 1341 -#define _gather_111_type 1342 -#define _loop1_113_type 1343 -#define _loop0_114_type 1344 -#define _loop0_115_type 1345 -#define _tmp_116_type 1346 -#define _loop0_118_type 1347 -#define _gather_117_type 1348 -#define _tmp_119_type 1349 -#define _loop0_121_type 1350 -#define _gather_120_type 1351 -#define _loop0_123_type 1352 -#define _gather_122_type 1353 -#define _loop0_125_type 1354 -#define _gather_124_type 1355 -#define _loop0_127_type 1356 -#define _gather_126_type 1357 -#define _loop0_128_type 1358 -#define _loop0_130_type 1359 -#define _gather_129_type 1360 -#define _loop1_131_type 1361 -#define _tmp_132_type 1362 -#define _loop0_134_type 1363 -#define _gather_133_type 1364 -#define _loop0_136_type 1365 -#define _gather_135_type 1366 -#define _loop0_138_type 1367 -#define _gather_137_type 1368 -#define _loop0_140_type 1369 -#define _gather_139_type 1370 -#define _loop0_142_type 1371 -#define _gather_141_type 1372 -#define _tmp_143_type 1373 -#define _tmp_144_type 1374 -#define _tmp_145_type 1375 -#define _tmp_146_type 1376 -#define _tmp_147_type 1377 -#define _tmp_148_type 1378 -#define _tmp_149_type 1379 -#define _tmp_150_type 1380 -#define _tmp_151_type 1381 -#define _tmp_152_type 1382 -#define _tmp_153_type 1383 -#define _loop0_154_type 1384 -#define _loop0_155_type 1385 -#define _loop0_156_type 1386 -#define _tmp_157_type 1387 -#define _tmp_158_type 1388 -#define _tmp_159_type 1389 -#define _tmp_160_type 1390 -#define _tmp_161_type 1391 -#define _loop0_162_type 1392 -#define _loop0_163_type 1393 -#define _loop0_164_type 1394 -#define _loop1_165_type 1395 -#define _tmp_166_type 1396 -#define _loop0_167_type 1397 -#define _tmp_168_type 1398 -#define _loop0_169_type 1399 -#define _loop1_170_type 1400 -#define _tmp_171_type 1401 -#define _tmp_172_type 1402 -#define _tmp_173_type 1403 -#define _loop0_174_type 1404 -#define _tmp_175_type 1405 -#define _tmp_176_type 1406 -#define _loop1_177_type 1407 -#define _tmp_178_type 1408 -#define _loop0_179_type 1409 -#define _loop0_180_type 1410 -#define _loop0_181_type 1411 -#define _loop0_183_type 1412 -#define _gather_182_type 1413 -#define _tmp_184_type 1414 -#define _loop0_185_type 1415 -#define _tmp_186_type 1416 -#define _loop0_187_type 1417 -#define _loop1_188_type 1418 -#define _loop1_189_type 1419 -#define _tmp_190_type 1420 -#define _tmp_191_type 1421 -#define _loop0_192_type 1422 -#define _tmp_193_type 1423 -#define _tmp_194_type 1424 -#define _tmp_195_type 1425 -#define _loop0_197_type 1426 -#define _gather_196_type 1427 -#define _loop0_199_type 1428 -#define _gather_198_type 1429 -#define _loop0_201_type 1430 -#define _gather_200_type 1431 -#define _loop0_203_type 1432 -#define _gather_202_type 1433 -#define _tmp_204_type 1434 -#define _loop0_205_type 1435 -#define _loop1_206_type 1436 -#define _tmp_207_type 1437 -#define _loop0_208_type 1438 -#define _loop1_209_type 1439 -#define _tmp_210_type 1440 -#define _tmp_211_type 1441 -#define _tmp_212_type 1442 -#define _tmp_213_type 1443 -#define _tmp_214_type 1444 -#define _tmp_215_type 1445 -#define _tmp_216_type 1446 -#define _tmp_217_type 1447 -#define _tmp_218_type 1448 -#define _tmp_219_type 1449 -#define _loop0_221_type 1450 -#define _gather_220_type 1451 -#define _tmp_222_type 1452 -#define _tmp_223_type 1453 -#define _tmp_224_type 1454 -#define _tmp_225_type 1455 -#define _tmp_226_type 1456 -#define _tmp_227_type 1457 -#define _tmp_228_type 1458 -#define _tmp_229_type 1459 -#define _tmp_230_type 1460 -#define _tmp_231_type 1461 -#define _tmp_232_type 1462 -#define _tmp_233_type 1463 -#define _tmp_234_type 1464 -#define _tmp_235_type 1465 -#define _tmp_236_type 1466 -#define _tmp_237_type 1467 -#define _tmp_238_type 1468 -#define _tmp_239_type 1469 -#define _tmp_240_type 1470 -#define _tmp_241_type 1471 -#define _tmp_242_type 1472 -#define _tmp_243_type 1473 -#define _tmp_244_type 1474 -#define _tmp_245_type 1475 -#define _tmp_246_type 1476 -#define _tmp_247_type 1477 -#define _tmp_248_type 1478 -#define _tmp_249_type 1479 -#define _tmp_250_type 1480 -#define _tmp_251_type 1481 +#define fstring_middle_type 1147 +#define fstring_replacement_field_type 1148 +#define fstring_conversion_type 1149 +#define fstring_full_format_spec_type 1150 +#define fstring_format_spec_type 1151 +#define string_type 1152 +#define strings_type 1153 +#define list_type 1154 +#define tuple_type 1155 +#define set_type 1156 +#define dict_type 1157 +#define double_starred_kvpairs_type 1158 +#define double_starred_kvpair_type 1159 +#define kvpair_type 1160 +#define for_if_clauses_type 1161 +#define for_if_clause_type 1162 +#define listcomp_type 1163 +#define setcomp_type 1164 +#define genexp_type 1165 +#define dictcomp_type 1166 +#define arguments_type 1167 +#define args_type 1168 +#define kwargs_type 1169 +#define starred_expression_type 1170 +#define kwarg_or_starred_type 1171 +#define kwarg_or_double_starred_type 1172 +#define star_targets_type 1173 +#define star_targets_list_seq_type 1174 +#define star_targets_tuple_seq_type 1175 +#define star_target_type 1176 +#define target_with_star_atom_type 1177 +#define star_atom_type 1178 +#define single_target_type 1179 +#define single_subscript_attribute_target_type 1180 +#define t_primary_type 1181 // Left-recursive +#define t_lookahead_type 1182 +#define del_targets_type 1183 +#define del_target_type 1184 +#define del_t_atom_type 1185 +#define type_expressions_type 1186 +#define func_type_comment_type 1187 +#define invalid_arguments_type 1188 +#define invalid_kwarg_type 1189 +#define expression_without_invalid_type 1190 +#define invalid_legacy_expression_type 1191 +#define invalid_expression_type 1192 +#define invalid_named_expression_type 1193 +#define invalid_assignment_type 1194 +#define invalid_ann_assign_target_type 1195 +#define invalid_del_stmt_type 1196 +#define invalid_block_type 1197 +#define invalid_comprehension_type 1198 +#define invalid_dict_comprehension_type 1199 +#define invalid_parameters_type 1200 +#define invalid_default_type 1201 +#define invalid_star_etc_type 1202 +#define invalid_kwds_type 1203 +#define invalid_parameters_helper_type 1204 +#define invalid_lambda_parameters_type 1205 +#define invalid_lambda_parameters_helper_type 1206 +#define invalid_lambda_star_etc_type 1207 +#define invalid_lambda_kwds_type 1208 +#define invalid_double_type_comments_type 1209 +#define invalid_with_item_type 1210 +#define invalid_for_target_type 1211 +#define invalid_group_type 1212 +#define invalid_import_type 1213 +#define invalid_import_from_targets_type 1214 +#define invalid_with_stmt_type 1215 +#define invalid_with_stmt_indent_type 1216 +#define invalid_try_stmt_type 1217 +#define invalid_except_stmt_type 1218 +#define invalid_finally_stmt_type 1219 +#define invalid_except_stmt_indent_type 1220 +#define invalid_except_star_stmt_indent_type 1221 +#define invalid_match_stmt_type 1222 +#define invalid_case_block_type 1223 +#define invalid_as_pattern_type 1224 +#define invalid_class_pattern_type 1225 +#define invalid_class_argument_pattern_type 1226 +#define invalid_if_stmt_type 1227 +#define invalid_elif_stmt_type 1228 +#define invalid_else_stmt_type 1229 +#define invalid_while_stmt_type 1230 +#define invalid_for_stmt_type 1231 +#define invalid_def_raw_type 1232 +#define invalid_class_def_raw_type 1233 +#define invalid_double_starred_kvpairs_type 1234 +#define invalid_kvpair_type 1235 +#define invalid_starred_expression_type 1236 +#define invalid_replacement_field_type 1237 +#define invalid_conversion_character_type 1238 +#define _loop0_1_type 1239 +#define _loop0_2_type 1240 +#define _loop0_3_type 1241 +#define _loop1_4_type 1242 +#define _loop0_6_type 1243 +#define _gather_5_type 1244 +#define _tmp_7_type 1245 +#define _tmp_8_type 1246 +#define _tmp_9_type 1247 +#define _tmp_10_type 1248 +#define _tmp_11_type 1249 +#define _tmp_12_type 1250 +#define _tmp_13_type 1251 +#define _tmp_14_type 1252 +#define _loop1_15_type 1253 +#define _tmp_16_type 1254 +#define _tmp_17_type 1255 +#define _tmp_18_type 1256 +#define _loop0_20_type 1257 +#define _gather_19_type 1258 +#define _loop0_22_type 1259 +#define _gather_21_type 1260 +#define _tmp_23_type 1261 +#define _tmp_24_type 1262 +#define _loop0_25_type 1263 +#define _loop1_26_type 1264 +#define _loop0_28_type 1265 +#define _gather_27_type 1266 +#define _tmp_29_type 1267 +#define _loop0_31_type 1268 +#define _gather_30_type 1269 +#define _tmp_32_type 1270 +#define _loop1_33_type 1271 +#define _tmp_34_type 1272 +#define _tmp_35_type 1273 +#define _tmp_36_type 1274 +#define _loop0_37_type 1275 +#define _loop0_38_type 1276 +#define _loop0_39_type 1277 +#define _loop1_40_type 1278 +#define _loop0_41_type 1279 +#define _loop1_42_type 1280 +#define _loop1_43_type 1281 +#define _loop1_44_type 1282 +#define _loop0_45_type 1283 +#define _loop1_46_type 1284 +#define _loop0_47_type 1285 +#define _loop1_48_type 1286 +#define _loop0_49_type 1287 +#define _loop0_50_type 1288 +#define _loop1_51_type 1289 +#define _loop0_53_type 1290 +#define _gather_52_type 1291 +#define _loop0_55_type 1292 +#define _gather_54_type 1293 +#define _loop0_57_type 1294 +#define _gather_56_type 1295 +#define _loop0_59_type 1296 +#define _gather_58_type 1297 +#define _tmp_60_type 1298 +#define _loop1_61_type 1299 +#define _loop1_62_type 1300 +#define _tmp_63_type 1301 +#define _tmp_64_type 1302 +#define _loop1_65_type 1303 +#define _loop0_67_type 1304 +#define _gather_66_type 1305 +#define _tmp_68_type 1306 +#define _tmp_69_type 1307 +#define _tmp_70_type 1308 +#define _tmp_71_type 1309 +#define _loop0_73_type 1310 +#define _gather_72_type 1311 +#define _loop0_75_type 1312 +#define _gather_74_type 1313 +#define _tmp_76_type 1314 +#define _loop0_78_type 1315 +#define _gather_77_type 1316 +#define _loop0_80_type 1317 +#define _gather_79_type 1318 +#define _loop1_81_type 1319 +#define _loop1_82_type 1320 +#define _loop0_84_type 1321 +#define _gather_83_type 1322 +#define _loop1_85_type 1323 +#define _loop1_86_type 1324 +#define _loop1_87_type 1325 +#define _tmp_88_type 1326 +#define _loop0_90_type 1327 +#define _gather_89_type 1328 +#define _tmp_91_type 1329 +#define _tmp_92_type 1330 +#define _tmp_93_type 1331 +#define _tmp_94_type 1332 +#define _tmp_95_type 1333 +#define _tmp_96_type 1334 +#define _loop0_97_type 1335 +#define _loop0_98_type 1336 +#define _loop0_99_type 1337 +#define _loop1_100_type 1338 +#define _loop0_101_type 1339 +#define _loop1_102_type 1340 +#define _loop1_103_type 1341 +#define _loop1_104_type 1342 +#define _loop0_105_type 1343 +#define _loop1_106_type 1344 +#define _loop0_107_type 1345 +#define _loop1_108_type 1346 +#define _loop0_109_type 1347 +#define _loop1_110_type 1348 +#define _tmp_111_type 1349 +#define _loop0_112_type 1350 +#define _loop1_113_type 1351 +#define _tmp_114_type 1352 +#define _loop0_116_type 1353 +#define _gather_115_type 1354 +#define _loop1_117_type 1355 +#define _loop0_118_type 1356 +#define _loop0_119_type 1357 +#define _tmp_120_type 1358 +#define _loop0_122_type 1359 +#define _gather_121_type 1360 +#define _tmp_123_type 1361 +#define _loop0_125_type 1362 +#define _gather_124_type 1363 +#define _loop0_127_type 1364 +#define _gather_126_type 1365 +#define _loop0_129_type 1366 +#define _gather_128_type 1367 +#define _loop0_131_type 1368 +#define _gather_130_type 1369 +#define _loop0_132_type 1370 +#define _loop0_134_type 1371 +#define _gather_133_type 1372 +#define _loop1_135_type 1373 +#define _tmp_136_type 1374 +#define _loop0_138_type 1375 +#define _gather_137_type 1376 +#define _loop0_140_type 1377 +#define _gather_139_type 1378 +#define _loop0_142_type 1379 +#define _gather_141_type 1380 +#define _loop0_144_type 1381 +#define _gather_143_type 1382 +#define _loop0_146_type 1383 +#define _gather_145_type 1384 +#define _tmp_147_type 1385 +#define _tmp_148_type 1386 +#define _tmp_149_type 1387 +#define _tmp_150_type 1388 +#define _tmp_151_type 1389 +#define _tmp_152_type 1390 +#define _tmp_153_type 1391 +#define _tmp_154_type 1392 +#define _tmp_155_type 1393 +#define _tmp_156_type 1394 +#define _tmp_157_type 1395 +#define _tmp_158_type 1396 +#define _loop0_159_type 1397 +#define _loop0_160_type 1398 +#define _loop0_161_type 1399 +#define _tmp_162_type 1400 +#define _tmp_163_type 1401 +#define _tmp_164_type 1402 +#define _tmp_165_type 1403 +#define _tmp_166_type 1404 +#define _loop0_167_type 1405 +#define _loop0_168_type 1406 +#define _loop0_169_type 1407 +#define _loop1_170_type 1408 +#define _tmp_171_type 1409 +#define _loop0_172_type 1410 +#define _tmp_173_type 1411 +#define _loop0_174_type 1412 +#define _loop1_175_type 1413 +#define _tmp_176_type 1414 +#define _tmp_177_type 1415 +#define _tmp_178_type 1416 +#define _loop0_179_type 1417 +#define _tmp_180_type 1418 +#define _tmp_181_type 1419 +#define _loop1_182_type 1420 +#define _tmp_183_type 1421 +#define _loop0_184_type 1422 +#define _loop0_185_type 1423 +#define _loop0_186_type 1424 +#define _loop0_188_type 1425 +#define _gather_187_type 1426 +#define _tmp_189_type 1427 +#define _loop0_190_type 1428 +#define _tmp_191_type 1429 +#define _loop0_192_type 1430 +#define _loop1_193_type 1431 +#define _loop1_194_type 1432 +#define _tmp_195_type 1433 +#define _tmp_196_type 1434 +#define _loop0_197_type 1435 +#define _tmp_198_type 1436 +#define _tmp_199_type 1437 +#define _tmp_200_type 1438 +#define _loop0_202_type 1439 +#define _gather_201_type 1440 +#define _loop0_204_type 1441 +#define _gather_203_type 1442 +#define _loop0_206_type 1443 +#define _gather_205_type 1444 +#define _loop0_208_type 1445 +#define _gather_207_type 1446 +#define _tmp_209_type 1447 +#define _loop0_210_type 1448 +#define _loop1_211_type 1449 +#define _tmp_212_type 1450 +#define _loop0_213_type 1451 +#define _loop1_214_type 1452 +#define _tmp_215_type 1453 +#define _tmp_216_type 1454 +#define _tmp_217_type 1455 +#define _tmp_218_type 1456 +#define _tmp_219_type 1457 +#define _tmp_220_type 1458 +#define _tmp_221_type 1459 +#define _tmp_222_type 1460 +#define _tmp_223_type 1461 +#define _tmp_224_type 1462 +#define _loop0_226_type 1463 +#define _gather_225_type 1464 +#define _tmp_227_type 1465 +#define _tmp_228_type 1466 +#define _tmp_229_type 1467 +#define _tmp_230_type 1468 +#define _tmp_231_type 1469 +#define _tmp_232_type 1470 +#define _tmp_233_type 1471 +#define _tmp_234_type 1472 +#define _tmp_235_type 1473 +#define _tmp_236_type 1474 +#define _tmp_237_type 1475 +#define _tmp_238_type 1476 +#define _tmp_239_type 1477 +#define _loop0_240_type 1478 +#define _tmp_241_type 1479 +#define _tmp_242_type 1480 +#define _tmp_243_type 1481 +#define _tmp_244_type 1482 +#define _tmp_245_type 1483 +#define _tmp_246_type 1484 +#define _tmp_247_type 1485 +#define _tmp_248_type 1486 +#define _tmp_249_type 1487 +#define _tmp_250_type 1488 +#define _tmp_251_type 1489 +#define _tmp_252_type 1490 +#define _tmp_253_type 1491 +#define _tmp_254_type 1492 +#define _tmp_255_type 1493 +#define _tmp_256_type 1494 +#define _tmp_257_type 1495 +#define _tmp_258_type 1496 +#define _tmp_259_type 1497 +#define _tmp_260_type 1498 +#define _tmp_261_type 1499 +#define _tmp_262_type 1500 +#define _tmp_263_type 1501 +#define _tmp_264_type 1502 +#define _tmp_265_type 1503 +#define _tmp_266_type 1504 +#define _tmp_267_type 1505 +#define _tmp_268_type 1506 +#define _tmp_269_type 1507 +#define _tmp_270_type 1508 +#define _tmp_271_type 1509 +#define _tmp_272_type 1510 static mod_ty file_rule(Parser *p); static mod_ty interactive_rule(Parser *p); @@ -707,6 +736,12 @@ static arg_ty lambda_param_no_default_rule(Parser *p); static NameDefaultPair* lambda_param_with_default_rule(Parser *p); static NameDefaultPair* lambda_param_maybe_default_rule(Parser *p); static arg_ty lambda_param_rule(Parser *p); +static expr_ty fstring_middle_rule(Parser *p); +static expr_ty fstring_replacement_field_rule(Parser *p); +static expr_ty fstring_conversion_rule(Parser *p); +static expr_ty fstring_full_format_spec_rule(Parser *p); +static expr_ty fstring_format_spec_rule(Parser *p); +static expr_ty string_rule(Parser *p); static expr_ty strings_rule(Parser *p); static expr_ty list_rule(Parser *p); static expr_ty tuple_rule(Parser *p); @@ -791,12 +826,14 @@ static void *invalid_class_def_raw_rule(Parser *p); static void *invalid_double_starred_kvpairs_rule(Parser *p); static void *invalid_kvpair_rule(Parser *p); static void *invalid_starred_expression_rule(Parser *p); +static void *invalid_replacement_field_rule(Parser *p); +static void *invalid_conversion_character_rule(Parser *p); static asdl_seq *_loop0_1_rule(Parser *p); static asdl_seq *_loop0_2_rule(Parser *p); -static asdl_seq *_loop1_3_rule(Parser *p); -static asdl_seq *_loop0_5_rule(Parser *p); -static asdl_seq *_gather_4_rule(Parser *p); -static void *_tmp_6_rule(Parser *p); +static asdl_seq *_loop0_3_rule(Parser *p); +static asdl_seq *_loop1_4_rule(Parser *p); +static asdl_seq *_loop0_6_rule(Parser *p); +static asdl_seq *_gather_5_rule(Parser *p); static void *_tmp_7_rule(Parser *p); static void *_tmp_8_rule(Parser *p); static void *_tmp_9_rule(Parser *p); @@ -804,139 +841,139 @@ static void *_tmp_10_rule(Parser *p); static void *_tmp_11_rule(Parser *p); static void *_tmp_12_rule(Parser *p); static void *_tmp_13_rule(Parser *p); -static asdl_seq *_loop1_14_rule(Parser *p); -static void *_tmp_15_rule(Parser *p); +static void *_tmp_14_rule(Parser *p); +static asdl_seq *_loop1_15_rule(Parser *p); static void *_tmp_16_rule(Parser *p); static void *_tmp_17_rule(Parser *p); -static asdl_seq *_loop0_19_rule(Parser *p); -static asdl_seq *_gather_18_rule(Parser *p); -static asdl_seq *_loop0_21_rule(Parser *p); -static asdl_seq *_gather_20_rule(Parser *p); -static void *_tmp_22_rule(Parser *p); +static void *_tmp_18_rule(Parser *p); +static asdl_seq *_loop0_20_rule(Parser *p); +static asdl_seq *_gather_19_rule(Parser *p); +static asdl_seq *_loop0_22_rule(Parser *p); +static asdl_seq *_gather_21_rule(Parser *p); static void *_tmp_23_rule(Parser *p); -static asdl_seq *_loop0_24_rule(Parser *p); -static asdl_seq *_loop1_25_rule(Parser *p); -static asdl_seq *_loop0_27_rule(Parser *p); -static asdl_seq *_gather_26_rule(Parser *p); -static void *_tmp_28_rule(Parser *p); -static asdl_seq *_loop0_30_rule(Parser *p); -static asdl_seq *_gather_29_rule(Parser *p); -static void *_tmp_31_rule(Parser *p); -static asdl_seq *_loop1_32_rule(Parser *p); -static void *_tmp_33_rule(Parser *p); +static void *_tmp_24_rule(Parser *p); +static asdl_seq *_loop0_25_rule(Parser *p); +static asdl_seq *_loop1_26_rule(Parser *p); +static asdl_seq *_loop0_28_rule(Parser *p); +static asdl_seq *_gather_27_rule(Parser *p); +static void *_tmp_29_rule(Parser *p); +static asdl_seq *_loop0_31_rule(Parser *p); +static asdl_seq *_gather_30_rule(Parser *p); +static void *_tmp_32_rule(Parser *p); +static asdl_seq *_loop1_33_rule(Parser *p); static void *_tmp_34_rule(Parser *p); static void *_tmp_35_rule(Parser *p); -static asdl_seq *_loop0_36_rule(Parser *p); +static void *_tmp_36_rule(Parser *p); static asdl_seq *_loop0_37_rule(Parser *p); static asdl_seq *_loop0_38_rule(Parser *p); -static asdl_seq *_loop1_39_rule(Parser *p); -static asdl_seq *_loop0_40_rule(Parser *p); -static asdl_seq *_loop1_41_rule(Parser *p); +static asdl_seq *_loop0_39_rule(Parser *p); +static asdl_seq *_loop1_40_rule(Parser *p); +static asdl_seq *_loop0_41_rule(Parser *p); static asdl_seq *_loop1_42_rule(Parser *p); static asdl_seq *_loop1_43_rule(Parser *p); -static asdl_seq *_loop0_44_rule(Parser *p); -static asdl_seq *_loop1_45_rule(Parser *p); -static asdl_seq *_loop0_46_rule(Parser *p); -static asdl_seq *_loop1_47_rule(Parser *p); -static asdl_seq *_loop0_48_rule(Parser *p); +static asdl_seq *_loop1_44_rule(Parser *p); +static asdl_seq *_loop0_45_rule(Parser *p); +static asdl_seq *_loop1_46_rule(Parser *p); +static asdl_seq *_loop0_47_rule(Parser *p); +static asdl_seq *_loop1_48_rule(Parser *p); static asdl_seq *_loop0_49_rule(Parser *p); -static asdl_seq *_loop1_50_rule(Parser *p); -static asdl_seq *_loop0_52_rule(Parser *p); -static asdl_seq *_gather_51_rule(Parser *p); -static asdl_seq *_loop0_54_rule(Parser *p); -static asdl_seq *_gather_53_rule(Parser *p); -static asdl_seq *_loop0_56_rule(Parser *p); -static asdl_seq *_gather_55_rule(Parser *p); -static asdl_seq *_loop0_58_rule(Parser *p); -static asdl_seq *_gather_57_rule(Parser *p); -static void *_tmp_59_rule(Parser *p); -static asdl_seq *_loop1_60_rule(Parser *p); +static asdl_seq *_loop0_50_rule(Parser *p); +static asdl_seq *_loop1_51_rule(Parser *p); +static asdl_seq *_loop0_53_rule(Parser *p); +static asdl_seq *_gather_52_rule(Parser *p); +static asdl_seq *_loop0_55_rule(Parser *p); +static asdl_seq *_gather_54_rule(Parser *p); +static asdl_seq *_loop0_57_rule(Parser *p); +static asdl_seq *_gather_56_rule(Parser *p); +static asdl_seq *_loop0_59_rule(Parser *p); +static asdl_seq *_gather_58_rule(Parser *p); +static void *_tmp_60_rule(Parser *p); static asdl_seq *_loop1_61_rule(Parser *p); -static void *_tmp_62_rule(Parser *p); +static asdl_seq *_loop1_62_rule(Parser *p); static void *_tmp_63_rule(Parser *p); -static asdl_seq *_loop1_64_rule(Parser *p); -static asdl_seq *_loop0_66_rule(Parser *p); -static asdl_seq *_gather_65_rule(Parser *p); -static void *_tmp_67_rule(Parser *p); +static void *_tmp_64_rule(Parser *p); +static asdl_seq *_loop1_65_rule(Parser *p); +static asdl_seq *_loop0_67_rule(Parser *p); +static asdl_seq *_gather_66_rule(Parser *p); static void *_tmp_68_rule(Parser *p); static void *_tmp_69_rule(Parser *p); static void *_tmp_70_rule(Parser *p); -static asdl_seq *_loop0_72_rule(Parser *p); -static asdl_seq *_gather_71_rule(Parser *p); -static asdl_seq *_loop0_74_rule(Parser *p); -static asdl_seq *_gather_73_rule(Parser *p); -static void *_tmp_75_rule(Parser *p); -static asdl_seq *_loop0_77_rule(Parser *p); -static asdl_seq *_gather_76_rule(Parser *p); -static asdl_seq *_loop0_79_rule(Parser *p); -static asdl_seq *_gather_78_rule(Parser *p); -static asdl_seq *_loop1_80_rule(Parser *p); +static void *_tmp_71_rule(Parser *p); +static asdl_seq *_loop0_73_rule(Parser *p); +static asdl_seq *_gather_72_rule(Parser *p); +static asdl_seq *_loop0_75_rule(Parser *p); +static asdl_seq *_gather_74_rule(Parser *p); +static void *_tmp_76_rule(Parser *p); +static asdl_seq *_loop0_78_rule(Parser *p); +static asdl_seq *_gather_77_rule(Parser *p); +static asdl_seq *_loop0_80_rule(Parser *p); +static asdl_seq *_gather_79_rule(Parser *p); static asdl_seq *_loop1_81_rule(Parser *p); -static asdl_seq *_loop0_83_rule(Parser *p); -static asdl_seq *_gather_82_rule(Parser *p); -static asdl_seq *_loop1_84_rule(Parser *p); +static asdl_seq *_loop1_82_rule(Parser *p); +static asdl_seq *_loop0_84_rule(Parser *p); +static asdl_seq *_gather_83_rule(Parser *p); static asdl_seq *_loop1_85_rule(Parser *p); static asdl_seq *_loop1_86_rule(Parser *p); -static void *_tmp_87_rule(Parser *p); -static asdl_seq *_loop0_89_rule(Parser *p); -static asdl_seq *_gather_88_rule(Parser *p); -static void *_tmp_90_rule(Parser *p); +static asdl_seq *_loop1_87_rule(Parser *p); +static void *_tmp_88_rule(Parser *p); +static asdl_seq *_loop0_90_rule(Parser *p); +static asdl_seq *_gather_89_rule(Parser *p); static void *_tmp_91_rule(Parser *p); static void *_tmp_92_rule(Parser *p); static void *_tmp_93_rule(Parser *p); static void *_tmp_94_rule(Parser *p); -static asdl_seq *_loop0_95_rule(Parser *p); -static asdl_seq *_loop0_96_rule(Parser *p); +static void *_tmp_95_rule(Parser *p); +static void *_tmp_96_rule(Parser *p); static asdl_seq *_loop0_97_rule(Parser *p); -static asdl_seq *_loop1_98_rule(Parser *p); +static asdl_seq *_loop0_98_rule(Parser *p); static asdl_seq *_loop0_99_rule(Parser *p); static asdl_seq *_loop1_100_rule(Parser *p); -static asdl_seq *_loop1_101_rule(Parser *p); +static asdl_seq *_loop0_101_rule(Parser *p); static asdl_seq *_loop1_102_rule(Parser *p); -static asdl_seq *_loop0_103_rule(Parser *p); +static asdl_seq *_loop1_103_rule(Parser *p); static asdl_seq *_loop1_104_rule(Parser *p); static asdl_seq *_loop0_105_rule(Parser *p); static asdl_seq *_loop1_106_rule(Parser *p); static asdl_seq *_loop0_107_rule(Parser *p); static asdl_seq *_loop1_108_rule(Parser *p); -static asdl_seq *_loop1_109_rule(Parser *p); -static void *_tmp_110_rule(Parser *p); +static asdl_seq *_loop0_109_rule(Parser *p); +static asdl_seq *_loop1_110_rule(Parser *p); +static void *_tmp_111_rule(Parser *p); static asdl_seq *_loop0_112_rule(Parser *p); -static asdl_seq *_gather_111_rule(Parser *p); static asdl_seq *_loop1_113_rule(Parser *p); -static asdl_seq *_loop0_114_rule(Parser *p); -static asdl_seq *_loop0_115_rule(Parser *p); -static void *_tmp_116_rule(Parser *p); +static void *_tmp_114_rule(Parser *p); +static asdl_seq *_loop0_116_rule(Parser *p); +static asdl_seq *_gather_115_rule(Parser *p); +static asdl_seq *_loop1_117_rule(Parser *p); static asdl_seq *_loop0_118_rule(Parser *p); -static asdl_seq *_gather_117_rule(Parser *p); -static void *_tmp_119_rule(Parser *p); -static asdl_seq *_loop0_121_rule(Parser *p); -static asdl_seq *_gather_120_rule(Parser *p); -static asdl_seq *_loop0_123_rule(Parser *p); -static asdl_seq *_gather_122_rule(Parser *p); +static asdl_seq *_loop0_119_rule(Parser *p); +static void *_tmp_120_rule(Parser *p); +static asdl_seq *_loop0_122_rule(Parser *p); +static asdl_seq *_gather_121_rule(Parser *p); +static void *_tmp_123_rule(Parser *p); static asdl_seq *_loop0_125_rule(Parser *p); static asdl_seq *_gather_124_rule(Parser *p); static asdl_seq *_loop0_127_rule(Parser *p); static asdl_seq *_gather_126_rule(Parser *p); -static asdl_seq *_loop0_128_rule(Parser *p); -static asdl_seq *_loop0_130_rule(Parser *p); -static asdl_seq *_gather_129_rule(Parser *p); -static asdl_seq *_loop1_131_rule(Parser *p); -static void *_tmp_132_rule(Parser *p); +static asdl_seq *_loop0_129_rule(Parser *p); +static asdl_seq *_gather_128_rule(Parser *p); +static asdl_seq *_loop0_131_rule(Parser *p); +static asdl_seq *_gather_130_rule(Parser *p); +static asdl_seq *_loop0_132_rule(Parser *p); static asdl_seq *_loop0_134_rule(Parser *p); static asdl_seq *_gather_133_rule(Parser *p); -static asdl_seq *_loop0_136_rule(Parser *p); -static asdl_seq *_gather_135_rule(Parser *p); +static asdl_seq *_loop1_135_rule(Parser *p); +static void *_tmp_136_rule(Parser *p); static asdl_seq *_loop0_138_rule(Parser *p); static asdl_seq *_gather_137_rule(Parser *p); static asdl_seq *_loop0_140_rule(Parser *p); static asdl_seq *_gather_139_rule(Parser *p); static asdl_seq *_loop0_142_rule(Parser *p); static asdl_seq *_gather_141_rule(Parser *p); -static void *_tmp_143_rule(Parser *p); -static void *_tmp_144_rule(Parser *p); -static void *_tmp_145_rule(Parser *p); -static void *_tmp_146_rule(Parser *p); +static asdl_seq *_loop0_144_rule(Parser *p); +static asdl_seq *_gather_143_rule(Parser *p); +static asdl_seq *_loop0_146_rule(Parser *p); +static asdl_seq *_gather_145_rule(Parser *p); static void *_tmp_147_rule(Parser *p); static void *_tmp_148_rule(Parser *p); static void *_tmp_149_rule(Parser *p); @@ -944,79 +981,79 @@ static void *_tmp_150_rule(Parser *p); static void *_tmp_151_rule(Parser *p); static void *_tmp_152_rule(Parser *p); static void *_tmp_153_rule(Parser *p); -static asdl_seq *_loop0_154_rule(Parser *p); -static asdl_seq *_loop0_155_rule(Parser *p); -static asdl_seq *_loop0_156_rule(Parser *p); +static void *_tmp_154_rule(Parser *p); +static void *_tmp_155_rule(Parser *p); +static void *_tmp_156_rule(Parser *p); static void *_tmp_157_rule(Parser *p); static void *_tmp_158_rule(Parser *p); -static void *_tmp_159_rule(Parser *p); -static void *_tmp_160_rule(Parser *p); -static void *_tmp_161_rule(Parser *p); -static asdl_seq *_loop0_162_rule(Parser *p); -static asdl_seq *_loop0_163_rule(Parser *p); -static asdl_seq *_loop0_164_rule(Parser *p); -static asdl_seq *_loop1_165_rule(Parser *p); +static asdl_seq *_loop0_159_rule(Parser *p); +static asdl_seq *_loop0_160_rule(Parser *p); +static asdl_seq *_loop0_161_rule(Parser *p); +static void *_tmp_162_rule(Parser *p); +static void *_tmp_163_rule(Parser *p); +static void *_tmp_164_rule(Parser *p); +static void *_tmp_165_rule(Parser *p); static void *_tmp_166_rule(Parser *p); static asdl_seq *_loop0_167_rule(Parser *p); -static void *_tmp_168_rule(Parser *p); +static asdl_seq *_loop0_168_rule(Parser *p); static asdl_seq *_loop0_169_rule(Parser *p); static asdl_seq *_loop1_170_rule(Parser *p); static void *_tmp_171_rule(Parser *p); -static void *_tmp_172_rule(Parser *p); +static asdl_seq *_loop0_172_rule(Parser *p); static void *_tmp_173_rule(Parser *p); static asdl_seq *_loop0_174_rule(Parser *p); -static void *_tmp_175_rule(Parser *p); +static asdl_seq *_loop1_175_rule(Parser *p); static void *_tmp_176_rule(Parser *p); -static asdl_seq *_loop1_177_rule(Parser *p); +static void *_tmp_177_rule(Parser *p); static void *_tmp_178_rule(Parser *p); static asdl_seq *_loop0_179_rule(Parser *p); -static asdl_seq *_loop0_180_rule(Parser *p); -static asdl_seq *_loop0_181_rule(Parser *p); -static asdl_seq *_loop0_183_rule(Parser *p); -static asdl_seq *_gather_182_rule(Parser *p); -static void *_tmp_184_rule(Parser *p); +static void *_tmp_180_rule(Parser *p); +static void *_tmp_181_rule(Parser *p); +static asdl_seq *_loop1_182_rule(Parser *p); +static void *_tmp_183_rule(Parser *p); +static asdl_seq *_loop0_184_rule(Parser *p); static asdl_seq *_loop0_185_rule(Parser *p); -static void *_tmp_186_rule(Parser *p); -static asdl_seq *_loop0_187_rule(Parser *p); -static asdl_seq *_loop1_188_rule(Parser *p); -static asdl_seq *_loop1_189_rule(Parser *p); -static void *_tmp_190_rule(Parser *p); +static asdl_seq *_loop0_186_rule(Parser *p); +static asdl_seq *_loop0_188_rule(Parser *p); +static asdl_seq *_gather_187_rule(Parser *p); +static void *_tmp_189_rule(Parser *p); +static asdl_seq *_loop0_190_rule(Parser *p); static void *_tmp_191_rule(Parser *p); static asdl_seq *_loop0_192_rule(Parser *p); -static void *_tmp_193_rule(Parser *p); -static void *_tmp_194_rule(Parser *p); +static asdl_seq *_loop1_193_rule(Parser *p); +static asdl_seq *_loop1_194_rule(Parser *p); static void *_tmp_195_rule(Parser *p); +static void *_tmp_196_rule(Parser *p); static asdl_seq *_loop0_197_rule(Parser *p); -static asdl_seq *_gather_196_rule(Parser *p); -static asdl_seq *_loop0_199_rule(Parser *p); -static asdl_seq *_gather_198_rule(Parser *p); -static asdl_seq *_loop0_201_rule(Parser *p); -static asdl_seq *_gather_200_rule(Parser *p); -static asdl_seq *_loop0_203_rule(Parser *p); -static asdl_seq *_gather_202_rule(Parser *p); -static void *_tmp_204_rule(Parser *p); -static asdl_seq *_loop0_205_rule(Parser *p); -static asdl_seq *_loop1_206_rule(Parser *p); -static void *_tmp_207_rule(Parser *p); +static void *_tmp_198_rule(Parser *p); +static void *_tmp_199_rule(Parser *p); +static void *_tmp_200_rule(Parser *p); +static asdl_seq *_loop0_202_rule(Parser *p); +static asdl_seq *_gather_201_rule(Parser *p); +static asdl_seq *_loop0_204_rule(Parser *p); +static asdl_seq *_gather_203_rule(Parser *p); +static asdl_seq *_loop0_206_rule(Parser *p); +static asdl_seq *_gather_205_rule(Parser *p); static asdl_seq *_loop0_208_rule(Parser *p); -static asdl_seq *_loop1_209_rule(Parser *p); -static void *_tmp_210_rule(Parser *p); -static void *_tmp_211_rule(Parser *p); +static asdl_seq *_gather_207_rule(Parser *p); +static void *_tmp_209_rule(Parser *p); +static asdl_seq *_loop0_210_rule(Parser *p); +static asdl_seq *_loop1_211_rule(Parser *p); static void *_tmp_212_rule(Parser *p); -static void *_tmp_213_rule(Parser *p); -static void *_tmp_214_rule(Parser *p); +static asdl_seq *_loop0_213_rule(Parser *p); +static asdl_seq *_loop1_214_rule(Parser *p); static void *_tmp_215_rule(Parser *p); static void *_tmp_216_rule(Parser *p); static void *_tmp_217_rule(Parser *p); static void *_tmp_218_rule(Parser *p); static void *_tmp_219_rule(Parser *p); -static asdl_seq *_loop0_221_rule(Parser *p); -static asdl_seq *_gather_220_rule(Parser *p); +static void *_tmp_220_rule(Parser *p); +static void *_tmp_221_rule(Parser *p); static void *_tmp_222_rule(Parser *p); static void *_tmp_223_rule(Parser *p); static void *_tmp_224_rule(Parser *p); -static void *_tmp_225_rule(Parser *p); -static void *_tmp_226_rule(Parser *p); +static asdl_seq *_loop0_226_rule(Parser *p); +static asdl_seq *_gather_225_rule(Parser *p); static void *_tmp_227_rule(Parser *p); static void *_tmp_228_rule(Parser *p); static void *_tmp_229_rule(Parser *p); @@ -1030,7 +1067,7 @@ static void *_tmp_236_rule(Parser *p); static void *_tmp_237_rule(Parser *p); static void *_tmp_238_rule(Parser *p); static void *_tmp_239_rule(Parser *p); -static void *_tmp_240_rule(Parser *p); +static asdl_seq *_loop0_240_rule(Parser *p); static void *_tmp_241_rule(Parser *p); static void *_tmp_242_rule(Parser *p); static void *_tmp_243_rule(Parser *p); @@ -1042,6 +1079,27 @@ static void *_tmp_248_rule(Parser *p); static void *_tmp_249_rule(Parser *p); static void *_tmp_250_rule(Parser *p); static void *_tmp_251_rule(Parser *p); +static void *_tmp_252_rule(Parser *p); +static void *_tmp_253_rule(Parser *p); +static void *_tmp_254_rule(Parser *p); +static void *_tmp_255_rule(Parser *p); +static void *_tmp_256_rule(Parser *p); +static void *_tmp_257_rule(Parser *p); +static void *_tmp_258_rule(Parser *p); +static void *_tmp_259_rule(Parser *p); +static void *_tmp_260_rule(Parser *p); +static void *_tmp_261_rule(Parser *p); +static void *_tmp_262_rule(Parser *p); +static void *_tmp_263_rule(Parser *p); +static void *_tmp_264_rule(Parser *p); +static void *_tmp_265_rule(Parser *p); +static void *_tmp_266_rule(Parser *p); +static void *_tmp_267_rule(Parser *p); +static void *_tmp_268_rule(Parser *p); +static void *_tmp_269_rule(Parser *p); +static void *_tmp_270_rule(Parser *p); +static void *_tmp_271_rule(Parser *p); +static void *_tmp_272_rule(Parser *p); // file: statements? $ @@ -1247,7 +1305,7 @@ func_type_rule(Parser *p) return _res; } -// fstring: star_expressions +// fstring: FSTRING_START fstring_middle* FSTRING_END static expr_ty fstring_rule(Parser *p) { @@ -1261,24 +1319,35 @@ fstring_rule(Parser *p) } expr_ty _res = NULL; int _mark = p->mark; - { // star_expressions + { // FSTRING_START fstring_middle* FSTRING_END if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> fstring[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); - expr_ty star_expressions_var; + D(fprintf(stderr, "%*c> fstring[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "FSTRING_START fstring_middle* FSTRING_END")); + Token * a; + asdl_seq * b; + Token * c; if ( - (star_expressions_var = star_expressions_rule(p)) // star_expressions + (a = _PyPegen_expect_token(p, FSTRING_START)) // token='FSTRING_START' + && + (b = _loop0_3_rule(p)) // fstring_middle* + && + (c = _PyPegen_expect_token(p, FSTRING_END)) // token='FSTRING_END' ) { - D(fprintf(stderr, "%*c+ fstring[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); - _res = star_expressions_var; + D(fprintf(stderr, "%*c+ fstring[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "FSTRING_START fstring_middle* FSTRING_END")); + _res = _PyPegen_joined_str ( p , a , ( asdl_expr_seq* ) b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } goto done; } p->mark = _mark; D(fprintf(stderr, "%*c%s fstring[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "FSTRING_START fstring_middle* FSTRING_END")); } _res = NULL; done: @@ -1308,7 +1377,7 @@ statements_rule(Parser *p) D(fprintf(stderr, "%*c> statements[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statement+")); asdl_seq * a; if ( - (a = _loop1_3_rule(p)) // statement+ + (a = _loop1_4_rule(p)) // statement+ ) { D(fprintf(stderr, "%*c+ statements[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "statement+")); @@ -1584,7 +1653,7 @@ simple_stmts_rule(Parser *p) asdl_stmt_seq* a; Token * newline_var; if ( - (a = (asdl_stmt_seq*)_gather_4_rule(p)) // ';'.simple_stmt+ + (a = (asdl_stmt_seq*)_gather_5_rule(p)) // ';'.simple_stmt+ && (_opt_var = _PyPegen_expect_token(p, 13), !p->error_indicator) // ';'? && @@ -1731,7 +1800,7 @@ simple_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('import' | 'from') import_stmt")); stmt_ty import_stmt_var; if ( - _PyPegen_lookahead(1, _tmp_6_rule, p) + _PyPegen_lookahead(1, _tmp_7_rule, p) && (import_stmt_var = import_stmt_rule(p)) // import_stmt ) @@ -1806,7 +1875,7 @@ simple_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'del' del_stmt")); stmt_ty del_stmt_var; if ( - _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 603) // token='del' + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 604) // token='del' && (del_stmt_var = del_stmt_rule(p)) // del_stmt ) @@ -2006,7 +2075,7 @@ compound_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('def' | '@' | ASYNC) function_def")); stmt_ty function_def_var; if ( - _PyPegen_lookahead(1, _tmp_7_rule, p) + _PyPegen_lookahead(1, _tmp_8_rule, p) && (function_def_var = function_def_rule(p)) // function_def ) @@ -2027,7 +2096,7 @@ compound_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'if' if_stmt")); stmt_ty if_stmt_var; if ( - _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 641) // token='if' + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 642) // token='if' && (if_stmt_var = if_stmt_rule(p)) // if_stmt ) @@ -2048,7 +2117,7 @@ compound_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('class' | '@') class_def")); stmt_ty class_def_var; if ( - _PyPegen_lookahead(1, _tmp_8_rule, p) + _PyPegen_lookahead(1, _tmp_9_rule, p) && (class_def_var = class_def_rule(p)) // class_def ) @@ -2069,7 +2138,7 @@ compound_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('with' | ASYNC) with_stmt")); stmt_ty with_stmt_var; if ( - _PyPegen_lookahead(1, _tmp_9_rule, p) + _PyPegen_lookahead(1, _tmp_10_rule, p) && (with_stmt_var = with_stmt_rule(p)) // with_stmt ) @@ -2090,7 +2159,7 @@ compound_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('for' | ASYNC) for_stmt")); stmt_ty for_stmt_var; if ( - _PyPegen_lookahead(1, _tmp_10_rule, p) + _PyPegen_lookahead(1, _tmp_11_rule, p) && (for_stmt_var = for_stmt_rule(p)) // for_stmt ) @@ -2111,7 +2180,7 @@ compound_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'try' try_stmt")); stmt_ty try_stmt_var; if ( - _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 623) // token='try' + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 624) // token='try' && (try_stmt_var = try_stmt_rule(p)) // try_stmt ) @@ -2132,7 +2201,7 @@ compound_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'while' while_stmt")); stmt_ty while_stmt_var; if ( - _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 646) // token='while' + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 647) // token='while' && (while_stmt_var = while_stmt_rule(p)) // while_stmt ) @@ -2215,7 +2284,7 @@ assignment_rule(Parser *p) && (b = expression_rule(p)) // expression && - (c = _tmp_11_rule(p), !p->error_indicator) // ['=' annotated_rhs] + (c = _tmp_12_rule(p), !p->error_indicator) // ['=' annotated_rhs] ) { D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME ':' expression ['=' annotated_rhs]")); @@ -2251,13 +2320,13 @@ assignment_rule(Parser *p) expr_ty b; void *c; if ( - (a = _tmp_12_rule(p)) // '(' single_target ')' | single_subscript_attribute_target + (a = _tmp_13_rule(p)) // '(' single_target ')' | single_subscript_attribute_target && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && (b = expression_rule(p)) // expression && - (c = _tmp_13_rule(p), !p->error_indicator) // ['=' annotated_rhs] + (c = _tmp_14_rule(p), !p->error_indicator) // ['=' annotated_rhs] ) { D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "('(' single_target ')' | single_subscript_attribute_target) ':' expression ['=' annotated_rhs]")); @@ -2292,9 +2361,9 @@ assignment_rule(Parser *p) void *b; void *tc; if ( - (a = (asdl_expr_seq*)_loop1_14_rule(p)) // ((star_targets '='))+ + (a = (asdl_expr_seq*)_loop1_15_rule(p)) // ((star_targets '='))+ && - (b = _tmp_15_rule(p)) // yield_expr | star_expressions + (b = _tmp_16_rule(p)) // yield_expr | star_expressions && _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' && @@ -2340,7 +2409,7 @@ assignment_rule(Parser *p) && (_cut_var = 1) && - (c = _tmp_16_rule(p)) // yield_expr | star_expressions + (c = _tmp_17_rule(p)) // yield_expr | star_expressions ) { D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "single_target augassign ~ (yield_expr | star_expressions)")); @@ -2899,7 +2968,7 @@ raise_stmt_rule(Parser *p) && (a = expression_rule(p)) // expression && - (b = _tmp_17_rule(p), !p->error_indicator) // ['from' expression] + (b = _tmp_18_rule(p), !p->error_indicator) // ['from' expression] ) { D(fprintf(stderr, "%*c+ raise_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'raise' expression ['from' expression]")); @@ -2997,7 +3066,7 @@ global_stmt_rule(Parser *p) if ( (_keyword = _PyPegen_expect_token(p, 523)) // token='global' && - (a = (asdl_expr_seq*)_gather_18_rule(p)) // ','.NAME+ + (a = (asdl_expr_seq*)_gather_19_rule(p)) // ','.NAME+ ) { D(fprintf(stderr, "%*c+ global_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'global' ','.NAME+")); @@ -3062,7 +3131,7 @@ nonlocal_stmt_rule(Parser *p) if ( (_keyword = _PyPegen_expect_token(p, 524)) // token='nonlocal' && - (a = (asdl_expr_seq*)_gather_20_rule(p)) // ','.NAME+ + (a = (asdl_expr_seq*)_gather_21_rule(p)) // ','.NAME+ ) { D(fprintf(stderr, "%*c+ nonlocal_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'nonlocal' ','.NAME+")); @@ -3125,11 +3194,11 @@ del_stmt_rule(Parser *p) Token * _keyword; asdl_expr_seq* a; if ( - (_keyword = _PyPegen_expect_token(p, 603)) // token='del' + (_keyword = _PyPegen_expect_token(p, 604)) // token='del' && (a = del_targets_rule(p)) // del_targets && - _PyPegen_lookahead(1, _tmp_22_rule, p) + _PyPegen_lookahead(1, _tmp_23_rule, p) ) { D(fprintf(stderr, "%*c+ del_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'del' del_targets &(';' | NEWLINE)")); @@ -3278,7 +3347,7 @@ assert_stmt_rule(Parser *p) && (a = expression_rule(p)) // expression && - (b = _tmp_23_rule(p), !p->error_indicator) // [',' expression] + (b = _tmp_24_rule(p), !p->error_indicator) // [',' expression] ) { D(fprintf(stderr, "%*c+ assert_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'assert' expression [',' expression]")); @@ -3418,7 +3487,7 @@ import_name_rule(Parser *p) Token * _keyword; asdl_alias_seq* a; if ( - (_keyword = _PyPegen_expect_token(p, 606)) // token='import' + (_keyword = _PyPegen_expect_token(p, 607)) // token='import' && (a = dotted_as_names_rule(p)) // dotted_as_names ) @@ -3488,13 +3557,13 @@ import_from_rule(Parser *p) expr_ty b; asdl_alias_seq* c; if ( - (_keyword = _PyPegen_expect_token(p, 607)) // token='from' + (_keyword = _PyPegen_expect_token(p, 608)) // token='from' && - (a = _loop0_24_rule(p)) // (('.' | '...'))* + (a = _loop0_25_rule(p)) // (('.' | '...'))* && (b = dotted_name_rule(p)) // dotted_name && - (_keyword_1 = _PyPegen_expect_token(p, 606)) // token='import' + (_keyword_1 = _PyPegen_expect_token(p, 607)) // token='import' && (c = import_from_targets_rule(p)) // import_from_targets ) @@ -3532,11 +3601,11 @@ import_from_rule(Parser *p) asdl_seq * a; asdl_alias_seq* b; if ( - (_keyword = _PyPegen_expect_token(p, 607)) // token='from' + (_keyword = _PyPegen_expect_token(p, 608)) // token='from' && - (a = _loop1_25_rule(p)) // (('.' | '...'))+ + (a = _loop1_26_rule(p)) // (('.' | '...'))+ && - (_keyword_1 = _PyPegen_expect_token(p, 606)) // token='import' + (_keyword_1 = _PyPegen_expect_token(p, 607)) // token='import' && (b = import_from_targets_rule(p)) // import_from_targets ) @@ -3731,7 +3800,7 @@ import_from_as_names_rule(Parser *p) D(fprintf(stderr, "%*c> import_from_as_names[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.import_from_as_name+")); asdl_alias_seq* a; if ( - (a = (asdl_alias_seq*)_gather_26_rule(p)) // ','.import_from_as_name+ + (a = (asdl_alias_seq*)_gather_27_rule(p)) // ','.import_from_as_name+ ) { D(fprintf(stderr, "%*c+ import_from_as_names[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.import_from_as_name+")); @@ -3787,7 +3856,7 @@ import_from_as_name_rule(Parser *p) if ( (a = _PyPegen_name_token(p)) // NAME && - (b = _tmp_28_rule(p), !p->error_indicator) // ['as' NAME] + (b = _tmp_29_rule(p), !p->error_indicator) // ['as' NAME] ) { D(fprintf(stderr, "%*c+ import_from_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME ['as' NAME]")); @@ -3840,7 +3909,7 @@ dotted_as_names_rule(Parser *p) D(fprintf(stderr, "%*c> dotted_as_names[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.dotted_as_name+")); asdl_alias_seq* a; if ( - (a = (asdl_alias_seq*)_gather_29_rule(p)) // ','.dotted_as_name+ + (a = (asdl_alias_seq*)_gather_30_rule(p)) // ','.dotted_as_name+ ) { D(fprintf(stderr, "%*c+ dotted_as_names[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.dotted_as_name+")); @@ -3896,7 +3965,7 @@ dotted_as_name_rule(Parser *p) if ( (a = dotted_name_rule(p)) // dotted_name && - (b = _tmp_31_rule(p), !p->error_indicator) // ['as' NAME] + (b = _tmp_32_rule(p), !p->error_indicator) // ['as' NAME] ) { D(fprintf(stderr, "%*c+ dotted_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_name ['as' NAME]")); @@ -4151,7 +4220,7 @@ decorators_rule(Parser *p) D(fprintf(stderr, "%*c> decorators[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(('@' named_expression NEWLINE))+")); asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_loop1_32_rule(p)) // (('@' named_expression NEWLINE))+ + (a = (asdl_expr_seq*)_loop1_33_rule(p)) // (('@' named_expression NEWLINE))+ ) { D(fprintf(stderr, "%*c+ decorators[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(('@' named_expression NEWLINE))+")); @@ -4293,11 +4362,11 @@ class_def_raw_rule(Parser *p) void *b; asdl_stmt_seq* c; if ( - (_keyword = _PyPegen_expect_token(p, 653)) // token='class' + (_keyword = _PyPegen_expect_token(p, 654)) // token='class' && (a = _PyPegen_name_token(p)) // NAME && - (b = _tmp_33_rule(p), !p->error_indicator) // ['(' arguments? ')'] + (b = _tmp_34_rule(p), !p->error_indicator) // ['(' arguments? ')'] && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -4459,7 +4528,7 @@ function_def_raw_rule(Parser *p) void *params; void *tc; if ( - (_keyword = _PyPegen_expect_token(p, 651)) // token='def' + (_keyword = _PyPegen_expect_token(p, 652)) // token='def' && (n = _PyPegen_name_token(p)) // NAME && @@ -4469,7 +4538,7 @@ function_def_raw_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' && - (a = _tmp_34_rule(p), !p->error_indicator) // ['->' expression] + (a = _tmp_35_rule(p), !p->error_indicator) // ['->' expression] && (_literal_2 = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && @@ -4519,7 +4588,7 @@ function_def_raw_rule(Parser *p) if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' && - (_keyword = _PyPegen_expect_token(p, 651)) // token='def' + (_keyword = _PyPegen_expect_token(p, 652)) // token='def' && (n = _PyPegen_name_token(p)) // NAME && @@ -4529,7 +4598,7 @@ function_def_raw_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' && - (a = _tmp_35_rule(p), !p->error_indicator) // ['->' expression] + (a = _tmp_36_rule(p), !p->error_indicator) // ['->' expression] && (_literal_2 = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && @@ -4656,9 +4725,9 @@ parameters_rule(Parser *p) if ( (a = slash_no_default_rule(p)) // slash_no_default && - (b = (asdl_arg_seq*)_loop0_36_rule(p)) // param_no_default* + (b = (asdl_arg_seq*)_loop0_37_rule(p)) // param_no_default* && - (c = _loop0_37_rule(p)) // param_with_default* + (c = _loop0_38_rule(p)) // param_with_default* && (d = star_etc_rule(p), !p->error_indicator) // star_etc? ) @@ -4688,7 +4757,7 @@ parameters_rule(Parser *p) if ( (a = slash_with_default_rule(p)) // slash_with_default && - (b = _loop0_38_rule(p)) // param_with_default* + (b = _loop0_39_rule(p)) // param_with_default* && (c = star_etc_rule(p), !p->error_indicator) // star_etc? ) @@ -4716,9 +4785,9 @@ parameters_rule(Parser *p) asdl_seq * b; void *c; if ( - (a = (asdl_arg_seq*)_loop1_39_rule(p)) // param_no_default+ + (a = (asdl_arg_seq*)_loop1_40_rule(p)) // param_no_default+ && - (b = _loop0_40_rule(p)) // param_with_default* + (b = _loop0_41_rule(p)) // param_with_default* && (c = star_etc_rule(p), !p->error_indicator) // star_etc? ) @@ -4745,7 +4814,7 @@ parameters_rule(Parser *p) asdl_seq * a; void *b; if ( - (a = _loop1_41_rule(p)) // param_with_default+ + (a = _loop1_42_rule(p)) // param_with_default+ && (b = star_etc_rule(p), !p->error_indicator) // star_etc? ) @@ -4817,7 +4886,7 @@ slash_no_default_rule(Parser *p) Token * _literal_1; asdl_arg_seq* a; if ( - (a = (asdl_arg_seq*)_loop1_42_rule(p)) // param_no_default+ + (a = (asdl_arg_seq*)_loop1_43_rule(p)) // param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -4846,7 +4915,7 @@ slash_no_default_rule(Parser *p) Token * _literal; asdl_arg_seq* a; if ( - (a = (asdl_arg_seq*)_loop1_43_rule(p)) // param_no_default+ + (a = (asdl_arg_seq*)_loop1_44_rule(p)) // param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -4899,9 +4968,9 @@ slash_with_default_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _loop0_44_rule(p)) // param_no_default* + (a = _loop0_45_rule(p)) // param_no_default* && - (b = _loop1_45_rule(p)) // param_with_default+ + (b = _loop1_46_rule(p)) // param_with_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -4931,9 +5000,9 @@ slash_with_default_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _loop0_46_rule(p)) // param_no_default* + (a = _loop0_47_rule(p)) // param_no_default* && - (b = _loop1_47_rule(p)) // param_with_default+ + (b = _loop1_48_rule(p)) // param_with_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -5012,7 +5081,7 @@ star_etc_rule(Parser *p) && (a = param_no_default_rule(p)) // param_no_default && - (b = _loop0_48_rule(p)) // param_maybe_default* + (b = _loop0_49_rule(p)) // param_maybe_default* && (c = kwds_rule(p), !p->error_indicator) // kwds? ) @@ -5045,7 +5114,7 @@ star_etc_rule(Parser *p) && (a = param_no_default_star_annotation_rule(p)) // param_no_default_star_annotation && - (b = _loop0_49_rule(p)) // param_maybe_default* + (b = _loop0_50_rule(p)) // param_maybe_default* && (c = kwds_rule(p), !p->error_indicator) // kwds? ) @@ -5078,7 +5147,7 @@ star_etc_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' && - (b = _loop1_50_rule(p)) // param_maybe_default+ + (b = _loop1_51_rule(p)) // param_maybe_default+ && (c = kwds_rule(p), !p->error_indicator) // kwds? ) @@ -5871,7 +5940,7 @@ if_stmt_rule(Parser *p) asdl_stmt_seq* b; stmt_ty c; if ( - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (a = named_expression_rule(p)) // named_expression && @@ -5916,7 +5985,7 @@ if_stmt_rule(Parser *p) asdl_stmt_seq* b; void *c; if ( - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (a = named_expression_rule(p)) // named_expression && @@ -6012,7 +6081,7 @@ elif_stmt_rule(Parser *p) asdl_stmt_seq* b; stmt_ty c; if ( - (_keyword = _PyPegen_expect_token(p, 643)) // token='elif' + (_keyword = _PyPegen_expect_token(p, 644)) // token='elif' && (a = named_expression_rule(p)) // named_expression && @@ -6057,7 +6126,7 @@ elif_stmt_rule(Parser *p) asdl_stmt_seq* b; void *c; if ( - (_keyword = _PyPegen_expect_token(p, 643)) // token='elif' + (_keyword = _PyPegen_expect_token(p, 644)) // token='elif' && (a = named_expression_rule(p)) // named_expression && @@ -6139,7 +6208,7 @@ else_block_rule(Parser *p) Token * _literal; asdl_stmt_seq* b; if ( - (_keyword = _PyPegen_expect_token(p, 644)) // token='else' + (_keyword = _PyPegen_expect_token(p, 645)) // token='else' && (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && @@ -6219,7 +6288,7 @@ while_stmt_rule(Parser *p) asdl_stmt_seq* b; void *c; if ( - (_keyword = _PyPegen_expect_token(p, 646)) // token='while' + (_keyword = _PyPegen_expect_token(p, 647)) // token='while' && (a = named_expression_rule(p)) // named_expression && @@ -6320,11 +6389,11 @@ for_stmt_rule(Parser *p) expr_ty t; void *tc; if ( - (_keyword = _PyPegen_expect_token(p, 649)) // token='for' + (_keyword = _PyPegen_expect_token(p, 650)) // token='for' && (t = star_targets_rule(p)) // star_targets && - (_keyword_1 = _PyPegen_expect_token(p, 650)) // token='in' + (_keyword_1 = _PyPegen_expect_token(p, 651)) // token='in' && (_cut_var = 1) && @@ -6384,11 +6453,11 @@ for_stmt_rule(Parser *p) if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' && - (_keyword = _PyPegen_expect_token(p, 649)) // token='for' + (_keyword = _PyPegen_expect_token(p, 650)) // token='for' && (t = star_targets_rule(p)) // star_targets && - (_keyword_1 = _PyPegen_expect_token(p, 650)) // token='in' + (_keyword_1 = _PyPegen_expect_token(p, 651)) // token='in' && (_cut_var = 1) && @@ -6517,11 +6586,11 @@ with_stmt_rule(Parser *p) asdl_withitem_seq* a; asdl_stmt_seq* b; if ( - (_keyword = _PyPegen_expect_token(p, 614)) // token='with' + (_keyword = _PyPegen_expect_token(p, 615)) // token='with' && (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = (asdl_withitem_seq*)_gather_51_rule(p)) // ','.with_item+ + (a = (asdl_withitem_seq*)_gather_52_rule(p)) // ','.with_item+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -6566,9 +6635,9 @@ with_stmt_rule(Parser *p) asdl_stmt_seq* b; void *tc; if ( - (_keyword = _PyPegen_expect_token(p, 614)) // token='with' + (_keyword = _PyPegen_expect_token(p, 615)) // token='with' && - (a = (asdl_withitem_seq*)_gather_53_rule(p)) // ','.with_item+ + (a = (asdl_withitem_seq*)_gather_54_rule(p)) // ','.with_item+ && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -6617,11 +6686,11 @@ with_stmt_rule(Parser *p) if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' && - (_keyword = _PyPegen_expect_token(p, 614)) // token='with' + (_keyword = _PyPegen_expect_token(p, 615)) // token='with' && (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = (asdl_withitem_seq*)_gather_55_rule(p)) // ','.with_item+ + (a = (asdl_withitem_seq*)_gather_56_rule(p)) // ','.with_item+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -6669,9 +6738,9 @@ with_stmt_rule(Parser *p) if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' && - (_keyword = _PyPegen_expect_token(p, 614)) // token='with' + (_keyword = _PyPegen_expect_token(p, 615)) // token='with' && - (a = (asdl_withitem_seq*)_gather_57_rule(p)) // ','.with_item+ + (a = (asdl_withitem_seq*)_gather_58_rule(p)) // ','.with_item+ && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -6756,11 +6825,11 @@ with_item_rule(Parser *p) if ( (e = expression_rule(p)) // expression && - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (t = star_target_rule(p)) // star_target && - _PyPegen_lookahead(1, _tmp_59_rule, p) + _PyPegen_lookahead(1, _tmp_60_rule, p) ) { D(fprintf(stderr, "%*c+ with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression 'as' star_target &(',' | ')' | ':')")); @@ -6882,7 +6951,7 @@ try_stmt_rule(Parser *p) asdl_stmt_seq* b; asdl_stmt_seq* f; if ( - (_keyword = _PyPegen_expect_token(p, 623)) // token='try' + (_keyword = _PyPegen_expect_token(p, 624)) // token='try' && (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && @@ -6926,13 +6995,13 @@ try_stmt_rule(Parser *p) asdl_excepthandler_seq* ex; void *f; if ( - (_keyword = _PyPegen_expect_token(p, 623)) // token='try' + (_keyword = _PyPegen_expect_token(p, 624)) // token='try' && (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (b = block_rule(p)) // block && - (ex = (asdl_excepthandler_seq*)_loop1_60_rule(p)) // except_block+ + (ex = (asdl_excepthandler_seq*)_loop1_61_rule(p)) // except_block+ && (el = else_block_rule(p), !p->error_indicator) // else_block? && @@ -6974,13 +7043,13 @@ try_stmt_rule(Parser *p) asdl_excepthandler_seq* ex; void *f; if ( - (_keyword = _PyPegen_expect_token(p, 623)) // token='try' + (_keyword = _PyPegen_expect_token(p, 624)) // token='try' && (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (b = block_rule(p)) // block && - (ex = (asdl_excepthandler_seq*)_loop1_61_rule(p)) // except_star_block+ + (ex = (asdl_excepthandler_seq*)_loop1_62_rule(p)) // except_star_block+ && (el = else_block_rule(p), !p->error_indicator) // else_block? && @@ -7073,11 +7142,11 @@ except_block_rule(Parser *p) expr_ty e; void *t; if ( - (_keyword = _PyPegen_expect_token(p, 636)) // token='except' + (_keyword = _PyPegen_expect_token(p, 637)) // token='except' && (e = expression_rule(p)) // expression && - (t = _tmp_62_rule(p), !p->error_indicator) // ['as' NAME] + (t = _tmp_63_rule(p), !p->error_indicator) // ['as' NAME] && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -7116,7 +7185,7 @@ except_block_rule(Parser *p) Token * _literal; asdl_stmt_seq* b; if ( - (_keyword = _PyPegen_expect_token(p, 636)) // token='except' + (_keyword = _PyPegen_expect_token(p, 637)) // token='except' && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -7228,13 +7297,13 @@ except_star_block_rule(Parser *p) expr_ty e; void *t; if ( - (_keyword = _PyPegen_expect_token(p, 636)) // token='except' + (_keyword = _PyPegen_expect_token(p, 637)) // token='except' && (_literal = _PyPegen_expect_token(p, 16)) // token='*' && (e = expression_rule(p)) // expression && - (t = _tmp_63_rule(p), !p->error_indicator) // ['as' NAME] + (t = _tmp_64_rule(p), !p->error_indicator) // ['as' NAME] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' && @@ -7331,7 +7400,7 @@ finally_block_rule(Parser *p) Token * _literal; asdl_stmt_seq* a; if ( - (_keyword = _PyPegen_expect_token(p, 632)) // token='finally' + (_keyword = _PyPegen_expect_token(p, 633)) // token='finally' && (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && @@ -7406,7 +7475,7 @@ match_stmt_rule(Parser *p) && (indent_var = _PyPegen_expect_token(p, INDENT)) // token='INDENT' && - (cases = (asdl_match_case_seq*)_loop1_64_rule(p)) // case_block+ + (cases = (asdl_match_case_seq*)_loop1_65_rule(p)) // case_block+ && (dedent_var = _PyPegen_expect_token(p, DEDENT)) // token='DEDENT' ) @@ -7643,7 +7712,7 @@ guard_rule(Parser *p) Token * _keyword; expr_ty guard; if ( - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (guard = named_expression_rule(p)) // named_expression ) @@ -7841,7 +7910,7 @@ as_pattern_rule(Parser *p) if ( (pattern = or_pattern_rule(p)) // or_pattern && - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (target = pattern_capture_target_rule(p)) // pattern_capture_target ) @@ -7924,7 +7993,7 @@ or_pattern_rule(Parser *p) D(fprintf(stderr, "%*c> or_pattern[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'|'.closed_pattern+")); asdl_pattern_seq* patterns; if ( - (patterns = (asdl_pattern_seq*)_gather_65_rule(p)) // '|'.closed_pattern+ + (patterns = (asdl_pattern_seq*)_gather_66_rule(p)) // '|'.closed_pattern+ ) { D(fprintf(stderr, "%*c+ or_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'|'.closed_pattern+")); @@ -8179,7 +8248,7 @@ literal_pattern_rule(Parser *p) if ( (value = signed_number_rule(p)) // signed_number && - _PyPegen_lookahead(0, _tmp_67_rule, p) + _PyPegen_lookahead(0, _tmp_68_rule, p) ) { D(fprintf(stderr, "%*c+ literal_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "signed_number !('+' | '-')")); @@ -8278,7 +8347,7 @@ literal_pattern_rule(Parser *p) D(fprintf(stderr, "%*c> literal_pattern[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 601)) // token='None' + (_keyword = _PyPegen_expect_token(p, 602)) // token='None' ) { D(fprintf(stderr, "%*c+ literal_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); @@ -8311,7 +8380,7 @@ literal_pattern_rule(Parser *p) D(fprintf(stderr, "%*c> literal_pattern[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 600)) // token='True' + (_keyword = _PyPegen_expect_token(p, 601)) // token='True' ) { D(fprintf(stderr, "%*c+ literal_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); @@ -8344,7 +8413,7 @@ literal_pattern_rule(Parser *p) D(fprintf(stderr, "%*c> literal_pattern[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 602)) // token='False' + (_keyword = _PyPegen_expect_token(p, 603)) // token='False' ) { D(fprintf(stderr, "%*c+ literal_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); @@ -8414,7 +8483,7 @@ literal_expr_rule(Parser *p) if ( (signed_number_var = signed_number_rule(p)) // signed_number && - _PyPegen_lookahead(0, _tmp_68_rule, p) + _PyPegen_lookahead(0, _tmp_69_rule, p) ) { D(fprintf(stderr, "%*c+ literal_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "signed_number !('+' | '-')")); @@ -8471,7 +8540,7 @@ literal_expr_rule(Parser *p) D(fprintf(stderr, "%*c> literal_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 601)) // token='None' + (_keyword = _PyPegen_expect_token(p, 602)) // token='None' ) { D(fprintf(stderr, "%*c+ literal_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); @@ -8504,7 +8573,7 @@ literal_expr_rule(Parser *p) D(fprintf(stderr, "%*c> literal_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 600)) // token='True' + (_keyword = _PyPegen_expect_token(p, 601)) // token='True' ) { D(fprintf(stderr, "%*c+ literal_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); @@ -8537,7 +8606,7 @@ literal_expr_rule(Parser *p) D(fprintf(stderr, "%*c> literal_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 602)) // token='False' + (_keyword = _PyPegen_expect_token(p, 603)) // token='False' ) { D(fprintf(stderr, "%*c+ literal_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); @@ -9021,7 +9090,7 @@ pattern_capture_target_rule(Parser *p) && (name = _PyPegen_name_token(p)) // NAME && - _PyPegen_lookahead(0, _tmp_69_rule, p) + _PyPegen_lookahead(0, _tmp_70_rule, p) ) { D(fprintf(stderr, "%*c+ pattern_capture_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!\"_\" NAME !('.' | '(' | '=')")); @@ -9138,7 +9207,7 @@ value_pattern_rule(Parser *p) if ( (attr = attr_rule(p)) // attr && - _PyPegen_lookahead(0, _tmp_70_rule, p) + _PyPegen_lookahead(0, _tmp_71_rule, p) ) { D(fprintf(stderr, "%*c+ value_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "attr !('.' | '(' | '=')")); @@ -9564,7 +9633,7 @@ maybe_sequence_pattern_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_seq * patterns; if ( - (patterns = _gather_71_rule(p)) // ','.maybe_star_pattern+ + (patterns = _gather_72_rule(p)) // ','.maybe_star_pattern+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -9976,13 +10045,13 @@ items_pattern_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> items_pattern[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.key_value_pattern+")); - asdl_seq * _gather_73_var; + asdl_seq * _gather_74_var; if ( - (_gather_73_var = _gather_73_rule(p)) // ','.key_value_pattern+ + (_gather_74_var = _gather_74_rule(p)) // ','.key_value_pattern+ ) { D(fprintf(stderr, "%*c+ items_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.key_value_pattern+")); - _res = _gather_73_var; + _res = _gather_74_var; goto done; } p->mark = _mark; @@ -10019,7 +10088,7 @@ key_value_pattern_rule(Parser *p) void *key; pattern_ty pattern; if ( - (key = _tmp_75_rule(p)) // literal_expr | attr + (key = _tmp_76_rule(p)) // literal_expr | attr && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -10350,7 +10419,7 @@ positional_patterns_rule(Parser *p) D(fprintf(stderr, "%*c> positional_patterns[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.pattern+")); asdl_pattern_seq* args; if ( - (args = (asdl_pattern_seq*)_gather_76_rule(p)) // ','.pattern+ + (args = (asdl_pattern_seq*)_gather_77_rule(p)) // ','.pattern+ ) { D(fprintf(stderr, "%*c+ positional_patterns[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.pattern+")); @@ -10392,13 +10461,13 @@ keyword_patterns_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> keyword_patterns[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.keyword_pattern+")); - asdl_seq * _gather_78_var; + asdl_seq * _gather_79_var; if ( - (_gather_78_var = _gather_78_rule(p)) // ','.keyword_pattern+ + (_gather_79_var = _gather_79_rule(p)) // ','.keyword_pattern+ ) { D(fprintf(stderr, "%*c+ keyword_patterns[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.keyword_pattern+")); - _res = _gather_78_var; + _res = _gather_79_var; goto done; } p->mark = _mark; @@ -10497,7 +10566,7 @@ expressions_rule(Parser *p) if ( (a = expression_rule(p)) // expression && - (b = _loop1_80_rule(p)) // ((',' expression))+ + (b = _loop1_81_rule(p)) // ((',' expression))+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -10669,11 +10738,11 @@ expression_rule(Parser *p) if ( (a = disjunction_rule(p)) // disjunction && - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (b = disjunction_rule(p)) // disjunction && - (_keyword_1 = _PyPegen_expect_token(p, 644)) // token='else' + (_keyword_1 = _PyPegen_expect_token(p, 645)) // token='else' && (c = expression_rule(p)) // expression ) @@ -10780,7 +10849,7 @@ yield_expr_rule(Parser *p) if ( (_keyword = _PyPegen_expect_token(p, 573)) // token='yield' && - (_keyword_1 = _PyPegen_expect_token(p, 607)) // token='from' + (_keyword_1 = _PyPegen_expect_token(p, 608)) // token='from' && (a = expression_rule(p)) // expression ) @@ -10888,7 +10957,7 @@ star_expressions_rule(Parser *p) if ( (a = star_expression_rule(p)) // star_expression && - (b = _loop1_81_rule(p)) // ((',' star_expression))+ + (b = _loop1_82_rule(p)) // ((',' star_expression))+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -11089,7 +11158,7 @@ star_named_expressions_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_82_rule(p)) // ','.star_named_expression+ + (a = (asdl_expr_seq*)_gather_83_rule(p)) // ','.star_named_expression+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -11389,7 +11458,7 @@ disjunction_rule(Parser *p) if ( (a = conjunction_rule(p)) // conjunction && - (b = _loop1_84_rule(p)) // (('or' conjunction))+ + (b = _loop1_85_rule(p)) // (('or' conjunction))+ ) { D(fprintf(stderr, "%*c+ disjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "conjunction (('or' conjunction))+")); @@ -11478,7 +11547,7 @@ conjunction_rule(Parser *p) if ( (a = inversion_rule(p)) // inversion && - (b = _loop1_85_rule(p)) // (('and' inversion))+ + (b = _loop1_86_rule(p)) // (('and' inversion))+ ) { D(fprintf(stderr, "%*c+ conjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "inversion (('and' inversion))+")); @@ -11652,7 +11721,7 @@ comparison_rule(Parser *p) if ( (a = bitwise_or_rule(p)) // bitwise_or && - (b = _loop1_86_rule(p)) // compare_op_bitwise_or_pair+ + (b = _loop1_87_rule(p)) // compare_op_bitwise_or_pair+ ) { D(fprintf(stderr, "%*c+ comparison[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_or compare_op_bitwise_or_pair+")); @@ -11989,10 +12058,10 @@ noteq_bitwise_or_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> noteq_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('!=') bitwise_or")); - void *_tmp_87_var; + void *_tmp_88_var; expr_ty a; if ( - (_tmp_87_var = _tmp_87_rule(p)) // '!=' + (_tmp_88_var = _tmp_88_rule(p)) // '!=' && (a = bitwise_or_rule(p)) // bitwise_or ) @@ -12230,7 +12299,7 @@ notin_bitwise_or_rule(Parser *p) if ( (_keyword = _PyPegen_expect_token(p, 581)) // token='not' && - (_keyword_1 = _PyPegen_expect_token(p, 650)) // token='in' + (_keyword_1 = _PyPegen_expect_token(p, 651)) // token='in' && (a = bitwise_or_rule(p)) // bitwise_or ) @@ -12277,7 +12346,7 @@ in_bitwise_or_rule(Parser *p) Token * _keyword; expr_ty a; if ( - (_keyword = _PyPegen_expect_token(p, 650)) // token='in' + (_keyword = _PyPegen_expect_token(p, 651)) // token='in' && (a = bitwise_or_rule(p)) // bitwise_or ) @@ -14027,7 +14096,7 @@ slices_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_88_rule(p)) // ','.(slice | starred_expression)+ + (a = (asdl_expr_seq*)_gather_89_rule(p)) // ','.(slice | starred_expression)+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -14100,7 +14169,7 @@ slice_rule(Parser *p) && (b = expression_rule(p), !p->error_indicator) // expression? && - (c = _tmp_90_rule(p), !p->error_indicator) // [':' expression?] + (c = _tmp_91_rule(p), !p->error_indicator) // [':' expression?] ) { D(fprintf(stderr, "%*c+ slice[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression? ':' expression? [':' expression?]")); @@ -14160,7 +14229,7 @@ slice_rule(Parser *p) // | 'True' // | 'False' // | 'None' -// | &STRING strings +// | &(STRING | FSTRING_START) strings // | NUMBER // | &'(' (tuple | group | genexp) // | &'[' (list | listcomp) @@ -14215,7 +14284,7 @@ atom_rule(Parser *p) D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 600)) // token='True' + (_keyword = _PyPegen_expect_token(p, 601)) // token='True' ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); @@ -14248,7 +14317,7 @@ atom_rule(Parser *p) D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 602)) // token='False' + (_keyword = _PyPegen_expect_token(p, 603)) // token='False' ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); @@ -14281,7 +14350,7 @@ atom_rule(Parser *p) D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 601)) // token='None' + (_keyword = _PyPegen_expect_token(p, 602)) // token='None' ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); @@ -14306,26 +14375,26 @@ atom_rule(Parser *p) D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'None'")); } - { // &STRING strings + { // &(STRING | FSTRING_START) strings if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&STRING strings")); + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&(STRING | FSTRING_START) strings")); expr_ty strings_var; if ( - _PyPegen_lookahead(1, _PyPegen_string_token, p) + _PyPegen_lookahead(1, _tmp_92_rule, p) && (strings_var = strings_rule(p)) // strings ) { - D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&STRING strings")); + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&(STRING | FSTRING_START) strings")); _res = strings_var; goto done; } p->mark = _mark; D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&STRING strings")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&(STRING | FSTRING_START) strings")); } { // NUMBER if (p->error_indicator) { @@ -14352,15 +14421,15 @@ atom_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'(' (tuple | group | genexp)")); - void *_tmp_91_var; + void *_tmp_93_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 7) // token='(' && - (_tmp_91_var = _tmp_91_rule(p)) // tuple | group | genexp + (_tmp_93_var = _tmp_93_rule(p)) // tuple | group | genexp ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'(' (tuple | group | genexp)")); - _res = _tmp_91_var; + _res = _tmp_93_var; goto done; } p->mark = _mark; @@ -14373,15 +14442,15 @@ atom_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'[' (list | listcomp)")); - void *_tmp_92_var; + void *_tmp_94_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 9) // token='[' && - (_tmp_92_var = _tmp_92_rule(p)) // list | listcomp + (_tmp_94_var = _tmp_94_rule(p)) // list | listcomp ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'[' (list | listcomp)")); - _res = _tmp_92_var; + _res = _tmp_94_var; goto done; } p->mark = _mark; @@ -14394,15 +14463,15 @@ atom_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'{' (dict | set | dictcomp | setcomp)")); - void *_tmp_93_var; + void *_tmp_95_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 25) // token='{' && - (_tmp_93_var = _tmp_93_rule(p)) // dict | set | dictcomp | setcomp + (_tmp_95_var = _tmp_95_rule(p)) // dict | set | dictcomp | setcomp ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'{' (dict | set | dictcomp | setcomp)")); - _res = _tmp_93_var; + _res = _tmp_95_var; goto done; } p->mark = _mark; @@ -14474,7 +14543,7 @@ group_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = _tmp_94_rule(p)) // yield_expr | named_expression + (a = _tmp_96_rule(p)) // yield_expr | named_expression && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) @@ -14551,7 +14620,7 @@ lambdef_rule(Parser *p) void *a; expr_ty b; if ( - (_keyword = _PyPegen_expect_token(p, 586)) // token='lambda' + (_keyword = _PyPegen_expect_token(p, 600)) // token='lambda' && (a = lambda_params_rule(p), !p->error_indicator) // lambda_params? && @@ -14678,9 +14747,9 @@ lambda_parameters_rule(Parser *p) if ( (a = lambda_slash_no_default_rule(p)) // lambda_slash_no_default && - (b = (asdl_arg_seq*)_loop0_95_rule(p)) // lambda_param_no_default* + (b = (asdl_arg_seq*)_loop0_97_rule(p)) // lambda_param_no_default* && - (c = _loop0_96_rule(p)) // lambda_param_with_default* + (c = _loop0_98_rule(p)) // lambda_param_with_default* && (d = lambda_star_etc_rule(p), !p->error_indicator) // lambda_star_etc? ) @@ -14710,7 +14779,7 @@ lambda_parameters_rule(Parser *p) if ( (a = lambda_slash_with_default_rule(p)) // lambda_slash_with_default && - (b = _loop0_97_rule(p)) // lambda_param_with_default* + (b = _loop0_99_rule(p)) // lambda_param_with_default* && (c = lambda_star_etc_rule(p), !p->error_indicator) // lambda_star_etc? ) @@ -14738,9 +14807,9 @@ lambda_parameters_rule(Parser *p) asdl_seq * b; void *c; if ( - (a = (asdl_arg_seq*)_loop1_98_rule(p)) // lambda_param_no_default+ + (a = (asdl_arg_seq*)_loop1_100_rule(p)) // lambda_param_no_default+ && - (b = _loop0_99_rule(p)) // lambda_param_with_default* + (b = _loop0_101_rule(p)) // lambda_param_with_default* && (c = lambda_star_etc_rule(p), !p->error_indicator) // lambda_star_etc? ) @@ -14767,7 +14836,7 @@ lambda_parameters_rule(Parser *p) asdl_seq * a; void *b; if ( - (a = _loop1_100_rule(p)) // lambda_param_with_default+ + (a = _loop1_102_rule(p)) // lambda_param_with_default+ && (b = lambda_star_etc_rule(p), !p->error_indicator) // lambda_star_etc? ) @@ -14841,7 +14910,7 @@ lambda_slash_no_default_rule(Parser *p) Token * _literal_1; asdl_arg_seq* a; if ( - (a = (asdl_arg_seq*)_loop1_101_rule(p)) // lambda_param_no_default+ + (a = (asdl_arg_seq*)_loop1_103_rule(p)) // lambda_param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -14870,7 +14939,7 @@ lambda_slash_no_default_rule(Parser *p) Token * _literal; asdl_arg_seq* a; if ( - (a = (asdl_arg_seq*)_loop1_102_rule(p)) // lambda_param_no_default+ + (a = (asdl_arg_seq*)_loop1_104_rule(p)) // lambda_param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -14923,9 +14992,9 @@ lambda_slash_with_default_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _loop0_103_rule(p)) // lambda_param_no_default* + (a = _loop0_105_rule(p)) // lambda_param_no_default* && - (b = _loop1_104_rule(p)) // lambda_param_with_default+ + (b = _loop1_106_rule(p)) // lambda_param_with_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -14955,9 +15024,9 @@ lambda_slash_with_default_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _loop0_105_rule(p)) // lambda_param_no_default* + (a = _loop0_107_rule(p)) // lambda_param_no_default* && - (b = _loop1_106_rule(p)) // lambda_param_with_default+ + (b = _loop1_108_rule(p)) // lambda_param_with_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -15035,7 +15104,7 @@ lambda_star_etc_rule(Parser *p) && (a = lambda_param_no_default_rule(p)) // lambda_param_no_default && - (b = _loop0_107_rule(p)) // lambda_param_maybe_default* + (b = _loop0_109_rule(p)) // lambda_param_maybe_default* && (c = lambda_kwds_rule(p), !p->error_indicator) // lambda_kwds? ) @@ -15068,7 +15137,7 @@ lambda_star_etc_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' && - (b = _loop1_108_rule(p)) // lambda_param_maybe_default+ + (b = _loop1_110_rule(p)) // lambda_param_maybe_default+ && (c = lambda_kwds_rule(p), !p->error_indicator) // lambda_kwds? ) @@ -15475,7 +15544,387 @@ lambda_param_rule(Parser *p) return _res; } -// strings: STRING+ +// fstring_middle: fstring_replacement_field | FSTRING_MIDDLE +static expr_ty +fstring_middle_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // fstring_replacement_field + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> fstring_middle[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_replacement_field")); + expr_ty fstring_replacement_field_var; + if ( + (fstring_replacement_field_var = fstring_replacement_field_rule(p)) // fstring_replacement_field + ) + { + D(fprintf(stderr, "%*c+ fstring_middle[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "fstring_replacement_field")); + _res = fstring_replacement_field_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring_middle[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_replacement_field")); + } + { // FSTRING_MIDDLE + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> fstring_middle[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "FSTRING_MIDDLE")); + Token * t; + if ( + (t = _PyPegen_expect_token(p, FSTRING_MIDDLE)) // token='FSTRING_MIDDLE' + ) + { + D(fprintf(stderr, "%*c+ fstring_middle[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "FSTRING_MIDDLE")); + _res = _PyPegen_constant_from_token ( p , t ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring_middle[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "FSTRING_MIDDLE")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// fstring_replacement_field: +// | '{' (yield_expr | star_expressions) "="? fstring_conversion? fstring_full_format_spec? '}' +// | invalid_replacement_field +static expr_ty +fstring_replacement_field_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + p->level--; + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '{' (yield_expr | star_expressions) "="? fstring_conversion? fstring_full_format_spec? '}' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> fstring_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) \"=\"? fstring_conversion? fstring_full_format_spec? '}'")); + Token * _literal; + Token * _literal_1; + void *a; + void *conversion; + void *debug_expr; + void *format; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = _tmp_111_rule(p)) // yield_expr | star_expressions + && + (debug_expr = _PyPegen_expect_token(p, 22), !p->error_indicator) // "="? + && + (conversion = fstring_conversion_rule(p), !p->error_indicator) // fstring_conversion? + && + (format = fstring_full_format_spec_rule(p), !p->error_indicator) // fstring_full_format_spec? + && + (_literal_1 = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ fstring_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) \"=\"? fstring_conversion? fstring_full_format_spec? '}'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + p->level--; + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _PyPegen_formatted_value ( p , a , debug_expr , conversion , format , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' (yield_expr | star_expressions) \"=\"? fstring_conversion? fstring_full_format_spec? '}'")); + } + if (p->call_invalid_rules) { // invalid_replacement_field + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> fstring_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_replacement_field")); + void *invalid_replacement_field_var; + if ( + (invalid_replacement_field_var = invalid_replacement_field_rule(p)) // invalid_replacement_field + ) + { + D(fprintf(stderr, "%*c+ fstring_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_replacement_field")); + _res = invalid_replacement_field_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_replacement_field")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// fstring_conversion: "!" NAME +static expr_ty +fstring_conversion_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // "!" NAME + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> fstring_conversion[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "\"!\" NAME")); + expr_ty conv; + Token * conv_token; + if ( + (conv_token = _PyPegen_expect_token(p, 54)) // token='!' + && + (conv = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ fstring_conversion[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "\"!\" NAME")); + _res = _PyPegen_check_fstring_conversion ( p , conv_token , conv ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring_conversion[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "\"!\" NAME")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// fstring_full_format_spec: ':' fstring_format_spec* +static expr_ty +fstring_full_format_spec_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + p->level--; + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // ':' fstring_format_spec* + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> fstring_full_format_spec[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':' fstring_format_spec*")); + Token * _literal; + asdl_seq * spec; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (spec = _loop0_112_rule(p)) // fstring_format_spec* + ) + { + D(fprintf(stderr, "%*c+ fstring_full_format_spec[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' fstring_format_spec*")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + p->level--; + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = spec ? _PyAST_JoinedStr ( ( asdl_expr_seq* ) spec , EXTRA ) : NULL; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring_full_format_spec[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':' fstring_format_spec*")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// fstring_format_spec: FSTRING_MIDDLE | fstring_replacement_field +static expr_ty +fstring_format_spec_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // FSTRING_MIDDLE + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> fstring_format_spec[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "FSTRING_MIDDLE")); + Token * t; + if ( + (t = _PyPegen_expect_token(p, FSTRING_MIDDLE)) // token='FSTRING_MIDDLE' + ) + { + D(fprintf(stderr, "%*c+ fstring_format_spec[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "FSTRING_MIDDLE")); + _res = _PyPegen_constant_from_token ( p , t ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring_format_spec[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "FSTRING_MIDDLE")); + } + { // fstring_replacement_field + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> fstring_format_spec[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_replacement_field")); + expr_ty fstring_replacement_field_var; + if ( + (fstring_replacement_field_var = fstring_replacement_field_rule(p)) // fstring_replacement_field + ) + { + D(fprintf(stderr, "%*c+ fstring_format_spec[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "fstring_replacement_field")); + _res = fstring_replacement_field_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring_format_spec[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_replacement_field")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// string: STRING +static expr_ty +string_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // STRING + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> string[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "STRING")); + Token* s; + if ( + (s = (Token*)_PyPegen_string_token(p)) // STRING + ) + { + D(fprintf(stderr, "%*c+ string[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "STRING")); + _res = _PyPegen_constant_from_string ( p , s ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s string[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "STRING")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// strings: ((fstring | string))+ static expr_ty strings_rule(Parser *p) { @@ -15493,19 +15942,37 @@ strings_rule(Parser *p) return _res; } int _mark = p->mark; - { // STRING+ + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + p->level--; + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // ((fstring | string))+ if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> strings[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "STRING+")); - asdl_seq * a; + D(fprintf(stderr, "%*c> strings[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((fstring | string))+")); + asdl_expr_seq* a; if ( - (a = _loop1_109_rule(p)) // STRING+ + (a = (asdl_expr_seq*)_loop1_113_rule(p)) // ((fstring | string))+ ) { - D(fprintf(stderr, "%*c+ strings[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "STRING+")); - _res = _PyPegen_concatenate_strings ( p , a ); + D(fprintf(stderr, "%*c+ strings[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "((fstring | string))+")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + p->level--; + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _PyPegen_concatenate_strings ( p , a , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; p->level--; @@ -15515,7 +15982,7 @@ strings_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s strings[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "STRING+")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "((fstring | string))+")); } _res = NULL; done: @@ -15627,7 +16094,7 @@ tuple_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = _tmp_110_rule(p), !p->error_indicator) // [star_named_expression ',' star_named_expressions?] + (a = _tmp_114_rule(p), !p->error_indicator) // [star_named_expression ',' star_named_expressions?] && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) @@ -15845,7 +16312,7 @@ double_starred_kvpairs_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_seq * a; if ( - (a = _gather_111_rule(p)) // ','.double_starred_kvpair+ + (a = _gather_115_rule(p)) // ','.double_starred_kvpair+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -16007,7 +16474,7 @@ for_if_clauses_rule(Parser *p) D(fprintf(stderr, "%*c> for_if_clauses[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause+")); asdl_comprehension_seq* a; if ( - (a = (asdl_comprehension_seq*)_loop1_113_rule(p)) // for_if_clause+ + (a = (asdl_comprehension_seq*)_loop1_117_rule(p)) // for_if_clause+ ) { D(fprintf(stderr, "%*c+ for_if_clauses[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "for_if_clause+")); @@ -16062,17 +16529,17 @@ for_if_clause_rule(Parser *p) if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' && - (_keyword = _PyPegen_expect_token(p, 649)) // token='for' + (_keyword = _PyPegen_expect_token(p, 650)) // token='for' && (a = star_targets_rule(p)) // star_targets && - (_keyword_1 = _PyPegen_expect_token(p, 650)) // token='in' + (_keyword_1 = _PyPegen_expect_token(p, 651)) // token='in' && (_cut_var = 1) && (b = disjunction_rule(p)) // disjunction && - (c = (asdl_expr_seq*)_loop0_114_rule(p)) // (('if' disjunction))* + (c = (asdl_expr_seq*)_loop0_118_rule(p)) // (('if' disjunction))* ) { D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); @@ -16105,17 +16572,17 @@ for_if_clause_rule(Parser *p) expr_ty b; asdl_expr_seq* c; if ( - (_keyword = _PyPegen_expect_token(p, 649)) // token='for' + (_keyword = _PyPegen_expect_token(p, 650)) // token='for' && (a = star_targets_rule(p)) // star_targets && - (_keyword_1 = _PyPegen_expect_token(p, 650)) // token='in' + (_keyword_1 = _PyPegen_expect_token(p, 651)) // token='in' && (_cut_var = 1) && (b = disjunction_rule(p)) // disjunction && - (c = (asdl_expr_seq*)_loop0_115_rule(p)) // (('if' disjunction))* + (c = (asdl_expr_seq*)_loop0_119_rule(p)) // (('if' disjunction))* ) { D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); @@ -16378,7 +16845,7 @@ genexp_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = _tmp_116_rule(p)) // assignment_expression | expression !':=' + (a = _tmp_120_rule(p)) // assignment_expression | expression !':=' && (b = for_if_clauses_rule(p)) // for_if_clauses && @@ -16630,9 +17097,9 @@ args_rule(Parser *p) asdl_expr_seq* a; void *b; if ( - (a = (asdl_expr_seq*)_gather_117_rule(p)) // ','.(starred_expression | (assignment_expression | expression !':=') !'=')+ + (a = (asdl_expr_seq*)_gather_121_rule(p)) // ','.(starred_expression | (assignment_expression | expression !':=') !'=')+ && - (b = _tmp_119_rule(p), !p->error_indicator) // [',' kwargs] + (b = _tmp_123_rule(p), !p->error_indicator) // [',' kwargs] ) { D(fprintf(stderr, "%*c+ args[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | (assignment_expression | expression !':=') !'=')+ [',' kwargs]")); @@ -16723,11 +17190,11 @@ kwargs_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _gather_120_rule(p)) // ','.kwarg_or_starred+ + (a = _gather_124_rule(p)) // ','.kwarg_or_starred+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (b = _gather_122_rule(p)) // ','.kwarg_or_double_starred+ + (b = _gather_126_rule(p)) // ','.kwarg_or_double_starred+ ) { D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+")); @@ -16749,13 +17216,13 @@ kwargs_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> kwargs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+")); - asdl_seq * _gather_124_var; + asdl_seq * _gather_128_var; if ( - (_gather_124_var = _gather_124_rule(p)) // ','.kwarg_or_starred+ + (_gather_128_var = _gather_128_rule(p)) // ','.kwarg_or_starred+ ) { D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+")); - _res = _gather_124_var; + _res = _gather_128_var; goto done; } p->mark = _mark; @@ -16768,13 +17235,13 @@ kwargs_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> kwargs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_double_starred+")); - asdl_seq * _gather_126_var; + asdl_seq * _gather_130_var; if ( - (_gather_126_var = _gather_126_rule(p)) // ','.kwarg_or_double_starred+ + (_gather_130_var = _gather_130_rule(p)) // ','.kwarg_or_double_starred+ ) { D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_double_starred+")); - _res = _gather_126_var; + _res = _gather_130_var; goto done; } p->mark = _mark; @@ -17167,7 +17634,7 @@ star_targets_rule(Parser *p) if ( (a = star_target_rule(p)) // star_target && - (b = _loop0_128_rule(p)) // ((',' star_target))* + (b = _loop0_132_rule(p)) // ((',' star_target))* && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -17224,7 +17691,7 @@ star_targets_list_seq_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_129_rule(p)) // ','.star_target+ + (a = (asdl_expr_seq*)_gather_133_rule(p)) // ','.star_target+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -17275,7 +17742,7 @@ star_targets_tuple_seq_rule(Parser *p) if ( (a = star_target_rule(p)) // star_target && - (b = _loop1_131_rule(p)) // ((',' star_target))+ + (b = _loop1_135_rule(p)) // ((',' star_target))+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -17364,7 +17831,7 @@ star_target_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (a = _tmp_132_rule(p)) // !'*' star_target + (a = _tmp_136_rule(p)) // !'*' star_target ) { D(fprintf(stderr, "%*c+ star_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (!'*' star_target)")); @@ -18295,7 +18762,7 @@ del_targets_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_133_rule(p)) // ','.del_target+ + (a = (asdl_expr_seq*)_gather_137_rule(p)) // ','.del_target+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -18656,7 +19123,7 @@ type_expressions_rule(Parser *p) expr_ty b; expr_ty c; if ( - (a = _gather_135_rule(p)) // ','.expression+ + (a = _gather_139_rule(p)) // ','.expression+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && @@ -18695,7 +19162,7 @@ type_expressions_rule(Parser *p) asdl_seq * a; expr_ty b; if ( - (a = _gather_137_rule(p)) // ','.expression+ + (a = _gather_141_rule(p)) // ','.expression+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && @@ -18728,7 +19195,7 @@ type_expressions_rule(Parser *p) asdl_seq * a; expr_ty b; if ( - (a = _gather_139_rule(p)) // ','.expression+ + (a = _gather_143_rule(p)) // ','.expression+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && @@ -18848,7 +19315,7 @@ type_expressions_rule(Parser *p) D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.expression+")); asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_141_rule(p)) // ','.expression+ + (a = (asdl_expr_seq*)_gather_145_rule(p)) // ','.expression+ ) { D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.expression+")); @@ -18900,7 +19367,7 @@ func_type_comment_rule(Parser *p) && (t = _PyPegen_expect_token(p, TYPE_COMMENT)) // token='TYPE_COMMENT' && - _PyPegen_lookahead(1, _tmp_143_rule, p) + _PyPegen_lookahead(1, _tmp_147_rule, p) ) { D(fprintf(stderr, "%*c+ func_type_comment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE TYPE_COMMENT &(NEWLINE INDENT)")); @@ -19029,7 +19496,7 @@ invalid_arguments_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_opt_var = _tmp_144_rule(p), !p->error_indicator) // [args | expression for_if_clauses] + (_opt_var = _tmp_148_rule(p), !p->error_indicator) // [args | expression for_if_clauses] ) { D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses ',' [args | expression for_if_clauses]")); @@ -19089,13 +19556,13 @@ invalid_arguments_rule(Parser *p) expr_ty a; Token * b; if ( - (_opt_var = _tmp_145_rule(p), !p->error_indicator) // [(args ',')] + (_opt_var = _tmp_149_rule(p), !p->error_indicator) // [(args ',')] && (a = _PyPegen_name_token(p)) // NAME && (b = _PyPegen_expect_token(p, 22)) // token='=' && - _PyPegen_lookahead(1, _tmp_146_rule, p) + _PyPegen_lookahead(1, _tmp_150_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "[(args ',')] NAME '=' &(',' | ')')")); @@ -19234,7 +19701,7 @@ invalid_kwarg_rule(Parser *p) Token* a; Token * b; if ( - (a = (Token*)_tmp_147_rule(p)) // 'True' | 'False' | 'None' + (a = (Token*)_tmp_151_rule(p)) // 'True' | 'False' | 'None' && (b = _PyPegen_expect_token(p, 22)) // token='=' ) @@ -19294,7 +19761,7 @@ invalid_kwarg_rule(Parser *p) expr_ty a; Token * b; if ( - _PyPegen_lookahead(0, _tmp_148_rule, p) + _PyPegen_lookahead(0, _tmp_152_rule, p) && (a = expression_rule(p)) // expression && @@ -19398,11 +19865,11 @@ expression_without_invalid_rule(Parser *p) if ( (a = disjunction_rule(p)) // disjunction && - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (b = disjunction_rule(p)) // disjunction && - (_keyword_1 = _PyPegen_expect_token(p, 644)) // token='else' + (_keyword_1 = _PyPegen_expect_token(p, 645)) // token='else' && (c = expression_rule(p)) // expression ) @@ -19530,6 +19997,7 @@ invalid_legacy_expression_rule(Parser *p) // invalid_expression: // | !(NAME STRING | SOFT_KEYWORD) disjunction expression_without_invalid // | disjunction 'if' disjunction !('else' | ':') +// | 'lambda' lambda_params? ':' &(FSTRING_MIDDLE | fstring_replacement_field) static void * invalid_expression_rule(Parser *p) { @@ -19552,7 +20020,7 @@ invalid_expression_rule(Parser *p) expr_ty a; expr_ty b; if ( - _PyPegen_lookahead(0, _tmp_149_rule, p) + _PyPegen_lookahead(0, _tmp_153_rule, p) && (a = disjunction_rule(p)) // disjunction && @@ -19584,11 +20052,11 @@ invalid_expression_rule(Parser *p) if ( (a = disjunction_rule(p)) // disjunction && - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (b = disjunction_rule(p)) // disjunction && - _PyPegen_lookahead(0, _tmp_150_rule, p) + _PyPegen_lookahead(0, _tmp_154_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "disjunction 'if' disjunction !('else' | ':')")); @@ -19604,6 +20072,39 @@ invalid_expression_rule(Parser *p) D(fprintf(stderr, "%*c%s invalid_expression[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "disjunction 'if' disjunction !('else' | ':')")); } + { // 'lambda' lambda_params? ':' &(FSTRING_MIDDLE | fstring_replacement_field) + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'lambda' lambda_params? ':' &(FSTRING_MIDDLE | fstring_replacement_field)")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + Token * a; + Token * b; + if ( + (a = _PyPegen_expect_token(p, 600)) // token='lambda' + && + (_opt_var = lambda_params_rule(p), !p->error_indicator) // lambda_params? + && + (b = _PyPegen_expect_token(p, 11)) // token=':' + && + _PyPegen_lookahead(1, _tmp_155_rule, p) + ) + { + D(fprintf(stderr, "%*c+ invalid_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'lambda' lambda_params? ':' &(FSTRING_MIDDLE | fstring_replacement_field)")); + _res = RAISE_SYNTAX_ERROR_KNOWN_RANGE ( a , b , "f-string: lambda expressions are not allowed without parentheses" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'lambda' lambda_params? ':' &(FSTRING_MIDDLE | fstring_replacement_field)")); + } _res = NULL; done: p->level--; @@ -19677,7 +20178,7 @@ invalid_named_expression_rule(Parser *p) && (b = bitwise_or_rule(p)) // bitwise_or && - _PyPegen_lookahead(0, _tmp_151_rule, p) + _PyPegen_lookahead(0, _tmp_156_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME '=' bitwise_or !('=' | ':=')")); @@ -19703,7 +20204,7 @@ invalid_named_expression_rule(Parser *p) Token * b; expr_ty bitwise_or_var; if ( - _PyPegen_lookahead(0, _tmp_152_rule, p) + _PyPegen_lookahead(0, _tmp_157_rule, p) && (a = bitwise_or_rule(p)) // bitwise_or && @@ -19711,7 +20212,7 @@ invalid_named_expression_rule(Parser *p) && (bitwise_or_var = bitwise_or_rule(p)) // bitwise_or && - _PyPegen_lookahead(0, _tmp_153_rule, p) + _PyPegen_lookahead(0, _tmp_158_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!(list | tuple | genexp | 'True' | 'None' | 'False') bitwise_or '=' bitwise_or !('=' | ':=')")); @@ -19792,7 +20293,7 @@ invalid_assignment_rule(Parser *p) D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions* ':' expression")); Token * _literal; Token * _literal_1; - asdl_seq * _loop0_154_var; + asdl_seq * _loop0_159_var; expr_ty a; expr_ty expression_var; if ( @@ -19800,7 +20301,7 @@ invalid_assignment_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_loop0_154_var = _loop0_154_rule(p)) // star_named_expressions* + (_loop0_159_var = _loop0_159_rule(p)) // star_named_expressions* && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' && @@ -19857,10 +20358,10 @@ invalid_assignment_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* star_expressions '='")); Token * _literal; - asdl_seq * _loop0_155_var; + asdl_seq * _loop0_160_var; expr_ty a; if ( - (_loop0_155_var = _loop0_155_rule(p)) // ((star_targets '='))* + (_loop0_160_var = _loop0_160_rule(p)) // ((star_targets '='))* && (a = star_expressions_rule(p)) // star_expressions && @@ -19887,10 +20388,10 @@ invalid_assignment_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* yield_expr '='")); Token * _literal; - asdl_seq * _loop0_156_var; + asdl_seq * _loop0_161_var; expr_ty a; if ( - (_loop0_156_var = _loop0_156_rule(p)) // ((star_targets '='))* + (_loop0_161_var = _loop0_161_rule(p)) // ((star_targets '='))* && (a = yield_expr_rule(p)) // yield_expr && @@ -19916,7 +20417,7 @@ invalid_assignment_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions augassign (yield_expr | star_expressions)")); - void *_tmp_157_var; + void *_tmp_162_var; expr_ty a; AugOperator* augassign_var; if ( @@ -19924,7 +20425,7 @@ invalid_assignment_rule(Parser *p) && (augassign_var = augassign_rule(p)) // augassign && - (_tmp_157_var = _tmp_157_rule(p)) // yield_expr | star_expressions + (_tmp_162_var = _tmp_162_rule(p)) // yield_expr | star_expressions ) { D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions augassign (yield_expr | star_expressions)")); @@ -20057,7 +20558,7 @@ invalid_del_stmt_rule(Parser *p) Token * _keyword; expr_ty a; if ( - (_keyword = _PyPegen_expect_token(p, 603)) // token='del' + (_keyword = _PyPegen_expect_token(p, 604)) // token='del' && (a = star_expressions_rule(p)) // star_expressions ) @@ -20150,11 +20651,11 @@ invalid_comprehension_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '(' | '{') starred_expression for_if_clauses")); - void *_tmp_158_var; + void *_tmp_163_var; expr_ty a; asdl_comprehension_seq* for_if_clauses_var; if ( - (_tmp_158_var = _tmp_158_rule(p)) // '[' | '(' | '{' + (_tmp_163_var = _tmp_163_rule(p)) // '[' | '(' | '{' && (a = starred_expression_rule(p)) // starred_expression && @@ -20181,12 +20682,12 @@ invalid_comprehension_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '{') star_named_expression ',' star_named_expressions for_if_clauses")); Token * _literal; - void *_tmp_159_var; + void *_tmp_164_var; expr_ty a; asdl_expr_seq* b; asdl_comprehension_seq* for_if_clauses_var; if ( - (_tmp_159_var = _tmp_159_rule(p)) // '[' | '{' + (_tmp_164_var = _tmp_164_rule(p)) // '[' | '{' && (a = star_named_expression_rule(p)) // star_named_expression && @@ -20216,12 +20717,12 @@ invalid_comprehension_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '{') star_named_expression ',' for_if_clauses")); - void *_tmp_160_var; + void *_tmp_165_var; expr_ty a; Token * b; asdl_comprehension_seq* for_if_clauses_var; if ( - (_tmp_160_var = _tmp_160_rule(p)) // '[' | '{' + (_tmp_165_var = _tmp_165_rule(p)) // '[' | '{' && (a = star_named_expression_rule(p)) // star_named_expression && @@ -20358,13 +20859,13 @@ invalid_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(slash_no_default | slash_with_default) param_maybe_default* '/'")); - asdl_seq * _loop0_162_var; - void *_tmp_161_var; + asdl_seq * _loop0_167_var; + void *_tmp_166_var; Token * a; if ( - (_tmp_161_var = _tmp_161_rule(p)) // slash_no_default | slash_with_default + (_tmp_166_var = _tmp_166_rule(p)) // slash_no_default | slash_with_default && - (_loop0_162_var = _loop0_162_rule(p)) // param_maybe_default* + (_loop0_167_var = _loop0_167_rule(p)) // param_maybe_default* && (a = _PyPegen_expect_token(p, 17)) // token='/' ) @@ -20388,7 +20889,7 @@ invalid_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default? param_no_default* invalid_parameters_helper param_no_default")); - asdl_seq * _loop0_163_var; + asdl_seq * _loop0_168_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings arg_ty a; @@ -20396,7 +20897,7 @@ invalid_parameters_rule(Parser *p) if ( (_opt_var = slash_no_default_rule(p), !p->error_indicator) // slash_no_default? && - (_loop0_163_var = _loop0_163_rule(p)) // param_no_default* + (_loop0_168_var = _loop0_168_rule(p)) // param_no_default* && (invalid_parameters_helper_var = invalid_parameters_helper_rule(p)) // invalid_parameters_helper && @@ -20422,18 +20923,18 @@ invalid_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default* '(' param_no_default+ ','? ')'")); - asdl_seq * _loop0_164_var; - asdl_seq * _loop1_165_var; + asdl_seq * _loop0_169_var; + asdl_seq * _loop1_170_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings Token * a; Token * b; if ( - (_loop0_164_var = _loop0_164_rule(p)) // param_no_default* + (_loop0_169_var = _loop0_169_rule(p)) // param_no_default* && (a = _PyPegen_expect_token(p, 7)) // token='(' && - (_loop1_165_var = _loop1_165_rule(p)) // param_no_default+ + (_loop1_170_var = _loop1_170_rule(p)) // param_no_default+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -20460,22 +20961,22 @@ invalid_parameters_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "[(slash_no_default | slash_with_default)] param_maybe_default* '*' (',' | param_no_default) param_maybe_default* '/'")); Token * _literal; - asdl_seq * _loop0_167_var; - asdl_seq * _loop0_169_var; + asdl_seq * _loop0_172_var; + asdl_seq * _loop0_174_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - void *_tmp_168_var; + void *_tmp_173_var; Token * a; if ( - (_opt_var = _tmp_166_rule(p), !p->error_indicator) // [(slash_no_default | slash_with_default)] + (_opt_var = _tmp_171_rule(p), !p->error_indicator) // [(slash_no_default | slash_with_default)] && - (_loop0_167_var = _loop0_167_rule(p)) // param_maybe_default* + (_loop0_172_var = _loop0_172_rule(p)) // param_maybe_default* && (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_168_var = _tmp_168_rule(p)) // ',' | param_no_default + (_tmp_173_var = _tmp_173_rule(p)) // ',' | param_no_default && - (_loop0_169_var = _loop0_169_rule(p)) // param_maybe_default* + (_loop0_174_var = _loop0_174_rule(p)) // param_maybe_default* && (a = _PyPegen_expect_token(p, 17)) // token='/' ) @@ -20500,10 +21001,10 @@ invalid_parameters_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default+ '/' '*'")); Token * _literal; - asdl_seq * _loop1_170_var; + asdl_seq * _loop1_175_var; Token * a; if ( - (_loop1_170_var = _loop1_170_rule(p)) // param_maybe_default+ + (_loop1_175_var = _loop1_175_rule(p)) // param_maybe_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -20553,7 +21054,7 @@ invalid_default_rule(Parser *p) if ( (a = _PyPegen_expect_token(p, 22)) // token='=' && - _PyPegen_lookahead(1, _tmp_171_rule, p) + _PyPegen_lookahead(1, _tmp_176_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' &(')' | ',')")); @@ -20599,12 +21100,12 @@ invalid_star_etc_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); - void *_tmp_172_var; + void *_tmp_177_var; Token * a; if ( (a = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_172_var = _tmp_172_rule(p)) // ')' | ',' (')' | '**') + (_tmp_177_var = _tmp_177_rule(p)) // ')' | ',' (')' | '**') ) { D(fprintf(stderr, "%*c+ invalid_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); @@ -20687,20 +21188,20 @@ invalid_star_etc_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (param_no_default | ',') param_maybe_default* '*' (param_no_default | ',')")); Token * _literal; - asdl_seq * _loop0_174_var; - void *_tmp_173_var; - void *_tmp_175_var; + asdl_seq * _loop0_179_var; + void *_tmp_178_var; + void *_tmp_180_var; Token * a; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_173_var = _tmp_173_rule(p)) // param_no_default | ',' + (_tmp_178_var = _tmp_178_rule(p)) // param_no_default | ',' && - (_loop0_174_var = _loop0_174_rule(p)) // param_maybe_default* + (_loop0_179_var = _loop0_179_rule(p)) // param_maybe_default* && (a = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_175_var = _tmp_175_rule(p)) // param_no_default | ',' + (_tmp_180_var = _tmp_180_rule(p)) // param_no_default | ',' ) { D(fprintf(stderr, "%*c+ invalid_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (param_no_default | ',') param_maybe_default* '*' (param_no_default | ',')")); @@ -20816,7 +21317,7 @@ invalid_kwds_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' && - (a = (Token*)_tmp_176_rule(p)) // '*' | '**' | '/' + (a = (Token*)_tmp_181_rule(p)) // '*' | '**' | '/' ) { D(fprintf(stderr, "%*c+ invalid_kwds[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' param ',' ('*' | '**' | '/')")); @@ -20882,13 +21383,13 @@ invalid_parameters_helper_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_parameters_helper[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default+")); - asdl_seq * _loop1_177_var; + asdl_seq * _loop1_182_var; if ( - (_loop1_177_var = _loop1_177_rule(p)) // param_with_default+ + (_loop1_182_var = _loop1_182_rule(p)) // param_with_default+ ) { D(fprintf(stderr, "%*c+ invalid_parameters_helper[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_with_default+")); - _res = _loop1_177_var; + _res = _loop1_182_var; goto done; } p->mark = _mark; @@ -20954,13 +21455,13 @@ invalid_lambda_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(lambda_slash_no_default | lambda_slash_with_default) lambda_param_maybe_default* '/'")); - asdl_seq * _loop0_179_var; - void *_tmp_178_var; + asdl_seq * _loop0_184_var; + void *_tmp_183_var; Token * a; if ( - (_tmp_178_var = _tmp_178_rule(p)) // lambda_slash_no_default | lambda_slash_with_default + (_tmp_183_var = _tmp_183_rule(p)) // lambda_slash_no_default | lambda_slash_with_default && - (_loop0_179_var = _loop0_179_rule(p)) // lambda_param_maybe_default* + (_loop0_184_var = _loop0_184_rule(p)) // lambda_param_maybe_default* && (a = _PyPegen_expect_token(p, 17)) // token='/' ) @@ -20984,7 +21485,7 @@ invalid_lambda_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default? lambda_param_no_default* invalid_lambda_parameters_helper lambda_param_no_default")); - asdl_seq * _loop0_180_var; + asdl_seq * _loop0_185_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings arg_ty a; @@ -20992,7 +21493,7 @@ invalid_lambda_parameters_rule(Parser *p) if ( (_opt_var = lambda_slash_no_default_rule(p), !p->error_indicator) // lambda_slash_no_default? && - (_loop0_180_var = _loop0_180_rule(p)) // lambda_param_no_default* + (_loop0_185_var = _loop0_185_rule(p)) // lambda_param_no_default* && (invalid_lambda_parameters_helper_var = invalid_lambda_parameters_helper_rule(p)) // invalid_lambda_parameters_helper && @@ -21018,18 +21519,18 @@ invalid_lambda_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* '(' ','.lambda_param+ ','? ')'")); - asdl_seq * _gather_182_var; - asdl_seq * _loop0_181_var; + asdl_seq * _gather_187_var; + asdl_seq * _loop0_186_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings Token * a; Token * b; if ( - (_loop0_181_var = _loop0_181_rule(p)) // lambda_param_no_default* + (_loop0_186_var = _loop0_186_rule(p)) // lambda_param_no_default* && (a = _PyPegen_expect_token(p, 7)) // token='(' && - (_gather_182_var = _gather_182_rule(p)) // ','.lambda_param+ + (_gather_187_var = _gather_187_rule(p)) // ','.lambda_param+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -21056,22 +21557,22 @@ invalid_lambda_parameters_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "[(lambda_slash_no_default | lambda_slash_with_default)] lambda_param_maybe_default* '*' (',' | lambda_param_no_default) lambda_param_maybe_default* '/'")); Token * _literal; - asdl_seq * _loop0_185_var; - asdl_seq * _loop0_187_var; + asdl_seq * _loop0_190_var; + asdl_seq * _loop0_192_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - void *_tmp_186_var; + void *_tmp_191_var; Token * a; if ( - (_opt_var = _tmp_184_rule(p), !p->error_indicator) // [(lambda_slash_no_default | lambda_slash_with_default)] + (_opt_var = _tmp_189_rule(p), !p->error_indicator) // [(lambda_slash_no_default | lambda_slash_with_default)] && - (_loop0_185_var = _loop0_185_rule(p)) // lambda_param_maybe_default* + (_loop0_190_var = _loop0_190_rule(p)) // lambda_param_maybe_default* && (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_186_var = _tmp_186_rule(p)) // ',' | lambda_param_no_default + (_tmp_191_var = _tmp_191_rule(p)) // ',' | lambda_param_no_default && - (_loop0_187_var = _loop0_187_rule(p)) // lambda_param_maybe_default* + (_loop0_192_var = _loop0_192_rule(p)) // lambda_param_maybe_default* && (a = _PyPegen_expect_token(p, 17)) // token='/' ) @@ -21096,10 +21597,10 @@ invalid_lambda_parameters_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default+ '/' '*'")); Token * _literal; - asdl_seq * _loop1_188_var; + asdl_seq * _loop1_193_var; Token * a; if ( - (_loop1_188_var = _loop1_188_rule(p)) // lambda_param_maybe_default+ + (_loop1_193_var = _loop1_193_rule(p)) // lambda_param_maybe_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -21171,13 +21672,13 @@ invalid_lambda_parameters_helper_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_lambda_parameters_helper[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); - asdl_seq * _loop1_189_var; + asdl_seq * _loop1_194_var; if ( - (_loop1_189_var = _loop1_189_rule(p)) // lambda_param_with_default+ + (_loop1_194_var = _loop1_194_rule(p)) // lambda_param_with_default+ ) { D(fprintf(stderr, "%*c+ invalid_lambda_parameters_helper[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); - _res = _loop1_189_var; + _res = _loop1_194_var; goto done; } p->mark = _mark; @@ -21214,11 +21715,11 @@ invalid_lambda_star_etc_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); Token * _literal; - void *_tmp_190_var; + void *_tmp_195_var; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_190_var = _tmp_190_rule(p)) // ':' | ',' (':' | '**') + (_tmp_195_var = _tmp_195_rule(p)) // ':' | ',' (':' | '**') ) { D(fprintf(stderr, "%*c+ invalid_lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); @@ -21271,20 +21772,20 @@ invalid_lambda_star_etc_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (lambda_param_no_default | ',') lambda_param_maybe_default* '*' (lambda_param_no_default | ',')")); Token * _literal; - asdl_seq * _loop0_192_var; - void *_tmp_191_var; - void *_tmp_193_var; + asdl_seq * _loop0_197_var; + void *_tmp_196_var; + void *_tmp_198_var; Token * a; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_191_var = _tmp_191_rule(p)) // lambda_param_no_default | ',' + (_tmp_196_var = _tmp_196_rule(p)) // lambda_param_no_default | ',' && - (_loop0_192_var = _loop0_192_rule(p)) // lambda_param_maybe_default* + (_loop0_197_var = _loop0_197_rule(p)) // lambda_param_maybe_default* && (a = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_193_var = _tmp_193_rule(p)) // lambda_param_no_default | ',' + (_tmp_198_var = _tmp_198_rule(p)) // lambda_param_no_default | ',' ) { D(fprintf(stderr, "%*c+ invalid_lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (lambda_param_no_default | ',') lambda_param_maybe_default* '*' (lambda_param_no_default | ',')")); @@ -21403,7 +21904,7 @@ invalid_lambda_kwds_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' && - (a = (Token*)_tmp_194_rule(p)) // '*' | '**' | '/' + (a = (Token*)_tmp_199_rule(p)) // '*' | '**' | '/' ) { D(fprintf(stderr, "%*c+ invalid_lambda_kwds[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' lambda_param ',' ('*' | '**' | '/')")); @@ -21507,11 +22008,11 @@ invalid_with_item_rule(Parser *p) if ( (expression_var = expression_rule(p)) // expression && - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (a = expression_rule(p)) // expression && - _PyPegen_lookahead(1, _tmp_195_rule, p) + _PyPegen_lookahead(1, _tmp_200_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression 'as' expression &(',' | ')' | ':')")); @@ -21560,7 +22061,7 @@ invalid_for_target_rule(Parser *p) if ( (_opt_var = _PyPegen_expect_token(p, ASYNC), !p->error_indicator) // ASYNC? && - (_keyword = _PyPegen_expect_token(p, 649)) // token='for' + (_keyword = _PyPegen_expect_token(p, 650)) // token='for' && (a = star_expressions_rule(p)) // star_expressions ) @@ -21692,11 +22193,11 @@ invalid_import_rule(Parser *p) expr_ty dotted_name_var; expr_ty dotted_name_var_1; if ( - (a = _PyPegen_expect_token(p, 606)) // token='import' + (a = _PyPegen_expect_token(p, 607)) // token='import' && (dotted_name_var = dotted_name_rule(p)) // dotted_name && - (_keyword = _PyPegen_expect_token(p, 607)) // token='from' + (_keyword = _PyPegen_expect_token(p, 608)) // token='from' && (dotted_name_var_1 = dotted_name_rule(p)) // dotted_name ) @@ -21792,7 +22293,7 @@ invalid_with_stmt_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC? 'with' ','.(expression ['as' star_target])+ NEWLINE")); - asdl_seq * _gather_196_var; + asdl_seq * _gather_201_var; Token * _keyword; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings @@ -21800,9 +22301,9 @@ invalid_with_stmt_rule(Parser *p) if ( (_opt_var = _PyPegen_expect_token(p, ASYNC), !p->error_indicator) // ASYNC? && - (_keyword = _PyPegen_expect_token(p, 614)) // token='with' + (_keyword = _PyPegen_expect_token(p, 615)) // token='with' && - (_gather_196_var = _gather_196_rule(p)) // ','.(expression ['as' star_target])+ + (_gather_201_var = _gather_201_rule(p)) // ','.(expression ['as' star_target])+ && (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) @@ -21826,7 +22327,7 @@ invalid_with_stmt_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' NEWLINE")); - asdl_seq * _gather_198_var; + asdl_seq * _gather_203_var; Token * _keyword; Token * _literal; Token * _literal_1; @@ -21838,11 +22339,11 @@ invalid_with_stmt_rule(Parser *p) if ( (_opt_var = _PyPegen_expect_token(p, ASYNC), !p->error_indicator) // ASYNC? && - (_keyword = _PyPegen_expect_token(p, 614)) // token='with' + (_keyword = _PyPegen_expect_token(p, 615)) // token='with' && (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (_gather_198_var = _gather_198_rule(p)) // ','.(expressions ['as' star_target])+ + (_gather_203_var = _gather_203_rule(p)) // ','.(expressions ['as' star_target])+ && (_opt_var_1 = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -21892,7 +22393,7 @@ invalid_with_stmt_indent_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_with_stmt_indent[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC? 'with' ','.(expression ['as' star_target])+ ':' NEWLINE !INDENT")); - asdl_seq * _gather_200_var; + asdl_seq * _gather_205_var; Token * _literal; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings @@ -21901,9 +22402,9 @@ invalid_with_stmt_indent_rule(Parser *p) if ( (_opt_var = _PyPegen_expect_token(p, ASYNC), !p->error_indicator) // ASYNC? && - (a = _PyPegen_expect_token(p, 614)) // token='with' + (a = _PyPegen_expect_token(p, 615)) // token='with' && - (_gather_200_var = _gather_200_rule(p)) // ','.(expression ['as' star_target])+ + (_gather_205_var = _gather_205_rule(p)) // ','.(expression ['as' star_target])+ && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -21931,7 +22432,7 @@ invalid_with_stmt_indent_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_with_stmt_indent[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' ':' NEWLINE !INDENT")); - asdl_seq * _gather_202_var; + asdl_seq * _gather_207_var; Token * _literal; Token * _literal_1; Token * _literal_2; @@ -21944,11 +22445,11 @@ invalid_with_stmt_indent_rule(Parser *p) if ( (_opt_var = _PyPegen_expect_token(p, ASYNC), !p->error_indicator) // ASYNC? && - (a = _PyPegen_expect_token(p, 614)) // token='with' + (a = _PyPegen_expect_token(p, 615)) // token='with' && (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (_gather_202_var = _gather_202_rule(p)) // ','.(expressions ['as' star_target])+ + (_gather_207_var = _gather_207_rule(p)) // ','.(expressions ['as' star_target])+ && (_opt_var_1 = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -22008,7 +22509,7 @@ invalid_try_stmt_rule(Parser *p) Token * a; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 623)) // token='try' + (a = _PyPegen_expect_token(p, 624)) // token='try' && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -22040,13 +22541,13 @@ invalid_try_stmt_rule(Parser *p) Token * _literal; asdl_stmt_seq* block_var; if ( - (_keyword = _PyPegen_expect_token(p, 623)) // token='try' + (_keyword = _PyPegen_expect_token(p, 624)) // token='try' && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && (block_var = block_rule(p)) // block && - _PyPegen_lookahead(0, _tmp_204_rule, p) + _PyPegen_lookahead(0, _tmp_209_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_try_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'try' ':' block !('except' | 'finally')")); @@ -22071,29 +22572,29 @@ invalid_try_stmt_rule(Parser *p) Token * _keyword; Token * _literal; Token * _literal_1; - asdl_seq * _loop0_205_var; - asdl_seq * _loop1_206_var; + asdl_seq * _loop0_210_var; + asdl_seq * _loop1_211_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings Token * a; Token * b; expr_ty expression_var; if ( - (_keyword = _PyPegen_expect_token(p, 623)) // token='try' + (_keyword = _PyPegen_expect_token(p, 624)) // token='try' && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && - (_loop0_205_var = _loop0_205_rule(p)) // block* + (_loop0_210_var = _loop0_210_rule(p)) // block* && - (_loop1_206_var = _loop1_206_rule(p)) // except_block+ + (_loop1_211_var = _loop1_211_rule(p)) // except_block+ && - (a = _PyPegen_expect_token(p, 636)) // token='except' + (a = _PyPegen_expect_token(p, 637)) // token='except' && (b = _PyPegen_expect_token(p, 16)) // token='*' && (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_207_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var = _tmp_212_rule(p), !p->error_indicator) // ['as' NAME] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' ) @@ -22120,23 +22621,23 @@ invalid_try_stmt_rule(Parser *p) Token * _keyword; Token * _literal; Token * _literal_1; - asdl_seq * _loop0_208_var; - asdl_seq * _loop1_209_var; + asdl_seq * _loop0_213_var; + asdl_seq * _loop1_214_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings Token * a; if ( - (_keyword = _PyPegen_expect_token(p, 623)) // token='try' + (_keyword = _PyPegen_expect_token(p, 624)) // token='try' && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && - (_loop0_208_var = _loop0_208_rule(p)) // block* + (_loop0_213_var = _loop0_213_rule(p)) // block* && - (_loop1_209_var = _loop1_209_rule(p)) // except_star_block+ + (_loop1_214_var = _loop1_214_rule(p)) // except_star_block+ && - (a = _PyPegen_expect_token(p, 636)) // token='except' + (a = _PyPegen_expect_token(p, 637)) // token='except' && - (_opt_var = _tmp_210_rule(p), !p->error_indicator) // [expression ['as' NAME]] + (_opt_var = _tmp_215_rule(p), !p->error_indicator) // [expression ['as' NAME]] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' ) @@ -22194,7 +22695,7 @@ invalid_except_stmt_rule(Parser *p) expr_ty a; expr_ty expressions_var; if ( - (_keyword = _PyPegen_expect_token(p, 636)) // token='except' + (_keyword = _PyPegen_expect_token(p, 637)) // token='except' && (_opt_var = _PyPegen_expect_token(p, 16), !p->error_indicator) // '*'? && @@ -22204,7 +22705,7 @@ invalid_except_stmt_rule(Parser *p) && (expressions_var = expressions_rule(p)) // expressions && - (_opt_var_1 = _tmp_211_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var_1 = _tmp_216_rule(p), !p->error_indicator) // ['as' NAME] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' ) @@ -22236,13 +22737,13 @@ invalid_except_stmt_rule(Parser *p) expr_ty expression_var; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 636)) // token='except' + (a = _PyPegen_expect_token(p, 637)) // token='except' && (_opt_var = _PyPegen_expect_token(p, 16), !p->error_indicator) // '*'? && (expression_var = expression_rule(p)) // expression && - (_opt_var_1 = _tmp_212_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var_1 = _tmp_217_rule(p), !p->error_indicator) // ['as' NAME] && (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) @@ -22269,7 +22770,7 @@ invalid_except_stmt_rule(Parser *p) Token * a; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 636)) // token='except' + (a = _PyPegen_expect_token(p, 637)) // token='except' && (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) @@ -22294,14 +22795,14 @@ invalid_except_stmt_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_except_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' '*' (NEWLINE | ':')")); Token * _literal; - void *_tmp_213_var; + void *_tmp_218_var; Token * a; if ( - (a = _PyPegen_expect_token(p, 636)) // token='except' + (a = _PyPegen_expect_token(p, 637)) // token='except' && (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_213_var = _tmp_213_rule(p)) // NEWLINE | ':' + (_tmp_218_var = _tmp_218_rule(p)) // NEWLINE | ':' ) { D(fprintf(stderr, "%*c+ invalid_except_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' '*' (NEWLINE | ':')")); @@ -22347,7 +22848,7 @@ invalid_finally_stmt_rule(Parser *p) Token * a; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 632)) // token='finally' + (a = _PyPegen_expect_token(p, 633)) // token='finally' && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -22404,11 +22905,11 @@ invalid_except_stmt_indent_rule(Parser *p) expr_ty expression_var; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 636)) // token='except' + (a = _PyPegen_expect_token(p, 637)) // token='except' && (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_214_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var = _tmp_219_rule(p), !p->error_indicator) // ['as' NAME] && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -22440,7 +22941,7 @@ invalid_except_stmt_indent_rule(Parser *p) Token * a; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 636)) // token='except' + (a = _PyPegen_expect_token(p, 637)) // token='except' && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -22497,13 +22998,13 @@ invalid_except_star_stmt_indent_rule(Parser *p) expr_ty expression_var; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 636)) // token='except' + (a = _PyPegen_expect_token(p, 637)) // token='except' && (_literal = _PyPegen_expect_token(p, 16)) // token='*' && (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_215_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var = _tmp_220_rule(p), !p->error_indicator) // ['as' NAME] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' && @@ -22739,7 +23240,7 @@ invalid_as_pattern_rule(Parser *p) if ( (or_pattern_var = or_pattern_rule(p)) // or_pattern && - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (a = _PyPegen_expect_soft_keyword(p, "_")) // soft_keyword='"_"' ) @@ -22769,7 +23270,7 @@ invalid_as_pattern_rule(Parser *p) if ( (or_pattern_var = or_pattern_rule(p)) // or_pattern && - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && _PyPegen_lookahead_with_name(0, _PyPegen_name_token, p) && @@ -22872,7 +23373,7 @@ invalid_class_argument_pattern_rule(Parser *p) asdl_pattern_seq* a; asdl_seq* keyword_patterns_var; if ( - (_opt_var = _tmp_216_rule(p), !p->error_indicator) // [positional_patterns ','] + (_opt_var = _tmp_221_rule(p), !p->error_indicator) // [positional_patterns ','] && (keyword_patterns_var = keyword_patterns_rule(p)) // keyword_patterns && @@ -22926,7 +23427,7 @@ invalid_if_stmt_rule(Parser *p) expr_ty named_expression_var; Token * newline_var; if ( - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (named_expression_var = named_expression_rule(p)) // named_expression && @@ -22957,7 +23458,7 @@ invalid_if_stmt_rule(Parser *p) expr_ty a_1; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 641)) // token='if' + (a = _PyPegen_expect_token(p, 642)) // token='if' && (a_1 = named_expression_rule(p)) // named_expression && @@ -23013,7 +23514,7 @@ invalid_elif_stmt_rule(Parser *p) expr_ty named_expression_var; Token * newline_var; if ( - (_keyword = _PyPegen_expect_token(p, 643)) // token='elif' + (_keyword = _PyPegen_expect_token(p, 644)) // token='elif' && (named_expression_var = named_expression_rule(p)) // named_expression && @@ -23044,7 +23545,7 @@ invalid_elif_stmt_rule(Parser *p) expr_ty named_expression_var; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 643)) // token='elif' + (a = _PyPegen_expect_token(p, 644)) // token='elif' && (named_expression_var = named_expression_rule(p)) // named_expression && @@ -23098,7 +23599,7 @@ invalid_else_stmt_rule(Parser *p) Token * a; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 644)) // token='else' + (a = _PyPegen_expect_token(p, 645)) // token='else' && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -23152,7 +23653,7 @@ invalid_while_stmt_rule(Parser *p) expr_ty named_expression_var; Token * newline_var; if ( - (_keyword = _PyPegen_expect_token(p, 646)) // token='while' + (_keyword = _PyPegen_expect_token(p, 647)) // token='while' && (named_expression_var = named_expression_rule(p)) // named_expression && @@ -23183,7 +23684,7 @@ invalid_while_stmt_rule(Parser *p) expr_ty named_expression_var; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 646)) // token='while' + (a = _PyPegen_expect_token(p, 647)) // token='while' && (named_expression_var = named_expression_rule(p)) // named_expression && @@ -23245,11 +23746,11 @@ invalid_for_stmt_rule(Parser *p) if ( (_opt_var = _PyPegen_expect_token(p, ASYNC), !p->error_indicator) // ASYNC? && - (_keyword = _PyPegen_expect_token(p, 649)) // token='for' + (_keyword = _PyPegen_expect_token(p, 650)) // token='for' && (star_targets_var = star_targets_rule(p)) // star_targets && - (_keyword_1 = _PyPegen_expect_token(p, 650)) // token='in' + (_keyword_1 = _PyPegen_expect_token(p, 651)) // token='in' && (star_expressions_var = star_expressions_rule(p)) // star_expressions && @@ -23286,11 +23787,11 @@ invalid_for_stmt_rule(Parser *p) if ( (_opt_var = _PyPegen_expect_token(p, ASYNC), !p->error_indicator) // ASYNC? && - (a = _PyPegen_expect_token(p, 649)) // token='for' + (a = _PyPegen_expect_token(p, 650)) // token='for' && (star_targets_var = star_targets_rule(p)) // star_targets && - (_keyword = _PyPegen_expect_token(p, 650)) // token='in' + (_keyword = _PyPegen_expect_token(p, 651)) // token='in' && (star_expressions_var = star_expressions_rule(p)) // star_expressions && @@ -23356,7 +23857,7 @@ invalid_def_raw_rule(Parser *p) if ( (_opt_var = _PyPegen_expect_token(p, ASYNC), !p->error_indicator) // ASYNC? && - (a = _PyPegen_expect_token(p, 651)) // token='def' + (a = _PyPegen_expect_token(p, 652)) // token='def' && (name_var = _PyPegen_name_token(p)) // NAME && @@ -23366,7 +23867,7 @@ invalid_def_raw_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' && - (_opt_var_2 = _tmp_217_rule(p), !p->error_indicator) // ['->' expression] + (_opt_var_2 = _tmp_222_rule(p), !p->error_indicator) // ['->' expression] && (_literal_2 = _PyPegen_expect_token(p, 11)) // token=':' && @@ -23422,11 +23923,11 @@ invalid_class_def_raw_rule(Parser *p) expr_ty name_var; Token * newline_var; if ( - (_keyword = _PyPegen_expect_token(p, 653)) // token='class' + (_keyword = _PyPegen_expect_token(p, 654)) // token='class' && (name_var = _PyPegen_name_token(p)) // NAME && - (_opt_var = _tmp_218_rule(p), !p->error_indicator) // ['(' arguments? ')'] + (_opt_var = _tmp_223_rule(p), !p->error_indicator) // ['(' arguments? ')'] && (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) @@ -23457,11 +23958,11 @@ invalid_class_def_raw_rule(Parser *p) expr_ty name_var; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 653)) // token='class' + (a = _PyPegen_expect_token(p, 654)) // token='class' && (name_var = _PyPegen_name_token(p)) // NAME && - (_opt_var = _tmp_219_rule(p), !p->error_indicator) // ['(' arguments? ')'] + (_opt_var = _tmp_224_rule(p), !p->error_indicator) // ['(' arguments? ')'] && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -23512,11 +24013,11 @@ invalid_double_starred_kvpairs_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_double_starred_kvpairs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.double_starred_kvpair+ ',' invalid_kvpair")); - asdl_seq * _gather_220_var; + asdl_seq * _gather_225_var; Token * _literal; void *invalid_kvpair_var; if ( - (_gather_220_var = _gather_220_rule(p)) // ','.double_starred_kvpair+ + (_gather_225_var = _gather_225_rule(p)) // ','.double_starred_kvpair+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && @@ -23524,7 +24025,7 @@ invalid_double_starred_kvpairs_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ invalid_double_starred_kvpairs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.double_starred_kvpair+ ',' invalid_kvpair")); - _res = _PyPegen_dummy_name(p, _gather_220_var, _literal, invalid_kvpair_var); + _res = _PyPegen_dummy_name(p, _gather_225_var, _literal, invalid_kvpair_var); goto done; } p->mark = _mark; @@ -23577,7 +24078,7 @@ invalid_double_starred_kvpairs_rule(Parser *p) && (a = _PyPegen_expect_token(p, 11)) // token=':' && - _PyPegen_lookahead(1, _tmp_222_rule, p) + _PyPegen_lookahead(1, _tmp_227_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_double_starred_kvpairs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ':' &('}' | ',')")); @@ -23688,7 +24189,7 @@ invalid_kvpair_rule(Parser *p) && (a = _PyPegen_expect_token(p, 11)) // token=':' && - _PyPegen_lookahead(1, _tmp_223_rule, p) + _PyPegen_lookahead(1, _tmp_228_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_kvpair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ':' &('}' | ',')")); @@ -23763,6 +24264,450 @@ invalid_starred_expression_rule(Parser *p) return _res; } +// invalid_replacement_field: +// | '{' '=' +// | '{' '!' +// | '{' ':' +// | '{' '}' +// | '{' !(yield_expr | star_expressions) +// | '{' (yield_expr | star_expressions) !('=' | '!' | ':' | '}') +// | '{' (yield_expr | star_expressions) '=' !('!' | ':' | '}') +// | '{' (yield_expr | star_expressions) '='? invalid_conversion_character +// | '{' (yield_expr | star_expressions) '='? ['!' NAME] !(':' | '}') +// | '{' (yield_expr | star_expressions) '='? ['!' NAME] ':' fstring_format_spec* !'}' +// | '{' (yield_expr | star_expressions) '='? ['!' NAME] !'}' +static void * +invalid_replacement_field_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '{' '=' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' '='")); + Token * _literal; + Token * a; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' '='")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "f-string: valid expression required before '='" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' '='")); + } + { // '{' '!' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' '!'")); + Token * _literal; + Token * a; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = _PyPegen_expect_token(p, 54)) // token='!' + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' '!'")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "f-string: valid expression required before '!'" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' '!'")); + } + { // '{' ':' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' ':'")); + Token * _literal; + Token * a; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' ':'")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "f-string: valid expression required before ':'" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' ':'")); + } + { // '{' '}' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' '}'")); + Token * _literal; + Token * a; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' '}'")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "f-string: valid expression required before '}'" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' '}'")); + } + { // '{' !(yield_expr | star_expressions) + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' !(yield_expr | star_expressions)")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + _PyPegen_lookahead(0, _tmp_229_rule, p) + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' !(yield_expr | star_expressions)")); + _res = RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting a valid expression after '{'" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' !(yield_expr | star_expressions)")); + } + { // '{' (yield_expr | star_expressions) !('=' | '!' | ':' | '}') + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) !('=' | '!' | ':' | '}')")); + Token * _literal; + void *_tmp_230_var; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (_tmp_230_var = _tmp_230_rule(p)) // yield_expr | star_expressions + && + _PyPegen_lookahead(0, _tmp_231_rule, p) + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) !('=' | '!' | ':' | '}')")); + _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting '=', or '!', or ':', or '}'" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' (yield_expr | star_expressions) !('=' | '!' | ':' | '}')")); + } + { // '{' (yield_expr | star_expressions) '=' !('!' | ':' | '}') + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '=' !('!' | ':' | '}')")); + Token * _literal; + Token * _literal_1; + void *_tmp_232_var; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (_tmp_232_var = _tmp_232_rule(p)) // yield_expr | star_expressions + && + (_literal_1 = _PyPegen_expect_token(p, 22)) // token='=' + && + _PyPegen_lookahead(0, _tmp_233_rule, p) + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '=' !('!' | ':' | '}')")); + _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting '!', or ':', or '}'" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' (yield_expr | star_expressions) '=' !('!' | ':' | '}')")); + } + { // '{' (yield_expr | star_expressions) '='? invalid_conversion_character + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? invalid_conversion_character")); + Token * _literal; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + void *_tmp_234_var; + void *invalid_conversion_character_var; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (_tmp_234_var = _tmp_234_rule(p)) // yield_expr | star_expressions + && + (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? + && + (invalid_conversion_character_var = invalid_conversion_character_rule(p)) // invalid_conversion_character + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? invalid_conversion_character")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_234_var, _opt_var, invalid_conversion_character_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' (yield_expr | star_expressions) '='? invalid_conversion_character")); + } + { // '{' (yield_expr | star_expressions) '='? ['!' NAME] !(':' | '}') + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] !(':' | '}')")); + Token * _literal; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + void *_opt_var_1; + UNUSED(_opt_var_1); // Silence compiler warnings + void *_tmp_235_var; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (_tmp_235_var = _tmp_235_rule(p)) // yield_expr | star_expressions + && + (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? + && + (_opt_var_1 = _tmp_236_rule(p), !p->error_indicator) // ['!' NAME] + && + _PyPegen_lookahead(0, _tmp_237_rule, p) + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] !(':' | '}')")); + _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting ':' or '}'" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] !(':' | '}')")); + } + { // '{' (yield_expr | star_expressions) '='? ['!' NAME] ':' fstring_format_spec* !'}' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] ':' fstring_format_spec* !'}'")); + Token * _literal; + Token * _literal_1; + asdl_seq * _loop0_240_var; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + void *_opt_var_1; + UNUSED(_opt_var_1); // Silence compiler warnings + void *_tmp_238_var; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (_tmp_238_var = _tmp_238_rule(p)) // yield_expr | star_expressions + && + (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? + && + (_opt_var_1 = _tmp_239_rule(p), !p->error_indicator) // ['!' NAME] + && + (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' + && + (_loop0_240_var = _loop0_240_rule(p)) // fstring_format_spec* + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 26) // token='}' + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] ':' fstring_format_spec* !'}'")); + _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting '}', or format specs" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] ':' fstring_format_spec* !'}'")); + } + { // '{' (yield_expr | star_expressions) '='? ['!' NAME] !'}' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] !'}'")); + Token * _literal; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + void *_opt_var_1; + UNUSED(_opt_var_1); // Silence compiler warnings + void *_tmp_241_var; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (_tmp_241_var = _tmp_241_rule(p)) // yield_expr | star_expressions + && + (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? + && + (_opt_var_1 = _tmp_242_rule(p), !p->error_indicator) // ['!' NAME] + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 26) // token='}' + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] !'}'")); + _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting '}'" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] !'}'")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// invalid_conversion_character: '!' &(':' | '}') | '!' !NAME +static void * +invalid_conversion_character_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '!' &(':' | '}') + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_conversion_character[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' &(':' | '}')")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 54)) // token='!' + && + _PyPegen_lookahead(1, _tmp_243_rule, p) + ) + { + D(fprintf(stderr, "%*c+ invalid_conversion_character[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' &(':' | '}')")); + _res = RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: missing conversion character" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_conversion_character[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!' &(':' | '}')")); + } + { // '!' !NAME + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_conversion_character[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' !NAME")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 54)) // token='!' + && + _PyPegen_lookahead_with_name(0, _PyPegen_name_token, p) + ) + { + D(fprintf(stderr, "%*c+ invalid_conversion_character[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' !NAME")); + _res = RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: invalid conversion character" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_conversion_character[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!' !NAME")); + } + _res = NULL; + done: + p->level--; + return _res; +} + // _loop0_1: NEWLINE static asdl_seq * _loop0_1_rule(Parser *p) @@ -23899,9 +24844,77 @@ _loop0_2_rule(Parser *p) return _seq; } -// _loop1_3: statement +// _loop0_3: fstring_middle static asdl_seq * -_loop1_3_rule(Parser *p) +_loop0_3_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + Py_ssize_t _children_capacity = 1; + Py_ssize_t _n = 0; + { // fstring_middle + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_3[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_middle")); + expr_ty fstring_middle_var; + while ( + (fstring_middle_var = fstring_middle_rule(p)) // fstring_middle + ) + { + _res = fstring_middle_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_3[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_middle")); + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + p->level--; + return _seq; +} + +// _loop1_4: statement +static asdl_seq * +_loop1_4_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -23927,7 +24940,7 @@ _loop1_3_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_3[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statement")); + D(fprintf(stderr, "%*c> _loop1_4[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statement")); asdl_stmt_seq* statement_var; while ( (statement_var = statement_rule(p)) // statement @@ -23950,7 +24963,7 @@ _loop1_3_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_3[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_4[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "statement")); } if (_n == 0 || p->error_indicator) { @@ -23972,9 +24985,9 @@ _loop1_3_rule(Parser *p) return _seq; } -// _loop0_5: ';' simple_stmt +// _loop0_6: ';' simple_stmt static asdl_seq * -_loop0_5_rule(Parser *p) +_loop0_6_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24000,7 +25013,7 @@ _loop0_5_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_5[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';' simple_stmt")); + D(fprintf(stderr, "%*c> _loop0_6[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';' simple_stmt")); Token * _literal; stmt_ty elem; while ( @@ -24032,7 +25045,7 @@ _loop0_5_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_5[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_6[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';' simple_stmt")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -24049,9 +25062,9 @@ _loop0_5_rule(Parser *p) return _seq; } -// _gather_4: simple_stmt _loop0_5 +// _gather_5: simple_stmt _loop0_6 static asdl_seq * -_gather_4_rule(Parser *p) +_gather_5_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24063,27 +25076,27 @@ _gather_4_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // simple_stmt _loop0_5 + { // simple_stmt _loop0_6 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_4[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt _loop0_5")); + D(fprintf(stderr, "%*c> _gather_5[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt _loop0_6")); stmt_ty elem; asdl_seq * seq; if ( (elem = simple_stmt_rule(p)) // simple_stmt && - (seq = _loop0_5_rule(p)) // _loop0_5 + (seq = _loop0_6_rule(p)) // _loop0_6 ) { - D(fprintf(stderr, "%*c+ _gather_4[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt _loop0_5")); + D(fprintf(stderr, "%*c+ _gather_5[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt _loop0_6")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_4[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt _loop0_5")); + D(fprintf(stderr, "%*c%s _gather_5[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt _loop0_6")); } _res = NULL; done: @@ -24091,9 +25104,9 @@ _gather_4_rule(Parser *p) return _res; } -// _tmp_6: 'import' | 'from' +// _tmp_7: 'import' | 'from' static void * -_tmp_6_rule(Parser *p) +_tmp_7_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24110,18 +25123,18 @@ _tmp_6_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_6[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'import'")); + D(fprintf(stderr, "%*c> _tmp_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'import'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 606)) // token='import' + (_keyword = _PyPegen_expect_token(p, 607)) // token='import' ) { - D(fprintf(stderr, "%*c+ _tmp_6[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'import'")); + D(fprintf(stderr, "%*c+ _tmp_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'import'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_6[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_7[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'import'")); } { // 'from' @@ -24129,18 +25142,18 @@ _tmp_6_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_6[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from'")); + D(fprintf(stderr, "%*c> _tmp_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 607)) // token='from' + (_keyword = _PyPegen_expect_token(p, 608)) // token='from' ) { - D(fprintf(stderr, "%*c+ _tmp_6[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from'")); + D(fprintf(stderr, "%*c+ _tmp_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_6[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_7[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'from'")); } _res = NULL; @@ -24149,9 +25162,9 @@ _tmp_6_rule(Parser *p) return _res; } -// _tmp_7: 'def' | '@' | ASYNC +// _tmp_8: 'def' | '@' | ASYNC static void * -_tmp_7_rule(Parser *p) +_tmp_8_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24168,18 +25181,18 @@ _tmp_7_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'def'")); + D(fprintf(stderr, "%*c> _tmp_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'def'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 651)) // token='def' + (_keyword = _PyPegen_expect_token(p, 652)) // token='def' ) { - D(fprintf(stderr, "%*c+ _tmp_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'def'")); + D(fprintf(stderr, "%*c+ _tmp_8[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'def'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_7[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_8[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'def'")); } { // '@' @@ -24187,18 +25200,18 @@ _tmp_7_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); + D(fprintf(stderr, "%*c> _tmp_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 49)) // token='@' ) { - D(fprintf(stderr, "%*c+ _tmp_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); + D(fprintf(stderr, "%*c+ _tmp_8[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_7[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_8[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@'")); } { // ASYNC @@ -24206,18 +25219,18 @@ _tmp_7_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); + D(fprintf(stderr, "%*c> _tmp_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); Token * async_var; if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' ) { - D(fprintf(stderr, "%*c+ _tmp_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); + D(fprintf(stderr, "%*c+ _tmp_8[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); _res = async_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_7[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_8[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC")); } _res = NULL; @@ -24226,9 +25239,9 @@ _tmp_7_rule(Parser *p) return _res; } -// _tmp_8: 'class' | '@' +// _tmp_9: 'class' | '@' static void * -_tmp_8_rule(Parser *p) +_tmp_9_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24245,18 +25258,18 @@ _tmp_8_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'class'")); + D(fprintf(stderr, "%*c> _tmp_9[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'class'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 653)) // token='class' + (_keyword = _PyPegen_expect_token(p, 654)) // token='class' ) { - D(fprintf(stderr, "%*c+ _tmp_8[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'class'")); + D(fprintf(stderr, "%*c+ _tmp_9[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'class'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_8[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_9[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'class'")); } { // '@' @@ -24264,18 +25277,18 @@ _tmp_8_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); + D(fprintf(stderr, "%*c> _tmp_9[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 49)) // token='@' ) { - D(fprintf(stderr, "%*c+ _tmp_8[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); + D(fprintf(stderr, "%*c+ _tmp_9[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_8[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_9[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@'")); } _res = NULL; @@ -24284,9 +25297,9 @@ _tmp_8_rule(Parser *p) return _res; } -// _tmp_9: 'with' | ASYNC +// _tmp_10: 'with' | ASYNC static void * -_tmp_9_rule(Parser *p) +_tmp_10_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24303,18 +25316,18 @@ _tmp_9_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_9[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'with'")); + D(fprintf(stderr, "%*c> _tmp_10[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'with'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 614)) // token='with' + (_keyword = _PyPegen_expect_token(p, 615)) // token='with' ) { - D(fprintf(stderr, "%*c+ _tmp_9[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'with'")); + D(fprintf(stderr, "%*c+ _tmp_10[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'with'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_9[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_10[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'with'")); } { // ASYNC @@ -24322,18 +25335,18 @@ _tmp_9_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_9[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); + D(fprintf(stderr, "%*c> _tmp_10[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); Token * async_var; if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' ) { - D(fprintf(stderr, "%*c+ _tmp_9[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); + D(fprintf(stderr, "%*c+ _tmp_10[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); _res = async_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_9[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_10[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC")); } _res = NULL; @@ -24342,9 +25355,9 @@ _tmp_9_rule(Parser *p) return _res; } -// _tmp_10: 'for' | ASYNC +// _tmp_11: 'for' | ASYNC static void * -_tmp_10_rule(Parser *p) +_tmp_11_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24361,18 +25374,18 @@ _tmp_10_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_10[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'for'")); + D(fprintf(stderr, "%*c> _tmp_11[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'for'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 649)) // token='for' + (_keyword = _PyPegen_expect_token(p, 650)) // token='for' ) { - D(fprintf(stderr, "%*c+ _tmp_10[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for'")); + D(fprintf(stderr, "%*c+ _tmp_11[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_10[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_11[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'for'")); } { // ASYNC @@ -24380,18 +25393,18 @@ _tmp_10_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_10[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); + D(fprintf(stderr, "%*c> _tmp_11[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); Token * async_var; if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' ) { - D(fprintf(stderr, "%*c+ _tmp_10[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); + D(fprintf(stderr, "%*c+ _tmp_11[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); _res = async_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_10[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_11[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC")); } _res = NULL; @@ -24400,9 +25413,9 @@ _tmp_10_rule(Parser *p) return _res; } -// _tmp_11: '=' annotated_rhs +// _tmp_12: '=' annotated_rhs static void * -_tmp_11_rule(Parser *p) +_tmp_12_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24419,7 +25432,7 @@ _tmp_11_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_11[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + D(fprintf(stderr, "%*c> _tmp_12[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); Token * _literal; expr_ty d; if ( @@ -24428,7 +25441,7 @@ _tmp_11_rule(Parser *p) (d = annotated_rhs_rule(p)) // annotated_rhs ) { - D(fprintf(stderr, "%*c+ _tmp_11[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + D(fprintf(stderr, "%*c+ _tmp_12[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); _res = d; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24438,7 +25451,7 @@ _tmp_11_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_11[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_12[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'=' annotated_rhs")); } _res = NULL; @@ -24447,9 +25460,9 @@ _tmp_11_rule(Parser *p) return _res; } -// _tmp_12: '(' single_target ')' | single_subscript_attribute_target +// _tmp_13: '(' single_target ')' | single_subscript_attribute_target static void * -_tmp_12_rule(Parser *p) +_tmp_13_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24466,7 +25479,7 @@ _tmp_12_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_12[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); + D(fprintf(stderr, "%*c> _tmp_13[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); Token * _literal; Token * _literal_1; expr_ty b; @@ -24478,7 +25491,7 @@ _tmp_12_rule(Parser *p) (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_12[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); + D(fprintf(stderr, "%*c+ _tmp_13[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); _res = b; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24488,7 +25501,7 @@ _tmp_12_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_12[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_13[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' single_target ')'")); } { // single_subscript_attribute_target @@ -24496,18 +25509,18 @@ _tmp_12_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_12[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); + D(fprintf(stderr, "%*c> _tmp_13[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); expr_ty single_subscript_attribute_target_var; if ( (single_subscript_attribute_target_var = single_subscript_attribute_target_rule(p)) // single_subscript_attribute_target ) { - D(fprintf(stderr, "%*c+ _tmp_12[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); + D(fprintf(stderr, "%*c+ _tmp_13[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); _res = single_subscript_attribute_target_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_12[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_13[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "single_subscript_attribute_target")); } _res = NULL; @@ -24516,9 +25529,9 @@ _tmp_12_rule(Parser *p) return _res; } -// _tmp_13: '=' annotated_rhs +// _tmp_14: '=' annotated_rhs static void * -_tmp_13_rule(Parser *p) +_tmp_14_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24535,7 +25548,7 @@ _tmp_13_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_13[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + D(fprintf(stderr, "%*c> _tmp_14[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); Token * _literal; expr_ty d; if ( @@ -24544,7 +25557,7 @@ _tmp_13_rule(Parser *p) (d = annotated_rhs_rule(p)) // annotated_rhs ) { - D(fprintf(stderr, "%*c+ _tmp_13[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + D(fprintf(stderr, "%*c+ _tmp_14[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); _res = d; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24554,7 +25567,7 @@ _tmp_13_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_13[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_14[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'=' annotated_rhs")); } _res = NULL; @@ -24563,9 +25576,9 @@ _tmp_13_rule(Parser *p) return _res; } -// _loop1_14: (star_targets '=') +// _loop1_15: (star_targets '=') static asdl_seq * -_loop1_14_rule(Parser *p) +_loop1_15_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24591,13 +25604,13 @@ _loop1_14_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_14[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_224_var; + D(fprintf(stderr, "%*c> _loop1_15[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_244_var; while ( - (_tmp_224_var = _tmp_224_rule(p)) // star_targets '=' + (_tmp_244_var = _tmp_244_rule(p)) // star_targets '=' ) { - _res = _tmp_224_var; + _res = _tmp_244_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -24614,7 +25627,7 @@ _loop1_14_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_14[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_15[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); } if (_n == 0 || p->error_indicator) { @@ -24636,9 +25649,9 @@ _loop1_14_rule(Parser *p) return _seq; } -// _tmp_15: yield_expr | star_expressions +// _tmp_16: yield_expr | star_expressions static void * -_tmp_15_rule(Parser *p) +_tmp_16_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24655,18 +25668,18 @@ _tmp_15_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_15[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_16[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_15[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_16[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_15[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_16[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -24674,18 +25687,18 @@ _tmp_15_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_15[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_16[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_15[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_16[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_15[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_16[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -24694,9 +25707,9 @@ _tmp_15_rule(Parser *p) return _res; } -// _tmp_16: yield_expr | star_expressions +// _tmp_17: yield_expr | star_expressions static void * -_tmp_16_rule(Parser *p) +_tmp_17_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24713,18 +25726,18 @@ _tmp_16_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_16[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_17[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_16[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_17[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_16[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_17[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -24732,18 +25745,18 @@ _tmp_16_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_16[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_17[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_16[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_17[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_16[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_17[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -24752,9 +25765,9 @@ _tmp_16_rule(Parser *p) return _res; } -// _tmp_17: 'from' expression +// _tmp_18: 'from' expression static void * -_tmp_17_rule(Parser *p) +_tmp_18_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24771,16 +25784,16 @@ _tmp_17_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_17[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from' expression")); + D(fprintf(stderr, "%*c> _tmp_18[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from' expression")); Token * _keyword; expr_ty z; if ( - (_keyword = _PyPegen_expect_token(p, 607)) // token='from' + (_keyword = _PyPegen_expect_token(p, 608)) // token='from' && (z = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_17[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from' expression")); + D(fprintf(stderr, "%*c+ _tmp_18[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from' expression")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24790,7 +25803,7 @@ _tmp_17_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_17[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_18[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'from' expression")); } _res = NULL; @@ -24799,9 +25812,9 @@ _tmp_17_rule(Parser *p) return _res; } -// _loop0_19: ',' NAME +// _loop0_20: ',' NAME static asdl_seq * -_loop0_19_rule(Parser *p) +_loop0_20_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24827,7 +25840,7 @@ _loop0_19_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_19[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' NAME")); + D(fprintf(stderr, "%*c> _loop0_20[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' NAME")); Token * _literal; expr_ty elem; while ( @@ -24859,7 +25872,7 @@ _loop0_19_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_19[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_20[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' NAME")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -24876,9 +25889,9 @@ _loop0_19_rule(Parser *p) return _seq; } -// _gather_18: NAME _loop0_19 +// _gather_19: NAME _loop0_20 static asdl_seq * -_gather_18_rule(Parser *p) +_gather_19_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24890,27 +25903,27 @@ _gather_18_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // NAME _loop0_19 + { // NAME _loop0_20 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_18[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME _loop0_19")); + D(fprintf(stderr, "%*c> _gather_19[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME _loop0_20")); expr_ty elem; asdl_seq * seq; if ( (elem = _PyPegen_name_token(p)) // NAME && - (seq = _loop0_19_rule(p)) // _loop0_19 + (seq = _loop0_20_rule(p)) // _loop0_20 ) { - D(fprintf(stderr, "%*c+ _gather_18[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME _loop0_19")); + D(fprintf(stderr, "%*c+ _gather_19[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME _loop0_20")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_18[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME _loop0_19")); + D(fprintf(stderr, "%*c%s _gather_19[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME _loop0_20")); } _res = NULL; done: @@ -24918,9 +25931,9 @@ _gather_18_rule(Parser *p) return _res; } -// _loop0_21: ',' NAME +// _loop0_22: ',' NAME static asdl_seq * -_loop0_21_rule(Parser *p) +_loop0_22_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24946,7 +25959,7 @@ _loop0_21_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_21[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' NAME")); + D(fprintf(stderr, "%*c> _loop0_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' NAME")); Token * _literal; expr_ty elem; while ( @@ -24978,7 +25991,7 @@ _loop0_21_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_21[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_22[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' NAME")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -24995,9 +26008,9 @@ _loop0_21_rule(Parser *p) return _seq; } -// _gather_20: NAME _loop0_21 +// _gather_21: NAME _loop0_22 static asdl_seq * -_gather_20_rule(Parser *p) +_gather_21_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25009,27 +26022,27 @@ _gather_20_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // NAME _loop0_21 + { // NAME _loop0_22 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_20[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME _loop0_21")); + D(fprintf(stderr, "%*c> _gather_21[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME _loop0_22")); expr_ty elem; asdl_seq * seq; if ( (elem = _PyPegen_name_token(p)) // NAME && - (seq = _loop0_21_rule(p)) // _loop0_21 + (seq = _loop0_22_rule(p)) // _loop0_22 ) { - D(fprintf(stderr, "%*c+ _gather_20[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME _loop0_21")); + D(fprintf(stderr, "%*c+ _gather_21[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME _loop0_22")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_20[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME _loop0_21")); + D(fprintf(stderr, "%*c%s _gather_21[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME _loop0_22")); } _res = NULL; done: @@ -25037,9 +26050,9 @@ _gather_20_rule(Parser *p) return _res; } -// _tmp_22: ';' | NEWLINE +// _tmp_23: ';' | NEWLINE static void * -_tmp_22_rule(Parser *p) +_tmp_23_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25056,18 +26069,18 @@ _tmp_22_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';'")); + D(fprintf(stderr, "%*c> _tmp_23[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 13)) // token=';' ) { - D(fprintf(stderr, "%*c+ _tmp_22[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "';'")); + D(fprintf(stderr, "%*c+ _tmp_23[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "';'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_22[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_23[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';'")); } { // NEWLINE @@ -25075,18 +26088,18 @@ _tmp_22_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + D(fprintf(stderr, "%*c> _tmp_23[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); Token * newline_var; if ( (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_22[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_23[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); _res = newline_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_22[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_23[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); } _res = NULL; @@ -25095,9 +26108,9 @@ _tmp_22_rule(Parser *p) return _res; } -// _tmp_23: ',' expression +// _tmp_24: ',' expression static void * -_tmp_23_rule(Parser *p) +_tmp_24_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25114,7 +26127,7 @@ _tmp_23_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_23[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _tmp_24[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty z; if ( @@ -25123,7 +26136,7 @@ _tmp_23_rule(Parser *p) (z = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_23[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c+ _tmp_24[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25133,7 +26146,7 @@ _tmp_23_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_23[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_24[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } _res = NULL; @@ -25142,9 +26155,9 @@ _tmp_23_rule(Parser *p) return _res; } -// _loop0_24: ('.' | '...') +// _loop0_25: ('.' | '...') static asdl_seq * -_loop0_24_rule(Parser *p) +_loop0_25_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25170,13 +26183,13 @@ _loop0_24_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_24[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_225_var; + D(fprintf(stderr, "%*c> _loop0_25[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); + void *_tmp_245_var; while ( - (_tmp_225_var = _tmp_225_rule(p)) // '.' | '...' + (_tmp_245_var = _tmp_245_rule(p)) // '.' | '...' ) { - _res = _tmp_225_var; + _res = _tmp_245_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -25193,7 +26206,7 @@ _loop0_24_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_24[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_25[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('.' | '...')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -25210,9 +26223,9 @@ _loop0_24_rule(Parser *p) return _seq; } -// _loop1_25: ('.' | '...') +// _loop1_26: ('.' | '...') static asdl_seq * -_loop1_25_rule(Parser *p) +_loop1_26_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25238,13 +26251,13 @@ _loop1_25_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_25[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_226_var; + D(fprintf(stderr, "%*c> _loop1_26[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); + void *_tmp_246_var; while ( - (_tmp_226_var = _tmp_226_rule(p)) // '.' | '...' + (_tmp_246_var = _tmp_246_rule(p)) // '.' | '...' ) { - _res = _tmp_226_var; + _res = _tmp_246_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -25261,7 +26274,7 @@ _loop1_25_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_25[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_26[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('.' | '...')")); } if (_n == 0 || p->error_indicator) { @@ -25283,9 +26296,9 @@ _loop1_25_rule(Parser *p) return _seq; } -// _loop0_27: ',' import_from_as_name +// _loop0_28: ',' import_from_as_name static asdl_seq * -_loop0_27_rule(Parser *p) +_loop0_28_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25311,7 +26324,7 @@ _loop0_27_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_27[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' import_from_as_name")); + D(fprintf(stderr, "%*c> _loop0_28[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' import_from_as_name")); Token * _literal; alias_ty elem; while ( @@ -25343,7 +26356,7 @@ _loop0_27_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_27[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_28[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' import_from_as_name")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -25360,9 +26373,9 @@ _loop0_27_rule(Parser *p) return _seq; } -// _gather_26: import_from_as_name _loop0_27 +// _gather_27: import_from_as_name _loop0_28 static asdl_seq * -_gather_26_rule(Parser *p) +_gather_27_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25374,27 +26387,27 @@ _gather_26_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // import_from_as_name _loop0_27 + { // import_from_as_name _loop0_28 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_26[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_from_as_name _loop0_27")); + D(fprintf(stderr, "%*c> _gather_27[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_from_as_name _loop0_28")); alias_ty elem; asdl_seq * seq; if ( (elem = import_from_as_name_rule(p)) // import_from_as_name && - (seq = _loop0_27_rule(p)) // _loop0_27 + (seq = _loop0_28_rule(p)) // _loop0_28 ) { - D(fprintf(stderr, "%*c+ _gather_26[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "import_from_as_name _loop0_27")); + D(fprintf(stderr, "%*c+ _gather_27[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "import_from_as_name _loop0_28")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_26[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "import_from_as_name _loop0_27")); + D(fprintf(stderr, "%*c%s _gather_27[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "import_from_as_name _loop0_28")); } _res = NULL; done: @@ -25402,9 +26415,9 @@ _gather_26_rule(Parser *p) return _res; } -// _tmp_28: 'as' NAME +// _tmp_29: 'as' NAME static void * -_tmp_28_rule(Parser *p) +_tmp_29_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25421,16 +26434,16 @@ _tmp_28_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_28[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_29[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty z; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (z = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_28[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_29[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25440,7 +26453,7 @@ _tmp_28_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_28[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_29[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -25449,9 +26462,9 @@ _tmp_28_rule(Parser *p) return _res; } -// _loop0_30: ',' dotted_as_name +// _loop0_31: ',' dotted_as_name static asdl_seq * -_loop0_30_rule(Parser *p) +_loop0_31_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25477,7 +26490,7 @@ _loop0_30_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_30[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' dotted_as_name")); + D(fprintf(stderr, "%*c> _loop0_31[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' dotted_as_name")); Token * _literal; alias_ty elem; while ( @@ -25509,7 +26522,7 @@ _loop0_30_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_30[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_31[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' dotted_as_name")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -25526,9 +26539,9 @@ _loop0_30_rule(Parser *p) return _seq; } -// _gather_29: dotted_as_name _loop0_30 +// _gather_30: dotted_as_name _loop0_31 static asdl_seq * -_gather_29_rule(Parser *p) +_gather_30_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25540,27 +26553,27 @@ _gather_29_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // dotted_as_name _loop0_30 + { // dotted_as_name _loop0_31 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_29[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_as_name _loop0_30")); + D(fprintf(stderr, "%*c> _gather_30[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_as_name _loop0_31")); alias_ty elem; asdl_seq * seq; if ( (elem = dotted_as_name_rule(p)) // dotted_as_name && - (seq = _loop0_30_rule(p)) // _loop0_30 + (seq = _loop0_31_rule(p)) // _loop0_31 ) { - D(fprintf(stderr, "%*c+ _gather_29[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_as_name _loop0_30")); + D(fprintf(stderr, "%*c+ _gather_30[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_as_name _loop0_31")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_29[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_as_name _loop0_30")); + D(fprintf(stderr, "%*c%s _gather_30[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_as_name _loop0_31")); } _res = NULL; done: @@ -25568,9 +26581,9 @@ _gather_29_rule(Parser *p) return _res; } -// _tmp_31: 'as' NAME +// _tmp_32: 'as' NAME static void * -_tmp_31_rule(Parser *p) +_tmp_32_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25587,16 +26600,16 @@ _tmp_31_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_31[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_32[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty z; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (z = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_31[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_32[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25606,7 +26619,7 @@ _tmp_31_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_31[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_32[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -25615,9 +26628,9 @@ _tmp_31_rule(Parser *p) return _res; } -// _loop1_32: ('@' named_expression NEWLINE) +// _loop1_33: ('@' named_expression NEWLINE) static asdl_seq * -_loop1_32_rule(Parser *p) +_loop1_33_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25643,13 +26656,13 @@ _loop1_32_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_32[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)")); - void *_tmp_227_var; + D(fprintf(stderr, "%*c> _loop1_33[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)")); + void *_tmp_247_var; while ( - (_tmp_227_var = _tmp_227_rule(p)) // '@' named_expression NEWLINE + (_tmp_247_var = _tmp_247_rule(p)) // '@' named_expression NEWLINE ) { - _res = _tmp_227_var; + _res = _tmp_247_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -25666,7 +26679,7 @@ _loop1_32_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_32[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_33[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('@' named_expression NEWLINE)")); } if (_n == 0 || p->error_indicator) { @@ -25688,9 +26701,9 @@ _loop1_32_rule(Parser *p) return _seq; } -// _tmp_33: '(' arguments? ')' +// _tmp_34: '(' arguments? ')' static void * -_tmp_33_rule(Parser *p) +_tmp_34_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25707,7 +26720,7 @@ _tmp_33_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_33[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c> _tmp_34[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); Token * _literal; Token * _literal_1; void *z; @@ -25719,7 +26732,7 @@ _tmp_33_rule(Parser *p) (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_33[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c+ _tmp_34[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25729,7 +26742,7 @@ _tmp_33_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_33[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_34[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' arguments? ')'")); } _res = NULL; @@ -25738,9 +26751,9 @@ _tmp_33_rule(Parser *p) return _res; } -// _tmp_34: '->' expression +// _tmp_35: '->' expression static void * -_tmp_34_rule(Parser *p) +_tmp_35_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25757,7 +26770,7 @@ _tmp_34_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_34[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c> _tmp_35[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); Token * _literal; expr_ty z; if ( @@ -25766,7 +26779,7 @@ _tmp_34_rule(Parser *p) (z = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_34[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c+ _tmp_35[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25776,7 +26789,7 @@ _tmp_34_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_34[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_35[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'->' expression")); } _res = NULL; @@ -25785,9 +26798,9 @@ _tmp_34_rule(Parser *p) return _res; } -// _tmp_35: '->' expression +// _tmp_36: '->' expression static void * -_tmp_35_rule(Parser *p) +_tmp_36_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25804,7 +26817,7 @@ _tmp_35_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_35[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c> _tmp_36[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); Token * _literal; expr_ty z; if ( @@ -25813,7 +26826,7 @@ _tmp_35_rule(Parser *p) (z = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_35[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c+ _tmp_36[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25823,7 +26836,7 @@ _tmp_35_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_35[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_36[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'->' expression")); } _res = NULL; @@ -25832,9 +26845,9 @@ _tmp_35_rule(Parser *p) return _res; } -// _loop0_36: param_no_default +// _loop0_37: param_no_default static asdl_seq * -_loop0_36_rule(Parser *p) +_loop0_37_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25860,7 +26873,7 @@ _loop0_36_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_36[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_37[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -25883,7 +26896,7 @@ _loop0_36_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_36[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_37[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -25900,9 +26913,9 @@ _loop0_36_rule(Parser *p) return _seq; } -// _loop0_37: param_with_default +// _loop0_38: param_with_default static asdl_seq * -_loop0_37_rule(Parser *p) +_loop0_38_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25928,7 +26941,7 @@ _loop0_37_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_37[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop0_38[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -25951,7 +26964,7 @@ _loop0_37_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_37[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_38[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -25968,9 +26981,9 @@ _loop0_37_rule(Parser *p) return _seq; } -// _loop0_38: param_with_default +// _loop0_39: param_with_default static asdl_seq * -_loop0_38_rule(Parser *p) +_loop0_39_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25996,7 +27009,7 @@ _loop0_38_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_38[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop0_39[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -26019,7 +27032,7 @@ _loop0_38_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_38[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_39[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26036,9 +27049,9 @@ _loop0_38_rule(Parser *p) return _seq; } -// _loop1_39: param_no_default +// _loop1_40: param_no_default static asdl_seq * -_loop1_39_rule(Parser *p) +_loop1_40_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26064,7 +27077,7 @@ _loop1_39_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_39[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop1_40[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -26087,7 +27100,7 @@ _loop1_39_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_39[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_40[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -26109,9 +27122,9 @@ _loop1_39_rule(Parser *p) return _seq; } -// _loop0_40: param_with_default +// _loop0_41: param_with_default static asdl_seq * -_loop0_40_rule(Parser *p) +_loop0_41_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26137,7 +27150,7 @@ _loop0_40_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_40[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop0_41[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -26160,7 +27173,7 @@ _loop0_40_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_40[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_41[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26177,9 +27190,9 @@ _loop0_40_rule(Parser *p) return _seq; } -// _loop1_41: param_with_default +// _loop1_42: param_with_default static asdl_seq * -_loop1_41_rule(Parser *p) +_loop1_42_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26205,7 +27218,7 @@ _loop1_41_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_41[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop1_42[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -26228,7 +27241,7 @@ _loop1_41_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_41[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_42[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -26250,9 +27263,9 @@ _loop1_41_rule(Parser *p) return _seq; } -// _loop1_42: param_no_default +// _loop1_43: param_no_default static asdl_seq * -_loop1_42_rule(Parser *p) +_loop1_43_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26278,7 +27291,7 @@ _loop1_42_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_42[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop1_43[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -26301,7 +27314,7 @@ _loop1_42_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_42[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_43[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -26323,9 +27336,9 @@ _loop1_42_rule(Parser *p) return _seq; } -// _loop1_43: param_no_default +// _loop1_44: param_no_default static asdl_seq * -_loop1_43_rule(Parser *p) +_loop1_44_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26351,7 +27364,7 @@ _loop1_43_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_43[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop1_44[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -26374,7 +27387,7 @@ _loop1_43_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_43[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_44[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -26396,9 +27409,9 @@ _loop1_43_rule(Parser *p) return _seq; } -// _loop0_44: param_no_default +// _loop0_45: param_no_default static asdl_seq * -_loop0_44_rule(Parser *p) +_loop0_45_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26424,7 +27437,7 @@ _loop0_44_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_44[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_45[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -26447,7 +27460,7 @@ _loop0_44_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_44[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_45[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26464,9 +27477,9 @@ _loop0_44_rule(Parser *p) return _seq; } -// _loop1_45: param_with_default +// _loop1_46: param_with_default static asdl_seq * -_loop1_45_rule(Parser *p) +_loop1_46_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26492,7 +27505,7 @@ _loop1_45_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_45[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop1_46[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -26515,7 +27528,7 @@ _loop1_45_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_45[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_46[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -26537,9 +27550,9 @@ _loop1_45_rule(Parser *p) return _seq; } -// _loop0_46: param_no_default +// _loop0_47: param_no_default static asdl_seq * -_loop0_46_rule(Parser *p) +_loop0_47_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26565,7 +27578,7 @@ _loop0_46_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_46[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_47[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -26588,7 +27601,7 @@ _loop0_46_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_46[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_47[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26605,9 +27618,9 @@ _loop0_46_rule(Parser *p) return _seq; } -// _loop1_47: param_with_default +// _loop1_48: param_with_default static asdl_seq * -_loop1_47_rule(Parser *p) +_loop1_48_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26633,7 +27646,7 @@ _loop1_47_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_47[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop1_48[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -26656,7 +27669,7 @@ _loop1_47_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_47[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_48[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -26678,9 +27691,9 @@ _loop1_47_rule(Parser *p) return _seq; } -// _loop0_48: param_maybe_default +// _loop0_49: param_maybe_default static asdl_seq * -_loop0_48_rule(Parser *p) +_loop0_49_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26706,7 +27719,7 @@ _loop0_48_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_48[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_49[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -26729,7 +27742,7 @@ _loop0_48_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_48[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_49[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26746,9 +27759,9 @@ _loop0_48_rule(Parser *p) return _seq; } -// _loop0_49: param_maybe_default +// _loop0_50: param_maybe_default static asdl_seq * -_loop0_49_rule(Parser *p) +_loop0_50_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26774,7 +27787,7 @@ _loop0_49_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_49[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_50[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -26797,7 +27810,7 @@ _loop0_49_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_49[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_50[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26814,9 +27827,9 @@ _loop0_49_rule(Parser *p) return _seq; } -// _loop1_50: param_maybe_default +// _loop1_51: param_maybe_default static asdl_seq * -_loop1_50_rule(Parser *p) +_loop1_51_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26842,7 +27855,7 @@ _loop1_50_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_50[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop1_51[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -26865,7 +27878,7 @@ _loop1_50_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_50[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_51[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } if (_n == 0 || p->error_indicator) { @@ -26887,9 +27900,9 @@ _loop1_50_rule(Parser *p) return _seq; } -// _loop0_52: ',' with_item +// _loop0_53: ',' with_item static asdl_seq * -_loop0_52_rule(Parser *p) +_loop0_53_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26915,7 +27928,7 @@ _loop0_52_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_52[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + D(fprintf(stderr, "%*c> _loop0_53[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); Token * _literal; withitem_ty elem; while ( @@ -26947,7 +27960,7 @@ _loop0_52_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_52[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_53[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26964,9 +27977,9 @@ _loop0_52_rule(Parser *p) return _seq; } -// _gather_51: with_item _loop0_52 +// _gather_52: with_item _loop0_53 static asdl_seq * -_gather_51_rule(Parser *p) +_gather_52_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26978,27 +27991,27 @@ _gather_51_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // with_item _loop0_52 + { // with_item _loop0_53 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_51[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_52")); + D(fprintf(stderr, "%*c> _gather_52[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_53")); withitem_ty elem; asdl_seq * seq; if ( (elem = with_item_rule(p)) // with_item && - (seq = _loop0_52_rule(p)) // _loop0_52 + (seq = _loop0_53_rule(p)) // _loop0_53 ) { - D(fprintf(stderr, "%*c+ _gather_51[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_52")); + D(fprintf(stderr, "%*c+ _gather_52[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_53")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_51[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_52")); + D(fprintf(stderr, "%*c%s _gather_52[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_53")); } _res = NULL; done: @@ -27006,9 +28019,9 @@ _gather_51_rule(Parser *p) return _res; } -// _loop0_54: ',' with_item +// _loop0_55: ',' with_item static asdl_seq * -_loop0_54_rule(Parser *p) +_loop0_55_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27034,7 +28047,7 @@ _loop0_54_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_54[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + D(fprintf(stderr, "%*c> _loop0_55[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); Token * _literal; withitem_ty elem; while ( @@ -27066,7 +28079,7 @@ _loop0_54_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_54[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_55[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -27083,9 +28096,9 @@ _loop0_54_rule(Parser *p) return _seq; } -// _gather_53: with_item _loop0_54 +// _gather_54: with_item _loop0_55 static asdl_seq * -_gather_53_rule(Parser *p) +_gather_54_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27097,27 +28110,27 @@ _gather_53_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // with_item _loop0_54 + { // with_item _loop0_55 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_53[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_54")); + D(fprintf(stderr, "%*c> _gather_54[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_55")); withitem_ty elem; asdl_seq * seq; if ( (elem = with_item_rule(p)) // with_item && - (seq = _loop0_54_rule(p)) // _loop0_54 + (seq = _loop0_55_rule(p)) // _loop0_55 ) { - D(fprintf(stderr, "%*c+ _gather_53[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_54")); + D(fprintf(stderr, "%*c+ _gather_54[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_55")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_53[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_54")); + D(fprintf(stderr, "%*c%s _gather_54[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_55")); } _res = NULL; done: @@ -27125,9 +28138,9 @@ _gather_53_rule(Parser *p) return _res; } -// _loop0_56: ',' with_item +// _loop0_57: ',' with_item static asdl_seq * -_loop0_56_rule(Parser *p) +_loop0_57_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27153,7 +28166,7 @@ _loop0_56_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_56[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + D(fprintf(stderr, "%*c> _loop0_57[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); Token * _literal; withitem_ty elem; while ( @@ -27185,7 +28198,7 @@ _loop0_56_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_56[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_57[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -27202,9 +28215,9 @@ _loop0_56_rule(Parser *p) return _seq; } -// _gather_55: with_item _loop0_56 +// _gather_56: with_item _loop0_57 static asdl_seq * -_gather_55_rule(Parser *p) +_gather_56_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27216,27 +28229,27 @@ _gather_55_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // with_item _loop0_56 + { // with_item _loop0_57 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_55[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_56")); + D(fprintf(stderr, "%*c> _gather_56[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_57")); withitem_ty elem; asdl_seq * seq; if ( (elem = with_item_rule(p)) // with_item && - (seq = _loop0_56_rule(p)) // _loop0_56 + (seq = _loop0_57_rule(p)) // _loop0_57 ) { - D(fprintf(stderr, "%*c+ _gather_55[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_56")); + D(fprintf(stderr, "%*c+ _gather_56[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_57")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_55[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_56")); + D(fprintf(stderr, "%*c%s _gather_56[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_57")); } _res = NULL; done: @@ -27244,9 +28257,9 @@ _gather_55_rule(Parser *p) return _res; } -// _loop0_58: ',' with_item +// _loop0_59: ',' with_item static asdl_seq * -_loop0_58_rule(Parser *p) +_loop0_59_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27272,7 +28285,7 @@ _loop0_58_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_58[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + D(fprintf(stderr, "%*c> _loop0_59[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); Token * _literal; withitem_ty elem; while ( @@ -27304,7 +28317,7 @@ _loop0_58_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_58[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_59[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -27321,9 +28334,9 @@ _loop0_58_rule(Parser *p) return _seq; } -// _gather_57: with_item _loop0_58 +// _gather_58: with_item _loop0_59 static asdl_seq * -_gather_57_rule(Parser *p) +_gather_58_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27335,27 +28348,27 @@ _gather_57_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // with_item _loop0_58 + { // with_item _loop0_59 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_57[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_58")); + D(fprintf(stderr, "%*c> _gather_58[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_59")); withitem_ty elem; asdl_seq * seq; if ( (elem = with_item_rule(p)) // with_item && - (seq = _loop0_58_rule(p)) // _loop0_58 + (seq = _loop0_59_rule(p)) // _loop0_59 ) { - D(fprintf(stderr, "%*c+ _gather_57[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_58")); + D(fprintf(stderr, "%*c+ _gather_58[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_59")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_57[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_58")); + D(fprintf(stderr, "%*c%s _gather_58[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_59")); } _res = NULL; done: @@ -27363,9 +28376,9 @@ _gather_57_rule(Parser *p) return _res; } -// _tmp_59: ',' | ')' | ':' +// _tmp_60: ',' | ')' | ':' static void * -_tmp_59_rule(Parser *p) +_tmp_60_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27382,18 +28395,18 @@ _tmp_59_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_59[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_60[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_59[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_60[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_59[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_60[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // ')' @@ -27401,18 +28414,18 @@ _tmp_59_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_59[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_60[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_59[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_60[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_59[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_60[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // ':' @@ -27420,18 +28433,18 @@ _tmp_59_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_59[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_60[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_59[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_60[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_59[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_60[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } _res = NULL; @@ -27440,9 +28453,9 @@ _tmp_59_rule(Parser *p) return _res; } -// _loop1_60: except_block +// _loop1_61: except_block static asdl_seq * -_loop1_60_rule(Parser *p) +_loop1_61_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27468,7 +28481,7 @@ _loop1_60_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_60[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_block")); + D(fprintf(stderr, "%*c> _loop1_61[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_block")); excepthandler_ty except_block_var; while ( (except_block_var = except_block_rule(p)) // except_block @@ -27491,7 +28504,7 @@ _loop1_60_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_60[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_61[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_block")); } if (_n == 0 || p->error_indicator) { @@ -27513,9 +28526,9 @@ _loop1_60_rule(Parser *p) return _seq; } -// _loop1_61: except_star_block +// _loop1_62: except_star_block static asdl_seq * -_loop1_61_rule(Parser *p) +_loop1_62_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27541,7 +28554,7 @@ _loop1_61_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_61[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_star_block")); + D(fprintf(stderr, "%*c> _loop1_62[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_star_block")); excepthandler_ty except_star_block_var; while ( (except_star_block_var = except_star_block_rule(p)) // except_star_block @@ -27564,7 +28577,7 @@ _loop1_61_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_61[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_62[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_star_block")); } if (_n == 0 || p->error_indicator) { @@ -27586,9 +28599,9 @@ _loop1_61_rule(Parser *p) return _seq; } -// _tmp_62: 'as' NAME +// _tmp_63: 'as' NAME static void * -_tmp_62_rule(Parser *p) +_tmp_63_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27605,16 +28618,16 @@ _tmp_62_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_62[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_63[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty z; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (z = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_62[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_63[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -27624,7 +28637,7 @@ _tmp_62_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_62[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_63[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -27633,9 +28646,9 @@ _tmp_62_rule(Parser *p) return _res; } -// _tmp_63: 'as' NAME +// _tmp_64: 'as' NAME static void * -_tmp_63_rule(Parser *p) +_tmp_64_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27652,16 +28665,16 @@ _tmp_63_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_63[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_64[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty z; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (z = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_63[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_64[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -27671,7 +28684,7 @@ _tmp_63_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_63[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_64[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -27680,9 +28693,9 @@ _tmp_63_rule(Parser *p) return _res; } -// _loop1_64: case_block +// _loop1_65: case_block static asdl_seq * -_loop1_64_rule(Parser *p) +_loop1_65_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27708,7 +28721,7 @@ _loop1_64_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_64[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "case_block")); + D(fprintf(stderr, "%*c> _loop1_65[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "case_block")); match_case_ty case_block_var; while ( (case_block_var = case_block_rule(p)) // case_block @@ -27731,7 +28744,7 @@ _loop1_64_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_64[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_65[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "case_block")); } if (_n == 0 || p->error_indicator) { @@ -27753,9 +28766,9 @@ _loop1_64_rule(Parser *p) return _seq; } -// _loop0_66: '|' closed_pattern +// _loop0_67: '|' closed_pattern static asdl_seq * -_loop0_66_rule(Parser *p) +_loop0_67_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27781,7 +28794,7 @@ _loop0_66_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_66[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'|' closed_pattern")); + D(fprintf(stderr, "%*c> _loop0_67[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'|' closed_pattern")); Token * _literal; pattern_ty elem; while ( @@ -27813,7 +28826,7 @@ _loop0_66_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_66[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_67[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'|' closed_pattern")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -27830,9 +28843,9 @@ _loop0_66_rule(Parser *p) return _seq; } -// _gather_65: closed_pattern _loop0_66 +// _gather_66: closed_pattern _loop0_67 static asdl_seq * -_gather_65_rule(Parser *p) +_gather_66_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27844,85 +28857,27 @@ _gather_65_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // closed_pattern _loop0_66 + { // closed_pattern _loop0_67 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_65[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "closed_pattern _loop0_66")); + D(fprintf(stderr, "%*c> _gather_66[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "closed_pattern _loop0_67")); pattern_ty elem; asdl_seq * seq; if ( (elem = closed_pattern_rule(p)) // closed_pattern && - (seq = _loop0_66_rule(p)) // _loop0_66 + (seq = _loop0_67_rule(p)) // _loop0_67 ) { - D(fprintf(stderr, "%*c+ _gather_65[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "closed_pattern _loop0_66")); + D(fprintf(stderr, "%*c+ _gather_66[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "closed_pattern _loop0_67")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_65[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "closed_pattern _loop0_66")); - } - _res = NULL; - done: - p->level--; - return _res; -} - -// _tmp_67: '+' | '-' -static void * -_tmp_67_rule(Parser *p) -{ - if (p->level++ == MAXSTACK) { - p->error_indicator = 1; - PyErr_NoMemory(); - } - if (p->error_indicator) { - p->level--; - return NULL; - } - void * _res = NULL; - int _mark = p->mark; - { // '+' - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _tmp_67[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+'")); - Token * _literal; - if ( - (_literal = _PyPegen_expect_token(p, 14)) // token='+' - ) - { - D(fprintf(stderr, "%*c+ _tmp_67[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+'")); - _res = _literal; - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_67[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'+'")); - } - { // '-' - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _tmp_67[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-'")); - Token * _literal; - if ( - (_literal = _PyPegen_expect_token(p, 15)) // token='-' - ) - { - D(fprintf(stderr, "%*c+ _tmp_67[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-'")); - _res = _literal; - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_67[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'-'")); + D(fprintf(stderr, "%*c%s _gather_66[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "closed_pattern _loop0_67")); } _res = NULL; done: @@ -27988,7 +28943,7 @@ _tmp_68_rule(Parser *p) return _res; } -// _tmp_69: '.' | '(' | '=' +// _tmp_69: '+' | '-' static void * _tmp_69_rule(Parser *p) { @@ -28002,62 +28957,43 @@ _tmp_69_rule(Parser *p) } void * _res = NULL; int _mark = p->mark; - { // '.' - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _tmp_69[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); - Token * _literal; - if ( - (_literal = _PyPegen_expect_token(p, 23)) // token='.' - ) - { - D(fprintf(stderr, "%*c+ _tmp_69[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); - _res = _literal; - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_69[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); - } - { // '(' + { // '+' if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_69[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c> _tmp_69[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+'")); Token * _literal; if ( - (_literal = _PyPegen_expect_token(p, 7)) // token='(' + (_literal = _PyPegen_expect_token(p, 14)) // token='+' ) { - D(fprintf(stderr, "%*c+ _tmp_69[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c+ _tmp_69[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+'")); _res = _literal; goto done; } p->mark = _mark; D(fprintf(stderr, "%*c%s _tmp_69[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'+'")); } - { // '=' + { // '-' if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_69[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c> _tmp_69[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-'")); Token * _literal; if ( - (_literal = _PyPegen_expect_token(p, 22)) // token='=' + (_literal = _PyPegen_expect_token(p, 15)) // token='-' ) { - D(fprintf(stderr, "%*c+ _tmp_69[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c+ _tmp_69[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-'")); _res = _literal; goto done; } p->mark = _mark; D(fprintf(stderr, "%*c%s _tmp_69[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'-'")); } _res = NULL; done: @@ -28142,9 +29078,86 @@ _tmp_70_rule(Parser *p) return _res; } -// _loop0_72: ',' maybe_star_pattern +// _tmp_71: '.' | '(' | '=' +static void * +_tmp_71_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '.' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_71[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + ) + { + D(fprintf(stderr, "%*c+ _tmp_71[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_71[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); + } + { // '(' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_71[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + ) + { + D(fprintf(stderr, "%*c+ _tmp_71[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_71[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('")); + } + { // '=' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_71[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ _tmp_71[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_71[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _loop0_73: ',' maybe_star_pattern static asdl_seq * -_loop0_72_rule(Parser *p) +_loop0_73_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28170,7 +29183,7 @@ _loop0_72_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_72[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' maybe_star_pattern")); + D(fprintf(stderr, "%*c> _loop0_73[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' maybe_star_pattern")); Token * _literal; pattern_ty elem; while ( @@ -28202,7 +29215,7 @@ _loop0_72_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_72[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_73[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' maybe_star_pattern")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -28219,9 +29232,9 @@ _loop0_72_rule(Parser *p) return _seq; } -// _gather_71: maybe_star_pattern _loop0_72 +// _gather_72: maybe_star_pattern _loop0_73 static asdl_seq * -_gather_71_rule(Parser *p) +_gather_72_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28233,27 +29246,27 @@ _gather_71_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // maybe_star_pattern _loop0_72 + { // maybe_star_pattern _loop0_73 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_71[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "maybe_star_pattern _loop0_72")); + D(fprintf(stderr, "%*c> _gather_72[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "maybe_star_pattern _loop0_73")); pattern_ty elem; asdl_seq * seq; if ( (elem = maybe_star_pattern_rule(p)) // maybe_star_pattern && - (seq = _loop0_72_rule(p)) // _loop0_72 + (seq = _loop0_73_rule(p)) // _loop0_73 ) { - D(fprintf(stderr, "%*c+ _gather_71[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "maybe_star_pattern _loop0_72")); + D(fprintf(stderr, "%*c+ _gather_72[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "maybe_star_pattern _loop0_73")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_71[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "maybe_star_pattern _loop0_72")); + D(fprintf(stderr, "%*c%s _gather_72[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "maybe_star_pattern _loop0_73")); } _res = NULL; done: @@ -28261,9 +29274,9 @@ _gather_71_rule(Parser *p) return _res; } -// _loop0_74: ',' key_value_pattern +// _loop0_75: ',' key_value_pattern static asdl_seq * -_loop0_74_rule(Parser *p) +_loop0_75_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28289,7 +29302,7 @@ _loop0_74_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_74[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' key_value_pattern")); + D(fprintf(stderr, "%*c> _loop0_75[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' key_value_pattern")); Token * _literal; KeyPatternPair* elem; while ( @@ -28321,7 +29334,7 @@ _loop0_74_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_74[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_75[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' key_value_pattern")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -28338,9 +29351,9 @@ _loop0_74_rule(Parser *p) return _seq; } -// _gather_73: key_value_pattern _loop0_74 +// _gather_74: key_value_pattern _loop0_75 static asdl_seq * -_gather_73_rule(Parser *p) +_gather_74_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28352,27 +29365,27 @@ _gather_73_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // key_value_pattern _loop0_74 + { // key_value_pattern _loop0_75 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_73[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "key_value_pattern _loop0_74")); + D(fprintf(stderr, "%*c> _gather_74[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "key_value_pattern _loop0_75")); KeyPatternPair* elem; asdl_seq * seq; if ( (elem = key_value_pattern_rule(p)) // key_value_pattern && - (seq = _loop0_74_rule(p)) // _loop0_74 + (seq = _loop0_75_rule(p)) // _loop0_75 ) { - D(fprintf(stderr, "%*c+ _gather_73[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "key_value_pattern _loop0_74")); + D(fprintf(stderr, "%*c+ _gather_74[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "key_value_pattern _loop0_75")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_73[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "key_value_pattern _loop0_74")); + D(fprintf(stderr, "%*c%s _gather_74[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "key_value_pattern _loop0_75")); } _res = NULL; done: @@ -28380,9 +29393,9 @@ _gather_73_rule(Parser *p) return _res; } -// _tmp_75: literal_expr | attr +// _tmp_76: literal_expr | attr static void * -_tmp_75_rule(Parser *p) +_tmp_76_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28399,18 +29412,18 @@ _tmp_75_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_75[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "literal_expr")); + D(fprintf(stderr, "%*c> _tmp_76[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "literal_expr")); expr_ty literal_expr_var; if ( (literal_expr_var = literal_expr_rule(p)) // literal_expr ) { - D(fprintf(stderr, "%*c+ _tmp_75[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "literal_expr")); + D(fprintf(stderr, "%*c+ _tmp_76[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "literal_expr")); _res = literal_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_75[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_76[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "literal_expr")); } { // attr @@ -28418,18 +29431,18 @@ _tmp_75_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_75[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "attr")); + D(fprintf(stderr, "%*c> _tmp_76[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "attr")); expr_ty attr_var; if ( (attr_var = attr_rule(p)) // attr ) { - D(fprintf(stderr, "%*c+ _tmp_75[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "attr")); + D(fprintf(stderr, "%*c+ _tmp_76[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "attr")); _res = attr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_75[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_76[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "attr")); } _res = NULL; @@ -28438,9 +29451,9 @@ _tmp_75_rule(Parser *p) return _res; } -// _loop0_77: ',' pattern +// _loop0_78: ',' pattern static asdl_seq * -_loop0_77_rule(Parser *p) +_loop0_78_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28466,7 +29479,7 @@ _loop0_77_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_77[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' pattern")); + D(fprintf(stderr, "%*c> _loop0_78[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' pattern")); Token * _literal; pattern_ty elem; while ( @@ -28498,7 +29511,7 @@ _loop0_77_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_77[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_78[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' pattern")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -28515,9 +29528,9 @@ _loop0_77_rule(Parser *p) return _seq; } -// _gather_76: pattern _loop0_77 +// _gather_77: pattern _loop0_78 static asdl_seq * -_gather_76_rule(Parser *p) +_gather_77_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28529,27 +29542,27 @@ _gather_76_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // pattern _loop0_77 + { // pattern _loop0_78 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_76[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "pattern _loop0_77")); + D(fprintf(stderr, "%*c> _gather_77[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "pattern _loop0_78")); pattern_ty elem; asdl_seq * seq; if ( (elem = pattern_rule(p)) // pattern && - (seq = _loop0_77_rule(p)) // _loop0_77 + (seq = _loop0_78_rule(p)) // _loop0_78 ) { - D(fprintf(stderr, "%*c+ _gather_76[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "pattern _loop0_77")); + D(fprintf(stderr, "%*c+ _gather_77[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "pattern _loop0_78")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_76[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "pattern _loop0_77")); + D(fprintf(stderr, "%*c%s _gather_77[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "pattern _loop0_78")); } _res = NULL; done: @@ -28557,9 +29570,9 @@ _gather_76_rule(Parser *p) return _res; } -// _loop0_79: ',' keyword_pattern +// _loop0_80: ',' keyword_pattern static asdl_seq * -_loop0_79_rule(Parser *p) +_loop0_80_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28585,7 +29598,7 @@ _loop0_79_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_79[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' keyword_pattern")); + D(fprintf(stderr, "%*c> _loop0_80[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' keyword_pattern")); Token * _literal; KeyPatternPair* elem; while ( @@ -28617,7 +29630,7 @@ _loop0_79_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_79[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_80[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' keyword_pattern")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -28634,9 +29647,9 @@ _loop0_79_rule(Parser *p) return _seq; } -// _gather_78: keyword_pattern _loop0_79 +// _gather_79: keyword_pattern _loop0_80 static asdl_seq * -_gather_78_rule(Parser *p) +_gather_79_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28648,27 +29661,27 @@ _gather_78_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // keyword_pattern _loop0_79 + { // keyword_pattern _loop0_80 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_78[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "keyword_pattern _loop0_79")); + D(fprintf(stderr, "%*c> _gather_79[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "keyword_pattern _loop0_80")); KeyPatternPair* elem; asdl_seq * seq; if ( (elem = keyword_pattern_rule(p)) // keyword_pattern && - (seq = _loop0_79_rule(p)) // _loop0_79 + (seq = _loop0_80_rule(p)) // _loop0_80 ) { - D(fprintf(stderr, "%*c+ _gather_78[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "keyword_pattern _loop0_79")); + D(fprintf(stderr, "%*c+ _gather_79[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "keyword_pattern _loop0_80")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_78[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "keyword_pattern _loop0_79")); + D(fprintf(stderr, "%*c%s _gather_79[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "keyword_pattern _loop0_80")); } _res = NULL; done: @@ -28676,9 +29689,9 @@ _gather_78_rule(Parser *p) return _res; } -// _loop1_80: (',' expression) +// _loop1_81: (',' expression) static asdl_seq * -_loop1_80_rule(Parser *p) +_loop1_81_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28704,13 +29717,13 @@ _loop1_80_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_80[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)")); - void *_tmp_228_var; + D(fprintf(stderr, "%*c> _loop1_81[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)")); + void *_tmp_248_var; while ( - (_tmp_228_var = _tmp_228_rule(p)) // ',' expression + (_tmp_248_var = _tmp_248_rule(p)) // ',' expression ) { - _res = _tmp_228_var; + _res = _tmp_248_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -28727,7 +29740,7 @@ _loop1_80_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_80[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_81[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' expression)")); } if (_n == 0 || p->error_indicator) { @@ -28749,9 +29762,9 @@ _loop1_80_rule(Parser *p) return _seq; } -// _loop1_81: (',' star_expression) +// _loop1_82: (',' star_expression) static asdl_seq * -_loop1_81_rule(Parser *p) +_loop1_82_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28777,13 +29790,13 @@ _loop1_81_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_81[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); - void *_tmp_229_var; + D(fprintf(stderr, "%*c> _loop1_82[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); + void *_tmp_249_var; while ( - (_tmp_229_var = _tmp_229_rule(p)) // ',' star_expression + (_tmp_249_var = _tmp_249_rule(p)) // ',' star_expression ) { - _res = _tmp_229_var; + _res = _tmp_249_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -28800,7 +29813,7 @@ _loop1_81_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_81[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_82[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_expression)")); } if (_n == 0 || p->error_indicator) { @@ -28822,9 +29835,9 @@ _loop1_81_rule(Parser *p) return _seq; } -// _loop0_83: ',' star_named_expression +// _loop0_84: ',' star_named_expression static asdl_seq * -_loop0_83_rule(Parser *p) +_loop0_84_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28850,7 +29863,7 @@ _loop0_83_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_83[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_named_expression")); + D(fprintf(stderr, "%*c> _loop0_84[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_named_expression")); Token * _literal; expr_ty elem; while ( @@ -28882,7 +29895,7 @@ _loop0_83_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_83[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_84[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_named_expression")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -28899,9 +29912,9 @@ _loop0_83_rule(Parser *p) return _seq; } -// _gather_82: star_named_expression _loop0_83 +// _gather_83: star_named_expression _loop0_84 static asdl_seq * -_gather_82_rule(Parser *p) +_gather_83_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28913,27 +29926,27 @@ _gather_82_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // star_named_expression _loop0_83 + { // star_named_expression _loop0_84 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_82[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_83")); + D(fprintf(stderr, "%*c> _gather_83[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_84")); expr_ty elem; asdl_seq * seq; if ( (elem = star_named_expression_rule(p)) // star_named_expression && - (seq = _loop0_83_rule(p)) // _loop0_83 + (seq = _loop0_84_rule(p)) // _loop0_84 ) { - D(fprintf(stderr, "%*c+ _gather_82[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_83")); + D(fprintf(stderr, "%*c+ _gather_83[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_84")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_82[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression _loop0_83")); + D(fprintf(stderr, "%*c%s _gather_83[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression _loop0_84")); } _res = NULL; done: @@ -28941,9 +29954,9 @@ _gather_82_rule(Parser *p) return _res; } -// _loop1_84: ('or' conjunction) +// _loop1_85: ('or' conjunction) static asdl_seq * -_loop1_84_rule(Parser *p) +_loop1_85_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28969,13 +29982,13 @@ _loop1_84_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_84[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); - void *_tmp_230_var; + D(fprintf(stderr, "%*c> _loop1_85[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); + void *_tmp_250_var; while ( - (_tmp_230_var = _tmp_230_rule(p)) // 'or' conjunction + (_tmp_250_var = _tmp_250_rule(p)) // 'or' conjunction ) { - _res = _tmp_230_var; + _res = _tmp_250_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -28992,7 +30005,7 @@ _loop1_84_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_84[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_85[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('or' conjunction)")); } if (_n == 0 || p->error_indicator) { @@ -29014,9 +30027,9 @@ _loop1_84_rule(Parser *p) return _seq; } -// _loop1_85: ('and' inversion) +// _loop1_86: ('and' inversion) static asdl_seq * -_loop1_85_rule(Parser *p) +_loop1_86_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29042,13 +30055,13 @@ _loop1_85_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_85[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); - void *_tmp_231_var; + D(fprintf(stderr, "%*c> _loop1_86[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); + void *_tmp_251_var; while ( - (_tmp_231_var = _tmp_231_rule(p)) // 'and' inversion + (_tmp_251_var = _tmp_251_rule(p)) // 'and' inversion ) { - _res = _tmp_231_var; + _res = _tmp_251_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -29065,7 +30078,7 @@ _loop1_85_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_85[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_86[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('and' inversion)")); } if (_n == 0 || p->error_indicator) { @@ -29087,9 +30100,9 @@ _loop1_85_rule(Parser *p) return _seq; } -// _loop1_86: compare_op_bitwise_or_pair +// _loop1_87: compare_op_bitwise_or_pair static asdl_seq * -_loop1_86_rule(Parser *p) +_loop1_87_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29115,7 +30128,7 @@ _loop1_86_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_86[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "compare_op_bitwise_or_pair")); + D(fprintf(stderr, "%*c> _loop1_87[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "compare_op_bitwise_or_pair")); CmpopExprPair* compare_op_bitwise_or_pair_var; while ( (compare_op_bitwise_or_pair_var = compare_op_bitwise_or_pair_rule(p)) // compare_op_bitwise_or_pair @@ -29138,7 +30151,7 @@ _loop1_86_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_86[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_87[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "compare_op_bitwise_or_pair")); } if (_n == 0 || p->error_indicator) { @@ -29160,9 +30173,9 @@ _loop1_86_rule(Parser *p) return _seq; } -// _tmp_87: '!=' +// _tmp_88: '!=' static void * -_tmp_87_rule(Parser *p) +_tmp_88_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29179,13 +30192,13 @@ _tmp_87_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_87[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!='")); + D(fprintf(stderr, "%*c> _tmp_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!='")); Token * tok; if ( (tok = _PyPegen_expect_token(p, 28)) // token='!=' ) { - D(fprintf(stderr, "%*c+ _tmp_87[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!='")); + D(fprintf(stderr, "%*c+ _tmp_88[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!='")); _res = _PyPegen_check_barry_as_flufl ( p , tok ) ? NULL : tok; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -29195,7 +30208,7 @@ _tmp_87_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_87[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_88[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!='")); } _res = NULL; @@ -29204,9 +30217,9 @@ _tmp_87_rule(Parser *p) return _res; } -// _loop0_89: ',' (slice | starred_expression) +// _loop0_90: ',' (slice | starred_expression) static asdl_seq * -_loop0_89_rule(Parser *p) +_loop0_90_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29232,13 +30245,13 @@ _loop0_89_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (slice | starred_expression)")); + D(fprintf(stderr, "%*c> _loop0_90[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (slice | starred_expression)")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_232_rule(p)) // slice | starred_expression + (elem = _tmp_252_rule(p)) // slice | starred_expression ) { _res = elem; @@ -29264,7 +30277,7 @@ _loop0_89_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_89[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_90[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (slice | starred_expression)")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -29281,9 +30294,9 @@ _loop0_89_rule(Parser *p) return _seq; } -// _gather_88: (slice | starred_expression) _loop0_89 +// _gather_89: (slice | starred_expression) _loop0_90 static asdl_seq * -_gather_88_rule(Parser *p) +_gather_89_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29295,27 +30308,27 @@ _gather_88_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (slice | starred_expression) _loop0_89 + { // (slice | starred_expression) _loop0_90 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(slice | starred_expression) _loop0_89")); + D(fprintf(stderr, "%*c> _gather_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(slice | starred_expression) _loop0_90")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_232_rule(p)) // slice | starred_expression + (elem = _tmp_252_rule(p)) // slice | starred_expression && - (seq = _loop0_89_rule(p)) // _loop0_89 + (seq = _loop0_90_rule(p)) // _loop0_90 ) { - D(fprintf(stderr, "%*c+ _gather_88[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(slice | starred_expression) _loop0_89")); + D(fprintf(stderr, "%*c+ _gather_89[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(slice | starred_expression) _loop0_90")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_88[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(slice | starred_expression) _loop0_89")); + D(fprintf(stderr, "%*c%s _gather_89[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(slice | starred_expression) _loop0_90")); } _res = NULL; done: @@ -29323,9 +30336,9 @@ _gather_88_rule(Parser *p) return _res; } -// _tmp_90: ':' expression? +// _tmp_91: ':' expression? static void * -_tmp_90_rule(Parser *p) +_tmp_91_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29342,7 +30355,7 @@ _tmp_90_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_90[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':' expression?")); + D(fprintf(stderr, "%*c> _tmp_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':' expression?")); Token * _literal; void *d; if ( @@ -29351,7 +30364,7 @@ _tmp_90_rule(Parser *p) (d = expression_rule(p), !p->error_indicator) // expression? ) { - D(fprintf(stderr, "%*c+ _tmp_90[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' expression?")); + D(fprintf(stderr, "%*c+ _tmp_91[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' expression?")); _res = d; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -29361,7 +30374,7 @@ _tmp_90_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_90[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_91[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':' expression?")); } _res = NULL; @@ -29370,9 +30383,67 @@ _tmp_90_rule(Parser *p) return _res; } -// _tmp_91: tuple | group | genexp +// _tmp_92: STRING | FSTRING_START static void * -_tmp_91_rule(Parser *p) +_tmp_92_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // STRING + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "STRING")); + expr_ty string_var; + if ( + (string_var = _PyPegen_string_token(p)) // STRING + ) + { + D(fprintf(stderr, "%*c+ _tmp_92[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "STRING")); + _res = string_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_92[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "STRING")); + } + { // FSTRING_START + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "FSTRING_START")); + Token * fstring_start_var; + if ( + (fstring_start_var = _PyPegen_expect_token(p, FSTRING_START)) // token='FSTRING_START' + ) + { + D(fprintf(stderr, "%*c+ _tmp_92[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "FSTRING_START")); + _res = fstring_start_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_92[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "FSTRING_START")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_93: tuple | group | genexp +static void * +_tmp_93_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29389,18 +30460,18 @@ _tmp_91_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); + D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); expr_ty tuple_var; if ( (tuple_var = tuple_rule(p)) // tuple ) { - D(fprintf(stderr, "%*c+ _tmp_91[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); + D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); _res = tuple_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_91[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tuple")); } { // group @@ -29408,18 +30479,18 @@ _tmp_91_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "group")); + D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "group")); expr_ty group_var; if ( (group_var = group_rule(p)) // group ) { - D(fprintf(stderr, "%*c+ _tmp_91[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "group")); + D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "group")); _res = group_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_91[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "group")); } { // genexp @@ -29427,18 +30498,18 @@ _tmp_91_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); + D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); expr_ty genexp_var; if ( (genexp_var = genexp_rule(p)) // genexp ) { - D(fprintf(stderr, "%*c+ _tmp_91[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); + D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); _res = genexp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_91[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "genexp")); } _res = NULL; @@ -29447,9 +30518,9 @@ _tmp_91_rule(Parser *p) return _res; } -// _tmp_92: list | listcomp +// _tmp_94: list | listcomp static void * -_tmp_92_rule(Parser *p) +_tmp_94_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29466,18 +30537,18 @@ _tmp_92_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); + D(fprintf(stderr, "%*c> _tmp_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); expr_ty list_var; if ( (list_var = list_rule(p)) // list ) { - D(fprintf(stderr, "%*c+ _tmp_92[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); + D(fprintf(stderr, "%*c+ _tmp_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); _res = list_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_92[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_94[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "list")); } { // listcomp @@ -29485,18 +30556,18 @@ _tmp_92_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "listcomp")); + D(fprintf(stderr, "%*c> _tmp_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "listcomp")); expr_ty listcomp_var; if ( (listcomp_var = listcomp_rule(p)) // listcomp ) { - D(fprintf(stderr, "%*c+ _tmp_92[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "listcomp")); + D(fprintf(stderr, "%*c+ _tmp_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "listcomp")); _res = listcomp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_92[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_94[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "listcomp")); } _res = NULL; @@ -29505,9 +30576,9 @@ _tmp_92_rule(Parser *p) return _res; } -// _tmp_93: dict | set | dictcomp | setcomp +// _tmp_95: dict | set | dictcomp | setcomp static void * -_tmp_93_rule(Parser *p) +_tmp_95_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29524,18 +30595,18 @@ _tmp_93_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dict")); + D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dict")); expr_ty dict_var; if ( (dict_var = dict_rule(p)) // dict ) { - D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dict")); + D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dict")); _res = dict_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dict")); } { // set @@ -29543,18 +30614,18 @@ _tmp_93_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "set")); + D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "set")); expr_ty set_var; if ( (set_var = set_rule(p)) // set ) { - D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "set")); + D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "set")); _res = set_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "set")); } { // dictcomp @@ -29562,18 +30633,18 @@ _tmp_93_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dictcomp")); + D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dictcomp")); expr_ty dictcomp_var; if ( (dictcomp_var = dictcomp_rule(p)) // dictcomp ) { - D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dictcomp")); + D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dictcomp")); _res = dictcomp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dictcomp")); } { // setcomp @@ -29581,18 +30652,18 @@ _tmp_93_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "setcomp")); + D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "setcomp")); expr_ty setcomp_var; if ( (setcomp_var = setcomp_rule(p)) // setcomp ) { - D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "setcomp")); + D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "setcomp")); _res = setcomp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "setcomp")); } _res = NULL; @@ -29601,9 +30672,9 @@ _tmp_93_rule(Parser *p) return _res; } -// _tmp_94: yield_expr | named_expression +// _tmp_96: yield_expr | named_expression static void * -_tmp_94_rule(Parser *p) +_tmp_96_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29620,18 +30691,18 @@ _tmp_94_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_96[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_94[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_96[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // named_expression @@ -29639,18 +30710,18 @@ _tmp_94_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression")); + D(fprintf(stderr, "%*c> _tmp_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression")); expr_ty named_expression_var; if ( (named_expression_var = named_expression_rule(p)) // named_expression ) { - D(fprintf(stderr, "%*c+ _tmp_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression")); + D(fprintf(stderr, "%*c+ _tmp_96[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression")); _res = named_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_94[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_96[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression")); } _res = NULL; @@ -29659,143 +30730,7 @@ _tmp_94_rule(Parser *p) return _res; } -// _loop0_95: lambda_param_no_default -static asdl_seq * -_loop0_95_rule(Parser *p) -{ - if (p->level++ == MAXSTACK) { - p->error_indicator = 1; - PyErr_NoMemory(); - } - if (p->error_indicator) { - p->level--; - return NULL; - } - void *_res = NULL; - int _mark = p->mark; - void **_children = PyMem_Malloc(sizeof(void *)); - if (!_children) { - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - Py_ssize_t _children_capacity = 1; - Py_ssize_t _n = 0; - { // lambda_param_no_default - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _loop0_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); - arg_ty lambda_param_no_default_var; - while ( - (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default - ) - { - _res = lambda_param_no_default_var; - if (_n == _children_capacity) { - _children_capacity *= 2; - void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); - if (!_new_children) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - _children = _new_children; - } - _children[_n++] = _res; - _mark = p->mark; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_95[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); - } - asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); - if (!_seq) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); - PyMem_Free(_children); - p->level--; - return _seq; -} - -// _loop0_96: lambda_param_with_default -static asdl_seq * -_loop0_96_rule(Parser *p) -{ - if (p->level++ == MAXSTACK) { - p->error_indicator = 1; - PyErr_NoMemory(); - } - if (p->error_indicator) { - p->level--; - return NULL; - } - void *_res = NULL; - int _mark = p->mark; - void **_children = PyMem_Malloc(sizeof(void *)); - if (!_children) { - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - Py_ssize_t _children_capacity = 1; - Py_ssize_t _n = 0; - { // lambda_param_with_default - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _loop0_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); - NameDefaultPair* lambda_param_with_default_var; - while ( - (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default - ) - { - _res = lambda_param_with_default_var; - if (_n == _children_capacity) { - _children_capacity *= 2; - void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); - if (!_new_children) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - _children = _new_children; - } - _children[_n++] = _res; - _mark = p->mark; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_96[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); - } - asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); - if (!_seq) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); - PyMem_Free(_children); - p->level--; - return _seq; -} - -// _loop0_97: lambda_param_with_default +// _loop0_97: lambda_param_no_default static asdl_seq * _loop0_97_rule(Parser *p) { @@ -29818,18 +30753,18 @@ _loop0_97_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // lambda_param_with_default + { // lambda_param_no_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); - NameDefaultPair* lambda_param_with_default_var; + D(fprintf(stderr, "%*c> _loop0_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; while ( - (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - _res = lambda_param_with_default_var; + _res = lambda_param_no_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -29847,7 +30782,7 @@ _loop0_97_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_97[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -29863,9 +30798,9 @@ _loop0_97_rule(Parser *p) return _seq; } -// _loop1_98: lambda_param_no_default +// _loop0_98: lambda_param_with_default static asdl_seq * -_loop1_98_rule(Parser *p) +_loop0_98_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29886,18 +30821,18 @@ _loop1_98_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // lambda_param_no_default + { // lambda_param_with_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_98[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); - arg_ty lambda_param_no_default_var; + D(fprintf(stderr, "%*c> _loop0_98[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; while ( - (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default ) { - _res = lambda_param_no_default_var; + _res = lambda_param_with_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -29914,13 +30849,8 @@ _loop1_98_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_98[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); - } - if (_n == 0 || p->error_indicator) { - PyMem_Free(_children); - p->level--; - return NULL; + D(fprintf(stderr, "%*c%s _loop0_98[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -30004,7 +30934,7 @@ _loop0_99_rule(Parser *p) return _seq; } -// _loop1_100: lambda_param_with_default +// _loop1_100: lambda_param_no_default static asdl_seq * _loop1_100_rule(Parser *p) { @@ -30027,18 +30957,18 @@ _loop1_100_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // lambda_param_with_default + { // lambda_param_no_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_100[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); - NameDefaultPair* lambda_param_with_default_var; + D(fprintf(stderr, "%*c> _loop1_100[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; while ( - (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - _res = lambda_param_with_default_var; + _res = lambda_param_no_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30056,7 +30986,7 @@ _loop1_100_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_100[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -30077,9 +31007,9 @@ _loop1_100_rule(Parser *p) return _seq; } -// _loop1_101: lambda_param_no_default +// _loop0_101: lambda_param_with_default static asdl_seq * -_loop1_101_rule(Parser *p) +_loop0_101_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -30100,18 +31030,18 @@ _loop1_101_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // lambda_param_no_default + { // lambda_param_with_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_101[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); - arg_ty lambda_param_no_default_var; + D(fprintf(stderr, "%*c> _loop0_101[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; while ( - (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default ) { - _res = lambda_param_no_default_var; + _res = lambda_param_with_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30128,13 +31058,8 @@ _loop1_101_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_101[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); - } - if (_n == 0 || p->error_indicator) { - PyMem_Free(_children); - p->level--; - return NULL; + D(fprintf(stderr, "%*c%s _loop0_101[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -30150,7 +31075,7 @@ _loop1_101_rule(Parser *p) return _seq; } -// _loop1_102: lambda_param_no_default +// _loop1_102: lambda_param_with_default static asdl_seq * _loop1_102_rule(Parser *p) { @@ -30173,18 +31098,18 @@ _loop1_102_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // lambda_param_no_default + { // lambda_param_with_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_102[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); - arg_ty lambda_param_no_default_var; + D(fprintf(stderr, "%*c> _loop1_102[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; while ( - (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default ) { - _res = lambda_param_no_default_var; + _res = lambda_param_with_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30202,7 +31127,7 @@ _loop1_102_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_102[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -30223,9 +31148,9 @@ _loop1_102_rule(Parser *p) return _seq; } -// _loop0_103: lambda_param_no_default +// _loop1_103: lambda_param_no_default static asdl_seq * -_loop0_103_rule(Parser *p) +_loop1_103_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -30251,7 +31176,7 @@ _loop0_103_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_103[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop1_103[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -30274,9 +31199,14 @@ _loop0_103_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_103[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_103[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); @@ -30291,7 +31221,7 @@ _loop0_103_rule(Parser *p) return _seq; } -// _loop1_104: lambda_param_with_default +// _loop1_104: lambda_param_no_default static asdl_seq * _loop1_104_rule(Parser *p) { @@ -30314,18 +31244,18 @@ _loop1_104_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // lambda_param_with_default + { // lambda_param_no_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); - NameDefaultPair* lambda_param_with_default_var; + D(fprintf(stderr, "%*c> _loop1_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; while ( - (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - _res = lambda_param_with_default_var; + _res = lambda_param_no_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30343,7 +31273,7 @@ _loop1_104_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_104[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -30505,7 +31435,7 @@ _loop1_106_rule(Parser *p) return _seq; } -// _loop0_107: lambda_param_maybe_default +// _loop0_107: lambda_param_no_default static asdl_seq * _loop0_107_rule(Parser *p) { @@ -30528,18 +31458,18 @@ _loop0_107_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // lambda_param_maybe_default + { // lambda_param_no_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_107[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); - NameDefaultPair* lambda_param_maybe_default_var; + D(fprintf(stderr, "%*c> _loop0_107[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; while ( - (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - _res = lambda_param_maybe_default_var; + _res = lambda_param_no_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30557,7 +31487,7 @@ _loop0_107_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_107[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -30573,7 +31503,7 @@ _loop0_107_rule(Parser *p) return _seq; } -// _loop1_108: lambda_param_maybe_default +// _loop1_108: lambda_param_with_default static asdl_seq * _loop1_108_rule(Parser *p) { @@ -30596,18 +31526,18 @@ _loop1_108_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // lambda_param_maybe_default + { // lambda_param_with_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); - NameDefaultPair* lambda_param_maybe_default_var; + D(fprintf(stderr, "%*c> _loop1_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; while ( - (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default ) { - _res = lambda_param_maybe_default_var; + _res = lambda_param_with_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30625,7 +31555,7 @@ _loop1_108_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_108[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -30646,9 +31576,9 @@ _loop1_108_rule(Parser *p) return _seq; } -// _loop1_109: STRING +// _loop0_109: lambda_param_maybe_default static asdl_seq * -_loop1_109_rule(Parser *p) +_loop0_109_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -30669,18 +31599,18 @@ _loop1_109_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // STRING + { // lambda_param_maybe_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "STRING")); - expr_ty string_var; + D(fprintf(stderr, "%*c> _loop0_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + NameDefaultPair* lambda_param_maybe_default_var; while ( - (string_var = _PyPegen_string_token(p)) // STRING + (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default ) { - _res = string_var; + _res = lambda_param_maybe_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30697,13 +31627,8 @@ _loop1_109_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_109[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "STRING")); - } - if (_n == 0 || p->error_indicator) { - PyMem_Free(_children); - p->level--; - return NULL; + D(fprintf(stderr, "%*c%s _loop0_109[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -30719,59 +31644,9 @@ _loop1_109_rule(Parser *p) return _seq; } -// _tmp_110: star_named_expression ',' star_named_expressions? -static void * -_tmp_110_rule(Parser *p) -{ - if (p->level++ == MAXSTACK) { - p->error_indicator = 1; - PyErr_NoMemory(); - } - if (p->error_indicator) { - p->level--; - return NULL; - } - void * _res = NULL; - int _mark = p->mark; - { // star_named_expression ',' star_named_expressions? - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _tmp_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); - Token * _literal; - expr_ty y; - void *z; - if ( - (y = star_named_expression_rule(p)) // star_named_expression - && - (_literal = _PyPegen_expect_token(p, 12)) // token=',' - && - (z = star_named_expressions_rule(p), !p->error_indicator) // star_named_expressions? - ) - { - D(fprintf(stderr, "%*c+ _tmp_110[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); - _res = _PyPegen_seq_insert_in_front ( p , y , z ); - if (_res == NULL && PyErr_Occurred()) { - p->error_indicator = 1; - p->level--; - return NULL; - } - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_110[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression ',' star_named_expressions?")); - } - _res = NULL; - done: - p->level--; - return _res; -} - -// _loop0_112: ',' double_starred_kvpair +// _loop1_110: lambda_param_maybe_default static asdl_seq * -_loop0_112_rule(Parser *p) +_loop1_110_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -30792,27 +31667,18 @@ _loop0_112_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // ',' double_starred_kvpair + { // lambda_param_maybe_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair")); - Token * _literal; - KeyValuePair* elem; + D(fprintf(stderr, "%*c> _loop1_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + NameDefaultPair* lambda_param_maybe_default_var; while ( - (_literal = _PyPegen_expect_token(p, 12)) // token=',' - && - (elem = double_starred_kvpair_rule(p)) // double_starred_kvpair + (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default ) { - _res = elem; - if (_res == NULL && PyErr_Occurred()) { - p->error_indicator = 1; - PyMem_Free(_children); - p->level--; - return NULL; - } + _res = lambda_param_maybe_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30829,8 +31695,13 @@ _loop0_112_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_112[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' double_starred_kvpair")); + D(fprintf(stderr, "%*c%s _loop1_110[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -30846,9 +31717,9 @@ _loop0_112_rule(Parser *p) return _seq; } -// _gather_111: double_starred_kvpair _loop0_112 -static asdl_seq * -_gather_111_rule(Parser *p) +// _tmp_111: yield_expr | star_expressions +static void * +_tmp_111_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -30858,112 +31729,55 @@ _gather_111_rule(Parser *p) p->level--; return NULL; } - asdl_seq * _res = NULL; + void * _res = NULL; int _mark = p->mark; - { // double_starred_kvpair _loop0_112 + { // yield_expr if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_112")); - KeyValuePair* elem; - asdl_seq * seq; + D(fprintf(stderr, "%*c> _tmp_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; if ( - (elem = double_starred_kvpair_rule(p)) // double_starred_kvpair - && - (seq = _loop0_112_rule(p)) // _loop0_112 + (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _gather_111[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_112")); - _res = _PyPegen_seq_insert_in_front(p, elem, seq); + D(fprintf(stderr, "%*c+ _tmp_111[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_111[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "double_starred_kvpair _loop0_112")); - } - _res = NULL; - done: - p->level--; - return _res; -} - -// _loop1_113: for_if_clause -static asdl_seq * -_loop1_113_rule(Parser *p) -{ - if (p->level++ == MAXSTACK) { - p->error_indicator = 1; - PyErr_NoMemory(); - } - if (p->error_indicator) { - p->level--; - return NULL; - } - void *_res = NULL; - int _mark = p->mark; - void **_children = PyMem_Malloc(sizeof(void *)); - if (!_children) { - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; + D(fprintf(stderr, "%*c%s _tmp_111[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } - Py_ssize_t _children_capacity = 1; - Py_ssize_t _n = 0; - { // for_if_clause + { // star_expressions if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause")); - comprehension_ty for_if_clause_var; - while ( - (for_if_clause_var = for_if_clause_rule(p)) // for_if_clause + D(fprintf(stderr, "%*c> _tmp_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - _res = for_if_clause_var; - if (_n == _children_capacity) { - _children_capacity *= 2; - void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); - if (!_new_children) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - _children = _new_children; - } - _children[_n++] = _res; - _mark = p->mark; + D(fprintf(stderr, "%*c+ _tmp_111[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_113[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "for_if_clause")); - } - if (_n == 0 || p->error_indicator) { - PyMem_Free(_children); - p->level--; - return NULL; - } - asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); - if (!_seq) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; + D(fprintf(stderr, "%*c%s _tmp_111[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } - for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); - PyMem_Free(_children); + _res = NULL; + done: p->level--; - return _seq; + return _res; } -// _loop0_114: ('if' disjunction) +// _loop0_112: fstring_format_spec static asdl_seq * -_loop0_114_rule(Parser *p) +_loop0_112_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -30984,18 +31798,18 @@ _loop0_114_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // ('if' disjunction) + { // fstring_format_spec if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_233_var; + D(fprintf(stderr, "%*c> _loop0_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_format_spec")); + expr_ty fstring_format_spec_var; while ( - (_tmp_233_var = _tmp_233_rule(p)) // 'if' disjunction + (fstring_format_spec_var = fstring_format_spec_rule(p)) // fstring_format_spec ) { - _res = _tmp_233_var; + _res = fstring_format_spec_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -31012,8 +31826,8 @@ _loop0_114_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_114[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); + D(fprintf(stderr, "%*c%s _loop0_112[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_format_spec")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -31029,9 +31843,9 @@ _loop0_114_rule(Parser *p) return _seq; } -// _loop0_115: ('if' disjunction) +// _loop1_113: (fstring | string) static asdl_seq * -_loop0_115_rule(Parser *p) +_loop1_113_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31052,18 +31866,18 @@ _loop0_115_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // ('if' disjunction) + { // (fstring | string) if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_234_var; + D(fprintf(stderr, "%*c> _loop1_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(fstring | string)")); + void *_tmp_253_var; while ( - (_tmp_234_var = _tmp_234_rule(p)) // 'if' disjunction + (_tmp_253_var = _tmp_253_rule(p)) // fstring | string ) { - _res = _tmp_234_var; + _res = _tmp_253_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -31080,8 +31894,13 @@ _loop0_115_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_115[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); + D(fprintf(stderr, "%*c%s _loop1_113[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(fstring | string)")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -31097,9 +31916,9 @@ _loop0_115_rule(Parser *p) return _seq; } -// _tmp_116: assignment_expression | expression !':=' +// _tmp_114: star_named_expression ',' star_named_expressions? static void * -_tmp_116_rule(Parser *p) +_tmp_114_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31111,45 +31930,35 @@ _tmp_116_rule(Parser *p) } void * _res = NULL; int _mark = p->mark; - { // assignment_expression - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _tmp_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "assignment_expression")); - expr_ty assignment_expression_var; - if ( - (assignment_expression_var = assignment_expression_rule(p)) // assignment_expression - ) - { - D(fprintf(stderr, "%*c+ _tmp_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "assignment_expression")); - _res = assignment_expression_var; - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_116[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "assignment_expression")); - } - { // expression !':=' + { // star_named_expression ',' star_named_expressions? if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression !':='")); - expr_ty expression_var; + D(fprintf(stderr, "%*c> _tmp_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); + Token * _literal; + expr_ty y; + void *z; if ( - (expression_var = expression_rule(p)) // expression + (y = star_named_expression_rule(p)) // star_named_expression && - _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 53) // token=':=' + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (z = star_named_expressions_rule(p), !p->error_indicator) // star_named_expressions? ) { - D(fprintf(stderr, "%*c+ _tmp_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='")); - _res = expression_var; + D(fprintf(stderr, "%*c+ _tmp_114[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); + _res = _PyPegen_seq_insert_in_front ( p , y , z ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_116[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression !':='")); + D(fprintf(stderr, "%*c%s _tmp_114[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression ',' star_named_expressions?")); } _res = NULL; done: @@ -31157,9 +31966,9 @@ _tmp_116_rule(Parser *p) return _res; } -// _loop0_118: ',' (starred_expression | (assignment_expression | expression !':=') !'=') +// _loop0_116: ',' double_starred_kvpair static asdl_seq * -_loop0_118_rule(Parser *p) +_loop0_116_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31180,18 +31989,18 @@ _loop0_118_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // ',' (starred_expression | (assignment_expression | expression !':=') !'=') + { // ',' double_starred_kvpair if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression | (assignment_expression | expression !':=') !'=')")); + D(fprintf(stderr, "%*c> _loop0_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair")); Token * _literal; - void *elem; + KeyValuePair* elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_235_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'=' + (elem = double_starred_kvpair_rule(p)) // double_starred_kvpair ) { _res = elem; @@ -31217,8 +32026,8 @@ _loop0_118_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_118[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression | (assignment_expression | expression !':=') !'=')")); + D(fprintf(stderr, "%*c%s _loop0_116[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' double_starred_kvpair")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -31234,10 +32043,9 @@ _loop0_118_rule(Parser *p) return _seq; } -// _gather_117: -// | (starred_expression | (assignment_expression | expression !':=') !'=') _loop0_118 +// _gather_115: double_starred_kvpair _loop0_116 static asdl_seq * -_gather_117_rule(Parser *p) +_gather_115_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31249,27 +32057,27 @@ _gather_117_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (starred_expression | (assignment_expression | expression !':=') !'=') _loop0_118 + { // double_starred_kvpair _loop0_116 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_118")); - void *elem; + D(fprintf(stderr, "%*c> _gather_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_116")); + KeyValuePair* elem; asdl_seq * seq; if ( - (elem = _tmp_235_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'=' + (elem = double_starred_kvpair_rule(p)) // double_starred_kvpair && - (seq = _loop0_118_rule(p)) // _loop0_118 + (seq = _loop0_116_rule(p)) // _loop0_116 ) { - D(fprintf(stderr, "%*c+ _gather_117[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_118")); + D(fprintf(stderr, "%*c+ _gather_115[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_116")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_117[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_118")); + D(fprintf(stderr, "%*c%s _gather_115[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "double_starred_kvpair _loop0_116")); } _res = NULL; done: @@ -31277,9 +32085,9 @@ _gather_117_rule(Parser *p) return _res; } -// _tmp_119: ',' kwargs -static void * -_tmp_119_rule(Parser *p) +// _loop1_117: for_if_clause +static asdl_seq * +_loop1_117_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31289,44 +32097,70 @@ _tmp_119_rule(Parser *p) p->level--; return NULL; } - void * _res = NULL; + void *_res = NULL; int _mark = p->mark; - { // ',' kwargs + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + Py_ssize_t _children_capacity = 1; + Py_ssize_t _n = 0; + { // for_if_clause if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwargs")); - Token * _literal; - asdl_seq* k; - if ( - (_literal = _PyPegen_expect_token(p, 12)) // token=',' - && - (k = kwargs_rule(p)) // kwargs + D(fprintf(stderr, "%*c> _loop1_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause")); + comprehension_ty for_if_clause_var; + while ( + (for_if_clause_var = for_if_clause_rule(p)) // for_if_clause ) { - D(fprintf(stderr, "%*c+ _tmp_119[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' kwargs")); - _res = k; - if (_res == NULL && PyErr_Occurred()) { - p->error_indicator = 1; - p->level--; - return NULL; + _res = for_if_clause_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + _children = _new_children; } - goto done; + _children[_n++] = _res; + _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_119[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwargs")); + D(fprintf(stderr, "%*c%s _loop1_117[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "for_if_clause")); } - _res = NULL; - done: + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); p->level--; - return _res; + return _seq; } -// _loop0_121: ',' kwarg_or_starred +// _loop0_118: ('if' disjunction) static asdl_seq * -_loop0_121_rule(Parser *p) +_loop0_118_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31347,27 +32181,18 @@ _loop0_121_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // ',' kwarg_or_starred + { // ('if' disjunction) if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); - Token * _literal; - KeywordOrStarred* elem; + D(fprintf(stderr, "%*c> _loop0_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); + void *_tmp_254_var; while ( - (_literal = _PyPegen_expect_token(p, 12)) // token=',' - && - (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred + (_tmp_254_var = _tmp_254_rule(p)) // 'if' disjunction ) { - _res = elem; - if (_res == NULL && PyErr_Occurred()) { - p->error_indicator = 1; - PyMem_Free(_children); - p->level--; - return NULL; - } + _res = _tmp_254_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -31384,8 +32209,8 @@ _loop0_121_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_121[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_starred")); + D(fprintf(stderr, "%*c%s _loop0_118[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -31401,9 +32226,9 @@ _loop0_121_rule(Parser *p) return _seq; } -// _gather_120: kwarg_or_starred _loop0_121 +// _loop0_119: ('if' disjunction) static asdl_seq * -_gather_120_rule(Parser *p) +_loop0_119_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31413,29 +32238,115 @@ _gather_120_rule(Parser *p) p->level--; return NULL; } - asdl_seq * _res = NULL; + void *_res = NULL; int _mark = p->mark; - { // kwarg_or_starred _loop0_121 + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + Py_ssize_t _children_capacity = 1; + Py_ssize_t _n = 0; + { // ('if' disjunction) if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_121")); - KeywordOrStarred* elem; - asdl_seq * seq; + D(fprintf(stderr, "%*c> _loop0_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); + void *_tmp_255_var; + while ( + (_tmp_255_var = _tmp_255_rule(p)) // 'if' disjunction + ) + { + _res = _tmp_255_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_119[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + p->level--; + return _seq; +} + +// _tmp_120: assignment_expression | expression !':=' +static void * +_tmp_120_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // assignment_expression + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "assignment_expression")); + expr_ty assignment_expression_var; if ( - (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred + (assignment_expression_var = assignment_expression_rule(p)) // assignment_expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_120[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "assignment_expression")); + _res = assignment_expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_120[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "assignment_expression")); + } + { // expression !':=' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression !':='")); + expr_ty expression_var; + if ( + (expression_var = expression_rule(p)) // expression && - (seq = _loop0_121_rule(p)) // _loop0_121 + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 53) // token=':=' ) { - D(fprintf(stderr, "%*c+ _gather_120[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_121")); - _res = _PyPegen_seq_insert_in_front(p, elem, seq); + D(fprintf(stderr, "%*c+ _tmp_120[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='")); + _res = expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_120[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_121")); + D(fprintf(stderr, "%*c%s _tmp_120[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression !':='")); } _res = NULL; done: @@ -31443,9 +32354,9 @@ _gather_120_rule(Parser *p) return _res; } -// _loop0_123: ',' kwarg_or_double_starred +// _loop0_122: ',' (starred_expression | (assignment_expression | expression !':=') !'=') static asdl_seq * -_loop0_123_rule(Parser *p) +_loop0_122_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31466,18 +32377,18 @@ _loop0_123_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // ',' kwarg_or_double_starred + { // ',' (starred_expression | (assignment_expression | expression !':=') !'=') if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); + D(fprintf(stderr, "%*c> _loop0_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression | (assignment_expression | expression !':=') !'=')")); Token * _literal; - KeywordOrStarred* elem; + void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred + (elem = _tmp_256_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'=' ) { _res = elem; @@ -31503,8 +32414,8 @@ _loop0_123_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_123[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred")); + D(fprintf(stderr, "%*c%s _loop0_122[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression | (assignment_expression | expression !':=') !'=')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -31520,9 +32431,10 @@ _loop0_123_rule(Parser *p) return _seq; } -// _gather_122: kwarg_or_double_starred _loop0_123 +// _gather_121: +// | (starred_expression | (assignment_expression | expression !':=') !'=') _loop0_122 static asdl_seq * -_gather_122_rule(Parser *p) +_gather_121_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31534,27 +32446,74 @@ _gather_122_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // kwarg_or_double_starred _loop0_123 + { // (starred_expression | (assignment_expression | expression !':=') !'=') _loop0_122 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_123")); - KeywordOrStarred* elem; + D(fprintf(stderr, "%*c> _gather_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_122")); + void *elem; asdl_seq * seq; if ( - (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred + (elem = _tmp_256_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'=' && - (seq = _loop0_123_rule(p)) // _loop0_123 + (seq = _loop0_122_rule(p)) // _loop0_122 ) { - D(fprintf(stderr, "%*c+ _gather_122[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_123")); + D(fprintf(stderr, "%*c+ _gather_121[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_122")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_122[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_123")); + D(fprintf(stderr, "%*c%s _gather_121[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_122")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_123: ',' kwargs +static void * +_tmp_123_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ',' kwargs + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwargs")); + Token * _literal; + asdl_seq* k; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (k = kwargs_rule(p)) // kwargs + ) + { + D(fprintf(stderr, "%*c+ _tmp_123[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' kwargs")); + _res = k; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_123[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwargs")); } _res = NULL; done: @@ -31800,9 +32759,247 @@ _gather_126_rule(Parser *p) return _res; } -// _loop0_128: (',' star_target) +// _loop0_129: ',' kwarg_or_starred static asdl_seq * -_loop0_128_rule(Parser *p) +_loop0_129_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + Py_ssize_t _children_capacity = 1; + Py_ssize_t _n = 0; + { // ',' kwarg_or_starred + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); + Token * _literal; + KeywordOrStarred* elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + p->level--; + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_129[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_starred")); + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + p->level--; + return _seq; +} + +// _gather_128: kwarg_or_starred _loop0_129 +static asdl_seq * +_gather_128_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // kwarg_or_starred _loop0_129 + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _gather_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_129")); + KeywordOrStarred* elem; + asdl_seq * seq; + if ( + (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred + && + (seq = _loop0_129_rule(p)) // _loop0_129 + ) + { + D(fprintf(stderr, "%*c+ _gather_128[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_129")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_128[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_129")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _loop0_131: ',' kwarg_or_double_starred +static asdl_seq * +_loop0_131_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + Py_ssize_t _children_capacity = 1; + Py_ssize_t _n = 0; + { // ',' kwarg_or_double_starred + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); + Token * _literal; + KeywordOrStarred* elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + p->level--; + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_131[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred")); + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + p->level--; + return _seq; +} + +// _gather_130: kwarg_or_double_starred _loop0_131 +static asdl_seq * +_gather_130_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // kwarg_or_double_starred _loop0_131 + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _gather_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_131")); + KeywordOrStarred* elem; + asdl_seq * seq; + if ( + (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred + && + (seq = _loop0_131_rule(p)) // _loop0_131 + ) + { + D(fprintf(stderr, "%*c+ _gather_130[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_131")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_130[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_131")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _loop0_132: (',' star_target) +static asdl_seq * +_loop0_132_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31828,13 +33025,13 @@ _loop0_128_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_236_var; + D(fprintf(stderr, "%*c> _loop0_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); + void *_tmp_257_var; while ( - (_tmp_236_var = _tmp_236_rule(p)) // ',' star_target + (_tmp_257_var = _tmp_257_rule(p)) // ',' star_target ) { - _res = _tmp_236_var; + _res = _tmp_257_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -31851,7 +33048,7 @@ _loop0_128_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_128[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_132[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_target)")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -31868,9 +33065,9 @@ _loop0_128_rule(Parser *p) return _seq; } -// _loop0_130: ',' star_target +// _loop0_134: ',' star_target static asdl_seq * -_loop0_130_rule(Parser *p) +_loop0_134_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31896,7 +33093,7 @@ _loop0_130_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _loop0_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty elem; while ( @@ -31928,7 +33125,7 @@ _loop0_130_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_130[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_134[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -31945,9 +33142,9 @@ _loop0_130_rule(Parser *p) return _seq; } -// _gather_129: star_target _loop0_130 +// _gather_133: star_target _loop0_134 static asdl_seq * -_gather_129_rule(Parser *p) +_gather_133_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31959,27 +33156,27 @@ _gather_129_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // star_target _loop0_130 + { // star_target _loop0_134 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target _loop0_130")); + D(fprintf(stderr, "%*c> _gather_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target _loop0_134")); expr_ty elem; asdl_seq * seq; if ( (elem = star_target_rule(p)) // star_target && - (seq = _loop0_130_rule(p)) // _loop0_130 + (seq = _loop0_134_rule(p)) // _loop0_134 ) { - D(fprintf(stderr, "%*c+ _gather_129[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target _loop0_130")); + D(fprintf(stderr, "%*c+ _gather_133[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target _loop0_134")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_129[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target _loop0_130")); + D(fprintf(stderr, "%*c%s _gather_133[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target _loop0_134")); } _res = NULL; done: @@ -31987,9 +33184,9 @@ _gather_129_rule(Parser *p) return _res; } -// _loop1_131: (',' star_target) +// _loop1_135: (',' star_target) static asdl_seq * -_loop1_131_rule(Parser *p) +_loop1_135_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32015,13 +33212,13 @@ _loop1_131_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_237_var; + D(fprintf(stderr, "%*c> _loop1_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); + void *_tmp_258_var; while ( - (_tmp_237_var = _tmp_237_rule(p)) // ',' star_target + (_tmp_258_var = _tmp_258_rule(p)) // ',' star_target ) { - _res = _tmp_237_var; + _res = _tmp_258_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -32038,7 +33235,7 @@ _loop1_131_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_131[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_135[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_target)")); } if (_n == 0 || p->error_indicator) { @@ -32060,9 +33257,9 @@ _loop1_131_rule(Parser *p) return _seq; } -// _tmp_132: !'*' star_target +// _tmp_136: !'*' star_target static void * -_tmp_132_rule(Parser *p) +_tmp_136_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32079,7 +33276,7 @@ _tmp_132_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); + D(fprintf(stderr, "%*c> _tmp_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); expr_ty star_target_var; if ( _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 16) // token='*' @@ -32087,12 +33284,12 @@ _tmp_132_rule(Parser *p) (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); + D(fprintf(stderr, "%*c+ _tmp_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); _res = star_target_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_136[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "!'*' star_target")); } _res = NULL; @@ -32101,9 +33298,9 @@ _tmp_132_rule(Parser *p) return _res; } -// _loop0_134: ',' del_target +// _loop0_138: ',' del_target static asdl_seq * -_loop0_134_rule(Parser *p) +_loop0_138_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32129,7 +33326,7 @@ _loop0_134_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' del_target")); + D(fprintf(stderr, "%*c> _loop0_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' del_target")); Token * _literal; expr_ty elem; while ( @@ -32161,7 +33358,7 @@ _loop0_134_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_134[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_138[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' del_target")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -32178,9 +33375,9 @@ _loop0_134_rule(Parser *p) return _seq; } -// _gather_133: del_target _loop0_134 +// _gather_137: del_target _loop0_138 static asdl_seq * -_gather_133_rule(Parser *p) +_gather_137_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32192,27 +33389,27 @@ _gather_133_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // del_target _loop0_134 + { // del_target _loop0_138 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "del_target _loop0_134")); + D(fprintf(stderr, "%*c> _gather_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "del_target _loop0_138")); expr_ty elem; asdl_seq * seq; if ( (elem = del_target_rule(p)) // del_target && - (seq = _loop0_134_rule(p)) // _loop0_134 + (seq = _loop0_138_rule(p)) // _loop0_138 ) { - D(fprintf(stderr, "%*c+ _gather_133[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "del_target _loop0_134")); + D(fprintf(stderr, "%*c+ _gather_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "del_target _loop0_138")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_133[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "del_target _loop0_134")); + D(fprintf(stderr, "%*c%s _gather_137[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "del_target _loop0_138")); } _res = NULL; done: @@ -32220,9 +33417,9 @@ _gather_133_rule(Parser *p) return _res; } -// _loop0_136: ',' expression +// _loop0_140: ',' expression static asdl_seq * -_loop0_136_rule(Parser *p) +_loop0_140_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32248,7 +33445,7 @@ _loop0_136_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _loop0_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty elem; while ( @@ -32280,7 +33477,7 @@ _loop0_136_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_136[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_140[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -32297,9 +33494,9 @@ _loop0_136_rule(Parser *p) return _seq; } -// _gather_135: expression _loop0_136 +// _gather_139: expression _loop0_140 static asdl_seq * -_gather_135_rule(Parser *p) +_gather_139_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32311,27 +33508,27 @@ _gather_135_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // expression _loop0_136 + { // expression _loop0_140 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_136")); + D(fprintf(stderr, "%*c> _gather_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_140")); expr_ty elem; asdl_seq * seq; if ( (elem = expression_rule(p)) // expression && - (seq = _loop0_136_rule(p)) // _loop0_136 + (seq = _loop0_140_rule(p)) // _loop0_140 ) { - D(fprintf(stderr, "%*c+ _gather_135[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_136")); + D(fprintf(stderr, "%*c+ _gather_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_140")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_135[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_136")); + D(fprintf(stderr, "%*c%s _gather_139[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_140")); } _res = NULL; done: @@ -32339,9 +33536,9 @@ _gather_135_rule(Parser *p) return _res; } -// _loop0_138: ',' expression +// _loop0_142: ',' expression static asdl_seq * -_loop0_138_rule(Parser *p) +_loop0_142_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32367,7 +33564,7 @@ _loop0_138_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _loop0_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty elem; while ( @@ -32399,7 +33596,7 @@ _loop0_138_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_138[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_142[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -32416,9 +33613,9 @@ _loop0_138_rule(Parser *p) return _seq; } -// _gather_137: expression _loop0_138 +// _gather_141: expression _loop0_142 static asdl_seq * -_gather_137_rule(Parser *p) +_gather_141_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32430,27 +33627,27 @@ _gather_137_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // expression _loop0_138 + { // expression _loop0_142 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_138")); + D(fprintf(stderr, "%*c> _gather_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_142")); expr_ty elem; asdl_seq * seq; if ( (elem = expression_rule(p)) // expression && - (seq = _loop0_138_rule(p)) // _loop0_138 + (seq = _loop0_142_rule(p)) // _loop0_142 ) { - D(fprintf(stderr, "%*c+ _gather_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_138")); + D(fprintf(stderr, "%*c+ _gather_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_142")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_137[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_138")); + D(fprintf(stderr, "%*c%s _gather_141[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_142")); } _res = NULL; done: @@ -32458,9 +33655,9 @@ _gather_137_rule(Parser *p) return _res; } -// _loop0_140: ',' expression +// _loop0_144: ',' expression static asdl_seq * -_loop0_140_rule(Parser *p) +_loop0_144_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32486,7 +33683,7 @@ _loop0_140_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _loop0_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty elem; while ( @@ -32518,7 +33715,7 @@ _loop0_140_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_140[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_144[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -32535,9 +33732,9 @@ _loop0_140_rule(Parser *p) return _seq; } -// _gather_139: expression _loop0_140 +// _gather_143: expression _loop0_144 static asdl_seq * -_gather_139_rule(Parser *p) +_gather_143_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32549,27 +33746,27 @@ _gather_139_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // expression _loop0_140 + { // expression _loop0_144 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_140")); + D(fprintf(stderr, "%*c> _gather_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_144")); expr_ty elem; asdl_seq * seq; if ( (elem = expression_rule(p)) // expression && - (seq = _loop0_140_rule(p)) // _loop0_140 + (seq = _loop0_144_rule(p)) // _loop0_144 ) { - D(fprintf(stderr, "%*c+ _gather_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_140")); + D(fprintf(stderr, "%*c+ _gather_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_144")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_139[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_140")); + D(fprintf(stderr, "%*c%s _gather_143[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_144")); } _res = NULL; done: @@ -32577,9 +33774,9 @@ _gather_139_rule(Parser *p) return _res; } -// _loop0_142: ',' expression +// _loop0_146: ',' expression static asdl_seq * -_loop0_142_rule(Parser *p) +_loop0_146_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32605,7 +33802,7 @@ _loop0_142_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _loop0_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty elem; while ( @@ -32637,7 +33834,7 @@ _loop0_142_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_142[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_146[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -32654,9 +33851,9 @@ _loop0_142_rule(Parser *p) return _seq; } -// _gather_141: expression _loop0_142 +// _gather_145: expression _loop0_146 static asdl_seq * -_gather_141_rule(Parser *p) +_gather_145_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32668,27 +33865,27 @@ _gather_141_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // expression _loop0_142 + { // expression _loop0_146 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_142")); + D(fprintf(stderr, "%*c> _gather_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_146")); expr_ty elem; asdl_seq * seq; if ( (elem = expression_rule(p)) // expression && - (seq = _loop0_142_rule(p)) // _loop0_142 + (seq = _loop0_146_rule(p)) // _loop0_146 ) { - D(fprintf(stderr, "%*c+ _gather_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_142")); + D(fprintf(stderr, "%*c+ _gather_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_146")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_141[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_142")); + D(fprintf(stderr, "%*c%s _gather_145[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_146")); } _res = NULL; done: @@ -32696,9 +33893,9 @@ _gather_141_rule(Parser *p) return _res; } -// _tmp_143: NEWLINE INDENT +// _tmp_147: NEWLINE INDENT static void * -_tmp_143_rule(Parser *p) +_tmp_147_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32715,7 +33912,7 @@ _tmp_143_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT")); + D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT")); Token * indent_var; Token * newline_var; if ( @@ -32724,12 +33921,12 @@ _tmp_143_rule(Parser *p) (indent_var = _PyPegen_expect_token(p, INDENT)) // token='INDENT' ) { - D(fprintf(stderr, "%*c+ _tmp_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT")); + D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT")); _res = _PyPegen_dummy_name(p, newline_var, indent_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_143[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE INDENT")); } _res = NULL; @@ -32738,9 +33935,9 @@ _tmp_143_rule(Parser *p) return _res; } -// _tmp_144: args | expression for_if_clauses +// _tmp_148: args | expression for_if_clauses static void * -_tmp_144_rule(Parser *p) +_tmp_148_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32757,18 +33954,18 @@ _tmp_144_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args")); + D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args")); expr_ty args_var; if ( (args_var = args_rule(p)) // args ) { - D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args")); + D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args")); _res = args_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args")); } { // expression for_if_clauses @@ -32776,7 +33973,7 @@ _tmp_144_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); + D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); expr_ty expression_var; asdl_comprehension_seq* for_if_clauses_var; if ( @@ -32785,12 +33982,12 @@ _tmp_144_rule(Parser *p) (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses ) { - D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); + D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); _res = _PyPegen_dummy_name(p, expression_var, for_if_clauses_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression for_if_clauses")); } _res = NULL; @@ -32799,9 +33996,9 @@ _tmp_144_rule(Parser *p) return _res; } -// _tmp_145: args ',' +// _tmp_149: args ',' static void * -_tmp_145_rule(Parser *p) +_tmp_149_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32818,7 +34015,7 @@ _tmp_145_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ','")); + D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ','")); Token * _literal; expr_ty args_var; if ( @@ -32827,12 +34024,12 @@ _tmp_145_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ','")); + D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ','")); _res = _PyPegen_dummy_name(p, args_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args ','")); } _res = NULL; @@ -32841,9 +34038,9 @@ _tmp_145_rule(Parser *p) return _res; } -// _tmp_146: ',' | ')' +// _tmp_150: ',' | ')' static void * -_tmp_146_rule(Parser *p) +_tmp_150_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32860,18 +34057,18 @@ _tmp_146_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // ')' @@ -32879,18 +34076,18 @@ _tmp_146_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } _res = NULL; @@ -32899,9 +34096,9 @@ _tmp_146_rule(Parser *p) return _res; } -// _tmp_147: 'True' | 'False' | 'None' +// _tmp_151: 'True' | 'False' | 'None' static void * -_tmp_147_rule(Parser *p) +_tmp_151_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32918,18 +34115,18 @@ _tmp_147_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); + D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 600)) // token='True' + (_keyword = _PyPegen_expect_token(p, 601)) // token='True' ) { - D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); + D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'True'")); } { // 'False' @@ -32937,18 +34134,18 @@ _tmp_147_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); + D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 602)) // token='False' + (_keyword = _PyPegen_expect_token(p, 603)) // token='False' ) { - D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); + D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'False'")); } { // 'None' @@ -32956,18 +34153,18 @@ _tmp_147_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); + D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 601)) // token='None' + (_keyword = _PyPegen_expect_token(p, 602)) // token='None' ) { - D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); + D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'None'")); } _res = NULL; @@ -32976,9 +34173,9 @@ _tmp_147_rule(Parser *p) return _res; } -// _tmp_148: NAME '=' +// _tmp_152: NAME '=' static void * -_tmp_148_rule(Parser *p) +_tmp_152_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32995,7 +34192,7 @@ _tmp_148_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME '='")); + D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME '='")); Token * _literal; expr_ty name_var; if ( @@ -33004,12 +34201,12 @@ _tmp_148_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME '='")); + D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME '='")); _res = _PyPegen_dummy_name(p, name_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME '='")); } _res = NULL; @@ -33018,9 +34215,9 @@ _tmp_148_rule(Parser *p) return _res; } -// _tmp_149: NAME STRING | SOFT_KEYWORD +// _tmp_153: NAME STRING | SOFT_KEYWORD static void * -_tmp_149_rule(Parser *p) +_tmp_153_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33037,7 +34234,7 @@ _tmp_149_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME STRING")); + D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME STRING")); expr_ty name_var; expr_ty string_var; if ( @@ -33046,12 +34243,12 @@ _tmp_149_rule(Parser *p) (string_var = _PyPegen_string_token(p)) // STRING ) { - D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME STRING")); + D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME STRING")); _res = _PyPegen_dummy_name(p, name_var, string_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME STRING")); } { // SOFT_KEYWORD @@ -33059,18 +34256,18 @@ _tmp_149_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "SOFT_KEYWORD")); + D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "SOFT_KEYWORD")); expr_ty soft_keyword_var; if ( (soft_keyword_var = _PyPegen_soft_keyword_token(p)) // SOFT_KEYWORD ) { - D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "SOFT_KEYWORD")); + D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "SOFT_KEYWORD")); _res = soft_keyword_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "SOFT_KEYWORD")); } _res = NULL; @@ -33079,9 +34276,9 @@ _tmp_149_rule(Parser *p) return _res; } -// _tmp_150: 'else' | ':' +// _tmp_154: 'else' | ':' static void * -_tmp_150_rule(Parser *p) +_tmp_154_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33098,18 +34295,18 @@ _tmp_150_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'else'")); + D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'else'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 644)) // token='else' + (_keyword = _PyPegen_expect_token(p, 645)) // token='else' ) { - D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'else'")); + D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'else'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'else'")); } { // ':' @@ -33117,18 +34314,18 @@ _tmp_150_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } _res = NULL; @@ -33137,9 +34334,67 @@ _tmp_150_rule(Parser *p) return _res; } -// _tmp_151: '=' | ':=' +// _tmp_155: FSTRING_MIDDLE | fstring_replacement_field static void * -_tmp_151_rule(Parser *p) +_tmp_155_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // FSTRING_MIDDLE + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "FSTRING_MIDDLE")); + Token * fstring_middle_var; + if ( + (fstring_middle_var = _PyPegen_expect_token(p, FSTRING_MIDDLE)) // token='FSTRING_MIDDLE' + ) + { + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "FSTRING_MIDDLE")); + _res = fstring_middle_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "FSTRING_MIDDLE")); + } + { // fstring_replacement_field + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_replacement_field")); + expr_ty fstring_replacement_field_var; + if ( + (fstring_replacement_field_var = fstring_replacement_field_rule(p)) // fstring_replacement_field + ) + { + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "fstring_replacement_field")); + _res = fstring_replacement_field_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_replacement_field")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_156: '=' | ':=' +static void * +_tmp_156_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33156,18 +34411,18 @@ _tmp_151_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='")); } { // ':=' @@ -33175,18 +34430,18 @@ _tmp_151_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='")); + D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 53)) // token=':=' ) { - D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='")); + D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':='")); } _res = NULL; @@ -33195,9 +34450,9 @@ _tmp_151_rule(Parser *p) return _res; } -// _tmp_152: list | tuple | genexp | 'True' | 'None' | 'False' +// _tmp_157: list | tuple | genexp | 'True' | 'None' | 'False' static void * -_tmp_152_rule(Parser *p) +_tmp_157_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33214,18 +34469,18 @@ _tmp_152_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); expr_ty list_var; if ( (list_var = list_rule(p)) // list ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); _res = list_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "list")); } { // tuple @@ -33233,18 +34488,18 @@ _tmp_152_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); expr_ty tuple_var; if ( (tuple_var = tuple_rule(p)) // tuple ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); _res = tuple_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tuple")); } { // genexp @@ -33252,18 +34507,18 @@ _tmp_152_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); expr_ty genexp_var; if ( (genexp_var = genexp_rule(p)) // genexp ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); _res = genexp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "genexp")); } { // 'True' @@ -33271,18 +34526,18 @@ _tmp_152_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 600)) // token='True' + (_keyword = _PyPegen_expect_token(p, 601)) // token='True' ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'True'")); } { // 'None' @@ -33290,18 +34545,18 @@ _tmp_152_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 601)) // token='None' + (_keyword = _PyPegen_expect_token(p, 602)) // token='None' ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'None'")); } { // 'False' @@ -33309,18 +34564,18 @@ _tmp_152_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 602)) // token='False' + (_keyword = _PyPegen_expect_token(p, 603)) // token='False' ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'False'")); } _res = NULL; @@ -33329,9 +34584,9 @@ _tmp_152_rule(Parser *p) return _res; } -// _tmp_153: '=' | ':=' +// _tmp_158: '=' | ':=' static void * -_tmp_153_rule(Parser *p) +_tmp_158_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33348,18 +34603,18 @@ _tmp_153_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='")); } { // ':=' @@ -33367,18 +34622,18 @@ _tmp_153_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='")); + D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 53)) // token=':=' ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='")); + D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':='")); } _res = NULL; @@ -33387,9 +34642,9 @@ _tmp_153_rule(Parser *p) return _res; } -// _loop0_154: star_named_expressions +// _loop0_159: star_named_expressions static asdl_seq * -_loop0_154_rule(Parser *p) +_loop0_159_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33415,7 +34670,7 @@ _loop0_154_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expressions")); + D(fprintf(stderr, "%*c> _loop0_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expressions")); asdl_expr_seq* star_named_expressions_var; while ( (star_named_expressions_var = star_named_expressions_rule(p)) // star_named_expressions @@ -33438,7 +34693,7 @@ _loop0_154_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_159[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expressions")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -33455,9 +34710,9 @@ _loop0_154_rule(Parser *p) return _seq; } -// _loop0_155: (star_targets '=') +// _loop0_160: (star_targets '=') static asdl_seq * -_loop0_155_rule(Parser *p) +_loop0_160_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33483,13 +34738,13 @@ _loop0_155_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_238_var; + D(fprintf(stderr, "%*c> _loop0_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_259_var; while ( - (_tmp_238_var = _tmp_238_rule(p)) // star_targets '=' + (_tmp_259_var = _tmp_259_rule(p)) // star_targets '=' ) { - _res = _tmp_238_var; + _res = _tmp_259_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -33506,7 +34761,7 @@ _loop0_155_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_155[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_160[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -33523,9 +34778,9 @@ _loop0_155_rule(Parser *p) return _seq; } -// _loop0_156: (star_targets '=') +// _loop0_161: (star_targets '=') static asdl_seq * -_loop0_156_rule(Parser *p) +_loop0_161_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33551,13 +34806,13 @@ _loop0_156_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_239_var; + D(fprintf(stderr, "%*c> _loop0_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_260_var; while ( - (_tmp_239_var = _tmp_239_rule(p)) // star_targets '=' + (_tmp_260_var = _tmp_260_rule(p)) // star_targets '=' ) { - _res = _tmp_239_var; + _res = _tmp_260_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -33574,7 +34829,7 @@ _loop0_156_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_156[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_161[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -33591,9 +34846,9 @@ _loop0_156_rule(Parser *p) return _seq; } -// _tmp_157: yield_expr | star_expressions +// _tmp_162: yield_expr | star_expressions static void * -_tmp_157_rule(Parser *p) +_tmp_162_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33610,18 +34865,18 @@ _tmp_157_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_162[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -33629,18 +34884,18 @@ _tmp_157_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_162[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -33649,9 +34904,9 @@ _tmp_157_rule(Parser *p) return _res; } -// _tmp_158: '[' | '(' | '{' +// _tmp_163: '[' | '(' | '{' static void * -_tmp_158_rule(Parser *p) +_tmp_163_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33668,18 +34923,18 @@ _tmp_158_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 9)) // token='[' ) { - D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_163[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); } { // '(' @@ -33687,18 +34942,18 @@ _tmp_158_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' ) { - D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_163[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('")); } { // '{' @@ -33706,18 +34961,18 @@ _tmp_158_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' ) { - D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_163[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'")); } _res = NULL; @@ -33726,9 +34981,9 @@ _tmp_158_rule(Parser *p) return _res; } -// _tmp_159: '[' | '{' +// _tmp_164: '[' | '{' static void * -_tmp_159_rule(Parser *p) +_tmp_164_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33745,18 +35000,18 @@ _tmp_159_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 9)) // token='[' ) { - D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); } { // '{' @@ -33764,18 +35019,18 @@ _tmp_159_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' ) { - D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'")); } _res = NULL; @@ -33784,9 +35039,9 @@ _tmp_159_rule(Parser *p) return _res; } -// _tmp_160: '[' | '{' +// _tmp_165: '[' | '{' static void * -_tmp_160_rule(Parser *p) +_tmp_165_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33803,18 +35058,18 @@ _tmp_160_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c> _tmp_165[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 9)) // token='[' ) { - D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c+ _tmp_165[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_165[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); } { // '{' @@ -33822,18 +35077,18 @@ _tmp_160_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c> _tmp_165[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' ) { - D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c+ _tmp_165[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_165[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'")); } _res = NULL; @@ -33842,9 +35097,9 @@ _tmp_160_rule(Parser *p) return _res; } -// _tmp_161: slash_no_default | slash_with_default +// _tmp_166: slash_no_default | slash_with_default static void * -_tmp_161_rule(Parser *p) +_tmp_166_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33861,18 +35116,18 @@ _tmp_161_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default")); + D(fprintf(stderr, "%*c> _tmp_166[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default")); asdl_arg_seq* slash_no_default_var; if ( (slash_no_default_var = slash_no_default_rule(p)) // slash_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_no_default")); + D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_no_default")); _res = slash_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_161[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_166[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_no_default")); } { // slash_with_default @@ -33880,18 +35135,18 @@ _tmp_161_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_166[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); SlashWithDefault* slash_with_default_var; if ( (slash_with_default_var = slash_with_default_rule(p)) // slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); _res = slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_161[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_166[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_with_default")); } _res = NULL; @@ -33900,9 +35155,9 @@ _tmp_161_rule(Parser *p) return _res; } -// _loop0_162: param_maybe_default +// _loop0_167: param_maybe_default static asdl_seq * -_loop0_162_rule(Parser *p) +_loop0_167_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33928,7 +35183,7 @@ _loop0_162_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_167[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -33951,7 +35206,7 @@ _loop0_162_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_162[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_167[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -33968,9 +35223,9 @@ _loop0_162_rule(Parser *p) return _seq; } -// _loop0_163: param_no_default +// _loop0_168: param_no_default static asdl_seq * -_loop0_163_rule(Parser *p) +_loop0_168_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33996,7 +35251,7 @@ _loop0_163_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_168[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -34019,7 +35274,7 @@ _loop0_163_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_163[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_168[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -34036,9 +35291,9 @@ _loop0_163_rule(Parser *p) return _seq; } -// _loop0_164: param_no_default +// _loop0_169: param_no_default static asdl_seq * -_loop0_164_rule(Parser *p) +_loop0_169_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34064,7 +35319,7 @@ _loop0_164_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_169[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -34087,7 +35342,7 @@ _loop0_164_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_164[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_169[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -34104,9 +35359,9 @@ _loop0_164_rule(Parser *p) return _seq; } -// _loop1_165: param_no_default +// _loop1_170: param_no_default static asdl_seq * -_loop1_165_rule(Parser *p) +_loop1_170_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34132,7 +35387,7 @@ _loop1_165_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_165[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop1_170[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -34155,7 +35410,7 @@ _loop1_165_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_165[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_170[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -34177,9 +35432,9 @@ _loop1_165_rule(Parser *p) return _seq; } -// _tmp_166: slash_no_default | slash_with_default +// _tmp_171: slash_no_default | slash_with_default static void * -_tmp_166_rule(Parser *p) +_tmp_171_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34196,18 +35451,18 @@ _tmp_166_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_166[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default")); + D(fprintf(stderr, "%*c> _tmp_171[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default")); asdl_arg_seq* slash_no_default_var; if ( (slash_no_default_var = slash_no_default_rule(p)) // slash_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_no_default")); + D(fprintf(stderr, "%*c+ _tmp_171[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_no_default")); _res = slash_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_166[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_171[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_no_default")); } { // slash_with_default @@ -34215,18 +35470,18 @@ _tmp_166_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_166[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_171[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); SlashWithDefault* slash_with_default_var; if ( (slash_with_default_var = slash_with_default_rule(p)) // slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_171[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); _res = slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_166[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_171[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_with_default")); } _res = NULL; @@ -34235,9 +35490,9 @@ _tmp_166_rule(Parser *p) return _res; } -// _loop0_167: param_maybe_default +// _loop0_172: param_maybe_default static asdl_seq * -_loop0_167_rule(Parser *p) +_loop0_172_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34263,7 +35518,7 @@ _loop0_167_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_167[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_172[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -34286,7 +35541,7 @@ _loop0_167_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_167[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_172[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -34303,9 +35558,9 @@ _loop0_167_rule(Parser *p) return _seq; } -// _tmp_168: ',' | param_no_default +// _tmp_173: ',' | param_no_default static void * -_tmp_168_rule(Parser *p) +_tmp_173_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34322,18 +35577,18 @@ _tmp_168_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_168[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_168[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_173[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_168[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // param_no_default @@ -34341,18 +35596,18 @@ _tmp_168_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_168[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _tmp_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; if ( (param_no_default_var = param_no_default_rule(p)) // param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_168[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_173[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); _res = param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_168[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } _res = NULL; @@ -34361,9 +35616,9 @@ _tmp_168_rule(Parser *p) return _res; } -// _loop0_169: param_maybe_default +// _loop0_174: param_maybe_default static asdl_seq * -_loop0_169_rule(Parser *p) +_loop0_174_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34389,7 +35644,7 @@ _loop0_169_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_169[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_174[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -34412,7 +35667,7 @@ _loop0_169_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_169[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_174[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -34429,9 +35684,9 @@ _loop0_169_rule(Parser *p) return _seq; } -// _loop1_170: param_maybe_default +// _loop1_175: param_maybe_default static asdl_seq * -_loop1_170_rule(Parser *p) +_loop1_175_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34457,7 +35712,7 @@ _loop1_170_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_170[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop1_175[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -34480,7 +35735,7 @@ _loop1_170_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_170[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_175[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } if (_n == 0 || p->error_indicator) { @@ -34502,9 +35757,9 @@ _loop1_170_rule(Parser *p) return _seq; } -// _tmp_171: ')' | ',' +// _tmp_176: ')' | ',' static void * -_tmp_171_rule(Parser *p) +_tmp_176_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34521,18 +35776,18 @@ _tmp_171_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_171[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_176[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_171[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_176[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_171[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_176[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // ',' @@ -34540,18 +35795,18 @@ _tmp_171_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_171[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_176[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_171[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_176[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_171[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_176[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -34560,9 +35815,9 @@ _tmp_171_rule(Parser *p) return _res; } -// _tmp_172: ')' | ',' (')' | '**') +// _tmp_177: ')' | ',' (')' | '**') static void * -_tmp_172_rule(Parser *p) +_tmp_177_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34579,18 +35834,18 @@ _tmp_172_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_172[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_177[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_172[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_177[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_172[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_177[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // ',' (')' | '**') @@ -34598,21 +35853,21 @@ _tmp_172_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_172[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + D(fprintf(stderr, "%*c> _tmp_177[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); Token * _literal; - void *_tmp_240_var; + void *_tmp_261_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_240_var = _tmp_240_rule(p)) // ')' | '**' + (_tmp_261_var = _tmp_261_rule(p)) // ')' | '**' ) { - D(fprintf(stderr, "%*c+ _tmp_172[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_240_var); + D(fprintf(stderr, "%*c+ _tmp_177[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_261_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_172[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_177[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (')' | '**')")); } _res = NULL; @@ -34621,9 +35876,9 @@ _tmp_172_rule(Parser *p) return _res; } -// _tmp_173: param_no_default | ',' +// _tmp_178: param_no_default | ',' static void * -_tmp_173_rule(Parser *p) +_tmp_178_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34640,18 +35895,18 @@ _tmp_173_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _tmp_178[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; if ( (param_no_default_var = param_no_default_rule(p)) // param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_173[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_178[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); _res = param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_178[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } { // ',' @@ -34659,18 +35914,18 @@ _tmp_173_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_178[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_173[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_178[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_178[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -34679,9 +35934,9 @@ _tmp_173_rule(Parser *p) return _res; } -// _loop0_174: param_maybe_default +// _loop0_179: param_maybe_default static asdl_seq * -_loop0_174_rule(Parser *p) +_loop0_179_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34707,7 +35962,7 @@ _loop0_174_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_174[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_179[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -34730,7 +35985,7 @@ _loop0_174_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_174[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_179[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -34747,9 +36002,9 @@ _loop0_174_rule(Parser *p) return _seq; } -// _tmp_175: param_no_default | ',' +// _tmp_180: param_no_default | ',' static void * -_tmp_175_rule(Parser *p) +_tmp_180_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34766,18 +36021,18 @@ _tmp_175_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_175[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _tmp_180[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; if ( (param_no_default_var = param_no_default_rule(p)) // param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_175[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_180[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); _res = param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_175[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_180[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } { // ',' @@ -34785,18 +36040,18 @@ _tmp_175_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_175[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_180[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_175[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_180[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_175[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_180[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -34805,9 +36060,9 @@ _tmp_175_rule(Parser *p) return _res; } -// _tmp_176: '*' | '**' | '/' +// _tmp_181: '*' | '**' | '/' static void * -_tmp_176_rule(Parser *p) +_tmp_181_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34824,18 +36079,18 @@ _tmp_176_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_176[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); + D(fprintf(stderr, "%*c> _tmp_181[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' ) { - D(fprintf(stderr, "%*c+ _tmp_176[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); + D(fprintf(stderr, "%*c+ _tmp_181[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_176[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_181[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*'")); } { // '**' @@ -34843,18 +36098,18 @@ _tmp_176_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_176[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_181[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_176[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_181[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_176[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_181[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } { // '/' @@ -34862,18 +36117,18 @@ _tmp_176_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_176[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'")); + D(fprintf(stderr, "%*c> _tmp_181[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 17)) // token='/' ) { - D(fprintf(stderr, "%*c+ _tmp_176[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'")); + D(fprintf(stderr, "%*c+ _tmp_181[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_176[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_181[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'/'")); } _res = NULL; @@ -34882,9 +36137,9 @@ _tmp_176_rule(Parser *p) return _res; } -// _loop1_177: param_with_default +// _loop1_182: param_with_default static asdl_seq * -_loop1_177_rule(Parser *p) +_loop1_182_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34910,7 +36165,7 @@ _loop1_177_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_177[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop1_182[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -34933,7 +36188,7 @@ _loop1_177_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_177[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_182[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -34955,9 +36210,9 @@ _loop1_177_rule(Parser *p) return _seq; } -// _tmp_178: lambda_slash_no_default | lambda_slash_with_default +// _tmp_183: lambda_slash_no_default | lambda_slash_with_default static void * -_tmp_178_rule(Parser *p) +_tmp_183_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34974,18 +36229,18 @@ _tmp_178_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_178[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); + D(fprintf(stderr, "%*c> _tmp_183[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); asdl_arg_seq* lambda_slash_no_default_var; if ( (lambda_slash_no_default_var = lambda_slash_no_default_rule(p)) // lambda_slash_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_178[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); + D(fprintf(stderr, "%*c+ _tmp_183[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); _res = lambda_slash_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_178[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_183[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_no_default")); } { // lambda_slash_with_default @@ -34993,18 +36248,18 @@ _tmp_178_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_178[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_183[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); SlashWithDefault* lambda_slash_with_default_var; if ( (lambda_slash_with_default_var = lambda_slash_with_default_rule(p)) // lambda_slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_178[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_183[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); _res = lambda_slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_178[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_183[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_with_default")); } _res = NULL; @@ -35013,9 +36268,9 @@ _tmp_178_rule(Parser *p) return _res; } -// _loop0_179: lambda_param_maybe_default +// _loop0_184: lambda_param_maybe_default static asdl_seq * -_loop0_179_rule(Parser *p) +_loop0_184_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35041,7 +36296,7 @@ _loop0_179_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_179[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_184[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -35064,7 +36319,7 @@ _loop0_179_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_179[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_184[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35081,9 +36336,9 @@ _loop0_179_rule(Parser *p) return _seq; } -// _loop0_180: lambda_param_no_default +// _loop0_185: lambda_param_no_default static asdl_seq * -_loop0_180_rule(Parser *p) +_loop0_185_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35109,7 +36364,7 @@ _loop0_180_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_180[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop0_185[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -35132,7 +36387,7 @@ _loop0_180_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_180[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_185[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35149,9 +36404,9 @@ _loop0_180_rule(Parser *p) return _seq; } -// _loop0_181: lambda_param_no_default +// _loop0_186: lambda_param_no_default static asdl_seq * -_loop0_181_rule(Parser *p) +_loop0_186_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35177,7 +36432,7 @@ _loop0_181_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_181[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop0_186[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -35200,7 +36455,7 @@ _loop0_181_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_181[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_186[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35217,9 +36472,9 @@ _loop0_181_rule(Parser *p) return _seq; } -// _loop0_183: ',' lambda_param +// _loop0_188: ',' lambda_param static asdl_seq * -_loop0_183_rule(Parser *p) +_loop0_188_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35245,7 +36500,7 @@ _loop0_183_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_183[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' lambda_param")); + D(fprintf(stderr, "%*c> _loop0_188[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' lambda_param")); Token * _literal; arg_ty elem; while ( @@ -35277,7 +36532,7 @@ _loop0_183_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_183[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_188[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' lambda_param")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35294,9 +36549,9 @@ _loop0_183_rule(Parser *p) return _seq; } -// _gather_182: lambda_param _loop0_183 +// _gather_187: lambda_param _loop0_188 static asdl_seq * -_gather_182_rule(Parser *p) +_gather_187_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35308,27 +36563,27 @@ _gather_182_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // lambda_param _loop0_183 + { // lambda_param _loop0_188 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_182[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_183")); + D(fprintf(stderr, "%*c> _gather_187[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_188")); arg_ty elem; asdl_seq * seq; if ( (elem = lambda_param_rule(p)) // lambda_param && - (seq = _loop0_183_rule(p)) // _loop0_183 + (seq = _loop0_188_rule(p)) // _loop0_188 ) { - D(fprintf(stderr, "%*c+ _gather_182[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_183")); + D(fprintf(stderr, "%*c+ _gather_187[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_188")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_182[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param _loop0_183")); + D(fprintf(stderr, "%*c%s _gather_187[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param _loop0_188")); } _res = NULL; done: @@ -35336,9 +36591,9 @@ _gather_182_rule(Parser *p) return _res; } -// _tmp_184: lambda_slash_no_default | lambda_slash_with_default +// _tmp_189: lambda_slash_no_default | lambda_slash_with_default static void * -_tmp_184_rule(Parser *p) +_tmp_189_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35355,18 +36610,18 @@ _tmp_184_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_184[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); + D(fprintf(stderr, "%*c> _tmp_189[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); asdl_arg_seq* lambda_slash_no_default_var; if ( (lambda_slash_no_default_var = lambda_slash_no_default_rule(p)) // lambda_slash_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_184[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); + D(fprintf(stderr, "%*c+ _tmp_189[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); _res = lambda_slash_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_184[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_189[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_no_default")); } { // lambda_slash_with_default @@ -35374,18 +36629,18 @@ _tmp_184_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_184[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_189[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); SlashWithDefault* lambda_slash_with_default_var; if ( (lambda_slash_with_default_var = lambda_slash_with_default_rule(p)) // lambda_slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_184[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_189[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); _res = lambda_slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_184[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_189[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_with_default")); } _res = NULL; @@ -35394,9 +36649,9 @@ _tmp_184_rule(Parser *p) return _res; } -// _loop0_185: lambda_param_maybe_default +// _loop0_190: lambda_param_maybe_default static asdl_seq * -_loop0_185_rule(Parser *p) +_loop0_190_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35422,7 +36677,7 @@ _loop0_185_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_185[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_190[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -35445,7 +36700,7 @@ _loop0_185_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_185[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_190[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35462,9 +36717,9 @@ _loop0_185_rule(Parser *p) return _seq; } -// _tmp_186: ',' | lambda_param_no_default +// _tmp_191: ',' | lambda_param_no_default static void * -_tmp_186_rule(Parser *p) +_tmp_191_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35481,18 +36736,18 @@ _tmp_186_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_186[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_191[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_186[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_191[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_186[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_191[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // lambda_param_no_default @@ -35500,18 +36755,18 @@ _tmp_186_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_186[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _tmp_191[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; if ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_186[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_191[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); _res = lambda_param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_186[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_191[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } _res = NULL; @@ -35520,9 +36775,9 @@ _tmp_186_rule(Parser *p) return _res; } -// _loop0_187: lambda_param_maybe_default +// _loop0_192: lambda_param_maybe_default static asdl_seq * -_loop0_187_rule(Parser *p) +_loop0_192_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35548,7 +36803,7 @@ _loop0_187_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_187[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_192[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -35571,7 +36826,7 @@ _loop0_187_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_187[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_192[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35588,9 +36843,9 @@ _loop0_187_rule(Parser *p) return _seq; } -// _loop1_188: lambda_param_maybe_default +// _loop1_193: lambda_param_maybe_default static asdl_seq * -_loop1_188_rule(Parser *p) +_loop1_193_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35616,7 +36871,7 @@ _loop1_188_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_188[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop1_193[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -35639,7 +36894,7 @@ _loop1_188_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_188[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_193[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } if (_n == 0 || p->error_indicator) { @@ -35661,9 +36916,9 @@ _loop1_188_rule(Parser *p) return _seq; } -// _loop1_189: lambda_param_with_default +// _loop1_194: lambda_param_with_default static asdl_seq * -_loop1_189_rule(Parser *p) +_loop1_194_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35689,7 +36944,7 @@ _loop1_189_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_189[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop1_194[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -35712,7 +36967,7 @@ _loop1_189_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_189[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_194[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -35734,9 +36989,9 @@ _loop1_189_rule(Parser *p) return _seq; } -// _tmp_190: ':' | ',' (':' | '**') +// _tmp_195: ':' | ',' (':' | '**') static void * -_tmp_190_rule(Parser *p) +_tmp_195_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35753,18 +37008,18 @@ _tmp_190_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_190[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_195[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_190[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_195[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_190[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_195[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // ',' (':' | '**') @@ -35772,21 +37027,21 @@ _tmp_190_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_190[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + D(fprintf(stderr, "%*c> _tmp_195[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); Token * _literal; - void *_tmp_241_var; + void *_tmp_262_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_241_var = _tmp_241_rule(p)) // ':' | '**' + (_tmp_262_var = _tmp_262_rule(p)) // ':' | '**' ) { - D(fprintf(stderr, "%*c+ _tmp_190[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_241_var); + D(fprintf(stderr, "%*c+ _tmp_195[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_262_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_190[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_195[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (':' | '**')")); } _res = NULL; @@ -35795,9 +37050,9 @@ _tmp_190_rule(Parser *p) return _res; } -// _tmp_191: lambda_param_no_default | ',' +// _tmp_196: lambda_param_no_default | ',' static void * -_tmp_191_rule(Parser *p) +_tmp_196_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35814,18 +37069,18 @@ _tmp_191_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_191[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _tmp_196[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; if ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_191[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_196[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); _res = lambda_param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_191[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_196[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } { // ',' @@ -35833,18 +37088,18 @@ _tmp_191_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_191[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_196[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_191[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_196[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_191[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_196[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -35853,9 +37108,9 @@ _tmp_191_rule(Parser *p) return _res; } -// _loop0_192: lambda_param_maybe_default +// _loop0_197: lambda_param_maybe_default static asdl_seq * -_loop0_192_rule(Parser *p) +_loop0_197_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35881,7 +37136,7 @@ _loop0_192_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_192[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_197[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -35904,7 +37159,7 @@ _loop0_192_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_192[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_197[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35921,9 +37176,9 @@ _loop0_192_rule(Parser *p) return _seq; } -// _tmp_193: lambda_param_no_default | ',' +// _tmp_198: lambda_param_no_default | ',' static void * -_tmp_193_rule(Parser *p) +_tmp_198_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35940,18 +37195,18 @@ _tmp_193_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_193[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _tmp_198[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; if ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_193[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_198[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); _res = lambda_param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_193[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_198[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } { // ',' @@ -35959,18 +37214,18 @@ _tmp_193_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_193[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_198[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_193[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_198[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_193[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_198[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -35979,9 +37234,9 @@ _tmp_193_rule(Parser *p) return _res; } -// _tmp_194: '*' | '**' | '/' +// _tmp_199: '*' | '**' | '/' static void * -_tmp_194_rule(Parser *p) +_tmp_199_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35998,18 +37253,18 @@ _tmp_194_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_194[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); + D(fprintf(stderr, "%*c> _tmp_199[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' ) { - D(fprintf(stderr, "%*c+ _tmp_194[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); + D(fprintf(stderr, "%*c+ _tmp_199[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_194[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_199[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*'")); } { // '**' @@ -36017,18 +37272,18 @@ _tmp_194_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_194[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_199[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_194[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_199[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_194[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_199[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } { // '/' @@ -36036,18 +37291,18 @@ _tmp_194_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_194[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'")); + D(fprintf(stderr, "%*c> _tmp_199[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 17)) // token='/' ) { - D(fprintf(stderr, "%*c+ _tmp_194[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'")); + D(fprintf(stderr, "%*c+ _tmp_199[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_194[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_199[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'/'")); } _res = NULL; @@ -36056,9 +37311,9 @@ _tmp_194_rule(Parser *p) return _res; } -// _tmp_195: ',' | ')' | ':' +// _tmp_200: ',' | ')' | ':' static void * -_tmp_195_rule(Parser *p) +_tmp_200_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36075,18 +37330,18 @@ _tmp_195_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_195[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_200[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_195[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_200[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_195[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_200[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // ')' @@ -36094,18 +37349,18 @@ _tmp_195_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_195[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_200[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_195[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_200[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_195[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_200[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // ':' @@ -36113,18 +37368,18 @@ _tmp_195_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_195[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_200[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_195[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_200[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_195[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_200[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } _res = NULL; @@ -36133,9 +37388,9 @@ _tmp_195_rule(Parser *p) return _res; } -// _loop0_197: ',' (expression ['as' star_target]) +// _loop0_202: ',' (expression ['as' star_target]) static asdl_seq * -_loop0_197_rule(Parser *p) +_loop0_202_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36161,13 +37416,13 @@ _loop0_197_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_197[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expression ['as' star_target])")); + D(fprintf(stderr, "%*c> _loop0_202[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expression ['as' star_target])")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_242_rule(p)) // expression ['as' star_target] + (elem = _tmp_263_rule(p)) // expression ['as' star_target] ) { _res = elem; @@ -36193,7 +37448,7 @@ _loop0_197_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_197[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_202[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expression ['as' star_target])")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36210,9 +37465,9 @@ _loop0_197_rule(Parser *p) return _seq; } -// _gather_196: (expression ['as' star_target]) _loop0_197 +// _gather_201: (expression ['as' star_target]) _loop0_202 static asdl_seq * -_gather_196_rule(Parser *p) +_gather_201_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36224,27 +37479,27 @@ _gather_196_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (expression ['as' star_target]) _loop0_197 + { // (expression ['as' star_target]) _loop0_202 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_196[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_197")); + D(fprintf(stderr, "%*c> _gather_201[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_202")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_242_rule(p)) // expression ['as' star_target] + (elem = _tmp_263_rule(p)) // expression ['as' star_target] && - (seq = _loop0_197_rule(p)) // _loop0_197 + (seq = _loop0_202_rule(p)) // _loop0_202 ) { - D(fprintf(stderr, "%*c+ _gather_196[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_197")); + D(fprintf(stderr, "%*c+ _gather_201[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_202")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_196[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expression ['as' star_target]) _loop0_197")); + D(fprintf(stderr, "%*c%s _gather_201[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expression ['as' star_target]) _loop0_202")); } _res = NULL; done: @@ -36252,9 +37507,9 @@ _gather_196_rule(Parser *p) return _res; } -// _loop0_199: ',' (expressions ['as' star_target]) +// _loop0_204: ',' (expressions ['as' star_target]) static asdl_seq * -_loop0_199_rule(Parser *p) +_loop0_204_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36280,13 +37535,13 @@ _loop0_199_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_199[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expressions ['as' star_target])")); + D(fprintf(stderr, "%*c> _loop0_204[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expressions ['as' star_target])")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_243_rule(p)) // expressions ['as' star_target] + (elem = _tmp_264_rule(p)) // expressions ['as' star_target] ) { _res = elem; @@ -36312,7 +37567,7 @@ _loop0_199_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_199[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_204[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expressions ['as' star_target])")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36329,9 +37584,9 @@ _loop0_199_rule(Parser *p) return _seq; } -// _gather_198: (expressions ['as' star_target]) _loop0_199 +// _gather_203: (expressions ['as' star_target]) _loop0_204 static asdl_seq * -_gather_198_rule(Parser *p) +_gather_203_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36343,27 +37598,27 @@ _gather_198_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (expressions ['as' star_target]) _loop0_199 + { // (expressions ['as' star_target]) _loop0_204 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_198[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_199")); + D(fprintf(stderr, "%*c> _gather_203[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_204")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_243_rule(p)) // expressions ['as' star_target] + (elem = _tmp_264_rule(p)) // expressions ['as' star_target] && - (seq = _loop0_199_rule(p)) // _loop0_199 + (seq = _loop0_204_rule(p)) // _loop0_204 ) { - D(fprintf(stderr, "%*c+ _gather_198[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_199")); + D(fprintf(stderr, "%*c+ _gather_203[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_204")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_198[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expressions ['as' star_target]) _loop0_199")); + D(fprintf(stderr, "%*c%s _gather_203[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expressions ['as' star_target]) _loop0_204")); } _res = NULL; done: @@ -36371,9 +37626,9 @@ _gather_198_rule(Parser *p) return _res; } -// _loop0_201: ',' (expression ['as' star_target]) +// _loop0_206: ',' (expression ['as' star_target]) static asdl_seq * -_loop0_201_rule(Parser *p) +_loop0_206_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36399,13 +37654,13 @@ _loop0_201_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_201[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expression ['as' star_target])")); + D(fprintf(stderr, "%*c> _loop0_206[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expression ['as' star_target])")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_244_rule(p)) // expression ['as' star_target] + (elem = _tmp_265_rule(p)) // expression ['as' star_target] ) { _res = elem; @@ -36431,7 +37686,7 @@ _loop0_201_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_201[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_206[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expression ['as' star_target])")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36448,9 +37703,9 @@ _loop0_201_rule(Parser *p) return _seq; } -// _gather_200: (expression ['as' star_target]) _loop0_201 +// _gather_205: (expression ['as' star_target]) _loop0_206 static asdl_seq * -_gather_200_rule(Parser *p) +_gather_205_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36462,27 +37717,27 @@ _gather_200_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (expression ['as' star_target]) _loop0_201 + { // (expression ['as' star_target]) _loop0_206 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_200[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_201")); + D(fprintf(stderr, "%*c> _gather_205[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_206")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_244_rule(p)) // expression ['as' star_target] + (elem = _tmp_265_rule(p)) // expression ['as' star_target] && - (seq = _loop0_201_rule(p)) // _loop0_201 + (seq = _loop0_206_rule(p)) // _loop0_206 ) { - D(fprintf(stderr, "%*c+ _gather_200[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_201")); + D(fprintf(stderr, "%*c+ _gather_205[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_206")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_200[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expression ['as' star_target]) _loop0_201")); + D(fprintf(stderr, "%*c%s _gather_205[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expression ['as' star_target]) _loop0_206")); } _res = NULL; done: @@ -36490,9 +37745,9 @@ _gather_200_rule(Parser *p) return _res; } -// _loop0_203: ',' (expressions ['as' star_target]) +// _loop0_208: ',' (expressions ['as' star_target]) static asdl_seq * -_loop0_203_rule(Parser *p) +_loop0_208_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36518,13 +37773,13 @@ _loop0_203_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_203[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expressions ['as' star_target])")); + D(fprintf(stderr, "%*c> _loop0_208[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expressions ['as' star_target])")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_245_rule(p)) // expressions ['as' star_target] + (elem = _tmp_266_rule(p)) // expressions ['as' star_target] ) { _res = elem; @@ -36550,7 +37805,7 @@ _loop0_203_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_203[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_208[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expressions ['as' star_target])")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36567,9 +37822,9 @@ _loop0_203_rule(Parser *p) return _seq; } -// _gather_202: (expressions ['as' star_target]) _loop0_203 +// _gather_207: (expressions ['as' star_target]) _loop0_208 static asdl_seq * -_gather_202_rule(Parser *p) +_gather_207_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36581,27 +37836,27 @@ _gather_202_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (expressions ['as' star_target]) _loop0_203 + { // (expressions ['as' star_target]) _loop0_208 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_202[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_203")); + D(fprintf(stderr, "%*c> _gather_207[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_208")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_245_rule(p)) // expressions ['as' star_target] + (elem = _tmp_266_rule(p)) // expressions ['as' star_target] && - (seq = _loop0_203_rule(p)) // _loop0_203 + (seq = _loop0_208_rule(p)) // _loop0_208 ) { - D(fprintf(stderr, "%*c+ _gather_202[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_203")); + D(fprintf(stderr, "%*c+ _gather_207[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_208")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_202[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expressions ['as' star_target]) _loop0_203")); + D(fprintf(stderr, "%*c%s _gather_207[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expressions ['as' star_target]) _loop0_208")); } _res = NULL; done: @@ -36609,9 +37864,9 @@ _gather_202_rule(Parser *p) return _res; } -// _tmp_204: 'except' | 'finally' +// _tmp_209: 'except' | 'finally' static void * -_tmp_204_rule(Parser *p) +_tmp_209_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36628,18 +37883,18 @@ _tmp_204_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_204[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except'")); + D(fprintf(stderr, "%*c> _tmp_209[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 636)) // token='except' + (_keyword = _PyPegen_expect_token(p, 637)) // token='except' ) { - D(fprintf(stderr, "%*c+ _tmp_204[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except'")); + D(fprintf(stderr, "%*c+ _tmp_209[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_204[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_209[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except'")); } { // 'finally' @@ -36647,18 +37902,18 @@ _tmp_204_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_204[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'finally'")); + D(fprintf(stderr, "%*c> _tmp_209[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'finally'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 632)) // token='finally' + (_keyword = _PyPegen_expect_token(p, 633)) // token='finally' ) { - D(fprintf(stderr, "%*c+ _tmp_204[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'finally'")); + D(fprintf(stderr, "%*c+ _tmp_209[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'finally'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_204[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_209[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'finally'")); } _res = NULL; @@ -36667,9 +37922,9 @@ _tmp_204_rule(Parser *p) return _res; } -// _loop0_205: block +// _loop0_210: block static asdl_seq * -_loop0_205_rule(Parser *p) +_loop0_210_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36695,7 +37950,7 @@ _loop0_205_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_205[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "block")); + D(fprintf(stderr, "%*c> _loop0_210[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "block")); asdl_stmt_seq* block_var; while ( (block_var = block_rule(p)) // block @@ -36718,7 +37973,7 @@ _loop0_205_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_205[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_210[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "block")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36735,9 +37990,9 @@ _loop0_205_rule(Parser *p) return _seq; } -// _loop1_206: except_block +// _loop1_211: except_block static asdl_seq * -_loop1_206_rule(Parser *p) +_loop1_211_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36763,7 +38018,7 @@ _loop1_206_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_206[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_block")); + D(fprintf(stderr, "%*c> _loop1_211[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_block")); excepthandler_ty except_block_var; while ( (except_block_var = except_block_rule(p)) // except_block @@ -36786,7 +38041,7 @@ _loop1_206_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_206[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_211[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_block")); } if (_n == 0 || p->error_indicator) { @@ -36808,9 +38063,9 @@ _loop1_206_rule(Parser *p) return _seq; } -// _tmp_207: 'as' NAME +// _tmp_212: 'as' NAME static void * -_tmp_207_rule(Parser *p) +_tmp_212_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36827,21 +38082,21 @@ _tmp_207_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_207[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_212[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_207[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_212[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_207[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_212[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -36850,9 +38105,9 @@ _tmp_207_rule(Parser *p) return _res; } -// _loop0_208: block +// _loop0_213: block static asdl_seq * -_loop0_208_rule(Parser *p) +_loop0_213_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36878,7 +38133,7 @@ _loop0_208_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_208[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "block")); + D(fprintf(stderr, "%*c> _loop0_213[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "block")); asdl_stmt_seq* block_var; while ( (block_var = block_rule(p)) // block @@ -36901,7 +38156,7 @@ _loop0_208_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_208[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_213[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "block")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36918,9 +38173,9 @@ _loop0_208_rule(Parser *p) return _seq; } -// _loop1_209: except_star_block +// _loop1_214: except_star_block static asdl_seq * -_loop1_209_rule(Parser *p) +_loop1_214_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36946,7 +38201,7 @@ _loop1_209_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_209[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_star_block")); + D(fprintf(stderr, "%*c> _loop1_214[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_star_block")); excepthandler_ty except_star_block_var; while ( (except_star_block_var = except_star_block_rule(p)) // except_star_block @@ -36969,7 +38224,7 @@ _loop1_209_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_209[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_214[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_star_block")); } if (_n == 0 || p->error_indicator) { @@ -36991,9 +38246,9 @@ _loop1_209_rule(Parser *p) return _seq; } -// _tmp_210: expression ['as' NAME] +// _tmp_215: expression ['as' NAME] static void * -_tmp_210_rule(Parser *p) +_tmp_215_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37010,22 +38265,22 @@ _tmp_210_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_210[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]")); + D(fprintf(stderr, "%*c> _tmp_215[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expression_var; if ( (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_246_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var = _tmp_267_rule(p), !p->error_indicator) // ['as' NAME] ) { - D(fprintf(stderr, "%*c+ _tmp_210[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]")); + D(fprintf(stderr, "%*c+ _tmp_215[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]")); _res = _PyPegen_dummy_name(p, expression_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_210[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_215[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ['as' NAME]")); } _res = NULL; @@ -37034,9 +38289,9 @@ _tmp_210_rule(Parser *p) return _res; } -// _tmp_211: 'as' NAME +// _tmp_216: 'as' NAME static void * -_tmp_211_rule(Parser *p) +_tmp_216_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37053,21 +38308,21 @@ _tmp_211_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_211[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_216[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_211[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_216[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_211[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_216[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -37076,9 +38331,9 @@ _tmp_211_rule(Parser *p) return _res; } -// _tmp_212: 'as' NAME +// _tmp_217: 'as' NAME static void * -_tmp_212_rule(Parser *p) +_tmp_217_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37095,21 +38350,21 @@ _tmp_212_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_212[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_217[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_212[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_217[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_212[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_217[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -37118,9 +38373,9 @@ _tmp_212_rule(Parser *p) return _res; } -// _tmp_213: NEWLINE | ':' +// _tmp_218: NEWLINE | ':' static void * -_tmp_213_rule(Parser *p) +_tmp_218_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37137,18 +38392,18 @@ _tmp_213_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_213[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + D(fprintf(stderr, "%*c> _tmp_218[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); Token * newline_var; if ( (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_213[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_218[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); _res = newline_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_213[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_218[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); } { // ':' @@ -37156,18 +38411,18 @@ _tmp_213_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_213[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_218[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_213[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_218[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_213[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_218[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } _res = NULL; @@ -37176,9 +38431,9 @@ _tmp_213_rule(Parser *p) return _res; } -// _tmp_214: 'as' NAME +// _tmp_219: 'as' NAME static void * -_tmp_214_rule(Parser *p) +_tmp_219_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37195,21 +38450,21 @@ _tmp_214_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_214[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_219[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_214[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_219[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_214[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_219[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -37218,9 +38473,9 @@ _tmp_214_rule(Parser *p) return _res; } -// _tmp_215: 'as' NAME +// _tmp_220: 'as' NAME static void * -_tmp_215_rule(Parser *p) +_tmp_220_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37237,21 +38492,21 @@ _tmp_215_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_215[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_220[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_215[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_220[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_215[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_220[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -37260,9 +38515,9 @@ _tmp_215_rule(Parser *p) return _res; } -// _tmp_216: positional_patterns ',' +// _tmp_221: positional_patterns ',' static void * -_tmp_216_rule(Parser *p) +_tmp_221_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37279,7 +38534,7 @@ _tmp_216_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_216[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "positional_patterns ','")); + D(fprintf(stderr, "%*c> _tmp_221[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "positional_patterns ','")); Token * _literal; asdl_pattern_seq* positional_patterns_var; if ( @@ -37288,12 +38543,12 @@ _tmp_216_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_216[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "positional_patterns ','")); + D(fprintf(stderr, "%*c+ _tmp_221[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "positional_patterns ','")); _res = _PyPegen_dummy_name(p, positional_patterns_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_216[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_221[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "positional_patterns ','")); } _res = NULL; @@ -37302,9 +38557,9 @@ _tmp_216_rule(Parser *p) return _res; } -// _tmp_217: '->' expression +// _tmp_222: '->' expression static void * -_tmp_217_rule(Parser *p) +_tmp_222_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37321,7 +38576,7 @@ _tmp_217_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_217[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c> _tmp_222[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); Token * _literal; expr_ty expression_var; if ( @@ -37330,12 +38585,12 @@ _tmp_217_rule(Parser *p) (expression_var = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_217[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c+ _tmp_222[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); _res = _PyPegen_dummy_name(p, _literal, expression_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_217[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_222[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'->' expression")); } _res = NULL; @@ -37344,9 +38599,9 @@ _tmp_217_rule(Parser *p) return _res; } -// _tmp_218: '(' arguments? ')' +// _tmp_223: '(' arguments? ')' static void * -_tmp_218_rule(Parser *p) +_tmp_223_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37363,7 +38618,7 @@ _tmp_218_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_218[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c> _tmp_223[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); Token * _literal; Token * _literal_1; void *_opt_var; @@ -37376,12 +38631,12 @@ _tmp_218_rule(Parser *p) (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_218[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c+ _tmp_223[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); _res = _PyPegen_dummy_name(p, _literal, _opt_var, _literal_1); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_218[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_223[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' arguments? ')'")); } _res = NULL; @@ -37390,9 +38645,9 @@ _tmp_218_rule(Parser *p) return _res; } -// _tmp_219: '(' arguments? ')' +// _tmp_224: '(' arguments? ')' static void * -_tmp_219_rule(Parser *p) +_tmp_224_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37409,7 +38664,7 @@ _tmp_219_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_219[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c> _tmp_224[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); Token * _literal; Token * _literal_1; void *_opt_var; @@ -37422,12 +38677,12 @@ _tmp_219_rule(Parser *p) (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_219[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c+ _tmp_224[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); _res = _PyPegen_dummy_name(p, _literal, _opt_var, _literal_1); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_219[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_224[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' arguments? ')'")); } _res = NULL; @@ -37436,9 +38691,9 @@ _tmp_219_rule(Parser *p) return _res; } -// _loop0_221: ',' double_starred_kvpair +// _loop0_226: ',' double_starred_kvpair static asdl_seq * -_loop0_221_rule(Parser *p) +_loop0_226_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37464,7 +38719,7 @@ _loop0_221_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_221[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair")); + D(fprintf(stderr, "%*c> _loop0_226[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair")); Token * _literal; KeyValuePair* elem; while ( @@ -37496,7 +38751,7 @@ _loop0_221_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_221[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_226[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' double_starred_kvpair")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -37513,9 +38768,9 @@ _loop0_221_rule(Parser *p) return _seq; } -// _gather_220: double_starred_kvpair _loop0_221 +// _gather_225: double_starred_kvpair _loop0_226 static asdl_seq * -_gather_220_rule(Parser *p) +_gather_225_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37527,27 +38782,27 @@ _gather_220_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // double_starred_kvpair _loop0_221 + { // double_starred_kvpair _loop0_226 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_220[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_221")); + D(fprintf(stderr, "%*c> _gather_225[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_226")); KeyValuePair* elem; asdl_seq * seq; if ( (elem = double_starred_kvpair_rule(p)) // double_starred_kvpair && - (seq = _loop0_221_rule(p)) // _loop0_221 + (seq = _loop0_226_rule(p)) // _loop0_226 ) { - D(fprintf(stderr, "%*c+ _gather_220[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_221")); + D(fprintf(stderr, "%*c+ _gather_225[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_226")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_220[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "double_starred_kvpair _loop0_221")); + D(fprintf(stderr, "%*c%s _gather_225[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "double_starred_kvpair _loop0_226")); } _res = NULL; done: @@ -37555,9 +38810,9 @@ _gather_220_rule(Parser *p) return _res; } -// _tmp_222: '}' | ',' +// _tmp_227: '}' | ',' static void * -_tmp_222_rule(Parser *p) +_tmp_227_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37574,18 +38829,18 @@ _tmp_222_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_222[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c> _tmp_227[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ _tmp_222[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c+ _tmp_227[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_222[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_227[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); } { // ',' @@ -37593,18 +38848,18 @@ _tmp_222_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_222[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_227[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_222[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_227[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_222[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_227[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -37613,9 +38868,9 @@ _tmp_222_rule(Parser *p) return _res; } -// _tmp_223: '}' | ',' +// _tmp_228: '}' | ',' static void * -_tmp_223_rule(Parser *p) +_tmp_228_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37632,18 +38887,18 @@ _tmp_223_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_223[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c> _tmp_228[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ _tmp_223[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c+ _tmp_228[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_223[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_228[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); } { // ',' @@ -37651,18 +38906,18 @@ _tmp_223_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_223[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_228[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_223[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_228[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_223[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_228[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -37671,9 +38926,898 @@ _tmp_223_rule(Parser *p) return _res; } -// _tmp_224: star_targets '=' +// _tmp_229: yield_expr | star_expressions static void * -_tmp_224_rule(Parser *p) +_tmp_229_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_229[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_229[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_229[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_229[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_229[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_229[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_230: yield_expr | star_expressions +static void * +_tmp_230_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_230[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_230[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_230[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_230[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_230[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_230[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_231: '=' | '!' | ':' | '}' +static void * +_tmp_231_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '=' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_231[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ _tmp_231[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_231[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='")); + } + { // '!' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_231[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 54)) // token='!' + ) + { + D(fprintf(stderr, "%*c+ _tmp_231[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_231[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!'")); + } + { // ':' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_231[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ _tmp_231[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_231[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); + } + { // '}' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_231[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ _tmp_231[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_231[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_232: yield_expr | star_expressions +static void * +_tmp_232_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_232[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_232[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_232[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_232[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_232[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_232[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_233: '!' | ':' | '}' +static void * +_tmp_233_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '!' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_233[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 54)) // token='!' + ) + { + D(fprintf(stderr, "%*c+ _tmp_233[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_233[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!'")); + } + { // ':' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_233[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ _tmp_233[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_233[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); + } + { // '}' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_233[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ _tmp_233[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_233[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_234: yield_expr | star_expressions +static void * +_tmp_234_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_234[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_234[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_234[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_234[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_234[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_234[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_235: yield_expr | star_expressions +static void * +_tmp_235_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_235[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_235[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_235[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_235[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_235[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_235[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_236: '!' NAME +static void * +_tmp_236_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '!' NAME + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_236[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + Token * _literal; + expr_ty name_var; + if ( + (_literal = _PyPegen_expect_token(p, 54)) // token='!' + && + (name_var = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ _tmp_236[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + _res = _PyPegen_dummy_name(p, _literal, name_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_236[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!' NAME")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_237: ':' | '}' +static void * +_tmp_237_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ':' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_237[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ _tmp_237[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_237[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); + } + { // '}' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_237[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ _tmp_237[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_237[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_238: yield_expr | star_expressions +static void * +_tmp_238_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_238[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_238[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_238[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_238[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_238[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_238[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_239: '!' NAME +static void * +_tmp_239_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '!' NAME + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_239[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + Token * _literal; + expr_ty name_var; + if ( + (_literal = _PyPegen_expect_token(p, 54)) // token='!' + && + (name_var = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ _tmp_239[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + _res = _PyPegen_dummy_name(p, _literal, name_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_239[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!' NAME")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _loop0_240: fstring_format_spec +static asdl_seq * +_loop0_240_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + Py_ssize_t _children_capacity = 1; + Py_ssize_t _n = 0; + { // fstring_format_spec + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_240[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_format_spec")); + expr_ty fstring_format_spec_var; + while ( + (fstring_format_spec_var = fstring_format_spec_rule(p)) // fstring_format_spec + ) + { + _res = fstring_format_spec_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_240[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_format_spec")); + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + p->level--; + return _seq; +} + +// _tmp_241: yield_expr | star_expressions +static void * +_tmp_241_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_241[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_241[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_241[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_241[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_241[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_241[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_242: '!' NAME +static void * +_tmp_242_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '!' NAME + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_242[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + Token * _literal; + expr_ty name_var; + if ( + (_literal = _PyPegen_expect_token(p, 54)) // token='!' + && + (name_var = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ _tmp_242[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + _res = _PyPegen_dummy_name(p, _literal, name_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_242[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!' NAME")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_243: ':' | '}' +static void * +_tmp_243_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ':' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_243[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ _tmp_243[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_243[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); + } + { // '}' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_243[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ _tmp_243[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_243[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_244: star_targets '=' +static void * +_tmp_244_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37690,7 +39834,7 @@ _tmp_224_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_224[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_244[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty z; if ( @@ -37699,7 +39843,7 @@ _tmp_224_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_224[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_244[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -37709,7 +39853,7 @@ _tmp_224_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_224[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_244[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -37718,9 +39862,9 @@ _tmp_224_rule(Parser *p) return _res; } -// _tmp_225: '.' | '...' +// _tmp_245: '.' | '...' static void * -_tmp_225_rule(Parser *p) +_tmp_245_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37737,18 +39881,18 @@ _tmp_225_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_225[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_245[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_225[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_245[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_225[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_245[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '...' @@ -37756,18 +39900,18 @@ _tmp_225_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_225[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_245[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 52)) // token='...' ) { - D(fprintf(stderr, "%*c+ _tmp_225[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_245[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_225[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_245[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); } _res = NULL; @@ -37776,9 +39920,9 @@ _tmp_225_rule(Parser *p) return _res; } -// _tmp_226: '.' | '...' +// _tmp_246: '.' | '...' static void * -_tmp_226_rule(Parser *p) +_tmp_246_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37795,18 +39939,18 @@ _tmp_226_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_226[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_246[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_226[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_246[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_226[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_246[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '...' @@ -37814,18 +39958,18 @@ _tmp_226_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_226[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_246[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 52)) // token='...' ) { - D(fprintf(stderr, "%*c+ _tmp_226[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_246[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_226[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_246[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); } _res = NULL; @@ -37834,9 +39978,9 @@ _tmp_226_rule(Parser *p) return _res; } -// _tmp_227: '@' named_expression NEWLINE +// _tmp_247: '@' named_expression NEWLINE static void * -_tmp_227_rule(Parser *p) +_tmp_247_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37853,7 +39997,7 @@ _tmp_227_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_227[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c> _tmp_247[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); Token * _literal; expr_ty f; Token * newline_var; @@ -37865,7 +40009,7 @@ _tmp_227_rule(Parser *p) (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_227[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_247[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); _res = f; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -37875,7 +40019,7 @@ _tmp_227_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_227[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_247[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@' named_expression NEWLINE")); } _res = NULL; @@ -37884,9 +40028,9 @@ _tmp_227_rule(Parser *p) return _res; } -// _tmp_228: ',' expression +// _tmp_248: ',' expression static void * -_tmp_228_rule(Parser *p) +_tmp_248_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37903,7 +40047,7 @@ _tmp_228_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_228[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _tmp_248[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty c; if ( @@ -37912,7 +40056,7 @@ _tmp_228_rule(Parser *p) (c = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_228[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c+ _tmp_248[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -37922,7 +40066,7 @@ _tmp_228_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_228[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_248[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } _res = NULL; @@ -37931,9 +40075,9 @@ _tmp_228_rule(Parser *p) return _res; } -// _tmp_229: ',' star_expression +// _tmp_249: ',' star_expression static void * -_tmp_229_rule(Parser *p) +_tmp_249_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37950,7 +40094,7 @@ _tmp_229_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_229[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c> _tmp_249[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); Token * _literal; expr_ty c; if ( @@ -37959,7 +40103,7 @@ _tmp_229_rule(Parser *p) (c = star_expression_rule(p)) // star_expression ) { - D(fprintf(stderr, "%*c+ _tmp_229[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c+ _tmp_249[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -37969,7 +40113,7 @@ _tmp_229_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_229[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_249[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_expression")); } _res = NULL; @@ -37978,9 +40122,9 @@ _tmp_229_rule(Parser *p) return _res; } -// _tmp_230: 'or' conjunction +// _tmp_250: 'or' conjunction static void * -_tmp_230_rule(Parser *p) +_tmp_250_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37997,7 +40141,7 @@ _tmp_230_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_230[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c> _tmp_250[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); Token * _keyword; expr_ty c; if ( @@ -38006,7 +40150,7 @@ _tmp_230_rule(Parser *p) (c = conjunction_rule(p)) // conjunction ) { - D(fprintf(stderr, "%*c+ _tmp_230[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c+ _tmp_250[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -38016,7 +40160,7 @@ _tmp_230_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_230[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_250[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'or' conjunction")); } _res = NULL; @@ -38025,9 +40169,9 @@ _tmp_230_rule(Parser *p) return _res; } -// _tmp_231: 'and' inversion +// _tmp_251: 'and' inversion static void * -_tmp_231_rule(Parser *p) +_tmp_251_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38044,7 +40188,7 @@ _tmp_231_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_231[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c> _tmp_251[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); Token * _keyword; expr_ty c; if ( @@ -38053,7 +40197,7 @@ _tmp_231_rule(Parser *p) (c = inversion_rule(p)) // inversion ) { - D(fprintf(stderr, "%*c+ _tmp_231[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c+ _tmp_251[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -38063,7 +40207,7 @@ _tmp_231_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_231[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_251[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'and' inversion")); } _res = NULL; @@ -38072,9 +40216,9 @@ _tmp_231_rule(Parser *p) return _res; } -// _tmp_232: slice | starred_expression +// _tmp_252: slice | starred_expression static void * -_tmp_232_rule(Parser *p) +_tmp_252_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38091,18 +40235,18 @@ _tmp_232_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_232[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slice")); + D(fprintf(stderr, "%*c> _tmp_252[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slice")); expr_ty slice_var; if ( (slice_var = slice_rule(p)) // slice ) { - D(fprintf(stderr, "%*c+ _tmp_232[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slice")); + D(fprintf(stderr, "%*c+ _tmp_252[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slice")); _res = slice_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_232[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_252[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slice")); } { // starred_expression @@ -38110,18 +40254,18 @@ _tmp_232_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_232[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c> _tmp_252[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); expr_ty starred_expression_var; if ( (starred_expression_var = starred_expression_rule(p)) // starred_expression ) { - D(fprintf(stderr, "%*c+ _tmp_232[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c+ _tmp_252[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); _res = starred_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_232[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_252[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); } _res = NULL; @@ -38130,9 +40274,67 @@ _tmp_232_rule(Parser *p) return _res; } -// _tmp_233: 'if' disjunction +// _tmp_253: fstring | string static void * -_tmp_233_rule(Parser *p) +_tmp_253_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // fstring + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_253[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring")); + expr_ty fstring_var; + if ( + (fstring_var = fstring_rule(p)) // fstring + ) + { + D(fprintf(stderr, "%*c+ _tmp_253[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "fstring")); + _res = fstring_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_253[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring")); + } + { // string + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_253[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "string")); + expr_ty string_var; + if ( + (string_var = string_rule(p)) // string + ) + { + D(fprintf(stderr, "%*c+ _tmp_253[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "string")); + _res = string_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_253[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "string")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_254: 'if' disjunction +static void * +_tmp_254_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38149,16 +40351,16 @@ _tmp_233_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_233[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_254[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_233[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_254[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -38168,7 +40370,7 @@ _tmp_233_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_233[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_254[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -38177,9 +40379,9 @@ _tmp_233_rule(Parser *p) return _res; } -// _tmp_234: 'if' disjunction +// _tmp_255: 'if' disjunction static void * -_tmp_234_rule(Parser *p) +_tmp_255_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38196,16 +40398,16 @@ _tmp_234_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_234[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_255[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_234[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_255[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -38215,7 +40417,7 @@ _tmp_234_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_234[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_255[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -38224,9 +40426,9 @@ _tmp_234_rule(Parser *p) return _res; } -// _tmp_235: starred_expression | (assignment_expression | expression !':=') !'=' +// _tmp_256: starred_expression | (assignment_expression | expression !':=') !'=' static void * -_tmp_235_rule(Parser *p) +_tmp_256_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38243,18 +40445,18 @@ _tmp_235_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_235[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c> _tmp_256[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); expr_ty starred_expression_var; if ( (starred_expression_var = starred_expression_rule(p)) // starred_expression ) { - D(fprintf(stderr, "%*c+ _tmp_235[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c+ _tmp_256[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); _res = starred_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_235[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_256[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); } { // (assignment_expression | expression !':=') !'=' @@ -38262,20 +40464,20 @@ _tmp_235_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_235[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='")); - void *_tmp_247_var; + D(fprintf(stderr, "%*c> _tmp_256[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='")); + void *_tmp_268_var; if ( - (_tmp_247_var = _tmp_247_rule(p)) // assignment_expression | expression !':=' + (_tmp_268_var = _tmp_268_rule(p)) // assignment_expression | expression !':=' && _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_235[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='")); - _res = _tmp_247_var; + D(fprintf(stderr, "%*c+ _tmp_256[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='")); + _res = _tmp_268_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_235[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_256[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(assignment_expression | expression !':=') !'='")); } _res = NULL; @@ -38284,9 +40486,9 @@ _tmp_235_rule(Parser *p) return _res; } -// _tmp_236: ',' star_target +// _tmp_257: ',' star_target static void * -_tmp_236_rule(Parser *p) +_tmp_257_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38303,7 +40505,7 @@ _tmp_236_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_236[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_257[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -38312,7 +40514,7 @@ _tmp_236_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_236[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_257[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -38322,7 +40524,7 @@ _tmp_236_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_236[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_257[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -38331,9 +40533,9 @@ _tmp_236_rule(Parser *p) return _res; } -// _tmp_237: ',' star_target +// _tmp_258: ',' star_target static void * -_tmp_237_rule(Parser *p) +_tmp_258_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38350,7 +40552,7 @@ _tmp_237_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_237[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_258[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -38359,7 +40561,7 @@ _tmp_237_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_237[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_258[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -38369,7 +40571,7 @@ _tmp_237_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_237[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_258[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -38378,9 +40580,9 @@ _tmp_237_rule(Parser *p) return _res; } -// _tmp_238: star_targets '=' +// _tmp_259: star_targets '=' static void * -_tmp_238_rule(Parser *p) +_tmp_259_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38397,7 +40599,7 @@ _tmp_238_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_238[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_259[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -38406,12 +40608,12 @@ _tmp_238_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_238[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_259[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = _PyPegen_dummy_name(p, star_targets_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_238[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_259[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -38420,9 +40622,9 @@ _tmp_238_rule(Parser *p) return _res; } -// _tmp_239: star_targets '=' +// _tmp_260: star_targets '=' static void * -_tmp_239_rule(Parser *p) +_tmp_260_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38439,7 +40641,7 @@ _tmp_239_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_239[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_260[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -38448,12 +40650,12 @@ _tmp_239_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_239[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_260[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = _PyPegen_dummy_name(p, star_targets_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_239[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_260[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -38462,9 +40664,9 @@ _tmp_239_rule(Parser *p) return _res; } -// _tmp_240: ')' | '**' +// _tmp_261: ')' | '**' static void * -_tmp_240_rule(Parser *p) +_tmp_261_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38481,18 +40683,18 @@ _tmp_240_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_240[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_261[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_240[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_261[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_240[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_261[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // '**' @@ -38500,18 +40702,18 @@ _tmp_240_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_240[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_261[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_240[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_261[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_240[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_261[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -38520,9 +40722,9 @@ _tmp_240_rule(Parser *p) return _res; } -// _tmp_241: ':' | '**' +// _tmp_262: ':' | '**' static void * -_tmp_241_rule(Parser *p) +_tmp_262_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38539,18 +40741,18 @@ _tmp_241_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_241[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_262[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_241[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_262[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_241[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_262[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '**' @@ -38558,18 +40760,18 @@ _tmp_241_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_241[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_262[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_241[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_262[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_241[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_262[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -38578,9 +40780,9 @@ _tmp_241_rule(Parser *p) return _res; } -// _tmp_242: expression ['as' star_target] +// _tmp_263: expression ['as' star_target] static void * -_tmp_242_rule(Parser *p) +_tmp_263_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38597,22 +40799,22 @@ _tmp_242_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_242[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_263[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expression_var; if ( (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_248_rule(p), !p->error_indicator) // ['as' star_target] + (_opt_var = _tmp_269_rule(p), !p->error_indicator) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_242[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_263[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); _res = _PyPegen_dummy_name(p, expression_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_242[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_263[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ['as' star_target]")); } _res = NULL; @@ -38621,9 +40823,9 @@ _tmp_242_rule(Parser *p) return _res; } -// _tmp_243: expressions ['as' star_target] +// _tmp_264: expressions ['as' star_target] static void * -_tmp_243_rule(Parser *p) +_tmp_264_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38640,22 +40842,22 @@ _tmp_243_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_243[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_264[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expressions_var; if ( (expressions_var = expressions_rule(p)) // expressions && - (_opt_var = _tmp_249_rule(p), !p->error_indicator) // ['as' star_target] + (_opt_var = _tmp_270_rule(p), !p->error_indicator) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_243[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_264[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); _res = _PyPegen_dummy_name(p, expressions_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_243[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_264[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expressions ['as' star_target]")); } _res = NULL; @@ -38664,9 +40866,9 @@ _tmp_243_rule(Parser *p) return _res; } -// _tmp_244: expression ['as' star_target] +// _tmp_265: expression ['as' star_target] static void * -_tmp_244_rule(Parser *p) +_tmp_265_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38683,22 +40885,22 @@ _tmp_244_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_244[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_265[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expression_var; if ( (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_250_rule(p), !p->error_indicator) // ['as' star_target] + (_opt_var = _tmp_271_rule(p), !p->error_indicator) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_244[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_265[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); _res = _PyPegen_dummy_name(p, expression_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_244[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_265[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ['as' star_target]")); } _res = NULL; @@ -38707,9 +40909,9 @@ _tmp_244_rule(Parser *p) return _res; } -// _tmp_245: expressions ['as' star_target] +// _tmp_266: expressions ['as' star_target] static void * -_tmp_245_rule(Parser *p) +_tmp_266_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38726,22 +40928,22 @@ _tmp_245_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_245[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_266[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expressions_var; if ( (expressions_var = expressions_rule(p)) // expressions && - (_opt_var = _tmp_251_rule(p), !p->error_indicator) // ['as' star_target] + (_opt_var = _tmp_272_rule(p), !p->error_indicator) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_245[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_266[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); _res = _PyPegen_dummy_name(p, expressions_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_245[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_266[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expressions ['as' star_target]")); } _res = NULL; @@ -38750,9 +40952,9 @@ _tmp_245_rule(Parser *p) return _res; } -// _tmp_246: 'as' NAME +// _tmp_267: 'as' NAME static void * -_tmp_246_rule(Parser *p) +_tmp_267_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38769,21 +40971,21 @@ _tmp_246_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_246[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_267[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_246[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_267[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_246[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_267[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -38792,9 +40994,9 @@ _tmp_246_rule(Parser *p) return _res; } -// _tmp_247: assignment_expression | expression !':=' +// _tmp_268: assignment_expression | expression !':=' static void * -_tmp_247_rule(Parser *p) +_tmp_268_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38811,18 +41013,18 @@ _tmp_247_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_247[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "assignment_expression")); + D(fprintf(stderr, "%*c> _tmp_268[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "assignment_expression")); expr_ty assignment_expression_var; if ( (assignment_expression_var = assignment_expression_rule(p)) // assignment_expression ) { - D(fprintf(stderr, "%*c+ _tmp_247[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "assignment_expression")); + D(fprintf(stderr, "%*c+ _tmp_268[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "assignment_expression")); _res = assignment_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_247[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_268[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "assignment_expression")); } { // expression !':=' @@ -38830,7 +41032,7 @@ _tmp_247_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_247[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression !':='")); + D(fprintf(stderr, "%*c> _tmp_268[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression !':='")); expr_ty expression_var; if ( (expression_var = expression_rule(p)) // expression @@ -38838,12 +41040,12 @@ _tmp_247_rule(Parser *p) _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 53) // token=':=' ) { - D(fprintf(stderr, "%*c+ _tmp_247[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='")); + D(fprintf(stderr, "%*c+ _tmp_268[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='")); _res = expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_247[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_268[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression !':='")); } _res = NULL; @@ -38852,9 +41054,9 @@ _tmp_247_rule(Parser *p) return _res; } -// _tmp_248: 'as' star_target +// _tmp_269: 'as' star_target static void * -_tmp_248_rule(Parser *p) +_tmp_269_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38871,21 +41073,21 @@ _tmp_248_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_248[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c> _tmp_269[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); Token * _keyword; expr_ty star_target_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_248[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c+ _tmp_269[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); _res = _PyPegen_dummy_name(p, _keyword, star_target_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_248[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_269[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); } _res = NULL; @@ -38894,9 +41096,9 @@ _tmp_248_rule(Parser *p) return _res; } -// _tmp_249: 'as' star_target +// _tmp_270: 'as' star_target static void * -_tmp_249_rule(Parser *p) +_tmp_270_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38913,21 +41115,21 @@ _tmp_249_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_249[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c> _tmp_270[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); Token * _keyword; expr_ty star_target_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_249[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c+ _tmp_270[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); _res = _PyPegen_dummy_name(p, _keyword, star_target_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_249[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_270[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); } _res = NULL; @@ -38936,9 +41138,9 @@ _tmp_249_rule(Parser *p) return _res; } -// _tmp_250: 'as' star_target +// _tmp_271: 'as' star_target static void * -_tmp_250_rule(Parser *p) +_tmp_271_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38955,21 +41157,21 @@ _tmp_250_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_250[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c> _tmp_271[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); Token * _keyword; expr_ty star_target_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_250[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c+ _tmp_271[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); _res = _PyPegen_dummy_name(p, _keyword, star_target_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_250[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_271[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); } _res = NULL; @@ -38978,9 +41180,9 @@ _tmp_250_rule(Parser *p) return _res; } -// _tmp_251: 'as' star_target +// _tmp_272: 'as' star_target static void * -_tmp_251_rule(Parser *p) +_tmp_272_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38997,21 +41199,21 @@ _tmp_251_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_251[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c> _tmp_272[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); Token * _keyword; expr_ty star_target_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_251[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c+ _tmp_272[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); _res = _PyPegen_dummy_name(p, _keyword, star_target_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_251[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_272[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); } _res = NULL; diff --git a/Parser/pegen.c b/Parser/pegen.c index b79ae4cb1fb370..262bfabfba7a25 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -359,7 +359,7 @@ _PyPegen_expect_token(Parser *p, int type) } Token *t = p->tokens[p->mark]; if (t->type != type) { - return NULL; + return NULL; } p->mark += 1; return t; diff --git a/Parser/pegen.h b/Parser/pegen.h index ad5c97f5f7e5d1..6962013c2d18b4 100644 --- a/Parser/pegen.h +++ b/Parser/pegen.h @@ -138,6 +138,7 @@ void* _PyPegen_expect_forced_result(Parser *p, void* result, const char* expecte Token *_PyPegen_expect_forced_token(Parser *p, int type, const char* expected); expr_ty _PyPegen_expect_soft_keyword(Parser *p, const char *keyword); expr_ty _PyPegen_soft_keyword_token(Parser *p); +expr_ty _PyPegen_fstring_middle_token(Parser* p); Token *_PyPegen_get_last_nonnwhitespace_token(Parser *); int _PyPegen_fill_token(Parser *p); expr_ty _PyPegen_name_token(Parser *p); @@ -155,7 +156,7 @@ typedef enum { int _Pypegen_raise_decode_error(Parser *p); void _PyPegen_raise_tokenizer_init_error(PyObject *filename); int _Pypegen_tokenizer_error(Parser *p); -void *_PyPegen_raise_error(Parser *p, PyObject *errtype, const char *errmsg, ...); +void *_PyPegen_raise_error(Parser *p, PyObject *errtype, int use_mark, const char *errmsg, ...); void *_PyPegen_raise_error_known_location(Parser *p, PyObject *errtype, Py_ssize_t lineno, Py_ssize_t col_offset, Py_ssize_t end_lineno, Py_ssize_t end_col_offset, @@ -175,8 +176,9 @@ RAISE_ERROR_KNOWN_LOCATION(Parser *p, PyObject *errtype, va_end(va); return NULL; } -#define RAISE_SYNTAX_ERROR(msg, ...) _PyPegen_raise_error(p, PyExc_SyntaxError, msg, ##__VA_ARGS__) -#define RAISE_INDENTATION_ERROR(msg, ...) _PyPegen_raise_error(p, PyExc_IndentationError, msg, ##__VA_ARGS__) +#define RAISE_SYNTAX_ERROR(msg, ...) _PyPegen_raise_error(p, PyExc_SyntaxError, 0, msg, ##__VA_ARGS__) +#define RAISE_INDENTATION_ERROR(msg, ...) _PyPegen_raise_error(p, PyExc_IndentationError, 0, msg, ##__VA_ARGS__) +#define RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN(msg, ...) _PyPegen_raise_error(p, PyExc_SyntaxError, 1, msg, ##__VA_ARGS__) #define RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, msg, ...) \ RAISE_ERROR_KNOWN_LOCATION(p, PyExc_SyntaxError, (a)->lineno, (a)->col_offset, (b)->end_lineno, (b)->end_col_offset, msg, ##__VA_ARGS__) #define RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, msg, ...) \ @@ -308,6 +310,7 @@ StarEtc *_PyPegen_star_etc(Parser *, arg_ty, asdl_seq *, arg_ty); arguments_ty _PyPegen_make_arguments(Parser *, asdl_arg_seq *, SlashWithDefault *, asdl_arg_seq *, asdl_seq *, StarEtc *); arguments_ty _PyPegen_empty_arguments(Parser *); +expr_ty _PyPegen_formatted_value(Parser *, expr_ty, Token *, expr_ty, expr_ty, int, int, int, int, PyArena *); AugOperator *_PyPegen_augoperator(Parser*, operator_ty type); stmt_ty _PyPegen_function_def_decorators(Parser *, asdl_expr_seq *, stmt_ty); stmt_ty _PyPegen_class_def_decorators(Parser *, asdl_expr_seq *, stmt_ty); @@ -317,12 +320,16 @@ asdl_keyword_seq *_PyPegen_seq_delete_starred_exprs(Parser *, asdl_seq *); expr_ty _PyPegen_collect_call_seqs(Parser *, asdl_expr_seq *, asdl_seq *, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); -expr_ty _PyPegen_concatenate_strings(Parser *p, asdl_seq *); +expr_ty _PyPegen_constant_from_token(Parser* p, Token* tok); +expr_ty _PyPegen_constant_from_string(Parser* p, Token* tok); +expr_ty _PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *, int, int, int, int, PyArena *); +expr_ty _PyPegen_FetchRawForm(Parser *p, int, int, int, int); expr_ty _PyPegen_ensure_imaginary(Parser *p, expr_ty); expr_ty _PyPegen_ensure_real(Parser *p, expr_ty); asdl_seq *_PyPegen_join_sequences(Parser *, asdl_seq *, asdl_seq *); int _PyPegen_check_barry_as_flufl(Parser *, Token *); int _PyPegen_check_legacy_stmt(Parser *p, expr_ty t); +expr_ty _PyPegen_check_fstring_conversion(Parser *p, Token *, expr_ty t); mod_ty _PyPegen_make_module(Parser *, asdl_stmt_seq *); void *_PyPegen_arguments_parsing_error(Parser *, expr_ty); expr_ty _PyPegen_get_last_comprehension_item(comprehension_ty comprehension); @@ -338,6 +345,9 @@ void *_PyPegen_run_parser(Parser *); mod_ty _PyPegen_run_parser_from_string(const char *, int, PyObject *, PyCompilerFlags *, PyArena *); asdl_stmt_seq *_PyPegen_interactive_exit(Parser *); +// TODO: move to the correct place in this file +expr_ty _PyPegen_joined_str(Parser *p, Token* a, asdl_expr_seq* expr, Token*b); + // Generated function in parse.c - function definition in python.gram void *_PyPegen_parse(Parser *); diff --git a/Parser/pegen_errors.c b/Parser/pegen_errors.c index 6ea7600119b643..e26bad20a27575 100644 --- a/Parser/pegen_errors.c +++ b/Parser/pegen_errors.c @@ -192,7 +192,10 @@ _PyPegen_tokenize_full_source_to_check_for_errors(Parser *p) { exit: - if (PyErr_Occurred()) { + // If we're in an f-string, we want the syntax error in the expression part + // to propagate, so that tokenizer errors (like expecting '}') that happen afterwards + // do not swallow it. + if (PyErr_Occurred() && p->tok->tok_mode_stack_index <= 0) { Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(traceback); @@ -205,7 +208,7 @@ _PyPegen_tokenize_full_source_to_check_for_errors(Parser *p) { // PARSER ERRORS void * -_PyPegen_raise_error(Parser *p, PyObject *errtype, const char *errmsg, ...) +_PyPegen_raise_error(Parser *p, PyObject *errtype, int use_mark, const char *errmsg, ...) { if (p->fill == 0) { va_list va; @@ -214,8 +217,13 @@ _PyPegen_raise_error(Parser *p, PyObject *errtype, const char *errmsg, ...) va_end(va); return NULL; } - - Token *t = p->known_err_token != NULL ? p->known_err_token : p->tokens[p->fill - 1]; + if (use_mark && p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + return NULL; + } + Token *t = p->known_err_token != NULL + ? p->known_err_token + : p->tokens[use_mark ? p->mark : p->fill - 1]; Py_ssize_t col_offset; Py_ssize_t end_col_offset = -1; if (t->col_offset == -1) { diff --git a/Parser/string_parser.c b/Parser/string_parser.c index c096bea7426e5c..be5f0c4a60a663 100644 --- a/Parser/string_parser.c +++ b/Parser/string_parser.c @@ -135,7 +135,9 @@ decode_unicode_with_escapes(Parser *parser, const char *s, size_t len, Token *t) const char *first_invalid_escape; v = _PyUnicode_DecodeUnicodeEscapeInternal(s, len, NULL, NULL, &first_invalid_escape); - if (v != NULL && first_invalid_escape != NULL) { + // HACK: later we can simply pass the line no, since we don't preserve the tokens + // when we are decoding the string but we preserve the line numbers. + if (v != NULL && first_invalid_escape != NULL && t != NULL) { if (warn_invalid_escape_sequence(parser, first_invalid_escape, t) < 0) { /* We have not decref u before because first_invalid_escape points inside u. */ @@ -166,43 +168,43 @@ decode_bytes_with_escapes(Parser *p, const char *s, Py_ssize_t len, Token *t) return result; } -/* s must include the bracketing quote characters, and r, b, u, - &/or f prefixes (if any), and embedded escape sequences (if any). - _PyPegen_parsestr parses it, and sets *result to decoded Python string object. - If the string is an f-string, set *fstr and *fstrlen to the unparsed - string object. Return 0 if no errors occurred. */ -int -_PyPegen_parsestr(Parser *p, int *bytesmode, int *rawmode, PyObject **result, - const char **fstr, Py_ssize_t *fstrlen, Token *t) +PyObject * +_PyPegen_decode_string(Parser *p, int raw, const char *s, size_t len, Token *t) +{ + if (raw) { + return PyUnicode_DecodeUTF8Stateful(s, len, NULL, NULL); + } + return decode_unicode_with_escapes(p, s, len, t); +} + +/* s must include the bracketing quote characters, and r, b &/or f prefixes + (if any), and embedded escape sequences (if any). (f-strings are handled by the parser) + _PyPegen_parse_string parses it, and returns the decoded Python string object. */ +PyObject * +_PyPegen_parse_string(Parser *p, Token *t) { const char *s = PyBytes_AsString(t->bytes); if (s == NULL) { - return -1; + return NULL; } size_t len; int quote = Py_CHARMASK(*s); - int fmode = 0; - *bytesmode = 0; - *rawmode = 0; - *result = NULL; - *fstr = NULL; + int bytesmode = 0; + int rawmode = 0; + if (Py_ISALPHA(quote)) { - while (!*bytesmode || !*rawmode) { + while (!bytesmode || !rawmode) { if (quote == 'b' || quote == 'B') { quote =(unsigned char)*++s; - *bytesmode = 1; + bytesmode = 1; } else if (quote == 'u' || quote == 'U') { quote = (unsigned char)*++s; } else if (quote == 'r' || quote == 'R') { quote = (unsigned char)*++s; - *rawmode = 1; - } - else if (quote == 'f' || quote == 'F') { - quote = (unsigned char)*++s; - fmode = 1; + rawmode = 1; } else { break; @@ -210,32 +212,21 @@ _PyPegen_parsestr(Parser *p, int *bytesmode, int *rawmode, PyObject **result, } } - /* fstrings are only allowed in Python 3.6 and greater */ - if (fmode && p->feature_version < 6) { - p->error_indicator = 1; - RAISE_SYNTAX_ERROR("Format strings are only supported in Python 3.6 and greater"); - return -1; - } - - if (fmode && *bytesmode) { - PyErr_BadInternalCall(); - return -1; - } if (quote != '\'' && quote != '\"') { PyErr_BadInternalCall(); - return -1; + return NULL; } /* Skip the leading quote char. */ s++; len = strlen(s); if (len > INT_MAX) { PyErr_SetString(PyExc_OverflowError, "string to parse is too long"); - return -1; + return NULL; } if (s[--len] != quote) { /* Last quote char must match the first. */ PyErr_BadInternalCall(); - return -1; + return NULL; } if (len >= 4 && s[0] == quote && s[1] == quote) { /* A triple quoted string. We've already skipped one quote at @@ -246,22 +237,13 @@ _PyPegen_parsestr(Parser *p, int *bytesmode, int *rawmode, PyObject **result, /* And check that the last two match. */ if (s[--len] != quote || s[--len] != quote) { PyErr_BadInternalCall(); - return -1; + return NULL; } } - if (fmode) { - /* Just return the bytes. The caller will parse the resulting - string. */ - *fstr = s; - *fstrlen = len; - return 0; - } - - /* Not an f-string. */ /* Avoid invoking escape decoding routines if possible. */ - *rawmode = *rawmode || strchr(s, '\\') == NULL; - if (*bytesmode) { + rawmode = rawmode || strchr(s, '\\') == NULL; + if (bytesmode) { /* Disallow non-ASCII characters. */ const char *ch; for (ch = s; *ch; ch++) { @@ -269,1014 +251,13 @@ _PyPegen_parsestr(Parser *p, int *bytesmode, int *rawmode, PyObject **result, RAISE_SYNTAX_ERROR( "bytes can only contain ASCII " "literal characters"); - return -1; - } - } - if (*rawmode) { - *result = PyBytes_FromStringAndSize(s, len); - } - else { - *result = decode_bytes_with_escapes(p, s, len, t); - } - } - else { - if (*rawmode) { - *result = PyUnicode_DecodeUTF8Stateful(s, len, NULL, NULL); - } - else { - *result = decode_unicode_with_escapes(p, s, len, t); - } - } - return *result == NULL ? -1 : 0; -} - - - -// FSTRING STUFF - -/* Fix locations for the given node and its children. - - `parent` is the enclosing node. - `expr_start` is the starting position of the expression (pointing to the open brace). - `n` is the node which locations are going to be fixed relative to parent. - `expr_str` is the child node's string representation, including braces. -*/ -static bool -fstring_find_expr_location(Token *parent, const char* expr_start, char *expr_str, int *p_lines, int *p_cols) -{ - *p_lines = 0; - *p_cols = 0; - assert(expr_start != NULL && *expr_start == '{'); - if (parent && parent->bytes) { - const char *parent_str = PyBytes_AsString(parent->bytes); - if (!parent_str) { - return false; - } - // The following is needed, in order to correctly shift the column - // offset, in the case that (disregarding any whitespace) a newline - // immediately follows the opening curly brace of the fstring expression. - bool newline_after_brace = 1; - const char *start = expr_start + 1; - while (start && *start != '}' && *start != '\n') { - if (*start != ' ' && *start != '\t' && *start != '\f') { - newline_after_brace = 0; - break; - } - start++; - } - - // Account for the characters from the last newline character to our - // left until the beginning of expr_start. - if (!newline_after_brace) { - start = expr_start; - while (start > parent_str && *start != '\n') { - start--; - } - *p_cols += (int)(expr_start - start); - if (*start == '\n') { - *p_cols -= 1; - } - } - /* adjust the start based on the number of newlines encountered - before the f-string expression */ - for (const char *p = parent_str; p < expr_start; p++) { - if (*p == '\n') { - (*p_lines)++; - } - } - } - return true; -} - - -/* Compile this expression in to an expr_ty. Add parens around the - expression, in order to allow leading spaces in the expression. */ -static expr_ty -fstring_compile_expr(Parser *p, const char *expr_start, const char *expr_end, - Token *t) -{ - expr_ty expr = NULL; - char *str; - Py_ssize_t len; - const char *s; - expr_ty result = NULL; - - assert(expr_end >= expr_start); - assert(*(expr_start-1) == '{'); - assert(*expr_end == '}' || *expr_end == '!' || *expr_end == ':' || - *expr_end == '='); - - /* If the substring is all whitespace, it's an error. We need to catch this - here, and not when we call PyParser_SimpleParseStringFlagsFilename, - because turning the expression '' in to '()' would go from being invalid - to valid. */ - for (s = expr_start; s != expr_end; s++) { - char c = *s; - /* The Python parser ignores only the following whitespace - characters (\r already is converted to \n). */ - if (!(c == ' ' || c == '\t' || c == '\n' || c == '\f')) { - break; - } - } - - if (s == expr_end) { - if (*expr_end == '!' || *expr_end == ':' || *expr_end == '=') { - RAISE_SYNTAX_ERROR("f-string: expression required before '%c'", *expr_end); - return NULL; - } - RAISE_SYNTAX_ERROR("f-string: empty expression not allowed"); - return NULL; - } - - len = expr_end - expr_start; - /* Allocate 3 extra bytes: open paren, close paren, null byte. */ - str = PyMem_Calloc(len + 3, sizeof(char)); - if (str == NULL) { - PyErr_NoMemory(); - return NULL; - } - - // The call to fstring_find_expr_location is responsible for finding the column offset - // the generated AST nodes need to be shifted to the right, which is equal to the number - // of the f-string characters before the expression starts. - memcpy(str+1, expr_start, len); - int lines, cols; - if (!fstring_find_expr_location(t, expr_start-1, str+1, &lines, &cols)) { - PyMem_Free(str); - return NULL; - } - - // The parentheses are needed in order to allow for leading whitespace within - // the f-string expression. This consequently gets parsed as a group (see the - // group rule in python.gram). - str[0] = '('; - str[len+1] = ')'; - - struct tok_state* tok = _PyTokenizer_FromString(str, 1); - if (tok == NULL) { - PyMem_Free(str); - return NULL; - } - tok->filename = Py_NewRef(p->tok->filename); - tok->lineno = t->lineno + lines - 1; - - Parser *p2 = _PyPegen_Parser_New(tok, Py_fstring_input, p->flags, p->feature_version, - NULL, p->arena); - - p2->starting_lineno = t->lineno + lines; - p2->starting_col_offset = lines != 0 ? cols : t->col_offset + cols; - - expr = _PyPegen_run_parser(p2); - - if (expr == NULL) { - goto exit; - } - result = expr; - -exit: - PyMem_Free(str); - _PyPegen_Parser_Free(p2); - _PyTokenizer_Free(tok); - return result; -} - -/* Return -1 on error. - - Return 0 if we reached the end of the literal. - - Return 1 if we haven't reached the end of the literal, but we want - the caller to process the literal up to this point. Used for - doubled braces. -*/ -static int -fstring_find_literal(Parser *p, const char **str, const char *end, int raw, - PyObject **literal, int recurse_lvl, Token *t) -{ - /* Get any literal string. It ends when we hit an un-doubled left - brace (which isn't part of a unicode name escape such as - "\N{EULER CONSTANT}"), or the end of the string. */ - - const char *s = *str; - const char *literal_start = s; - int result = 0; - - assert(*literal == NULL); - while (s < end) { - char ch = *s++; - if (!raw && ch == '\\' && s < end) { - ch = *s++; - if (ch == 'N') { - /* We need to look at and skip matching braces for "\N{name}" - sequences because otherwise we'll think the opening '{' - starts an expression, which is not the case with "\N". - Keep looking for either a matched '{' '}' pair, or the end - of the string. */ - - if (s < end && *s++ == '{') { - while (s < end && *s++ != '}') { - } - continue; - } - - /* This is an invalid "\N" sequence, since it's a "\N" not - followed by a "{". Just keep parsing this literal. This - error will be caught later by - decode_unicode_with_escapes(). */ - continue; - } - if (ch == '{' && warn_invalid_escape_sequence(p, s-1, t) < 0) { - return -1; - } - } - if (ch == '{' || ch == '}') { - /* Check for doubled braces, but only at the top level. If - we checked at every level, then f'{0:{3}}' would fail - with the two closing braces. */ - if (recurse_lvl == 0) { - if (s < end && *s == ch) { - /* We're going to tell the caller that the literal ends - here, but that they should continue scanning. But also - skip over the second brace when we resume scanning. */ - *str = s + 1; - result = 1; - goto done; - } - - /* Where a single '{' is the start of a new expression, a - single '}' is not allowed. */ - if (ch == '}') { - *str = s - 1; - RAISE_SYNTAX_ERROR("f-string: single '}' is not allowed"); - return -1; - } - } - /* We're either at a '{', which means we're starting another - expression; or a '}', which means we're at the end of this - f-string (for a nested format_spec). */ - s--; - break; - } - } - *str = s; - assert(s <= end); - assert(s == end || *s == '{' || *s == '}'); -done: - if (literal_start != s) { - if (raw) { - *literal = PyUnicode_DecodeUTF8Stateful(literal_start, - s - literal_start, - NULL, NULL); - } - else { - *literal = decode_unicode_with_escapes(p, literal_start, - s - literal_start, t); - } - if (!*literal) { - return -1; - } - } - return result; -} - -/* Forward declaration because parsing is recursive. */ -static expr_ty -fstring_parse(Parser *p, const char **str, const char *end, int raw, int recurse_lvl, - Token *first_token, Token* t, Token *last_token); - -/* Parse the f-string at *str, ending at end. We know *str starts an - expression (so it must be a '{'). Returns the FormattedValue node, which - includes the expression, conversion character, format_spec expression, and - optionally the text of the expression (if = is used). - - Note that I don't do a perfect job here: I don't make sure that a - closing brace doesn't match an opening paren, for example. It - doesn't need to error on all invalid expressions, just correctly - find the end of all valid ones. Any errors inside the expression - will be caught when we parse it later. - - *expression is set to the expression. For an '=' "debug" expression, - *expr_text is set to the debug text (the original text of the expression, - including the '=' and any whitespace around it, as a string object). If - not a debug expression, *expr_text set to NULL. */ -static int -fstring_find_expr(Parser *p, const char **str, const char *end, int raw, int recurse_lvl, - PyObject **expr_text, expr_ty *expression, Token *first_token, - Token *t, Token *last_token) -{ - /* Return -1 on error, else 0. */ - - const char *expr_start; - const char *expr_end; - expr_ty simple_expression; - expr_ty format_spec = NULL; /* Optional format specifier. */ - int conversion = -1; /* The conversion char. Use default if not - specified, or !r if using = and no format - spec. */ - - /* 0 if we're not in a string, else the quote char we're trying to - match (single or double quote). */ - char quote_char = 0; - - /* If we're inside a string, 1=normal, 3=triple-quoted. */ - int string_type = 0; - - /* Keep track of nesting level for braces/parens/brackets in - expressions. */ - Py_ssize_t nested_depth = 0; - char parenstack[MAXLEVEL]; - - *expr_text = NULL; - - /* Can only nest one level deep. */ - if (recurse_lvl >= 2) { - RAISE_SYNTAX_ERROR("f-string: expressions nested too deeply"); - goto error; - } - - /* The first char must be a left brace, or we wouldn't have gotten - here. Skip over it. */ - assert(**str == '{'); - *str += 1; - - expr_start = *str; - for (; *str < end; (*str)++) { - char ch; - - /* Loop invariants. */ - assert(nested_depth >= 0); - assert(*str >= expr_start && *str < end); - if (quote_char) { - assert(string_type == 1 || string_type == 3); - } else { - assert(string_type == 0); - } - - ch = **str; - /* Nowhere inside an expression is a backslash allowed. */ - if (ch == '\\') { - /* Error: can't include a backslash character, inside - parens or strings or not. */ - RAISE_SYNTAX_ERROR( - "f-string expression part " - "cannot include a backslash"); - goto error; - } - if (quote_char) { - /* We're inside a string. See if we're at the end. */ - /* This code needs to implement the same non-error logic - as tok_get from tokenizer.c, at the letter_quote - label. To actually share that code would be a - nightmare. But, it's unlikely to change and is small, - so duplicate it here. Note we don't need to catch all - of the errors, since they'll be caught when parsing the - expression. We just need to match the non-error - cases. Thus we can ignore \n in single-quoted strings, - for example. Or non-terminated strings. */ - if (ch == quote_char) { - /* Does this match the string_type (single or triple - quoted)? */ - if (string_type == 3) { - if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) { - /* We're at the end of a triple quoted string. */ - *str += 2; - string_type = 0; - quote_char = 0; - continue; - } - } else { - /* We're at the end of a normal string. */ - quote_char = 0; - string_type = 0; - continue; - } - } - } else if (ch == '\'' || ch == '"') { - /* Is this a triple quoted string? */ - if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) { - string_type = 3; - *str += 2; - } else { - /* Start of a normal string. */ - string_type = 1; - } - /* Start looking for the end of the string. */ - quote_char = ch; - } else if (ch == '[' || ch == '{' || ch == '(') { - if (nested_depth >= MAXLEVEL) { - RAISE_SYNTAX_ERROR("f-string: too many nested parenthesis"); - goto error; - } - parenstack[nested_depth] = ch; - nested_depth++; - } else if (ch == '#') { - /* Error: can't include a comment character, inside parens - or not. */ - RAISE_SYNTAX_ERROR("f-string expression part cannot include '#'"); - goto error; - } else if (nested_depth == 0 && - (ch == '!' || ch == ':' || ch == '}' || - ch == '=' || ch == '>' || ch == '<')) { - /* See if there's a next character. */ - if (*str+1 < end) { - char next = *(*str+1); - - /* For "!=". since '=' is not an allowed conversion character, - nothing is lost in this test. */ - if ((ch == '!' && next == '=') || /* != */ - (ch == '=' && next == '=') || /* == */ - (ch == '<' && next == '=') || /* <= */ - (ch == '>' && next == '=') /* >= */ - ) { - *str += 1; - continue; - } - } - /* Don't get out of the loop for these, if they're single - chars (not part of 2-char tokens). If by themselves, they - don't end an expression (unlike say '!'). */ - if (ch == '>' || ch == '<') { - continue; - } - - /* Normal way out of this loop. */ - break; - } else if (ch == ']' || ch == '}' || ch == ')') { - if (!nested_depth) { - RAISE_SYNTAX_ERROR("f-string: unmatched '%c'", ch); - goto error; - } - nested_depth--; - int opening = (unsigned char)parenstack[nested_depth]; - if (!((opening == '(' && ch == ')') || - (opening == '[' && ch == ']') || - (opening == '{' && ch == '}'))) - { - RAISE_SYNTAX_ERROR( - "f-string: closing parenthesis '%c' " - "does not match opening parenthesis '%c'", - ch, opening); - goto error; - } - } else { - /* Just consume this char and loop around. */ - } - } - expr_end = *str; - /* If we leave the above loop in a string or with mismatched parens, we - don't really care. We'll get a syntax error when compiling the - expression. But, we can produce a better error message, so let's just - do that.*/ - if (quote_char) { - RAISE_SYNTAX_ERROR("f-string: unterminated string"); - goto error; - } - if (nested_depth) { - int opening = (unsigned char)parenstack[nested_depth - 1]; - RAISE_SYNTAX_ERROR("f-string: unmatched '%c'", opening); - goto error; - } - - if (*str >= end) { - goto unexpected_end_of_string; - } - - /* Compile the expression as soon as possible, so we show errors - related to the expression before errors related to the - conversion or format_spec. */ - simple_expression = fstring_compile_expr(p, expr_start, expr_end, t); - if (!simple_expression) { - goto error; - } - - /* Check for =, which puts the text value of the expression in - expr_text. */ - if (**str == '=') { - if (p->feature_version < 8) { - RAISE_SYNTAX_ERROR("f-string: self documenting expressions are " - "only supported in Python 3.8 and greater"); - goto error; - } - *str += 1; - - /* Skip over ASCII whitespace. No need to test for end of string - here, since we know there's at least a trailing quote somewhere - ahead. */ - while (Py_ISSPACE(**str)) { - *str += 1; - } - if (*str >= end) { - goto unexpected_end_of_string; - } - /* Set *expr_text to the text of the expression. */ - *expr_text = PyUnicode_FromStringAndSize(expr_start, *str-expr_start); - if (!*expr_text) { - goto error; - } - } - - /* Check for a conversion char, if present. */ - if (**str == '!') { - *str += 1; - const char *conv_start = *str; - while (1) { - if (*str >= end) { - goto unexpected_end_of_string; - } - if (**str == '}' || **str == ':') { - break; - } - *str += 1; - } - if (*str == conv_start) { - RAISE_SYNTAX_ERROR( - "f-string: missed conversion character"); - goto error; - } - - conversion = (unsigned char)*conv_start; - /* Validate the conversion. */ - if ((*str != conv_start + 1) || - !(conversion == 's' || conversion == 'r' || conversion == 'a')) - { - PyObject *conv_obj = PyUnicode_FromStringAndSize(conv_start, - *str-conv_start); - if (conv_obj) { - RAISE_SYNTAX_ERROR( - "f-string: invalid conversion character %R: " - "expected 's', 'r', or 'a'", - conv_obj); - Py_DECREF(conv_obj); - } - goto error; - } - - } - - /* Check for the format spec, if present. */ - assert(*str < end); - if (**str == ':') { - *str += 1; - if (*str >= end) { - goto unexpected_end_of_string; - } - - /* Parse the format spec. */ - format_spec = fstring_parse(p, str, end, raw, recurse_lvl+1, - first_token, t, last_token); - if (!format_spec) { - goto error; - } - } - - if (*str >= end || **str != '}') { - goto unexpected_end_of_string; - } - - /* We're at a right brace. Consume it. */ - assert(*str < end); - assert(**str == '}'); - *str += 1; - - /* If we're in = mode (detected by non-NULL expr_text), and have no format - spec and no explicit conversion, set the conversion to 'r'. */ - if (*expr_text && format_spec == NULL && conversion == -1) { - conversion = 'r'; - } - - /* And now create the FormattedValue node that represents this - entire expression with the conversion and format spec. */ - //TODO: Fix this - *expression = _PyAST_FormattedValue(simple_expression, conversion, - format_spec, first_token->lineno, - first_token->col_offset, - last_token->end_lineno, - last_token->end_col_offset, p->arena); - if (!*expression) { - goto error; - } - - return 0; - -unexpected_end_of_string: - RAISE_SYNTAX_ERROR("f-string: expecting '}'"); - /* Falls through to error. */ - -error: - Py_XDECREF(*expr_text); - return -1; - -} - -/* Return -1 on error. - - Return 0 if we have a literal (possible zero length) and an - expression (zero length if at the end of the string. - - Return 1 if we have a literal, but no expression, and we want the - caller to call us again. This is used to deal with doubled - braces. - - When called multiple times on the string 'a{{b{0}c', this function - will return: - - 1. the literal 'a{' with no expression, and a return value - of 1. Despite the fact that there's no expression, the return - value of 1 means we're not finished yet. - - 2. the literal 'b' and the expression '0', with a return value of - 0. The fact that there's an expression means we're not finished. - - 3. literal 'c' with no expression and a return value of 0. The - combination of the return value of 0 with no expression means - we're finished. -*/ -static int -fstring_find_literal_and_expr(Parser *p, const char **str, const char *end, int raw, - int recurse_lvl, PyObject **literal, - PyObject **expr_text, expr_ty *expression, - Token *first_token, Token *t, Token *last_token) -{ - int result; - - assert(*literal == NULL && *expression == NULL); - - /* Get any literal string. */ - result = fstring_find_literal(p, str, end, raw, literal, recurse_lvl, t); - if (result < 0) { - goto error; - } - - assert(result == 0 || result == 1); - - if (result == 1) { - /* We have a literal, but don't look at the expression. */ - return 1; - } - - if (*str >= end || **str == '}') { - /* We're at the end of the string or the end of a nested - f-string: no expression. The top-level error case where we - expect to be at the end of the string but we're at a '}' is - handled later. */ - return 0; - } - - /* We must now be the start of an expression, on a '{'. */ - assert(**str == '{'); - - if (fstring_find_expr(p, str, end, raw, recurse_lvl, expr_text, - expression, first_token, t, last_token) < 0) { - goto error; - } - - return 0; - -error: - Py_CLEAR(*literal); - return -1; -} - -#ifdef NDEBUG -#define ExprList_check_invariants(l) -#else -static void -ExprList_check_invariants(ExprList *l) -{ - /* Check our invariants. Make sure this object is "live", and - hasn't been deallocated. */ - assert(l->size >= 0); - assert(l->p != NULL); - if (l->size <= EXPRLIST_N_CACHED) { - assert(l->data == l->p); - } -} -#endif - -static void -ExprList_Init(ExprList *l) -{ - l->allocated = EXPRLIST_N_CACHED; - l->size = 0; - - /* Until we start allocating dynamically, p points to data. */ - l->p = l->data; - - ExprList_check_invariants(l); -} - -static int -ExprList_Append(ExprList *l, expr_ty exp) -{ - ExprList_check_invariants(l); - if (l->size >= l->allocated) { - /* We need to alloc (or realloc) the memory. */ - Py_ssize_t new_size = l->allocated * 2; - - /* See if we've ever allocated anything dynamically. */ - if (l->p == l->data) { - Py_ssize_t i; - /* We're still using the cached data. Switch to - alloc-ing. */ - l->p = PyMem_Malloc(sizeof(expr_ty) * new_size); - if (!l->p) { - return -1; - } - /* Copy the cached data into the new buffer. */ - for (i = 0; i < l->size; i++) { - l->p[i] = l->data[i]; - } - } else { - /* Just realloc. */ - expr_ty *tmp = PyMem_Realloc(l->p, sizeof(expr_ty) * new_size); - if (!tmp) { - PyMem_Free(l->p); - l->p = NULL; - return -1; - } - l->p = tmp; - } - - l->allocated = new_size; - assert(l->allocated == 2 * l->size); - } - - l->p[l->size++] = exp; - - ExprList_check_invariants(l); - return 0; -} - -static void -ExprList_Dealloc(ExprList *l) -{ - ExprList_check_invariants(l); - - /* If there's been an error, or we've never dynamically allocated, - do nothing. */ - if (!l->p || l->p == l->data) { - /* Do nothing. */ - } else { - /* We have dynamically allocated. Free the memory. */ - PyMem_Free(l->p); - } - l->p = NULL; - l->size = -1; -} - -static asdl_expr_seq * -ExprList_Finish(ExprList *l, PyArena *arena) -{ - asdl_expr_seq *seq; - - ExprList_check_invariants(l); - - /* Allocate the asdl_seq and copy the expressions in to it. */ - seq = _Py_asdl_expr_seq_new(l->size, arena); - if (seq) { - Py_ssize_t i; - for (i = 0; i < l->size; i++) { - asdl_seq_SET(seq, i, l->p[i]); - } - } - ExprList_Dealloc(l); - return seq; -} - -#ifdef NDEBUG -#define FstringParser_check_invariants(state) -#else -static void -FstringParser_check_invariants(FstringParser *state) -{ - if (state->last_str) { - assert(PyUnicode_CheckExact(state->last_str)); - } - ExprList_check_invariants(&state->expr_list); -} -#endif - -void -_PyPegen_FstringParser_Init(FstringParser *state) -{ - state->last_str = NULL; - state->fmode = 0; - ExprList_Init(&state->expr_list); - FstringParser_check_invariants(state); -} - -void -_PyPegen_FstringParser_Dealloc(FstringParser *state) -{ - FstringParser_check_invariants(state); - - Py_XDECREF(state->last_str); - ExprList_Dealloc(&state->expr_list); -} - -/* Make a Constant node, but decref the PyUnicode object being added. */ -static expr_ty -make_str_node_and_del(Parser *p, PyObject **str, Token* first_token, Token *last_token) -{ - PyObject *s = *str; - PyObject *kind = NULL; - *str = NULL; - assert(PyUnicode_CheckExact(s)); - if (_PyArena_AddPyObject(p->arena, s) < 0) { - Py_DECREF(s); - return NULL; - } - const char* the_str = PyBytes_AsString(first_token->bytes); - if (the_str && the_str[0] == 'u') { - kind = _PyPegen_new_identifier(p, "u"); - } - - if (kind == NULL && PyErr_Occurred()) { - return NULL; - } - - return _PyAST_Constant(s, kind, first_token->lineno, first_token->col_offset, - last_token->end_lineno, last_token->end_col_offset, - p->arena); - -} - - -/* Add a non-f-string (that is, a regular literal string). str is - decref'd. */ -int -_PyPegen_FstringParser_ConcatAndDel(FstringParser *state, PyObject *str) -{ - FstringParser_check_invariants(state); - - assert(PyUnicode_CheckExact(str)); - - if (PyUnicode_GET_LENGTH(str) == 0) { - Py_DECREF(str); - return 0; - } - - if (!state->last_str) { - /* We didn't have a string before, so just remember this one. */ - state->last_str = str; - } else { - /* Concatenate this with the previous string. */ - PyUnicode_AppendAndDel(&state->last_str, str); - if (!state->last_str) { - return -1; - } - } - FstringParser_check_invariants(state); - return 0; -} - -/* Parse an f-string. The f-string is in *str to end, with no - 'f' or quotes. */ -int -_PyPegen_FstringParser_ConcatFstring(Parser *p, FstringParser *state, const char **str, - const char *end, int raw, int recurse_lvl, - Token *first_token, Token* t, Token *last_token) -{ - FstringParser_check_invariants(state); - state->fmode = 1; - - /* Parse the f-string. */ - while (1) { - PyObject *literal = NULL; - PyObject *expr_text = NULL; - expr_ty expression = NULL; - - /* If there's a zero length literal in front of the - expression, literal will be NULL. If we're at the end of - the f-string, expression will be NULL (unless result == 1, - see below). */ - int result = fstring_find_literal_and_expr(p, str, end, raw, recurse_lvl, - &literal, &expr_text, - &expression, first_token, t, last_token); - if (result < 0) { - return -1; - } - - /* Add the literal, if any. */ - if (literal && _PyPegen_FstringParser_ConcatAndDel(state, literal) < 0) { - Py_XDECREF(expr_text); - return -1; - } - /* Add the expr_text, if any. */ - if (expr_text && _PyPegen_FstringParser_ConcatAndDel(state, expr_text) < 0) { - return -1; - } - - /* We've dealt with the literal and expr_text, their ownership has - been transferred to the state object. Don't look at them again. */ - - /* See if we should just loop around to get the next literal - and expression, while ignoring the expression this - time. This is used for un-doubling braces, as an - optimization. */ - if (result == 1) { - continue; - } - - if (!expression) { - /* We're done with this f-string. */ - break; - } - - /* We know we have an expression. Convert any existing string - to a Constant node. */ - 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) { - return -1; - } - } - - if (ExprList_Append(&state->expr_list, expression) < 0) { - return -1; - } - } - - /* If recurse_lvl is zero, then we must be at the end of the - string. Otherwise, we must be at a right brace. */ - - if (recurse_lvl == 0 && *str < end-1) { - RAISE_SYNTAX_ERROR("f-string: unexpected end of string"); - return -1; - } - if (recurse_lvl != 0 && **str != '}') { - RAISE_SYNTAX_ERROR("f-string: expecting '}'"); - return -1; - } - - FstringParser_check_invariants(state); - return 0; -} - -/* Convert the partial state reflected in last_str and expr_list to an - expr_ty. The expr_ty can be a Constant, or a JoinedStr. */ -expr_ty -_PyPegen_FstringParser_Finish(Parser *p, FstringParser *state, Token* first_token, - Token *last_token) -{ - asdl_expr_seq *seq; - - FstringParser_check_invariants(state); - - /* If we're just a constant string with no expressions, return - that. */ - if (!state->fmode) { - assert(!state->expr_list.size); - if (!state->last_str) { - /* Create a zero length string. */ - state->last_str = PyUnicode_FromStringAndSize(NULL, 0); - if (!state->last_str) { - goto error; + return NULL; } } - return make_str_node_and_del(p, &state->last_str, first_token, last_token); - } - - /* Create a Constant node out of last_str, if needed. It will be the - last node in our expression list. */ - if (state->last_str) { - expr_ty str = make_str_node_and_del(p, &state->last_str, first_token, last_token); - if (!str || ExprList_Append(&state->expr_list, str) < 0) { - goto error; + if (rawmode) { + return PyBytes_FromStringAndSize(s, len); } + return decode_bytes_with_escapes(p, s, len, t); } - /* This has already been freed. */ - assert(state->last_str == NULL); - - seq = ExprList_Finish(&state->expr_list, p->arena); - if (!seq) { - goto error; - } - - return _PyAST_JoinedStr(seq, first_token->lineno, first_token->col_offset, - last_token->end_lineno, last_token->end_col_offset, - p->arena); - -error: - _PyPegen_FstringParser_Dealloc(state); - return NULL; -} - -/* Given an f-string (with no 'f' or quotes) that's in *str and ends - at end, parse it into an expr_ty. Return NULL on error. Adjust - str to point past the parsed portion. */ -static expr_ty -fstring_parse(Parser *p, const char **str, const char *end, int raw, - int recurse_lvl, Token *first_token, Token* t, Token *last_token) -{ - FstringParser state; - - _PyPegen_FstringParser_Init(&state); - if (_PyPegen_FstringParser_ConcatFstring(p, &state, str, end, raw, recurse_lvl, - first_token, t, last_token) < 0) { - _PyPegen_FstringParser_Dealloc(&state); - return NULL; - } - - return _PyPegen_FstringParser_Finish(p, &state, t, t); + return _PyPegen_decode_string(p, rawmode, s, len, t); } diff --git a/Parser/string_parser.h b/Parser/string_parser.h index 4a22f3d3086f47..0b34de1b4e41e9 100644 --- a/Parser/string_parser.h +++ b/Parser/string_parser.h @@ -5,42 +5,7 @@ #include #include "pegen.h" -#define EXPRLIST_N_CACHED 64 - -typedef struct { - /* Incrementally build an array of expr_ty, so be used in an - asdl_seq. Cache some small but reasonably sized number of - expr_ty's, and then after that start dynamically allocating, - doubling the number allocated each time. Note that the f-string - f'{0}a{1}' contains 3 expr_ty's: 2 FormattedValue's, and one - Constant for the literal 'a'. So you add expr_ty's about twice as - fast as you add expressions in an f-string. */ - - Py_ssize_t allocated; /* Number we've allocated. */ - Py_ssize_t size; /* Number we've used. */ - expr_ty *p; /* Pointer to the memory we're actually - using. Will point to 'data' until we - start dynamically allocating. */ - expr_ty data[EXPRLIST_N_CACHED]; -} ExprList; - -/* The FstringParser is designed to add a mix of strings and - f-strings, and concat them together as needed. Ultimately, it - generates an expr_ty. */ -typedef struct { - PyObject *last_str; - ExprList expr_list; - int fmode; -} FstringParser; - -void _PyPegen_FstringParser_Init(FstringParser *); -int _PyPegen_parsestr(Parser *, int *, int *, PyObject **, - const char **, Py_ssize_t *, Token *); -int _PyPegen_FstringParser_ConcatFstring(Parser *, FstringParser *, const char **, - const char *, int, int, Token *, Token *, - Token *); -int _PyPegen_FstringParser_ConcatAndDel(FstringParser *, PyObject *); -expr_ty _PyPegen_FstringParser_Finish(Parser *, FstringParser *, Token *, Token *); -void _PyPegen_FstringParser_Dealloc(FstringParser *); +PyObject *_PyPegen_parse_string(Parser *, Token *); +PyObject *_PyPegen_decode_string(Parser *, int, const char *, size_t, Token *); #endif diff --git a/Parser/token.c b/Parser/token.c index 6299ad2f563144..82267fbfcd0c54 100644 --- a/Parser/token.c +++ b/Parser/token.c @@ -60,12 +60,16 @@ const char * const _PyParser_TokenNames[] = { "RARROW", "ELLIPSIS", "COLONEQUAL", + "EXCLAMATION", "OP", "AWAIT", "ASYNC", "TYPE_IGNORE", "TYPE_COMMENT", "SOFT_KEYWORD", + "FSTRING_START", + "FSTRING_MIDDLE", + "FSTRING_END", "", "", "", @@ -79,6 +83,7 @@ int _PyToken_OneChar(int c1) { switch (c1) { + case '!': return EXCLAMATION; case '%': return PERCENT; case '&': return AMPER; case '(': return LPAR; diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 463c0e00ca1411..1dfd2d6e5e1717 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -43,6 +43,28 @@ tok->lineno++; \ tok->col_offset = 0; +#ifdef Py_DEBUG +static inline tokenizer_mode* TOK_GET_MODE(struct tok_state* tok) { + assert(tok->tok_mode_stack_index >= 0); + assert(tok->tok_mode_stack_index < MAXLEVEL); + return &(tok->tok_mode_stack[tok->tok_mode_stack_index]); +} +static inline tokenizer_mode* TOK_NEXT_MODE(struct tok_state* tok) { + assert(tok->tok_mode_stack_index >= 0); + assert(tok->tok_mode_stack_index < MAXLEVEL); + return &(tok->tok_mode_stack[++tok->tok_mode_stack_index]); +} +static inline int *TOK_GET_BRACKET_MARK(tokenizer_mode* mode) { + assert(mode->bracket_mark_index >= 0); + assert(mode->bracket_mark_index < MAX_EXPR_NESTING); + return &(mode->bracket_mark[mode->bracket_mark_index]); +} +#else +#define TOK_GET_MODE(tok) (&(tok->tok_mode_stack[tok->tok_mode_stack_index])) +#define TOK_NEXT_MODE(tok) (&(tok->tok_mode_stack[++tok->tok_mode_stack_index])) +#define TOK_GET_BRACKET_MARK(mode) (&(mode->bracket_mark[mode->bracket_mark_index])) +#endif + /* Forward */ static struct tok_state *tok_new(void); static int tok_nextc(struct tok_state *tok); @@ -98,6 +120,9 @@ tok_new(void) tok->interactive_underflow = IUNDERFLOW_NORMAL; tok->str = NULL; tok->report_warnings = 1; + tok->tok_mode_stack[0] = (tokenizer_mode){.kind =TOK_REGULAR_MODE, .f_string_quote='\0', .f_string_quote_size = 0}; + tok->tok_mode_stack_index = 0; + tok->tok_report_warnings = 1; #ifdef Py_DEBUG tok->debug = _Py_GetConfig()->parser_debug; #endif @@ -346,6 +371,92 @@ tok_concatenate_interactive_new_line(struct tok_state *tok, const char *line) { } +/* Traverse and update all f-string buffers with the value */ +static void +update_fstring_buffers(struct tok_state *tok, char value, int regular, int multiline) +{ + int index; + tokenizer_mode *mode; + + for (index = tok->tok_mode_stack_index; index >= 0; --index) { + mode = &(tok->tok_mode_stack[index]); + if (regular && mode->f_string_start != NULL) { + mode->f_string_start += value; + } + if (multiline && mode->f_string_multi_line_start != NULL) { + mode->f_string_multi_line_start += value; + } + } +} + +static int +update_fstring_expr(struct tok_state *tok, char cur) +{ + assert(tok->cur != NULL); + + Py_ssize_t size = strlen(tok->cur); + tokenizer_mode *tok_mode = TOK_GET_MODE(tok); + + switch (cur) { + case '{': + if (tok_mode->last_expr_buffer != NULL) { + PyMem_Free(tok_mode->last_expr_buffer); + } + tok_mode->last_expr_buffer = PyMem_Malloc(size); + if (tok_mode->last_expr_buffer == NULL) { + tok->done = E_NOMEM; + return 0; + } + tok_mode->last_expr_size = size; + tok_mode->last_expr_end = -1; + strncpy(tok_mode->last_expr_buffer, tok->cur, size); + break; + case 0: + if (!tok_mode->last_expr_buffer || tok_mode->last_expr_end >= 0) { + return 1; + } + char *new_buffer = PyMem_Realloc( + tok_mode->last_expr_buffer, + tok_mode->last_expr_size + size + ); + if (new_buffer == NULL) { + PyMem_Free(tok_mode->last_expr_buffer); + tok->done = E_NOMEM; + return 0; + } + tok_mode->last_expr_buffer = new_buffer; + strncpy(tok_mode->last_expr_buffer + tok_mode->last_expr_size, tok->cur, size); + tok_mode->last_expr_size += size; + break; + case '}': + case '!': + case ':': + if (tok_mode->last_expr_end == -1) { + tok_mode->last_expr_end = strlen(tok->start); + } + break; + } + + return 1; +} + +static void +free_fstring_expressions(struct tok_state *tok) +{ + int index; + tokenizer_mode *mode; + + for (index = tok->tok_mode_stack_index; index >= 0; --index) { + mode = &(tok->tok_mode_stack[index]); + if (mode->last_expr_buffer != NULL) { + PyMem_Free(mode->last_expr_buffer); + mode->last_expr_buffer = NULL; + mode->last_expr_size = 0; + mode->last_expr_end = -1; + } + } +} + /* Read a line of text from TOK into S, using the stream in TOK. Return NULL on failure, else S. @@ -372,6 +483,7 @@ tok_reserve_buf(struct tok_state *tok, Py_ssize_t size) Py_ssize_t start = tok->start == NULL ? -1 : tok->start - tok->buf; Py_ssize_t line_start = tok->start == NULL ? -1 : tok->line_start - tok->buf; Py_ssize_t multi_line_start = tok->multi_line_start - tok->buf; + update_fstring_buffers(tok, -*tok->buf, /*regular=*/1, /*multiline=*/1); newbuf = (char *)PyMem_Realloc(newbuf, newsize); if (newbuf == NULL) { tok->done = E_NOMEM; @@ -384,6 +496,7 @@ tok_reserve_buf(struct tok_state *tok, Py_ssize_t size) tok->start = start < 0 ? NULL : tok->buf + start; tok->line_start = line_start < 0 ? NULL : tok->buf + line_start; tok->multi_line_start = multi_line_start < 0 ? NULL : tok->buf + multi_line_start; + update_fstring_buffers(tok, *tok->buf, /*regular=*/1, /*multiline=*/1); } return 1; } @@ -838,6 +951,7 @@ _PyTokenizer_Free(struct tok_state *tok) if (tok->interactive_src_start != NULL) { PyMem_Free(tok->interactive_src_start); } + free_fstring_expressions(tok); PyMem_Free(tok); } @@ -854,6 +968,9 @@ tok_readline_raw(struct tok_state *tok) if (line == NULL) { return 1; } + if (tok->tok_mode_stack_index && !update_fstring_expr(tok, 0)) { + return 0; + } if (tok->fp_interactive && tok_concatenate_interactive_new_line(tok, line) == -1) { return 0; @@ -941,6 +1058,7 @@ tok_underflow_interactive(struct tok_state *tok) { } else if (tok->start != NULL) { Py_ssize_t cur_multi_line_start = tok->multi_line_start - tok->buf; + update_fstring_buffers(tok, -*tok->buf, /*regular=*/0, /*multiline=*/1); size_t size = strlen(newtok); ADVANCE_LINENO(); if (!tok_reserve_buf(tok, size + 1)) { @@ -953,6 +1071,7 @@ tok_underflow_interactive(struct tok_state *tok) { PyMem_Free(newtok); tok->inp += size; tok->multi_line_start = tok->buf + cur_multi_line_start; + update_fstring_buffers(tok, *tok->buf, /*regular=*/0, /*multiline=*/1); } else { ADVANCE_LINENO(); @@ -969,6 +1088,10 @@ tok_underflow_interactive(struct tok_state *tok) { } return 0; } + + if (tok->tok_mode_stack_index && !update_fstring_expr(tok, 0)) { + return 0; + } return 1; } @@ -1073,7 +1196,7 @@ tok_nextc(struct tok_state *tok) return Py_CHARMASK(*tok->cur++); /* Fast path */ } if (tok->done != E_OK) { - return EOF; + return EOF; } if (tok->fp == NULL) { rc = tok_underflow_string(tok); @@ -1115,7 +1238,7 @@ tok_backup(struct tok_state *tok, int c) if (--tok->cur < tok->buf) { Py_FatalError("tokenizer beginning of buffer"); } - if ((int)(unsigned char)*tok->cur != c) { + if ((int)(unsigned char)*tok->cur != Py_CHARMASK(c)) { Py_FatalError("tok_backup: wrong character"); } tok->col_offset--; @@ -1172,6 +1295,7 @@ _syntaxerror_range(struct tok_state *tok, const char *format, static int syntaxerror(struct tok_state *tok, const char *format, ...) { + // This errors are cleaned on startup. Todo: Fix it. va_list vargs; va_start(vargs, format); int ret = _syntaxerror_range(tok, format, -1, -1, vargs); @@ -1234,6 +1358,41 @@ parser_warn(struct tok_state *tok, PyObject *category, const char *format, ...) return -1; } +static int +warn_invalid_escape_sequence(struct tok_state *tok, int first_invalid_escape_char) +{ + + if (!tok->tok_report_warnings) { + return 0; + } + + PyObject *msg = PyUnicode_FromFormat( + "invalid escape sequence '\\%c'", + (char) first_invalid_escape_char + ); + + if (msg == NULL) { + return -1; + } + + if (PyErr_WarnExplicitObject(PyExc_DeprecationWarning, msg, tok->filename, + tok->lineno, NULL, NULL) < 0) { + Py_DECREF(msg); + + if (PyErr_ExceptionMatches(PyExc_DeprecationWarning)) { + /* Replace the DeprecationWarning exception with a SyntaxError + to get a more accurate error report */ + PyErr_Clear(); + return syntaxerror(tok, "invalid escape sequence '\\%c'", (char) first_invalid_escape_char); + } + + return -1; + } + + Py_DECREF(msg); + return 0; +} + static int lookahead(struct tok_state *tok, const char *test) { @@ -1389,7 +1548,6 @@ tok_decimal_tail(struct tok_state *tok) return c; } -/* Get next token, after space stripping etc. */ static inline int tok_continuation_line(struct tok_state *tok) { @@ -1427,7 +1585,12 @@ token_setup(struct tok_state *tok, struct token *token, int type, const char *st { assert((start == NULL && end == NULL) || (start != NULL && end != NULL)); token->level = tok->level; - token->lineno = type == STRING ? tok->first_lineno : tok->lineno; + if (ISSTRINGLIT(type)) { + token->lineno = tok->first_lineno; + } + else { + token->lineno = tok->lineno; + } token->end_lineno = tok->lineno; token->col_offset = token->end_col_offset = -1; token->start = start; @@ -1441,7 +1604,7 @@ token_setup(struct tok_state *tok, struct token *token, int type, const char *st } static int -tok_get(struct tok_state *tok, struct token *token) +tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct token *token) { int c; int blankline, nonascii; @@ -1602,6 +1765,11 @@ tok_get(struct tok_state *tok, struct token *token) /* Skip comment, unless it's a type comment */ if (c == '#') { + + if (tok->tok_mode_stack_index > 0) { + return MAKE_TOKEN(syntaxerror(tok, "f-string expression part cannot include '#'")); + } + const char *prefix, *p, *type_start; int current_starting_col_offset; @@ -1703,6 +1871,9 @@ tok_get(struct tok_state *tok, struct token *token) } c = tok_nextc(tok); if (c == '"' || c == '\'') { + if (saw_f) { + goto f_string_quote; + } goto letter_quote; } } @@ -1748,7 +1919,9 @@ tok_get(struct tok_state *tok, struct token *token) int ahead_tok_kind; memcpy(&ahead_tok, tok, sizeof(ahead_tok)); - ahead_tok_kind = tok_get(&ahead_tok, &ahead_token); + ahead_tok_kind = tok_get_normal_mode(&ahead_tok, + current_tok, + &ahead_token); if (ahead_tok_kind == NAME && ahead_tok.cur - ahead_tok.start == 3 @@ -2003,6 +2176,67 @@ tok_get(struct tok_state *tok, struct token *token) return MAKE_TOKEN(NUMBER); } + f_string_quote: + if (((tolower(*tok->start) == 'f' || tolower(*tok->start) == 'r') && (c == '\'' || c == '"'))) { + int quote = c; + int quote_size = 1; /* 1 or 3 */ + + /* Nodes of type STRING, especially multi line strings + must be handled differently in order to get both + the starting line number and the column offset right. + (cf. issue 16806) */ + tok->first_lineno = tok->lineno; + tok->multi_line_start = tok->line_start; + + /* Find the quote size and start of string */ + int after_quote = tok_nextc(tok); + if (after_quote == quote) { + int after_after_quote = tok_nextc(tok); + if (after_after_quote == quote) { + quote_size = 3; + } + else { + // TODO: Check this + tok_backup(tok, after_after_quote); + tok_backup(tok, after_quote); + } + } + if (after_quote != quote) { + tok_backup(tok, after_quote); + } + + + p_start = tok->start; + p_end = tok->cur; + tokenizer_mode *current_tok = TOK_NEXT_MODE(tok); + current_tok->kind = TOK_FSTRING_MODE; + current_tok->f_string_quote = quote; + current_tok->f_string_quote_size = quote_size; + current_tok->f_string_start = tok->start; + current_tok->f_string_multi_line_start = tok->line_start; + current_tok->last_expr_buffer = NULL; + current_tok->last_expr_size = 0; + current_tok->last_expr_end = -1; + + switch (*tok->start) { + case 'F': + case 'f': + current_tok->f_string_raw = tolower(*(tok->start + 1)) == 'r'; + break; + case 'R': + case 'r': + current_tok->f_string_raw = 1; + break; + default: + Py_UNREACHABLE(); + } + + current_tok->bracket_stack = 0; + current_tok->bracket_mark[0] = 0; + current_tok->bracket_mark_index = -1; + return MAKE_TOKEN(FSTRING_START); + } + letter_quote: /* String */ if (c == '\'' || c == '"') { @@ -2047,6 +2281,20 @@ tok_get(struct tok_state *tok, struct token *token) tok->line_start = tok->multi_line_start; int start = tok->lineno; tok->lineno = tok->first_lineno; + + if (tok->tok_mode_stack_index > 0) { + /* When we are in an f-string, before raising the + * unterminated string literal error, check whether + * does the initial quote matches with f-strings quotes + * and if it is, then this must be a missing '}' token + * so raise the proper error */ + tokenizer_mode *current_tok = TOK_GET_MODE(tok); + if (current_tok->f_string_quote == quote && + current_tok->f_string_quote_size == quote_size) { + return MAKE_TOKEN(syntaxerror(tok, "f-string: expecting '}'", start)); + } + } + if (quote_size == 3) { syntaxerror(tok, "unterminated triple-quoted string literal" " (detected at line %d)", start); @@ -2089,6 +2337,27 @@ tok_get(struct tok_state *tok, struct token *token) goto again; /* Read next line */ } + /* Punctuation character */ + int is_punctuation = (c == ':' || c == '}' || c == '!' || c == '{'); + if (is_punctuation && tok->tok_mode_stack_index > 0 && current_tok->bracket_mark_index >= 0) { + int mark = *TOK_GET_BRACKET_MARK(current_tok); + /* This code block gets executed before the bracket_stack is incremented + * by the `{` case, so for ensuring that we are on the 0th level, we need + * to adjust it manually */ + int cursor = current_tok->bracket_stack - (c != '{'); + + if (cursor == 0 && !update_fstring_expr(tok, c)) { + return MAKE_TOKEN(ENDMARKER); + } + + if (c == ':' && cursor == mark) { + current_tok->kind = TOK_FSTRING_MODE; + p_start = tok->start; + p_end = tok->cur; + return MAKE_TOKEN(_PyToken_OneChar(c)); + } + } + /* Check for two-character token */ { int c2 = tok_nextc(tok); @@ -2121,11 +2390,18 @@ tok_get(struct tok_state *tok, struct token *token) tok->parenlinenostack[tok->level] = tok->lineno; tok->parencolstack[tok->level] = (int)(tok->start - tok->line_start); tok->level++; + + if (tok->tok_mode_stack_index > 0) { + current_tok->bracket_stack++; + } break; case ')': case ']': case '}': if (!tok->level) { + if (tok->tok_mode_stack_index > 0 && !current_tok->bracket_stack && c == '}') { + return MAKE_TOKEN(syntaxerror(tok, "f-string: single '}' is not allowed")); + } return MAKE_TOKEN(syntaxerror(tok, "unmatched '%c'", c)); } tok->level--; @@ -2134,6 +2410,18 @@ tok_get(struct tok_state *tok, struct token *token) (opening == '[' && c == ']') || (opening == '{' && c == '}'))) { + /* If the opening bracket belongs to an f-string's expression + part (e.g. f"{)}") and the closing bracket is an arbitrary + nested expression, then instead of matching a different + syntactical construct with it; we'll throw an unmatched + parentheses error. */ + if (tok->tok_mode_stack_index > 0 && opening == '{') { + assert(current_tok->bracket_stack >= 0); + int previous_bracket = current_tok->bracket_stack - 1; + if (previous_bracket == *TOK_GET_BRACKET_MARK(current_tok)) { + return MAKE_TOKEN(syntaxerror(tok, "f-string: unmatched '%c'", c)); + } + } if (tok->parenlinenostack[tok->level] != tok->lineno) { return MAKE_TOKEN(syntaxerror(tok, "closing parenthesis '%c' does not match " @@ -2147,6 +2435,14 @@ tok_get(struct tok_state *tok, struct token *token) c, opening)); } } + + if (tok->tok_mode_stack_index > 0) { + current_tok->bracket_stack--; + if (c == '}' && current_tok->bracket_stack == *TOK_GET_BRACKET_MARK(current_tok)) { + current_tok->bracket_mark_index--; + current_tok->kind = TOK_FSTRING_MODE; + } + } break; } @@ -2162,6 +2458,187 @@ tok_get(struct tok_state *tok, struct token *token) return MAKE_TOKEN(_PyToken_OneChar(c)); } +static int +tok_get_fstring_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct token *token) +{ + const char *p_start = NULL; + const char *p_end = NULL; + int end_quote_size = 0; + int unicode_escape = 0; + + tok->start = tok->cur; + tok->first_lineno = tok->lineno; + tok->starting_col_offset = tok->col_offset; + + // If we start with a bracket, we defer to the normal mode as there is nothing for us to tokenize + // before it. + int start_char = tok_nextc(tok); + int peek1 = tok_nextc(tok); + tok_backup(tok, peek1); + tok_backup(tok, start_char); + + if ((start_char == '{' && peek1 != '{') || (start_char == '}' && peek1 != '}')) { + if (start_char == '{') { + current_tok->bracket_mark_index++; + if (current_tok->bracket_mark_index >= MAX_EXPR_NESTING) { + return MAKE_TOKEN(syntaxerror(tok, "f-string: expressions nested too deeply")); + } + *TOK_GET_BRACKET_MARK(current_tok) = current_tok->bracket_stack; + } + TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; + return tok_get_normal_mode(tok, current_tok, token); + } + + // Check if we are at the end of the string + for (int i = 0; i < current_tok->f_string_quote_size; i++) { + int quote = tok_nextc(tok); + if (quote != current_tok->f_string_quote) { + tok_backup(tok, quote); + goto f_string_middle; + } + } + + if (current_tok->last_expr_buffer != NULL) { + PyMem_Free(current_tok->last_expr_buffer); + current_tok->last_expr_buffer = NULL; + current_tok->last_expr_size = 0; + current_tok->last_expr_end = -1; + } + + p_start = tok->start; + p_end = tok->cur; + tok->tok_mode_stack_index--; + return MAKE_TOKEN(FSTRING_END); + +f_string_middle: + + while (end_quote_size != current_tok->f_string_quote_size) { + int c = tok_nextc(tok); + if (c == EOF || (current_tok->f_string_quote_size == 1 && c == '\n')) { + assert(tok->multi_line_start != NULL); + // shift the tok_state's location into + // the start of string, and report the error + // from the initial quote character + tok->cur = (char *)current_tok->f_string_start; + tok->cur++; + tok->line_start = current_tok->f_string_multi_line_start; + int start = tok->lineno; + tok->lineno = tok->first_lineno; + + if (current_tok->f_string_quote_size == 3) { + return MAKE_TOKEN(syntaxerror(tok, + "unterminated triple-quoted f-string literal" + " (detected at line %d)", start)); + } + else { + return MAKE_TOKEN(syntaxerror(tok, + "unterminated f-string literal (detected at" + " line %d)", start)); + } + } + + if (c == current_tok->f_string_quote) { + end_quote_size += 1; + continue; + } else { + end_quote_size = 0; + } + + int in_format_spec = current_tok->last_expr_end != -1 && current_tok->bracket_mark_index >= 0; + if (c == '{') { + int peek = tok_nextc(tok); + if (peek != '{' || in_format_spec) { + tok_backup(tok, peek); + tok_backup(tok, c); + current_tok->bracket_mark_index++; + if (current_tok->bracket_mark_index >= MAX_EXPR_NESTING) { + return MAKE_TOKEN(syntaxerror(tok, "f-string: expressions nested too deeply")); + } + *TOK_GET_BRACKET_MARK(current_tok) = current_tok->bracket_stack; + TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; + p_start = tok->start; + p_end = tok->cur; + } else { + p_start = tok->start; + p_end = tok->cur - 1; + } + return MAKE_TOKEN(FSTRING_MIDDLE); + } else if (c == '}') { + if (unicode_escape) { + p_start = tok->start; + p_end = tok->cur; + return MAKE_TOKEN(FSTRING_MIDDLE); + } + int peek = tok_nextc(tok); + + // The tokenizer can only be in the format spec if we have already completed the expression + // scanning (indicated by the end of the expression being set) and we are not at the top level + // of the bracket stack (-1 is the top level). Since format specifiers can't legally use double + // brackets, we can bypass it here. + if (peek == '}' && !in_format_spec) { + p_start = tok->start; + p_end = tok->cur - 1; + } else { + tok_backup(tok, peek); + tok_backup(tok, c); + TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; + p_start = tok->start; + p_end = tok->cur; + } + return MAKE_TOKEN(FSTRING_MIDDLE); + } else if (c == '\\') { + int peek = tok_nextc(tok); + // Special case when the backslash is right before a curly + // brace. We have to restore and return the control back + // to the loop for the next iteration. + if (peek == '{' || peek == '}') { + if (!current_tok->f_string_raw) { + if (warn_invalid_escape_sequence(tok, peek)) { + return MAKE_TOKEN(ERRORTOKEN); + } + } + tok_backup(tok, peek); + continue; + } + + if (!current_tok->f_string_raw) { + if (peek == 'N') { + /* Handle named unicode escapes (\N{BULLET}) */ + peek = tok_nextc(tok); + if (peek == '{') { + unicode_escape = 1; + } else { + tok_backup(tok, peek); + } + } + } /* else { + skip the escaped character + }*/ + } + } + + // Backup the f-string quotes to emit a final FSTRING_MIDDLE and + // add the quotes to the FSTRING_END in the next tokenizer iteration. + for (int i = 0; i < current_tok->f_string_quote_size; i++) { + tok_backup(tok, current_tok->f_string_quote); + } + p_start = tok->start; + p_end = tok->cur; + return MAKE_TOKEN(FSTRING_MIDDLE); +} + + +static int +tok_get(struct tok_state *tok, struct token *token) +{ + tokenizer_mode *current_tok = TOK_GET_MODE(tok); + if (current_tok->kind == TOK_REGULAR_MODE) { + return tok_get_normal_mode(tok, current_tok, token); + } else { + return tok_get_fstring_mode(tok, current_tok, token); + } +} + int _PyTokenizer_Get(struct tok_state *tok, struct token *token) { diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h index 16a94d5f51d664..f67e0cd1ac2f4a 100644 --- a/Parser/tokenizer.h +++ b/Parser/tokenizer.h @@ -33,6 +33,31 @@ struct token { const char *start, *end; }; +enum tokenizer_mode_kind_t { + TOK_REGULAR_MODE, + TOK_FSTRING_MODE, +}; + +#define MAX_EXPR_NESTING 3 + +typedef struct _tokenizer_mode { + enum tokenizer_mode_kind_t kind; + + int bracket_stack; + int bracket_mark[MAX_EXPR_NESTING]; + int bracket_mark_index; + + char f_string_quote; + int f_string_quote_size; + int f_string_raw; + const char* f_string_start; + const char* f_string_multi_line_start; + + Py_ssize_t last_expr_size; + Py_ssize_t last_expr_end; + char* last_expr_buffer; +} tokenizer_mode; + /* Tokenizer state */ struct tok_state { /* Input state; buf <= cur <= inp <= end */ @@ -93,6 +118,10 @@ struct tok_state { /* How to proceed when asked for a new token in interactive mode */ enum interactive_underflow_t interactive_underflow; int report_warnings; + // TODO: Factor this into its own thing + tokenizer_mode tok_mode_stack[MAXLEVEL]; + int tok_mode_stack_index; + int tok_report_warnings; #ifdef Py_DEBUG int debug; #endif diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h index 4ac472a88261e1..cd9d1032629f49 100644 --- a/Programs/test_frozenmain.h +++ b/Programs/test_frozenmain.h @@ -27,12 +27,12 @@ unsigned char M_test_frozenmain[] = { 218,3,107,101,121,169,0,243,0,0,0,0,250,18,116,101, 115,116,95,102,114,111,122,101,110,109,97,105,110,46,112,121, 250,8,60,109,111,100,117,108,101,62,114,18,0,0,0,1, - 0,0,0,115,100,0,0,0,240,3,1,1,1,243,8,0, + 0,0,0,115,102,0,0,0,240,3,1,1,1,243,8,0, 1,11,219,0,24,225,0,5,208,6,26,212,0,27,217,0, 5,128,106,144,35,151,40,145,40,212,0,27,216,9,38,208, 9,26,215,9,38,209,9,38,211,9,40,168,24,209,9,50, 128,6,240,2,6,12,2,242,0,7,1,42,128,67,241,14, - 0,5,10,208,10,40,144,67,209,10,40,152,54,160,35,153, - 59,209,10,40,213,4,41,241,15,7,1,42,114,16,0,0, - 0, + 0,5,10,136,71,144,67,144,53,152,2,152,54,160,35,153, + 59,152,45,208,10,40,213,4,41,241,15,7,1,42,114,16, + 0,0,0, }; diff --git a/Python/Python-tokenize.c b/Python/Python-tokenize.c index 8daa9877254e2e..416dc5971bca3d 100644 --- a/Python/Python-tokenize.c +++ b/Python/Python-tokenize.c @@ -86,8 +86,8 @@ tokenizeriter_next(tokenizeriterobject *it) Py_DECREF(str); return NULL; } - const char *line_start = type == STRING ? it->tok->multi_line_start : it->tok->line_start; - int lineno = type == STRING ? it->tok->first_lineno : it->tok->lineno; + const char *line_start = ISSTRINGLIT(type) ? it->tok->multi_line_start : it->tok->line_start; + int lineno = ISSTRINGLIT(type) ? it->tok->first_lineno : it->tok->lineno; int end_lineno = it->tok->lineno; int col_offset = -1; int end_col_offset = -1; diff --git a/Tools/build/generate_token.py b/Tools/build/generate_token.py index fc12835b7762ad..3bd307c1733867 100755 --- a/Tools/build/generate_token.py +++ b/Tools/build/generate_token.py @@ -80,6 +80,8 @@ def update_file(file, content): (x) == NEWLINE || \\ (x) == INDENT || \\ (x) == DEDENT) +#define ISSTRINGLIT(x) ((x) == STRING || \\ + (x) == FSTRING_MIDDLE) // Symbols exported for test_peg_generator diff --git a/Tools/peg_generator/pegen/c_generator.py b/Tools/peg_generator/pegen/c_generator.py index e72ce7afdc4796..f57b6275f671d3 100644 --- a/Tools/peg_generator/pegen/c_generator.py +++ b/Tools/peg_generator/pegen/c_generator.py @@ -68,6 +68,7 @@ class NodeTypes(Enum): KEYWORD = 4 SOFT_KEYWORD = 5 CUT_OPERATOR = 6 + F_STRING_CHUNK = 7 BASE_NODETYPES = { From 5f7d68e48de19c5c3a241d7126fc2af227c2f74a Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Wed, 19 Apr 2023 11:53:34 -0600 Subject: [PATCH 210/349] gh-102856: Skip test_mismatched_parens in WASI builds (#103633) --- Lib/test/test_fstring.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index f571233da07b78..0e71de85f16b9c 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -13,6 +13,7 @@ import types import decimal import unittest +from test import support from test.support.os_helper import temp_cwd from test.support.script_helper import assert_python_failure @@ -536,6 +537,7 @@ def test_unterminated_string(self): r"""f'{("x}'""", ]) + @unittest.skipIf(support.is_wasi, "exhausts limited stack on WASI") def test_mismatched_parens(self): self.assertAllRaise(SyntaxError, r"closing parenthesis '\}' " r"does not match opening parenthesis '\('", From d4aa8578b18d12380c841de96e8f80cac52bf61a Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Wed, 19 Apr 2023 14:51:31 -0600 Subject: [PATCH 211/349] gh-102856: Clean some of the PEP 701 tokenizer implementation (#103634) --- Parser/tokenizer.c | 136 ++++++++++++++++++++++----------------------- Parser/tokenizer.h | 5 +- 2 files changed, 67 insertions(+), 74 deletions(-) diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 1dfd2d6e5e1717..f992e55dcac488 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -11,11 +11,6 @@ #include "tokenizer.h" #include "errcode.h" -#include "unicodeobject.h" -#include "bytesobject.h" -#include "fileobject.h" -#include "abstract.h" - /* Alternate tab spacing */ #define ALTTABSIZE 1 @@ -43,6 +38,8 @@ tok->lineno++; \ tok->col_offset = 0; +#define INSIDE_FSTRING(tok) (tok->tok_mode_stack_index > 0) +#define INSIDE_FSTRING_EXPR(tok) (tok->curly_bracket_expr_start_depth >= 0) #ifdef Py_DEBUG static inline tokenizer_mode* TOK_GET_MODE(struct tok_state* tok) { assert(tok->tok_mode_stack_index >= 0); @@ -54,15 +51,9 @@ static inline tokenizer_mode* TOK_NEXT_MODE(struct tok_state* tok) { assert(tok->tok_mode_stack_index < MAXLEVEL); return &(tok->tok_mode_stack[++tok->tok_mode_stack_index]); } -static inline int *TOK_GET_BRACKET_MARK(tokenizer_mode* mode) { - assert(mode->bracket_mark_index >= 0); - assert(mode->bracket_mark_index < MAX_EXPR_NESTING); - return &(mode->bracket_mark[mode->bracket_mark_index]); -} #else #define TOK_GET_MODE(tok) (&(tok->tok_mode_stack[tok->tok_mode_stack_index])) #define TOK_NEXT_MODE(tok) (&(tok->tok_mode_stack[++tok->tok_mode_stack_index])) -#define TOK_GET_BRACKET_MARK(mode) (&(mode->bracket_mark[mode->bracket_mark_index])) #endif /* Forward */ @@ -398,20 +389,7 @@ update_fstring_expr(struct tok_state *tok, char cur) tokenizer_mode *tok_mode = TOK_GET_MODE(tok); switch (cur) { - case '{': - if (tok_mode->last_expr_buffer != NULL) { - PyMem_Free(tok_mode->last_expr_buffer); - } - tok_mode->last_expr_buffer = PyMem_Malloc(size); - if (tok_mode->last_expr_buffer == NULL) { - tok->done = E_NOMEM; - return 0; - } - tok_mode->last_expr_size = size; - tok_mode->last_expr_end = -1; - strncpy(tok_mode->last_expr_buffer, tok->cur, size); - break; - case 0: + case 0: if (!tok_mode->last_expr_buffer || tok_mode->last_expr_end >= 0) { return 1; } @@ -421,13 +399,24 @@ update_fstring_expr(struct tok_state *tok, char cur) ); if (new_buffer == NULL) { PyMem_Free(tok_mode->last_expr_buffer); - tok->done = E_NOMEM; - return 0; + goto error; } tok_mode->last_expr_buffer = new_buffer; strncpy(tok_mode->last_expr_buffer + tok_mode->last_expr_size, tok->cur, size); tok_mode->last_expr_size += size; break; + case '{': + if (tok_mode->last_expr_buffer != NULL) { + PyMem_Free(tok_mode->last_expr_buffer); + } + tok_mode->last_expr_buffer = PyMem_Malloc(size); + if (tok_mode->last_expr_buffer == NULL) { + goto error; + } + tok_mode->last_expr_size = size; + tok_mode->last_expr_end = -1; + strncpy(tok_mode->last_expr_buffer, tok->cur, size); + break; case '}': case '!': case ':': @@ -435,9 +424,13 @@ update_fstring_expr(struct tok_state *tok, char cur) tok_mode->last_expr_end = strlen(tok->start); } break; + default: + Py_UNREACHABLE(); } - return 1; +error: + tok->done = E_NOMEM; + return 0; } static void @@ -1766,7 +1759,7 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t /* Skip comment, unless it's a type comment */ if (c == '#') { - if (tok->tok_mode_stack_index > 0) { + if (INSIDE_FSTRING(tok)) { return MAKE_TOKEN(syntaxerror(tok, "f-string expression part cannot include '#'")); } @@ -2208,32 +2201,31 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t p_start = tok->start; p_end = tok->cur; - tokenizer_mode *current_tok = TOK_NEXT_MODE(tok); - current_tok->kind = TOK_FSTRING_MODE; - current_tok->f_string_quote = quote; - current_tok->f_string_quote_size = quote_size; - current_tok->f_string_start = tok->start; - current_tok->f_string_multi_line_start = tok->line_start; - current_tok->last_expr_buffer = NULL; - current_tok->last_expr_size = 0; - current_tok->last_expr_end = -1; + tokenizer_mode *the_current_tok = TOK_NEXT_MODE(tok); + the_current_tok->kind = TOK_FSTRING_MODE; + the_current_tok->f_string_quote = quote; + the_current_tok->f_string_quote_size = quote_size; + the_current_tok->f_string_start = tok->start; + the_current_tok->f_string_multi_line_start = tok->line_start; + the_current_tok->last_expr_buffer = NULL; + the_current_tok->last_expr_size = 0; + the_current_tok->last_expr_end = -1; switch (*tok->start) { case 'F': case 'f': - current_tok->f_string_raw = tolower(*(tok->start + 1)) == 'r'; + the_current_tok->f_string_raw = tolower(*(tok->start + 1)) == 'r'; break; case 'R': case 'r': - current_tok->f_string_raw = 1; + the_current_tok->f_string_raw = 1; break; default: Py_UNREACHABLE(); } - current_tok->bracket_stack = 0; - current_tok->bracket_mark[0] = 0; - current_tok->bracket_mark_index = -1; + the_current_tok->curly_bracket_depth = 0; + the_current_tok->curly_bracket_expr_start_depth = -1; return MAKE_TOKEN(FSTRING_START); } @@ -2282,15 +2274,15 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t int start = tok->lineno; tok->lineno = tok->first_lineno; - if (tok->tok_mode_stack_index > 0) { + if (INSIDE_FSTRING(tok)) { /* When we are in an f-string, before raising the * unterminated string literal error, check whether * does the initial quote matches with f-strings quotes * and if it is, then this must be a missing '}' token * so raise the proper error */ - tokenizer_mode *current_tok = TOK_GET_MODE(tok); - if (current_tok->f_string_quote == quote && - current_tok->f_string_quote_size == quote_size) { + tokenizer_mode *the_current_tok = TOK_GET_MODE(tok); + if (the_current_tok->f_string_quote == quote && + the_current_tok->f_string_quote_size == quote_size) { return MAKE_TOKEN(syntaxerror(tok, "f-string: expecting '}'", start)); } } @@ -2339,18 +2331,17 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t /* Punctuation character */ int is_punctuation = (c == ':' || c == '}' || c == '!' || c == '{'); - if (is_punctuation && tok->tok_mode_stack_index > 0 && current_tok->bracket_mark_index >= 0) { - int mark = *TOK_GET_BRACKET_MARK(current_tok); - /* This code block gets executed before the bracket_stack is incremented + if (is_punctuation && INSIDE_FSTRING(tok) && INSIDE_FSTRING_EXPR(current_tok)) { + /* This code block gets executed before the curly_bracket_depth is incremented * by the `{` case, so for ensuring that we are on the 0th level, we need * to adjust it manually */ - int cursor = current_tok->bracket_stack - (c != '{'); + int cursor = current_tok->curly_bracket_depth - (c != '{'); if (cursor == 0 && !update_fstring_expr(tok, c)) { return MAKE_TOKEN(ENDMARKER); } - if (c == ':' && cursor == mark) { + if (c == ':' && cursor == current_tok->curly_bracket_expr_start_depth) { current_tok->kind = TOK_FSTRING_MODE; p_start = tok->start; p_end = tok->cur; @@ -2390,16 +2381,15 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t tok->parenlinenostack[tok->level] = tok->lineno; tok->parencolstack[tok->level] = (int)(tok->start - tok->line_start); tok->level++; - - if (tok->tok_mode_stack_index > 0) { - current_tok->bracket_stack++; + if (INSIDE_FSTRING(tok)) { + current_tok->curly_bracket_depth++; } break; case ')': case ']': case '}': if (!tok->level) { - if (tok->tok_mode_stack_index > 0 && !current_tok->bracket_stack && c == '}') { + if (INSIDE_FSTRING(tok) && !current_tok->curly_bracket_depth && c == '}') { return MAKE_TOKEN(syntaxerror(tok, "f-string: single '}' is not allowed")); } return MAKE_TOKEN(syntaxerror(tok, "unmatched '%c'", c)); @@ -2415,10 +2405,10 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t nested expression, then instead of matching a different syntactical construct with it; we'll throw an unmatched parentheses error. */ - if (tok->tok_mode_stack_index > 0 && opening == '{') { - assert(current_tok->bracket_stack >= 0); - int previous_bracket = current_tok->bracket_stack - 1; - if (previous_bracket == *TOK_GET_BRACKET_MARK(current_tok)) { + if (INSIDE_FSTRING(tok) && opening == '{') { + assert(current_tok->curly_bracket_depth >= 0); + int previous_bracket = current_tok->curly_bracket_depth - 1; + if (previous_bracket == current_tok->curly_bracket_expr_start_depth) { return MAKE_TOKEN(syntaxerror(tok, "f-string: unmatched '%c'", c)); } } @@ -2436,14 +2426,16 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t } } - if (tok->tok_mode_stack_index > 0) { - current_tok->bracket_stack--; - if (c == '}' && current_tok->bracket_stack == *TOK_GET_BRACKET_MARK(current_tok)) { - current_tok->bracket_mark_index--; + if (INSIDE_FSTRING(tok)) { + current_tok->curly_bracket_depth--; + if (c == '}' && current_tok->curly_bracket_depth == current_tok->curly_bracket_expr_start_depth) { + current_tok->curly_bracket_expr_start_depth--; current_tok->kind = TOK_FSTRING_MODE; } } break; + default: + break; } if (!Py_UNICODE_ISPRINTABLE(c)) { @@ -2479,11 +2471,10 @@ tok_get_fstring_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct if ((start_char == '{' && peek1 != '{') || (start_char == '}' && peek1 != '}')) { if (start_char == '{') { - current_tok->bracket_mark_index++; - if (current_tok->bracket_mark_index >= MAX_EXPR_NESTING) { + current_tok->curly_bracket_expr_start_depth++; + if (current_tok->curly_bracket_expr_start_depth >= MAX_EXPR_NESTING) { return MAKE_TOKEN(syntaxerror(tok, "f-string: expressions nested too deeply")); } - *TOK_GET_BRACKET_MARK(current_tok) = current_tok->bracket_stack; } TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; return tok_get_normal_mode(tok, current_tok, token); @@ -2544,17 +2535,20 @@ tok_get_fstring_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct end_quote_size = 0; } - int in_format_spec = current_tok->last_expr_end != -1 && current_tok->bracket_mark_index >= 0; + int in_format_spec = ( + current_tok->last_expr_end != -1 + && + INSIDE_FSTRING_EXPR(current_tok) + ); if (c == '{') { int peek = tok_nextc(tok); if (peek != '{' || in_format_spec) { tok_backup(tok, peek); tok_backup(tok, c); - current_tok->bracket_mark_index++; - if (current_tok->bracket_mark_index >= MAX_EXPR_NESTING) { + current_tok->curly_bracket_expr_start_depth++; + if (current_tok->curly_bracket_expr_start_depth >= MAX_EXPR_NESTING) { return MAKE_TOKEN(syntaxerror(tok, "f-string: expressions nested too deeply")); } - *TOK_GET_BRACKET_MARK(current_tok) = current_tok->bracket_stack; TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; p_start = tok->start; p_end = tok->cur; diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h index f67e0cd1ac2f4a..b75e4e8293d3d6 100644 --- a/Parser/tokenizer.h +++ b/Parser/tokenizer.h @@ -43,9 +43,8 @@ enum tokenizer_mode_kind_t { typedef struct _tokenizer_mode { enum tokenizer_mode_kind_t kind; - int bracket_stack; - int bracket_mark[MAX_EXPR_NESTING]; - int bracket_mark_index; + int curly_bracket_depth; + int curly_bracket_expr_start_depth; char f_string_quote; int f_string_quote_size; From 2b1260c55763a952c57b92fe0f274b6ee79efd05 Mon Sep 17 00:00:00 2001 From: Alexander Belopolsky Date: Wed, 19 Apr 2023 17:02:29 -0400 Subject: [PATCH 212/349] gh-83861: Fix datetime.astimezone() method (GH-101545) --- Lib/datetime.py | 5 +++++ Lib/test/datetimetester.py | 4 ++++ ...23-02-06-16-45-18.gh-issue-83861.mMbIU3.rst | 4 ++++ Modules/_datetimemodule.c | 18 ++++++++++++++++-- 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-02-06-16-45-18.gh-issue-83861.mMbIU3.rst diff --git a/Lib/datetime.py b/Lib/datetime.py index 637144637485bc..09a2d2d5381c34 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -1965,6 +1965,11 @@ def replace(self, year=None, month=None, day=None, hour=None, def _local_timezone(self): if self.tzinfo is None: ts = self._mktime() + # Detect gap + ts2 = self.replace(fold=1-self.fold)._mktime() + if ts2 != ts: # This happens in a gap or a fold + if (ts2 > ts) == self.fold: + ts = ts2 else: ts = (self - _EPOCH) // timedelta(seconds=1) localtm = _time.localtime(ts) diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 570f803918c1ef..477f16f1841f62 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -6212,6 +6212,10 @@ def test_system_transitions(self): ts1 = dt.replace(fold=1).timestamp() self.assertEqual(ts0, s0 + ss / 2) self.assertEqual(ts1, s0 - ss / 2) + # gh-83861 + utc0 = dt.astimezone(timezone.utc) + utc1 = dt.replace(fold=1).astimezone(timezone.utc) + self.assertEqual(utc0, utc1 + timedelta(0, ss)) finally: if TZ is None: del os.environ['TZ'] diff --git a/Misc/NEWS.d/next/Library/2023-02-06-16-45-18.gh-issue-83861.mMbIU3.rst b/Misc/NEWS.d/next/Library/2023-02-06-16-45-18.gh-issue-83861.mMbIU3.rst new file mode 100644 index 00000000000000..e85e7a4ff2e73a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-02-06-16-45-18.gh-issue-83861.mMbIU3.rst @@ -0,0 +1,4 @@ +Fix datetime.astimezone method return value when invoked on a naive datetime +instance that represents local time falling in a timezone transition gap. +PEP 495 requires that instances with fold=1 produce earlier times than those +with fold=0 in this case. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index eda8c5610ba659..f317dc14e15bf1 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -6153,17 +6153,31 @@ local_to_seconds(int year, int month, int day, static PyObject * local_timezone_from_local(PyDateTime_DateTime *local_dt) { - long long seconds; + long long seconds, seconds2; time_t timestamp; + int fold = DATE_GET_FOLD(local_dt); seconds = local_to_seconds(GET_YEAR(local_dt), GET_MONTH(local_dt), GET_DAY(local_dt), DATE_GET_HOUR(local_dt), DATE_GET_MINUTE(local_dt), DATE_GET_SECOND(local_dt), - DATE_GET_FOLD(local_dt)); + fold); if (seconds == -1) return NULL; + seconds2 = local_to_seconds(GET_YEAR(local_dt), + GET_MONTH(local_dt), + GET_DAY(local_dt), + DATE_GET_HOUR(local_dt), + DATE_GET_MINUTE(local_dt), + DATE_GET_SECOND(local_dt), + !fold); + if (seconds2 == -1) + return NULL; + /* Detect gap */ + if (seconds2 != seconds && (seconds2 > seconds) == fold) + seconds = seconds2; + /* XXX: add bounds check */ timestamp = seconds - epoch; return local_timezone_from_timestamp(timestamp); From 6be7aee18c5b8e639103df951d0d277f4b46f902 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Wed, 19 Apr 2023 16:09:35 -0600 Subject: [PATCH 213/349] gh-98040: Move the Single-Phase Init Tests Out of test_imp (gh-102561) I recently added some tests to test_imp, but @warsaw is removing that file in gh-98573. The tests are worth keeping so here I'm moving them to test_import. --- Lib/test/test_imp.py | 840 ------------------------------ Lib/test/test_import/__init__.py | 868 ++++++++++++++++++++++++++++++- 2 files changed, 865 insertions(+), 843 deletions(-) diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py index 03e3adba221e57..80abc720c3251a 100644 --- a/Lib/test/test_imp.py +++ b/Lib/test/test_imp.py @@ -1,5 +1,4 @@ import gc -import json import importlib import importlib.util import os @@ -11,28 +10,15 @@ from test.support import os_helper from test.support import script_helper from test.support import warnings_helper -import textwrap -import types import unittest import warnings imp = warnings_helper.import_deprecated('imp') import _imp -import _testinternalcapi -try: - import _xxsubinterpreters as _interpreters -except ModuleNotFoundError: - _interpreters = None OS_PATH_NAME = os.path.__name__ -def requires_subinterpreters(meth): - """Decorator to skip a test if subinterpreters are not supported.""" - return unittest.skipIf(_interpreters is None, - 'subinterpreters required')(meth) - - def requires_load_dynamic(meth): """Decorator to skip a test if not running under CPython or lacking imp.load_dynamic().""" @@ -41,169 +27,6 @@ def requires_load_dynamic(meth): 'imp.load_dynamic() required')(meth) -class ModuleSnapshot(types.SimpleNamespace): - """A representation of a module for testing. - - Fields: - - * id - the module's object ID - * module - the actual module or an adequate substitute - * __file__ - * __spec__ - * name - * origin - * ns - a copy (dict) of the module's __dict__ (or None) - * ns_id - the object ID of the module's __dict__ - * cached - the sys.modules[mod.__spec__.name] entry (or None) - * cached_id - the object ID of the sys.modules entry (or None) - - In cases where the value is not available (e.g. due to serialization), - the value will be None. - """ - _fields = tuple('id module ns ns_id cached cached_id'.split()) - - @classmethod - def from_module(cls, mod): - name = mod.__spec__.name - cached = sys.modules.get(name) - return cls( - id=id(mod), - module=mod, - ns=types.SimpleNamespace(**mod.__dict__), - ns_id=id(mod.__dict__), - cached=cached, - cached_id=id(cached), - ) - - SCRIPT = textwrap.dedent(''' - {imports} - - name = {name!r} - - {prescript} - - mod = {name} - - {body} - - {postscript} - ''') - IMPORTS = textwrap.dedent(''' - import sys - ''').strip() - SCRIPT_BODY = textwrap.dedent(''' - # Capture the snapshot data. - cached = sys.modules.get(name) - snapshot = dict( - id=id(mod), - module=dict( - __file__=mod.__file__, - __spec__=dict( - name=mod.__spec__.name, - origin=mod.__spec__.origin, - ), - ), - ns=None, - ns_id=id(mod.__dict__), - cached=None, - cached_id=id(cached) if cached else None, - ) - ''').strip() - CLEANUP_SCRIPT = textwrap.dedent(''' - # Clean up the module. - sys.modules.pop(name, None) - ''').strip() - - @classmethod - def build_script(cls, name, *, - prescript=None, - import_first=False, - postscript=None, - postcleanup=False, - ): - if postcleanup is True: - postcleanup = cls.CLEANUP_SCRIPT - elif isinstance(postcleanup, str): - postcleanup = textwrap.dedent(postcleanup).strip() - postcleanup = cls.CLEANUP_SCRIPT + os.linesep + postcleanup - else: - postcleanup = '' - prescript = textwrap.dedent(prescript).strip() if prescript else '' - postscript = textwrap.dedent(postscript).strip() if postscript else '' - - if postcleanup: - if postscript: - postscript = postscript + os.linesep * 2 + postcleanup - else: - postscript = postcleanup - - if import_first: - prescript += textwrap.dedent(f''' - - # Now import the module. - assert name not in sys.modules - import {name}''') - - return cls.SCRIPT.format( - imports=cls.IMPORTS.strip(), - name=name, - prescript=prescript.strip(), - body=cls.SCRIPT_BODY.strip(), - postscript=postscript, - ) - - @classmethod - def parse(cls, text): - raw = json.loads(text) - mod = raw['module'] - mod['__spec__'] = types.SimpleNamespace(**mod['__spec__']) - raw['module'] = types.SimpleNamespace(**mod) - return cls(**raw) - - @classmethod - def from_subinterp(cls, name, interpid=None, *, pipe=None, **script_kwds): - if pipe is not None: - return cls._from_subinterp(name, interpid, pipe, script_kwds) - pipe = os.pipe() - try: - return cls._from_subinterp(name, interpid, pipe, script_kwds) - finally: - r, w = pipe - os.close(r) - os.close(w) - - @classmethod - def _from_subinterp(cls, name, interpid, pipe, script_kwargs): - r, w = pipe - - # Build the script. - postscript = textwrap.dedent(f''' - # Send the result over the pipe. - import json - import os - os.write({w}, json.dumps(snapshot).encode()) - - ''') - _postscript = script_kwargs.get('postscript') - if _postscript: - _postscript = textwrap.dedent(_postscript).lstrip() - postscript += _postscript - script_kwargs['postscript'] = postscript.strip() - script = cls.build_script(name, **script_kwargs) - - # Run the script. - if interpid is None: - ret = support.run_in_subinterp(script) - if ret != 0: - raise AssertionError(f'{ret} != 0') - else: - _interpreters.run_string(interpid, script) - - # Parse the results. - text = os.read(r, 1000) - return cls.parse(text.decode()) - - class LockTests(unittest.TestCase): """Very basic test of import lock functions.""" @@ -620,669 +443,6 @@ def check_get_builtins(): check_get_builtins() -class TestSinglePhaseSnapshot(ModuleSnapshot): - - @classmethod - def from_module(cls, mod): - self = super().from_module(mod) - self.summed = mod.sum(1, 2) - self.lookedup = mod.look_up_self() - self.lookedup_id = id(self.lookedup) - self.state_initialized = mod.state_initialized() - if hasattr(mod, 'initialized_count'): - self.init_count = mod.initialized_count() - return self - - SCRIPT_BODY = ModuleSnapshot.SCRIPT_BODY + textwrap.dedent(f''' - snapshot['module'].update(dict( - int_const=mod.int_const, - str_const=mod.str_const, - _module_initialized=mod._module_initialized, - )) - snapshot.update(dict( - summed=mod.sum(1, 2), - lookedup_id=id(mod.look_up_self()), - state_initialized=mod.state_initialized(), - init_count=mod.initialized_count(), - has_spam=hasattr(mod, 'spam'), - spam=getattr(mod, 'spam', None), - )) - ''').rstrip() - - @classmethod - def parse(cls, text): - self = super().parse(text) - if not self.has_spam: - del self.spam - del self.has_spam - return self - - -@requires_load_dynamic -class SinglephaseInitTests(unittest.TestCase): - - NAME = '_testsinglephase' - - @classmethod - def setUpClass(cls): - if '-R' in sys.argv or '--huntrleaks' in sys.argv: - # https://github.com/python/cpython/issues/102251 - raise unittest.SkipTest('unresolved refleaks (see gh-102251)') - fileobj, filename, _ = imp.find_module(cls.NAME) - fileobj.close() - cls.FILE = filename - - # Start fresh. - cls.clean_up() - - def tearDown(self): - # Clean up the module. - self.clean_up() - - @classmethod - def clean_up(cls): - name = cls.NAME - filename = cls.FILE - if name in sys.modules: - if hasattr(sys.modules[name], '_clear_globals'): - assert sys.modules[name].__file__ == filename - sys.modules[name]._clear_globals() - del sys.modules[name] - # Clear all internally cached data for the extension. - _testinternalcapi.clear_extension(name, filename) - - ######################### - # helpers - - def add_module_cleanup(self, name): - def clean_up(): - # Clear all internally cached data for the extension. - _testinternalcapi.clear_extension(name, self.FILE) - self.addCleanup(clean_up) - - def load(self, name): - try: - already_loaded = self.already_loaded - except AttributeError: - already_loaded = self.already_loaded = {} - assert name not in already_loaded - mod = imp.load_dynamic(name, self.FILE) - self.assertNotIn(mod, already_loaded.values()) - already_loaded[name] = mod - return types.SimpleNamespace( - name=name, - module=mod, - snapshot=TestSinglePhaseSnapshot.from_module(mod), - ) - - def re_load(self, name, mod): - assert sys.modules[name] is mod - assert mod.__dict__ == mod.__dict__ - reloaded = imp.load_dynamic(name, self.FILE) - return types.SimpleNamespace( - name=name, - module=reloaded, - snapshot=TestSinglePhaseSnapshot.from_module(reloaded), - ) - - # subinterpreters - - def add_subinterpreter(self): - interpid = _interpreters.create(isolated=False) - _interpreters.run_string(interpid, textwrap.dedent(''' - import sys - import _testinternalcapi - ''')) - def clean_up(): - _interpreters.run_string(interpid, textwrap.dedent(f''' - name = {self.NAME!r} - if name in sys.modules: - sys.modules[name]._clear_globals() - _testinternalcapi.clear_extension(name, {self.FILE!r}) - ''')) - _interpreters.destroy(interpid) - self.addCleanup(clean_up) - return interpid - - def import_in_subinterp(self, interpid=None, *, - postscript=None, - postcleanup=False, - ): - name = self.NAME - - if postcleanup: - import_ = 'import _testinternalcapi' if interpid is None else '' - postcleanup = f''' - {import_} - mod._clear_globals() - _testinternalcapi.clear_extension(name, {self.FILE!r}) - ''' - - try: - pipe = self._pipe - except AttributeError: - r, w = pipe = self._pipe = os.pipe() - self.addCleanup(os.close, r) - self.addCleanup(os.close, w) - - snapshot = TestSinglePhaseSnapshot.from_subinterp( - name, - interpid, - pipe=pipe, - import_first=True, - postscript=postscript, - postcleanup=postcleanup, - ) - - return types.SimpleNamespace( - name=name, - module=None, - snapshot=snapshot, - ) - - # checks - - def check_common(self, loaded): - isolated = False - - mod = loaded.module - if not mod: - # It came from a subinterpreter. - isolated = True - mod = loaded.snapshot.module - # mod.__name__ might not match, but the spec will. - self.assertEqual(mod.__spec__.name, loaded.name) - self.assertEqual(mod.__file__, self.FILE) - self.assertEqual(mod.__spec__.origin, self.FILE) - if not isolated: - self.assertTrue(issubclass(mod.error, Exception)) - self.assertEqual(mod.int_const, 1969) - self.assertEqual(mod.str_const, 'something different') - self.assertIsInstance(mod._module_initialized, float) - self.assertGreater(mod._module_initialized, 0) - - snap = loaded.snapshot - self.assertEqual(snap.summed, 3) - if snap.state_initialized is not None: - self.assertIsInstance(snap.state_initialized, float) - self.assertGreater(snap.state_initialized, 0) - if isolated: - # The "looked up" module is interpreter-specific - # (interp->imports.modules_by_index was set for the module). - self.assertEqual(snap.lookedup_id, snap.id) - self.assertEqual(snap.cached_id, snap.id) - with self.assertRaises(AttributeError): - snap.spam - else: - self.assertIs(snap.lookedup, mod) - self.assertIs(snap.cached, mod) - - def check_direct(self, loaded): - # The module has its own PyModuleDef, with a matching name. - self.assertEqual(loaded.module.__name__, loaded.name) - self.assertIs(loaded.snapshot.lookedup, loaded.module) - - def check_indirect(self, loaded, orig): - # The module re-uses another's PyModuleDef, with a different name. - assert orig is not loaded.module - assert orig.__name__ != loaded.name - self.assertNotEqual(loaded.module.__name__, loaded.name) - self.assertIs(loaded.snapshot.lookedup, loaded.module) - - def check_basic(self, loaded, expected_init_count): - # m_size == -1 - # The module loads fresh the first time and copies m_copy after. - snap = loaded.snapshot - self.assertIsNot(snap.state_initialized, None) - self.assertIsInstance(snap.init_count, int) - self.assertGreater(snap.init_count, 0) - self.assertEqual(snap.init_count, expected_init_count) - - def check_with_reinit(self, loaded): - # m_size >= 0 - # The module loads fresh every time. - pass - - def check_fresh(self, loaded): - """ - The module had not been loaded before (at least since fully reset). - """ - snap = loaded.snapshot - # The module's init func was run. - # A copy of the module's __dict__ was stored in def->m_base.m_copy. - # The previous m_copy was deleted first. - # _PyRuntime.imports.extensions was set. - self.assertEqual(snap.init_count, 1) - # The global state was initialized. - # The module attrs were initialized from that state. - self.assertEqual(snap.module._module_initialized, - snap.state_initialized) - - def check_semi_fresh(self, loaded, base, prev): - """ - The module had been loaded before and then reset - (but the module global state wasn't). - """ - snap = loaded.snapshot - # The module's init func was run again. - # A copy of the module's __dict__ was stored in def->m_base.m_copy. - # The previous m_copy was deleted first. - # The module globals did not get reset. - self.assertNotEqual(snap.id, base.snapshot.id) - self.assertNotEqual(snap.id, prev.snapshot.id) - self.assertEqual(snap.init_count, prev.snapshot.init_count + 1) - # The global state was updated. - # The module attrs were initialized from that state. - self.assertEqual(snap.module._module_initialized, - snap.state_initialized) - self.assertNotEqual(snap.state_initialized, - base.snapshot.state_initialized) - self.assertNotEqual(snap.state_initialized, - prev.snapshot.state_initialized) - - def check_copied(self, loaded, base): - """ - The module had been loaded before and never reset. - """ - snap = loaded.snapshot - # The module's init func was not run again. - # The interpreter copied m_copy, as set by the other interpreter, - # with objects owned by the other interpreter. - # The module globals did not get reset. - self.assertNotEqual(snap.id, base.snapshot.id) - self.assertEqual(snap.init_count, base.snapshot.init_count) - # The global state was not updated since the init func did not run. - # The module attrs were not directly initialized from that state. - # The state and module attrs still match the previous loading. - self.assertEqual(snap.module._module_initialized, - snap.state_initialized) - self.assertEqual(snap.state_initialized, - base.snapshot.state_initialized) - - ######################### - # the tests - - def test_cleared_globals(self): - loaded = self.load(self.NAME) - _testsinglephase = loaded.module - init_before = _testsinglephase.state_initialized() - - _testsinglephase._clear_globals() - init_after = _testsinglephase.state_initialized() - init_count = _testsinglephase.initialized_count() - - self.assertGreater(init_before, 0) - self.assertEqual(init_after, 0) - self.assertEqual(init_count, -1) - - def test_variants(self): - # Exercise the most meaningful variants described in Python/import.c. - self.maxDiff = None - - # Check the "basic" module. - - name = self.NAME - expected_init_count = 1 - with self.subTest(name): - loaded = self.load(name) - - self.check_common(loaded) - self.check_direct(loaded) - self.check_basic(loaded, expected_init_count) - basic = loaded.module - - # Check its indirect variants. - - name = f'{self.NAME}_basic_wrapper' - self.add_module_cleanup(name) - expected_init_count += 1 - with self.subTest(name): - loaded = self.load(name) - - self.check_common(loaded) - self.check_indirect(loaded, basic) - self.check_basic(loaded, expected_init_count) - - # Currently PyState_AddModule() always replaces the cached module. - self.assertIs(basic.look_up_self(), loaded.module) - self.assertEqual(basic.initialized_count(), expected_init_count) - - # The cached module shouldn't change after this point. - basic_lookedup = loaded.module - - # Check its direct variant. - - name = f'{self.NAME}_basic_copy' - self.add_module_cleanup(name) - expected_init_count += 1 - with self.subTest(name): - loaded = self.load(name) - - self.check_common(loaded) - self.check_direct(loaded) - self.check_basic(loaded, expected_init_count) - - # This should change the cached module for _testsinglephase. - self.assertIs(basic.look_up_self(), basic_lookedup) - self.assertEqual(basic.initialized_count(), expected_init_count) - - # Check the non-basic variant that has no state. - - name = f'{self.NAME}_with_reinit' - self.add_module_cleanup(name) - with self.subTest(name): - loaded = self.load(name) - - self.check_common(loaded) - self.assertIs(loaded.snapshot.state_initialized, None) - self.check_direct(loaded) - self.check_with_reinit(loaded) - - # This should change the cached module for _testsinglephase. - self.assertIs(basic.look_up_self(), basic_lookedup) - self.assertEqual(basic.initialized_count(), expected_init_count) - - # Check the basic variant that has state. - - name = f'{self.NAME}_with_state' - self.add_module_cleanup(name) - with self.subTest(name): - loaded = self.load(name) - - self.check_common(loaded) - self.assertIsNot(loaded.snapshot.state_initialized, None) - self.check_direct(loaded) - self.check_with_reinit(loaded) - - # This should change the cached module for _testsinglephase. - self.assertIs(basic.look_up_self(), basic_lookedup) - self.assertEqual(basic.initialized_count(), expected_init_count) - - def test_basic_reloaded(self): - # m_copy is copied into the existing module object. - # Global state is not changed. - self.maxDiff = None - - for name in [ - self.NAME, # the "basic" module - f'{self.NAME}_basic_wrapper', # the indirect variant - f'{self.NAME}_basic_copy', # the direct variant - ]: - self.add_module_cleanup(name) - with self.subTest(name): - loaded = self.load(name) - reloaded = self.re_load(name, loaded.module) - - self.check_common(loaded) - self.check_common(reloaded) - - # Make sure the original __dict__ did not get replaced. - self.assertEqual(id(loaded.module.__dict__), - loaded.snapshot.ns_id) - self.assertEqual(loaded.snapshot.ns.__dict__, - loaded.module.__dict__) - - self.assertEqual(reloaded.module.__spec__.name, reloaded.name) - self.assertEqual(reloaded.module.__name__, - reloaded.snapshot.ns.__name__) - - self.assertIs(reloaded.module, loaded.module) - self.assertIs(reloaded.module.__dict__, loaded.module.__dict__) - # It only happens to be the same but that's good enough here. - # We really just want to verify that the re-loaded attrs - # didn't change. - self.assertIs(reloaded.snapshot.lookedup, - loaded.snapshot.lookedup) - self.assertEqual(reloaded.snapshot.state_initialized, - loaded.snapshot.state_initialized) - self.assertEqual(reloaded.snapshot.init_count, - loaded.snapshot.init_count) - - self.assertIs(reloaded.snapshot.cached, reloaded.module) - - def test_with_reinit_reloaded(self): - # The module's m_init func is run again. - self.maxDiff = None - - # Keep a reference around. - basic = self.load(self.NAME) - - for name in [ - f'{self.NAME}_with_reinit', # m_size == 0 - f'{self.NAME}_with_state', # m_size > 0 - ]: - self.add_module_cleanup(name) - with self.subTest(name): - loaded = self.load(name) - reloaded = self.re_load(name, loaded.module) - - self.check_common(loaded) - self.check_common(reloaded) - - # Make sure the original __dict__ did not get replaced. - self.assertEqual(id(loaded.module.__dict__), - loaded.snapshot.ns_id) - self.assertEqual(loaded.snapshot.ns.__dict__, - loaded.module.__dict__) - - self.assertEqual(reloaded.module.__spec__.name, reloaded.name) - self.assertEqual(reloaded.module.__name__, - reloaded.snapshot.ns.__name__) - - self.assertIsNot(reloaded.module, loaded.module) - self.assertNotEqual(reloaded.module.__dict__, - loaded.module.__dict__) - self.assertIs(reloaded.snapshot.lookedup, reloaded.module) - if loaded.snapshot.state_initialized is None: - self.assertIs(reloaded.snapshot.state_initialized, None) - else: - self.assertGreater(reloaded.snapshot.state_initialized, - loaded.snapshot.state_initialized) - - self.assertIs(reloaded.snapshot.cached, reloaded.module) - - # Currently, for every single-phrase init module loaded - # in multiple interpreters, those interpreters share a - # PyModuleDef for that object, which can be a problem. - # Also, we test with a single-phase module that has global state, - # which is shared by all interpreters. - - @requires_subinterpreters - def test_basic_multiple_interpreters_main_no_reset(self): - # without resetting; already loaded in main interpreter - - # At this point: - # * alive in 0 interpreters - # * module def may or may not be loaded already - # * module def not in _PyRuntime.imports.extensions - # * mod init func has not run yet (since reset, at least) - # * m_copy not set (hasn't been loaded yet or already cleared) - # * module's global state has not been initialized yet - # (or already cleared) - - main_loaded = self.load(self.NAME) - _testsinglephase = main_loaded.module - # Attrs set after loading are not in m_copy. - _testsinglephase.spam = 'spam, spam, spam, spam, eggs, and spam' - - self.check_common(main_loaded) - self.check_fresh(main_loaded) - - interpid1 = self.add_subinterpreter() - interpid2 = self.add_subinterpreter() - - # At this point: - # * alive in 1 interpreter (main) - # * module def in _PyRuntime.imports.extensions - # * mod init func ran for the first time (since reset, at least) - # * m_copy was copied from the main interpreter (was NULL) - # * module's global state was initialized - - # Use an interpreter that gets destroyed right away. - loaded = self.import_in_subinterp() - self.check_common(loaded) - self.check_copied(loaded, main_loaded) - - # At this point: - # * alive in 1 interpreter (main) - # * module def still in _PyRuntime.imports.extensions - # * mod init func ran again - # * m_copy is NULL (claered when the interpreter was destroyed) - # (was from main interpreter) - # * module's global state was updated, not reset - - # Use a subinterpreter that sticks around. - loaded = self.import_in_subinterp(interpid1) - self.check_common(loaded) - self.check_copied(loaded, main_loaded) - - # At this point: - # * alive in 2 interpreters (main, interp1) - # * module def still in _PyRuntime.imports.extensions - # * mod init func ran again - # * m_copy was copied from interp1 - # * module's global state was updated, not reset - - # Use a subinterpreter while the previous one is still alive. - loaded = self.import_in_subinterp(interpid2) - self.check_common(loaded) - self.check_copied(loaded, main_loaded) - - # At this point: - # * alive in 3 interpreters (main, interp1, interp2) - # * module def still in _PyRuntime.imports.extensions - # * mod init func ran again - # * m_copy was copied from interp2 (was from interp1) - # * module's global state was updated, not reset - - @requires_subinterpreters - def test_basic_multiple_interpreters_deleted_no_reset(self): - # without resetting; already loaded in a deleted interpreter - - # At this point: - # * alive in 0 interpreters - # * module def may or may not be loaded already - # * module def not in _PyRuntime.imports.extensions - # * mod init func has not run yet (since reset, at least) - # * m_copy not set (hasn't been loaded yet or already cleared) - # * module's global state has not been initialized yet - # (or already cleared) - - interpid1 = self.add_subinterpreter() - interpid2 = self.add_subinterpreter() - - # First, load in the main interpreter but then completely clear it. - loaded_main = self.load(self.NAME) - loaded_main.module._clear_globals() - _testinternalcapi.clear_extension(self.NAME, self.FILE) - - # At this point: - # * alive in 0 interpreters - # * module def loaded already - # * module def was in _PyRuntime.imports.extensions, but cleared - # * mod init func ran for the first time (since reset, at least) - # * m_copy was set, but cleared (was NULL) - # * module's global state was initialized but cleared - - # Start with an interpreter that gets destroyed right away. - base = self.import_in_subinterp(postscript=''' - # Attrs set after loading are not in m_copy. - mod.spam = 'spam, spam, mash, spam, eggs, and spam' - ''') - self.check_common(base) - self.check_fresh(base) - - # At this point: - # * alive in 0 interpreters - # * module def in _PyRuntime.imports.extensions - # * mod init func ran again - # * m_copy is NULL (claered when the interpreter was destroyed) - # * module's global state was initialized, not reset - - # Use a subinterpreter that sticks around. - loaded_interp1 = self.import_in_subinterp(interpid1) - self.check_common(loaded_interp1) - self.check_semi_fresh(loaded_interp1, loaded_main, base) - - # At this point: - # * alive in 1 interpreter (interp1) - # * module def still in _PyRuntime.imports.extensions - # * mod init func ran again - # * m_copy was copied from interp1 (was NULL) - # * module's global state was updated, not reset - - # Use a subinterpreter while the previous one is still alive. - loaded_interp2 = self.import_in_subinterp(interpid2) - self.check_common(loaded_interp2) - self.check_copied(loaded_interp2, loaded_interp1) - - # At this point: - # * alive in 2 interpreters (interp1, interp2) - # * module def still in _PyRuntime.imports.extensions - # * mod init func ran again - # * m_copy was copied from interp2 (was from interp1) - # * module's global state was updated, not reset - - @requires_subinterpreters - @requires_load_dynamic - def test_basic_multiple_interpreters_reset_each(self): - # resetting between each interpreter - - # At this point: - # * alive in 0 interpreters - # * module def may or may not be loaded already - # * module def not in _PyRuntime.imports.extensions - # * mod init func has not run yet (since reset, at least) - # * m_copy not set (hasn't been loaded yet or already cleared) - # * module's global state has not been initialized yet - # (or already cleared) - - interpid1 = self.add_subinterpreter() - interpid2 = self.add_subinterpreter() - - # Use an interpreter that gets destroyed right away. - loaded = self.import_in_subinterp( - postscript=''' - # Attrs set after loading are not in m_copy. - mod.spam = 'spam, spam, mash, spam, eggs, and spam' - ''', - postcleanup=True, - ) - self.check_common(loaded) - self.check_fresh(loaded) - - # At this point: - # * alive in 0 interpreters - # * module def in _PyRuntime.imports.extensions - # * mod init func ran for the first time (since reset, at least) - # * m_copy is NULL (claered when the interpreter was destroyed) - # * module's global state was initialized, not reset - - # Use a subinterpreter that sticks around. - loaded = self.import_in_subinterp(interpid1, postcleanup=True) - self.check_common(loaded) - self.check_fresh(loaded) - - # At this point: - # * alive in 1 interpreter (interp1) - # * module def still in _PyRuntime.imports.extensions - # * mod init func ran again - # * m_copy was copied from interp1 (was NULL) - # * module's global state was initialized, not reset - - # Use a subinterpreter while the previous one is still alive. - loaded = self.import_in_subinterp(interpid2, postcleanup=True) - self.check_common(loaded) - self.check_fresh(loaded) - - # At this point: - # * alive in 2 interpreters (interp2, interp2) - # * module def still in _PyRuntime.imports.extensions - # * mod init func ran again - # * m_copy was copied from interp2 (was from interp1) - # * module's global state was initialized, not reset - - class ReloadTests(unittest.TestCase): """Very basic tests to make sure that imp.reload() operates just like diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 3ef07203c46c7e..66ae554f984fa2 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -2,6 +2,7 @@ import contextlib import errno import glob +import json import importlib.util from importlib._bootstrap_external import _get_sourcefile from importlib.machinery import ( @@ -18,13 +19,15 @@ import textwrap import threading import time +import types import unittest from unittest import mock +import _testinternalcapi from test.support import os_helper from test.support import ( STDLIB_DIR, swap_attr, swap_item, cpython_only, is_emscripten, - is_wasi, run_in_subinterp_with_config) + is_wasi, run_in_subinterp, run_in_subinterp_with_config) from test.support.import_helper import ( forget, make_legacy_pyc, unlink, unload, DirsOnSysPath, CleanImport) from test.support.os_helper import ( @@ -41,6 +44,10 @@ import _testmultiphase except ImportError: _testmultiphase = None +try: + import _xxsubinterpreters as _interpreters +except ModuleNotFoundError: + _interpreters = None skip_if_dont_write_bytecode = unittest.skipIf( @@ -120,6 +127,182 @@ def _ready_to_import(name=None, source=""): del sys.modules[name] +def requires_subinterpreters(meth): + """Decorator to skip a test if subinterpreters are not supported.""" + return unittest.skipIf(_interpreters is None, + 'subinterpreters required')(meth) + + +def requires_singlephase_init(meth): + """Decorator to skip if single-phase init modules are not supported.""" + meth = cpython_only(meth) + return unittest.skipIf(_testsinglephase is None, + 'test requires _testsinglephase module')(meth) + + +class ModuleSnapshot(types.SimpleNamespace): + """A representation of a module for testing. + + Fields: + + * id - the module's object ID + * module - the actual module or an adequate substitute + * __file__ + * __spec__ + * name + * origin + * ns - a copy (dict) of the module's __dict__ (or None) + * ns_id - the object ID of the module's __dict__ + * cached - the sys.modules[mod.__spec__.name] entry (or None) + * cached_id - the object ID of the sys.modules entry (or None) + + In cases where the value is not available (e.g. due to serialization), + the value will be None. + """ + _fields = tuple('id module ns ns_id cached cached_id'.split()) + + @classmethod + def from_module(cls, mod): + name = mod.__spec__.name + cached = sys.modules.get(name) + return cls( + id=id(mod), + module=mod, + ns=types.SimpleNamespace(**mod.__dict__), + ns_id=id(mod.__dict__), + cached=cached, + cached_id=id(cached), + ) + + SCRIPT = textwrap.dedent(''' + {imports} + + name = {name!r} + + {prescript} + + mod = {name} + + {body} + + {postscript} + ''') + IMPORTS = textwrap.dedent(''' + import sys + ''').strip() + SCRIPT_BODY = textwrap.dedent(''' + # Capture the snapshot data. + cached = sys.modules.get(name) + snapshot = dict( + id=id(mod), + module=dict( + __file__=mod.__file__, + __spec__=dict( + name=mod.__spec__.name, + origin=mod.__spec__.origin, + ), + ), + ns=None, + ns_id=id(mod.__dict__), + cached=None, + cached_id=id(cached) if cached else None, + ) + ''').strip() + CLEANUP_SCRIPT = textwrap.dedent(''' + # Clean up the module. + sys.modules.pop(name, None) + ''').strip() + + @classmethod + def build_script(cls, name, *, + prescript=None, + import_first=False, + postscript=None, + postcleanup=False, + ): + if postcleanup is True: + postcleanup = cls.CLEANUP_SCRIPT + elif isinstance(postcleanup, str): + postcleanup = textwrap.dedent(postcleanup).strip() + postcleanup = cls.CLEANUP_SCRIPT + os.linesep + postcleanup + else: + postcleanup = '' + prescript = textwrap.dedent(prescript).strip() if prescript else '' + postscript = textwrap.dedent(postscript).strip() if postscript else '' + + if postcleanup: + if postscript: + postscript = postscript + os.linesep * 2 + postcleanup + else: + postscript = postcleanup + + if import_first: + prescript += textwrap.dedent(f''' + + # Now import the module. + assert name not in sys.modules + import {name}''') + + return cls.SCRIPT.format( + imports=cls.IMPORTS.strip(), + name=name, + prescript=prescript.strip(), + body=cls.SCRIPT_BODY.strip(), + postscript=postscript, + ) + + @classmethod + def parse(cls, text): + raw = json.loads(text) + mod = raw['module'] + mod['__spec__'] = types.SimpleNamespace(**mod['__spec__']) + raw['module'] = types.SimpleNamespace(**mod) + return cls(**raw) + + @classmethod + def from_subinterp(cls, name, interpid=None, *, pipe=None, **script_kwds): + if pipe is not None: + return cls._from_subinterp(name, interpid, pipe, script_kwds) + pipe = os.pipe() + try: + return cls._from_subinterp(name, interpid, pipe, script_kwds) + finally: + r, w = pipe + os.close(r) + os.close(w) + + @classmethod + def _from_subinterp(cls, name, interpid, pipe, script_kwargs): + r, w = pipe + + # Build the script. + postscript = textwrap.dedent(f''' + # Send the result over the pipe. + import json + import os + os.write({w}, json.dumps(snapshot).encode()) + + ''') + _postscript = script_kwargs.get('postscript') + if _postscript: + _postscript = textwrap.dedent(_postscript).lstrip() + postscript += _postscript + script_kwargs['postscript'] = postscript.strip() + script = cls.build_script(name, **script_kwargs) + + # Run the script. + if interpid is None: + ret = run_in_subinterp(script) + if ret != 0: + raise AssertionError(f'{ret} != 0') + else: + _interpreters.run_string(interpid, script) + + # Parse the results. + text = os.read(r, 1000) + return cls.parse(text.decode()) + + class ImportTests(unittest.TestCase): def setUp(self): @@ -1604,7 +1787,7 @@ def test_frozen_compat(self): with self.subTest(f'{module}: strict, not fresh'): self.check_compatible_here(module, strict=True) - @unittest.skipIf(_testsinglephase is None, "test requires _testsinglephase module") + @requires_singlephase_init def test_single_init_extension_compat(self): module = '_testsinglephase' require_extension(module) @@ -1636,7 +1819,7 @@ def test_python_compat(self): with self.subTest(f'{module}: strict, fresh'): self.check_compatible_fresh(module, strict=True) - @unittest.skipIf(_testsinglephase is None, "test requires _testsinglephase module") + @requires_singlephase_init def test_singlephase_check_with_setting_and_override(self): module = '_testsinglephase' require_extension(module) @@ -1672,6 +1855,685 @@ def check_incompatible(setting, override): check_compatible(False, -1) +class TestSinglePhaseSnapshot(ModuleSnapshot): + + @classmethod + def from_module(cls, mod): + self = super().from_module(mod) + self.summed = mod.sum(1, 2) + self.lookedup = mod.look_up_self() + self.lookedup_id = id(self.lookedup) + self.state_initialized = mod.state_initialized() + if hasattr(mod, 'initialized_count'): + self.init_count = mod.initialized_count() + return self + + SCRIPT_BODY = ModuleSnapshot.SCRIPT_BODY + textwrap.dedent(f''' + snapshot['module'].update(dict( + int_const=mod.int_const, + str_const=mod.str_const, + _module_initialized=mod._module_initialized, + )) + snapshot.update(dict( + summed=mod.sum(1, 2), + lookedup_id=id(mod.look_up_self()), + state_initialized=mod.state_initialized(), + init_count=mod.initialized_count(), + has_spam=hasattr(mod, 'spam'), + spam=getattr(mod, 'spam', None), + )) + ''').rstrip() + + @classmethod + def parse(cls, text): + self = super().parse(text) + if not self.has_spam: + del self.spam + del self.has_spam + return self + + +@requires_singlephase_init +class SinglephaseInitTests(unittest.TestCase): + + NAME = '_testsinglephase' + + @classmethod + def setUpClass(cls): + if '-R' in sys.argv or '--huntrleaks' in sys.argv: + # https://github.com/python/cpython/issues/102251 + raise unittest.SkipTest('unresolved refleaks (see gh-102251)') + + spec = importlib.util.find_spec(cls.NAME) + from importlib.machinery import ExtensionFileLoader + cls.FILE = spec.origin + cls.LOADER = type(spec.loader) + assert cls.LOADER is ExtensionFileLoader + + # Start fresh. + cls.clean_up() + + def tearDown(self): + # Clean up the module. + self.clean_up() + + @classmethod + def clean_up(cls): + name = cls.NAME + filename = cls.FILE + if name in sys.modules: + if hasattr(sys.modules[name], '_clear_globals'): + assert sys.modules[name].__file__ == filename + sys.modules[name]._clear_globals() + del sys.modules[name] + # Clear all internally cached data for the extension. + _testinternalcapi.clear_extension(name, filename) + + ######################### + # helpers + + def add_module_cleanup(self, name): + def clean_up(): + # Clear all internally cached data for the extension. + _testinternalcapi.clear_extension(name, self.FILE) + self.addCleanup(clean_up) + + def _load_dynamic(self, name, path): + """ + Load an extension module. + """ + # This is essentially copied from the old imp module. + from importlib._bootstrap import _load + loader = self.LOADER(name, path) + + # Issue bpo-24748: Skip the sys.modules check in _load_module_shim; + # always load new extension. + spec = importlib.util.spec_from_file_location(name, path, + loader=loader) + return _load(spec) + + def load(self, name): + try: + already_loaded = self.already_loaded + except AttributeError: + already_loaded = self.already_loaded = {} + assert name not in already_loaded + mod = self._load_dynamic(name, self.FILE) + self.assertNotIn(mod, already_loaded.values()) + already_loaded[name] = mod + return types.SimpleNamespace( + name=name, + module=mod, + snapshot=TestSinglePhaseSnapshot.from_module(mod), + ) + + def re_load(self, name, mod): + assert sys.modules[name] is mod + assert mod.__dict__ == mod.__dict__ + reloaded = self._load_dynamic(name, self.FILE) + return types.SimpleNamespace( + name=name, + module=reloaded, + snapshot=TestSinglePhaseSnapshot.from_module(reloaded), + ) + + # subinterpreters + + def add_subinterpreter(self): + interpid = _interpreters.create(isolated=False) + _interpreters.run_string(interpid, textwrap.dedent(''' + import sys + import _testinternalcapi + ''')) + def clean_up(): + _interpreters.run_string(interpid, textwrap.dedent(f''' + name = {self.NAME!r} + if name in sys.modules: + sys.modules[name]._clear_globals() + _testinternalcapi.clear_extension(name, {self.FILE!r}) + ''')) + _interpreters.destroy(interpid) + self.addCleanup(clean_up) + return interpid + + def import_in_subinterp(self, interpid=None, *, + postscript=None, + postcleanup=False, + ): + name = self.NAME + + if postcleanup: + import_ = 'import _testinternalcapi' if interpid is None else '' + postcleanup = f''' + {import_} + mod._clear_globals() + _testinternalcapi.clear_extension(name, {self.FILE!r}) + ''' + + try: + pipe = self._pipe + except AttributeError: + r, w = pipe = self._pipe = os.pipe() + self.addCleanup(os.close, r) + self.addCleanup(os.close, w) + + snapshot = TestSinglePhaseSnapshot.from_subinterp( + name, + interpid, + pipe=pipe, + import_first=True, + postscript=postscript, + postcleanup=postcleanup, + ) + + return types.SimpleNamespace( + name=name, + module=None, + snapshot=snapshot, + ) + + # checks + + def check_common(self, loaded): + isolated = False + + mod = loaded.module + if not mod: + # It came from a subinterpreter. + isolated = True + mod = loaded.snapshot.module + # mod.__name__ might not match, but the spec will. + self.assertEqual(mod.__spec__.name, loaded.name) + self.assertEqual(mod.__file__, self.FILE) + self.assertEqual(mod.__spec__.origin, self.FILE) + if not isolated: + self.assertTrue(issubclass(mod.error, Exception)) + self.assertEqual(mod.int_const, 1969) + self.assertEqual(mod.str_const, 'something different') + self.assertIsInstance(mod._module_initialized, float) + self.assertGreater(mod._module_initialized, 0) + + snap = loaded.snapshot + self.assertEqual(snap.summed, 3) + if snap.state_initialized is not None: + self.assertIsInstance(snap.state_initialized, float) + self.assertGreater(snap.state_initialized, 0) + if isolated: + # The "looked up" module is interpreter-specific + # (interp->imports.modules_by_index was set for the module). + self.assertEqual(snap.lookedup_id, snap.id) + self.assertEqual(snap.cached_id, snap.id) + with self.assertRaises(AttributeError): + snap.spam + else: + self.assertIs(snap.lookedup, mod) + self.assertIs(snap.cached, mod) + + def check_direct(self, loaded): + # The module has its own PyModuleDef, with a matching name. + self.assertEqual(loaded.module.__name__, loaded.name) + self.assertIs(loaded.snapshot.lookedup, loaded.module) + + def check_indirect(self, loaded, orig): + # The module re-uses another's PyModuleDef, with a different name. + assert orig is not loaded.module + assert orig.__name__ != loaded.name + self.assertNotEqual(loaded.module.__name__, loaded.name) + self.assertIs(loaded.snapshot.lookedup, loaded.module) + + def check_basic(self, loaded, expected_init_count): + # m_size == -1 + # The module loads fresh the first time and copies m_copy after. + snap = loaded.snapshot + self.assertIsNot(snap.state_initialized, None) + self.assertIsInstance(snap.init_count, int) + self.assertGreater(snap.init_count, 0) + self.assertEqual(snap.init_count, expected_init_count) + + def check_with_reinit(self, loaded): + # m_size >= 0 + # The module loads fresh every time. + pass + + def check_fresh(self, loaded): + """ + The module had not been loaded before (at least since fully reset). + """ + snap = loaded.snapshot + # The module's init func was run. + # A copy of the module's __dict__ was stored in def->m_base.m_copy. + # The previous m_copy was deleted first. + # _PyRuntime.imports.extensions was set. + self.assertEqual(snap.init_count, 1) + # The global state was initialized. + # The module attrs were initialized from that state. + self.assertEqual(snap.module._module_initialized, + snap.state_initialized) + + def check_semi_fresh(self, loaded, base, prev): + """ + The module had been loaded before and then reset + (but the module global state wasn't). + """ + snap = loaded.snapshot + # The module's init func was run again. + # A copy of the module's __dict__ was stored in def->m_base.m_copy. + # The previous m_copy was deleted first. + # The module globals did not get reset. + self.assertNotEqual(snap.id, base.snapshot.id) + self.assertNotEqual(snap.id, prev.snapshot.id) + self.assertEqual(snap.init_count, prev.snapshot.init_count + 1) + # The global state was updated. + # The module attrs were initialized from that state. + self.assertEqual(snap.module._module_initialized, + snap.state_initialized) + self.assertNotEqual(snap.state_initialized, + base.snapshot.state_initialized) + self.assertNotEqual(snap.state_initialized, + prev.snapshot.state_initialized) + + def check_copied(self, loaded, base): + """ + The module had been loaded before and never reset. + """ + snap = loaded.snapshot + # The module's init func was not run again. + # The interpreter copied m_copy, as set by the other interpreter, + # with objects owned by the other interpreter. + # The module globals did not get reset. + self.assertNotEqual(snap.id, base.snapshot.id) + self.assertEqual(snap.init_count, base.snapshot.init_count) + # The global state was not updated since the init func did not run. + # The module attrs were not directly initialized from that state. + # The state and module attrs still match the previous loading. + self.assertEqual(snap.module._module_initialized, + snap.state_initialized) + self.assertEqual(snap.state_initialized, + base.snapshot.state_initialized) + + ######################### + # the tests + + def test_cleared_globals(self): + loaded = self.load(self.NAME) + _testsinglephase = loaded.module + init_before = _testsinglephase.state_initialized() + + _testsinglephase._clear_globals() + init_after = _testsinglephase.state_initialized() + init_count = _testsinglephase.initialized_count() + + self.assertGreater(init_before, 0) + self.assertEqual(init_after, 0) + self.assertEqual(init_count, -1) + + def test_variants(self): + # Exercise the most meaningful variants described in Python/import.c. + self.maxDiff = None + + # Check the "basic" module. + + name = self.NAME + expected_init_count = 1 + with self.subTest(name): + loaded = self.load(name) + + self.check_common(loaded) + self.check_direct(loaded) + self.check_basic(loaded, expected_init_count) + basic = loaded.module + + # Check its indirect variants. + + name = f'{self.NAME}_basic_wrapper' + self.add_module_cleanup(name) + expected_init_count += 1 + with self.subTest(name): + loaded = self.load(name) + + self.check_common(loaded) + self.check_indirect(loaded, basic) + self.check_basic(loaded, expected_init_count) + + # Currently PyState_AddModule() always replaces the cached module. + self.assertIs(basic.look_up_self(), loaded.module) + self.assertEqual(basic.initialized_count(), expected_init_count) + + # The cached module shouldn't change after this point. + basic_lookedup = loaded.module + + # Check its direct variant. + + name = f'{self.NAME}_basic_copy' + self.add_module_cleanup(name) + expected_init_count += 1 + with self.subTest(name): + loaded = self.load(name) + + self.check_common(loaded) + self.check_direct(loaded) + self.check_basic(loaded, expected_init_count) + + # This should change the cached module for _testsinglephase. + self.assertIs(basic.look_up_self(), basic_lookedup) + self.assertEqual(basic.initialized_count(), expected_init_count) + + # Check the non-basic variant that has no state. + + name = f'{self.NAME}_with_reinit' + self.add_module_cleanup(name) + with self.subTest(name): + loaded = self.load(name) + + self.check_common(loaded) + self.assertIs(loaded.snapshot.state_initialized, None) + self.check_direct(loaded) + self.check_with_reinit(loaded) + + # This should change the cached module for _testsinglephase. + self.assertIs(basic.look_up_self(), basic_lookedup) + self.assertEqual(basic.initialized_count(), expected_init_count) + + # Check the basic variant that has state. + + name = f'{self.NAME}_with_state' + self.add_module_cleanup(name) + with self.subTest(name): + loaded = self.load(name) + + self.check_common(loaded) + self.assertIsNot(loaded.snapshot.state_initialized, None) + self.check_direct(loaded) + self.check_with_reinit(loaded) + + # This should change the cached module for _testsinglephase. + self.assertIs(basic.look_up_self(), basic_lookedup) + self.assertEqual(basic.initialized_count(), expected_init_count) + + def test_basic_reloaded(self): + # m_copy is copied into the existing module object. + # Global state is not changed. + self.maxDiff = None + + for name in [ + self.NAME, # the "basic" module + f'{self.NAME}_basic_wrapper', # the indirect variant + f'{self.NAME}_basic_copy', # the direct variant + ]: + self.add_module_cleanup(name) + with self.subTest(name): + loaded = self.load(name) + reloaded = self.re_load(name, loaded.module) + + self.check_common(loaded) + self.check_common(reloaded) + + # Make sure the original __dict__ did not get replaced. + self.assertEqual(id(loaded.module.__dict__), + loaded.snapshot.ns_id) + self.assertEqual(loaded.snapshot.ns.__dict__, + loaded.module.__dict__) + + self.assertEqual(reloaded.module.__spec__.name, reloaded.name) + self.assertEqual(reloaded.module.__name__, + reloaded.snapshot.ns.__name__) + + self.assertIs(reloaded.module, loaded.module) + self.assertIs(reloaded.module.__dict__, loaded.module.__dict__) + # It only happens to be the same but that's good enough here. + # We really just want to verify that the re-loaded attrs + # didn't change. + self.assertIs(reloaded.snapshot.lookedup, + loaded.snapshot.lookedup) + self.assertEqual(reloaded.snapshot.state_initialized, + loaded.snapshot.state_initialized) + self.assertEqual(reloaded.snapshot.init_count, + loaded.snapshot.init_count) + + self.assertIs(reloaded.snapshot.cached, reloaded.module) + + def test_with_reinit_reloaded(self): + # The module's m_init func is run again. + self.maxDiff = None + + # Keep a reference around. + basic = self.load(self.NAME) + + for name in [ + f'{self.NAME}_with_reinit', # m_size == 0 + f'{self.NAME}_with_state', # m_size > 0 + ]: + self.add_module_cleanup(name) + with self.subTest(name): + loaded = self.load(name) + reloaded = self.re_load(name, loaded.module) + + self.check_common(loaded) + self.check_common(reloaded) + + # Make sure the original __dict__ did not get replaced. + self.assertEqual(id(loaded.module.__dict__), + loaded.snapshot.ns_id) + self.assertEqual(loaded.snapshot.ns.__dict__, + loaded.module.__dict__) + + self.assertEqual(reloaded.module.__spec__.name, reloaded.name) + self.assertEqual(reloaded.module.__name__, + reloaded.snapshot.ns.__name__) + + self.assertIsNot(reloaded.module, loaded.module) + self.assertNotEqual(reloaded.module.__dict__, + loaded.module.__dict__) + self.assertIs(reloaded.snapshot.lookedup, reloaded.module) + if loaded.snapshot.state_initialized is None: + self.assertIs(reloaded.snapshot.state_initialized, None) + else: + self.assertGreater(reloaded.snapshot.state_initialized, + loaded.snapshot.state_initialized) + + self.assertIs(reloaded.snapshot.cached, reloaded.module) + + # Currently, for every single-phrase init module loaded + # in multiple interpreters, those interpreters share a + # PyModuleDef for that object, which can be a problem. + # Also, we test with a single-phase module that has global state, + # which is shared by all interpreters. + + @requires_subinterpreters + def test_basic_multiple_interpreters_main_no_reset(self): + # without resetting; already loaded in main interpreter + + # At this point: + # * alive in 0 interpreters + # * module def may or may not be loaded already + # * module def not in _PyRuntime.imports.extensions + # * mod init func has not run yet (since reset, at least) + # * m_copy not set (hasn't been loaded yet or already cleared) + # * module's global state has not been initialized yet + # (or already cleared) + + main_loaded = self.load(self.NAME) + _testsinglephase = main_loaded.module + # Attrs set after loading are not in m_copy. + _testsinglephase.spam = 'spam, spam, spam, spam, eggs, and spam' + + self.check_common(main_loaded) + self.check_fresh(main_loaded) + + interpid1 = self.add_subinterpreter() + interpid2 = self.add_subinterpreter() + + # At this point: + # * alive in 1 interpreter (main) + # * module def in _PyRuntime.imports.extensions + # * mod init func ran for the first time (since reset, at least) + # * m_copy was copied from the main interpreter (was NULL) + # * module's global state was initialized + + # Use an interpreter that gets destroyed right away. + loaded = self.import_in_subinterp() + self.check_common(loaded) + self.check_copied(loaded, main_loaded) + + # At this point: + # * alive in 1 interpreter (main) + # * module def still in _PyRuntime.imports.extensions + # * mod init func ran again + # * m_copy is NULL (claered when the interpreter was destroyed) + # (was from main interpreter) + # * module's global state was updated, not reset + + # Use a subinterpreter that sticks around. + loaded = self.import_in_subinterp(interpid1) + self.check_common(loaded) + self.check_copied(loaded, main_loaded) + + # At this point: + # * alive in 2 interpreters (main, interp1) + # * module def still in _PyRuntime.imports.extensions + # * mod init func ran again + # * m_copy was copied from interp1 + # * module's global state was updated, not reset + + # Use a subinterpreter while the previous one is still alive. + loaded = self.import_in_subinterp(interpid2) + self.check_common(loaded) + self.check_copied(loaded, main_loaded) + + # At this point: + # * alive in 3 interpreters (main, interp1, interp2) + # * module def still in _PyRuntime.imports.extensions + # * mod init func ran again + # * m_copy was copied from interp2 (was from interp1) + # * module's global state was updated, not reset + + @requires_subinterpreters + def test_basic_multiple_interpreters_deleted_no_reset(self): + # without resetting; already loaded in a deleted interpreter + + # At this point: + # * alive in 0 interpreters + # * module def may or may not be loaded already + # * module def not in _PyRuntime.imports.extensions + # * mod init func has not run yet (since reset, at least) + # * m_copy not set (hasn't been loaded yet or already cleared) + # * module's global state has not been initialized yet + # (or already cleared) + + interpid1 = self.add_subinterpreter() + interpid2 = self.add_subinterpreter() + + # First, load in the main interpreter but then completely clear it. + loaded_main = self.load(self.NAME) + loaded_main.module._clear_globals() + _testinternalcapi.clear_extension(self.NAME, self.FILE) + + # At this point: + # * alive in 0 interpreters + # * module def loaded already + # * module def was in _PyRuntime.imports.extensions, but cleared + # * mod init func ran for the first time (since reset, at least) + # * m_copy was set, but cleared (was NULL) + # * module's global state was initialized but cleared + + # Start with an interpreter that gets destroyed right away. + base = self.import_in_subinterp(postscript=''' + # Attrs set after loading are not in m_copy. + mod.spam = 'spam, spam, mash, spam, eggs, and spam' + ''') + self.check_common(base) + self.check_fresh(base) + + # At this point: + # * alive in 0 interpreters + # * module def in _PyRuntime.imports.extensions + # * mod init func ran again + # * m_copy is NULL (claered when the interpreter was destroyed) + # * module's global state was initialized, not reset + + # Use a subinterpreter that sticks around. + loaded_interp1 = self.import_in_subinterp(interpid1) + self.check_common(loaded_interp1) + self.check_semi_fresh(loaded_interp1, loaded_main, base) + + # At this point: + # * alive in 1 interpreter (interp1) + # * module def still in _PyRuntime.imports.extensions + # * mod init func ran again + # * m_copy was copied from interp1 (was NULL) + # * module's global state was updated, not reset + + # Use a subinterpreter while the previous one is still alive. + loaded_interp2 = self.import_in_subinterp(interpid2) + self.check_common(loaded_interp2) + self.check_copied(loaded_interp2, loaded_interp1) + + # At this point: + # * alive in 2 interpreters (interp1, interp2) + # * module def still in _PyRuntime.imports.extensions + # * mod init func ran again + # * m_copy was copied from interp2 (was from interp1) + # * module's global state was updated, not reset + + @requires_subinterpreters + def test_basic_multiple_interpreters_reset_each(self): + # resetting between each interpreter + + # At this point: + # * alive in 0 interpreters + # * module def may or may not be loaded already + # * module def not in _PyRuntime.imports.extensions + # * mod init func has not run yet (since reset, at least) + # * m_copy not set (hasn't been loaded yet or already cleared) + # * module's global state has not been initialized yet + # (or already cleared) + + interpid1 = self.add_subinterpreter() + interpid2 = self.add_subinterpreter() + + # Use an interpreter that gets destroyed right away. + loaded = self.import_in_subinterp( + postscript=''' + # Attrs set after loading are not in m_copy. + mod.spam = 'spam, spam, mash, spam, eggs, and spam' + ''', + postcleanup=True, + ) + self.check_common(loaded) + self.check_fresh(loaded) + + # At this point: + # * alive in 0 interpreters + # * module def in _PyRuntime.imports.extensions + # * mod init func ran for the first time (since reset, at least) + # * m_copy is NULL (claered when the interpreter was destroyed) + # * module's global state was initialized, not reset + + # Use a subinterpreter that sticks around. + loaded = self.import_in_subinterp(interpid1, postcleanup=True) + self.check_common(loaded) + self.check_fresh(loaded) + + # At this point: + # * alive in 1 interpreter (interp1) + # * module def still in _PyRuntime.imports.extensions + # * mod init func ran again + # * m_copy was copied from interp1 (was NULL) + # * module's global state was initialized, not reset + + # Use a subinterpreter while the previous one is still alive. + loaded = self.import_in_subinterp(interpid2, postcleanup=True) + self.check_common(loaded) + self.check_fresh(loaded) + + # At this point: + # * alive in 2 interpreters (interp2, interp2) + # * module def still in _PyRuntime.imports.extensions + # * mod init func ran again + # * m_copy was copied from interp2 (was from interp1) + # * module's global state was initialized, not reset + + if __name__ == '__main__': # Test needs to be a package, so we can do relative imports. unittest.main() From 4898415df724380d4c8b0ec08e8cb92f126193c3 Mon Sep 17 00:00:00 2001 From: Adrien Date: Thu, 20 Apr 2023 16:07:41 +0200 Subject: [PATCH 214/349] gh-98641: Document difference between task group and gather (#103644) The purpose of the comments is to rule out the implication that asyncio.TaskGroup is a drop-in replacement / better alternative to asyncio.gather(). --- Doc/library/asyncio-task.rst | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index b81d89acf7fd88..ba0f909c405a34 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -256,8 +256,9 @@ Creating Tasks .. note:: - :meth:`asyncio.TaskGroup.create_task` is a newer alternative - that allows for convenient waiting for a group of related tasks. + :meth:`asyncio.TaskGroup.create_task` is a new alternative + leveraging structural concurrency; it allows for waiting + for a group of related tasks with strong safety guarantees. .. important:: @@ -340,7 +341,7 @@ Example:: async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) - print("Both tasks have completed now.") + print(f"Both tasks have completed now: {task1.result()}, {task2.result()}") The ``async with`` statement will wait for all tasks in the group to finish. While waiting, new tasks may still be added to the group @@ -459,8 +460,12 @@ Running Tasks Concurrently Tasks/Futures to be cancelled. .. note:: - A more modern way to create and run tasks concurrently and - wait for their completion is :class:`asyncio.TaskGroup`. + A new alternative to create and run tasks concurrently and + wait for their completion is :class:`asyncio.TaskGroup`. *TaskGroup* + provides stronger safety guarantees than *gather* for scheduling a nesting of subtasks: + if a task (or a subtask, a task scheduled by a task) + raises an exception, *TaskGroup* will, while *gather* will not, + cancel the remaining scheduled tasks). .. _asyncio_example_gather: From 5c00a6224d55f8818ef567b93f484b5429e2ae80 Mon Sep 17 00:00:00 2001 From: Wheeler Law Date: Thu, 20 Apr 2023 21:04:25 -0500 Subject: [PATCH 215/349] gh-99352: Respect `http.client.HTTPConnection.debuglevel` in `urllib.request.AbstractHTTPHandler` (#99353) * bugfix: let the HTTP- and HTTPSHandlers respect the value of http.client.HTTPConnection.debuglevel * add tests * add news * ReSTify NEWS and reword a bit. * Address Review Comments. * Use mock.patch.object instead of settting the module level value. * Used test values to assert the debuglevel. --------- Co-authored-by: Gregory P. Smith Co-authored-by: Senthil Kumaran --- Lib/test/test_urllib2.py | 65 ++++++++++++++----- Lib/urllib/request.py | 7 +- ...2-11-10-16-26-47.gh-issue-99353.DQFjnt.rst | 3 + 3 files changed, 57 insertions(+), 18 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2022-11-10-16-26-47.gh-issue-99353.DQFjnt.rst diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 633d596ac3de3f..b7c6f6dd8f1b99 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -3,6 +3,7 @@ from test.support import os_helper from test.support import warnings_helper from test import test_urllib +from unittest import mock import os import io @@ -484,7 +485,18 @@ def build_test_opener(*handler_instances): return opener -class MockHTTPHandler(urllib.request.BaseHandler): +class MockHTTPHandler(urllib.request.HTTPHandler): + # Very simple mock HTTP handler with no special behavior other than using a mock HTTP connection + + def __init__(self, debuglevel=None): + super(MockHTTPHandler, self).__init__(debuglevel=debuglevel) + self.httpconn = MockHTTPClass() + + def http_open(self, req): + return self.do_open(self.httpconn, req) + + +class MockHTTPHandlerRedirect(urllib.request.BaseHandler): # useful for testing redirections and auth # sends supplied headers and code as first response # sends 200 OK as second response @@ -512,12 +524,12 @@ def http_open(self, req): return MockResponse(200, "OK", msg, "", req.get_full_url()) -class MockHTTPSHandler(urllib.request.AbstractHTTPHandler): +class MockHTTPSHandler(urllib.request.HTTPSHandler): # Useful for testing the Proxy-Authorization request by verifying the # properties of httpcon - def __init__(self, debuglevel=0): - urllib.request.AbstractHTTPHandler.__init__(self, debuglevel=debuglevel) + def __init__(self, debuglevel=None, context=None, check_hostname=None): + super(MockHTTPSHandler, self).__init__(debuglevel, context, check_hostname) self.httpconn = MockHTTPClass() def https_open(self, req): @@ -1048,12 +1060,35 @@ def test_http_body_array(self): newreq = h.do_request_(req) self.assertEqual(int(newreq.get_header('Content-length')),16) - def test_http_handler_debuglevel(self): + def test_http_handler_global_debuglevel(self): + with mock.patch.object(http.client.HTTPConnection, 'debuglevel', 6): + o = OpenerDirector() + h = MockHTTPHandler() + o.add_handler(h) + o.open("http://www.example.com") + self.assertEqual(h._debuglevel, 6) + + def test_http_handler_local_debuglevel(self): + o = OpenerDirector() + h = MockHTTPHandler(debuglevel=5) + o.add_handler(h) + o.open("http://www.example.com") + self.assertEqual(h._debuglevel, 5) + + def test_https_handler_global_debuglevel(self): + with mock.patch.object(http.client.HTTPSConnection, 'debuglevel', 7): + o = OpenerDirector() + h = MockHTTPSHandler() + o.add_handler(h) + o.open("https://www.example.com") + self.assertEqual(h._debuglevel, 7) + + def test_https_handler_local_debuglevel(self): o = OpenerDirector() - h = MockHTTPSHandler(debuglevel=1) + h = MockHTTPSHandler(debuglevel=4) o.add_handler(h) o.open("https://www.example.com") - self.assertEqual(h._debuglevel, 1) + self.assertEqual(h._debuglevel, 4) def test_http_doubleslash(self): # Checks the presence of any unnecessary double slash in url does not @@ -1289,7 +1324,7 @@ def test_cookie_redirect(self): cj = CookieJar() interact_netscape(cj, "http://www.example.com/", "spam=eggs") - hh = MockHTTPHandler(302, "Location: http://www.cracker.com/\r\n\r\n") + hh = MockHTTPHandlerRedirect(302, "Location: http://www.cracker.com/\r\n\r\n") hdeh = urllib.request.HTTPDefaultErrorHandler() hrh = urllib.request.HTTPRedirectHandler() cp = urllib.request.HTTPCookieProcessor(cj) @@ -1299,7 +1334,7 @@ def test_cookie_redirect(self): def test_redirect_fragment(self): redirected_url = 'http://www.example.com/index.html#OK\r\n\r\n' - hh = MockHTTPHandler(302, 'Location: ' + redirected_url) + hh = MockHTTPHandlerRedirect(302, 'Location: ' + redirected_url) hdeh = urllib.request.HTTPDefaultErrorHandler() hrh = urllib.request.HTTPRedirectHandler() o = build_test_opener(hh, hdeh, hrh) @@ -1484,7 +1519,7 @@ def check_basic_auth(self, headers, realm): password_manager = MockPasswordManager() auth_handler = urllib.request.HTTPBasicAuthHandler(password_manager) body = '\r\n'.join(headers) + '\r\n\r\n' - http_handler = MockHTTPHandler(401, body) + http_handler = MockHTTPHandlerRedirect(401, body) opener.add_handler(auth_handler) opener.add_handler(http_handler) self._test_basic_auth(opener, auth_handler, "Authorization", @@ -1544,7 +1579,7 @@ def test_proxy_basic_auth(self): password_manager = MockPasswordManager() auth_handler = urllib.request.ProxyBasicAuthHandler(password_manager) realm = "ACME Networks" - http_handler = MockHTTPHandler( + http_handler = MockHTTPHandlerRedirect( 407, 'Proxy-Authenticate: Basic realm="%s"\r\n\r\n' % realm) opener.add_handler(auth_handler) opener.add_handler(http_handler) @@ -1588,7 +1623,7 @@ def http_error_401(self, *args, **kwds): digest_handler = TestDigestAuthHandler(password_manager) basic_handler = TestBasicAuthHandler(password_manager) realm = "ACME Networks" - http_handler = MockHTTPHandler( + http_handler = MockHTTPHandlerRedirect( 401, 'WWW-Authenticate: Basic realm="%s"\r\n\r\n' % realm) opener.add_handler(basic_handler) opener.add_handler(digest_handler) @@ -1608,7 +1643,7 @@ def test_unsupported_auth_digest_handler(self): opener = OpenerDirector() # While using DigestAuthHandler digest_auth_handler = urllib.request.HTTPDigestAuthHandler(None) - http_handler = MockHTTPHandler( + http_handler = MockHTTPHandlerRedirect( 401, 'WWW-Authenticate: Kerberos\r\n\r\n') opener.add_handler(digest_auth_handler) opener.add_handler(http_handler) @@ -1618,7 +1653,7 @@ def test_unsupported_auth_basic_handler(self): # While using BasicAuthHandler opener = OpenerDirector() basic_auth_handler = urllib.request.HTTPBasicAuthHandler(None) - http_handler = MockHTTPHandler( + http_handler = MockHTTPHandlerRedirect( 401, 'WWW-Authenticate: NTLM\r\n\r\n') opener.add_handler(basic_auth_handler) opener.add_handler(http_handler) @@ -1705,7 +1740,7 @@ def test_basic_prior_auth_send_after_first_success(self): opener = OpenerDirector() opener.add_handler(auth_prior_handler) - http_handler = MockHTTPHandler( + http_handler = MockHTTPHandlerRedirect( 401, 'WWW-Authenticate: Basic realm="%s"\r\n\r\n' % None) opener.add_handler(http_handler) diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 151034e6a81bf9..19e2e5bd335627 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1251,8 +1251,8 @@ def http_error_407(self, req, fp, code, msg, headers): class AbstractHTTPHandler(BaseHandler): - def __init__(self, debuglevel=0): - self._debuglevel = debuglevel + def __init__(self, debuglevel=None): + self._debuglevel = debuglevel if debuglevel is not None else http.client.HTTPConnection.debuglevel def set_http_debuglevel(self, level): self._debuglevel = level @@ -1378,7 +1378,8 @@ def http_open(self, req): class HTTPSHandler(AbstractHTTPHandler): - def __init__(self, debuglevel=0, context=None, check_hostname=None): + def __init__(self, debuglevel=None, context=None, check_hostname=None): + debuglevel = debuglevel if debuglevel is not None else http.client.HTTPSConnection.debuglevel AbstractHTTPHandler.__init__(self, debuglevel) if context is None: http_version = http.client.HTTPSConnection._http_vsn diff --git a/Misc/NEWS.d/next/Library/2022-11-10-16-26-47.gh-issue-99353.DQFjnt.rst b/Misc/NEWS.d/next/Library/2022-11-10-16-26-47.gh-issue-99353.DQFjnt.rst new file mode 100644 index 00000000000000..1ad42d5c9aa53d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-11-10-16-26-47.gh-issue-99353.DQFjnt.rst @@ -0,0 +1,3 @@ +Respect the :class:`http.client.HTTPConnection` ``.debuglevel`` flag +in :class:`urllib.request.AbstractHTTPHandler` when its constructor +parameter ``debuglevel`` is not set. And do the same for ``*HTTPS*``. From 3e0fec7e07a71bdeeab7554e980110fbc47763b9 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Thu, 20 Apr 2023 22:12:48 -0400 Subject: [PATCH 216/349] Sync with importlib_metadata 6.5 (GH-103584) --- Doc/library/importlib.metadata.rst | 4 + Lib/importlib/metadata/__init__.py | 98 +++++++++-- Lib/importlib/metadata/_adapters.py | 21 +++ Lib/importlib/metadata/_meta.py | 28 +++- Lib/test/test_importlib/_context.py | 13 ++ Lib/test/test_importlib/_path.py | 109 +++++++++++++ Lib/test/test_importlib/fixtures.py | 153 +++++++++++++----- Lib/test/test_importlib/test_main.py | 109 ++++++++++++- Lib/test/test_importlib/test_metadata_api.py | 56 ++++++- ...-04-16-19-48-21.gh-issue-103584.3mBTuM.rst | 12 ++ 10 files changed, 531 insertions(+), 72 deletions(-) create mode 100644 Lib/test/test_importlib/_context.py create mode 100644 Lib/test/test_importlib/_path.py create mode 100644 Misc/NEWS.d/next/Library/2023-04-16-19-48-21.gh-issue-103584.3mBTuM.rst diff --git a/Doc/library/importlib.metadata.rst b/Doc/library/importlib.metadata.rst index 6e084101995e25..b306d5f55a714f 100644 --- a/Doc/library/importlib.metadata.rst +++ b/Doc/library/importlib.metadata.rst @@ -308,6 +308,10 @@ Python module or `Import Package >> packages_distributions() {'importlib_metadata': ['importlib-metadata'], 'yaml': ['PyYAML'], 'jaraco': ['jaraco.classes', 'jaraco.functools'], ...} +Some editable installs, `do not supply top-level names +`_, and thus this +function is not reliable with such installs. + .. versionadded:: 3.10 .. _distributions: diff --git a/Lib/importlib/metadata/__init__.py b/Lib/importlib/metadata/__init__.py index 40ab1a1aaac328..b8eb19d05dccae 100644 --- a/Lib/importlib/metadata/__init__.py +++ b/Lib/importlib/metadata/__init__.py @@ -12,7 +12,9 @@ import functools import itertools import posixpath +import contextlib import collections +import inspect from . import _adapters, _meta from ._collections import FreezableDefaultDict, Pair @@ -24,7 +26,7 @@ from importlib import import_module from importlib.abc import MetaPathFinder from itertools import starmap -from typing import List, Mapping, Optional +from typing import List, Mapping, Optional, cast __all__ = [ @@ -341,11 +343,30 @@ def __repr__(self): return f'' -class Distribution: +class DeprecatedNonAbstract: + def __new__(cls, *args, **kwargs): + all_names = { + name for subclass in inspect.getmro(cls) for name in vars(subclass) + } + abstract = { + name + for name in all_names + if getattr(getattr(cls, name), '__isabstractmethod__', False) + } + if abstract: + warnings.warn( + f"Unimplemented abstract methods {abstract}", + DeprecationWarning, + stacklevel=2, + ) + return super().__new__(cls) + + +class Distribution(DeprecatedNonAbstract): """A Python distribution package.""" @abc.abstractmethod - def read_text(self, filename): + def read_text(self, filename) -> Optional[str]: """Attempt to load metadata file given by the name. :param filename: The name of the file in the distribution info. @@ -419,7 +440,7 @@ def metadata(self) -> _meta.PackageMetadata: The returned object will have keys that name the various bits of metadata. See PEP 566 for details. """ - text = ( + opt_text = ( self.read_text('METADATA') or self.read_text('PKG-INFO') # This last clause is here to support old egg-info files. Its @@ -427,6 +448,7 @@ def metadata(self) -> _meta.PackageMetadata: # (which points to the egg-info file) attribute unchanged. or self.read_text('') ) + text = cast(str, opt_text) return _adapters.Message(email.message_from_string(text)) @property @@ -455,8 +477,8 @@ def files(self): :return: List of PackagePath for this distribution or None Result is `None` if the metadata file that enumerates files - (i.e. RECORD for dist-info or SOURCES.txt for egg-info) is - missing. + (i.e. RECORD for dist-info, or installed-files.txt or + SOURCES.txt for egg-info) is missing. Result may be empty if the metadata exists but is empty. """ @@ -469,9 +491,19 @@ def make_file(name, hash=None, size_str=None): @pass_none def make_files(lines): - return list(starmap(make_file, csv.reader(lines))) + return starmap(make_file, csv.reader(lines)) - return make_files(self._read_files_distinfo() or self._read_files_egginfo()) + @pass_none + def skip_missing_files(package_paths): + return list(filter(lambda path: path.locate().exists(), package_paths)) + + return skip_missing_files( + make_files( + self._read_files_distinfo() + or self._read_files_egginfo_installed() + or self._read_files_egginfo_sources() + ) + ) def _read_files_distinfo(self): """ @@ -480,10 +512,43 @@ def _read_files_distinfo(self): text = self.read_text('RECORD') return text and text.splitlines() - def _read_files_egginfo(self): + def _read_files_egginfo_installed(self): + """ + Read installed-files.txt and return lines in a similar + CSV-parsable format as RECORD: each file must be placed + relative to the site-packages directory, and must also be + quoted (since file names can contain literal commas). + + This file is written when the package is installed by pip, + but it might not be written for other installation methods. + Hence, even if we can assume that this file is accurate + when it exists, we cannot assume that it always exists. """ - SOURCES.txt might contain literal commas, so wrap each line - in quotes. + text = self.read_text('installed-files.txt') + # We need to prepend the .egg-info/ subdir to the lines in this file. + # But this subdir is only available in the PathDistribution's self._path + # which is not easily accessible from this base class... + subdir = getattr(self, '_path', None) + if not text or not subdir: + return + with contextlib.suppress(Exception): + ret = [ + str((subdir / line).resolve().relative_to(self.locate_file(''))) + for line in text.splitlines() + ] + return map('"{}"'.format, ret) + + def _read_files_egginfo_sources(self): + """ + Read SOURCES.txt and return lines in a similar CSV-parsable + format as RECORD: each file name must be quoted (since it + might contain literal commas). + + Note that SOURCES.txt is not a reliable source for what + files are installed by a package. This file is generated + for a source archive, and the files that are present + there (e.g. setup.py) may not correctly reflect the files + that are present after the package has been installed. """ text = self.read_text('SOURCES.txt') return text and map('"{}"'.format, text.splitlines()) @@ -886,8 +951,13 @@ def _top_level_declared(dist): def _top_level_inferred(dist): - return { - f.parts[0] if len(f.parts) > 1 else f.with_suffix('').name + opt_names = { + f.parts[0] if len(f.parts) > 1 else inspect.getmodulename(f) for f in always_iterable(dist.files) - if f.suffix == ".py" } + + @pass_none + def importable_name(name): + return '.' not in name + + return filter(importable_name, opt_names) diff --git a/Lib/importlib/metadata/_adapters.py b/Lib/importlib/metadata/_adapters.py index aa460d3eda50fb..6aed69a30857e4 100644 --- a/Lib/importlib/metadata/_adapters.py +++ b/Lib/importlib/metadata/_adapters.py @@ -1,3 +1,5 @@ +import functools +import warnings import re import textwrap import email.message @@ -5,6 +7,15 @@ from ._text import FoldedCase +# Do not remove prior to 2024-01-01 or Python 3.14 +_warn = functools.partial( + warnings.warn, + "Implicit None on return values is deprecated and will raise KeyErrors.", + DeprecationWarning, + stacklevel=2, +) + + class Message(email.message.Message): multiple_use_keys = set( map( @@ -39,6 +50,16 @@ def __init__(self, *args, **kwargs): def __iter__(self): return super().__iter__() + def __getitem__(self, item): + """ + Warn users that a ``KeyError`` can be expected when a + mising key is supplied. Ref python/importlib_metadata#371. + """ + res = super().__getitem__(item) + if res is None: + _warn() + return res + def _repair_headers(self): def redent(value): "Correct for RFC822 indentation" diff --git a/Lib/importlib/metadata/_meta.py b/Lib/importlib/metadata/_meta.py index d5c0576194ece2..c9a7ef906a8a8c 100644 --- a/Lib/importlib/metadata/_meta.py +++ b/Lib/importlib/metadata/_meta.py @@ -1,4 +1,5 @@ -from typing import Any, Dict, Iterator, List, Protocol, TypeVar, Union +from typing import Protocol +from typing import Any, Dict, Iterator, List, Optional, TypeVar, Union, overload _T = TypeVar("_T") @@ -17,7 +18,21 @@ def __getitem__(self, key: str) -> str: def __iter__(self) -> Iterator[str]: ... # pragma: no cover - def get_all(self, name: str, failobj: _T = ...) -> Union[List[Any], _T]: + @overload + def get(self, name: str, failobj: None = None) -> Optional[str]: + ... # pragma: no cover + + @overload + def get(self, name: str, failobj: _T) -> Union[str, _T]: + ... # pragma: no cover + + # overload per python/importlib_metadata#435 + @overload + def get_all(self, name: str, failobj: None = None) -> Optional[List[Any]]: + ... # pragma: no cover + + @overload + def get_all(self, name: str, failobj: _T) -> Union[List[Any], _T]: """ Return all values associated with a possibly multi-valued key. """ @@ -29,18 +44,19 @@ def json(self) -> Dict[str, Union[str, List[str]]]: """ -class SimplePath(Protocol): +class SimplePath(Protocol[_T]): """ A minimal subset of pathlib.Path required by PathDistribution. """ - def joinpath(self) -> 'SimplePath': + def joinpath(self) -> _T: ... # pragma: no cover - def __truediv__(self) -> 'SimplePath': + def __truediv__(self, other: Union[str, _T]) -> _T: ... # pragma: no cover - def parent(self) -> 'SimplePath': + @property + def parent(self) -> _T: ... # pragma: no cover def read_text(self) -> str: diff --git a/Lib/test/test_importlib/_context.py b/Lib/test/test_importlib/_context.py new file mode 100644 index 00000000000000..8a53eb55d1503b --- /dev/null +++ b/Lib/test/test_importlib/_context.py @@ -0,0 +1,13 @@ +import contextlib + + +# from jaraco.context 4.3 +class suppress(contextlib.suppress, contextlib.ContextDecorator): + """ + A version of contextlib.suppress with decorator support. + + >>> @suppress(KeyError) + ... def key_error(): + ... {}[''] + >>> key_error() + """ diff --git a/Lib/test/test_importlib/_path.py b/Lib/test/test_importlib/_path.py new file mode 100644 index 00000000000000..71a704389b986e --- /dev/null +++ b/Lib/test/test_importlib/_path.py @@ -0,0 +1,109 @@ +# from jaraco.path 3.5 + +import functools +import pathlib +from typing import Dict, Union + +try: + from typing import Protocol, runtime_checkable +except ImportError: # pragma: no cover + # Python 3.7 + from typing_extensions import Protocol, runtime_checkable # type: ignore + + +FilesSpec = Dict[str, Union[str, bytes, 'FilesSpec']] # type: ignore + + +@runtime_checkable +class TreeMaker(Protocol): + def __truediv__(self, *args, **kwargs): + ... # pragma: no cover + + def mkdir(self, **kwargs): + ... # pragma: no cover + + def write_text(self, content, **kwargs): + ... # pragma: no cover + + def write_bytes(self, content): + ... # pragma: no cover + + +def _ensure_tree_maker(obj: Union[str, TreeMaker]) -> TreeMaker: + return obj if isinstance(obj, TreeMaker) else pathlib.Path(obj) # type: ignore + + +def build( + spec: FilesSpec, + prefix: Union[str, TreeMaker] = pathlib.Path(), # type: ignore +): + """ + Build a set of files/directories, as described by the spec. + + Each key represents a pathname, and the value represents + the content. Content may be a nested directory. + + >>> spec = { + ... 'README.txt': "A README file", + ... "foo": { + ... "__init__.py": "", + ... "bar": { + ... "__init__.py": "", + ... }, + ... "baz.py": "# Some code", + ... } + ... } + >>> target = getfixture('tmp_path') + >>> build(spec, target) + >>> target.joinpath('foo/baz.py').read_text(encoding='utf-8') + '# Some code' + """ + for name, contents in spec.items(): + create(contents, _ensure_tree_maker(prefix) / name) + + +@functools.singledispatch +def create(content: Union[str, bytes, FilesSpec], path): + path.mkdir(exist_ok=True) + build(content, prefix=path) # type: ignore + + +@create.register +def _(content: bytes, path): + path.write_bytes(content) + + +@create.register +def _(content: str, path): + path.write_text(content, encoding='utf-8') + + +@create.register +def _(content: str, path): + path.write_text(content, encoding='utf-8') + + +class Recording: + """ + A TreeMaker object that records everything that would be written. + + >>> r = Recording() + >>> build({'foo': {'foo1.txt': 'yes'}, 'bar.txt': 'abc'}, r) + >>> r.record + ['foo/foo1.txt', 'bar.txt'] + """ + + def __init__(self, loc=pathlib.PurePosixPath(), record=None): + self.loc = loc + self.record = record if record is not None else [] + + def __truediv__(self, other): + return Recording(self.loc / other, self.record) + + def write_text(self, content, **kwargs): + self.record.append(str(self.loc)) + + write_bytes = write_text + + def mkdir(self, **kwargs): + return diff --git a/Lib/test/test_importlib/fixtures.py b/Lib/test/test_importlib/fixtures.py index e7be77b3957c67..a364a977bce781 100644 --- a/Lib/test/test_importlib/fixtures.py +++ b/Lib/test/test_importlib/fixtures.py @@ -10,7 +10,10 @@ from test.support.os_helper import FS_NONASCII from test.support import requires_zlib -from typing import Dict, Union + +from . import _path +from ._path import FilesSpec + try: from importlib import resources # type: ignore @@ -83,13 +86,8 @@ def setUp(self): self.fixtures.enter_context(self.add_sys_path(self.site_dir)) -# Except for python/mypy#731, prefer to define -# FilesDef = Dict[str, Union['FilesDef', str]] -FilesDef = Dict[str, Union[Dict[str, Union[Dict[str, str], str]], str]] - - class DistInfoPkg(OnSysPath, SiteDir): - files: FilesDef = { + files: FilesSpec = { "distinfo_pkg-1.0.0.dist-info": { "METADATA": """ Name: distinfo-pkg @@ -131,7 +129,7 @@ def make_uppercase(self): class DistInfoPkgWithDot(OnSysPath, SiteDir): - files: FilesDef = { + files: FilesSpec = { "pkg_dot-1.0.0.dist-info": { "METADATA": """ Name: pkg.dot @@ -146,7 +144,7 @@ def setUp(self): class DistInfoPkgWithDotLegacy(OnSysPath, SiteDir): - files: FilesDef = { + files: FilesSpec = { "pkg.dot-1.0.0.dist-info": { "METADATA": """ Name: pkg.dot @@ -173,7 +171,7 @@ def setUp(self): class EggInfoPkg(OnSysPath, SiteDir): - files: FilesDef = { + files: FilesSpec = { "egginfo_pkg.egg-info": { "PKG-INFO": """ Name: egginfo-pkg @@ -212,8 +210,99 @@ def setUp(self): build_files(EggInfoPkg.files, prefix=self.site_dir) +class EggInfoPkgPipInstalledNoToplevel(OnSysPath, SiteDir): + files: FilesSpec = { + "egg_with_module_pkg.egg-info": { + "PKG-INFO": "Name: egg_with_module-pkg", + # SOURCES.txt is made from the source archive, and contains files + # (setup.py) that are not present after installation. + "SOURCES.txt": """ + egg_with_module.py + setup.py + egg_with_module_pkg.egg-info/PKG-INFO + egg_with_module_pkg.egg-info/SOURCES.txt + egg_with_module_pkg.egg-info/top_level.txt + """, + # installed-files.txt is written by pip, and is a strictly more + # accurate source than SOURCES.txt as to the installed contents of + # the package. + "installed-files.txt": """ + ../egg_with_module.py + PKG-INFO + SOURCES.txt + top_level.txt + """, + # missing top_level.txt (to trigger fallback to installed-files.txt) + }, + "egg_with_module.py": """ + def main(): + print("hello world") + """, + } + + def setUp(self): + super().setUp() + build_files(EggInfoPkgPipInstalledNoToplevel.files, prefix=self.site_dir) + + +class EggInfoPkgPipInstalledNoModules(OnSysPath, SiteDir): + files: FilesSpec = { + "egg_with_no_modules_pkg.egg-info": { + "PKG-INFO": "Name: egg_with_no_modules-pkg", + # SOURCES.txt is made from the source archive, and contains files + # (setup.py) that are not present after installation. + "SOURCES.txt": """ + setup.py + egg_with_no_modules_pkg.egg-info/PKG-INFO + egg_with_no_modules_pkg.egg-info/SOURCES.txt + egg_with_no_modules_pkg.egg-info/top_level.txt + """, + # installed-files.txt is written by pip, and is a strictly more + # accurate source than SOURCES.txt as to the installed contents of + # the package. + "installed-files.txt": """ + PKG-INFO + SOURCES.txt + top_level.txt + """, + # top_level.txt correctly reflects that no modules are installed + "top_level.txt": b"\n", + }, + } + + def setUp(self): + super().setUp() + build_files(EggInfoPkgPipInstalledNoModules.files, prefix=self.site_dir) + + +class EggInfoPkgSourcesFallback(OnSysPath, SiteDir): + files: FilesSpec = { + "sources_fallback_pkg.egg-info": { + "PKG-INFO": "Name: sources_fallback-pkg", + # SOURCES.txt is made from the source archive, and contains files + # (setup.py) that are not present after installation. + "SOURCES.txt": """ + sources_fallback.py + setup.py + sources_fallback_pkg.egg-info/PKG-INFO + sources_fallback_pkg.egg-info/SOURCES.txt + """, + # missing installed-files.txt (i.e. not installed by pip) and + # missing top_level.txt (to trigger fallback to SOURCES.txt) + }, + "sources_fallback.py": """ + def main(): + print("hello world") + """, + } + + def setUp(self): + super().setUp() + build_files(EggInfoPkgSourcesFallback.files, prefix=self.site_dir) + + class EggInfoFile(OnSysPath, SiteDir): - files: FilesDef = { + files: FilesSpec = { "egginfo_file.egg-info": """ Metadata-Version: 1.0 Name: egginfo_file @@ -233,38 +322,22 @@ def setUp(self): build_files(EggInfoFile.files, prefix=self.site_dir) -def build_files(file_defs, prefix=pathlib.Path()): - """Build a set of files/directories, as described by the +# dedent all text strings before writing +orig = _path.create.registry[str] +_path.create.register(str, lambda content, path: orig(DALS(content), path)) - file_defs dictionary. Each key/value pair in the dictionary is - interpreted as a filename/contents pair. If the contents value is a - dictionary, a directory is created, and the dictionary interpreted - as the files within it, recursively. - For example: +build_files = _path.build - {"README.txt": "A README file", - "foo": { - "__init__.py": "", - "bar": { - "__init__.py": "", - }, - "baz.py": "# Some code", - } - } - """ - for name, contents in file_defs.items(): - full_name = prefix / name - if isinstance(contents, dict): - full_name.mkdir() - build_files(contents, prefix=full_name) - else: - if isinstance(contents, bytes): - with full_name.open('wb') as f: - f.write(contents) - else: - with full_name.open('w', encoding='utf-8') as f: - f.write(DALS(contents)) + +def build_record(file_defs): + return ''.join(f'{name},,\n' for name in record_names(file_defs)) + + +def record_names(file_defs): + recording = _path.Recording() + _path.build(file_defs, recording) + return recording.record class FileBuilder: diff --git a/Lib/test/test_importlib/test_main.py b/Lib/test/test_importlib/test_main.py index 30b68b6ae7d86e..46cd2b696d4cc8 100644 --- a/Lib/test/test_importlib/test_main.py +++ b/Lib/test/test_importlib/test_main.py @@ -1,7 +1,10 @@ import re import pickle import unittest +import warnings import importlib.metadata +import contextlib +import itertools try: import pyfakefs.fake_filesystem_unittest as ffs @@ -9,6 +12,7 @@ from .stubs import fake_filesystem_unittest as ffs from . import fixtures +from ._context import suppress from importlib.metadata import ( Distribution, EntryPoint, @@ -22,6 +26,13 @@ ) +@contextlib.contextmanager +def suppress_known_deprecation(): + with warnings.catch_warnings(record=True) as ctx: + warnings.simplefilter('default', category=DeprecationWarning) + yield ctx + + class BasicTests(fixtures.DistInfoPkg, unittest.TestCase): version_pattern = r'\d+\.\d+(\.\d)?' @@ -37,7 +48,7 @@ def test_for_name_does_not_exist(self): def test_package_not_found_mentions_metadata(self): """ When a package is not found, that could indicate that the - packgae is not installed or that it is installed without + package is not installed or that it is installed without metadata. Ensure the exception mentions metadata to help guide users toward the cause. See #124. """ @@ -46,8 +57,12 @@ def test_package_not_found_mentions_metadata(self): assert "metadata" in str(ctx.exception) - def test_new_style_classes(self): - self.assertIsInstance(Distribution, type) + # expected to fail until ABC is enforced + @suppress(AssertionError) + @suppress_known_deprecation() + def test_abc_enforced(self): + with self.assertRaises(TypeError): + type('DistributionSubclass', (Distribution,), {})() @fixtures.parameterize( dict(name=None), @@ -172,11 +187,21 @@ def test_metadata_loads_egg_info(self): assert meta['Description'] == 'pôrˈtend' -class DiscoveryTests(fixtures.EggInfoPkg, fixtures.DistInfoPkg, unittest.TestCase): +class DiscoveryTests( + fixtures.EggInfoPkg, + fixtures.EggInfoPkgPipInstalledNoToplevel, + fixtures.EggInfoPkgPipInstalledNoModules, + fixtures.EggInfoPkgSourcesFallback, + fixtures.DistInfoPkg, + unittest.TestCase, +): def test_package_discovery(self): dists = list(distributions()) assert all(isinstance(dist, Distribution) for dist in dists) assert any(dist.metadata['Name'] == 'egginfo-pkg' for dist in dists) + assert any(dist.metadata['Name'] == 'egg_with_module-pkg' for dist in dists) + assert any(dist.metadata['Name'] == 'egg_with_no_modules-pkg' for dist in dists) + assert any(dist.metadata['Name'] == 'sources_fallback-pkg' for dist in dists) assert any(dist.metadata['Name'] == 'distinfo-pkg' for dist in dists) def test_invalid_usage(self): @@ -324,3 +349,79 @@ def test_packages_distributions_neither_toplevel_nor_files(self): prefix=self.site_dir, ) packages_distributions() + + def test_packages_distributions_all_module_types(self): + """ + Test top-level modules detected on a package without 'top-level.txt'. + """ + suffixes = importlib.machinery.all_suffixes() + metadata = dict( + METADATA=""" + Name: all_distributions + Version: 1.0.0 + """, + ) + files = { + 'all_distributions-1.0.0.dist-info': metadata, + } + for i, suffix in enumerate(suffixes): + files.update( + { + f'importable-name {i}{suffix}': '', + f'in_namespace_{i}': { + f'mod{suffix}': '', + }, + f'in_package_{i}': { + '__init__.py': '', + f'mod{suffix}': '', + }, + } + ) + metadata.update(RECORD=fixtures.build_record(files)) + fixtures.build_files(files, prefix=self.site_dir) + + distributions = packages_distributions() + + for i in range(len(suffixes)): + assert distributions[f'importable-name {i}'] == ['all_distributions'] + assert distributions[f'in_namespace_{i}'] == ['all_distributions'] + assert distributions[f'in_package_{i}'] == ['all_distributions'] + + assert not any(name.endswith('.dist-info') for name in distributions) + + +class PackagesDistributionsEggTest( + fixtures.EggInfoPkg, + fixtures.EggInfoPkgPipInstalledNoToplevel, + fixtures.EggInfoPkgPipInstalledNoModules, + fixtures.EggInfoPkgSourcesFallback, + unittest.TestCase, +): + def test_packages_distributions_on_eggs(self): + """ + Test old-style egg packages with a variation of 'top_level.txt', + 'SOURCES.txt', and 'installed-files.txt', available. + """ + distributions = packages_distributions() + + def import_names_from_package(package_name): + return { + import_name + for import_name, package_names in distributions.items() + if package_name in package_names + } + + # egginfo-pkg declares one import ('mod') via top_level.txt + assert import_names_from_package('egginfo-pkg') == {'mod'} + + # egg_with_module-pkg has one import ('egg_with_module') inferred from + # installed-files.txt (top_level.txt is missing) + assert import_names_from_package('egg_with_module-pkg') == {'egg_with_module'} + + # egg_with_no_modules-pkg should not be associated with any import names + # (top_level.txt is empty, and installed-files.txt has no .py files) + assert import_names_from_package('egg_with_no_modules-pkg') == set() + + # sources_fallback-pkg has one import ('sources_fallback') inferred from + # SOURCES.txt (top_level.txt and installed-files.txt is missing) + assert import_names_from_package('sources_fallback-pkg') == {'sources_fallback'} diff --git a/Lib/test/test_importlib/test_metadata_api.py b/Lib/test/test_importlib/test_metadata_api.py index 71c47e62d27124..33c6e85ee94753 100644 --- a/Lib/test/test_importlib/test_metadata_api.py +++ b/Lib/test/test_importlib/test_metadata_api.py @@ -27,12 +27,14 @@ def suppress_known_deprecation(): class APITests( fixtures.EggInfoPkg, + fixtures.EggInfoPkgPipInstalledNoToplevel, + fixtures.EggInfoPkgPipInstalledNoModules, + fixtures.EggInfoPkgSourcesFallback, fixtures.DistInfoPkg, fixtures.DistInfoPkgWithDot, fixtures.EggInfoFile, unittest.TestCase, ): - version_pattern = r'\d+\.\d+(\.\d)?' def test_retrieves_version_of_self(self): @@ -63,15 +65,28 @@ def test_prefix_not_matched(self): distribution(prefix) def test_for_top_level(self): - self.assertEqual( - distribution('egginfo-pkg').read_text('top_level.txt').strip(), 'mod' - ) + tests = [ + ('egginfo-pkg', 'mod'), + ('egg_with_no_modules-pkg', ''), + ] + for pkg_name, expect_content in tests: + with self.subTest(pkg_name): + self.assertEqual( + distribution(pkg_name).read_text('top_level.txt').strip(), + expect_content, + ) def test_read_text(self): - top_level = [ - path for path in files('egginfo-pkg') if path.name == 'top_level.txt' - ][0] - self.assertEqual(top_level.read_text(), 'mod\n') + tests = [ + ('egginfo-pkg', 'mod\n'), + ('egg_with_no_modules-pkg', '\n'), + ] + for pkg_name, expect_content in tests: + with self.subTest(pkg_name): + top_level = [ + path for path in files(pkg_name) if path.name == 'top_level.txt' + ][0] + self.assertEqual(top_level.read_text(), expect_content) def test_entry_points(self): eps = entry_points() @@ -137,6 +152,28 @@ def test_metadata_for_this_package(self): classifiers = md.get_all('Classifier') assert 'Topic :: Software Development :: Libraries' in classifiers + def test_missing_key_legacy(self): + """ + Requesting a missing key will still return None, but warn. + """ + md = metadata('distinfo-pkg') + with suppress_known_deprecation(): + assert md['does-not-exist'] is None + + def test_get_key(self): + """ + Getting a key gets the key. + """ + md = metadata('egginfo-pkg') + assert md.get('Name') == 'egginfo-pkg' + + def test_get_missing_key(self): + """ + Requesting a missing key will return None. + """ + md = metadata('distinfo-pkg') + assert md.get('does-not-exist') is None + @staticmethod def _test_files(files): root = files[0].root @@ -159,6 +196,9 @@ def test_files_dist_info(self): def test_files_egg_info(self): self._test_files(files('egginfo-pkg')) + self._test_files(files('egg_with_module-pkg')) + self._test_files(files('egg_with_no_modules-pkg')) + self._test_files(files('sources_fallback-pkg')) def test_version_egg_info_file(self): self.assertEqual(version('egginfo-file'), '0.1') diff --git a/Misc/NEWS.d/next/Library/2023-04-16-19-48-21.gh-issue-103584.3mBTuM.rst b/Misc/NEWS.d/next/Library/2023-04-16-19-48-21.gh-issue-103584.3mBTuM.rst new file mode 100644 index 00000000000000..6d7c93ade9cd94 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-16-19-48-21.gh-issue-103584.3mBTuM.rst @@ -0,0 +1,12 @@ +Updated ``importlib.metadata`` with changes from ``importlib_metadata`` 5.2 +through 6.5.0, including: Support ``installed-files.txt`` for +``Distribution.files`` when present. ``PackageMetadata`` now stipulates an +additional ``get`` method allowing for easy querying of metadata keys that +may not be present. ``packages_distributions`` now honors packages and +modules with Python modules that not ``.py`` sources (e.g. ``.pyc``, +``.so``). Expand protocol for ``PackageMetadata.get_all`` to match the +upstream implementation of ``email.message.Message.get_all`` in +python/typeshed#9620. Deprecated use of ``Distribution`` without defining +abstract methods. Deprecated expectation that +``PackageMetadata.__getitem__`` will return ``None`` for missing keys. In +the future, it will raise a ``KeyError``. From a4967d9d5974562dc0b3d2fcb494483cce9b8122 Mon Sep 17 00:00:00 2001 From: Oleg Iarygin Date: Fri, 21 Apr 2023 17:27:50 +0400 Subject: [PATCH 217/349] gh-103082: Fix shifted field initialization in `instrumentation.c` (GH-103561) Fix shifted field initialization in instrumentation.c --- Python/instrumentation.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 853e8a10e81463..2a3b2b8ebeead7 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -16,14 +16,14 @@ static PyObject DISABLE = { - _PyObject_IMMORTAL_REFCNT, - &PyBaseObject_Type + .ob_refcnt = _PyObject_IMMORTAL_REFCNT, + .ob_type = &PyBaseObject_Type }; PyObject _PyInstrumentation_MISSING = { - _PyObject_IMMORTAL_REFCNT, - &PyBaseObject_Type + .ob_refcnt = _PyObject_IMMORTAL_REFCNT, + .ob_type = &PyBaseObject_Type }; static const int8_t EVENT_FOR_OPCODE[256] = { From dc328d398d8f65ec6d2fa493e16ceee75f6d774a Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Fri, 21 Apr 2023 11:30:30 -0400 Subject: [PATCH 218/349] gh-103661: Skip failing test on Windows. (#103662) --- Lib/test/test_importlib/test_metadata_api.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_importlib/test_metadata_api.py b/Lib/test/test_importlib/test_metadata_api.py index 33c6e85ee94753..d9027861848efc 100644 --- a/Lib/test/test_importlib/test_metadata_api.py +++ b/Lib/test/test_importlib/test_metadata_api.py @@ -76,12 +76,23 @@ def test_for_top_level(self): expect_content, ) + @staticmethod + def _workaround_103661(tests): + """ + Skip failing test for now is it's failing on buildbot workers. + See https://github.com/python/cpython/issues/103661. + """ + import platform + if platform.system() == 'Windows': + tests.remove(('egg_with_no_modules-pkg', '\n')) + return tests + def test_read_text(self): tests = [ ('egginfo-pkg', 'mod\n'), ('egg_with_no_modules-pkg', '\n'), ] - for pkg_name, expect_content in tests: + for pkg_name, expect_content in self._workaround_103661(tests): with self.subTest(pkg_name): top_level = [ path for path in files(pkg_name) if path.name == 'top_level.txt' From 0cb0871584d2288e436445ee32e585bf5af7c9de Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 21 Apr 2023 20:52:37 -0500 Subject: [PATCH 219/349] GH-103415: Document itertools.batched() in whatsnew.3.12 (#103670) --- Doc/whatsnew/3.12.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index b3bb065741d037..f9406653e625b5 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -309,6 +309,13 @@ fractions * Objects of type :class:`fractions.Fraction` now support float-style formatting. (Contributed by Mark Dickinson in :gh:`100161`.) +itertools +--------- + +* Added :class:`itertools.batched()` for collecting into even-sized + tuples where the last batch may be shorter than the rest. + (Contributed by Raymond Hettinger in :gh:`98363`.) + math ---- From 7d20783d45a9c78379fe79229b57e4c31610a623 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 21 Apr 2023 20:53:50 -0500 Subject: [PATCH 220/349] Minor improvements to the functools docs (#103672) * Use an f-string for improved readability * Put version notes in chronological order --- Doc/library/functools.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index d467e50bc7a424..d1289ce836210a 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -118,6 +118,7 @@ The :mod:`functools` module defines the following functions: def stdev(self): return statistics.stdev(self._data) + .. versionadded:: 3.8 .. versionchanged:: 3.12 Prior to Python 3.12, ``cached_property`` included an undocumented lock to @@ -126,8 +127,6 @@ The :mod:`functools` module defines the following functions: per-instance, which could result in unacceptably high lock contention. In Python 3.12+ this locking is removed. - .. versionadded:: 3.8 - .. function:: cmp_to_key(func) @@ -233,7 +232,7 @@ The :mod:`functools` module defines the following functions: @lru_cache(maxsize=32) def get_pep(num): 'Retrieve text of a Python Enhancement Proposal' - resource = 'https://peps.python.org/pep-%04d/' % num + resource = f'https://peps.python.org/pep-{num:04d}' try: with urllib.request.urlopen(resource) as s: return s.read() From 6b58d419a1bd62ac94274d108d59980a3eb6f6e0 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Sat, 22 Apr 2023 08:45:10 +0300 Subject: [PATCH 221/349] gh-103556: [inspect.Signature] disallow pos-or-kw params without default after pos-only with default (#103557) --- Lib/inspect.py | 10 ++--- Lib/test/test_inspect.py | 40 ++++++++++++++++--- ...-04-15-12-19-14.gh-issue-103556.TEf-2m.rst | 3 ++ 3 files changed, 41 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-15-12-19-14.gh-issue-103556.TEf-2m.rst diff --git a/Lib/inspect.py b/Lib/inspect.py index 4242b40c2a08df..6d1d7b766cb3bb 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -3006,7 +3006,7 @@ def __init__(self, parameters=None, *, return_annotation=_empty, if __validate_parameters__: params = OrderedDict() top_kind = _POSITIONAL_ONLY - kind_defaults = False + seen_default = False for param in parameters: kind = param.kind @@ -3021,21 +3021,19 @@ def __init__(self, parameters=None, *, return_annotation=_empty, kind.description) raise ValueError(msg) elif kind > top_kind: - kind_defaults = False top_kind = kind if kind in (_POSITIONAL_ONLY, _POSITIONAL_OR_KEYWORD): if param.default is _empty: - if kind_defaults: + if seen_default: # No default for this parameter, but the - # previous parameter of the same kind had - # a default + # previous parameter of had a default msg = 'non-default argument follows default ' \ 'argument' raise ValueError(msg) else: # There is a default for this parameter. - kind_defaults = True + seen_default = True if name in params: msg = 'duplicate parameter name: {!r}'.format(name) diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 6b342b1f00d654..42e3d709bd683f 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -2463,18 +2463,43 @@ def test_signature_object(self): self.assertEqual(str(S()), '()') self.assertEqual(repr(S().parameters), 'mappingproxy(OrderedDict())') - def test(po, pk, pod=42, pkd=100, *args, ko, **kwargs): + def test(po, /, pk, pkd=100, *args, ko, kod=10, **kwargs): pass + sig = inspect.signature(test) - po = sig.parameters['po'].replace(kind=P.POSITIONAL_ONLY) - pod = sig.parameters['pod'].replace(kind=P.POSITIONAL_ONLY) + self.assertTrue(repr(sig).startswith(' {42:'ham'}: pass foo_partial = functools.partial(foo, a=1) diff --git a/Misc/NEWS.d/next/Library/2023-04-15-12-19-14.gh-issue-103556.TEf-2m.rst b/Misc/NEWS.d/next/Library/2023-04-15-12-19-14.gh-issue-103556.TEf-2m.rst new file mode 100644 index 00000000000000..fe2267b7b79019 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-15-12-19-14.gh-issue-103556.TEf-2m.rst @@ -0,0 +1,3 @@ +Now creating :class:`inspect.Signature` objects with positional-only +parameter with a default followed by a positional-or-keyword parameter +without one is impossible. From b2862950dc05d313b228f02a8efdd8c9c59a8ff4 Mon Sep 17 00:00:00 2001 From: Paul Moore Date: Sat, 22 Apr 2023 12:19:23 +0100 Subject: [PATCH 222/349] gh-103559: Update bundled pip version to 23.1.1 (gh-103560) * Update bundled pip version to 23.1 * Update to pip 23.1.1 --- Lib/ensurepip/__init__.py | 2 +- ...ne-any.whl => pip-23.1.1-py3-none-any.whl} | Bin 2055563 -> 2064386 bytes ...-04-15-11-21-38.gh-issue-103559.a9rYHG.rst | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) rename Lib/ensurepip/_bundled/{pip-23.0.1-py3-none-any.whl => pip-23.1.1-py3-none-any.whl} (76%) create mode 100644 Misc/NEWS.d/next/Library/2023-04-15-11-21-38.gh-issue-103559.a9rYHG.rst diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py index 69b23de9e05025..4278422dfacc9f 100644 --- a/Lib/ensurepip/__init__.py +++ b/Lib/ensurepip/__init__.py @@ -10,7 +10,7 @@ __all__ = ["version", "bootstrap"] _PACKAGE_NAMES = ('pip',) -_PIP_VERSION = "23.0.1" +_PIP_VERSION = "23.1.1" _PROJECTS = [ ("pip", _PIP_VERSION, "py3"), ] diff --git a/Lib/ensurepip/_bundled/pip-23.0.1-py3-none-any.whl b/Lib/ensurepip/_bundled/pip-23.1.1-py3-none-any.whl similarity index 76% rename from Lib/ensurepip/_bundled/pip-23.0.1-py3-none-any.whl rename to Lib/ensurepip/_bundled/pip-23.1.1-py3-none-any.whl index a855dc40e8630d1e3953e162af76cc5b0a11952b..dee4c0304b2c364ddf7147b0ec6a206631302426 100644 GIT binary patch delta 470130 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

    9>f+`sUO!`caGrD}z`)DCSYNnM!t&qeS^P*5HF= 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

    e>#3aY zb@nODmb~1KC@u*4*OERrqlPb9E)a^mj*yl~Pj}Ilwn+M}Rihh`-a#8@)LU(arxaEh ziPd^b;>;R@C9Ro)yG|23Rt1ls9L>md7Ei>|2^xSTk3R25N0PTgOT81Ll1`8yJ!E32 z5@B>#35K3^y;ZQ<(Gpj{{nxkmWR54<>EB<`8fq!bbK|eb0Ggq=~N6= zlP0U#1BJO8?ZaA_a|R?!u=dqlUF%(M0+R#mn@Wq|6ymdIH4JVXh2aWi8B2xMVpau` zHDd@^X|(3(yYxBh2G^7f(f1fG0b8@zXHx}np$(VMOvD2D%YuUz{ zpOv2WQ5I>q3@L&fr35qDT&iD!$TsB0cs<;EO>aHKEn0~S5QYkXk~Af$#D{KP`Ck&8 zjb=Ji-u+$Y()>yc3jZ$2%LbI#t|drI1wahk`$x-XKVPwT@{=N>Z)i#ChPo#~Q9p&c zHmzN)DE)hL*{y+Grn`+khhM`$nA3%9nMwl7Z!zrv)YO6n*{Y^m!Sz{V&J*xm2XjcY z#iYbks403%vzfDs*2LG+vmvzv^zWPW#4VzgdA|is-RytYf{#1cTtJUEUxb%DbUh3M zW4#_acbZ!lz3OtlbjR-=XFWJhovt))PBWd%9P@>kMevyqA*BS~VsisZ!aW{w#B8R7 zteU)v$1!xUc>D9#eY*4(CnWWY3yBW%SMI>%0Dl-~*T+0Ru3$ZxOmDi@j%Sb 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ⅈ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

    rB+J6DTG6TD07}61UbaWK;s%pZ8~te^jY4iT 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 PMn%h^IUIG5Uy}b1*KoQd delta 462124 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

    H^jdYIidGd)KEAXL^$Bq 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∋oqM7fe&bUM97W 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 Date: Sat, 22 Apr 2023 08:29:40 -0500 Subject: [PATCH 223/349] Descriptor HowTo: Update to include attributes added in Python 3.10 (GH-103666) --- Doc/howto/descriptor.rst | 98 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 90 insertions(+), 8 deletions(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 74710d9b3fc2ed..3688c47f0d6ec9 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -1273,11 +1273,14 @@ Using the non-data descriptor protocol, a pure Python version of .. testcode:: + import functools + class StaticMethod: "Emulate PyStaticMethod_Type() in Objects/funcobject.c" def __init__(self, f): self.f = f + functools.update_wrapper(self, f) def __get__(self, obj, objtype=None): return self.f @@ -1285,13 +1288,19 @@ Using the non-data descriptor protocol, a pure Python version of def __call__(self, *args, **kwds): return self.f(*args, **kwds) +The :func:`functools.update_wrapper` call adds a ``__wrapped__`` attribute +that refers to the underlying function. Also it carries forward +the attributes necessary to make the wrapper look like the wrapped +function: ``__name__``, ``__qualname__``, ``__doc__``, and ``__annotations__``. + .. testcode:: :hide: class E_sim: @StaticMethod - def f(x): - return x * 10 + def f(x: int) -> str: + "Simple function example" + return "!" * x wrapped_ord = StaticMethod(ord) @@ -1299,11 +1308,51 @@ Using the non-data descriptor protocol, a pure Python version of :hide: >>> E_sim.f(3) - 30 + '!!!' >>> E_sim().f(3) - 30 + '!!!' + + >>> sm = vars(E_sim)['f'] + >>> type(sm).__name__ + 'StaticMethod' + >>> f = E_sim.f + >>> type(f).__name__ + 'function' + >>> sm.__name__ + 'f' + >>> f.__name__ + 'f' + >>> sm.__qualname__ + 'E_sim.f' + >>> f.__qualname__ + 'E_sim.f' + >>> sm.__doc__ + 'Simple function example' + >>> f.__doc__ + 'Simple function example' + >>> sm.__annotations__ + {'x': , 'return': } + >>> f.__annotations__ + {'x': , 'return': } + >>> sm.__module__ == f.__module__ + True + >>> sm(3) + '!!!' + >>> f(3) + '!!!' + >>> wrapped_ord('A') 65 + >>> wrapped_ord.__module__ == ord.__module__ + True + >>> wrapped_ord.__wrapped__ == ord + True + >>> wrapped_ord.__name__ == ord.__name__ + True + >>> wrapped_ord.__qualname__ == ord.__qualname__ + True + >>> wrapped_ord.__doc__ == ord.__doc__ + True Class methods @@ -1359,11 +1408,14 @@ Using the non-data descriptor protocol, a pure Python version of .. testcode:: + import functools + class ClassMethod: "Emulate PyClassMethod_Type() in Objects/funcobject.c" def __init__(self, f): self.f = f + functools.update_wrapper(self, f) def __get__(self, obj, cls=None): if cls is None: @@ -1380,8 +1432,9 @@ Using the non-data descriptor protocol, a pure Python version of # Verify the emulation works class T: @ClassMethod - def cm(cls, x, y): - return (cls, x, y) + def cm(cls, x: int, y: str) -> tuple[str, int, str]: + "Class method that returns a tuple" + return (cls.__name__, x, y) @ClassMethod @property @@ -1393,17 +1446,40 @@ Using the non-data descriptor protocol, a pure Python version of :hide: >>> T.cm(11, 22) - (, 11, 22) + ('T', 11, 22) # Also call it from an instance >>> t = T() >>> t.cm(11, 22) - (, 11, 22) + ('T', 11, 22) # Check the alternate path for chained descriptors >>> T.__doc__ "A doc for 'T'" + # Verify that T uses our emulation + >>> type(vars(T)['cm']).__name__ + 'ClassMethod' + + # Verify that update_wrapper() correctly copied attributes + >>> T.cm.__name__ + 'cm' + >>> T.cm.__qualname__ + 'T.cm' + >>> T.cm.__doc__ + 'Class method that returns a tuple' + >>> T.cm.__annotations__ + {'x': , 'y': , 'return': tuple[str, int, str]} + + # Verify that __wrapped__ was added and works correctly + >>> f = vars(T)['cm'].__wrapped__ + >>> type(f).__name__ + 'function' + >>> f.__name__ + 'cm' + >>> f(T, 11, 22) + ('T', 11, 22) + The code path for ``hasattr(type(self.f), '__get__')`` was added in Python 3.9 and makes it possible for :func:`classmethod` to support @@ -1423,6 +1499,12 @@ chained together. In Python 3.11, this functionality was deprecated. >>> G.__doc__ "A doc for 'G'" +The :func:`functools.update_wrapper` call in ``ClassMethod`` adds a +``__wrapped__`` attribute that refers to the underlying function. Also +it carries forward the attributes necessary to make the wrapper look +like the wrapped function: ``__name__``, ``__qualname__``, ``__doc__``, +and ``__annotations__``. + Member objects and __slots__ ---------------------------- From e5eaac6064561c8f7643011a31fa506e78330798 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 22 Apr 2023 09:18:25 -0500 Subject: [PATCH 224/349] GH-103475: cache() and lru_cache() do not have a "call once" guarantee (GH-103669) --- Doc/library/functools.rst | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index d1289ce836210a..29cbc87bf66d12 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -49,8 +49,13 @@ The :mod:`functools` module defines the following functions: >>> factorial(12) # makes two new recursive calls, the other 10 are cached 479001600 - The cache is threadsafe so the wrapped function can be used in multiple - threads. + The cache is threadsafe so that the wrapped function can be used in + multiple threads. This means that the underlying data structure will + remain coherent during concurrent updates. + + It is possible for the wrapped function to be called more than once if + another thread makes an additional call before the initial call has been + completed and cached. .. versionadded:: 3.9 @@ -158,8 +163,13 @@ The :mod:`functools` module defines the following functions: *maxsize* most recent calls. It can save time when an expensive or I/O bound function is periodically called with the same arguments. - The cache is threadsafe so the wrapped function can be used in multiple - threads. + The cache is threadsafe so that the wrapped function can be used in + multiple threads. This means that the underlying data structure will + remain coherent during concurrent updates. + + It is possible for the wrapped function to be called more than once if + another thread makes an additional call before the initial call has been + completed and cached. Since a dictionary is used to cache results, the positional and keyword arguments to the function must be :term:`hashable`. From caed49448d195565940caf198cf0edda65ee5679 Mon Sep 17 00:00:00 2001 From: Rafael Fontenelle Date: Sat, 22 Apr 2023 11:24:47 -0300 Subject: [PATCH 225/349] GH-103484: Fix broken links reported by linkcheck (#103608) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Doc: Fix broken links reported by linkcheck * Apply suggestions from code review - Remove extra diff line in faq/library.rst (merwok) - Use HTTPS to link Unicode 15.0.0 to solve a redirect (hugovk) - Use wayback machine link for openssl 1.1.0 instead of linking 1.1.1, "as this text mentions a feature from 1.1.0" (hugovk) Co-authored-by: Éric Co-authored-by: Hugo van Kemenade * Doc: Make mark-up code as literal * Doc: Alphabetize items in linkcheck_ignore Co-authored-by: Hugo van Kemenade * Doc: Improve comment in sphinx conf Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --------- Co-authored-by: Éric Co-authored-by: Hugo van Kemenade Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/conf.py | 18 ++++++++++++++++++ Doc/distributing/index.rst | 12 ++++-------- Doc/faq/library.rst | 2 +- Doc/howto/functional.rst | 4 ++-- Doc/howto/urllib2.rst | 4 ++-- Doc/library/readline.rst | 2 +- Doc/library/stdtypes.rst | 17 +++++++++-------- Doc/library/zipfile.rst | 2 +- Doc/whatsnew/2.6.rst | 2 +- Doc/whatsnew/2.7.rst | 2 +- Misc/NEWS.d/3.7.0b2.rst | 2 +- Misc/NEWS.d/3.8.0a1.rst | 2 +- Misc/NEWS.d/3.9.0a1.rst | 2 +- Misc/NEWS.d/3.9.0a2.rst | 2 +- Misc/NEWS.d/3.9.0a4.rst | 2 +- 15 files changed, 45 insertions(+), 30 deletions(-) diff --git a/Doc/conf.py b/Doc/conf.py index 60404fd3829e5b..4c120bee64dde4 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -263,6 +263,24 @@ r'https://github.com/python/cpython/tree/.*': 'https://github.com/python/cpython/blob/.*' } +linkcheck_anchors_ignore = [ + # ignore anchors that start with a '/', e.g. Wikipedia media files: + # https://en.wikipedia.org/wiki/Walrus#/media/File:Pacific_Walrus_-_Bull_(8247646168).jpg + r'\/.*', +] + +linkcheck_ignore = [ + # The crawler gets "Anchor not found" + r'https://developer.apple.com/documentation/.+?#.*', + r'https://devguide.python.org.+?/#.*', + r'https://github.com.+?#.*', + # Robot crawlers not allowed: "403 Client Error: Forbidden" + r'https://support.enthought.com/hc/.*', + # SSLError CertificateError, even though it is valid + r'https://unix.org/version2/whatsnew/lp64_wp.html', +] + + # Options for extensions # ---------------------- diff --git a/Doc/distributing/index.rst b/Doc/distributing/index.rst index 21389adedf9c15..d237f8f082d87b 100644 --- a/Doc/distributing/index.rst +++ b/Doc/distributing/index.rst @@ -129,14 +129,10 @@ involved in creating and publishing a project: * `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 Package Index: \ - https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives -.. _The .pypirc file: \ - https://packaging.python.org/specifications/pypirc/ +.. _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 Package Index: https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives +.. _The .pypirc file: https://packaging.python.org/specifications/pypirc/ How do I...? diff --git a/Doc/faq/library.rst b/Doc/faq/library.rst index a9cde456575020..597caaa778e1c8 100644 --- a/Doc/faq/library.rst +++ b/Doc/faq/library.rst @@ -780,7 +780,7 @@ socket to :meth:`select.select` to check if it's writable. The :mod:`asyncio` module provides a general purpose single-threaded and concurrent asynchronous library, which can be used for writing non-blocking network code. - The third-party `Twisted `_ library is + The third-party `Twisted `_ library is a popular and feature-rich alternative. diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst index 38a651b0f964a6..5cf12cc52bde4e 100644 --- a/Doc/howto/functional.rst +++ b/Doc/howto/functional.rst @@ -1208,8 +1208,8 @@ General ------- **Structure and Interpretation of Computer Programs**, by Harold Abelson and -Gerald Jay Sussman with Julie Sussman. Full text at -https://mitpress.mit.edu/sicp/. In this classic textbook of computer science, +Gerald Jay Sussman with Julie Sussman. The book can be found at +https://mitpress.mit.edu/sicp. In this classic textbook of computer science, chapters 2 and 3 discuss the use of sequences and streams to organize the data flow inside a program. The book uses Scheme for its examples, but many of the design approaches described in these chapters are applicable to functional-style diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst index 69af3c3a85c5d6..61ba6bd7224fcc 100644 --- a/Doc/howto/urllib2.rst +++ b/Doc/howto/urllib2.rst @@ -86,7 +86,7 @@ response:: import urllib.request - req = urllib.request.Request('http://www.voidspace.org.uk') + req = urllib.request.Request('http://python.org/') with urllib.request.urlopen(req) as response: the_page = response.read() @@ -458,7 +458,7 @@ To illustrate creating and installing a handler we will use the ``HTTPBasicAuthHandler``. For a more detailed discussion of this subject -- including an explanation of how Basic Authentication works - see the `Basic Authentication Tutorial -`_. +`__. When authentication is required, the server sends a header (as well as the 401 error code) requesting authentication. This specifies the authentication scheme diff --git a/Doc/library/readline.rst b/Doc/library/readline.rst index 4d485d25b54020..8fb0eca8df74d8 100644 --- a/Doc/library/readline.rst +++ b/Doc/library/readline.rst @@ -19,7 +19,7 @@ function. Readline keybindings may be configured via an initialization file, typically ``.inputrc`` in your home directory. See `Readline Init File -`_ +`_ in the GNU Readline manual for information about the format and allowable constructs of that file, and the capabilities of the Readline library in general. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index bcfc6e5cfce611..aea2410bae354b 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1605,8 +1605,8 @@ expression support in the :mod:`re` module). converts it to ``"ss"``. The casefolding algorithm is - `described in section 3.13 of the Unicode Standard - `__. + `described in section 3.13 'Default Case Folding' of the Unicode Standard + `__. .. versionadded:: 3.3 @@ -1768,8 +1768,9 @@ expression support in the :mod:`re` module). one character, ``False`` otherwise. Alphabetic characters are those characters defined in the Unicode character database as "Letter", i.e., those with general category property being one of "Lm", "Lt", "Lu", "Ll", or "Lo". Note that this is different - from the `Alphabetic property defined in the Unicode Standard - `_. + from the `Alphabetic property defined in the section 4.10 'Letters, Alphabetic, and + Ideographic' of the Unicode Standard + `_. .. method:: str.isascii() @@ -1904,8 +1905,8 @@ expression support in the :mod:`re` module). lowercase. The lowercasing algorithm used is - `described in section 3.13 of the Unicode Standard - `__. + `described in section 3.13 'Default Case Folding' of the Unicode Standard + `__. .. method:: str.lstrip([chars]) @@ -2250,8 +2251,8 @@ expression support in the :mod:`re` module). titlecase). The uppercasing algorithm used is - `described in section 3.13 of the Unicode Standard - `__. + `described in section 3.13 'Default Case Folding' of the Unicode Standard + `__. .. method:: str.zfill(width) diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index e2a085d6e98e67..6f4826cb065c64 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -7,7 +7,7 @@ .. moduleauthor:: James C. Ahlstrom .. sectionauthor:: James C. Ahlstrom -**Source code:** :source:`Lib/zipfile.py` +**Source code:** :source:`Lib/zipfile/` -------------- diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index 34f2656f765c7d..4ee2aacb108a36 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -172,7 +172,7 @@ this edition of "What's New in Python" links to the bug/patch item for each change. Hosting of the Python bug tracker is kindly provided by -`Upfront Systems `__ +`Upfront Systems `__ of Stellenbosch, South Africa. Martin von Löwis put a lot of effort into importing existing bugs and patches from SourceForge; his scripts for this import operation are at diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst index 810a2cd2537c34..36afcb163f1afc 100644 --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -2104,7 +2104,7 @@ Changes to Python's build process and to the C API include: * The latest release of the GNU Debugger, GDB 7, can be `scripted using Python - `__. + `__. When you begin debugging an executable program P, GDB will look for a file named ``P-gdb.py`` and automatically read it. Dave Malcolm contributed a :file:`python-gdb.py` that adds a number of diff --git a/Misc/NEWS.d/3.7.0b2.rst b/Misc/NEWS.d/3.7.0b2.rst index b2ade206bd5f97..9590914599bb86 100644 --- a/Misc/NEWS.d/3.7.0b2.rst +++ b/Misc/NEWS.d/3.7.0b2.rst @@ -357,7 +357,7 @@ Wirtel Add TLSVersion constants and SSLContext.maximum_version / minimum_version attributes. The new API wraps OpenSSL 1.1 -https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html +https://web.archive.org/web/20180309043602/https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html feature. .. diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst index 991bbc128670b2..db2eba32e6ea34 100644 --- a/Misc/NEWS.d/3.8.0a1.rst +++ b/Misc/NEWS.d/3.8.0a1.rst @@ -5951,7 +5951,7 @@ Wirtel Add TLSVersion constants and SSLContext.maximum_version / minimum_version attributes. The new API wraps OpenSSL 1.1 -https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html +https://web.archive.org/web/20180309043602/https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html feature. .. diff --git a/Misc/NEWS.d/3.9.0a1.rst b/Misc/NEWS.d/3.9.0a1.rst index 633620583838df..0888a5c43087b5 100644 --- a/Misc/NEWS.d/3.9.0a1.rst +++ b/Misc/NEWS.d/3.9.0a1.rst @@ -4887,7 +4887,7 @@ Fix use of registry values to launch Python from Microsoft Store app. .. section: Windows Fix memory leak on Windows in creating an SSLContext object or running -urllib.request.urlopen('https://...'). +``urllib.request.urlopen('https://...')``. .. diff --git a/Misc/NEWS.d/3.9.0a2.rst b/Misc/NEWS.d/3.9.0a2.rst index 226ea0d3df2243..a03eb10f1d523a 100644 --- a/Misc/NEWS.d/3.9.0a2.rst +++ b/Misc/NEWS.d/3.9.0a2.rst @@ -686,7 +686,7 @@ added. Update documentation to state that to activate virtual environments under fish one should use `source`, not `.` as documented at -https://fishshell.com/docs/current/commands.html#source. +https://fishshell.com/docs/current/cmds/source.html. .. diff --git a/Misc/NEWS.d/3.9.0a4.rst b/Misc/NEWS.d/3.9.0a4.rst index 2aef8b26b01696..019b34c4082d10 100644 --- a/Misc/NEWS.d/3.9.0a4.rst +++ b/Misc/NEWS.d/3.9.0a4.rst @@ -392,7 +392,7 @@ The distutils ``bdist_msi`` command is deprecated in Python 3.9, use Improved performance of zipfile.Path for files with a large number of entries. Also improved performance and fixed minor issue as published with `importlib_metadata 1.5 -`_. +`_. .. From 3d2a46845b67407e2436d910b2e1740c34f4f10d Mon Sep 17 00:00:00 2001 From: Eric Wieser Date: Sat, 22 Apr 2023 17:32:47 +0100 Subject: [PATCH 226/349] gh-83791: Raise TypeError for len(memoryview_0d) (#18463) Changes the behaviour of `len` on a zero-dimensional `memoryview` to raise `TypeError`. Previously, `len` would return `1`. --- Doc/library/stdtypes.rst | 15 +++++++----- Lib/test/test_buffer.py | 6 +++-- Lib/test/test_ctypes/test_pep3118.py | 24 +++++++++---------- .../2020-02-11-15-54-40.bpo-39610.fvgsCl.rst | 2 ++ Objects/memoryobject.c | 6 ++++- 5 files changed, 31 insertions(+), 22 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-02-11-15-54-40.bpo-39610.fvgsCl.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index aea2410bae354b..2360472b31f175 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -3715,12 +3715,15 @@ copying. types such as :class:`bytes` and :class:`bytearray`, an element is a single byte, but other types such as :class:`array.array` may have bigger elements. - ``len(view)`` is equal to the length of :class:`~memoryview.tolist`. - If ``view.ndim = 0``, the length is 1. If ``view.ndim = 1``, the length - is equal to the number of elements in the view. For higher dimensions, - the length is equal to the length of the nested list representation of - the view. The :class:`~memoryview.itemsize` attribute will give you the - number of bytes in a single element. + ``len(view)`` is equal to the length of :class:`~memoryview.tolist`, which + is the nested list representation of the view. If ``view.ndim = 1``, + this is equal to the number of elements in the view. + + .. versionchanged:: 3.12 + If ``view.ndim == 0``, ``len(view)`` now raises :exc:`TypeError` instead of returning 1. + + The :class:`~memoryview.itemsize` attribute will give you the number of + bytes in a single element. A :class:`memoryview` supports slicing and indexing to expose its data. One-dimensional slicing will result in a subview:: diff --git a/Lib/test/test_buffer.py b/Lib/test/test_buffer.py index 8ac3b7e7eb29d1..098d2d999643cb 100644 --- a/Lib/test/test_buffer.py +++ b/Lib/test/test_buffer.py @@ -965,8 +965,10 @@ def check_memoryview(m, expected_readonly=readonly): self.assertEqual(m.strides, tuple(strides)) self.assertEqual(m.suboffsets, tuple(suboffsets)) - n = 1 if ndim == 0 else len(lst) - self.assertEqual(len(m), n) + if ndim == 0: + self.assertRaises(TypeError, len, m) + else: + self.assertEqual(len(m), len(lst)) rep = result.tolist() if fmt else result.tobytes() self.assertEqual(rep, lst) diff --git a/Lib/test/test_ctypes/test_pep3118.py b/Lib/test/test_ctypes/test_pep3118.py index c8a70e3e335693..038161745df905 100644 --- a/Lib/test/test_ctypes/test_pep3118.py +++ b/Lib/test/test_ctypes/test_pep3118.py @@ -28,7 +28,7 @@ def test_native_types(self): if shape: self.assertEqual(len(v), shape[0]) else: - self.assertEqual(len(v) * sizeof(itemtp), sizeof(ob)) + self.assertRaises(TypeError, len, v) self.assertEqual(v.itemsize, sizeof(itemtp)) self.assertEqual(v.shape, shape) # XXX Issue #12851: PyCData_NewGetBuffer() must provide strides @@ -39,11 +39,10 @@ def test_native_types(self): # they are always read/write self.assertFalse(v.readonly) - if v.shape: - n = 1 - for dim in v.shape: - n = n * dim - self.assertEqual(n * v.itemsize, len(v.tobytes())) + n = 1 + for dim in v.shape: + n = n * dim + self.assertEqual(n * v.itemsize, len(v.tobytes())) except: # so that we can see the failing type print(tp) @@ -58,7 +57,7 @@ def test_endian_types(self): if shape: self.assertEqual(len(v), shape[0]) else: - self.assertEqual(len(v) * sizeof(itemtp), sizeof(ob)) + self.assertRaises(TypeError, len, v) self.assertEqual(v.itemsize, sizeof(itemtp)) self.assertEqual(v.shape, shape) # XXX Issue #12851 @@ -67,11 +66,10 @@ def test_endian_types(self): # they are always read/write self.assertFalse(v.readonly) - if v.shape: - n = 1 - for dim in v.shape: - n = n * dim - self.assertEqual(n, len(v)) + n = 1 + for dim in v.shape: + n = n * dim + self.assertEqual(n * v.itemsize, len(v.tobytes())) except: # so that we can see the failing type print(tp) @@ -243,7 +241,7 @@ class LEPoint(LittleEndianStructure): # endian_types = [ (BEPoint, "T{>l:x:>l:y:}".replace('l', s_long), (), BEPoint), - (LEPoint, "T{l:x:>l:y:}".replace('l', s_long), (), POINTER(BEPoint)), (POINTER(LEPoint), "&T{view.ndim == 0 ? 1 : self->view.shape[0]; + if (self->view.ndim == 0) { + PyErr_SetString(PyExc_TypeError, "0-dim memory has no length"); + return -1; + } + return self->view.shape[0]; } /* As mapping */ From 916de04fd1838530096336aadb3b94b774ed6c90 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 22 Apr 2023 13:52:51 -0400 Subject: [PATCH 227/349] gh-103661: Apply bugfix from importlib_metadata 6.5.1 and restore test. (#103681) --- Lib/importlib/metadata/__init__.py | 26 +++++++++++--------- Lib/test/test_importlib/test_metadata_api.py | 13 +--------- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/Lib/importlib/metadata/__init__.py b/Lib/importlib/metadata/__init__.py index b8eb19d05dccae..82e0ce1b281c54 100644 --- a/Lib/importlib/metadata/__init__.py +++ b/Lib/importlib/metadata/__init__.py @@ -516,27 +516,29 @@ def _read_files_egginfo_installed(self): """ Read installed-files.txt and return lines in a similar CSV-parsable format as RECORD: each file must be placed - relative to the site-packages directory, and must also be + relative to the site-packages directory and must also be quoted (since file names can contain literal commas). This file is written when the package is installed by pip, but it might not be written for other installation methods. - Hence, even if we can assume that this file is accurate - when it exists, we cannot assume that it always exists. + Assume the file is accurate if it exists. """ text = self.read_text('installed-files.txt') - # We need to prepend the .egg-info/ subdir to the lines in this file. - # But this subdir is only available in the PathDistribution's self._path - # which is not easily accessible from this base class... + # Prepend the .egg-info/ subdir to the lines in this file. + # But this subdir is only available from PathDistribution's + # self._path. subdir = getattr(self, '_path', None) if not text or not subdir: return - with contextlib.suppress(Exception): - ret = [ - str((subdir / line).resolve().relative_to(self.locate_file(''))) - for line in text.splitlines() - ] - return map('"{}"'.format, ret) + + paths = ( + (subdir / name) + .resolve() + .relative_to(self.locate_file('').resolve()) + .as_posix() + for name in text.splitlines() + ) + return map('"{}"'.format, paths) def _read_files_egginfo_sources(self): """ diff --git a/Lib/test/test_importlib/test_metadata_api.py b/Lib/test/test_importlib/test_metadata_api.py index d9027861848efc..33c6e85ee94753 100644 --- a/Lib/test/test_importlib/test_metadata_api.py +++ b/Lib/test/test_importlib/test_metadata_api.py @@ -76,23 +76,12 @@ def test_for_top_level(self): expect_content, ) - @staticmethod - def _workaround_103661(tests): - """ - Skip failing test for now is it's failing on buildbot workers. - See https://github.com/python/cpython/issues/103661. - """ - import platform - if platform.system() == 'Windows': - tests.remove(('egg_with_no_modules-pkg', '\n')) - return tests - def test_read_text(self): tests = [ ('egginfo-pkg', 'mod\n'), ('egg_with_no_modules-pkg', '\n'), ] - for pkg_name, expect_content in self._workaround_103661(tests): + for pkg_name, expect_content in tests: with self.subTest(pkg_name): top_level = [ path for path in files(pkg_name) if path.name == 'top_level.txt' From ea2c0016502472aa8baa3149050ada776d17a009 Mon Sep 17 00:00:00 2001 From: Eddie Elizondo Date: Sat, 22 Apr 2023 15:39:37 -0400 Subject: [PATCH 228/349] gh-84436: Implement Immortal Objects (gh-19474) This is the implementation of PEP683 Motivation: The PR introduces the ability to immortalize instances in CPython which bypasses reference counting. Tagging objects as immortal allows up to skip certain operations when we know that the object will be around for the entire execution of the runtime. Note that this by itself will bring a performance regression to the runtime due to the extra reference count checks. However, this brings the ability of having truly immutable objects that are useful in other contexts such as immutable data sharing between sub-interpreters. --- Doc/library/sys.rst | 7 + Doc/whatsnew/3.12.rst | 21 ++- Include/boolobject.h | 7 +- Include/cpython/unicodeobject.h | 17 ++- .../pycore_global_objects_fini_generated.h | 6 +- Include/internal/pycore_long.h | 2 +- Include/internal/pycore_object.h | 48 +++++-- Include/internal/pycore_runtime_init.h | 14 +- Include/internal/pycore_unicodeobject.h | 1 + Include/object.h | 133 ++++++++++++++++-- Include/pyport.h | 1 - Lib/test/_test_embed_structseq.py | 40 +++--- Lib/test/libregrtest/refleak.py | 14 +- Lib/test/test_builtin.py | 24 +++- Lib/test/test_ctypes/test_python_api.py | 3 +- Lib/test/test_sys.py | 3 +- Lib/test/test_venv.py | 12 +- ...3-04-02-22-14-57.gh-issue-84436.hvMgwF.rst | 3 + Modules/gcmodule.c | 15 +- Objects/boolobject.c | 10 +- Objects/bytes_methods.c | 9 +- Objects/longobject.c | 26 +++- Objects/object.c | 32 +++-- Objects/setobject.c | 5 +- Objects/sliceobject.c | 15 +- Objects/typeobject.c | 16 --- Objects/unicodeobject.c | 101 ++++++++----- Programs/_testembed.c | 3 +- Python/ceval.c | 10 +- Python/clinic/sysmodule.c.h | 30 +++- Python/instrumentation.c | 4 +- Python/legacy_tracing.c | 2 +- Python/pylifecycle.c | 5 - Python/sysmodule.c | 13 ++ Tools/build/deepfreeze.py | 2 +- 35 files changed, 483 insertions(+), 171 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-04-02-22-14-57.gh-issue-84436.hvMgwF.rst diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index e37d57edce515f..7324f3113e0a08 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -670,6 +670,13 @@ always available. .. versionadded:: 3.4 +.. function:: getunicodeinternedsize() + + Return the number of unicode objects that have been interned. + + .. versionadded:: 3.12 + + .. function:: getandroidapilevel() Return the build time API version of Android as an integer. diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index f9406653e625b5..b98b7151a321ea 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -1129,6 +1129,24 @@ New Features to replace the legacy-api :c:func:`!PyErr_Display`. (Contributed by Irit Katriel in :gh:`102755`). +* :pep:`683`: Introduced Immortal Objects to Python which allows objects + to bypass reference counts and introduced changes to the C-API: + + - ``_Py_IMMORTAL_REFCNT``: The reference count that defines an object + as immortal. + - ``_Py_IsImmortal`` Checks if an object has the immortal reference count. + - ``PyObject_HEAD_INIT`` This will now initialize reference count to + ``_Py_IMMORTAL_REFCNT`` when used with ``Py_BUILD_CORE``. + - ``SSTATE_INTERNED_IMMORTAL`` An identifier for interned unicode objects + that are immortal. + - ``SSTATE_INTERNED_IMMORTAL_STATIC`` An identifier for interned unicode + objects that are immortal and static + - ``sys.getunicodeinternedsize`` This returns the total number of unicode + objects that have been interned. This is now needed for refleak.py to + correctly track reference counts and allocated blocks + + (Contributed by Eddie Elizondo in :gh:`84436`.) + Porting to Python 3.12 ---------------------- @@ -1293,8 +1311,7 @@ Removed * :c:func:`!PyUnicode_GetSize` * :c:func:`!PyUnicode_GET_DATA_SIZE` -* Remove the ``PyUnicode_InternImmortal()`` function and the - ``SSTATE_INTERNED_IMMORTAL`` macro. +* Remove the ``PyUnicode_InternImmortal()`` function macro. (Contributed by Victor Stinner in :gh:`85858`.) * Remove ``Jython`` compatibility hacks from several stdlib modules and tests. diff --git a/Include/boolobject.h b/Include/boolobject.h index ca21fbfad8e827..976fa35201d035 100644 --- a/Include/boolobject.h +++ b/Include/boolobject.h @@ -11,8 +11,7 @@ PyAPI_DATA(PyTypeObject) PyBool_Type; #define PyBool_Check(x) Py_IS_TYPE((x), &PyBool_Type) -/* Py_False and Py_True are the only two bools in existence. -Don't forget to apply Py_INCREF() when returning either!!! */ +/* Py_False and Py_True are the only two bools in existence. */ /* Don't use these directly */ PyAPI_DATA(PyLongObject) _Py_FalseStruct; @@ -31,8 +30,8 @@ PyAPI_FUNC(int) Py_IsFalse(PyObject *x); #define Py_IsFalse(x) Py_Is((x), Py_False) /* Macros for returning Py_True or Py_False, respectively */ -#define Py_RETURN_TRUE return Py_NewRef(Py_True) -#define Py_RETURN_FALSE return Py_NewRef(Py_False) +#define Py_RETURN_TRUE return Py_True +#define Py_RETURN_FALSE return Py_False /* Function to return a bool from a C long */ PyAPI_FUNC(PyObject *) PyBool_FromLong(long); diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 75a74ffa2f9dff..3394726dfffd72 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -98,9 +98,16 @@ typedef struct { Py_ssize_t length; /* Number of code points in the string */ Py_hash_t hash; /* Hash value; -1 if not set */ struct { - /* If interned is set, the two references from the - dictionary to this object are *not* counted in ob_refcnt. */ - unsigned int interned:1; + /* If interned is non-zero, the two references from the + dictionary to this object are *not* counted in ob_refcnt. + The possible values here are: + 0: Not Interned + 1: Interned + 2: Interned and Immortal + 3: Interned, Immortal, and Static + This categorization allows the runtime to determine the right + cleanup mechanism at runtime shutdown. */ + unsigned int interned:2; /* Character size: - PyUnicode_1BYTE_KIND (1): @@ -135,7 +142,7 @@ typedef struct { unsigned int ascii:1; /* Padding to ensure that PyUnicode_DATA() is always aligned to 4 bytes (see issue #19537 on m68k). */ - unsigned int :26; + unsigned int :25; } state; } PyASCIIObject; @@ -183,6 +190,8 @@ PyAPI_FUNC(int) _PyUnicode_CheckConsistency( /* Interning state. */ #define SSTATE_NOT_INTERNED 0 #define SSTATE_INTERNED_MORTAL 1 +#define SSTATE_INTERNED_IMMORTAL 2 +#define SSTATE_INTERNED_IMMORTAL_STATIC 3 /* Use only if you know it's a string */ static inline unsigned int PyUnicode_CHECK_INTERNED(PyObject *op) { diff --git a/Include/internal/pycore_global_objects_fini_generated.h b/Include/internal/pycore_global_objects_fini_generated.h index 14dfd9ea5823ed..fdfa80bd7d424a 100644 --- a/Include/internal/pycore_global_objects_fini_generated.h +++ b/Include/internal/pycore_global_objects_fini_generated.h @@ -8,15 +8,13 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_object.h" // _PyObject_IMMORTAL_REFCNT - #ifdef Py_DEBUG static inline void _PyStaticObject_CheckRefcnt(PyObject *obj) { - if (Py_REFCNT(obj) < _PyObject_IMMORTAL_REFCNT) { + if (Py_REFCNT(obj) < _Py_IMMORTAL_REFCNT) { _PyObject_ASSERT_FAILED_MSG(obj, "immortal object has less refcnt than expected " - "_PyObject_IMMORTAL_REFCNT"); + "_Py_IMMORTAL_REFCNT"); } } #endif diff --git a/Include/internal/pycore_long.h b/Include/internal/pycore_long.h index 137a0465d5ec60..fe86581e81f6b5 100644 --- a/Include/internal/pycore_long.h +++ b/Include/internal/pycore_long.h @@ -245,7 +245,7 @@ _PyLong_FlipSign(PyLongObject *op) { #define _PyLong_DIGIT_INIT(val) \ { \ - .ob_base = _PyObject_IMMORTAL_INIT(&PyLong_Type), \ + .ob_base = _PyObject_HEAD_INIT(&PyLong_Type) \ .long_value = { \ .lv_tag = TAG_FROM_SIGN_AND_SIZE( \ (val) == 0 ? 0 : ((val) < 0 ? -1 : 1), \ diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index b3d496ed6fc240..2ca047846e0935 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -14,21 +14,25 @@ extern "C" { #include "pycore_pystate.h" // _PyInterpreterState_GET() #include "pycore_runtime.h" // _PyRuntime -/* This value provides *effective* immortality, meaning the object should never - be deallocated (until runtime finalization). See PEP 683 for more details about - immortality, as well as a proposed mechanism for proper immortality. */ -#define _PyObject_IMMORTAL_REFCNT 999999999 - -#define _PyObject_IMMORTAL_INIT(type) \ - { \ - .ob_refcnt = _PyObject_IMMORTAL_REFCNT, \ - .ob_type = (type), \ - } -#define _PyVarObject_IMMORTAL_INIT(type, size) \ - { \ - .ob_base = _PyObject_IMMORTAL_INIT(type), \ - .ob_size = size, \ - } +/* We need to maintain an internal copy of Py{Var}Object_HEAD_INIT to avoid + designated initializer conflicts in C++20. If we use the deinition in + object.h, we will be mixing designated and non-designated initializers in + pycore objects which is forbiddent in C++20. However, if we then use + designated initializers in object.h then Extensions without designated break. + Furthermore, we can't use designated initializers in Extensions since these + are not supported pre-C++20. Thus, keeping an internal copy here is the most + backwards compatible solution */ +#define _PyObject_HEAD_INIT(type) \ + { \ + _PyObject_EXTRA_INIT \ + .ob_refcnt = _Py_IMMORTAL_REFCNT, \ + .ob_type = (type) \ + }, +#define _PyVarObject_HEAD_INIT(type, size) \ + { \ + .ob_base = _PyObject_HEAD_INIT(type) \ + .ob_size = size \ + }, PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalRefcountErrorFunc( const char *func, @@ -61,9 +65,20 @@ static inline void _Py_RefcntAdd(PyObject* op, Py_ssize_t n) } #define _Py_RefcntAdd(op, n) _Py_RefcntAdd(_PyObject_CAST(op), n) +static inline void _Py_SetImmortal(PyObject *op) +{ + if (op) { + op->ob_refcnt = _Py_IMMORTAL_REFCNT; + } +} +#define _Py_SetImmortal(op) _Py_SetImmortal(_PyObject_CAST(op)) + static inline void _Py_DECREF_SPECIALIZED(PyObject *op, const destructor destruct) { + if (_Py_IsImmortal(op)) { + return; + } _Py_DECREF_STAT_INC(); #ifdef Py_REF_DEBUG _Py_DEC_REFTOTAL(_PyInterpreterState_GET()); @@ -82,6 +97,9 @@ _Py_DECREF_SPECIALIZED(PyObject *op, const destructor destruct) static inline void _Py_DECREF_NO_DEALLOC(PyObject *op) { + if (_Py_IsImmortal(op)) { + return; + } _Py_DECREF_STAT_INC(); #ifdef Py_REF_DEBUG _Py_DEC_REFTOTAL(_PyInterpreterState_GET()); diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h index 5b09a45e41cd84..d8425b3199a89a 100644 --- a/Include/internal/pycore_runtime_init.h +++ b/Include/internal/pycore_runtime_init.h @@ -76,13 +76,13 @@ extern PyTypeObject _PyExc_MemoryError; .latin1 = _Py_str_latin1_INIT, \ }, \ .tuple_empty = { \ - .ob_base = _PyVarObject_IMMORTAL_INIT(&PyTuple_Type, 0) \ + .ob_base = _PyVarObject_HEAD_INIT(&PyTuple_Type, 0) \ }, \ .hamt_bitmap_node_empty = { \ - .ob_base = _PyVarObject_IMMORTAL_INIT(&_PyHamt_BitmapNode_Type, 0) \ + .ob_base = _PyVarObject_HEAD_INIT(&_PyHamt_BitmapNode_Type, 0) \ }, \ .context_token_missing = { \ - .ob_base = _PyObject_IMMORTAL_INIT(&_PyContextTokenMissing_Type), \ + .ob_base = _PyObject_HEAD_INIT(&_PyContextTokenMissing_Type) \ }, \ }, \ }, \ @@ -116,11 +116,11 @@ extern PyTypeObject _PyExc_MemoryError; .singletons = { \ ._not_used = 1, \ .hamt_empty = { \ - .ob_base = _PyObject_IMMORTAL_INIT(&_PyHamt_Type), \ + .ob_base = _PyObject_HEAD_INIT(&_PyHamt_Type) \ .h_root = (PyHamtNode*)&_Py_SINGLETON(hamt_bitmap_node_empty), \ }, \ .last_resort_memory_error = { \ - _PyObject_IMMORTAL_INIT(&_PyExc_MemoryError), \ + _PyObject_HEAD_INIT(&_PyExc_MemoryError) \ }, \ }, \ }, \ @@ -138,7 +138,7 @@ extern PyTypeObject _PyExc_MemoryError; #define _PyBytes_SIMPLE_INIT(CH, LEN) \ { \ - _PyVarObject_IMMORTAL_INIT(&PyBytes_Type, (LEN)), \ + _PyVarObject_HEAD_INIT(&PyBytes_Type, (LEN)) \ .ob_shash = -1, \ .ob_sval = { (CH) }, \ } @@ -149,7 +149,7 @@ extern PyTypeObject _PyExc_MemoryError; #define _PyUnicode_ASCII_BASE_INIT(LITERAL, ASCII) \ { \ - .ob_base = _PyObject_IMMORTAL_INIT(&PyUnicode_Type), \ + .ob_base = _PyObject_HEAD_INIT(&PyUnicode_Type) \ .length = sizeof(LITERAL) - 1, \ .hash = -1, \ .state = { \ diff --git a/Include/internal/pycore_unicodeobject.h b/Include/internal/pycore_unicodeobject.h index ff97b9a623d210..1bb0f366e78163 100644 --- a/Include/internal/pycore_unicodeobject.h +++ b/Include/internal/pycore_unicodeobject.h @@ -12,6 +12,7 @@ extern "C" { #include "pycore_ucnhash.h" // _PyUnicode_Name_CAPI void _PyUnicode_ExactDealloc(PyObject *op); +Py_ssize_t _PyUnicode_InternedSize(void); /* runtime lifecycle */ diff --git a/Include/object.h b/Include/object.h index 2943a6066818cd..66c3df0d7f780a 100644 --- a/Include/object.h +++ b/Include/object.h @@ -78,12 +78,76 @@ whose size is determined when the object is allocated. /* PyObject_HEAD defines the initial segment of every PyObject. */ #define PyObject_HEAD PyObject ob_base; -#define PyObject_HEAD_INIT(type) \ - { _PyObject_EXTRA_INIT \ - 1, (type) }, +/* +Immortalization: + +The following indicates the immortalization strategy depending on the amount +of available bits in the reference count field. All strategies are backwards +compatible but the specific reference count value or immortalization check +might change depending on the specializations for the underlying system. + +Proper deallocation of immortal instances requires distinguishing between +statically allocated immortal instances vs those promoted by the runtime to be +immortal. The latter should be the only instances that require +cleanup during runtime finalization. +*/ + +#if SIZEOF_VOID_P > 4 +/* +In 64+ bit systems, an object will be marked as immortal by setting all of the +lower 32 bits of the reference count field, which is equal to: 0xFFFFFFFF + +Using the lower 32 bits makes the value backwards compatible by allowing +C-Extensions without the updated checks in Py_INCREF and Py_DECREF to safely +increase and decrease the objects reference count. The object would lose its +immortality, but the execution would still be correct. + +Reference count increases will use saturated arithmetic, taking advantage of +having all the lower 32 bits set, which will avoid the reference count to go +beyond the refcount limit. Immortality checks for reference count decreases will +be done by checking the bit sign flag in the lower 32 bits. +*/ +#define _Py_IMMORTAL_REFCNT UINT_MAX + +#else +/* +In 32 bit systems, an object will be marked as immortal by setting all of the +lower 30 bits of the reference count field, which is equal to: 0x3FFFFFFF -#define PyVarObject_HEAD_INIT(type, size) \ - { PyObject_HEAD_INIT(type) (size) }, +Using the lower 30 bits makes the value backwards compatible by allowing +C-Extensions without the updated checks in Py_INCREF and Py_DECREF to safely +increase and decrease the objects reference count. The object would lose its +immortality, but the execution would still be correct. + +Reference count increases and decreases will first go through an immortality +check by comparing the reference count field to the immortality reference count. +*/ +#define _Py_IMMORTAL_REFCNT (UINT_MAX >> 2) +#endif + +// Make all internal uses of PyObject_HEAD_INIT immortal while preserving the +// C-API expectation that the refcnt will be set to 1. +#ifdef Py_BUILD_CORE +#define PyObject_HEAD_INIT(type) \ + { \ + _PyObject_EXTRA_INIT \ + { _Py_IMMORTAL_REFCNT }, \ + (type) \ + }, +#else +#define PyObject_HEAD_INIT(type) \ + { \ + _PyObject_EXTRA_INIT \ + { 1 }, \ + (type) \ + }, +#endif /* Py_BUILD_CORE */ + +#define PyVarObject_HEAD_INIT(type, size) \ + { \ + PyObject_HEAD_INIT(type) \ + (size) \ + }, /* PyObject_VAR_HEAD defines the initial segment of all variable-size * container objects. These end with a declaration of an array with 1 @@ -101,7 +165,12 @@ whose size is determined when the object is allocated. */ struct _object { _PyObject_HEAD_EXTRA - Py_ssize_t ob_refcnt; + union { + Py_ssize_t ob_refcnt; +#if SIZEOF_VOID_P > 4 + PY_UINT32_T ob_refcnt_split[2]; +#endif + }; PyTypeObject *ob_type; }; @@ -152,6 +221,15 @@ static inline Py_ssize_t Py_SIZE(PyObject *ob) { # define Py_SIZE(ob) Py_SIZE(_PyObject_CAST(ob)) #endif +static inline Py_ALWAYS_INLINE int _Py_IsImmortal(PyObject *op) +{ +#if SIZEOF_VOID_P > 4 + return _Py_CAST(PY_INT32_T, op->ob_refcnt) < 0; +#else + return op->ob_refcnt == _Py_IMMORTAL_REFCNT; +#endif +} +#define _Py_IsImmortal(op) _Py_IsImmortal(_PyObject_CAST(op)) static inline int Py_IS_TYPE(PyObject *ob, PyTypeObject *type) { return Py_TYPE(ob) == type; @@ -162,6 +240,13 @@ static inline int Py_IS_TYPE(PyObject *ob, PyTypeObject *type) { static inline void Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) { + // This immortal check is for code that is unaware of immortal objects. + // The runtime tracks these objects and we should avoid as much + // as possible having extensions inadvertently change the refcnt + // of an immortalized object. + if (_Py_IsImmortal(ob)) { + return; + } ob->ob_refcnt = refcnt; } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 @@ -524,19 +609,33 @@ PyAPI_FUNC(void) Py_DecRef(PyObject *); PyAPI_FUNC(void) _Py_IncRef(PyObject *); PyAPI_FUNC(void) _Py_DecRef(PyObject *); -static inline void Py_INCREF(PyObject *op) +static inline Py_ALWAYS_INLINE void Py_INCREF(PyObject *op) { #if defined(Py_REF_DEBUG) && defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030A0000 // Stable ABI for Python 3.10 built in debug mode. _Py_IncRef(op); #else - _Py_INCREF_STAT_INC(); // Non-limited C API and limited C API for Python 3.9 and older access // directly PyObject.ob_refcnt. +#if SIZEOF_VOID_P > 4 + // Portable saturated add, branching on the carry flag and set low bits + PY_UINT32_T cur_refcnt = op->ob_refcnt_split[PY_BIG_ENDIAN]; + PY_UINT32_T new_refcnt = cur_refcnt + 1; + if (new_refcnt == 0) { + return; + } + op->ob_refcnt_split[PY_BIG_ENDIAN] = new_refcnt; +#else + // Explicitly check immortality against the immortal value + if (_Py_IsImmortal(op)) { + return; + } + op->ob_refcnt++; +#endif + _Py_INCREF_STAT_INC(); #ifdef Py_REF_DEBUG _Py_INC_REFTOTAL(); -#endif // Py_REF_DEBUG - op->ob_refcnt++; +#endif #endif } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 @@ -553,6 +652,9 @@ static inline void Py_DECREF(PyObject *op) { #elif defined(Py_REF_DEBUG) static inline void Py_DECREF(const char *filename, int lineno, PyObject *op) { + if (_Py_IsImmortal(op)) { + return; + } _Py_DECREF_STAT_INC(); _Py_DEC_REFTOTAL(); if (--op->ob_refcnt != 0) { @@ -567,11 +669,14 @@ static inline void Py_DECREF(const char *filename, int lineno, PyObject *op) #define Py_DECREF(op) Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op)) #else -static inline void Py_DECREF(PyObject *op) +static inline Py_ALWAYS_INLINE void Py_DECREF(PyObject *op) { - _Py_DECREF_STAT_INC(); // Non-limited C API and limited C API for Python 3.9 and older access // directly PyObject.ob_refcnt. + if (_Py_IsImmortal(op)) { + return; + } + _Py_DECREF_STAT_INC(); if (--op->ob_refcnt == 0) { _Py_Dealloc(op); } @@ -721,7 +826,7 @@ PyAPI_FUNC(int) Py_IsNone(PyObject *x); #define Py_IsNone(x) Py_Is((x), Py_None) /* Macro for returning Py_None from a function */ -#define Py_RETURN_NONE return Py_NewRef(Py_None) +#define Py_RETURN_NONE return Py_None /* Py_NotImplemented is a singleton used to signal that an operation is @@ -731,7 +836,7 @@ PyAPI_DATA(PyObject) _Py_NotImplementedStruct; /* Don't use this directly */ #define Py_NotImplemented (&_Py_NotImplementedStruct) /* Macro for returning Py_NotImplemented from a function */ -#define Py_RETURN_NOTIMPLEMENTED return Py_NewRef(Py_NotImplemented) +#define Py_RETURN_NOTIMPLEMENTED return Py_NotImplemented /* Rich comparison opcodes */ #define Py_LT 0 diff --git a/Include/pyport.h b/Include/pyport.h index eef0fe1bfd71d8..5e226f5cb46751 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -184,7 +184,6 @@ typedef Py_ssize_t Py_ssize_clean_t; # define Py_LOCAL_INLINE(type) static inline type #endif -// bpo-28126: Py_MEMCPY is kept for backwards compatibility, #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 # define Py_MEMCPY memcpy #endif diff --git a/Lib/test/_test_embed_structseq.py b/Lib/test/_test_embed_structseq.py index 868f9f83e8be77..834daa4df55fec 100644 --- a/Lib/test/_test_embed_structseq.py +++ b/Lib/test/_test_embed_structseq.py @@ -1,27 +1,31 @@ import sys import types -import unittest +# Note: This test file can't import `unittest` since the runtime can't +# currently guarantee that it will not leak memory. Doing so will mark +# the test as passing but with reference leaks. This can safely import +# the `unittest` library once there's a strict guarantee of no leaks +# during runtime shutdown. # bpo-46417: Test that structseq types used by the sys module are still # valid when Py_Finalize()/Py_Initialize() are called multiple times. -class TestStructSeq(unittest.TestCase): +class TestStructSeq: # test PyTypeObject members - def check_structseq(self, obj_type): + def _check_structseq(self, obj_type): # ob_refcnt - self.assertGreaterEqual(sys.getrefcount(obj_type), 1) + assert sys.getrefcount(obj_type) > 1 # tp_base - self.assertTrue(issubclass(obj_type, tuple)) + assert issubclass(obj_type, tuple) # tp_bases - self.assertEqual(obj_type.__bases__, (tuple,)) + assert obj_type.__bases__ == (tuple,) # tp_dict - self.assertIsInstance(obj_type.__dict__, types.MappingProxyType) + assert isinstance(obj_type.__dict__, types.MappingProxyType) # tp_mro - self.assertEqual(obj_type.__mro__, (obj_type, tuple, object)) + assert obj_type.__mro__ == (obj_type, tuple, object) # tp_name - self.assertIsInstance(type.__name__, str) + assert isinstance(type.__name__, str) # tp_subclasses - self.assertEqual(obj_type.__subclasses__(), []) + assert obj_type.__subclasses__() == [] def test_sys_attrs(self): for attr_name in ( @@ -32,23 +36,23 @@ def test_sys_attrs(self): 'thread_info', # ThreadInfoType 'version_info', # VersionInfoType ): - with self.subTest(attr=attr_name): - attr = getattr(sys, attr_name) - self.check_structseq(type(attr)) + attr = getattr(sys, attr_name) + self._check_structseq(type(attr)) def test_sys_funcs(self): func_names = ['get_asyncgen_hooks'] # AsyncGenHooksType if hasattr(sys, 'getwindowsversion'): func_names.append('getwindowsversion') # WindowsVersionType for func_name in func_names: - with self.subTest(func=func_name): - func = getattr(sys, func_name) - obj = func() - self.check_structseq(type(obj)) + func = getattr(sys, func_name) + obj = func() + self._check_structseq(type(obj)) try: - unittest.main() + tests = TestStructSeq() + tests.test_sys_attrs() + tests.test_sys_funcs() except SystemExit as exc: if exc.args[0] != 0: raise diff --git a/Lib/test/libregrtest/refleak.py b/Lib/test/libregrtest/refleak.py index 4298fa806e1065..2de8c6cfbc61a1 100644 --- a/Lib/test/libregrtest/refleak.py +++ b/Lib/test/libregrtest/refleak.py @@ -73,9 +73,10 @@ def get_pooled_int(value): fd_deltas = [0] * repcount getallocatedblocks = sys.getallocatedblocks gettotalrefcount = sys.gettotalrefcount + getunicodeinternedsize = sys.getunicodeinternedsize fd_count = os_helper.fd_count # initialize variables to make pyflakes quiet - rc_before = alloc_before = fd_before = 0 + rc_before = alloc_before = fd_before = interned_before = 0 if not ns.quiet: print("beginning", repcount, "repetitions", file=sys.stderr) @@ -91,9 +92,13 @@ def get_pooled_int(value): dash_R_cleanup(fs, ps, pic, zdc, abcs) support.gc_collect() - # Read memory statistics immediately after the garbage collection - alloc_after = getallocatedblocks() - rc_after = gettotalrefcount() + # Read memory statistics immediately after the garbage collection. + # Also, readjust the reference counts and alloc blocks by ignoring + # any strings that might have been interned during test_func. These + # strings will be deallocated at runtime shutdown + interned_after = getunicodeinternedsize() + alloc_after = getallocatedblocks() - interned_after + rc_after = gettotalrefcount() - interned_after * 2 fd_after = fd_count() if not ns.quiet: @@ -106,6 +111,7 @@ def get_pooled_int(value): alloc_before = alloc_after rc_before = rc_after fd_before = fd_after + interned_before = interned_after if not ns.quiet: print(file=sys.stderr) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index e7a79bc13b7f3d..04dd8ff3070c99 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -28,7 +28,7 @@ from types import AsyncGeneratorType, FunctionType, CellType from operator import neg from test import support -from test.support import (swap_attr, maybe_get_event_loop_policy) +from test.support import (cpython_only, swap_attr, maybe_get_event_loop_policy) from test.support.os_helper import (EnvironmentVarGuard, TESTFN, unlink) from test.support.script_helper import assert_python_ok from test.support.warnings_helper import check_warnings @@ -2370,6 +2370,28 @@ def __del__(self): self.assertEqual(["before", "after"], out.decode().splitlines()) +@cpython_only +class ImmortalTests(unittest.TestCase): + def test_immortal(self): + none_refcount = sys.getrefcount(None) + true_refcount = sys.getrefcount(True) + false_refcount = sys.getrefcount(False) + smallint_refcount = sys.getrefcount(100) + + # Assert that all of these immortal instances have large ref counts. + self.assertGreater(none_refcount, 2 ** 15) + self.assertGreater(true_refcount, 2 ** 15) + self.assertGreater(false_refcount, 2 ** 15) + self.assertGreater(smallint_refcount, 2 ** 15) + + # Confirm that the refcount doesn't change even with a new ref to them. + l = [None, True, False, 100] + self.assertEqual(sys.getrefcount(None), none_refcount) + self.assertEqual(sys.getrefcount(True), true_refcount) + self.assertEqual(sys.getrefcount(False), false_refcount) + self.assertEqual(sys.getrefcount(100), smallint_refcount) + + class TestType(unittest.TestCase): def test_new_type(self): A = type('A', (), {}) diff --git a/Lib/test/test_ctypes/test_python_api.py b/Lib/test/test_ctypes/test_python_api.py index 49571f97bbe152..de8989e2c3300f 100644 --- a/Lib/test/test_ctypes/test_python_api.py +++ b/Lib/test/test_ctypes/test_python_api.py @@ -46,7 +46,8 @@ def test_PyLong_Long(self): pythonapi.PyLong_AsLong.restype = c_long res = pythonapi.PyLong_AsLong(42) - self.assertEqual(grc(res), ref42 + 1) + # Small int refcnts don't change + self.assertEqual(grc(res), ref42) del res self.assertEqual(grc(42), ref42) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 1aebe1b111f2e9..611cd27ecf1240 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -385,7 +385,8 @@ def test_refcount(self): self.assertRaises(TypeError, sys.getrefcount) c = sys.getrefcount(None) n = None - self.assertEqual(sys.getrefcount(None), c+1) + # Singleton refcnts don't change + self.assertEqual(sys.getrefcount(None), c) del n self.assertEqual(sys.getrefcount(None), c) if hasattr(sys, "gettotalrefcount"): diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 333b97688af5b6..95944c7c711620 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -600,9 +600,15 @@ def test_zippath_from_non_installed_posix(self): ld_library_path_env = "DYLD_LIBRARY_PATH" else: ld_library_path_env = "LD_LIBRARY_PATH" - subprocess.check_call(cmd, - env={"PYTHONPATH": pythonpath, - ld_library_path_env: ld_library_path}) + # Note that in address sanitizer mode, the current runtime + # implementation leaks memory due to not being able to correctly + # clean all unicode objects during runtime shutdown. Therefore, + # this uses subprocess.run instead of subprocess.check_call to + # maintain the core of the test while not failing due to the refleaks. + # This should be able to use check_call once all refleaks are fixed. + subprocess.run(cmd, + env={"PYTHONPATH": pythonpath, + ld_library_path_env: ld_library_path}) envpy = os.path.join(self.env_dir, self.bindir, self.exe) # Now check the venv created from the non-installed python has # correct zip path in pythonpath. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-04-02-22-14-57.gh-issue-84436.hvMgwF.rst b/Misc/NEWS.d/next/Core and Builtins/2023-04-02-22-14-57.gh-issue-84436.hvMgwF.rst new file mode 100644 index 00000000000000..c4d8ce75b35a30 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-04-02-22-14-57.gh-issue-84436.hvMgwF.rst @@ -0,0 +1,3 @@ +The implementation of PEP-683 which adds Immortal Objects by using a fixed +reference count that skips reference counting to make objects truly +immutable. diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 4eaa5490b6134c..1d00fc3e717788 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -418,8 +418,20 @@ validate_list(PyGC_Head *head, enum flagstates flags) static void update_refs(PyGC_Head *containers) { + PyGC_Head *next; PyGC_Head *gc = GC_NEXT(containers); - for (; gc != containers; gc = GC_NEXT(gc)) { + + while (gc != containers) { + next = GC_NEXT(gc); + /* Move any object that might have become immortal to the + * permanent generation as the reference count is not accurately + * reflecting the actual number of live references to this object + */ + if (_Py_IsImmortal(FROM_GC(gc))) { + gc_list_move(gc, &get_gc_state()->permanent_generation.head); + gc = next; + continue; + } gc_reset_refs(gc, Py_REFCNT(FROM_GC(gc))); /* Python's cyclic gc should never see an incoming refcount * of 0: if something decref'ed to 0, it should have been @@ -440,6 +452,7 @@ update_refs(PyGC_Head *containers) * check instead of an assert? */ _PyObject_ASSERT(FROM_GC(gc), gc_get_refs(gc) != 0); + gc = next; } } diff --git a/Objects/boolobject.c b/Objects/boolobject.c index 9d8e956e06f712..597a76fa5cb162 100644 --- a/Objects/boolobject.c +++ b/Objects/boolobject.c @@ -145,10 +145,14 @@ static PyNumberMethods bool_as_number = { 0, /* nb_index */ }; -static void _Py_NO_RETURN -bool_dealloc(PyObject* Py_UNUSED(ignore)) +static void +bool_dealloc(PyObject *boolean) { - _Py_FatalRefcountError("deallocating True or False"); + /* This should never get called, but we also don't want to SEGV if + * we accidentally decref Booleans out of existence. Instead, + * since bools are immortal, re-set the reference count. + */ + _Py_SetImmortal(boolean); } /* The type object for bool. Note that this cannot be subclassed! */ diff --git a/Objects/bytes_methods.c b/Objects/bytes_methods.c index ef9e65e566ece9..33aa9c3db6e805 100644 --- a/Objects/bytes_methods.c +++ b/Objects/bytes_methods.c @@ -258,9 +258,12 @@ _Py_bytes_istitle(const char *cptr, Py_ssize_t len) const unsigned char *e; int cased, previous_is_cased; - /* Shortcut for single character strings */ - if (len == 1) - return PyBool_FromLong(Py_ISUPPER(*p)); + if (len == 1) { + if (Py_ISUPPER(*p)) { + Py_RETURN_TRUE; + } + Py_RETURN_FALSE; + } /* Special case for empty strings */ if (len == 0) diff --git a/Objects/longobject.c b/Objects/longobject.c index bb4eac0d932bb8..d98bbbb6d6ff46 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -52,8 +52,7 @@ static PyObject * get_small_int(sdigit ival) { assert(IS_SMALL_INT(ival)); - PyObject *v = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + ival]; - return Py_NewRef(v); + return (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + ival]; } static PyLongObject * @@ -3271,6 +3270,27 @@ long_richcompare(PyObject *self, PyObject *other, int op) Py_RETURN_RICHCOMPARE(result, 0, op); } +static void +long_dealloc(PyObject *self) +{ + /* This should never get called, but we also don't want to SEGV if + * we accidentally decref small Ints out of existence. Instead, + * since small Ints are immortal, re-set the reference count. + */ + PyLongObject *pylong = (PyLongObject*)self; + if (pylong && _PyLong_IsCompact(pylong)) { + stwodigits ival = medium_value(pylong); + if (IS_SMALL_INT(ival)) { + PyLongObject *small_pylong = (PyLongObject *)get_small_int((sdigit)ival); + if (pylong == small_pylong) { + _Py_SetImmortal(self); + return; + } + } + } + Py_TYPE(self)->tp_free(self); +} + static Py_hash_t long_hash(PyLongObject *v) { @@ -6233,7 +6253,7 @@ PyTypeObject PyLong_Type = { "int", /* tp_name */ offsetof(PyLongObject, long_value.ob_digit), /* tp_basicsize */ sizeof(digit), /* tp_itemsize */ - 0, /* tp_dealloc */ + long_dealloc, /* tp_dealloc */ 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ diff --git a/Objects/object.c b/Objects/object.c index e26f737fccd60f..e508881c67d277 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1754,10 +1754,14 @@ none_repr(PyObject *op) return PyUnicode_FromString("None"); } -static void _Py_NO_RETURN -none_dealloc(PyObject* Py_UNUSED(ignore)) +static void +none_dealloc(PyObject* none) { - _Py_FatalRefcountError("deallocating None"); + /* This should never get called, but we also don't want to SEGV if + * we accidentally decref None out of existence. Instead, + * since None is an immortal object, re-set the reference count. + */ + _Py_SetImmortal(none); } static PyObject * @@ -1823,7 +1827,7 @@ PyTypeObject _PyNone_Type = { "NoneType", 0, 0, - none_dealloc, /*tp_dealloc*/ /*never called*/ + none_dealloc, /*tp_dealloc*/ 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ @@ -1860,8 +1864,9 @@ PyTypeObject _PyNone_Type = { }; PyObject _Py_NoneStruct = { - _PyObject_EXTRA_INIT - 1, &_PyNone_Type + _PyObject_EXTRA_INIT + { _Py_IMMORTAL_REFCNT }, + &_PyNone_Type }; /* NotImplemented is an object that can be used to signal that an @@ -1894,13 +1899,14 @@ notimplemented_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) Py_RETURN_NOTIMPLEMENTED; } -static void _Py_NO_RETURN -notimplemented_dealloc(PyObject* ignore) +static void +notimplemented_dealloc(PyObject *notimplemented) { /* This should never get called, but we also don't want to SEGV if - * we accidentally decref NotImplemented out of existence. + * we accidentally decref NotImplemented out of existence. Instead, + * since Notimplemented is an immortal object, re-set the reference count. */ - Py_FatalError("deallocating NotImplemented"); + _Py_SetImmortal(notimplemented); } static int @@ -1962,7 +1968,8 @@ PyTypeObject _PyNotImplemented_Type = { PyObject _Py_NotImplementedStruct = { _PyObject_EXTRA_INIT - 1, &_PyNotImplemented_Type + { _Py_IMMORTAL_REFCNT }, + &_PyNotImplemented_Type }; extern PyTypeObject _Py_GenericAliasIterType; @@ -2143,7 +2150,8 @@ new_reference(PyObject *op) if (_PyRuntime.tracemalloc.config.tracing) { _PyTraceMalloc_NewReference(op); } - Py_SET_REFCNT(op, 1); + // Skip the immortal object check in Py_SET_REFCNT; always set refcnt to 1 + op->ob_refcnt = 1; #ifdef Py_TRACE_REFS _Py_AddToAllObjects(op, 1); #endif diff --git a/Objects/setobject.c b/Objects/setobject.c index fcdda2a0bca2b6..58f0ae73c0c403 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -2543,6 +2543,7 @@ static PyTypeObject _PySetDummy_Type = { }; static PyObject _dummy_struct = { - _PyObject_EXTRA_INIT - 2, &_PySetDummy_Type + _PyObject_EXTRA_INIT + { _Py_IMMORTAL_REFCNT }, + &_PySetDummy_Type }; diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c index 584ebce721faed..e6776ac92b669c 100644 --- a/Objects/sliceobject.c +++ b/Objects/sliceobject.c @@ -29,6 +29,16 @@ ellipsis_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) return Py_NewRef(Py_Ellipsis); } +static void +ellipsis_dealloc(PyObject *ellipsis) +{ + /* This should never get called, but we also don't want to SEGV if + * we accidentally decref Ellipsis out of existence. Instead, + * since Ellipsis is an immortal object, re-set the reference count. + */ + _Py_SetImmortal(ellipsis); +} + static PyObject * ellipsis_repr(PyObject *op) { @@ -51,7 +61,7 @@ PyTypeObject PyEllipsis_Type = { "ellipsis", /* tp_name */ 0, /* tp_basicsize */ 0, /* tp_itemsize */ - 0, /*never called*/ /* tp_dealloc */ + ellipsis_dealloc, /* tp_dealloc */ 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ @@ -89,7 +99,8 @@ PyTypeObject PyEllipsis_Type = { PyObject _Py_EllipsisObject = { _PyObject_EXTRA_INIT - 1, &PyEllipsis_Type + { _Py_IMMORTAL_REFCNT }, + &PyEllipsis_Type }; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 9ea458f30394e3..85bcd05d5a29df 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -318,27 +318,11 @@ _PyType_InitCache(PyInterpreterState *interp) entry->version = 0; // Set to None so _PyType_Lookup() can use Py_SETREF(), // rather than using slower Py_XSETREF(). - // (See _PyType_FixCacheRefcounts() about the refcount.) entry->name = Py_None; entry->value = NULL; } } -// This is the temporary fix used by pycore_create_interpreter(), -// in pylifecycle.c. _PyType_InitCache() is called before the GIL -// has been created (for the main interpreter) and without the -// "current" thread state set. This causes crashes when the -// reftotal is updated, so we don't modify the refcount in -// _PyType_InitCache(), and instead do it later by calling -// _PyType_FixCacheRefcounts(). -// XXX This workaround should be removed once we have immortal -// objects (PEP 683). -void -_PyType_FixCacheRefcounts(void) -{ - _Py_RefcntAdd(Py_None, (1 << MCACHE_SIZE_EXP)); -} - static unsigned int _PyType_ClearCache(PyInterpreterState *interp) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 85e5ae735709fd..fd056e38f3f86b 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -228,14 +228,18 @@ static inline PyObject* unicode_new_empty(void) to strings in this dictionary are *not* counted in the string's ob_refcnt. When the interned string reaches a refcnt of 0 the string deallocation function will delete the reference from this dictionary. - Another way to look at this is that to say that the actual reference - count of a string is: s->ob_refcnt + (s->state ? 2 : 0) */ static inline PyObject *get_interned_dict(PyInterpreterState *interp) { return _Py_INTERP_CACHED_OBJECT(interp, interned_strings); } +Py_ssize_t +_PyUnicode_InternedSize() +{ + return PyObject_Length(get_interned_dict(_PyInterpreterState_GET())); +} + static int init_interned_dict(PyInterpreterState *interp) { @@ -1538,30 +1542,19 @@ find_maxchar_surrogates(const wchar_t *begin, const wchar_t *end, static void unicode_dealloc(PyObject *unicode) { - PyInterpreterState *interp = _PyInterpreterState_GET(); #ifdef Py_DEBUG if (!unicode_is_finalizing() && unicode_is_singleton(unicode)) { _Py_FatalRefcountError("deallocating an Unicode singleton"); } #endif + /* This should never get called, but we also don't want to SEGV if + * we accidentally decref an immortal string out of existence. Since + * the string is an immortal object, just re-set the reference count. + */ if (PyUnicode_CHECK_INTERNED(unicode)) { - /* Revive the dead object temporarily. PyDict_DelItem() removes two - references (key and value) which were ignored by - PyUnicode_InternInPlace(). Use refcnt=3 rather than refcnt=2 - to prevent calling unicode_dealloc() again. Adjust refcnt after - PyDict_DelItem(). */ - assert(Py_REFCNT(unicode) == 0); - Py_SET_REFCNT(unicode, 3); - PyObject *interned = get_interned_dict(interp); - assert(interned != NULL); - if (PyDict_DelItem(interned, unicode) != 0) { - _PyErr_WriteUnraisableMsg("deletion of interned string failed", - NULL); - } - assert(Py_REFCNT(unicode) == 1); - Py_SET_REFCNT(unicode, 0); + _Py_SetImmortal(unicode); + return; } - if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) { PyObject_Free(_PyUnicode_UTF8(unicode)); } @@ -14637,11 +14630,21 @@ _PyUnicode_InternInPlace(PyInterpreterState *interp, PyObject **p) return; } - /* The two references in interned dict (key and value) are not counted by - refcnt. unicode_dealloc() and _PyUnicode_ClearInterned() take care of - this. */ - Py_SET_REFCNT(s, Py_REFCNT(s) - 2); - _PyUnicode_STATE(s).interned = 1; + if (_Py_IsImmortal(s)) { + _PyUnicode_STATE(*p).interned = SSTATE_INTERNED_IMMORTAL_STATIC; + return; + } +#ifdef Py_REF_DEBUG + /* The reference count value excluding the 2 references from the + interned dictionary should be excluded from the RefTotal. The + decrements to these objects will not be registered so they + need to be accounted for in here. */ + for (Py_ssize_t i = 0; i < Py_REFCNT(s) - 2; i++) { + _Py_DecRefTotal(_PyInterpreterState_GET()); + } +#endif + _Py_SetImmortal(s); + _PyUnicode_STATE(*p).interned = SSTATE_INTERNED_IMMORTAL; } void @@ -14681,10 +14684,20 @@ _PyUnicode_ClearInterned(PyInterpreterState *interp) } assert(PyDict_CheckExact(interned)); - /* Interned unicode strings are not forcibly deallocated; rather, we give - them their stolen references back, and then clear and DECREF the - interned dict. */ - + /* TODO: + * Currently, the runtime is not able to guarantee that it can exit without + * allocations that carry over to a future initialization of Python within + * the same process. i.e: + * ./python -X showrefcount -c 'import itertools' + * [237 refs, 237 blocks] + * + * Therefore, this should remain disabled for until there is a strict guarantee + * that no memory will be left after `Py_Finalize`. + */ +#ifdef Py_DEBUG + /* For all non-singleton interned strings, restore the two valid references + to that instance from within the intern string dictionary and let the + normal reference counting process clean up these instances. */ #ifdef INTERNED_STATS fprintf(stderr, "releasing %zd interned strings\n", PyDict_GET_SIZE(interned)); @@ -14694,15 +14707,27 @@ _PyUnicode_ClearInterned(PyInterpreterState *interp) Py_ssize_t pos = 0; PyObject *s, *ignored_value; while (PyDict_Next(interned, &pos, &s, &ignored_value)) { - assert(PyUnicode_CHECK_INTERNED(s)); - // Restore the two references (key and value) ignored - // by PyUnicode_InternInPlace(). - Py_SET_REFCNT(s, Py_REFCNT(s) + 2); + assert(PyUnicode_IS_READY(s)); + switch (PyUnicode_CHECK_INTERNED(s)) { + case SSTATE_INTERNED_IMMORTAL: + // Skip the Immortal Instance check and restore + // the two references (key and value) ignored + // by PyUnicode_InternInPlace(). + s->ob_refcnt = 2; #ifdef INTERNED_STATS - total_length += PyUnicode_GET_LENGTH(s); + total_length += PyUnicode_GET_LENGTH(s); #endif - - _PyUnicode_STATE(s).interned = 0; + break; + case SSTATE_INTERNED_IMMORTAL_STATIC: + break; + case SSTATE_INTERNED_MORTAL: + /* fall through */ + case SSTATE_NOT_INTERNED: + /* fall through */ + default: + Py_UNREACHABLE(); + } + _PyUnicode_STATE(s).interned = SSTATE_NOT_INTERNED; } #ifdef INTERNED_STATS fprintf(stderr, @@ -14710,6 +14735,12 @@ _PyUnicode_ClearInterned(PyInterpreterState *interp) total_length); #endif + struct _Py_unicode_state *state = &interp->unicode; + struct _Py_unicode_ids *ids = &state->ids; + for (Py_ssize_t i=0; i < ids->size; i++) { + Py_XINCREF(ids->array[i]); + } +#endif /* Py_DEBUG */ clear_interned_dict(interp); } diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 00717114b40286..f78ba41fe7b4eb 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -1911,14 +1911,13 @@ static int test_unicode_id_init(void) str1 = _PyUnicode_FromId(&PyId_test_unicode_id_init); assert(str1 != NULL); - assert(Py_REFCNT(str1) == 1); + assert(_Py_IsImmortal(str1)); str2 = PyUnicode_FromString("test_unicode_id_init"); assert(str2 != NULL); assert(PyUnicode_Compare(str1, str2) == 0); - // str1 is a borrowed reference Py_DECREF(str2); Py_Finalize(); diff --git a/Python/ceval.c b/Python/ceval.c index d8495da81e94ec..358835024fd2d0 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -53,8 +53,11 @@ #undef Py_DECREF #define Py_DECREF(arg) \ do { \ - _Py_DECREF_STAT_INC(); \ PyObject *op = _PyObject_CAST(arg); \ + if (_Py_IsImmortal(op)) { \ + break; \ + } \ + _Py_DECREF_STAT_INC(); \ if (--op->ob_refcnt == 0) { \ destructor dealloc = Py_TYPE(op)->tp_dealloc; \ (*dealloc)(op); \ @@ -77,8 +80,11 @@ #undef _Py_DECREF_SPECIALIZED #define _Py_DECREF_SPECIALIZED(arg, dealloc) \ do { \ - _Py_DECREF_STAT_INC(); \ PyObject *op = _PyObject_CAST(arg); \ + if (_Py_IsImmortal(op)) { \ + break; \ + } \ + _Py_DECREF_STAT_INC(); \ if (--op->ob_refcnt == 0) { \ destructor d = (destructor)(dealloc); \ d(op); \ diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index 46252dd404325b..7a7c188bcccc37 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -912,6 +912,34 @@ sys_getallocatedblocks(PyObject *module, PyObject *Py_UNUSED(ignored)) return return_value; } +PyDoc_STRVAR(sys_getunicodeinternedsize__doc__, +"getunicodeinternedsize($module, /)\n" +"--\n" +"\n" +"Return the number of elements of the unicode interned dictionary"); + +#define SYS_GETUNICODEINTERNEDSIZE_METHODDEF \ + {"getunicodeinternedsize", (PyCFunction)sys_getunicodeinternedsize, METH_NOARGS, sys_getunicodeinternedsize__doc__}, + +static Py_ssize_t +sys_getunicodeinternedsize_impl(PyObject *module); + +static PyObject * +sys_getunicodeinternedsize(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + PyObject *return_value = NULL; + Py_ssize_t _return_value; + + _return_value = sys_getunicodeinternedsize_impl(module); + if ((_return_value == -1) && PyErr_Occurred()) { + goto exit; + } + return_value = PyLong_FromSsize_t(_return_value); + +exit: + return return_value; +} + PyDoc_STRVAR(sys__getframe__doc__, "_getframe($module, depth=0, /)\n" "--\n" @@ -1387,4 +1415,4 @@ sys__getframemodulename(PyObject *module, PyObject *const *args, Py_ssize_t narg #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=5c761f14326ced54 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6d598acc26237fbe input=a9049054013a1b77]*/ diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 2a3b2b8ebeead7..8334f596eb3e19 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -16,13 +16,13 @@ static PyObject DISABLE = { - .ob_refcnt = _PyObject_IMMORTAL_REFCNT, + .ob_refcnt = _Py_IMMORTAL_REFCNT, .ob_type = &PyBaseObject_Type }; PyObject _PyInstrumentation_MISSING = { - .ob_refcnt = _PyObject_IMMORTAL_REFCNT, + .ob_refcnt = _Py_IMMORTAL_REFCNT, .ob_type = &PyBaseObject_Type }; diff --git a/Python/legacy_tracing.c b/Python/legacy_tracing.c index cf345bddda79b0..e509e63a087a52 100644 --- a/Python/legacy_tracing.c +++ b/Python/legacy_tracing.c @@ -324,7 +324,7 @@ sys_trace_exception_handled( PyTypeObject _PyLegacyEventHandler_Type = { - _PyVarObject_IMMORTAL_INIT(&PyType_Type, 0), + PyVarObject_HEAD_INIT(&PyType_Type, 0) "sys.legacy_event_handler", sizeof(_PyLegacyEventHandler), .tp_dealloc = (destructor)PyObject_Free, diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index d6627bc6b7e86b..a510c9b22168bc 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -808,11 +808,6 @@ pycore_interp_init(PyThreadState *tstate) PyStatus status; PyObject *sysmod = NULL; - // This is a temporary fix until we have immortal objects. - // (See _PyType_InitCache() in typeobject.c.) - extern void _PyType_FixCacheRefcounts(void); - _PyType_FixCacheRefcounts(); - // Create singletons before the first PyType_Ready() call, since // PyType_Ready() uses singletons like the Unicode empty string (tp_doc) // and the empty tuple singletons (tp_bases). diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 4d693a1be1f89e..1e42e8dfceb5cc 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1874,6 +1874,18 @@ sys_getallocatedblocks_impl(PyObject *module) return _Py_GetAllocatedBlocks(); } +/*[clinic input] +sys.getunicodeinternedsize -> Py_ssize_t + +Return the number of elements of the unicode interned dictionary +[clinic start generated code]*/ + +static Py_ssize_t +sys_getunicodeinternedsize_impl(PyObject *module) +/*[clinic end generated code: output=ad0e4c9738ed4129 input=726298eaa063347a]*/ +{ + return _PyUnicode_InternedSize(); +} /*[clinic input] sys._getframe @@ -2243,6 +2255,7 @@ static PyMethodDef sys_methods[] = { SYS_GETDEFAULTENCODING_METHODDEF SYS_GETDLOPENFLAGS_METHODDEF SYS_GETALLOCATEDBLOCKS_METHODDEF + SYS_GETUNICODEINTERNEDSIZE_METHODDEF SYS_GETFILESYSTEMENCODING_METHODDEF SYS_GETFILESYSTEMENCODEERRORS_METHODDEF #ifdef Py_TRACE_REFS diff --git a/Tools/build/deepfreeze.py b/Tools/build/deepfreeze.py index aba5fecd8b1a99..5cfef5c572c4ae 100644 --- a/Tools/build/deepfreeze.py +++ b/Tools/build/deepfreeze.py @@ -142,7 +142,7 @@ def block(self, prefix: str, suffix: str = "") -> None: def object_head(self, typename: str) -> None: with self.block(".ob_base =", ","): - self.write(f".ob_refcnt = 999999999,") + self.write(f".ob_refcnt = _Py_IMMORTAL_REFCNT,") self.write(f".ob_type = &{typename},") def object_var_head(self, typename: str, size: int) -> None: From 8cb2b0f953288ff8749e686c268097cdd5a393e2 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sat, 22 Apr 2023 15:41:58 -0600 Subject: [PATCH 229/349] Revert "Avoid error lexing multiprocessing docs code block on Pygments 2.15.0" (#103616) This reverts commit ace51dcdb781b0608b1273d246ebaee849561435. --- Doc/library/multiprocessing.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 84e309f1bc8326..8454296b815b41 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -452,9 +452,7 @@ process which created it. importable by the children. This is covered in :ref:`multiprocessing-programming` however it is worth pointing out here. This means that some examples, such as the :class:`multiprocessing.pool.Pool` examples will not work in the - interactive interpreter. For example: - - .. code-block:: text + interactive interpreter. For example:: >>> from multiprocessing import Pool >>> p = Pool(5) From 7bf94568a9a4101c72b8bf555a811028e5b45ced Mon Sep 17 00:00:00 2001 From: Randy <69558016+san-juan1667@users.noreply.github.com> Date: Sat, 22 Apr 2023 17:33:50 -0600 Subject: [PATCH 230/349] gh-68654: Clarify subdirectories used by pkgutil.extend_path (#103701) Clarify sub directories used by pkgutil.extend_path in the docs and the docstring --- Doc/library/pkgutil.rst | 6 +++--- Lib/pkgutil.py | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Doc/library/pkgutil.rst b/Doc/library/pkgutil.rst index 788a02dcb8922f..66d753bd1a3c6c 100644 --- a/Doc/library/pkgutil.rst +++ b/Doc/library/pkgutil.rst @@ -25,9 +25,9 @@ support. from pkgutil import extend_path __path__ = extend_path(__path__, __name__) - This will add to the package's ``__path__`` all subdirectories of directories - on :data:`sys.path` named after the package. This is useful if one wants to - distribute different parts of a single logical package as multiple + For each directory on :data:`sys.path` that has a subdirectory that matches the + package name, add the subdirectory to the package's :attr:`__path__`. This is useful + if one wants to distribute different parts of a single logical package as multiple directories. It also looks for :file:`\*.pkg` files beginning where ``*`` matches the diff --git a/Lib/pkgutil.py b/Lib/pkgutil.py index bdebfd2fc8ac32..56731de64af494 100644 --- a/Lib/pkgutil.py +++ b/Lib/pkgutil.py @@ -511,10 +511,10 @@ def extend_path(path, name): from pkgutil import extend_path __path__ = extend_path(__path__, __name__) - This will add to the package's __path__ all subdirectories of - directories on sys.path named after the package. This is useful - if one wants to distribute different parts of a single logical - package as multiple directories. + For each directory on sys.path that has a subdirectory that + matches the package name, add the subdirectory to the package's + __path__. This is useful if one wants to distribute different + parts of a single logical package as multiple directories. It also looks for *.pkg files beginning where * matches the name argument. This feature is similar to *.pth files (see site.py), From 0fd38917582aae0728e20d8a641e56d9be9270c7 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Sun, 23 Apr 2023 03:08:27 +0300 Subject: [PATCH 231/349] gh-102310: Change error range for invalid bytes literals (#103663) --- Lib/test/test_syntax.py | 24 +++++++++++++++++++ ...-04-21-17-03-14.gh-issue-102310.anLjDx.rst | 1 + Parser/string_parser.c | 3 ++- 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-04-21-17-03-14.gh-issue-102310.anLjDx.rst diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index f23653558a9119..f959bbb4400702 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -1853,6 +1853,30 @@ def f(x: *b) Traceback (most recent call last): ... SyntaxError: invalid syntax + +Invalid bytes literals: + + >>> b"Ā" + Traceback (most recent call last): + ... + b"Ā" + ^^^ + SyntaxError: bytes can only contain ASCII literal characters + + >>> b"абвгде" + Traceback (most recent call last): + ... + b"абвгде" + ^^^^^^^^ + SyntaxError: bytes can only contain ASCII literal characters + + >>> b"abc ъющый" # first 3 letters are ascii + Traceback (most recent call last): + ... + b"abc ъющый" + ^^^^^^^^^^^ + SyntaxError: bytes can only contain ASCII literal characters + """ import re diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-04-21-17-03-14.gh-issue-102310.anLjDx.rst b/Misc/NEWS.d/next/Core and Builtins/2023-04-21-17-03-14.gh-issue-102310.anLjDx.rst new file mode 100644 index 00000000000000..15cb6c64adbab1 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-04-21-17-03-14.gh-issue-102310.anLjDx.rst @@ -0,0 +1 @@ +Change the error range for invalid bytes literals. diff --git a/Parser/string_parser.c b/Parser/string_parser.c index be5f0c4a60a663..d4ce33850f7c58 100644 --- a/Parser/string_parser.c +++ b/Parser/string_parser.c @@ -248,7 +248,8 @@ _PyPegen_parse_string(Parser *p, Token *t) const char *ch; for (ch = s; *ch; ch++) { if (Py_CHARMASK(*ch) >= 0x80) { - RAISE_SYNTAX_ERROR( + RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + t, "bytes can only contain ASCII " "literal characters"); return NULL; From e38bebb9ee805df6848f42845e71c8da8a821ad3 Mon Sep 17 00:00:00 2001 From: Dan Hemberger <846186+hemberger@users.noreply.github.com> Date: Sat, 22 Apr 2023 21:41:23 -0700 Subject: [PATCH 232/349] gh-81403: Fix for CacheFTPHandler in urllib (#13951) bpo-37222: Fix for CacheFTPHandler in urllib A call to FTP.ntransfercmd must be followed by FTP.voidresp to clear the "end transfer" message. Without this, the client and server get out of sync, which will result in an error if the FTP instance is reused to open a second URL. This scenario occurs for even the most basic usage of CacheFTPHandler. Reverts the patch merged as a resolution to bpo-16270 and adds a test case for the CacheFTPHandler in test_urllib2net.py. Co-authored-by: Senthil Kumaran --- Lib/test/test_urllib2net.py | 2 ++ Lib/urllib/request.py | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py index 5da41c37bbfb8e..d8d882b2d33589 100644 --- a/Lib/test/test_urllib2net.py +++ b/Lib/test/test_urllib2net.py @@ -134,7 +134,9 @@ def setUp(self): # They do sometimes catch some major disasters, though. def test_ftp(self): + # Testing the same URL twice exercises the caching in CacheFTPHandler urls = [ + 'ftp://www.pythontest.net/README', 'ftp://www.pythontest.net/README', ('ftp://www.pythontest.net/non-existent-file', None, urllib.error.URLError), diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 19e2e5bd335627..5314b3f26021eb 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -2475,7 +2475,13 @@ def retrfile(self, file, type): return (ftpobj, retrlen) def endtransfer(self): + if not self.busy: + return self.busy = 0 + try: + self.ftp.voidresp() + except ftperrors(): + pass def close(self): self.keepalive = False From 0056701aa370553636b676cc99e327137d1688c6 Mon Sep 17 00:00:00 2001 From: Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com> Date: Sun, 23 Apr 2023 08:33:39 -0600 Subject: [PATCH 233/349] GH-103699: Add `__orig_bases__` to various typing classes (#103698) Co-authored-by: Alex Waygood Co-authored-by: Jelle Zijlstra --- Lib/test/test_typing.py | 59 +++++++++++++++++++ Lib/typing.py | 11 +++- ...-04-22-22-37-39.gh-issue-103699.NizCjc.rst | 2 + 3 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-22-22-37-39.gh-issue-103699.NizCjc.rst diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index f983efe956f902..715710be9e86b8 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -6695,6 +6695,22 @@ def test_copy_and_pickle(self): self.assertEqual(jane2, jane) self.assertIsInstance(jane2, cls) + def test_orig_bases(self): + T = TypeVar('T') + + class SimpleNamedTuple(NamedTuple): + pass + + class GenericNamedTuple(NamedTuple, Generic[T]): + pass + + self.assertEqual(SimpleNamedTuple.__orig_bases__, (NamedTuple,)) + self.assertEqual(GenericNamedTuple.__orig_bases__, (NamedTuple, Generic[T])) + + CallNamedTuple = NamedTuple('CallNamedTuple', []) + + self.assertEqual(CallNamedTuple.__orig_bases__, (NamedTuple,)) + class TypedDictTests(BaseTestCase): def test_basics_functional_syntax(self): @@ -7126,6 +7142,49 @@ class TD(TypedDict): self.assertIs(type(a), dict) self.assertEqual(a, {'a': 1}) + def test_orig_bases(self): + T = TypeVar('T') + + class Parent(TypedDict): + pass + + class Child(Parent): + pass + + class OtherChild(Parent): + pass + + class MixedChild(Child, OtherChild, Parent): + pass + + class GenericParent(TypedDict, Generic[T]): + pass + + class GenericChild(GenericParent[int]): + pass + + class OtherGenericChild(GenericParent[str]): + pass + + class MixedGenericChild(GenericChild, OtherGenericChild, GenericParent[float]): + pass + + class MultipleGenericBases(GenericParent[int], GenericParent[float]): + pass + + CallTypedDict = TypedDict('CallTypedDict', {}) + + self.assertEqual(Parent.__orig_bases__, (TypedDict,)) + self.assertEqual(Child.__orig_bases__, (Parent,)) + self.assertEqual(OtherChild.__orig_bases__, (Parent,)) + self.assertEqual(MixedChild.__orig_bases__, (Child, OtherChild, Parent,)) + self.assertEqual(GenericParent.__orig_bases__, (TypedDict, Generic[T])) + self.assertEqual(GenericChild.__orig_bases__, (GenericParent[int],)) + self.assertEqual(OtherGenericChild.__orig_bases__, (GenericParent[str],)) + self.assertEqual(MixedGenericChild.__orig_bases__, (GenericChild, OtherGenericChild, GenericParent[float])) + self.assertEqual(MultipleGenericBases.__orig_bases__, (GenericParent[int], GenericParent[float])) + self.assertEqual(CallTypedDict.__orig_bases__, (TypedDict,)) + class RequiredTests(BaseTestCase): diff --git a/Lib/typing.py b/Lib/typing.py index 7c165562c2b53d..354bc80eb3abfa 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -2962,7 +2962,9 @@ class Employee(NamedTuple): elif kwargs: raise TypeError("Either list of fields or keywords" " can be provided to NamedTuple, not both") - return _make_nmtuple(typename, fields, module=_caller()) + nt = _make_nmtuple(typename, fields, module=_caller()) + nt.__orig_bases__ = (NamedTuple,) + return nt _NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {}) @@ -2994,6 +2996,9 @@ def __new__(cls, name, bases, ns, total=True): tp_dict = type.__new__(_TypedDictMeta, name, (*generic_base, dict), ns) + if not hasattr(tp_dict, '__orig_bases__'): + tp_dict.__orig_bases__ = bases + annotations = {} own_annotations = ns.get('__annotations__', {}) msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" @@ -3104,7 +3109,9 @@ class body be required. # Setting correct module is necessary to make typed dict classes pickleable. ns['__module__'] = module - return _TypedDictMeta(typename, (), ns, total=total) + td = _TypedDictMeta(typename, (), ns, total=total) + td.__orig_bases__ = (TypedDict,) + return td _TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {}) TypedDict.__mro_entries__ = lambda bases: (_TypedDict,) diff --git a/Misc/NEWS.d/next/Library/2023-04-22-22-37-39.gh-issue-103699.NizCjc.rst b/Misc/NEWS.d/next/Library/2023-04-22-22-37-39.gh-issue-103699.NizCjc.rst new file mode 100644 index 00000000000000..60547a25a109bc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-22-22-37-39.gh-issue-103699.NizCjc.rst @@ -0,0 +1,2 @@ +Add ``__orig_bases__`` to non-generic TypedDicts, call-based TypedDicts, and +call-based NamedTuples. Other TypedDicts and NamedTuples already had the attribute. From 9c3442c0938127788fa59e4ceb80ae78b86fad1d Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sun, 23 Apr 2023 11:18:49 -0600 Subject: [PATCH 234/349] gh-101408: PyObject_GC_Resize should calculate preheader size. (gh-101741) --- .../2023-02-09-23-09-29.gh-issue-101408._paFIF.rst | 2 ++ Modules/gcmodule.c | 13 +++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2023-02-09-23-09-29.gh-issue-101408._paFIF.rst diff --git a/Misc/NEWS.d/next/C API/2023-02-09-23-09-29.gh-issue-101408._paFIF.rst b/Misc/NEWS.d/next/C API/2023-02-09-23-09-29.gh-issue-101408._paFIF.rst new file mode 100644 index 00000000000000..172d66163d42e6 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2023-02-09-23-09-29.gh-issue-101408._paFIF.rst @@ -0,0 +1,2 @@ +:c:func:`PyObject_GC_Resize` should calculate preheader size if needed. +Patch by Dong-hee Na. diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 1d00fc3e717788..966c1e615502ef 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -2361,16 +2361,17 @@ PyVarObject * _PyObject_GC_Resize(PyVarObject *op, Py_ssize_t nitems) { const size_t basicsize = _PyObject_VAR_SIZE(Py_TYPE(op), nitems); + const size_t presize = _PyType_PreHeaderSize(((PyObject *)op)->ob_type); _PyObject_ASSERT((PyObject *)op, !_PyObject_GC_IS_TRACKED(op)); - if (basicsize > (size_t)PY_SSIZE_T_MAX - sizeof(PyGC_Head)) { + if (basicsize > (size_t)PY_SSIZE_T_MAX - presize) { return (PyVarObject *)PyErr_NoMemory(); } - - PyGC_Head *g = AS_GC(op); - g = (PyGC_Head *)PyObject_Realloc(g, sizeof(PyGC_Head) + basicsize); - if (g == NULL) + char *mem = (char *)op - presize; + mem = (char *)PyObject_Realloc(mem, presize + basicsize); + if (mem == NULL) { return (PyVarObject *)PyErr_NoMemory(); - op = (PyVarObject *) FROM_GC(g); + } + op = (PyVarObject *) (mem + presize); Py_SET_SIZE(op, nitems); return op; } From 777bdff0ec4c21176ddf61e07bc75d170bc65d54 Mon Sep 17 00:00:00 2001 From: Ankit Kumar Pandey <93041495+itsankitkp@users.noreply.github.com> Date: Sun, 23 Apr 2023 22:49:16 +0530 Subject: [PATCH 235/349] gh-103716: Add test support requires fork in simple_subprocess (gh-103717) add requires fork as test case depends on this --- Lib/test/test_socketserver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py index 2fa5069423327a..71ed4c7d58dafc 100644 --- a/Lib/test/test_socketserver.py +++ b/Lib/test/test_socketserver.py @@ -56,7 +56,7 @@ class ForkingUnixDatagramServer(socketserver.ForkingMixIn, socketserver.UnixDatagramServer): pass - +@test.support.requires_fork() @contextlib.contextmanager def simple_subprocess(testcase): """Tests that a custom child process is not waited on (Issue 1540386)""" From 5041c2ba6e9c992d1c54834481c9be64581c0235 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Sun, 23 Apr 2023 20:50:23 +0300 Subject: [PATCH 236/349] gh-103592: Add tests of `Literal` with `Enum` and `Union` of `Literal`s (#103706) --- Lib/test/test_typing.py | 45 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 715710be9e86b8..b78ce1e4363071 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -1789,6 +1789,30 @@ def Elem(*args): Union[Elem, str] # Nor should this + def test_union_of_literals(self): + self.assertEqual(Union[Literal[1], Literal[2]].__args__, + (Literal[1], Literal[2])) + self.assertEqual(Union[Literal[1], Literal[1]], + Literal[1]) + + self.assertEqual(Union[Literal[False], Literal[0]].__args__, + (Literal[False], Literal[0])) + self.assertEqual(Union[Literal[True], Literal[1]].__args__, + (Literal[True], Literal[1])) + + import enum + class Ints(enum.IntEnum): + A = 0 + B = 1 + + self.assertEqual(Union[Literal[Ints.A], Literal[Ints.B]].__args__, + (Literal[Ints.A], Literal[Ints.B])) + + self.assertEqual(Union[Literal[0], Literal[Ints.A], Literal[False]].__args__, + (Literal[0], Literal[Ints.A], Literal[False])) + self.assertEqual(Union[Literal[1], Literal[Ints.B], Literal[True]].__args__, + (Literal[1], Literal[Ints.B], Literal[True])) + class TupleTests(BaseTestCase): @@ -2156,6 +2180,13 @@ def test_basics(self): Literal[Literal[1, 2], Literal[4, 5]] Literal[b"foo", u"bar"] + def test_enum(self): + import enum + class My(enum.Enum): + A = 'A' + + self.assertEqual(Literal[My.A].__args__, (My.A,)) + def test_illegal_parameters_do_not_raise_runtime_errors(self): # Type checkers should reject these types, but we do not # raise errors at runtime to maintain maximum flexibility. @@ -2245,6 +2276,20 @@ def test_flatten(self): self.assertEqual(l, Literal[1, 2, 3]) self.assertEqual(l.__args__, (1, 2, 3)) + def test_does_not_flatten_enum(self): + import enum + class Ints(enum.IntEnum): + A = 1 + B = 2 + + l = Literal[ + Literal[Ints.A], + Literal[Ints.B], + Literal[1], + Literal[2], + ] + self.assertEqual(l.__args__, (Ints.A, Ints.B, 1, 2)) + XK = TypeVar('XK', str, bytes) XV = TypeVar('XV') From 05b3ce7339b9ce44eec728e88e80ba1f125436ed Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Sun, 23 Apr 2023 13:06:10 -0600 Subject: [PATCH 237/349] GH-103718: Correctly cache and restore f-string buffers when needed (GH-103719) --- Lib/test/test_fstring.py | 5 +++++ Parser/tokenizer.c | 38 +++++++++++++++++++++++++++----------- Parser/tokenizer.h | 3 +++ 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index 0e71de85f16b9c..b26b12d369f6eb 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -1532,5 +1532,10 @@ def test_syntax_error_for_starred_expressions(self): "f-string: expecting a valid expression after '{'"): compile("f'{**a}'", "?", "exec") + def test_not_closing_quotes(self): + self.assertAllRaise(SyntaxError, "unterminated f-string literal", ['f"', "f'"]) + self.assertAllRaise(SyntaxError, "unterminated triple-quoted f-string literal", + ['f"""', "f'''"]) + if __name__ == '__main__': unittest.main() diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index f992e55dcac488..0370f75efb5383 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -361,21 +361,35 @@ tok_concatenate_interactive_new_line(struct tok_state *tok, const char *line) { return 0; } - -/* Traverse and update all f-string buffers with the value */ +/* Traverse and remember all f-string buffers, in order to be able to restore + them after reallocating tok->buf */ static void -update_fstring_buffers(struct tok_state *tok, char value, int regular, int multiline) +remember_fstring_buffers(struct tok_state *tok) { int index; tokenizer_mode *mode; for (index = tok->tok_mode_stack_index; index >= 0; --index) { mode = &(tok->tok_mode_stack[index]); - if (regular && mode->f_string_start != NULL) { - mode->f_string_start += value; + if (mode->kind == TOK_FSTRING_MODE) { + mode->f_string_start_offset = mode->f_string_start - tok->buf; + mode->f_string_multi_line_start_offset = mode->f_string_multi_line_start - tok->buf; } - if (multiline && mode->f_string_multi_line_start != NULL) { - mode->f_string_multi_line_start += value; + } +} + +/* Traverse and restore all f-string buffers after reallocating tok->buf */ +static void +restore_fstring_buffers(struct tok_state *tok) +{ + int index; + tokenizer_mode *mode; + + for (index = tok->tok_mode_stack_index; index >= 0; --index) { + mode = &(tok->tok_mode_stack[index]); + if (mode->kind == TOK_FSTRING_MODE) { + mode->f_string_start = tok->buf + mode->f_string_start_offset; + mode->f_string_multi_line_start = tok->buf + mode->f_string_multi_line_start_offset; } } } @@ -476,7 +490,7 @@ tok_reserve_buf(struct tok_state *tok, Py_ssize_t size) Py_ssize_t start = tok->start == NULL ? -1 : tok->start - tok->buf; Py_ssize_t line_start = tok->start == NULL ? -1 : tok->line_start - tok->buf; Py_ssize_t multi_line_start = tok->multi_line_start - tok->buf; - update_fstring_buffers(tok, -*tok->buf, /*regular=*/1, /*multiline=*/1); + remember_fstring_buffers(tok); newbuf = (char *)PyMem_Realloc(newbuf, newsize); if (newbuf == NULL) { tok->done = E_NOMEM; @@ -489,7 +503,7 @@ tok_reserve_buf(struct tok_state *tok, Py_ssize_t size) tok->start = start < 0 ? NULL : tok->buf + start; tok->line_start = line_start < 0 ? NULL : tok->buf + line_start; tok->multi_line_start = multi_line_start < 0 ? NULL : tok->buf + multi_line_start; - update_fstring_buffers(tok, *tok->buf, /*regular=*/1, /*multiline=*/1); + restore_fstring_buffers(tok); } return 1; } @@ -1051,7 +1065,7 @@ tok_underflow_interactive(struct tok_state *tok) { } else if (tok->start != NULL) { Py_ssize_t cur_multi_line_start = tok->multi_line_start - tok->buf; - update_fstring_buffers(tok, -*tok->buf, /*regular=*/0, /*multiline=*/1); + remember_fstring_buffers(tok); size_t size = strlen(newtok); ADVANCE_LINENO(); if (!tok_reserve_buf(tok, size + 1)) { @@ -1064,7 +1078,7 @@ tok_underflow_interactive(struct tok_state *tok) { PyMem_Free(newtok); tok->inp += size; tok->multi_line_start = tok->buf + cur_multi_line_start; - update_fstring_buffers(tok, *tok->buf, /*regular=*/0, /*multiline=*/1); + restore_fstring_buffers(tok); } else { ADVANCE_LINENO(); @@ -2207,6 +2221,8 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t the_current_tok->f_string_quote_size = quote_size; the_current_tok->f_string_start = tok->start; the_current_tok->f_string_multi_line_start = tok->line_start; + the_current_tok->f_string_start_offset = -1; + the_current_tok->f_string_multi_line_start_offset = -1; the_current_tok->last_expr_buffer = NULL; the_current_tok->last_expr_size = 0; the_current_tok->last_expr_end = -1; diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h index b75e4e8293d3d6..2b94aecce626c3 100644 --- a/Parser/tokenizer.h +++ b/Parser/tokenizer.h @@ -52,6 +52,9 @@ typedef struct _tokenizer_mode { const char* f_string_start; const char* f_string_multi_line_start; + Py_ssize_t f_string_start_offset; + Py_ssize_t f_string_multi_line_start_offset; + Py_ssize_t last_expr_size; Py_ssize_t last_expr_end; char* last_expr_buffer; From 730bbddfdf610343a2e132b0312d12254c3c73d6 Mon Sep 17 00:00:00 2001 From: James Hilton-Balfe Date: Sun, 23 Apr 2023 20:24:30 +0100 Subject: [PATCH 238/349] gh-101688: Implement types.get_original_bases (#101827) Co-authored-by: Alex Waygood --- Doc/library/types.rst | 40 ++++++++++++ Doc/reference/datamodel.rst | 4 ++ Doc/whatsnew/3.12.rst | 7 +++ Lib/test/test_types.py | 61 +++++++++++++++++++ Lib/types.py | 32 ++++++++++ ...-02-11-15-01-32.gh-issue-101688.kwXmfM.rst | 2 + 6 files changed, 146 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2023-02-11-15-01-32.gh-issue-101688.kwXmfM.rst diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 27b9846325914d..54887f4c51983a 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -82,6 +82,46 @@ Dynamic Type Creation .. versionadded:: 3.7 +.. function:: get_original_bases(cls, /) + + Return the tuple of objects originally given as the bases of *cls* before + the :meth:`~object.__mro_entries__` method has been called on any bases + (following the mechanisms laid out in :pep:`560`). This is useful for + introspecting :ref:`Generics `. + + For classes that have an ``__orig_bases__`` attribute, this + function returns the value of ``cls.__orig_bases__``. + For classes without the ``__orig_bases__`` attribute, ``cls.__bases__`` is + returned. + + Examples:: + + from typing import TypeVar, Generic, NamedTuple, TypedDict + + T = TypeVar("T") + class Foo(Generic[T]): ... + class Bar(Foo[int], float): ... + class Baz(list[str]): ... + Eggs = NamedTuple("Eggs", [("a", int), ("b", str)]) + Spam = TypedDict("Spam", {"a": int, "b": str}) + + assert Bar.__bases__ == (Foo, float) + assert get_original_bases(Bar) == (Foo[int], float) + + assert Baz.__bases__ == (list,) + assert get_original_bases(Baz) == (list[str],) + + assert Eggs.__bases__ == (tuple,) + assert get_original_bases(Eggs) == (NamedTuple,) + + assert Spam.__bases__ == (dict,) + assert get_original_bases(Spam) == (TypedDict,) + + assert int.__bases__ == (object,) + assert get_original_bases(int) == (object,) + + .. versionadded:: 3.12 + .. seealso:: :pep:`560` - Core support for typing module and generic types diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 9f91ade35e50dc..55431f1951e50d 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -2102,6 +2102,10 @@ Resolving MRO entries :func:`types.resolve_bases` Dynamically resolve bases that are not instances of :class:`type`. + :func:`types.get_original_bases` + Retrieve a class's "original bases" prior to modifications by + :meth:`~object.__mro_entries__`. + :pep:`560` Core support for typing module and generic types. diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index b98b7151a321ea..d16c496eb9103f 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -407,6 +407,13 @@ threading profiling functions in all running threads in addition to the calling one. (Contributed by Pablo Galindo in :gh:`93503`.) +types +----- + +* Add :func:`types.get_original_bases` to allow for further introspection of + :ref:`user-defined-generics` when subclassed. (Contributed by + James Hilton-Balfe and Alex Waygood in :gh:`101827`.) + unicodedata ----------- diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index af095632a36fcb..9fe5812a14e15d 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -1360,6 +1360,67 @@ class C: pass D = types.new_class('D', (A(), C, B()), {}) self.assertEqual(D.__bases__, (A1, A2, A3, C, B1, B2)) + def test_get_original_bases(self): + T = typing.TypeVar('T') + class A: pass + class B(typing.Generic[T]): pass + class C(B[int]): pass + class D(B[str], float): pass + self.assertEqual(types.get_original_bases(A), (object,)) + self.assertEqual(types.get_original_bases(B), (typing.Generic[T],)) + self.assertEqual(types.get_original_bases(C), (B[int],)) + self.assertEqual(types.get_original_bases(int), (object,)) + self.assertEqual(types.get_original_bases(D), (B[str], float)) + + class E(list[T]): pass + class F(list[int]): pass + + self.assertEqual(types.get_original_bases(E), (list[T],)) + self.assertEqual(types.get_original_bases(F), (list[int],)) + + class ClassBasedNamedTuple(typing.NamedTuple): + x: int + + class GenericNamedTuple(typing.NamedTuple, typing.Generic[T]): + x: T + + CallBasedNamedTuple = typing.NamedTuple("CallBasedNamedTuple", [("x", int)]) + + self.assertIs( + types.get_original_bases(ClassBasedNamedTuple)[0], typing.NamedTuple + ) + self.assertEqual( + types.get_original_bases(GenericNamedTuple), + (typing.NamedTuple, typing.Generic[T]) + ) + self.assertIs( + types.get_original_bases(CallBasedNamedTuple)[0], typing.NamedTuple + ) + + class ClassBasedTypedDict(typing.TypedDict): + x: int + + class GenericTypedDict(typing.TypedDict, typing.Generic[T]): + x: T + + CallBasedTypedDict = typing.TypedDict("CallBasedTypedDict", {"x": int}) + + self.assertIs( + types.get_original_bases(ClassBasedTypedDict)[0], + typing.TypedDict + ) + self.assertEqual( + types.get_original_bases(GenericTypedDict), + (typing.TypedDict, typing.Generic[T]) + ) + self.assertIs( + types.get_original_bases(CallBasedTypedDict)[0], + typing.TypedDict + ) + + with self.assertRaisesRegex(TypeError, "Expected an instance of type"): + types.get_original_bases(object()) + # Many of the following tests are derived from test_descr.py def test_prepare_class(self): # Basic test of metaclass derivation diff --git a/Lib/types.py b/Lib/types.py index aa8a1c84722399..6110e6e1de7249 100644 --- a/Lib/types.py +++ b/Lib/types.py @@ -143,6 +143,38 @@ def _calculate_meta(meta, bases): "of the metaclasses of all its bases") return winner + +def get_original_bases(cls, /): + """Return the class's "original" bases prior to modification by `__mro_entries__`. + + Examples:: + + from typing import TypeVar, Generic, NamedTuple, TypedDict + + T = TypeVar("T") + class Foo(Generic[T]): ... + class Bar(Foo[int], float): ... + class Baz(list[str]): ... + Eggs = NamedTuple("Eggs", [("a", int), ("b", str)]) + Spam = TypedDict("Spam", {"a": int, "b": str}) + + assert get_original_bases(Bar) == (Foo[int], float) + assert get_original_bases(Baz) == (list[str],) + assert get_original_bases(Eggs) == (NamedTuple,) + assert get_original_bases(Spam) == (TypedDict,) + assert get_original_bases(int) == (object,) + """ + try: + return cls.__orig_bases__ + except AttributeError: + try: + return cls.__bases__ + except AttributeError: + raise TypeError( + f'Expected an instance of type, not {type(cls).__name__!r}' + ) from None + + class DynamicClassAttribute: """Route attribute access on a class to __getattr__. diff --git a/Misc/NEWS.d/next/Library/2023-02-11-15-01-32.gh-issue-101688.kwXmfM.rst b/Misc/NEWS.d/next/Library/2023-02-11-15-01-32.gh-issue-101688.kwXmfM.rst new file mode 100644 index 00000000000000..6df69463931494 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-02-11-15-01-32.gh-issue-101688.kwXmfM.rst @@ -0,0 +1,2 @@ +Implement :func:`types.get_original_bases` to provide further introspection +for types. From 82932b72cabb6a77bbf5465a0a9574f90773aadf Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sun, 23 Apr 2023 16:58:03 -0600 Subject: [PATCH 239/349] gh-81403: Add NEWS entry for PR #13951 (#103729) Add NEWS entry for PR #13951 --- .../next/Library/2023-04-23-15-39-17.gh-issue-81403.zVz9Td.rst | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2023-04-23-15-39-17.gh-issue-81403.zVz9Td.rst diff --git a/Misc/NEWS.d/next/Library/2023-04-23-15-39-17.gh-issue-81403.zVz9Td.rst b/Misc/NEWS.d/next/Library/2023-04-23-15-39-17.gh-issue-81403.zVz9Td.rst new file mode 100644 index 00000000000000..6adb71f7677229 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-23-15-39-17.gh-issue-81403.zVz9Td.rst @@ -0,0 +1,3 @@ +:class:`urllib.request.CacheFTPHandler` no longer raises :class:`URLError` +if a cached FTP instance is reused. ftplib's endtransfer method calls +voidresp to drain the connection to handle FTP instance reuse properly. From 7255bbd4a1841447a21c3eb74e4fd9e21818d833 Mon Sep 17 00:00:00 2001 From: Ankit Kumar Pandey <93041495+itsankitkp@users.noreply.github.com> Date: Mon, 24 Apr 2023 04:44:14 +0530 Subject: [PATCH 240/349] gh-103724: Add test case if no arg as provided in os.register_at_fork (gh-103725) --- Lib/test/test_posix.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 77f42f7f9c937b..444f8abe4607b7 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -231,6 +231,9 @@ def test_register_at_fork(self): with self.assertRaises(TypeError, msg="Invalid arg was allowed"): # Ensure a combination of valid and invalid is an error. os.register_at_fork(before=None, after_in_parent=lambda: 3) + with self.assertRaises(TypeError, msg="At least one argument is required"): + # when no arg is passed + os.register_at_fork() with self.assertRaises(TypeError, msg="Invalid arg was allowed"): # Ensure a combination of valid and invalid is an error. os.register_at_fork(before=lambda: None, after_in_child='') From bd2dca035af88694e25fb060f984fbbcda82bed8 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Mon, 24 Apr 2023 02:25:08 +0300 Subject: [PATCH 241/349] gh-103668: Run pyugrade on idlelib (#103671) --------- Co-authored-by: Terry Jan Reedy --- Lib/idlelib/calltip_w.py | 8 ++++---- Lib/idlelib/debugger.py | 7 ++++--- Lib/idlelib/debugobj.py | 2 +- Lib/idlelib/editor.py | 13 +++++++------ Lib/idlelib/filelist.py | 4 ++-- Lib/idlelib/idle_test/test_config.py | 2 +- Lib/idlelib/idle_test/test_outwin.py | 2 +- Lib/idlelib/multicall.py | 10 +++++----- Lib/idlelib/outwin.py | 2 +- Lib/idlelib/pyshell.py | 20 ++++++++++---------- Lib/idlelib/redirector.py | 8 +++----- Lib/idlelib/rpc.py | 4 ++-- Lib/idlelib/run.py | 4 ++-- Lib/idlelib/textview.py | 2 +- Lib/idlelib/tooltip.py | 8 ++++---- Lib/idlelib/tree.py | 2 +- Lib/idlelib/undo.py | 2 +- 17 files changed, 50 insertions(+), 50 deletions(-) diff --git a/Lib/idlelib/calltip_w.py b/Lib/idlelib/calltip_w.py index 1e0404aa49f562..278546064adde2 100644 --- a/Lib/idlelib/calltip_w.py +++ b/Lib/idlelib/calltip_w.py @@ -25,7 +25,7 @@ def __init__(self, text_widget): text_widget: a Text widget with code for which call-tips are desired """ # Note: The Text widget will be accessible as self.anchor_widget - super(CalltipWindow, self).__init__(text_widget) + super().__init__(text_widget) self.label = self.text = None self.parenline = self.parencol = self.lastline = None @@ -54,7 +54,7 @@ def position_window(self): return self.lastline = curline self.anchor_widget.see("insert") - super(CalltipWindow, self).position_window() + super().position_window() def showtip(self, text, parenleft, parenright): """Show the call-tip, bind events which will close it and reposition it. @@ -73,7 +73,7 @@ def showtip(self, text, parenleft, parenright): self.parenline, self.parencol = map( int, self.anchor_widget.index(parenleft).split(".")) - super(CalltipWindow, self).showtip() + super().showtip() self._bind_events() @@ -143,7 +143,7 @@ def hidetip(self): # ValueError may be raised by MultiCall pass - super(CalltipWindow, self).hidetip() + super().hidetip() def _bind_events(self): """Bind event handlers.""" diff --git a/Lib/idlelib/debugger.py b/Lib/idlelib/debugger.py index ccd03e46e16147..452c62b42655b3 100644 --- a/Lib/idlelib/debugger.py +++ b/Lib/idlelib/debugger.py @@ -49,9 +49,9 @@ def __frame2message(self, frame): filename = code.co_filename lineno = frame.f_lineno basename = os.path.basename(filename) - message = "%s:%s" % (basename, lineno) + message = f"{basename}:{lineno}" if code.co_name != "?": - message = "%s: %s()" % (message, code.co_name) + message = f"{message}: {code.co_name}()" return message @@ -213,7 +213,8 @@ def interaction(self, message, frame, info=None): m1 = "%s" % str(type) if value is not None: try: - m1 = "%s: %s" % (m1, str(value)) + # TODO redo entire section, tries not needed. + m1 = f"{m1}: {value}" except: pass bg = "yellow" diff --git a/Lib/idlelib/debugobj.py b/Lib/idlelib/debugobj.py index 5a4c9978842035..71d01c7070df54 100644 --- a/Lib/idlelib/debugobj.py +++ b/Lib/idlelib/debugobj.py @@ -87,7 +87,7 @@ def GetSubList(self): continue def setfunction(value, key=key, object=self.object): object[key] = value - item = make_objecttreeitem("%r:" % (key,), value, setfunction) + item = make_objecttreeitem(f"{key!r}:", value, setfunction) sublist.append(item) return sublist diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index 08d6aa2efde22a..505815502600b1 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -38,12 +38,13 @@ def _sphinx_version(): "Format sys.version_info to produce the Sphinx version string used to install the chm docs" major, minor, micro, level, serial = sys.version_info - release = '%s%s' % (major, minor) - release += '%s' % (micro,) + # TODO remove unneeded function since .chm no longer installed + release = f'{major}{minor}' + release += f'{micro}' if level == 'candidate': - release += 'rc%s' % (serial,) + release += f'rc{serial}' elif level != 'final': - release += '%s%s' % (level[0], serial) + release += f'{level[0]}{serial}' return release @@ -950,7 +951,7 @@ def update_recent_files_list(self, new_file=None): rf_list = [] file_path = self.recent_files_path if file_path and os.path.exists(file_path): - with open(file_path, 'r', + with open(file_path, encoding='utf_8', errors='replace') as rf_list_file: rf_list = rf_list_file.readlines() if new_file: @@ -1458,7 +1459,7 @@ def newline_and_indent_event(self, event): else: self.reindent_to(y.compute_backslash_indent()) else: - assert 0, "bogus continuation type %r" % (c,) + assert 0, f"bogus continuation type {c!r}" return "break" # This line starts a brand new statement; indent relative to diff --git a/Lib/idlelib/filelist.py b/Lib/idlelib/filelist.py index 254f5caf6b81b0..f87781d2570fe0 100644 --- a/Lib/idlelib/filelist.py +++ b/Lib/idlelib/filelist.py @@ -22,7 +22,7 @@ def open(self, filename, action=None): # This can happen when bad filename is passed on command line: messagebox.showerror( "File Error", - "%r is a directory." % (filename,), + f"{filename!r} is a directory.", master=self.root) return None key = os.path.normcase(filename) @@ -90,7 +90,7 @@ def filename_changed_edit(self, edit): self.inversedict[conflict] = None messagebox.showerror( "Name Conflict", - "You now have multiple edit windows open for %r" % (filename,), + f"You now have multiple edit windows open for {filename!r}", master=self.root) self.dict[newkey] = edit self.inversedict[edit] = newkey diff --git a/Lib/idlelib/idle_test/test_config.py b/Lib/idlelib/idle_test/test_config.py index 697fda527968de..08ed76fe288294 100644 --- a/Lib/idlelib/idle_test/test_config.py +++ b/Lib/idlelib/idle_test/test_config.py @@ -191,7 +191,7 @@ def setUpClass(cls): idle_dir = os.path.abspath(sys.path[0]) for ctype in conf.config_types: config_path = os.path.join(idle_dir, '../config-%s.def' % ctype) - with open(config_path, 'r') as f: + with open(config_path) as f: cls.config_string[ctype] = f.read() cls.orig_warn = config._warn diff --git a/Lib/idlelib/idle_test/test_outwin.py b/Lib/idlelib/idle_test/test_outwin.py index e347bfca7f191a..d6e85ad674417c 100644 --- a/Lib/idlelib/idle_test/test_outwin.py +++ b/Lib/idlelib/idle_test/test_outwin.py @@ -159,7 +159,7 @@ def test_file_line_helper(self, mock_open): for line, expected_output in test_lines: self.assertEqual(flh(line), expected_output) if expected_output: - mock_open.assert_called_with(expected_output[0], 'r') + mock_open.assert_called_with(expected_output[0]) if __name__ == '__main__': diff --git a/Lib/idlelib/multicall.py b/Lib/idlelib/multicall.py index dc02001292fc14..0200f445cc9340 100644 --- a/Lib/idlelib/multicall.py +++ b/Lib/idlelib/multicall.py @@ -52,9 +52,9 @@ _modifier_masks = (MC_CONTROL, MC_ALT, MC_SHIFT, MC_META) # a dictionary to map a modifier name into its number -_modifier_names = dict([(name, number) +_modifier_names = {name: number for number in range(len(_modifiers)) - for name in _modifiers[number]]) + for name in _modifiers[number]} # In 3.4, if no shell window is ever open, the underlying Tk widget is # destroyed before .__del__ methods here are called. The following @@ -134,7 +134,7 @@ def nbits(n): return nb statelist = [] for state in states: - substates = list(set(state & x for x in states)) + substates = list({state & x for x in states}) substates.sort(key=nbits, reverse=True) statelist.append(substates) return statelist @@ -258,9 +258,9 @@ def __del__(self): _binder_classes = (_ComplexBinder,) * 4 + (_SimpleBinder,) * (len(_types)-4) # A dictionary to map a type name into its number -_type_names = dict([(name, number) +_type_names = {name: number for number in range(len(_types)) - for name in _types[number]]) + for name in _types[number]} _keysym_re = re.compile(r"^\w+$") _button_re = re.compile(r"^[1-5]$") diff --git a/Lib/idlelib/outwin.py b/Lib/idlelib/outwin.py index 5ab08bbaf4bc95..ac67c904ab9797 100644 --- a/Lib/idlelib/outwin.py +++ b/Lib/idlelib/outwin.py @@ -42,7 +42,7 @@ def file_line_helper(line): if match: filename, lineno = match.group(1, 2) try: - f = open(filename, "r") + f = open(filename) f.close() break except OSError: diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index e68233a5a4131e..bdde156166171b 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -249,7 +249,7 @@ def store_file_breaks(self): breaks = self.breakpoints filename = self.io.filename try: - with open(self.breakpointPath, "r") as fp: + with open(self.breakpointPath) as fp: lines = fp.readlines() except OSError: lines = [] @@ -279,7 +279,7 @@ def restore_file_breaks(self): if filename is None: return if os.path.isfile(self.breakpointPath): - with open(self.breakpointPath, "r") as fp: + with open(self.breakpointPath) as fp: lines = fp.readlines() for line in lines: if line.startswith(filename + '='): @@ -441,7 +441,7 @@ def build_subprocess_arglist(self): # run from the IDLE source directory. del_exitf = idleConf.GetOption('main', 'General', 'delete-exitfunc', default=False, type='bool') - command = "__import__('idlelib.run').run.main(%r)" % (del_exitf,) + command = f"__import__('idlelib.run').run.main({del_exitf!r})" return [sys.executable] + w + ["-c", command, str(self.port)] def start_subprocess(self): @@ -574,9 +574,9 @@ def transfer_path(self, with_cwd=False): self.runcommand("""if 1: import sys as _sys - _sys.path = %r + _sys.path = {!r} del _sys - \n""" % (path,)) + \n""".format(path)) active_seq = None @@ -703,14 +703,14 @@ def stuffsource(self, source): def prepend_syspath(self, filename): "Prepend sys.path with file's directory if not already included" self.runcommand("""if 1: - _filename = %r + _filename = {!r} import sys as _sys from os.path import dirname as _dirname _dir = _dirname(_filename) if not _dir in _sys.path: _sys.path.insert(0, _dir) del _filename, _sys, _dirname, _dir - \n""" % (filename,)) + \n""".format(filename)) def showsyntaxerror(self, filename=None): """Override Interactive Interpreter method: Use Colorizing @@ -1536,7 +1536,7 @@ def main(): try: opts, args = getopt.getopt(sys.argv[1:], "c:deihnr:st:") except getopt.error as msg: - print("Error: %s\n%s" % (msg, usage_msg), file=sys.stderr) + print(f"Error: {msg}\n{usage_msg}", file=sys.stderr) sys.exit(2) for o, a in opts: if o == '-c': @@ -1668,9 +1668,9 @@ def main(): if cmd or script: shell.interp.runcommand("""if 1: import sys as _sys - _sys.argv = %r + _sys.argv = {!r} del _sys - \n""" % (sys.argv,)) + \n""".format(sys.argv)) if cmd: shell.interp.execsource(cmd) elif script: diff --git a/Lib/idlelib/redirector.py b/Lib/idlelib/redirector.py index 9ab34c5acfb22c..4928340e98df68 100644 --- a/Lib/idlelib/redirector.py +++ b/Lib/idlelib/redirector.py @@ -47,9 +47,8 @@ def __init__(self, widget): tk.createcommand(w, self.dispatch) def __repr__(self): - return "%s(%s<%s>)" % (self.__class__.__name__, - self.widget.__class__.__name__, - self.widget._w) + w = self.widget + return f"{self.__class__.__name__,}({w.__class__.__name__}<{w._w}>)" def close(self): "Unregister operations and revert redirection created by .__init__." @@ -143,8 +142,7 @@ def __init__(self, redir, operation): self.orig_and_operation = (redir.orig, operation) def __repr__(self): - return "%s(%r, %r)" % (self.__class__.__name__, - self.redir, self.operation) + return f"{self.__class__.__name__,}({self.redir!r}, {self.operation!r})" def __call__(self, *args): return self.tk_call(self.orig_and_operation + args) diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py index 62eec84c9c8d09..b08b80c9004551 100644 --- a/Lib/idlelib/rpc.py +++ b/Lib/idlelib/rpc.py @@ -174,7 +174,7 @@ def localcall(self, seq, request): except TypeError: return ("ERROR", "Bad request format") if oid not in self.objtable: - return ("ERROR", "Unknown object id: %r" % (oid,)) + return ("ERROR", f"Unknown object id: {oid!r}") obj = self.objtable[oid] if methodname == "__methods__": methods = {} @@ -185,7 +185,7 @@ def localcall(self, seq, request): _getattributes(obj, attributes) return ("OK", attributes) if not hasattr(obj, methodname): - return ("ERROR", "Unsupported method name: %r" % (methodname,)) + return ("ERROR", f"Unsupported method name: {methodname!r}") method = getattr(obj, methodname) try: if how == 'CALL': diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 04ce615621ee7c..84792a82b0022c 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -52,13 +52,13 @@ def idle_formatwarning(message, category, filename, lineno, line=None): """Format warnings the IDLE way.""" s = "\nWarning (from warnings module):\n" - s += ' File \"%s\", line %s\n' % (filename, lineno) + s += f' File \"{filename}\", line {lineno}\n' if line is None: line = linecache.getline(filename, lineno) line = line.strip() if line: s += " %s\n" % line - s += "%s: %s\n" % (category.__name__, message) + s += f"{category.__name__}: {message}\n" return s def idle_showwarning_subproc( diff --git a/Lib/idlelib/textview.py b/Lib/idlelib/textview.py index a66c1a4309a617..23f0f4cb5027ec 100644 --- a/Lib/idlelib/textview.py +++ b/Lib/idlelib/textview.py @@ -169,7 +169,7 @@ def view_file(parent, title, filename, encoding, modal=True, wrap='word', with contents of the file. """ try: - with open(filename, 'r', encoding=encoding) as file: + with open(filename, encoding=encoding) as file: contents = file.read() except OSError: showerror(title='File Load Error', diff --git a/Lib/idlelib/tooltip.py b/Lib/idlelib/tooltip.py index d714318dae8ef1..3983690dd41177 100644 --- a/Lib/idlelib/tooltip.py +++ b/Lib/idlelib/tooltip.py @@ -92,7 +92,7 @@ def __init__(self, anchor_widget, hover_delay=1000): e.g. after hovering over the anchor widget with the mouse for enough time. """ - super(OnHoverTooltipBase, self).__init__(anchor_widget) + super().__init__(anchor_widget) self.hover_delay = hover_delay self._after_id = None @@ -107,7 +107,7 @@ def __del__(self): self.anchor_widget.unbind("