From 47753ecde21b79b5c5f11d883946fda2a340e427 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Wed, 5 Apr 2023 10:07:30 +0100 Subject: [PATCH 01/97] 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 02/97] 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 03/97] 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 04/97] 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 05/97] 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 06/97] 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 07/97] 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 08/97] 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 09/97] 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 10/97] 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 11/97] 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 12/97] 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 13/97] 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 14/97] 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 15/97] [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 16/97] 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 17/97] 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 18/97] 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 19/97] 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 20/97] 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 21/97] 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 22/97] 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 23/97] 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 24/97] 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 25/97] 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 26/97] 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 27/97] 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 28/97] 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 29/97] 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 30/97] 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 31/97] 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 32/97] 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 33/97] 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 34/97] 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 35/97] 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 36/97] 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 37/97] 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 38/97] 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 39/97] 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 40/97] 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 41/97] 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 42/97] 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 43/97] 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 44/97] 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 45/97] 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 46/97] 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 47/97] 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 48/97] 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 49/97] 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 50/97] 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 51/97] 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 52/97] 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 53/97] 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 54/97] 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 55/97] 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 56/97] 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 57/97] 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 58/97] 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 59/97] 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 60/97] 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 61/97] 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 62/97] 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 63/97] 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 64/97] 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 65/97] 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 66/97] 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 67/97] 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 68/97] 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 69/97] 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 70/97] 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 71/97] 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 72/97] 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 73/97] 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 74/97] 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 75/97] 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 76/97] 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 77/97] 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 78/97] 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 79/97] 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 80/97] 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 81/97] 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 82/97] 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 83/97] 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 84/97] 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 85/97] 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 86/97] 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 87/97] 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 88/97] 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 89/97] 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 90/97] 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 91/97] 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 92/97] 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 93/97] 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 94/97] 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 95/97] 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 96/97] 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 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

f_RAvc{Lx!F?rl*ZN|?rZFt{nbhwQ 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®i`)IDV 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%0Dd_KG}v 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 z zJWiy)8&1ePK0WuabFzAeXS2KE-EiZ*)^TV%n2<7w5xQt3h0a`-ex5Ss;s)aWBMNuQ zfjhatoqYP;Jg{kEKHBi|;`zJl-WaGXg`Vv==;_X3i~!8}Rxz=P`WnaYF!y_au9kv! zUrU|i&{#z&WVu$n>xE9(N}_Q-t@kSjO_8*8rZ=6<1C^d0#G&;H_ge+=W+xdFmoBn4jjH*C}k*YfPsH!$9>gCFp0E_t>o z0^pcWr_4y{C@*MJxRyab;8*F}vP7ZuHx1`$cA* z7eBQ9ExaS>$K&X)J03ERvCsa@s^`wQda^atUmWYR<7od0k7yiH^XBmnvA@uFh3K=o z2RBd9=I;7H#_qLf_tWm_eRh*o{%uyDfzjvQu}G9HUF29*9F6wZ=F#sPy4F*A@H3cq zovF&#zcWqk)5wEdy}~Nv!$!<@bY2%d$57VW=u6t4xo6|m%c-mS9?=?T7o+{6Y*|+k zb(|xqvAr)pR(*K%Y=MXz#69;NUv0!}`GvT5Xz~nSn-|ij$J@3T^VDjqb4kW-&pZ)f z+u3f;%V>cJUw}@=dCED;HK5ut#bf`f$b7()EYC)k{&}NF%d*y@9%~QQI+nQIiV|JON(1U1WaAn=` zz)&i5HSo_|&6yTIc5KgM&WV-VfX{?io_~n>^qtGq$4(f|5X)j;eD1Q`Yviq#@{(D} z*iU`vn>QgVj6t3r$1kdw?++qCLm-h+={*{@?TPxR0)RA^?{`Owt5!{dqT4$Af~*Z5X`$g*+JU-g4=@X$U& zedMjY+5JLnf2v{34d}6wpX6EXS{PRjeXoQeY2)Lhjr3{XiZLgAHf-^Fw3N{;_||}y zjnZ$*FiNGrRE~&nPMp9z8UY@^D9_Oqxfe85Z&Zub`+d#s&$#^$)Atv6Kb5cSWzb6> z=NQr+z7XYwLe*UVmE&4lyqdPDRlP2S6SZ0m&pKF1|DC#gMJKuDcMI-2bum6XNgs(^ zZw;O$Ud8GEVlp~o{>rl)kp3e2xeN1aHvPDcx;pUqdCL#~DXVSq=i?@>N78p98tv^G zjUMmf8Zv~=+<3nvuEFtqxly$7IW5K~?$VUsHEr7KLF7+ z`}T{I#E~u0=srzT>3F_)t#y{zr!{r1T;dtNcKuuDsq-9JS74qzSLn23SxvZBI9Br9 z*k<J*=p#DO@dp+)-0IW|iW~EE4g-0{jI#%t7m1I-IjqhM>>!W7 z3$pz_z)tvnr>S@pZY@K`BfuE-upfU7dU6-~Nyhv{nVYQkIM5cB!~CrO4(rSym-E%4 zwR`jC|FPP|xLS-E?bhSVP zn`^=QYx;t5JsJ0JGghf=Ypy&4Y}ewmb(1Hh&VgM#PwP>hPy3Lzo97mi?(TW(CK;D-1>+0K zGsTsTPk%ec)sT8U{T_HOC%!pA6Ph(i2SW=Bm46z`VEV4h$A_4QcHV)@(SGu@2gLL} z&xy2>JV^ZH-Op=!+ls$)KDMS2`XXdx;8}mpud5?DI?u_R9v9(t=zwZHAwQ&i;bU$nHZh37+*7`7tV}NXO$a&4zcPdp1T@5XW912p>HA2hqHNMFv>pmAEmC;0Ntxs&l%q;d4eu^ z!tHNFcfOfpM!K9Twp4S9I6|7$Zuw31>S^PBv}^fVcNvrTs% zHj(a1^Dh3ZWxIV(0Y=QJeUL@uo@CZH%(z(iZLs(?&!1jw@#OEvwdX$E$M2~cN4v++ z?o*HjAw}wC#K$8=Zumj0FREW!S^*h15bm_@lJFf z%h@aGu_j|K375bAB-c9t&o=;rP2<+#o-)F(CEvE`#uUHy+PwFiib>`@`+9WeDEhk% zeAY4OmHkxeDkIWU2LhZ zwa%&@w)P8C9)8{s` B&3eFLt-HDZOp|)9Pwut+aNvZM$CnEl&bWtsKN5StK3DC@ zm*oI1hkfpILR}nF+Cz>3|3>HJcGI`dIoUfzm}yHrg?F`+O+yWn&LMkGR~LC%RPF_p z<*Wd_V@s=p?30#>XrtYCvRp;m{{W{jJf)Ro@t3U7Tm@th%^Q zA+avIj>Nqc?`EH-E(016lJ#x5(cZi6Rk(Cx;5=xlx5k#jjdubq$hp?r6*Y_pwp{6?())IOrd5AC8Zbm_9{)0|nx&z3D@>}^S7QsVX& zUpbD1tgrebs=k(wNdC?G{A}mtskkw5_2pXi<#-u$AjPh)C1u*)>i9Zm)VIZ|Z*QzV z;9mW|{8#ELez*Fj%b%)GRb5=?Qhoc;0P7tM` zn5%Dg{WIf$O!xbxpPK6Lk50$m76pq5zWk^K%N?`80@=@NK+GnpFU7+HPB#wU&Jld-{$*W)Ce$CqIq`+-S{-aHrW1O*n-hA|Lb}`n`+AoU< z+Aq0h)wXHO2Dj7^mH*S}9PmT(#d7fIP2m5{Uoj^@ockqz=la!U#dABix+m)sHJR18_WPHR4=-&HiR}Ib; zkrFF*tD`(a#uH{5fi%BfpnTSvRqV4Y`c~Wdc}_HBv}bFJW9NO_`Mx(9-N}3RFIPEX8TU-KnQOjnYCnOBKdo7Dd*{d) zSlLcI`;q6?5w)*=MqCs*KDOVT)fTt1`F>@tvYq9qn9Zk4G=KPua~$2zbMKO#KfWi4 z>nLWV4`UPJ-e%ynGp?<*+RV062RI}?xhfuB#uVV$lp(Y~h_>{htfx1Kz|){3eIF2! z;8K+TLEJ+I$Jj>t3Pj|oM@8UCLksME3N#*bbvJl1^s55el^>CDdVV}(-0ZbCY4^3` zjL`PGLB$!N9V!~tOKG>6E!IdsV~woF_!Owv(xdauuqUgl$lgzz7;nBc-yS>F2aG+- zJ{UI8Z`Yf_TrF)aZDNf3)0r*8*Wvxgpkwmf39h4jf1c>Uw|1_HwAG71-DFc&skUHw z-K3+d&yqKV<(KQT>T)=BxhHfgJ@t?2>ECrG8FoF_rO9&z zB#i~kw=R%2*C}1d-iIE)zm;^Ncb2%VQ)O~qQ(m{9=cUNF_08yyA6&w`LYvY`{Mo7> z(p>TF>U>0SUrU0XlW4EqZ`0{#9b43XGU|YGt?KX0&3*Lo_#ozPvgpqxeu}@U&&v{l zUYFUi0x!cXBb z`h;E+_Z;BKm6EVSS0!<;kV&7}e$i*hB(UAGQ(5q>RJ3$mx4#9LkCR#A$`t0q8fqA; z&o=8rocrS#x0M%ZQ)VF^9=<p=ZpleR#w+i3u$Ccvgdc_Kyf$t8wig zg63-&RrxH%+srLjK?R0vIo${dr}K zC!7`bB<`~&*71%>*a_0vI&X)GV|mt=aXq)pbvV#h4$$7BZwg|u~RE%sV_h%TDYxWs9j^5C(Z0ZHH7h|vc#aH(Fn|~ZcCzU?E zM>Kt1Qn^Bk&(#b8?L23LOIy;{=Q&)cxNUZl@*e zML+fD>HPr>`-DC{#Q)Lmm1_1}@Q>S%YpEZ1T?ptpQ!WTy=bQduJi^F$c?of2SaUwd z&8m;@rI5pd_R>m{p=QQK!qFSwKHy@kunz#nN9BB)*CY$RHIZb3`LJtXZ!53N^8sgr ziFL_wM|9i`WuodSp>^~_zKFW0!u{sG=L@2#rU~tyCMl35taJ0fyM)M{xhu3(Z^mE@+UA_XnuR` zjN5#8r_tJ>H2U-b3k&{Q1KW%_oNoP7c$^0>$uGcY9=KY>XSHNA&kH@Dge1zoHjRFIPWPjiB37r1CePuMS!E>^27U@;cE!Il4c+d2GnSa{%OTO>XJ_cL^ zU>fxA5M^!Um^GL0hnl?D0sKYq*98}ZpHC>Ri6(bbnSI*~?QNRfRXgXg)Q5EVgNS~i z|K8uqIVPqGT{rcsND}j;Pd2#=fe}M|gB7U0{0oAIu$iiFw*LKk)%QjHd!Fi>sehkN z^IiX*qx!DazkfybeL??TO!G$n-e2s?pzj>3?9~9S&T`NO=Yk{Jxq#BX9+R=lRR=h(FIb{q4eMkJI}XLdPjT z!Z_`}Alg?IG)`|^2py-c3!&q5;F5Uf?s3K`(ijEX0V%k%%CfocrE)R9**XL7mlh|2 z`_;WnbgS3So50h={bD%2R4~8U0URZbK3FG9F2GKU2ZynUZt-doBz?*1~^6)`vbl6RBL z3fT#mNVtnbe5Hev*}@BQjH6>qt8MT9kX(K(OYoB{>7{zhM*=cJ+=!47UVsf6aL;@z zdhMh3A>fsGH>;jwvd!U_nNMI5Sh=nF5joB6wFvATVTYOQ{=L92&qaHFNo8$~6?)aX z9Bfl&66@&7U`e#^lsl@@7nT)E2^Pi*?Xj%zNz}_mUPR1Z*xsTIILme!Sh;NqODeUe zFU+695=QFkdul0tQO+%&q({@4f%@?n<%dpaA3d|bseV$B(AokWX?Ck(iio0*Gb zv^@A7b6j=e;mT^UeG$@Kd22dOQMuz{Kc8>l!wKOP&l7hvAkNvV7ewNiau$5{eoiAIvmOhlh5 zN%&|uhYkT-B*8gkFF@Ph^bc>0` z1Lc7B57PM^bHF5}bt|&c4UB5X*2WfmB9?O73yn5s6f0b`b;8hQdS_6Mbz2boWOaQ{ zN!-2`*mRlOO`8>Jn~CVOj`Gw=v4iN(B9}CTyz62`-r#(wAHEOBdy{GY1q;Ve9zS16 z(C<2G5BS7*GP}^(kAJ5b$?yNH9OY;NgZ7z83%{CJSfq5O?J<_{=Zsq zcCC+Q30QCEX}!rdwh4afNAFTS9}?e&zv3EtZr{mj22)#GFgC~EZEa~YAa1CoyF{`y z0gsSLNljY~>sq#@1=bPlACApX#oD8CK9o}(;y%La5H>kU9N#*U-?`u;;eOQmIobd` zgBs`FR-0)$tu5-0{nea7>v$TmZLZiq4RIWSI-Cdg>+u<3vP=Q!56t-j^StT zU;oqJoKN$c){h5$2PTX|vNoaKhqz6vh->Q%i)(9$0#2vdt2&!V+M`0n`n|oeC82}<(3d_ z>{3cKe8xk@evhN6gy#67s@Vl;#G~|QXur<;!81W$@TO~Ij&Yf%(;w$*jDad_F3X!4 zx8KNJLGN%qcLeOcY$>T5&oQU^xQ{)_UVryDuhMW|R_x7gI%E(rGsnZd6Z6sPrZw(5 z^>=|Kuo3ZMg67$JF;6^=hLL=)tdt=ZkXgFz(F4yk+E(zpnaFLc+?(4Z%1?5?OJ%Ql zLfxqI>l^-l<*~&23%BXJT(2#7nHPRF#J^y#L+hH~NrQjkj^hZ)3Pr0~yYOjDcD%>e ze~e>)n#RYL1o#+yqA+IAS71zM(|SHcyepN)yvtzf-eVAJX<4e^VZhayEcRU7=`1Kp zVAp?P>#dKzE+Jl$sd_zhwkd)hb%*T*N9WL)i~6S5CH$|f?z>4AToU@j@$}xhjFy9#UYoWIA0! zwnV%*Dg*M&%v$@xZ&2USXRS^xUyW77EIV)wogXER6>F>5IC%I%T zVkt}|8F5al4SM(!li8+vndQMI$Vqu2`#31?EtI!4OUN{knc+tPd|v2|m8^GL5R2I% zS=KKiSqt~O{=LGtv@5Y}z3CNEMwu3)ua4xj!I)NCrNk0(&rau89)oH&Y`CdjFB^I3 z7`M+eavrdpiS&|B{V(ZvQRfzg->-(=8$%X8soPP~7!DF0hvjI*0NVNVa6r#kF)Z|q z#MiAAet*Xd`Zv=5ZlhGQ1^mYE-roq4&xkX?Fe2XqJn-S7~MP zJr)?OTc@~iwnqJS?HTaI__IAzTyEGyBxv{V3Cy!pzi)l2z8rq+TV-+IT=uQ{a_z3w z5v(5;>l$bFH9hzE==`q5c`6^~_#7PDSONavGUlQ-a_npPIsj{_YN{49JsNS;*OVi_ zFDRDbc=yuiFV=s^{qS@XzaIu2vqrT0;cty|KTP%FjyTl*`_DWsF5fHOL_FLvOjrlE z!=A=mCy9Pe$n}!3rVH397TpdQu{*71*l!O~+R`VKB*Z4=alQXBuxcO8C)#%k=TX1T z#IQoYMV#NL{6gFf_$dv#Pm+N=;6uchYQGaldob6#avb4u$YJ|Tfw_Ts>|LnVGOE|R zR+AZG!p=aiGS{Uyuy-I%tXLm*CJo*vbS``?;CElMn6tt9!*IM$4S)GEEXnt1T?J!F zmV*}>)Y|c|B;U~TLpQa5MBE*I9xTZ%0W8TvU`a-f)n(Q0MN%DeqXL+cC1F1CC(rns zWFjHzw^xP zbKBeLES5bwZ=;oXY4#NO)h4-3qw{*}q~yVqYuB|*0!B9dKQFP4rQcUa#yc}A(xj#z zQ5loyzZG#KF8M1Ei?Cmw#O1=Lj`*8Fj~BK0dYM>nR6jo7kGD1f*Bh}2&dWA8a27wH zcCCRd!cde6aFjY!z zY8drbq{x9-esO2frX+WpAtex7g7OZpUEh)_{FFL6f1r-Yl$sBNZY0@pQ?ITkj~xG0#CkxVQ{29w*x#Z3PvPn!uMzky?-yIXHt6AGip2Z zso1kB4gBtHC*l>7+|^U}3GUX!e)A&bhwjyc`&g2%tDa%)@M)vHr`t;N&BRVW*-C3% zK@74Bb-g%0AT9`S#Z}?s((`Lh<7D?X`b4}+q;278Nshl_ZN^%gDyOn`Q*25T*Pjy~ zcnbB>d6oE#4{_{FSyXp4Ut{H`$C2l+>&2Pn<&Ze+KCELJkM-Tydo23}rn&G1+cAmV z!SPyXZYr;^1>7HTr|_eyx~i*XA7gXG+9TQ$P3*J{VLg~Af6;*OCq^7t+$YictvG_d zkF8&;8*#IqgAO&Q>^7X!sBEeuKSz^AOx&;B+U>84p)p}K{yL={ao>qQ_&6@#5<{Uc zrmx_>k?{8+eE-%OT)GX+2+2tm2KXWhD-F21Po+ByUb7)TSKGzxBp@;X^ zMYa29GoOE(RCwgwfIUM<|Hsi)>ivI}<`VLZ^*=mcaQ~Ac^k1g_&z4;iVBb9h_lb1= zOZr(0*Bf~>9g?xL(201U9-&uLl+Hrf2%^toU0U74!Uw=HoAz+;HXV~N+5JB>w>bT> z1pWGnepuriAL6_}@Aau_yNP)745E$SVBvF(_{V9v|BEg)F12Z~l-i9oH_aw&rnqiC zsQka`<@f7$_o8g?lDQ%ejp?605$loGi0f~!`~ogOWg6(U;E#uWzXWHLAX%nBmt_o^EF*>H8yyPhNTDC)@5bY9o@820Ryp;VvPz00 zRc4!jQ;;KMl@P!Ey;R4MAt9?IYqq@Lhg}!_6+*^P#*r~n9FiO&W4sL+<9Gxa<6M}% zmM#ZBK=k#mHSHH;B5bBXvx>*n-e)o)CrB1;CJoHo_90z}`$(8$hsGJFyKZ$q+_;o4&0*zO&4uIrdebow7EyI06!R{G6jL8_GY(2z)nPhR$rI4|kt-SQoy z>si`Qny8!;RL*+I=xUt4r_DLNp{*71_25s7`9SG)s~g%7k7^I4-7zG5{H#M`F(G*@ zqw!+j=y@_F9%t}$u?Z;yJ#seM>yY!LuKT=lUdmr@SY_Wq&We27KBi{7yEoh74D<{=GQECF|db&Vh6G zn7-Q4C+w_x)*SRV)7gAO(bF*=;7|c?3;N`2`pwruLkvF`(|YCjr6JE2$AsL&^L&Zy z`mI4_K;BEDIXj-dR*w}O>D&(9v++KG6^r?S`S7QGJg(K=soP9>omEwc*S-MQ8E!vpg7<{s zsnGhi2wCGl_hEfc#yQtr8LfJyoJ-u(i+9V&BniMwee^9wYsRZIU5V%QgM&*7)@9dkdt{Nb@r)ussO=VRN6l5<}IaYP{VpfQGIlvU{ z+5OtHbpDKEFjARiRo8KRImC*1p2p(Gqy9XcJ8-T6oluwa`_cmYcYt?6bAL5kuyk&A z(|1YsDqRdbp~&L{)VmmQQ(Cj3aN z|M^e-c{I+hi(SOyEQqBXNxvEt>ve*mJ%2J=$Zcwg?=2MeT#o5};TMf_okHv06s3Ad zrmog)IMSe7yScvSgR?^3KSO)^F!3+EW4M{-Ila?Da}M{IyA8~P^URalIk7dGT@P&4 z?9+jBtCh!pNpkN#9XR_0^OD=(8*@ao$$WEU9!K;AhPaQ>^L6~39pG>6R4$K|3wzZh z;fI@iGxH53X}qw%)Z?Hv4L#T%+HZs7sI_Ufd5EJHZWmTV^3!b>{IKy9Hi%SKsZa8~ z8Dd`>iuth4Jp`wLf{z-+Wl;MH83I6>A;(ag0af zvW&uTTX(&#l5^aCXoEz1!SjA$UnrjcDR7=j7yNBb7uOMU+nI+o%rI*rkF9$;r8tXY zR#>9zdv0B=_O?A?*=(wMcvq2Rtyaw%Zbh<&TS0uW)u2?XCXFu^3%*!?BU=c*Sg+7o zS<3@kbKuL@5$~?E(dU;~E$u&^I^yBLz6U*9sV(1Qz!(eSu`<7}qFC-qzCR?7 z?GL%s7q6^(R%m78?m{w>tdy=64x|%5Ho(71Ekrz!84|~duP))(roV(;6u?iKc`>`(E$5H0<{}?Dye?` zJct+q`$Rmm)5_Cd^C&S~KbZ(T&PRA3Qpfrrckw;$?HDP`1zz|QN_!1BA~gPOv!XW- z#wkrpsqIUl*QLIoPqg-`+o&I3r*`d*GS|DE~e> z`!1zE9VfmE9{3jZIi9{_ZmoER<$%ur8pZu$eGmHb;4J3qrf2bTeb1YT)D}nlX3z=z zyS>)AYTb0U3UqR5_I+`}7Oouk55M`FzxjMR>@f86htPqv{opCSm%^5!@%v8^KU2!= z(?!hofeMl#rgzzBZO^f{(K(FPFzCZ=*n3;}dx+_f{my3oy$W;cp!klyDcU|=N#FH7 z8-9aXY)WDY_h;4R7yCiv<#k8VnV#A-@I&Y=#oP#Q*KulB3AL-yAlfw{s6Bl_?I{gv zPY&joE;m3v(%XjitV-iPKIj|t1>U3|!ltO^qog0SRFTZ|HR3OR;`7I3#m(E@A82=^ zxb-}bq>RaC+=n@ubr3JC9i+7anPWh+HoA7g*ZfB3N{vGj}6go>CG=L|jxTl^Gc9p;+?jZh)`!M}|*!&9| zoxuCQ^z(aO!~@{?f>y3uNOCJ5`O+eAQYPEPbs#buGA7-2p)!e8Y^F86qFMFXVmb?H!k_j&qxy)) zY4=rD_iwe>dn=lmZ2Yhi`xDQRo+C%>4%mmhfGW2(gW%2G)LGR*R`^O0^ z7kWM13#>ayv}zW5y-sR3-mjQICjhe0Z+Ji~0`4asM4(s+`gd z>}Wc}cL>`>g~todPUG>y^0=*E)%k*=VOH~nN$R7Rw{1UBM-T(2&0y_L9-X%lXAXQH zp3vC6QXY8;v@B9ySY+IcfDD}s+@6B$ZcATN1RKo(8o5I z#a?7NLE~Zs%~HBeQd$$%(;}JGEE=*G^vmm8kS9@KW#zqiGT>Vy6k_vnE1ku*L~HRs>AlXSvq!l8 z{}jG2AIYS5@1rudQl1wFsh>0tt7y)(kNSE0WYKr`!EyA*t<=Y^LD5g~bI z&d{@AU8Y3U_c)(Wd)b1N%^ct6Y(ses@gDe@w)K>9e|M5qYH$zS-edA?yCnP#jhgS} zM8>foFN=4^_kF4d`YSWlk(p)QJfC=2=^lei#KN$L;++NY^PkhZy;OIvBxEwQ7yK_d zOLnDFS=6Ql?UxR9RhFl21|RIAytt#^N9~*K$C*mIBa6Tn$8A@CXuAUTQi*QFs4`uz z`Wy+Wugs)+2HD6Q$n(Xg_!)!SU|}CsHG7cIbJXQ{Zjy<{OCkC4gzzg^PV*0I5@$h0 zUDLC|pfmwDp`Li+%Dv2WyM!}T{gW^5W&8Vt4w{cs42{#SHTDt6tGj<-9BC`RyI{9r z@~W4nPA+(97X8niT%aUONo*^hT+p@G(Ns!fNORI*_p!nvl3^jgwNaUN$vT)NV)pbb zJt=$^#*Ytv`T7C=TyVRGISvSyiMOZFm~~wedlvjdcTSaDyD86N?f&W;CxxtjIetPg z-Tth{{Bi6yt2Ilg>|YV>bgb1yCoo?H-NV}qUIJg+yE(>Hea~(>W6>US8vE8j`PV$V z>6|))%1fCS=jwWN`3SYS12%+D0;}xN*}%2fxk(ab)c6JO!9BB=-Ze>5!a#Wp)`$x} zVTdzg5_;9sk#J=*vn-p-h$dA*Yar76(6M697)RzbYJTMKA-~TkaL{pX%BS*^sr*zb zzl-*mG{iBPnzq@Itojy3u@@woJFXA>&2}T52Mog2sxF#w8z;n7#d#!>&o!4b7As>I zGkkqf`IzG%JD855A(Z#{CK{nS%nO{ zC!hnzbCLn_$DZ{Ep6w)lvWeCRaJm|?p8_*EZeL6Cq$CU484GM)YNv(h2Yl?3+6PCf zvf?&#{Ufzm{~bsCVkV6huo%I^ft~Ua*E3wsZ!zB%MupC`y+Ly=Jnlj&kGqh{F|OCi zEFYNgh%*b!^Rw^&-{u_lGLFAO^$=fs67y~!)#cFU-ERg1^X}=vuz44O-;epfYZ%c# z(%#t=R1Wl0nTA0BaZY(g5*X3r%~?Hm4xLx>E2;m`xv$j9UL90+0pE{B405!I&%<|U zzhaGC{)c^Yw$x}VdB^05WXH8pA(;)>qtbL&Wjx8x@xmVvdySvUu1ut~#6a2wq@_?= zN+4|*X*No;1=3COK=NqiUdh#` zf1fM6{)fIJK4;}#BjVFGSJGK)8T#=X)%QJox>etI2eoq6M7j3sW!@L#r!Yyx4aS%DS!CcNadtUF^FPpZ6B~ZXb-~=PP*m-9uCt$xuoOodJnn z8MwQ%2;8Dz`RP8*?+-eMQX|`6O1#|6)LJuegXj}_9h^IvLUJ|z0~gdp^0|qg;d!Q{ zlnFiHA4Babs*UXzX9#`Z>{oH$!S-LE?>-&(Q?|J^A3DcH+31E3&>1<}@yXxm+(~kI zNsQ{V3fzX89K_?HHfAL>+H@U(utx{Zztyq!BDXnmJWTIF9zo2QcZj#PU8w6d6*KO; zoY~OYvW4U*JDWHJ-H`HSZud8M3+~DfJ^qIYqc`<7{FU0d{JL(M2d?ErhsLL$=I5lS zkA)lwy=>ddn>psd^0~~VV^f}?a-X5PbbPa`slUQbH_5HHliLzfTkp6ia6U?K@7ADb zSjfzAL{8WI`zCQ+By^^lexjV?EE*Q=YNxt!SIhk)=d%6p9;dUOc4s?Z4!;MpIu^l3 zWG!=ju-D&waR$zEH?@b}*}pb656r5DRTPFpVE&$pxZ)iVpRKyWvlUl(RzLnT@Rqp# z2`+P=&<&PIi$?5H9QVn)h34)X^xit{y>&tFl{DPT^#HdtEE*Xv&-@1Hq1b}zQGXuW zp!#lwZCd30+FkX8>Z{UtokF}0a|rfo&Skg*AbDI;J*_e9)8B?T0wm49q9B8pr7z*tT%+V=WEAdpQ!q7rq9MT_l|Ud zXRcW^Qm^HqIhuDPJv%s+xi+ogm`4kKMzq5mFE}oEPq<95MdG@&w-w3A?|X1gF@G=0 zrQH!F1m6)McA&r*+MYNb4%YIZ@^F^|+ZN}&#U5?0=8GfUAP$8Cx6AU%kczoZv1?H4}xx*jS7PxP)({~jF+ z9ypx>+y0#v#I)N>ZTOcr6n6>w!VV29;iV+eUwvQL`9#WQ;R~1S{!5Y;E7-t>zMFXK z1>DI$V@T@8o>6Z|YHHadbWh=D^&lPm24!nN2M;>4AtP+fhWcV!ZMyu6bUUT%Sd)?X zo8Cv*%L1DLy7b$r{D%K_e~WN_5@~$S@U|xn!oTJ= zYWGU27xi_GQy<#ce<=tfGgOcEHXAnjBFVd`Yoa!X7Ycr|ArdYx?iVsyXe^Ym`4z;^ z@GMcRk?pvjo{`KF>AdoG$?#1+horo|aAtQ4@?3W@pd$*kW6^Pc0vI`$E<`9#x|x?( zLFJK*?n%F>&#eFs4r0@G!X7A%)o@I_FN^q?_6l*HwBI3qbDve%()T^8$DEh`m*%-Q(}`2e8P-%9U65F@npMiIxd z@iw-A-`R=#632_wHpC{*qP#<=#;}BUGA;JdcyZ_2xlKFqq0)IiM}pD>IWjv6wszKP z&^L$6rDm?DgARNj$>D!H7SPA9q3`h7n?v;GdKl_c8s&rUUL|-2jr%zRx0l#HN#d9s zx!EKGT4)ZuZctvojmG{^G#jd<^?i`exacS1-78ZY%9ZH{Y$Rjk@1k?sF5(NjqnQu% zg5TXYsE_FrRnN<*%u`0+8xyEK6PbrU*L04iug~Ll5at9^6W1#(nCB~@@9qiA2mD*y zM=pwDzWLNg#O^`6yatY+!`uD{wH*f~>${^HtGLe>WV(bpT++G67Ez=ZA8 zu#v-`W32ED{dA7{$NH&^#!x>+|F(YWuSntjW1hp%+i2}s2<#U6oc=!M;pOp@76*;X zi&iMNBfgjTECRW%US6|*1OTU}x_eNH@ z9?vN4_)l433B5Pa$_n9A;@!*&p*I@X2HzCsI{sT$2%M5<6Zu_UE_g*}GOI{E1|6{K z*#i4wna7gpF!6gD?yHhpI;FE6#dwW0d$uuAC z zjd&b4enwAnzfa|CF>-t5?S`y5W9eVuI)BPb^W_<|PfO3B^h`=WL$VR}Z}5sb4Yxq} zv(}gA%Hj?>`55Mb>PwYI2>w^wJb^xfmzt4F%$`}J$EvkJ%a&~)TfKGqtr z(R2(T3!l5=&s)=vFmEkQ7H!_vMG1`1hZ``SDSSNLM+M)5EDb(4mBw=3N1?Lj2Osgf z+eG-4Lx%-lD(o}uG-fs5S$Nq|lhWAfA;cX|@*6f27|j z?~RCK5@`%>dQCqUM6$E^{g_WWY$uK;8FMfuA6=*U!_-Y^?^`Rm{B;xCFVGnIn@C=u zaq=%Q77oiXZol8q&SR|l<#zwo!cWXUPby5|@5Z*L;&)wKyMHYb0Ybb z6bl>V*^%w#XC8xJNpZklK0IHrz5MJ*el;@p^EmcT+7n_~p74t?xN^{*uSK%opDWrk zFLHZKXbFk-443FaF8>p!1GZtG8w4Q z+k1+*jYpGi%HjI9dBufi>>TIIaemvp!gJNY0%BJEJDwpAc=99MZzjck{wUW~a^L5( zM?u@0gue{cb^55d*Al++`^UAV2(}9!ctz+*5gUo*)18G!#eGNd(SZE%>4!r80A57h z!&8>wT*LdbXH1tk=39lBMA>0JxUp2$%%j4uC0^{)9;cK!r-bA|XSBpI{nL-a)>G6s z72h=;^oiyp4xQp_uY}q(2lVoP9Mjz({(^>M-t!vq^E}Nb#a}14;|u^FF8>T#V@ssM z6|W1tm&@kPIClQ}+^P6TV7H9To$!3YbH@^CjR}8%c$zzBX^b>mu|(lli+B)LceCb) z=3S!uOj+Hlj*9(-W88=M@r=lF8uKPF&b}6Vjj%fGqfJe z(5cI5gU7FC9)n%Putqy_s2vKm!~5Il_8COm#|)j2@jQzpOZ87k&MtsWgoRbisCACS z;l6;{>D)83X<+Jv%?@8DV$J5l4s>@it0^Nn%S&gX-4d&bm6E#Oj21DNk+*A)(dF=| zg{FPS3$CU72c@{O);;-yO;+$P1IbxRH}V~)?}Kuj;~F1xHC7$x_Om4J5Y!tIBplx)%9Z;n%4w z)JZ(P9kHYjC9oRU*^-=PGt{ZQM~*;#fo~&o?KO&6vXvy~0{0y@T2%(M5dBHnH&D<8 zEb~3tgVhu1>`dkO|88t|P+7oTxFcbmC~unNg6|f}`<+%^Um~kmzBj)KdpeJwO>`Z+ z%Dnl(VYRSP%1A_6Yq1U}Z7Ge(T=-fOuQd_Po%Z_jMoBRr|DmDKIm`+N)*1?-kE-+e zn~}E!7!XV$4f&u`bC z(|di>RF7_N`D+Hh5ra$IaR|Nx`K)+Y+{dKE;tmPCNp_7~7apTJ#nHbl;K$f!V!2-0 z1Ba7T&r*X@hPc%gQnKaj1m*$8)ix8!e=}H31F%|%A9-i9TD|Pxa0vycWK<96=$)tS zyG3DlLnP~iw-GOLRs8A7cSDiv`-|wE>$2;6cK%u1m*E~C=Ru)&jf1@C3BS*W&JOcq z#oVb)i2n?keh%@pXQEiexg`RR`B@s*p*3rIjxV{M%l!8d?W<@WV@?%mvBE79E2Q&t z0&oFL#1HI}c@Q>p$x=#LKh=BLoS3I!-7FC{@t_al&Ut^R<_r*x6v<@q#xPHjlw3Ve z68g+-7yT8H=-O`qrX+j`R3G|JeQz@UDY6|pbW=LrK(kL?7Bq8SPO}Z4muC4yuj$yc zHCpYzj81>rws{wi+w4%OuCyy3y%;q|`P?|mSsC}WJSxQ8j z6-6aigKj#_mIP?__Gi)TC89-uUax-UzPXL^f0N#w6hu3nZjosAutqPh%Tc*NS1Dy zXgJ0b-3{d*PD^(IKcCBCw3m*a;d(>IPCDCTKYj2&YYVry}F z6RoYpPg)Jh)oZD)Dnn}70MQ)nJ525Ag>Eg3-a4&8_it+SzU$@BzWG~*^6Aru1NJ!A&>Ywy?CLh?woX$uTc=bSt96hiAoI|erNj2>u}4O7 zrls?E@W&0X*-CQ6oYT&h!Os|*Qx{avGOg}tVJod;bULh>UmL#Pa88^%aYnsg%m3Y= zGI9iZq=420aZ z;Rd3GO_Tqek3Gum49}CicYJEv=8B`8g^icAxY<#xri5sI>uAiJl77g<+4*ys9xpS+ z@dF9Ig5q?HqefbvR-~e(0c(#^==HC|72( z*t5A0YBbBOh~hYdHTAF0ee^k!1#0K!H9#m>-aSI&VYSd6oXR}A9jpd2K4KD|r98@)*+P4sz)P@BAlVRm^#_I=Kb493 zej?I*r+F!8rt&yav-o@fwi#rX6vyOIe>3dQ&_B?$l<2X~Fp_^(60vbO)~}h`5yRs< zjJ=0@Wph|r?^0S+SXu$Ue`Y@DgS~W?P?I_S0C3iNz;l9m>ycg^cTI~g%J}&#v_G?% z2eAg=yKtQ5SdK~c!0)@1%EFrV#?X09W_h&6J@vqou(BFpXYA?^%AGl|>#mYNUYVCfj<3!4 zu^z}~;DaB~8a>Z#fRY{h9402T$sf&L*l1wgoh0i)Hm)~uo!`*cqv2x(z0jJTzCNM% z+(dKuv3{W+%i!nA4dp2By9fNub}}_B<`($Gw1f_W1q$F#IqvA53HOA@he=?l!OF{LV?Yko1=igsBD`?Mk zlUn}MeL?G^Pq!HzpYI3s8GjD383&J_H_Ye83&1vbKd4-knW4)-Sz-*2&=~N0PtDf5 zFT$GtEtN3@A4d!E4l1{El=k{3#+Pwm8{0-_zokT<5<36EmYU-|1nD8xYyK&3X`jJ% zy0GVaE~wq`17n83*ug$`O~5`kVjCb|VSH4{mWZ)qh zGWk8{ipj89O0t+%msp-Li&)V4tEHs(h#tzvkM~MdkBpRB*e3YTRI-u$19TP#f9i!F zjlo(y6EYbSHqa)@@107#w92_lkw)g&U2+X`@Tm4VfA zT3#`Zwo z@fZtcl1(I5GgWSBK@1EoZ&927%cAMcNWQF;ImU&@E~QtuBi>sy8!DwSGZ(816t=m1 zXEfWdc~(~3@D1U2 zT6DHEY4%(s`_>{x1k&$56cX!A>?Pyq_~B!`68@$1|9SiUjN#{F{f7Sht6IO+PyH2r zhy_gJ2H*2d(W3469MEFM{11KVJd5`Kor@UOXMNALR6drlq8(Z3K4$*ZNwVEXVhi1 z9pC<6k7bR0c^i+}OZ0n()%3m8YP$;9FVSoha6$F-=eW+8&h|vFTVdlab#nX|+=&9? zztiupXhb=mEGnS0L1MCIn+AO^aJ4}TUe+GXrszeIpXoVlS4=#Qk)L1mJg_O!^QfA= z%jbzFF8U?&{btX<0(e!A|4ZEe+=Q`|SO?Lo2KV75ovk+bkQR033{v|mIw;>lqwpgI z&f4~%GOGV2c;sw)mO^WyK3erXOl7Q$=JA5K4F&cEW)wCW3gu}_VFh!IYys+vB^vDp zu0P2P4a9Sg$We~NveEIhhKY=r!|k+|KwH>@0ml^15i|0pDLrZMjn1ipA05-sZ!X0 zzrt$vVSkGiWzC?noYN25lBHw^`0lT%9n<4R=DbSu_zjD(9AdH6ZSY}wT+q-+ZATk{ zZN8Vav$Er|$?&$|xo~Je(iX~cR9ccNcq_}0GO_$aN zi`IrXDUREQe@ySp)5hqO>D89wb?P6wUXeE+lFWl9Y8T=|de>I|p-WPlOw;Afr|7x2 z4%p<%AaGQkeM0U1J>^@vI)3v>JZmtyVJnAzS20slkrX%h7V*XTlBGL`)<`_2Oi-Y=AGLy=X6^Di9gI9{O#PWIc;I5DP-B(<7i4<2>J-w+#S#`}WzZ6qF z4feXlUl_#Rh&zd6L<1_fr;XlqQ@MD*1p0I;W5z1yE`Eob@ zAkoGX#B00gy`+Yure71iU!(u;obl&loi%YEXo~}WLk8FjYVEeK%GrhI^EIrPdHimU zc?M~1W1dxMYhfv^FQfza1?xL}PGc{;JPq>Q_yV_}g`XHM56mF|0aCV?a z$bO;G*0+tv)bezj*ruurD|&%1S@)Lu3GC&)GgMC->&&M!&uK%A!*z)G9pZKrA?`sG ztc1V9N4V_mkJm~9P2Mmv*}G>HT?!|yLsBs z?{JATbGm!w2gEzqusqnz60f)N=X)G3$O8QPR)=d?|K1RI?*V#Gt!H_V(La%?Ef>@$ zaX*E4226V3m*&wGy#q2oDd*cnXOm%7Mz%yUNUeR@u)NOJO1xz_ zM%07*+Zj~OU>WnY_Drl-F#dy3MV?5VbST636Ptfy|vn5yi zolAE$(m!P1VjY8uXjlwc;Pr_M*3p05>ZpZR)4afVM@unfRA*0i)@v`zWhUZy2C_#uq3&(Y@K8(GZQad1S}qT-M8B%i>2sIsV268B`DD}$B3U{ z|3I9Qe0p~1EvbgqW5w^O%s1$K+e&;HSOtx=u1!4VkEMDIaD%AcZ`>))ueh%)($c+@ zuG}ejB5(s0$!OjuMVZahU$bRr{mnL?`0gO(S$gL+yRg@we9X;I=)B)Yvw zd3Cz&fbH}9v~FqMd6!QQov(M9Jl-WH&l@H&Ur*BWQ&jFgnyYQveC=04=j%G69oCgX z^aDM^X=oza6;a;fSGU@3(`bg6?|OTnr`$)hD}t;-JR=*igo5ZcU!xD&qtg>KaccBL z|4V8clSEq1F8CXvES*j#G&+F}T|Xdslw^VxPed(T^TZRve{#nJ*Sj5b?oDKg92YIC z%hpJ|aDEe99;!mli%0>DFPx=qI83VbT^|zS`-B76e;OubVwszLqJf8 zQPQP!m(nm~!05q7jg9Ty|NU(DdG?&oJ!j{}cD}dHp~|Ax52G09G+pO$O<6sy-TYdc zw&5-`?dk)Ob)an!JF5J1`04|YX3vvjO!f~zzRr97nyEVQr7Ib`U=G559jNYKh6^eA z7Bf74nC>j;@uv#eG!_-61L$eHz@dM_7mi25##_`astQG-uNhgKQ`hy00*4Q*<_xwsiA zdMMar!({G+I*?zic$>55!7=ME;T6S4LMY@7dJt!8=Bq7c>cxC+W?Of3glQ73M4VDE z4lD)E=J&AD4FI}X>D10L?=9orzD^Uj#P2WbO~(Wei24at`a4(@G|p08drUOX?KOE8 zpz&Ve@d!(s+sd};r$?G|hYY9vNuS%p(xtr_Nw9Bae|Ll?dCAf;Yxkd-7?YUs=St`P z-+QYw^B6}atN^B-FU!^iUgX^n+Xx5zN)GDC9-ep}@tezn5f3O!OoT_roSyr86fNxE zy*|9=jJD|}i}>etukSs!?Pf?#e)wi+E%Rn*KW!AF3ajZ`ywP}mp1k%OMR@sK%!=R+ z{POW3fb<0TXqOP+Q7+g2?ozI?>KmD9R#$M*G*zE+?+QbojDV|e>i9fL<2r4&BY^p? zSN?td*ZFH-itIgs$J@_{V}gg?+WZdIC=>SbvCe!l$p7jAxGazmTn4#N?B{=#Xoe|9 ze(HMy)}9L*vQZ7vct_j?S73CUS9(KapJ zK#$>r^GD&BZ{1zLhrO;@F;hHPD!M)hURwzl5kvfN<+1EA|1@KE(;o+{f>Vm&x*cD# zXr3hVmCZ2E;zYEe`@yvtrW?XK&Z9IECX{m@8T{jEuo9?i$57+l%zSnJ%;XEGp5D>9 z$P`(nq!C~a=aJ%ZXj9&PTcuMk%(I#3PNu&DTAWcnk{1`xhyq+thps^{DJlf5kYL5VB302zkutRNR(hkh@jc`o+q+ z>rkHj-8bI716xktk5aMZb_1X5q?&)ZpBoTxORd?wKBkN9Wry7k=UVcWtPSnX!DtHk zs}r4tE#9t5XB#P@s|q%#3TB3hZ{O2_X7NGA5mt!3N;yt;!u$;w3V)Fxw#6AMo(x`ep#(HyC{f&R? zyxtm4;(L<(M2Z0WbE$nZ=->DiOJ-Q0=jBb&%8{V7vM_Rw(W{$^zAXXr6`8L!AqmuA z5jM1!ufS5xz6tE*x!Cw8huk2NdJSqnyFYdQXfP<&(_XaBZSZc^!5hCh1}pv|bYIb! z<%0W+(MIh;_Plg9y&?^QXZ$x3eX9SWe5HzTF0rD)g(>tul569*S>qE~RYXMq_(OV= z-~?CcQMai^3fQN{k*`9$K6zxb=+SzBDYVSnqHt8frdqOBh5^fGs^0(&~oCzRZ zkk|e~zw}v(WK`&<_jb4`Xr>iqE4gGMn9kFIvj2!u!nk&I!>71=_B(12dG(H<a7|K$K>FHOZ zKCoI2--r8oPj+%$H%9<{t;$Dd9Q5WRV(HBC)i8G!q4pm)qI^!8IjWWn$j8!~F6HzM z|4n|dSOx!c3p-DwS;`Wv2TuLZvB&7`c{hv&ix%;=+E8Q-4MyCA17a?R)+h1H` zT$~s`g83f|$2F|{g?@J)*C3`M_%O7oFW9pVl=Psy`4{8!3Ef`2=lK=VAdkspuVW0f zY=IoxnE7{?HI5q_6;5uoHBl>dd}}^8>8`$QU08oXFLo163a*9jWb74QVarLAzC0il&{L-n4&Im9!59y*EE8l1vg|?v)O|?`L zw+a$6YA1Ai!Jmn|`ye%_`!jcsJNtB6hMCI^(8n{GAgLNMm@CDKtM&m=#EY}PB^v+W zT(rx8&&EUSV)wgjm z%^{n!wy30fbT7gIaTtJpEcFxx{1z`)kcyeis7Fyqc#^xD&pcE4wwF!<5oES6>xDNNu!>mu!jMEb2T3 zKG>@Hx(cf9z2GQZWsC)zlbev%P+rF)rUn)J_q#XUsda0Agf#S*{B`2b)JrQK`w-Q9 zSQyQ;t-~#ddn{BWPK(%^mDlC-lIn?R=WK`(nUf!#ffp}|EpkV@wQ0ZEP+L>5~HGYTzz4lJ*g>$@+CH@Leux+Fa+I z)GCXL9@W;5k?*BhyFW(Q*@tNz8KM%1W$R_^N=_b*i6)>F^?yKf9I$&-t4pS?jc!Z! z!u2(4bSX(~rw7#&08(1`E^RDi$oz2Rk!>Ag?48pb@o$>z$oS+X?Smo-ONHfbriTAO zfGPHmD2=WMLubX3HD>NLpejjua@i#jWqN)$0lgRh8=eJLp471{t5Jp4o`c zK9tt3?@QV<_(}4a-t~| zGHjaB^;9c!{n?3(nlEr@0_!Xn6O=ZmfJ)r4E6+iz{aE4`Pfs)~+}jd$ZWCRS=u2E$ zreSBPIBScLv=94Zi}g9tQqBFz93(2FelUS`ezx{{q727k+?QMI-E_zm>Q& z1ZLHCk-%X2j(?Ht)v1{aMCX>(O_IAZ;7djgy|}zhk~GOit7YOB?!R)52}at~R%M+N zVuLE$#jlqNRy%N4s(VoE+S=o|#6H(urHwgEH?%Jbh0&^1y+YuoL0#}I+#Kkg)LFCg z1S3b9;B|U%P6rmH^g_~-02>!@E<3B*8v|{D`*zD-{(Ej`wA(G+hU&8OdivL_oCB0k57rrlN6++>W4PT|bL&J#P)t$KSbAw2*2V@Q~=`^j61VN#uVP3T}Ayj zRY?9Y{6UyTz(N6eKr0vR&9wECxAC%t!UXo8AJ2L%&&f(!emA~R)>%Bw=B0w&_jRKh z<7i2^x8@5=CRP=Ve5xe0?DlHCmqnD=7&1Ua#ZT|C9;64-`f`_CxrQ>+GAd3NVcM$z zK0~vQ2{5}vm5f76->My7Bfgy^LPc%qScOM~p8KL0m$g6n<~vAx?1q#&vhcK_vJwws zmYJ(>dSipU#`F_u%S*09e_v|cVo4N#Ylgs@E;DOsCL4Yb;+8JIz*!{@kPW8eF~f>! z;GC1BxBNp900=FODBd}@OA>Itl-o^C{Whg6FvQ6{;(VDd9SO9bf_%TBNnQ@nUFn;+i8_a47c<&f&i*w3rdM+$_KbTq#8%Yz8UtT) z2Jj*wQKxSvrzk`aaLmlaq*% z`{t1xl$&RjQGGS0v&8gwwmO=nqY4l|-I=}Tr0Qu_x!mL~=hZLd6z?bs%64FGxbA$e zBA8P2nNSc-i@Br zhrBP&q9va@YX#=S#xxS{saP#b+7MyK#>{oIg00uTHeL{_ ziF#SU>&eMPkipSX)un7?BZEbRLKiNtN|*K8Z+9KR<#)foSN@`^;mz@9=ms#e;PUnQ zX!3%cu8>Oo*Cq_M^vU3T>#!Kz+YGC~XI}+#k0xsP;OwAVlG{M>U7YYsPy!|oqnLQ) z|KShrRbJf2J;s&ri=^Am_rf5V^DcT4YJPFkx62!!Nqh6o6>l+wceny9sMz@P9Ipu@ z-d}KsXt?<>**rm?-^STn%{qtR;flQx@sO$G)BCy}nh0tBW9EyyA%y(#*ado{BXC(O z4cxM}f9ErCn6lawdK{?q5!{o7jiLb4-G-3Qp(w81$1B1Wsr8RNKjg_rjpJPP!cmtt zx7NcylpH3{BnL(h> z3!P^0v1Zj@xPZJg;E!EZ&HwJl5;j~5l__{<#kOxUK6QDON7r4LtKkgSa$Rc6W-gi@p_vYsIy%}`KOdBAf;T+@E{=g<5kS^l7_Q_B znU+J}s?oLrSGLJpcM#UHnK=FFTf3yUUrpb2;-|`^w3I@(?21#g>bSHKy8X6odb?(x zecfDmEPLW1y^Z>DO7Y2p_VJJ&e-C)S-whacdr-afOcZdu0dH zhw&cIx3yC=S^apr+&q8%K`-ZWw>oQar5~^@9>=QI{bEn_wBzp8su*=068h@Hc4YT7 z(K{i+zz@7;o-I+tcaaELt|4#LmsKsSA483oC-Yvd>WsZ~)t9n;%0BboX}@Vv61qdX4I973EFV%6Ewro#<@JiI!|o)FizjIO~R>m)9b@!FQ0x@3kV^% z=jQKMCl&kWJbv)W-`KYay)3E2+3G|2RdYk%<}~K^pS*K;xi;@B;mQoFF&?Km6@Mz} zO`7hZEoNZI)XX#7oH9s)KS}zysF-eQo?0bz`I`&l3bQzuQ_t^O(!6;~FDLcpNkIu0 z#&?O_o-GT%8TJEBNKd&0FE17UP)J9h&)?O-`ThbIx^gG`eM#45eG~tsy~Ip^F-&;6 z+j`+~%$F$u=9m78yj!&~A4GXP{^@)Fr+Dcqz1B%f^MzAcqlR-JZ9_b*cpS+RaU$wzJwD&}P%H9jx#ho$0Lt{)JhGX6@YgpU zidnqw-@Mnm_myPQcOha>f@(QF{j#6c@bWyAUT5F~PXuLHTls7O6QU$2_X%RMBV|YJ z1!?Q}^!Le_rW>o2dkCxdOccz9G?xMQ9CCDG+T~*m)3%v--&cwONI~1CZT<0oFVlzE zZ?$5eOk+_>vg3-i2dogL1wd6hT4GXsw9__pdb5eUSvvoem<^XWUH?d08A(GUJ% z@>ZjvG;5l^15hCzRKnh2p}&U>mh@8pHBc zisl>xtZnIjjIofx5#10rt~c@ioK*#(AD=~;k|t{tc{}DPet20KCax1t*!p4)RlS{Z z*)cwzsW$NeM9E7U3WM6Gy2`!W7dKfq&zhav2z$ml6L$`E8JfkId8Xwir(wF)K9L4R3`Gu0F{Os^0Uk)sV38b7ZO*sj+6`zd% ze*E_8epvI(>ZSuzGJhC7xw4VM{YT$fhd(4m2`@WB3s+UdByy& zN$mUFUbfhN=y=oDL__YCgV3hj>HV%Zy6F{g5(O*K!o0ufoWd%5^=U7Q;$$razfOsr z&AbjVGuL$KG|#zEx^{Sw=Je#_LH5^t=oz(zu)cL-z|SoAinf|J<8*FjHTWO6Ro(oK z6Ymj?X~xXkb%7q>au@v=-RrB*k4zR_79v6=MoTr5>|B>b;-)($sRT%`#;BQC3fBk_ zlH>`4lOC^XQH)P^1WZeGLN#dTCNY$&d2&ayZ{=U@cWw6Wm?sRcdVGcJ=^B>7y%l=+ zU+7n??INTa?`btKO{mgKz@`eGh1|65%=9GRy;- zxCdcga@D6&;s$Q(=V$E{(ncL5?yZ4>NT#nnIJNC`jsR&9D>hPXp?wv3oWQ9o<>$?p zI5qGOiZ5iDV zIhMxh=?P8gAi!x@6ouq}Oz_9KrcXx{LR~TaYtnP@EZ)Bk<(H-maei^tppx?HwV!^& z3;e_L;w=|R3Ox=@rAivQhR}n>#)~lp=G%qO4HR^O2OesejY=lsv3X?rLNJWM0+`xj zu%^cW;VT8Vw2`8?AHa%!BmE1aCyIo}n;*a?5{;}2c!jxTK#HotZHb5-CgSt*6<(-f zA?G^@x$HsLa1IO4x%b@jRqtJ?@h2!-T3X5^x^i>rvxkEiR&A@0FSe5eIIyIB;~IlN zH04qBjc~)%jr@~q2M{5eI)PhvG65Gwcux7+Q0Hk;iJ&Nj#|;+r*2e^;KAn%0vLLYo|tN$Z5fBx^*xaJ#r= zlDhSFcCfW@2IK7PrLBWhxXAE?R;cQR4JF z@K>P&z2plu&aTv7 zjcs++e)Ya%pRE0jvA`z_DlRJ$L95q)wxczSNbz9;Rn24B-h3)w>}l`6o-A-N$Qmez zqc_nT@VoHqi##k6EdJTomONKM_gb?gx?2St?o76Lciw$}cv`o6fM)od zsGZ0)=)Tg?Rx^!K+*xMni2AkZyzHl}p1`V{P5DsJ34LYo$iTJsI)JV{VtA(QqN7Re zY}J$rbhaMy>}IMUBSNh_wuXhJ`_=WAtccjNgqkf28Kz;c8p>W_run(hFbr06aHEr_ zinP+_y>di16Cdupli3gMr>?eB_&vrSm1O0I%2XX>xMeB36A4V8&G0v|bMMfXzTxkb zHghMq?Kaw~9`qGl0~jbcZnW4p)o1q*9B%DyO3PjUj+1MPuC1847TZ#y3Gs|Q!Ux%n zL$JOMxQLe7Og>_4naU>clb^>~Nz1uX4aHRQKuOyJOXX2Trh~ zJwNW#5mF*4&;3@F&k|y)pC#VZ=rM5c_Elb+RtLDrsKS^+>g4#CdMT>l`lf@MPe@v& z{N}(>NBgBEYo`(2MzeQcDEd6f!yyfMyZ(O@A5OiA5fzq8pHmA70gh}q9WwA&PDCHI z|8B5?x^{@REv{r!wr%~6JIN5@%ZjLmU&lyL1tv^VL3Cr~9uqR>D!)}(&yeIwW6Gy! znk$K`Ofv#Y&5N)z9cn}9^^hlx0WGO}u*ew^ZNTR}_HSNaE~`5A39K$7ja3H+O19LN zcsbCS=KplTMdBV?n`Gi~^%OjhN?1?1Hk*A|!^&!Ix>oYU{t+w{2#5c-ltlPiYc{FX z?s?cua2asntz;&5b@`9`K1%}DU?f`TqJ-t{%A>4LknVn`K|(jn;eM&&+kJ_W`oH^x zcBYPfn%RL_tC9`tJw`$vCal?l^}cq%iU`g~T+0tEsuz0Wb(?ko+Lv!$R`Tw}O5CL$ZB?b(A!zNQXUDU!T_lRV5Rwcc4rUT66iB8wP%NIDx+?Hna` zGhv1j^MT`v6v%^LY!xyOeox2#S~s?JGxbZ&j8FCs9mrovwF*Tx)O}H}J097d_XR(d zW-Bg52enHMvKm}(z?Lk73MaB(RKaX-lwRlsPTy-{Q5@^&w3?)unPETjl<(_^EZ@T< zMfanrTQ(&O3dPr|NkYp50XG*36m3zokmRuPQ$)a!jQj;py?ZDF>`RH+Xf<)N_}(K_ zQ0TAqM|=L8ZvOHLii6j`()MN+7NF>P0#LPdr47%y)p=%**M5EVOmw&ErbHj8{@~H2`zsdd1_i841WHCpCLQZX*pYxGI(g)CYcMwhW~+uB7~-$J){$@^`s`&$ zq#}*=FX4S`!G@Xk4BFvqyH?qz_je^7tS<&EYyTiF@iP@I`zj?|Z9VaAdJtvfvvY-V zi(euPqEzQXgLlkyota>bF!DyC^EZQ7%xAavQOo;z5I8o1hzD-;^g)R-h|s0gHHx&DFZnW6@s7kWB=Qf z;LX=1j$h)WF|b`0F{GUH{WpKWVA}A}pF4T!TaO;LiF4!qlvt5OJ(GUnfV*FTWPp}I z;mScuTE>LGS_c)?!7s@2>TX4n4qLB&)qbbe=f zN{Uh|gAv^r=5_2c6KL+^KDVdftK98ZGgYZW^V}$3R&dElZ%QngZzVJ1bCJ{h?6=o? zx{e7w>8iEhLyP#%xmv6Tg?K1$aNLr}Ce?Qz{RYca1*TvwAM1$Pl%vc*%~B3sFV)Sc zBfigFPTfXTHkq{w!U%)WBc}t1>U6r|s9L7<7{W_)dVxu8x@U<8D%f;WCx$Yo_xgMu zP|%~sN|MXZN;2KotXH3PUfOi?fga8eW!Pz_ihrCj#_1H6pE5E!&MNqMWPAtehrwzr==Ti@8r(CV$C5K3iQV^tS*?|P$b5D!hP{+o zk}%vmV{S1EYng$&R~C%!aCAn3H+pP4bdl(&&Bf#FW}!uDc~fb}jNR+=K}Co_J63d* z*e8^owf{0_tYq7^P5p|8*8mM14VHW@z4 zP8^GUCONaJi8~KaV87c!KX|xL43a-}Jh#2SEfU>(5t^Ngnlbt~{*CvBat|b()Wq&6 zV~3S5jbNkb{QinmCS?^U!hZeVCLt(Cf{e?8#3nv6j5n-&OPooGz*SCLf<>&Iq!%1J zV|6Afpi5gV5n}`#XnIXwt;wYRxIU~)mZyZ6TFsRFp@c!+oRj{7;|>Eex3P1XbEDG@ zRIuWN%rxrEa#cAdsD0UT(lSGtWx!Ufn$fp;|9EKz=%jsJ2&}J(Fv0Sny(DY_WUSexSHXp7LMGBqMO751Hn>G(mto&(im( zD^dBAt<)d-NBC6bRgZa1>gFNucSkU%g-|~8jnf(`#DoEKVuFnxv;@1 z4-x%hH%!W%tz_D)(f`=*6;~heE>v)K+!&3Dh~RXGC=}i+c&?G>ZRM$==BO6@yC3vD zwSL(*alj8lT)gx-fWExK^8drhVljzaQdzo9TV5j2*7e%jUlFoa6h}`fS?kvrR0(cO z#IU?){a0`Kq3L5mUsAxI&qtgvB=nH_hkL?fGJOXB?lNuioTzzpIAsS_CeLW~^~%Zi z?}SIVWPs0`<-I=kY?1fQnDIczLxwLCQ;mOp`{436;eC2PI)$p~sQiuI>BdL{vnX7@ z8<0dN%PxcW+n(1;vBKNMdT9M@QnDr*$@e?NeErwIx#YK){gz^Pj!nH31If-v=jJ0K z1{lNdVL`&x0**@(Njs=D?eAgc59qXI?w5lf2OnnpKgzI*apemb3VTDR31;nrCd6M4 zoE2q`up26urnovg+%OFi=HpZa1giy68wzqgzA6o7@!%)9(*lSs@V%z9>TRZD44I_@UkD7|``Mm-1uRuEY>71fkeLbmj%`r@vPju>uvJ@6Li3e7F;C>I z`bIwG(p9deV4kysp z&*1AubY0$mTQn-x^7~t4X(8X9Qw+{rhrI*jgxk# ze!`pxVfKpP@qf{MnfKbh|*i z)b1t8L(s8E5drFHvs=F(XS`vK&>A(<8CiWetp9Jhq?~Zv&-o`szc{u-CKmiz@AUInHMc&u={q@{Pr4jZ6{+?+OgAId-IO#3vA|*z z)St?v`IP+eI;qd2Q)&+O(LJmed``Q^D(>p*>C3SP>qjR&z-pcm#R7Fj8|w@@UcAS4}1m_%9BK29}h>(wA9JCbB8GW z%ASSKm}5fDWRwnIRBt#;b(dqFU|W_is$J@eY(TJs+BT7d9+FeSLAN+Ts(!G zPKzlL<;ai?5R^_H+;z^7b(SwE*yGTVofuUYXMDo0Uq6>=xF9_N&1-0Fi%$g@3FEXJC13*ET!MpqI3}I9EqE>{U`4HSh^q{hWzk^ znrT2nd~0@A7=_}UKk}NI?)^K~X4rp8q}Zn%a;~5yJq~;FW9R;j*OLxH)qc}$*^=RE z7md=i=|b~ffgVtESn;ce6EieVH7ha9O-9zGfRr3v2cnT8qDk&y=>ew5L%XNor0qd^ zZYauL!F0xT+luhTOq@Bv)RKU;?$lG*bCG&g#av_gWO4dZV12$@@9Q*9wg)G|K5{@u zVt&Yr61X{P@4ue!EZ7S@kfryg3Rll^caoJ^nN4EIp0=HyO|U>c@M92@-E>yU=tZeY ze2l*S833TnN{uDsWDq64ThL}l-Dm*;wLERAd@E<5=^d0E4NM$4cw`y ze^En#eF{8Jul|ean!6PJdeu3s*Z~HbLHKUE#i0ebB#4)<6eX5n0#fY7guraMNSG3(ks$ zgyLeV2#5igeW)S1B&(9o#d7tC;f+B=z>i&|ut8fX3Q^N+14MeP1wwFVP(uK2KH_u< z5`lwa2swCFRR`q!UdLGsQ=-)5qi;mTWEc_8D4)9x^XG}{`RuZyT8APNQ0b3 z%d%1M}wJ$w|S1vPHR5Ly37VBS8fhjn{H4Yys+Wrb!7|!| z|ImS#05VcUxMfJQnQ?llPhU$)vcu5rh4`GWly<^wUi16(g6qjpm!oTVlFtrVw~)#Y z^-YS7N3sx}MWZPh$aR&bEF`Z=W%~N71_um%W}kul346PP`E8L<43}TvgrQfnGAYzb zqZJ-?+(Uibq1kcBSj&V&D^LUr_(&rfM@ci>GHE$Rhwrfqt$HxQ>;;f9TeY9kMi5W>s7k+DU2H-wG(E&oEE0!)AZR}iQ+X!A2VJpkaYLAk#eJS3Om{Xix*EGrM-@jy*}O(>6f^lDgXi};7*LYy5u<*8DPjO&E7~n!x}!1v@cMrbnGZy zAsMgT3%qvs4U`Wv6F7tivFlX9oZ|zT(wynao1ePH5dk|dcE&ekl<++Wo}};uB{}Ml zd96~f6~XL7fUp}q869C4R<75uj#aqVK^x4CAi~S~R+y2%am@}->?RAA0Y#pugtD2j z!&59{x+xHJJJ5`yOcxGA6``#MQ_%`fgIN%1_->NGDZG8lcI^|MvE&<`A&tLFBN5)w zOXCw-o6{3o^9vD`#x@ne(z|o;sRWi_i6Y-iu#B;s6=8`{VCoW+W$B2j9wDhJsn$B(JIJI( zT#PCzD4tG&p$D1LXBVSIL1D$Vw?Sb$9tujJ$lm00?|a&DcxECzGaU<1Vi7c=RXPdf zls>zWQTgdB>m!|)K5~n{Q{){rU@g>&Sg|1+;~dV+{_cPEr{Xyn zTK;|8%9i8Qzl^v~`1^=_o@l8@I94R-JToNHTw!sFQ7&T@TdT{&Aau;V{Fs&6m-k}6XKU7Ovu8sYj~G6-l1q21hNtKP8bc2=-@ESMN~xS z9!VQ#xqLc$jJ*;|z7@_MpLj9>y^>76EaJ)mJwN=+Yvtvfgis%gIIs^j$hk1*Ze0pH z2wCJf^-20{`uaVv3=<$q+vz+slCaL!H%4<=%Kmrad41lx&|gl&mShl^ase%SViToc z^2hhnYvEQ>*QP(7G{*4nS(_{NiZ0rhexCx6Xu>sNF|{U#s&8<=u^I895W~FNIFt3~ z5>_t&W-SBV$;VqyCN9y2Ki+!vSqHR8!|3gM?$)1w?rH$uEM>Ykg*cD3b0*3=p`4Nr zT(lMRYhh2%cyzeUA zA?l7zrA3EkSe*D0xaV@7)kAQ{EyCQk#?|dRbS$QW00e9Tx#w+P@zd7^ zO0w7$Ok!Q-G*4 zt8*Kn$~lkD$**lgij1{E#HGqPbtO_EnU%*49{egiWtsff!DlCgc~d|N#W#>i%M6CC zp5lz4djGkJ6N(rvTz2Uqm3IIW{Bv9Q@@L51Gj#nAQ zurt==Kgp4e^e=q6(pg2j`*rjvvoE2W3MI8OHG0kArGb^f+YGQzD2p@3qaJ`b!CO+m zzbnpH*u7GTNL(X8DS1-t2z!UJL55DEiUCjS zp9Rym5hFf$rgNr%wyu=1588-*Sn-slcEyaonUg3C7yhB58#|hgyyXN;9;IWLt(C5{ zdg~80WNlo;M;A4YjHj==4jhkaQ+Z)%s6dlH(m5N6B(}Lu*}GEjxLD^|kqea{U*a@l zaq4F3UJuQqz+_wg-$kh|>hB1p7wo|(;+u)X6E zQkKOj1~$7}^*-GF`9H*k=@(pcF-rG|!0sF^V(zi0^4dffgPW25sJ#kIFa06UTHEX= zp9sc!qt^5<%)5phW-JcHHcL;(u4KO%PtPm`H~C*`XCs@XY_9kEygzCD58;uA^ZO`{ zo8gfb_f7Ak-s#Duza}DBwNXJlxFN7{f%V;ts>wo($F859g+CLE4@qBdYP{8i{gygs8@2M1e3+GU0AI9tzUjC?zXoLk3QsuhE)B z`Y3^R(D)^d0({RvfoX%OW++gcql}qenwu%>6T3~}(sjJBrIRp_zVOZoFAV9>>vi9& z2ESEh7>>8M>AU5u6l&5nE~j2)8N{a-M1 z8xJDH({Km3b)}9KYD;&A7;}!(df%P(V)=Hac!9}lq$tL9YaTlA)~d#XRc;J3nos7&pUX>DPYi*1SMES%}ua_1(^w^{FFH2yrap4gPCi90WV@_9Y)B ztj8C_o43(ThsM46zS)qJZmQk(6poXw`Hy!-rJsu7Yuo5<3u8}wl{2UA-Bw^^J%w4J zK(*;>tMhP+Ox}?Z{mi#JvI2J5DZUuOn%0pR!X1rK{>;$-A@NJR8DF_u zc{Y#AvYKJ|ilT;opAQ>N?0auXH8?eoit?`U>lwRw^1V03^m8YE9Jd`b2e>z8*&u7#Ajpp5jUpNPvo-$$k7YA;`kUIt^1<6F0(e^j<>F3X1$rqgmHvB@Z zeZ3Vu%{rV3s&~Y%0gPUlv!mF%;P#KdvAR_kvz2mNNq-c|Bd(Sn+i^Znx(AzPE2Sy} z?9z;R(aq%UC8exYUOB9@7y*W-#7;BLF>I&V(_JaB@tukL2;Zbzbg-vU_;N`0n-}SI ztW~HL^>2vDZ&!TCibhFJw$lm;bglYU2Wel)V^hPlhCv$+Kl4=sMV zze|4H7PZciGqWf!_zLCTGsTM%en-*r5=q(0@*(HK?uZ$CE9#kpiMkVVO_K0z_HTJS zX6=r53wp>}(Bz!}#+^}K$ye#=09y@m`BLAR-;e_H2J@1N(Zug?=hs@T2Kj=iTJDMy zHcDM?#mxQ8VzNhGzZBjf`rI-8GD`_{6l+{KyCby-oZUM2&uX#}3SgMaY>=%M@TZP~ z?lG(RlfWdDe000jd;%DJMit|`36+H@X4RR=bK#5qQw_mdt;gD03WWnw&_@I9CO-i0 zAOSB=el6ye+&fs2yFU}-oo^$$cIS?HjF+17+yt$2ZgaFW%2%}9NjG5sPDmIhhI(_uPuoVm9 zA96tx9=}41z(;%DZ&J~*ytQfV?bDl2uNy#L+8q)3DR_^!^CzxFZ@=RT$2TP=*}Gao zsa82uATP+%2sJ-9?<&+w&n9?SA1HpV)N(ojw)$KoMZPA059NeysW_Z!(&*}AEFRuN zRpnvnm|J06F$d|Ot`JL_O?fkBAqg-m4JbrA{|`_NTtqZgxl}7R^qDzOQ39w85$x+N z$=uji$hEr5i81&%R)4J@^K$;``$RAEO&bAxrB5+4IOb|XKY2yHYbYS%I#gG#uT%*U z-#EwqNvDm%9nkKFZD|W&J%snQScv24-klc%ElbT0iwjR!k{!Uw5_uc7@)L}ax|th!e6%t(98tm=QD?TYx{7)y zZFnHE7k3bNOT+4`^}5t+f!X@V!{>Uen<}2j#C?0TdeiD7eB^w=BIT})rL>Fz7Y|LC zS?Z{_UY`BB-PvrOknl|j6TOJV9>GPXTg($M`Wx5HJF{OZ0L<8_vYi%}+|#=Dy~&oJ znRDaTvaR34-Fv?O^yl=Nf0Mv1Uk|uGkGhPp35BO!RF{wBF!i9#kgc*Kd4PB2--~=t zrviTv)q|9vuX)X%{Y1C17TwMmq#fUmQ$ViY&Q`c!8oS_3=rQpg+ScpT@Zzv}vAyf7u#E6Bm$hQpuTmwmhpmP<;ir|vZq;jsP1Qh9P zGsGfKkS0(xkBRp3eVvED?!u zVrKYw3=8cJEWIz%{S6<>%t33PJI@ZD%!E<59qw+RpYlPbnwW&>+mBDR^0=dj3nI|l zn`?b=iyqtXw!C$&yRW|rDad=n_fL=4#?jM3yFJh=eJ$=mE9A@h-m0$}iWcP0Hh&bM zRy^Lod~#>n50Y0Oo;R{`?!Ad))jO~}PcKSAvUaz@v#bD0`CYaC+YJ;|LEELICZ~S` zg8nY7-uyZUChIE=vnxOI*ibCIHyxEmP&56v?N6-LhH;*p=g_45#3t*r>y^plyl3J}+6MWnqAX z_s{DD);vr)l7DX@ycS*fr#Xk>5_h!#d1>v5x^e`=A=<3FLdy}!0dMb$j?%o2>Ll)N zjOVjRrEPvXMrh73Yx$#x$;O%$NlER>A6- zcdzEnyP*cxMIK0Z#7BrC+>`~=9=y`!K<-x>xRdl-AMSaEb+}c&Y-$zyN4RNY`Ge8( zuBQl#JpAcO`lcFp?pJd;t8bw-aYg)s6uu7#_%pno#$N@N7k~Z%CA${C&}p!A>hf8m z*SyoZaOm-rxSUTLp<@zvspKTcW4wvM{l6Xtzz$B3U3 zy57+5Xu|EyPyKXlRY~vLEOfojbpGz0!$bE@ulxF^lSh(@A9EfJZ`t_G%#1FZuipB} zOE3L=)l;#~b#G1mYX8$i7e9GhY}cP(T&L-IOWuJK@dtJt@2|aj!HL?37k~cK@-_QT zm)?>5_t$nC!@-!;9d@nD9p-CL6} zZg2IA^Bc1|ZQArC*`>c@!oxeK{W#|E>=~^`m%iPv@44_*lcp_ct~|6d@uYHN`LnsC zV0;U^r>A@TBh`1II~^u<=UrnS{H-dl=iu5|zmI+TtASU?3{C8GRY>u;@#iC7{k>p$ zO2TvXWi1n&Z+$;`Wl^f@v9A4kAFX-0H2Q^}$(4^*jr}ry^ixl7J#j)f|KSe@-HLn< zU4syw-I)Ac^|5z{RZob$WyU+sri|<_J9wX+)&70Ro|2QZJ-6PdI<(b!|HM}hcmE(n z{heI=x+QGU$2;<0A@|?(Y{> ze#^Iek3776#B1?!iRV7a3R}}yFNA%z^6RH(?=kL9t!zH>;PEd<)f+8s>)+V0zsHh~ zcRd;zEbqJU957A0uv?`ojkm<;zQN+*!8zj*|Vu9jcrEK5^5|`W|n2lSU@) ztseE<>#v^Qwrpg-#ORUl_0Vo#ciukc@S@l5f4XP6I6Q5ZW+R3*M`Q-g$iXrDe zo&5fz19}XqK6v9Ry>*@SyU;NR3gZ&fVw;${aJ5=`Q8(GA3>cwM8e~_JpA}3 zc4Jue&>MG+pMT5pQ?aH0m@xCXgR6!;_e+`U-E+I2KHYaoY|G+p8`u2M@z=8jA8*@r zyY~J4wfEa^yJ6FZ*-@>X)pz&GS#Q1T0 zYjQn>?r}X{J{nc1{~-IG(3Szu@Wm!}&^IN8z&t24oCu*^h!EDD2p!Z!(cyZc=s1ul zlu;x^c{2$K*OHJ3JqeANO+q`}NkThYNm%Dx64qrk3A?J0gmv9aI&`fe9aK9>hi)H` zj@^8uWB2b##~xvVvWHqwUL7SUuSpQXuUROB_p%G&>H;A`?GYk+?+_yTd?-X*`;E}) z+Hgguz5^AVuA}1!y*6!yGnZ-*A)W^WqKofJ+)ow3dGx0+vTwsUx~4MXM*0LOinHh= zpaAC}PEDFff)8)QW8$(@(dx}2rnt6<7!y$|;-R<~MLgK{vWVG_zbazKK|4jf=THMh z_v|O%68X>>dszAlZ;SX))w`nn_St(yzW0ZHBLC&F{g}`DBC2XfLIxga4-A{<|Q))%@%pT|y z!?g|(eU6kr?dJyyQ(sT)Vi_6y)BgP9GgD5C%+$8`{r<<6!CBgc*PhTf zKA_UZ#4X!C|Hnja(WsYyAMQ!hE(^~rsQAK&`DAKm&ntcSu?3mh-*?n5Z5(UVn%);W ze)zFj8{hB13$LHf)|#$KDq3sL){Yte?wLu}dDi9QzW@vBA`>N0L z52b2je{%G??xEYY>t4EHr)p-J_KB~q`S9e%Y;F9Wt-XiLPtztU^*>dAHdni1Z{woR zA4x_##Ax3fqe?Y`~g zm&5e4wd3<|{&wuIHf>f;#t1ro(4B;IPvkr@S6V}!{MrKXvXSlqSP6rpyG za!>jv9V+%7F8PtSTDWAmbo{II`6nHgK9{c7f9Zg$1|^)Aqh01adbdD%J>Q_|2clDk5jPQ9T1Y1-88~SX&H|(RA$2Nn zU*R)Fd`o-_-LIolMS}d~s*ePkhlM1o7Eyk0)9L{b5Ho`9$y7(e32!j-e~NkVDG1;Z zP$u2WxC+v+@}bNYasQX{$x2cG`}?=>yw^j^c;T}L@}?LM>FByVtzt*CjiNSXh=YkP7U~hQuk+rA_bMA7Xbg?- z*b+qOJ%$lJ9Z+O+`68He?sMq*San;^#hEuy>;}EgRvp|8Hyr4To|%U|U21g}Rfz@VN;-Lqy-83tlL4U zE6U68LYnQX{blR}`_g^gCyV>HbRnMJCs&<171FXQgqAr1{5c$L%+oj1O~a26vIy%4 zeM8w3+h-Hlx=@VI+Tm5uXPd~GHjxk~iP+UA?>*S@0EX~Is<=anI z2X`6x2Yi|_ZWxS1)JUCa|AquZK@YWPhrOa6v5;2}>=QTBcDpyY-J0s5>>Y&sj`@v{ z+YDr}uljv*9L-}*a2_s@4|omQ_ih2lNc%-?SNJAOq z5N}3={-zoe;JeXKuOZk6ua@bo-$S1-;BV(1GP&k$`g?u9ysu1d2idj&`3*9;XAgaT zfL}fmbcsM4uZ4CO$IScv?LI;D)5f=`-nY_mpiyxzA5WTL9IyoV@uQI5E!xHJ$0i74 zbKk5P_KGfpB)Q%cND`|+WDZ<0M?I0 zf9B`Gv%eFP_=n%0vf#Vsyr0AQNY&*M>H7W#W6f{=coz8X4&XT?MsxCD#9p-O8eXR& zsMEDDCiFs|lYA+hzPujhOIPsyiJb*vfR6{`Y=E{KDEdh7SU~lAtrzxzpujhqf!O*myFP44Sn9t<@EiH=(?#0+bd32mcED2FYpnVtDg!Jk~MUn?&Z=C zg?i9^eRQ0mVXYAM7D?9BT_Mc`=m(<$`V;rF(YFhv2|mhuSpCkz_s~21+(BZLf#saM zLOUdZ4)osJ$z$OG9_F71_olWD=ri_Qfoz9QmfmPHWtko1MPZ8BMqgKG z4iHXSX12NLbHZljnjQJcW=DFCBim?8gE+Z17o_S#%Sgy|I3OODJk><54+xzrzC95F z$r&0tC*SEZXV0~QE>5Zy{YFwl{BNL`lW29i^pJ$u!a&n`HjAjBX;NOA*-l>@0jX%o zO=4~?qr;VJpK43bSpZkBx)7eOEd_1B_z>oTqb|H z1|f?>uJq=O?!rXzrJ(X;3qxlctxmIK5IC<2)ZRJS&@`q*s|}j@uqBe5`|<+%3p*A<)muPj()6PD5}-O~~Ei_sLd=Q>?R?!&)&c$(-k67P&uU zsuRk!n#3`|m|-T{sU_kPk_ma5T5IN{8T9*Z(LTwv!;sdH8M#?5Yka=TJU3^7)nrbv z7#-w%82>sqN0O6Ram=wTvpRBY^nJBVQQ9)w#P+_Fs3+}D0fPBPhn2opcLAABB>}#8 zi1{W>M_Y6OeRH4xl`*u92ua{=9_NCHsktt*Q?!Ia;cxMoxh{LIi`G-c$~MhRXMS-b z<@9TEj+J&%`udt;=(o8}3k{9WO;0yFzz=8eQs#ggK%^O>hfo4ziTHiCnKgbl)_?qt z^`GNUkC7!OqMjK_$a{Bc4yJ!}K|JV;i{j39pBxI= z5rPL#PwmLx2l-z)F5tnrn?yuJ$mA3oylg#;`$3>T{8xOVy~mZ;rT*P=`JwB5>G--T zW{-w#xK3F7C+mfmISRXD{yiBc{7L-(`JuY(!Q`6D9{+OH{;wRDe{lnoU;f1c|6aZS z)yMzuejz*lm%E9e2n{+Fl);(8usVNrKjanoAdg~v;KZuUzTYY8?s1Fgh4{NlkCbXI zlmDvo40VVv{l)lkh%ZC@4@z1}`jF2{T1)P@Y<%54#p1VFVemO}*AWd_d}PUykr&7R zu=%*}99)^+!%{ZmxZOPXpM!tL;~3_9Z18^%qw#Yd&#UM0{F_@uf)D6*i9ZNL1DFDs z3}~V2^nm*T3jmt|8vtW|1bKIm17-ob0PTP)0rvoI1f(}K8v)&bO%!`VdO#nb50L(_ zzZI|nFt1%8D|^9Q0MMW&qySLa8_rdLK0x<*$gdBC1JXSqBSrk4XQP2#d&qy)~mSObSL`I=*7|X9|7=3n5szMn} z*Rp)X9ZjE2Uk; zCT2xUEFtBBSc-RfhLFe!G`^1%0`?PH6^&Z@+n^S~ej6cKKY<-@qtB2z zC8*-*v$WC`_39f9!LL1=C zpnuGrw7gWI^-lT>qEmwRF8XXDAMq^)lSBDRBltPh%Sg*LD~eJH84UGnNTc;LgvOen z{XwqEpmu`x1uO!tu@DljFe|)Es9&TCF`3|Ziqi^rHvO#~ln?lf(4r{Fq3xV1DB=3J z4${RerO%2wCD0#g&4ch1#5#xgZajhhTxuQgA}4)DN2(C%qWOVdE?Q2D&<+^-vp{0$ znmy!aSO)zPFm^f22?4#!>9ZL=6B_gAGp~F^nNOb`<0Be4eGGtf4J)WC8HBbKG=HN| z_%~WE_&uPW=DQO5GoX7Vee^-PLU#}NvtSJ=`n%|Fg33+vH7G1@x@O{|@0}O@tj>-4 zuVQ|$S;g$)7SSm9Rxv+Su4aCe3|Ii=6aelAYyzwY)ZI_WSwKqxA=>~|4}%|o-xjTb zYm8r@zK?*OfcnS4-vJxe(PuM#CKNpmb8MOq;0VDIMjvqWQ0SQs1u(vSC!7h%+W>kg z&V&?gB;+L2C+|5z7D4*D&EOxQXF?5SFwOvPEu+tx^9e<8e)<~Psh|Sd4Z=MY^cfOR zuPvY_a5vzpkkcXbL1WKDyoM^eu~r~$+vpmcQAn<)drY8zBYLZ8yi`R>4UB^jFSeFG zN)wkO!>Wfs5i73#mI1bsct@03sncnr!dpbxf#@ih5W7%u^JuhH@i3eRh_Uw}Wp zPUAy=eVzUW*eJxjLC7B@qeIM2<_CFiLO+Id4R6wR1ix;e&w_w{)j<8hAT$H!3a1n) zZ-E~{yvRL-YzK4$_BtRVmJj$N&F5|UY&4&u;2oOYDAd10?QT$b-(~exH$s1- z=YhR2H=ywWKd0sGV}9GdkBz@E|6u;-Mr;CH8e$FAeL%;9&lTz>IHyDT$p;D9A*6>W zKLURcGD0FhCS){(w*k%tZ2biMM`2Q^53}*wbC|V5`(bL=RH5w%w(n7x*FgM~V{qOB zZ2uI_Pk=EnRIdkYI0^bv{yCiQXuK~7*#l@e4gUKp)aMKxw~UIqGqn9+{QDC0fN=d; z=%;}7UlZ~>#CLzg+PUo;y6?tERNoTP0^z>z!CzpUR{jX%FT~gU0_6j$+Ua=RBGk3B z@mGJ2wv$09JV(c!bcNwpc7ACDY=roAzfpUpD;i<;RY>zWPwj73s4mcP$VVCgqXZ}) zuD0oTdHD-Y208(R~9hW0O& zKt2NA+5>D3Xunz@Cl%IC$!cg*;OgE22^Z2rHGROgzeCvdkRC8n19J_)lzwoo2W;*y zkWebWQ6R$rHG>3F4dY)^q(HU-ZyikaOjFbk5ybO$>`;O10K2sTJ_-633vbEdWU|Y(7Ob2zGKK0$Xp1g`yCr#{zdmK5<1@m zTm(q>DLwKN+YdpJ?rEbKi%9ow4f}=d4Y=3$4a zek*diZcdS|X}bc}tpC>?Zs-S~eqKpIiKoO{Qdd%6(ooV|;)AQD=2Bm2YiV04DN~hc z%3{iNWyxiRGJBc3tgy^eR#(P&zYbzt=s&Y+vOu4Q+x!h20FL#$0mV3(U${Wg? z%6;W+<)lJYp{aC;T+mgJ+u*JT` zy`^xAXG`6dhAmB7d|TSK5UM~NR`=Gzt)8uQTN}1EZS`$!+e#``m72SZ>8>oS^i!Iq*eUeK)`v}@dA*lL0D@}R^5 zD60&*0k3sYt^-pwXwDO+LT&L zZC-6bZBebaw!XHpwz;;ow!N0rK_8@>f<0=mPApg^1+0<>7Af+0J@uYOPqU}h)9z7% zT_V9Ida#EDY*7Gq@PZ8*q5iEWpN~l>R)JhLE zvOsMLpeA0ZMPq3*_<4J&vP@kTSr%KSFH0%2l;xEblogeE%j(M-%bLqt%i7D7Z$p0~hTx zZ>zW6tK6#I8o4!gtA1+=_+1|OToL$NJ@{HP_*wf_Wu>|@vNE<(Uzt*Asm!Y^s4S}V zR@PTGRyJ3*R<>6vtJGDIRk2n2s+1~ARbEv=RZ*3Y0RjMjYRZNwxD!Ix~Wv_Bq6;^qw>Z%&5nyP$NZB=BOYMW+T%r@P&b5m(Yue`92J`J|Rkfx%rdn5>Ty3bfSG%hVt3B0q)eY56)xPSsYEq-B(bUA$ z=xUN{3^n!|cTHi9r>3r^p{A+ESJPHQYE`wG+L&5hZE~%l)?VwbEv)s_*3~xDHr4uS z+vtNsn*{cJYLCjJf!?Zvo@#(z>V_Wb@zi-5JWU>-rw#h53i@db^wDJKpLXb*h0rhS zpieeIe{6%ksDgeN1AUP8Ks)rlLg;yQ(CeC@$F)IkQ$bIQfnJsjJvU z6O6q7>~R|bAh9s ze60JooV)&W{Ev_S15ir?1QY-O00;o5ZG2V``TQx*i~s-t0096J0001UWps6LbZ>8L zb1!FgX)a}WW$e9wd{o7`ID9sHvN=gMISXtcK!5;2(V(JBH0vg?G1(B6;Kr3*A|%0z zG;V22!#RLg0>QIub24nDt={Twy_Ji8FTJ<-*0%D)R&bZlgb2zne}GUMYt)I08cR$T zvgEwaGiNsm*!$kTe|`UX;gfUD%seym%*^vV^E@-p%vL|RgEMj*$HSkdaom1R|L5fX z_kR@rvS<7un|mew&6)cROWvIMK;xt9^Vc@*=zsuDX!~ z*xNyV$KE%QlkB~S?1cCIk3QUp`Tr+e-7bz>VlZ-s-;$bSTsLPlWE#>r?hObm)#D~y z2M-HN)O!KHQ#dX)ktg})oCdwq^yC%>h_EB?kr(^7;1b8p{RjH=fBV!|!s z|8ABZ*(AaH^R5I!*jD~(n0$^~b#v3|hopx%t}$OPlbZ#9Z(R)s^*V3X!MMYPSe`*I zv+o;l;eWhE|Np=LoBwJ^MS&1<8`=bCpi92wS>`P~Y?|$y zT2Wx>;AVx^8G@g0@kLFcpJRTqq#(DA&n#If8y83OOJ>Pag4z~~&%e@3x3RotTgI1h zw!>F3mQl|WT2f%G z@zQ$82;qFlJlb=GhgvrCnJYsTe5RaH)l$4t%0YafLbKygQ+fx-VWj+}pYx5D1*PYK z^u3>6f)4N-8hNOa@*t5&ANvOM=RvyLOJ7MxWambwC80hLfLZa2^!dE>8J27%&`ju% z2GUV)J4RCg&uxdX|Jsiw|0x#)7-JvVT#!dP$71j2-LwtLBx?)ivcb+%>o~PoJecMt zgX+qHJo+!Jzs$j~G+sP-pJ8zgZDlchFf4!3CN6GWQjizulD;h-Jb6F;ZZb(qQ#Kb^ zIB7{66p3U~9z6|YGI^lgAdk0&?MPLS!ii6Zk-|<613(|FoWuzlu-LHJ zO*_pa4QN>eL~y&NX+VP32B1A4`*wJfL+op$|27x!oIHLfmtV#~LFstjtPHsO6 z;dbcX<+iZD!VPUPV|(Dw3V*pU=6UW;h(xBLYtmTLU@YfPaB>ixR{_yljs*&W`d0#R z@JOq<_xm~a-+)iIA3)3i0{G@N?*7op(b+H`DPgCZ4jXkw4J(J2w?h~3z?f#gcE6g1 zm})r!mJFqa_yTv0mc#3%q&2ocDbf9eFTi}zz65bt8F7T}<`VQlfB*^)y^3vgoDHo@ z*>Y3pMK*;4wz-6F4Q(>$@}SM)44eXb>MU~{4M`@$<`1wmzrjmyG9ky(#v@SUGWvKX zyI@JD4o6RweqQt;&EIV5B!2~`^FfwK{H;Ocql$ko`YcAwsarwj7o zb-$M`_%#T}&};lW6cFV^mmdZ!!;-|$>F8WbwRFC)J$m9({Dk1CpQsr^5Q@G z*>pB#C`Yv3Hz5*4v213r(%WjC;Gw^S_SC9!e4yOyls9^4%`^xrF-@AP#D=AbODnK+wquY9&V^mr|AP8If+2kq_yB`x&6K zphe1~N2XtmnLB}5b&qD3d*s<3x*lc|5(~L3Zm%YrJ@jlgP@JpBb8>Kdyp>*VXwVYg#boF(50mLOJF>CWgC2Voij|;E^&D*MUcmQ#km2kdW&oY{W zwcHVDno-Is%-y!itZmh_!U!~!6?AAe%dY3m8N_PGY4mDIxs%7;eDTzIlIP3bf!y#{#zNVr=t zM(|~U*Bi=Tjgj6I$#n5Qq2LT1?lXjg3L4ts$tU;~IoucQ5(7U$^7fFkAUmvs9cXgH z#AuN-p%^h3gkbdgHj~m}NY*J8f=YXf4k>?3&H|kLkn)jHnlK6m5O*k1gZw$F%`55~ z+6OxkT$-3HL<~F&VLevO}(v)5VVA4F5(CHd`jR*cA%S7Ai1RBNxx!-#zOK8(nhs_bh|(i&1>yYiNW&1(5J-HFVi^OdeONvJjnwxes-^VmN{H zqJ0dRQd%ctd74@mhZ2{G2Tg7&K&DzCN@HboVw~j9bHNclp zI(F*@R+m)|sc}GyaRKO6?3xjfO;fDGZT}eriJ9u_#*M4Nx*+*)CKuEO}V<14Pfld+uz!?%P zgJ-6Om2P8FPIR(~v7oNqk%i(|PPy3LyBlRkLV$V6R~?mR6y^`pM{Wa}trSSrS~Z(g zHL6Q_lI_S^H?@qD#*?h=Q$Xfdt&`IzcMHIoNG0z`-7y&wClbgsk}go`dMt;B*a7Fd z6xpg&txJJQ4ABfCK*>%X6Fchb4)Hn~$_1qMP<0<&gY4kyQ}%-f#~HRv2)X*)egWI@ z%LPoEh+0U?5fmELg1C>bQo4nf<~S#%k?NT8(7G#$E>lWr0mw6XJT#DGt%3#sa2WvC zwS(;dr3Im$+S&w5DHrmAr|flRc^a*l1gaPQ(kFgoYGs*9?wZk&ZZ zh_MX%? za+)pN`!7&{PZ{EyUm zu>!Pey)?+5)3^ZjaV=-A9!|xoPSho3ra+J2h_d?U0mL!CKxd(%)(#(w^2R6$ebG!} zf&x;YF3@ddp{Xya0C<@+jEcYu7Lpz80+^Ew#@uuv38R$0QiwC<ccx3sX>`{HSVs3@D*tPekY`K@&y$L@Gt-rzK)$(+maicbwSr_8=t687QjqOjxqVtOC`e-9PdM{TTL9l}F3Z26 z(xfz-!Ki;8JGkiASp58Xkd4ID<}*P}+N2fj#>lBGvQL%ItIa*C+^u}U!?$Cw$wvnZ zL8_Ug&mnM+c02v55YTgt{Vo6i8>uo_77 zndmPY*Fp35uf{%T0IjvQaTA6m4Bv<0q%u1L4T)w8C(l(`6QSK}rvR=v>~Rop&~{9g z1W52;LOad2qIH1-h6@G=*gnh*gu0Pf1IGSWGFD$%pwH`J3_=9`Q6fk*FTHppDqLP# z>i`9Y_S}ijjpOjy#lBx*&tDYdv*-?dPDeucY&JBA8t^a0ea;3>$ zIw1!n@EWuB1t7F0ms76elr;iZ3wZ|0%udOqJO-Hxw7dCDnPgmRie?b^hNEWjV7SIj zdvC%9f?XyX(@pJ~X;gYn0F|T7C1}-Vx(5ZzbPWwnRs>z|yi@+`Fo>%aB;5-JrnfEZ#((s5w!SKU;AH^hqzn@LHEL3;)?LAsf+HCmH&AJI%Jp9A1YW591KROp zRt0cDfb>O%Q`xG(9%k&PkT=+pz>mi+3E+CbrPMJ?0x9GWt_O(0Z$od`x*TW4KplLw zO;AH;5c5zsd%gzG)@QziXW*0=m;v~dD+dsOQ=dN!FL8S&#I+romtV4c<2do)A@N|# za+pGuZqYUXX32mpEFKI*HbIm>EfV8v)!@^R%@GlQ_+RNDkP3pCHh>Oc&q4R@V4cjm zZV&6yJ*+eLuuk5Co!PqqvOzrx&6n;`s8PCIp@KB0s!Ga%kQnsg(tHTvh2DEdzWLro zBj1Kz8?NcG?-sNx3PzGrdUN5soRxC7 zw5;WFqg2syd99S&a(SZ|d{{`fhl8))2N2A$R-Ra%hy+g6N2}L9g1@ErrjhUb-kG?l zZ!Ec8p4RfXVSzlUJejp+BknUGOJOL2B)oD7R#8!(>QILyb;4xh4i+RMS{>EVt2VbFOk_Cuo zIs6G#RbucbFw3m$tZ@CZ z_az7pG669k`d19%>cE(BQn|6oa>i&9VYHxJ(&W@vv5$djbU+J|RFZzw16a2h_$?21 z@vxk^^Jx$cY7ip{dv-GM!))iRJhl~j{e8d*+WJ^wL=0RHWn-KF6%)T%g*0E>w>a)@ z#CC>)*kpGoh+@G_?{zTK1E!`KolMeUCD93Oi{q^fu#>@Iq@Gd7s<#L#B55N$028u< zRPm0tqy>82*mm)CP7NWnWPPsi(8<`CM)VnxVwe>87(RFI7-_GY9zqql_bpt@kF67* z8e#+f5iSzP9uc>{#^S#%{%8TJTCqo^A1JZ!NpqFh_r>4~kT$@oZ_&{fa8c)>#Ax8M 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 97/97] 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.