From 4f5e79805ebcaa0d3ba1677694d4120a9e8f4513 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 17 Mar 2026 05:03:11 -0400 Subject: [PATCH 1/8] Docs: a brief note in the sets tutorial about order (#145984) Docs: a brief note in the sets tut about order --- Doc/tutorial/datastructures.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst index eba2474cd4009d..d3541c604683e4 100644 --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -493,6 +493,9 @@ Curly braces or the :func:`set` function can be used to create sets. Note: to create an empty set you have to use ``set()``, not ``{}``; the latter creates an empty dictionary, a data structure that we discuss in the next section. +Because sets are unordered, iterating over them or printing them can +produce the elements in a different order than you expect. + Here is a brief demonstration:: >>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'} From 99e2c5eccd2b83ac955125522a952a4ff5c7eb43 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 17 Mar 2026 12:16:35 +0200 Subject: [PATCH 2/8] gh-144545: Improve handling of default values in Argument Clinic (GH-146016) * Add the c_init_default attribute which is used to initialize the C variable if the default is not explicitly provided. * Add the c_default_init() method which is used to derive c_default from default if c_default is not explicitly provided. * Explicit c_default and py_default are now almost always have precedence over the generated value. * Add support for bytes literals as default values. * Improve support for str literals as default values (support non-ASCII and non-printable characters and special characters like backslash or quotes). * Fix support for str and bytes literals containing trigraphs, "/*" and "*/". * Improve support for default values in converters "char" and "int(accept={str})". * Converter "int(accept={str})" now requires 1-character string instead of integer as default value. * Add support for non-None default values in converter "Py_buffer": NULL, str and bytes literals. * Improve error handling for invalid default values. * Rename Null to NullType for consistency. --- Lib/test/clinic.test.c | 22 +- Lib/test/test_clinic.py | 231 +++++++++++++++++++ Modules/_datetimemodule.c | 4 +- Modules/_testclinic.c | 7 +- Modules/binascii.c | 12 +- Modules/blake2module.c | 16 +- Modules/clinic/_testclinic.c.h | 18 +- Modules/clinic/binascii.c.h | 4 +- Modules/clinic/blake2module.c.h | 14 +- Modules/clinic/zlibmodule.c.h | 4 +- Modules/posixmodule.c | 30 +-- Modules/zlibmodule.c | 4 +- Objects/unicodeobject.c | 10 +- Tools/c-analyzer/c_parser/parser/__init__.py | 2 +- Tools/c-analyzer/cpython/_parser.py | 1 + Tools/clinic/libclinic/__init__.py | 12 +- Tools/clinic/libclinic/clanguage.py | 2 +- Tools/clinic/libclinic/converter.py | 85 +++++-- Tools/clinic/libclinic/converters.py | 123 ++++++---- Tools/clinic/libclinic/dsl_parser.py | 49 ++-- Tools/clinic/libclinic/formatting.py | 55 ++++- Tools/clinic/libclinic/utils.py | 4 +- 22 files changed, 528 insertions(+), 181 deletions(-) diff --git a/Lib/test/clinic.test.c b/Lib/test/clinic.test.c index 4729708efd3acb..171570588e7a2b 100644 --- a/Lib/test/clinic.test.c +++ b/Lib/test/clinic.test.c @@ -530,19 +530,19 @@ test_char_converter(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; char a = 'A'; - char b = '\x07'; - char c = '\x08'; + char b = '\a'; + char c = '\b'; char d = '\t'; char e = '\n'; - char f = '\x0b'; - char g = '\x0c'; + char f = '\v'; + char g = '\f'; char h = '\r'; char i = '"'; char j = '\''; char k = '?'; char l = '\\'; - char m = '\x00'; - char n = '\xff'; + char m = '\0'; + char n = '\377'; if (!_PyArg_CheckPositional("test_char_converter", nargs, 0, 14)) { goto exit; @@ -936,7 +936,7 @@ static PyObject * test_char_converter_impl(PyObject *module, char a, char b, char c, char d, char e, char f, char g, char h, char i, char j, char k, char l, char m, char n) -/*[clinic end generated code: output=ff11e203248582df input=e42330417a44feac]*/ +/*[clinic end generated code: output=6503d15448e1d4c4 input=e42330417a44feac]*/ /*[clinic input] @@ -1192,14 +1192,14 @@ test_int_converter a: int = 12 b: int(accept={int}) = 34 - c: int(accept={str}) = 45 + c: int(accept={str}) = '-' d: int(type='myenum') = 67 / [clinic start generated code]*/ PyDoc_STRVAR(test_int_converter__doc__, -"test_int_converter($module, a=12, b=34, c=45, d=67, /)\n" +"test_int_converter($module, a=12, b=34, c=\'-\', d=67, /)\n" "--\n" "\n"); @@ -1215,7 +1215,7 @@ test_int_converter(PyObject *module, PyObject *const *args, Py_ssize_t nargs) PyObject *return_value = NULL; int a = 12; int b = 34; - int c = 45; + int c = '-'; myenum d = 67; if (!_PyArg_CheckPositional("test_int_converter", nargs, 0, 4)) { @@ -1266,7 +1266,7 @@ test_int_converter(PyObject *module, PyObject *const *args, Py_ssize_t nargs) static PyObject * test_int_converter_impl(PyObject *module, int a, int b, int c, myenum d) -/*[clinic end generated code: output=fbcfb7554688663d input=d20541fc1ca0553e]*/ +/*[clinic end generated code: output=d5357b563bdb8789 input=5d8f4eb5899b24de]*/ /*[clinic input] diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py index e71f9fc181bb43..93c284e58764f4 100644 --- a/Lib/test/test_clinic.py +++ b/Lib/test/test_clinic.py @@ -1081,6 +1081,187 @@ def test_param_with_continuations(self): p = function.parameters['follow_symlinks'] self.assertEqual(True, p.default) + def test_param_default_none(self): + function = self.parse_function(r""" + module test + test.func + obj: object = None + str: str(accept={str, NoneType}) = None + buf: Py_buffer(accept={str, buffer, NoneType}) = None + """) + p = function.parameters['obj'] + self.assertIs(p.default, None) + self.assertEqual(p.converter.py_default, 'None') + self.assertEqual(p.converter.c_default, 'Py_None') + + p = function.parameters['str'] + self.assertIs(p.default, None) + self.assertEqual(p.converter.py_default, 'None') + self.assertEqual(p.converter.c_default, 'NULL') + + p = function.parameters['buf'] + self.assertIs(p.default, None) + self.assertEqual(p.converter.py_default, 'None') + self.assertEqual(p.converter.c_default, '{NULL, NULL}') + + def test_param_default_null(self): + function = self.parse_function(r""" + module test + test.func + obj: object = NULL + str: str = NULL + buf: Py_buffer = NULL + fsencoded: unicode_fs_encoded = NULL + fsdecoded: unicode_fs_decoded = NULL + """) + p = function.parameters['obj'] + self.assertIs(p.default, NULL) + self.assertEqual(p.converter.py_default, '') + self.assertEqual(p.converter.c_default, 'NULL') + + p = function.parameters['str'] + self.assertIs(p.default, NULL) + self.assertEqual(p.converter.py_default, '') + self.assertEqual(p.converter.c_default, 'NULL') + + p = function.parameters['buf'] + self.assertIs(p.default, NULL) + self.assertEqual(p.converter.py_default, '') + self.assertEqual(p.converter.c_default, '{NULL, NULL}') + + p = function.parameters['fsencoded'] + self.assertIs(p.default, NULL) + self.assertEqual(p.converter.py_default, '') + self.assertEqual(p.converter.c_default, 'NULL') + + p = function.parameters['fsdecoded'] + self.assertIs(p.default, NULL) + self.assertEqual(p.converter.py_default, '') + self.assertEqual(p.converter.c_default, 'NULL') + + def test_param_default_str_literal(self): + function = self.parse_function(r""" + module test + test.func + str: str = ' \t\n\r\v\f\xa0' + buf: Py_buffer(accept={str, buffer}) = ' \t\n\r\v\f\xa0' + """) + p = function.parameters['str'] + self.assertEqual(p.default, ' \t\n\r\v\f\xa0') + self.assertEqual(p.converter.py_default, r"' \t\n\r\x0b\x0c\xa0'") + self.assertEqual(p.converter.c_default, r'" \t\n\r\v\f\u00a0"') + + p = function.parameters['buf'] + self.assertEqual(p.default, ' \t\n\r\v\f\xa0') + self.assertEqual(p.converter.py_default, r"' \t\n\r\x0b\x0c\xa0'") + self.assertEqual(p.converter.c_default, + r'{.buf = " \t\n\r\v\f\302\240", .obj = NULL, .len = 8}') + + def test_param_default_bytes_literal(self): + function = self.parse_function(r""" + module test + test.func + str: str(accept={robuffer}) = b' \t\n\r\v\f\xa0' + buf: Py_buffer = b' \t\n\r\v\f\xa0' + """) + p = function.parameters['str'] + self.assertEqual(p.default, b' \t\n\r\v\f\xa0') + self.assertEqual(p.converter.py_default, r"b' \t\n\r\x0b\x0c\xa0'") + self.assertEqual(p.converter.c_default, r'" \t\n\r\v\f\240"') + + p = function.parameters['buf'] + self.assertEqual(p.default, b' \t\n\r\v\f\xa0') + self.assertEqual(p.converter.py_default, r"b' \t\n\r\x0b\x0c\xa0'") + self.assertEqual(p.converter.c_default, + r'{.buf = " \t\n\r\v\f\240", .obj = NULL, .len = 7}') + + def test_param_default_byte_literal(self): + function = self.parse_function(r""" + module test + test.func + zero: char = b'\0' + one: char = b'\1' + lf: char = b'\n' + nbsp: char = b'\xa0' + """) + p = function.parameters['zero'] + self.assertEqual(p.default, b'\0') + self.assertEqual(p.converter.py_default, r"b'\x00'") + self.assertEqual(p.converter.c_default, r"'\0'") + + p = function.parameters['one'] + self.assertEqual(p.default, b'\1') + self.assertEqual(p.converter.py_default, r"b'\x01'") + self.assertEqual(p.converter.c_default, r"'\001'") + + p = function.parameters['lf'] + self.assertEqual(p.default, b'\n') + self.assertEqual(p.converter.py_default, r"b'\n'") + self.assertEqual(p.converter.c_default, r"'\n'") + + p = function.parameters['nbsp'] + self.assertEqual(p.default, b'\xa0') + self.assertEqual(p.converter.py_default, r"b'\xa0'") + self.assertEqual(p.converter.c_default, r"'\240'") + + def test_param_default_unicode_char(self): + function = self.parse_function(r""" + module test + test.func + zero: int(accept={str}) = '\0' + one: int(accept={str}) = '\1' + lf: int(accept={str}) = '\n' + nbsp: int(accept={str}) = '\xa0' + snake: int(accept={str}) = '\U0001f40d' + """) + p = function.parameters['zero'] + self.assertEqual(p.default, '\0') + self.assertEqual(p.converter.py_default, r"'\x00'") + self.assertEqual(p.converter.c_default, '0') + + p = function.parameters['one'] + self.assertEqual(p.default, '\1') + self.assertEqual(p.converter.py_default, r"'\x01'") + self.assertEqual(p.converter.c_default, '0x01') + + p = function.parameters['lf'] + self.assertEqual(p.default, '\n') + self.assertEqual(p.converter.py_default, r"'\n'") + self.assertEqual(p.converter.c_default, r"'\n'") + + p = function.parameters['nbsp'] + self.assertEqual(p.default, '\xa0') + self.assertEqual(p.converter.py_default, r"'\xa0'") + self.assertEqual(p.converter.c_default, '0xa0') + + p = function.parameters['snake'] + self.assertEqual(p.default, '\U0001f40d') + self.assertEqual(p.converter.py_default, "'\U0001f40d'") + self.assertEqual(p.converter.c_default, '0x1f40d') + + def test_param_default_bool(self): + function = self.parse_function(r""" + module test + test.func + bool: bool = True + intbool: bool(accept={int}) = True + intbool2: bool(accept={int}) = 2 + """) + p = function.parameters['bool'] + self.assertIs(p.default, True) + self.assertEqual(p.converter.py_default, 'True') + self.assertEqual(p.converter.c_default, '1') + + p = function.parameters['intbool'] + self.assertIs(p.default, True) + self.assertEqual(p.converter.py_default, 'True') + self.assertEqual(p.converter.c_default, '1') + + p = function.parameters['intbool2'] + self.assertEqual(p.default, 2) + self.assertEqual(p.converter.py_default, '2') + self.assertEqual(p.converter.c_default, '2') + def test_param_default_expr_named_constant(self): function = self.parse_function(""" module os @@ -4432,6 +4613,56 @@ def test_format_escape(self): out = libclinic.format_escape(line) self.assertEqual(out, expected) + def test_c_bytes_repr(self): + c_bytes_repr = libclinic.c_bytes_repr + self.assertEqual(c_bytes_repr(b''), '""') + self.assertEqual(c_bytes_repr(b'abc'), '"abc"') + self.assertEqual(c_bytes_repr(b'\a\b\f\n\r\t\v'), r'"\a\b\f\n\r\t\v"') + self.assertEqual(c_bytes_repr(b' \0\x7f'), r'" \000\177"') + self.assertEqual(c_bytes_repr(b'"'), r'"\""') + self.assertEqual(c_bytes_repr(b"'"), r'''"'"''') + self.assertEqual(c_bytes_repr(b'\\'), r'"\\"') + self.assertEqual(c_bytes_repr(b'??/'), r'"?\?/"') + self.assertEqual(c_bytes_repr(b'???/'), r'"?\?\?/"') + self.assertEqual(c_bytes_repr(b'/*****/ /*/ */*'), r'"/\*****\/ /\*\/ *\/\*"') + self.assertEqual(c_bytes_repr(b'\xa0'), r'"\240"') + self.assertEqual(c_bytes_repr(b'\xff'), r'"\377"') + + def test_c_str_repr(self): + c_str_repr = libclinic.c_str_repr + self.assertEqual(c_str_repr(''), '""') + self.assertEqual(c_str_repr('abc'), '"abc"') + self.assertEqual(c_str_repr('\a\b\f\n\r\t\v'), r'"\a\b\f\n\r\t\v"') + self.assertEqual(c_str_repr(' \0\x7f'), r'" \000\177"') + self.assertEqual(c_str_repr('"'), r'"\""') + self.assertEqual(c_str_repr("'"), r'''"'"''') + self.assertEqual(c_str_repr('\\'), r'"\\"') + self.assertEqual(c_str_repr('??/'), r'"?\?/"') + self.assertEqual(c_str_repr('???/'), r'"?\?\?/"') + self.assertEqual(c_str_repr('/*****/ /*/ */*'), r'"/\*****\/ /\*\/ *\/\*"') + self.assertEqual(c_str_repr('\xa0'), r'"\u00a0"') + self.assertEqual(c_str_repr('\xff'), r'"\u00ff"') + self.assertEqual(c_str_repr('\u20ac'), r'"\u20ac"') + self.assertEqual(c_str_repr('\U0001f40d'), r'"\U0001f40d"') + + def test_c_unichar_repr(self): + c_unichar_repr = libclinic.c_unichar_repr + self.assertEqual(c_unichar_repr('a'), "'a'") + self.assertEqual(c_unichar_repr('\n'), r"'\n'") + self.assertEqual(c_unichar_repr('\b'), r"'\b'") + self.assertEqual(c_unichar_repr('\0'), '0') + self.assertEqual(c_unichar_repr('\1'), '0x01') + self.assertEqual(c_unichar_repr('\x7f'), '0x7f') + self.assertEqual(c_unichar_repr(' '), "' '") + self.assertEqual(c_unichar_repr('"'), """'"'""") + self.assertEqual(c_unichar_repr("'"), r"'\''") + self.assertEqual(c_unichar_repr('\\'), r"'\\'") + self.assertEqual(c_unichar_repr('?'), "'?'") + self.assertEqual(c_unichar_repr('\xa0'), '0xa0') + self.assertEqual(c_unichar_repr('\xff'), '0xff') + self.assertEqual(c_unichar_repr('\u20ac'), '0x20ac') + self.assertEqual(c_unichar_repr('\U0001f40d'), '0x1f40d') + def test_indent_all_lines(self): # Blank lines are expected to be unchanged. self.assertEqual(libclinic.indent_all_lines("", prefix="bar"), "") diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 6b23a5c637a308..9d803dc94b64c7 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -6395,7 +6395,7 @@ datetime_str(PyObject *op) /*[clinic input] datetime.datetime.isoformat - sep: int(accept={str}, c_default="'T'", py_default="'T'") = ord('T') + sep: int(accept={str}) = 'T' timespec: str(c_default="NULL") = 'auto' Return the time formatted according to ISO. @@ -6417,7 +6417,7 @@ terms of the time to include. Valid options are 'auto', 'hours', static PyObject * datetime_datetime_isoformat_impl(PyDateTime_DateTime *self, int sep, const char *timespec) -/*[clinic end generated code: output=9b6ce1383189b0bf input=2fa2512172ccf5d5]*/ +/*[clinic end generated code: output=9b6ce1383189b0bf input=db935a57fa697c5e]*/ { char buffer[100]; diff --git a/Modules/_testclinic.c b/Modules/_testclinic.c index 890f2201b46bc0..66a375589ba38e 100644 --- a/Modules/_testclinic.c +++ b/Modules/_testclinic.c @@ -334,14 +334,14 @@ int_converter a: int = 12 b: int(accept={int}) = 34 - c: int(accept={str}) = 45 + c: int(accept={str}) = '-' / [clinic start generated code]*/ static PyObject * int_converter_impl(PyObject *module, int a, int b, int c) -/*[clinic end generated code: output=8e56b59be7d0c306 input=a1dbc6344853db7a]*/ +/*[clinic end generated code: output=8e56b59be7d0c306 input=9a306d4dc907e339]*/ { RETURN_PACKED_ARGS(3, PyLong_FromLong, long, a, b, c); } @@ -1365,6 +1365,7 @@ clone_f2_impl(PyObject *module, const char *path) class custom_t_converter(CConverter): type = 'custom_t' converter = 'custom_converter' + c_init_default = "" # overridden in pre_render(() def pre_render(self): self.c_default = f'''{{ @@ -1372,7 +1373,7 @@ class custom_t_converter(CConverter): }}''' [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=b2fb801e99a06bf6]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=78fe84e5ecc0481b]*/ /*[clinic input] diff --git a/Modules/binascii.c b/Modules/binascii.c index c076b12fb149b2..2d1d0445ef958a 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -576,7 +576,7 @@ binascii.a2b_base64 When set to true, bytes that are not part of the base64 standard are not allowed. The same applies to excess data after padding (= / ==). Set to True by default if ignorechars is specified, False otherwise. - ignorechars: Py_buffer(py_default="") = None + ignorechars: Py_buffer = NULL A byte string containing characters to ignore from the input when strict_mode is true. @@ -586,7 +586,7 @@ Decode a line of base64 data. static PyObject * binascii_a2b_base64_impl(PyObject *module, Py_buffer *data, int strict_mode, Py_buffer *ignorechars) -/*[clinic end generated code: output=eab37aea4cfa6daa input=3be4937d72943835]*/ +/*[clinic end generated code: output=eab37aea4cfa6daa input=d2d238abf13822ed]*/ { assert(data->len >= 0); @@ -852,7 +852,7 @@ binascii.a2b_ascii85 Allow 'y' as a short form encoding four spaces. adobe: bool = False Expect data to be wrapped in '<~' and '~>' as in Adobe Ascii85. - ignorechars: Py_buffer(c_default="NULL", py_default="b''") = None + ignorechars: Py_buffer = b'' A byte string containing characters to ignore from the input. Decode Ascii85 data. @@ -861,7 +861,7 @@ Decode Ascii85 data. static PyObject * binascii_a2b_ascii85_impl(PyObject *module, Py_buffer *data, int foldspaces, int adobe, Py_buffer *ignorechars) -/*[clinic end generated code: output=599aa3e41095a651 input=20796c9b23cec213]*/ +/*[clinic end generated code: output=599aa3e41095a651 input=f39abd11eab4bac0]*/ { const unsigned char *ascii_data = data->buf; Py_ssize_t ascii_len = data->len; @@ -893,9 +893,7 @@ binascii_a2b_ascii85_impl(PyObject *module, Py_buffer *data, int foldspaces, } ignorecache_t ignorecache; - if (ignorechars != NULL) { - memset(ignorecache, 0, sizeof(ignorecache)); - } + memset(ignorecache, 0, sizeof(ignorecache)); /* Allocate output buffer. */ size_t bin_len = ascii_len; diff --git a/Modules/blake2module.c b/Modules/blake2module.c index 89b0ebd516f693..bb3b934be69dd7 100644 --- a/Modules/blake2module.c +++ b/Modules/blake2module.c @@ -670,9 +670,9 @@ _blake2.blake2b.__new__ as py_blake2b_new data as data_obj: object(c_default="NULL") = b'' * digest_size: int(c_default="HACL_HASH_BLAKE2B_OUT_BYTES") = _blake2.blake2b.MAX_DIGEST_SIZE - key: Py_buffer(c_default="NULL", py_default="b''") = None - salt: Py_buffer(c_default="NULL", py_default="b''") = None - person: Py_buffer(c_default="NULL", py_default="b''") = None + key: Py_buffer = b'' + salt: Py_buffer = b'' + person: Py_buffer = b'' fanout: int = 1 depth: int = 1 leaf_size: unsigned_long = 0 @@ -693,7 +693,7 @@ py_blake2b_new_impl(PyTypeObject *type, PyObject *data_obj, int digest_size, unsigned long long node_offset, int node_depth, int inner_size, int last_node, int usedforsecurity, PyObject *string) -/*[clinic end generated code: output=de64bd850606b6a0 input=78cf60a2922d2f90]*/ +/*[clinic end generated code: output=de64bd850606b6a0 input=32832fb37d13c03d]*/ { PyObject *data; if (_Py_hashlib_data_argument(&data, data_obj, string) < 0) { @@ -710,9 +710,9 @@ _blake2.blake2s.__new__ as py_blake2s_new data as data_obj: object(c_default="NULL") = b'' * digest_size: int(c_default="HACL_HASH_BLAKE2S_OUT_BYTES") = _blake2.blake2s.MAX_DIGEST_SIZE - key: Py_buffer(c_default="NULL", py_default="b''") = None - salt: Py_buffer(c_default="NULL", py_default="b''") = None - person: Py_buffer(c_default="NULL", py_default="b''") = None + key: Py_buffer = b'' + salt: Py_buffer = b'' + person: Py_buffer = b'' fanout: int = 1 depth: int = 1 leaf_size: unsigned_long = 0 @@ -733,7 +733,7 @@ py_blake2s_new_impl(PyTypeObject *type, PyObject *data_obj, int digest_size, unsigned long long node_offset, int node_depth, int inner_size, int last_node, int usedforsecurity, PyObject *string) -/*[clinic end generated code: output=582a0c4295cc3a3c input=6843d6332eefd295]*/ +/*[clinic end generated code: output=582a0c4295cc3a3c input=da467fc9dae646bb]*/ { PyObject *data; if (_Py_hashlib_data_argument(&data, data_obj, string) < 0) { diff --git a/Modules/clinic/_testclinic.c.h b/Modules/clinic/_testclinic.c.h index 9bcd0eeb008142..05615c1fdd81b9 100644 --- a/Modules/clinic/_testclinic.c.h +++ b/Modules/clinic/_testclinic.c.h @@ -273,19 +273,19 @@ char_converter(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; char a = 'A'; - char b = '\x07'; - char c = '\x08'; + char b = '\a'; + char c = '\b'; char d = '\t'; char e = '\n'; - char f = '\x0b'; - char g = '\x0c'; + char f = '\v'; + char g = '\f'; char h = '\r'; char i = '"'; char j = '\''; char k = '?'; char l = '\\'; - char m = '\x00'; - char n = '\xff'; + char m = '\0'; + char n = '\377'; if (!_PyArg_CheckPositional("char_converter", nargs, 0, 14)) { goto exit; @@ -879,7 +879,7 @@ unsigned_short_converter(PyObject *module, PyObject *const *args, Py_ssize_t nar } PyDoc_STRVAR(int_converter__doc__, -"int_converter($module, a=12, b=34, c=45, /)\n" +"int_converter($module, a=12, b=34, c=\'-\', /)\n" "--\n" "\n"); @@ -895,7 +895,7 @@ int_converter(PyObject *module, PyObject *const *args, Py_ssize_t nargs) PyObject *return_value = NULL; int a = 12; int b = 34; - int c = 45; + int c = '-'; if (!_PyArg_CheckPositional("int_converter", nargs, 0, 3)) { goto exit; @@ -4600,4 +4600,4 @@ _testclinic_TestClass_posonly_poskw_varpos_array_no_fastcall(PyObject *type, PyO exit: return return_value; } -/*[clinic end generated code: output=290d2e346ea7bfa1 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=9971dbbc5f62b8d2 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/binascii.c.h b/Modules/clinic/binascii.c.h index 68ab9c999b2894..513e54b71a0065 100644 --- a/Modules/clinic/binascii.c.h +++ b/Modules/clinic/binascii.c.h @@ -354,7 +354,7 @@ binascii_a2b_ascii85(PyObject *module, PyObject *const *args, Py_ssize_t nargs, Py_buffer data = {NULL, NULL}; int foldspaces = 0; int adobe = 0; - Py_buffer ignorechars = {NULL, NULL}; + Py_buffer ignorechars = {.buf = "", .obj = NULL, .len = 0}; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, /*minpos*/ 1, /*maxpos*/ 1, /*minkw*/ 0, /*varpos*/ 0, argsbuf); @@ -1281,4 +1281,4 @@ binascii_b2a_qp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj return return_value; } -/*[clinic end generated code: output=28de2d0774a0a4d7 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=5c53e7e185700742 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/blake2module.c.h b/Modules/clinic/blake2module.c.h index 97d010d03a4b23..dc70abfaf05543 100644 --- a/Modules/clinic/blake2module.c.h +++ b/Modules/clinic/blake2module.c.h @@ -63,9 +63,9 @@ py_blake2b_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; PyObject *data_obj = NULL; int digest_size = HACL_HASH_BLAKE2B_OUT_BYTES; - Py_buffer key = {NULL, NULL}; - Py_buffer salt = {NULL, NULL}; - Py_buffer person = {NULL, NULL}; + Py_buffer key = {.buf = "", .obj = NULL, .len = 0}; + Py_buffer salt = {.buf = "", .obj = NULL, .len = 0}; + Py_buffer person = {.buf = "", .obj = NULL, .len = 0}; int fanout = 1; int depth = 1; unsigned long leaf_size = 0; @@ -272,9 +272,9 @@ py_blake2s_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; PyObject *data_obj = NULL; int digest_size = HACL_HASH_BLAKE2S_OUT_BYTES; - Py_buffer key = {NULL, NULL}; - Py_buffer salt = {NULL, NULL}; - Py_buffer person = {NULL, NULL}; + Py_buffer key = {.buf = "", .obj = NULL, .len = 0}; + Py_buffer salt = {.buf = "", .obj = NULL, .len = 0}; + Py_buffer person = {.buf = "", .obj = NULL, .len = 0}; int fanout = 1; int depth = 1; unsigned long leaf_size = 0; @@ -506,4 +506,4 @@ _blake2_blake2b_hexdigest(PyObject *self, PyObject *Py_UNUSED(ignored)) { return _blake2_blake2b_hexdigest_impl((Blake2Object *)self); } -/*[clinic end generated code: output=60a4abbcb8950fe5 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=5f76c18211cd7f8f input=a9049054013a1b77]*/ diff --git a/Modules/clinic/zlibmodule.c.h b/Modules/clinic/zlibmodule.c.h index 6fba75339b3206..f8fd111754a894 100644 --- a/Modules/clinic/zlibmodule.c.h +++ b/Modules/clinic/zlibmodule.c.h @@ -210,7 +210,7 @@ zlib_decompress(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj PyDoc_STRVAR(zlib_compressobj__doc__, "compressobj($module, /, level=Z_DEFAULT_COMPRESSION, method=DEFLATED,\n" " wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL,\n" -" strategy=Z_DEFAULT_STRATEGY, zdict=None)\n" +" strategy=Z_DEFAULT_STRATEGY, zdict=)\n" "--\n" "\n" "Return a compressor object.\n" @@ -1402,4 +1402,4 @@ zlib_crc32_combine(PyObject *module, PyObject *const *args, Py_ssize_t nargs) #ifndef ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF #define ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF #endif /* !defined(ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF) */ -/*[clinic end generated code: output=fa5fc356f3090cce input=a9049054013a1b77]*/ +/*[clinic end generated code: output=13627e14206d3552 input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 8c360ce3b79b8a..157965195e1fa0 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -3113,25 +3113,22 @@ class path_t_converter(CConverter): type = "path_t" impl_by_reference = True parse_by_reference = True + default_type = () + c_init_default = "" # overridden in pre_render(() converter = 'path_converter' def converter_init(self, *, allow_fd=False, make_wide=None, nonstrict=False, nullable=False, suppress_value_error=False): - # right now path_t doesn't support default values. - # to support a default value, you'll need to override initialize(). - if self.default not in (unspecified, None): - fail("Can't specify a default to the path_t converter!") - - if self.c_default not in (None, 'Py_None'): - raise RuntimeError("Can't specify a c_default to the path_t converter!") self.nullable = nullable self.nonstrict = nonstrict self.make_wide = make_wide self.suppress_value_error = suppress_value_error self.allow_fd = allow_fd + if nullable: + self.default_type = NoneType def pre_render(self): def strify(value): @@ -3166,6 +3163,8 @@ class path_t_converter(CConverter): class dir_fd_converter(CConverter): type = 'int' + default_type = NoneType + c_init_default = 'DEFAULT_DIR_FD' def converter_init(self, requires=None): if self.default in (unspecified, None): @@ -3175,6 +3174,9 @@ class dir_fd_converter(CConverter): else: self.converter = 'dir_fd_converter' + def c_default_init(self): + self.c_default = 'DEFAULT_DIR_FD' + class uid_t_converter(CConverter): type = "uid_t" converter = '_Py_Uid_Converter' @@ -3255,7 +3257,7 @@ class confname_converter(CConverter): """, argname=argname, converter=self.converter, table=self.table) [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=d2759f2332cd39b3]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=d58f18bdf3bd3565]*/ /*[clinic input] @@ -5668,7 +5670,7 @@ os__getvolumepathname_impl(PyObject *module, path_t *path) /*[clinic input] os._path_splitroot - path: path_t, + path: path_t / Removes everything after the root on Win32. @@ -5676,7 +5678,7 @@ Removes everything after the root on Win32. static PyObject * os__path_splitroot_impl(PyObject *module, path_t *path) -/*[clinic end generated code: output=ab7f1a88b654581c input=42831e41f8458f6d]*/ +/*[clinic end generated code: output=ab7f1a88b654581c input=d356de1edb6050a2]*/ { wchar_t *buffer; wchar_t *end; @@ -5978,7 +5980,7 @@ os__path_lexists_impl(PyObject *module, path_t *path) /*[clinic input] os._path_isdir -> bool - path: path_t(allow_fd=True, suppress_value_error=True), + path: path_t(allow_fd=True, suppress_value_error=True) / Return true if the pathname refers to an existing directory. @@ -5987,7 +5989,7 @@ Return true if the pathname refers to an existing directory. static int os__path_isdir_impl(PyObject *module, path_t *path) -/*[clinic end generated code: output=d5786196f9e2fa7a input=0d3fd790564d244b]*/ +/*[clinic end generated code: output=d5786196f9e2fa7a input=b15f9b697a7a759f]*/ { return _testFileType(path, PY_IFDIR); } @@ -6056,7 +6058,7 @@ os__path_isjunction_impl(PyObject *module, path_t *path) /*[clinic input] os._path_splitroot_ex - path: path_t(make_wide=True, nonstrict=True), + path: path_t(make_wide=True, nonstrict=True) / Split a pathname into drive, root and tail. @@ -6066,7 +6068,7 @@ The tail contains anything after the root. static PyObject * os__path_splitroot_ex_impl(PyObject *module, path_t *path) -/*[clinic end generated code: output=4b0072b6cdf4b611 input=4ac47b394d68bd21]*/ +/*[clinic end generated code: output=4b0072b6cdf4b611 input=012fbfad14888b2b]*/ { Py_ssize_t drvsize, rootsize; PyObject *drv = NULL, *root = NULL, *tail = NULL, *result = NULL; diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c index f546f3ff1cb864..7a8ed979bbe65d 100644 --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -550,7 +550,7 @@ zlib.compressobj strategy: int(c_default="Z_DEFAULT_STRATEGY") = Z_DEFAULT_STRATEGY Used to tune the compression algorithm. Possible values are Z_DEFAULT_STRATEGY, Z_FILTERED, and Z_HUFFMAN_ONLY. - zdict: Py_buffer = None + zdict: Py_buffer = NULL The predefined compression dictionary - a sequence of bytes containing subsequences that are likely to occur in the input data. @@ -560,7 +560,7 @@ Return a compressor object. static PyObject * zlib_compressobj_impl(PyObject *module, int level, int method, int wbits, int memLevel, int strategy, Py_buffer *zdict) -/*[clinic end generated code: output=8b5bed9c8fc3814d input=2fa3d026f90ab8d5]*/ +/*[clinic end generated code: output=8b5bed9c8fc3814d input=1a6f61d8a8885c0d]*/ { zlibstate *state = get_zlib_state(module); if (zdict->buf != NULL && (size_t)zdict->len > UINT_MAX) { diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index a65c43874e876c..dd2482ca653fb1 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -86,14 +86,12 @@ class Py_UCS4_converter(CConverter): type = 'Py_UCS4' converter = 'convert_uc' - def converter_init(self): - if self.default is not unspecified: - self.c_default = ascii(self.default) - if len(self.c_default) > 4 or self.c_default[0] != "'": - self.c_default = hex(ord(self.default)) + def c_default_init(self): + import libclinic + self.c_default = libclinic.c_unichar_repr(self.default) [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=88f5dd06cd8e7a61]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=22f057b68fd9a65a]*/ /* --- Globals ------------------------------------------------------------ diff --git a/Tools/c-analyzer/c_parser/parser/__init__.py b/Tools/c-analyzer/c_parser/parser/__init__.py index f3f09107aefce6..5b4b2b134584ad 100644 --- a/Tools/c-analyzer/c_parser/parser/__init__.py +++ b/Tools/c-analyzer/c_parser/parser/__init__.py @@ -219,7 +219,7 @@ def _iter_source(lines, *, maxtext=11_000, maxlines=200, showtext=False): msg = f''' too much text, try to increase MAX_SIZES[MAXTEXT] in cpython/_parser.py {filename} starting at line {lno_from} to {lno_to} - has code with length {len(text)} greater than {maxtext}: + has code with length {len(srcinfo.text)} greater than {maxtext}: {text} ''' raise RuntimeError(textwrap.dedent(msg)) diff --git a/Tools/c-analyzer/cpython/_parser.py b/Tools/c-analyzer/cpython/_parser.py index 890b0eb0bd7079..a251a045b91144 100644 --- a/Tools/c-analyzer/cpython/_parser.py +++ b/Tools/c-analyzer/cpython/_parser.py @@ -344,6 +344,7 @@ def format_tsv_lines(lines): _abs('Modules/_ssl_data_300.h'): (80_000, 10_000), _abs('Modules/_ssl_data_111.h'): (80_000, 10_000), _abs('Modules/cjkcodecs/mappings_*.h'): (160_000, 2_000), + _abs('Modules/clinic/_testclinic.c.h'): (120_000, 5_000), _abs('Modules/unicodedata_db.h'): (180_000, 3_000), _abs('Modules/unicodename_db.h'): (1_200_000, 15_000), _abs('Objects/unicodetype_db.h'): (240_000, 3_000), diff --git a/Tools/clinic/libclinic/__init__.py b/Tools/clinic/libclinic/__init__.py index 9e9bdeadcc0fe1..5ee165d0c138a8 100644 --- a/Tools/clinic/libclinic/__init__.py +++ b/Tools/clinic/libclinic/__init__.py @@ -7,7 +7,9 @@ ) from .formatting import ( SIG_END_MARKER, - c_repr, + c_str_repr, + c_bytes_repr, + c_unichar_repr, docstring_for_c_string, format_escape, indent_all_lines, @@ -26,7 +28,7 @@ from .utils import ( FormatCounterFormatter, NULL, - Null, + NullType, Sentinels, VersionTuple, compute_checksum, @@ -45,7 +47,9 @@ # Formatting helpers "SIG_END_MARKER", - "c_repr", + "c_str_repr", + "c_bytes_repr", + "c_unichar_repr", "docstring_for_c_string", "format_escape", "indent_all_lines", @@ -64,7 +68,7 @@ # Utility functions "FormatCounterFormatter", "NULL", - "Null", + "NullType", "Sentinels", "VersionTuple", "compute_checksum", diff --git a/Tools/clinic/libclinic/clanguage.py b/Tools/clinic/libclinic/clanguage.py index 341667d2f0bff9..7f02c7790f015a 100644 --- a/Tools/clinic/libclinic/clanguage.py +++ b/Tools/clinic/libclinic/clanguage.py @@ -101,7 +101,7 @@ def compiler_deprecated_warning( code = self.COMPILER_DEPRECATION_WARNING_PROTOTYPE.format( major=minversion[0], minor=minversion[1], - message=libclinic.c_repr(message), + message=libclinic.c_str_repr(message), ) return libclinic.normalize_snippet(code) diff --git a/Tools/clinic/libclinic/converter.py b/Tools/clinic/libclinic/converter.py index ac66e79f93b735..c10235237d4b71 100644 --- a/Tools/clinic/libclinic/converter.py +++ b/Tools/clinic/libclinic/converter.py @@ -6,7 +6,7 @@ import libclinic from libclinic import fail -from libclinic import Sentinels, unspecified, unknown +from libclinic import Sentinels, unspecified, unknown, NULL from libclinic.codegen import CRenderData, Include, TemplateDict from libclinic.function import Function, Parameter @@ -83,9 +83,9 @@ class CConverter(metaclass=CConverterAutoRegister): # at runtime). default: object = unspecified - # If not None, default must be isinstance() of this type. + # default must be isinstance() of this type. # (You can also specify a tuple of types.) - default_type: bltns.type[object] | tuple[bltns.type[object], ...] | None = None + default_type: bltns.type[object] | tuple[bltns.type[object], ...] = object # "default" converted into a C value, as a string. # Or None if there is no default. @@ -95,6 +95,13 @@ class CConverter(metaclass=CConverterAutoRegister): # Or None if there is no default. py_default: str | None = None + # The default value used to initialize the C variable when + # there is no default. + # + # Every non-abstract subclass with non-trivial cleanup() should supply + # a valid value. + c_init_default: str = '' + # The default value used to initialize the C variable when # there is no default, but not specifying a default may # result in an "uninitialized variable" warning. This can @@ -105,7 +112,7 @@ class CConverter(metaclass=CConverterAutoRegister): # # This value is specified as a string. # Every non-abstract subclass should supply a valid value. - c_ignored_default: str = 'NULL' + c_ignored_default: str = '' # If true, wrap with Py_UNUSED. unused = False @@ -182,9 +189,25 @@ def __init__(self, self.unused = unused self._includes: list[Include] = [] + if c_default: + self.c_default = c_default + if py_default: + self.py_default = py_default + + if annotation is not unspecified: + fail("The 'annotation' parameter is not currently permitted.") + + # Make sure not to set self.function until after converter_init() has been called. + # This prevents you from caching information + # about the function in converter_init(). + # (That breaks if we get cloned.) + self.converter_init(**kwargs) + if default is not unspecified: - if (self.default_type - and default is not unknown + if self.default_type == (): + conv_name = self.__class__.__name__.removesuffix('_converter') + fail(f"A '{conv_name}' parameter cannot be marked optional.") + if (default is not unknown and not isinstance(default, self.default_type) ): if isinstance(self.default_type, type): @@ -197,19 +220,38 @@ def __init__(self, f"{name!r} is not of type {types_str!r}") self.default = default - if c_default: - self.c_default = c_default - if py_default: - self.py_default = py_default - - if annotation is not unspecified: - fail("The 'annotation' parameter is not currently permitted.") + if not self.c_default: + if default is unspecified: + if self.c_init_default: + self.c_default = self.c_init_default + elif default is NULL: + self.c_default = self.c_ignored_default or self.c_init_default + if not self.c_default: + cls_name = self.__class__.__name__ + fail(f"{cls_name}: c_default is required for " + f"default value NULL") + else: + assert default is not unknown + self.c_default_init() + if not self.c_default: + if default is None: + self.c_default = self.c_init_default + if not self.c_default: + cls_name = self.__class__.__name__ + fail(f"{cls_name}: c_default is required for " + f"default value None") + elif isinstance(default, str): + self.c_default = libclinic.c_str_repr(default) + elif isinstance(default, bytes): + self.c_default = libclinic.c_bytes_repr(default) + elif isinstance(default, (int, float)): + self.c_default = repr(default) + else: + cls_name = self.__class__.__name__ + fail(f"{cls_name}: c_default is required for " + f"default value {default!r}") + fail(f"Unsupported default value {default!r}.") - # Make sure not to set self.function until after converter_init() has been called. - # This prevents you from caching information - # about the function in converter_init(). - # (That breaks if we get cloned.) - self.converter_init(**kwargs) self.function = function # Add a custom __getattr__ method to improve the error message @@ -233,6 +275,9 @@ def __getattr__(self, attr): def converter_init(self) -> None: pass + def c_default_init(self) -> None: + return + def is_optional(self) -> bool: return (self.default is not unspecified) @@ -324,7 +369,7 @@ def parse_argument(self, args: list[str]) -> None: args.append(self.converter) if self.encoding: - args.append(libclinic.c_repr(self.encoding)) + args.append(libclinic.c_str_repr(self.encoding)) elif self.subclass_of: args.append(self.subclass_of) @@ -371,7 +416,7 @@ def declaration(self, *, in_parser: bool = False) -> str: declaration = [self.simple_declaration(in_parser=True)] default = self.c_default if not default and self.parameter.group: - default = self.c_ignored_default + default = self.c_ignored_default or self.c_init_default if default: declaration.append(" = ") declaration.append(default) diff --git a/Tools/clinic/libclinic/converters.py b/Tools/clinic/libclinic/converters.py index bc21ae84e1c332..76091a9eedc1bf 100644 --- a/Tools/clinic/libclinic/converters.py +++ b/Tools/clinic/libclinic/converters.py @@ -4,7 +4,7 @@ from types import NoneType from typing import Any -from libclinic import fail, Null, unspecified, unknown +from libclinic import fail, NullType, unspecified, NULL, c_bytes_repr, c_unichar_repr from libclinic.function import ( Function, Parameter, CALLABLE, STATIC_METHOD, CLASS_METHOD, METHOD_INIT, METHOD_NEW, @@ -19,6 +19,8 @@ class BaseUnsignedIntConverter(CConverter): bitwise = False + default_type = int + c_ignored_default = '0' def use_converter(self) -> None: if self.converter: @@ -107,12 +109,13 @@ class bool_converter(CConverter): def converter_init(self, *, accept: TypeSet = {object}) -> None: if accept == {int}: self.format_unit = 'i' + self.default_type = int # type: ignore[assignment] elif accept != {object}: fail(f"bool_converter: illegal 'accept' argument {accept!r}") - if self.default is not unspecified and self.default is not unknown: - self.default = bool(self.default) - if self.c_default in {'Py_True', 'Py_False'}: - self.c_default = str(int(self.default)) + + def c_default_init(self) -> None: + assert isinstance(self.default, int) + self.c_default = str(int(self.default)) def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'i': @@ -140,6 +143,7 @@ class defining_class_converter(CConverter): this is the default converter used for the defining class. """ type = 'PyTypeObject *' + default_type = () format_unit = '' show_in_signature = False specified_type: str | None = None @@ -156,7 +160,7 @@ def set_template_dict(self, template_dict: TemplateDict) -> None: class char_converter(CConverter): type = 'char' - default_type = (bytes, bytearray) + default_type = bytes format_unit = 'c' c_ignored_default = "'\0'" @@ -165,9 +169,18 @@ def converter_init(self) -> None: if len(self.default) != 1: fail(f"char_converter: illegal default value {self.default!r}") - self.c_default = repr(bytes(self.default))[1:] - if self.c_default == '"\'"': - self.c_default = r"'\''" + def c_default_init(self) -> None: + default = self.default + assert isinstance(default, bytes) + if default == b"'": + self.c_default = r"'\''" + elif default == b'"': + self.c_default = r"""'"'""" + elif default == b'\0': + self.c_default = r"'\0'" + else: + r = c_bytes_repr(default)[1:-1] + self.c_default = "'" + r + "'" def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'c': @@ -207,7 +220,6 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st @add_legacy_c_converter('B', bitwise=True) class unsigned_char_converter(BaseUnsignedIntConverter): type = 'unsigned char' - default_type = int format_unit = 'b' c_ignored_default = "'\0'" @@ -282,8 +294,6 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st class unsigned_short_converter(BaseUnsignedIntConverter): type = 'unsigned short' - default_type = int - c_ignored_default = "0" def converter_init(self, *, bitwise: bool = False) -> None: self.bitwise = bitwise @@ -305,11 +315,19 @@ def converter_init( ) -> None: if accept == {str}: self.format_unit = 'C' + self.default_type = str # type: ignore[assignment] + if isinstance(self.default, str): + if len(self.default) != 1: + fail(f"int_converter: illegal default value {self.default!r}") elif accept != {int}: fail(f"int_converter: illegal 'accept' argument {accept!r}") if type is not None: self.type = type + def c_default_init(self) -> None: + if isinstance(self.default, str): + self.c_default = c_unichar_repr(self.default) + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'i': return self.format_code(""" @@ -343,8 +361,6 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st class unsigned_int_converter(BaseUnsignedIntConverter): type = 'unsigned int' - default_type = int - c_ignored_default = "0" def converter_init(self, *, bitwise: bool = False) -> None: self.bitwise = bitwise @@ -374,8 +390,6 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st class unsigned_long_converter(BaseUnsignedIntConverter): type = 'unsigned long' - default_type = int - c_ignored_default = "0" def converter_init(self, *, bitwise: bool = False) -> None: self.bitwise = bitwise @@ -405,8 +419,6 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st class unsigned_long_long_converter(BaseUnsignedIntConverter): type = 'unsigned long long' - default_type = int - c_ignored_default = "0" def converter_init(self, *, bitwise: bool = False) -> None: self.bitwise = bitwise @@ -418,6 +430,7 @@ def converter_init(self, *, bitwise: bool = False) -> None: class Py_ssize_t_converter(CConverter): type = 'Py_ssize_t' + default_type = (int, NoneType) c_ignored_default = "0" def converter_init(self, *, accept: TypeSet = {int}, @@ -425,7 +438,7 @@ def converter_init(self, *, accept: TypeSet = {int}, self.allow_negative = allow_negative if accept == {int}: self.format_unit = 'n' - self.default_type = int + self.default_type = int # type: ignore[assignment] elif accept == {int, NoneType}: if self.allow_negative: self.converter = '_Py_convert_optional_to_ssize_t' @@ -501,10 +514,13 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st class slice_index_converter(CConverter): type = 'Py_ssize_t' + default_type = (int, NoneType) + c_ignored_default = "0" def converter_init(self, *, accept: TypeSet = {int, NoneType}) -> None: if accept == {int}: self.converter = '_PyEval_SliceIndexNotNone' + self.default_type = int # type: ignore[assignment] self.nullable = False elif accept == {int, NoneType}: self.converter = '_PyEval_SliceIndex' @@ -554,7 +570,6 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st class size_t_converter(BaseUnsignedIntConverter): type = 'size_t' converter = '_PyLong_Size_t_Converter' - c_ignored_default = "0" def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'n': @@ -673,6 +688,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st class object_converter(CConverter): type = 'PyObject *' format_unit = 'O' + c_ignored_default = 'NULL' def converter_init( self, *, @@ -692,6 +708,10 @@ def converter_init( if type is not None: self.type = type + def c_default_init(self) -> None: + default = self.default + if default is None or isinstance(default, bool): + self.c_default = "Py_" + repr(default) # # We define three conventions for buffer types in the 'accept' argument: @@ -721,8 +741,9 @@ def str_converter_key( class str_converter(CConverter): type = 'const char *' - default_type = (str, Null, NoneType) + default_type = (str, bytes, NullType, NoneType) format_unit = 's' + c_ignored_default = 'NULL' def converter_init( self, @@ -740,14 +761,16 @@ def converter_init( self.format_unit = format_unit self.length = bool(zeroes) if encoding: - if self.default not in (Null, None, unspecified): + if self.default not in (NULL, None, unspecified): fail("str_converter: Argument Clinic doesn't support default values for encoded strings") self.encoding = encoding self.type = 'char *' # sorry, clinic can't support preallocated buffers # for es# and et# self.c_default = "NULL" - if NoneType in accept and self.c_default == "Py_None": + + def c_default_init(self) -> None: + if self.default is None: self.c_default = "NULL" def post_parsing(self) -> str: @@ -860,6 +883,7 @@ class PyBytesObject_converter(CConverter): type = 'PyBytesObject *' format_unit = 'S' # accept = {bytes} + c_ignored_default = 'NULL' def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'S': @@ -880,6 +904,7 @@ class PyByteArrayObject_converter(CConverter): type = 'PyByteArrayObject *' format_unit = 'Y' # accept = {bytearray} + c_ignored_default = 'NULL' def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'Y': @@ -898,8 +923,9 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st class unicode_converter(CConverter): type = 'PyObject *' - default_type = (str, Null, NoneType) + default_type = (str, NullType, NoneType) format_unit = 'U' + c_ignored_default = 'NULL' def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'U': @@ -918,11 +944,11 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st class _unicode_fs_converter_base(CConverter): type = 'PyObject *' + default_type = NullType + c_init_default = 'NULL' - def converter_init(self) -> None: - if self.default is not unspecified: - fail(f"{self.__class__.__name__} does not support default values") - self.c_default = 'NULL' + def c_default_init(self) -> None: + fail(f"{self.__class__.__name__} does not support default values") def cleanup(self) -> str: return f"Py_XDECREF({self.parser_name});" @@ -942,7 +968,8 @@ class unicode_fs_decoded_converter(_unicode_fs_converter_base): @add_legacy_c_converter('Z#', accept={str, NoneType}, zeroes=True) class Py_UNICODE_converter(CConverter): type = 'const wchar_t *' - default_type = (str, Null, NoneType) + default_type = (str, NullType, NoneType) + c_ignored_default = 'NULL' def converter_init( self, *, @@ -958,6 +985,7 @@ def converter_init( self.accept = accept if accept == {str}: self.converter = '_PyUnicode_WideCharString_Converter' + self.default_type = (str, NullType) # type: ignore[assignment] elif accept == {str, NoneType}: self.converter = '_PyUnicode_WideCharString_Opt_Converter' else: @@ -1013,28 +1041,34 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st @add_legacy_c_converter('w*', accept={rwbuffer}) class Py_buffer_converter(CConverter): type = 'Py_buffer' + default_type = (str, bytes, NullType, NoneType) format_unit = 'y*' impl_by_reference = True - c_ignored_default = "{NULL, NULL}" + c_init_default = "{NULL, NULL}" def converter_init(self, *, accept: TypeSet = {buffer}) -> None: - if self.default not in (unspecified, None): - fail("The only legal default value for Py_buffer is None.") - - self.c_default = self.c_ignored_default - if accept == {str, buffer, NoneType}: - format_unit = 'z*' + self.format_unit = 'z*' + self.default_type = (str, bytes, NullType, NoneType) elif accept == {str, buffer}: - format_unit = 's*' + self.format_unit = 's*' + self.default_type = (str, bytes, NullType) # type: ignore[assignment] elif accept == {buffer}: - format_unit = 'y*' + self.format_unit = 'y*' + self.default_type = (bytes, NullType) # type: ignore[assignment] elif accept == {rwbuffer}: - format_unit = 'w*' + self.format_unit = 'w*' + self.default_type = NullType # type: ignore[assignment] else: fail("Py_buffer_converter: illegal combination of arguments") - self.format_unit = format_unit + def c_default_init(self) -> None: + default = self.default + if isinstance(default, bytes): + self.c_default = f'{{.buf = {c_bytes_repr(default)}, .obj = NULL, .len = {len(default)}}}' + elif isinstance(default, str): + default = default.encode() + self.c_default = f'{{.buf = {c_bytes_repr(default)}, .obj = NULL, .len = {len(default)}}}' def cleanup(self) -> str: name = self.name @@ -1115,6 +1149,7 @@ class self_converter(CConverter): this is the default converter used for "self". """ type: str | None = None + default_type = () format_unit = '' specified_type: str | None = None @@ -1229,6 +1264,7 @@ def use_pyobject_self(self, func: Function) -> bool: # Converters for var-positional parameter. class VarPosCConverter(CConverter): + default_type = () format_unit = '' def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: @@ -1241,8 +1277,7 @@ def parse_vararg(self, *, pos_only: int, min_pos: int, max_pos: int, class varpos_tuple_converter(VarPosCConverter): type = 'PyObject *' - format_unit = '' - c_default = 'NULL' + c_init_default = 'NULL' def cleanup(self) -> str: return f"""Py_XDECREF({self.parser_name});\n""" @@ -1299,7 +1334,6 @@ def parse_vararg(self, *, pos_only: int, min_pos: int, max_pos: int, class varpos_array_converter(VarPosCConverter): type = 'PyObject * const *' length = True - c_ignored_default = '' def parse_vararg(self, *, pos_only: int, min_pos: int, max_pos: int, fastcall: bool, limited_capi: bool) -> str: @@ -1324,6 +1358,7 @@ def parse_vararg(self, *, pos_only: int, min_pos: int, max_pos: int, # Converters for var-keyword parameters. class VarKeywordCConverter(CConverter): + default_type = () format_unit = '' def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: @@ -1335,7 +1370,7 @@ def parse_var_keyword(self) -> str: class var_keyword_dict_converter(VarKeywordCConverter): type = 'PyObject *' - c_default = 'NULL' + c_init_default = 'NULL' def cleanup(self) -> str: return f'Py_XDECREF({self.parser_name});\n' diff --git a/Tools/clinic/libclinic/dsl_parser.py b/Tools/clinic/libclinic/dsl_parser.py index 0d83baeba9e508..90e2e0d3d9c928 100644 --- a/Tools/clinic/libclinic/dsl_parser.py +++ b/Tools/clinic/libclinic/dsl_parser.py @@ -7,7 +7,7 @@ import shlex import sys from collections.abc import Callable -from types import FunctionType, NoneType +from types import FunctionType from typing import TYPE_CHECKING, Any, NamedTuple import libclinic @@ -947,16 +947,17 @@ def parse_parameter(self, line: str) -> None: name = f'var_keyword_{name}' value: object + has_c_default = 'c_default' in kwargs if not function_args.defaults: - if is_vararg or is_var_keyword: - value = NULL - else: - if self.parameter_state is ParamState.OPTIONAL: - fail(f"Can't have a parameter without a default ({parameter_name!r}) " - "after a parameter with a default!") - value = unspecified + value = unspecified + if (not is_vararg and not is_var_keyword + and self.parameter_state is ParamState.OPTIONAL): + fail(f"Can't have a parameter without a default ({parameter_name!r}) " + "after a parameter with a default!") if 'py_default' in kwargs: fail("You can't specify py_default without specifying a default value!") + if has_c_default: + fail("You can't specify c_default without specifying a default value!") else: expr = function_args.defaults[0] default = ast_input[expr.col_offset: expr.end_col_offset].strip() @@ -965,7 +966,7 @@ def parse_parameter(self, line: str) -> None: self.parameter_state = ParamState.OPTIONAL bad = False try: - if 'c_default' not in kwargs: + if not has_c_default: # we can only represent very simple data values in C. # detect whether default is okay, via a denylist # of disallowed ast nodes. @@ -1011,18 +1012,15 @@ def bad_node(self, node: ast.AST) -> None: fail(f"Unsupported expression as default value: {default!r}") # mild hack: explicitly support NULL as a default value - c_default: str | None if isinstance(expr, ast.Name) and expr.id == 'NULL': value = NULL py_default = '' - c_default = "NULL" elif (isinstance(expr, ast.BinOp) or (isinstance(expr, ast.UnaryOp) and not (isinstance(expr.operand, ast.Constant) and type(expr.operand.value) in {int, float, complex}) )): - c_default = kwargs.get("c_default") - if not (isinstance(c_default, str) and c_default): + if not has_c_default: fail(f"When you specify an expression ({default!r}) " f"as your default value, " f"you MUST specify a valid c_default.", @@ -1041,8 +1039,7 @@ def bad_node(self, node: ast.AST) -> None: a.append(n.id) py_default = ".".join(reversed(a)) - c_default = kwargs.get("c_default") - if not (isinstance(c_default, str) and c_default): + if not has_c_default: fail(f"When you specify a named constant ({py_default!r}) " "as your default value, " "you MUST specify a valid c_default.") @@ -1054,23 +1051,15 @@ def bad_node(self, node: ast.AST) -> None: else: value = ast.literal_eval(expr) py_default = repr(value) - if isinstance(value, (bool, NoneType)): - c_default = "Py_" + py_default - elif isinstance(value, str): - c_default = libclinic.c_repr(value) - else: - c_default = py_default except (ValueError, AttributeError): value = unknown - c_default = kwargs.get("c_default") py_default = default - if not (isinstance(c_default, str) and c_default): + if not has_c_default: fail("When you specify a named constant " f"({py_default!r}) as your default value, " "you MUST specify a valid c_default.") - kwargs.setdefault('c_default', c_default) kwargs.setdefault('py_default', py_default) dict = legacy_converters if legacy else converters @@ -1093,12 +1082,10 @@ def bad_node(self, node: ast.AST) -> None: if isinstance(converter, self_converter): if len(self.function.parameters) == 1: - if self.parameter_state is not ParamState.REQUIRED: - fail("A 'self' parameter cannot be marked optional.") - if value is not unspecified: - fail("A 'self' parameter cannot have a default value.") if self.group: fail("A 'self' parameter cannot be in an optional group.") + assert self.parameter_state is ParamState.REQUIRED + assert value is unspecified kind = inspect.Parameter.POSITIONAL_ONLY self.parameter_state = ParamState.START self.function.parameters.clear() @@ -1109,14 +1096,12 @@ def bad_node(self, node: ast.AST) -> None: if isinstance(converter, defining_class_converter): _lp = len(self.function.parameters) if _lp == 1: - if self.parameter_state is not ParamState.REQUIRED: - fail("A 'defining_class' parameter cannot be marked optional.") - if value is not unspecified: - fail("A 'defining_class' parameter cannot have a default value.") if self.group: fail("A 'defining_class' parameter cannot be in an optional group.") if self.function.cls is None: fail("A 'defining_class' parameter cannot be defined at module level.") + assert self.parameter_state is ParamState.REQUIRED + assert value is unspecified kind = inspect.Parameter.POSITIONAL_ONLY else: fail("A 'defining_class' parameter, if specified, must either " diff --git a/Tools/clinic/libclinic/formatting.py b/Tools/clinic/libclinic/formatting.py index 873ece6210017a..264327818c1d19 100644 --- a/Tools/clinic/libclinic/formatting.py +++ b/Tools/clinic/libclinic/formatting.py @@ -39,8 +39,55 @@ def _quoted_for_c_string(text: str) -> str: return text -def c_repr(text: str) -> str: - return '"' + text + '"' +# Use octals, because \x... in C has arbitrary number of hexadecimal digits. +_c_repr = [chr(i) if 32 <= i < 127 else fr'\{i:03o}' for i in range(256)] +_c_repr[ord('"')] = r'\"' +_c_repr[ord('\\')] = r'\\' +_c_repr[ord('\a')] = r'\a' +_c_repr[ord('\b')] = r'\b' +_c_repr[ord('\f')] = r'\f' +_c_repr[ord('\n')] = r'\n' +_c_repr[ord('\r')] = r'\r' +_c_repr[ord('\t')] = r'\t' +_c_repr[ord('\v')] = r'\v' + +def _break_trigraphs(s: str) -> str: + # Prevent trigraphs from being interpreted inside string literals. + if '??' in s: + s = s.replace('??', r'?\?') + s = s.replace(r'\??', r'\?\?') + # Also Argument Clinic does not like comment-like sequences + # in string literals. + s = s.replace(r'/*', r'/\*') + s = s.replace(r'*/', r'*\/') + return s + +def c_bytes_repr(data: bytes) -> str: + r = ''.join(_c_repr[i] for i in data) + r = _break_trigraphs(r) + return '"' + r + '"' + +def c_str_repr(text: str) -> str: + r = ''.join(_c_repr[i] if i < 0x80 + else fr'\u{i:04x}' if i < 0x10000 + else fr'\U{i:08x}' + for i in map(ord, text)) + r = _break_trigraphs(r) + return '"' + r + '"' + +def c_unichar_repr(char: str) -> str: + if char == "'": + return r"'\''" + if char == '"': + return """'"'""" + if char == '\0': + return '0' + i = ord(char) + if i < 0x80: + r = _c_repr[i] + if not r.startswith((r'\0', r'\1')): + return "'" + r + "'" + return f'0x{i:02x}' def wrapped_c_string_literal( @@ -58,8 +105,8 @@ def wrapped_c_string_literal( drop_whitespace=False, break_on_hyphens=False, ) - separator = c_repr(suffix + "\n" + subsequent_indent * " ") - return initial_indent * " " + c_repr(separator.join(wrapped)) + separator = '"' + suffix + "\n" + subsequent_indent * " " + '"' + return initial_indent * " " + '"' + separator.join(wrapped) + '"' def _add_prefix_and_suffix(text: str, *, prefix: str = "", suffix: str = "") -> str: diff --git a/Tools/clinic/libclinic/utils.py b/Tools/clinic/libclinic/utils.py index 17e8f35be73bf4..3df64f270dd074 100644 --- a/Tools/clinic/libclinic/utils.py +++ b/Tools/clinic/libclinic/utils.py @@ -85,9 +85,9 @@ def __repr__(self) -> str: # This one needs to be a distinct class, unlike the other two -class Null: +class NullType: def __repr__(self) -> str: return '' -NULL = Null() +NULL = NullType() From 9d7621b75bc4935e14d4f12dffb3cb1d89ea1bc6 Mon Sep 17 00:00:00 2001 From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Tue, 17 Mar 2026 14:02:59 +0000 Subject: [PATCH 3/8] gh-146054: Limit the growth of `encodings.search_function` cache (GH-146055) --- Lib/encodings/__init__.py | 5 +++++ Lib/test/test_codecs.py | 11 +++++++++++ .../2026-03-17-11-46-20.gh-issue-146054.udYcqn.rst | 2 ++ 3 files changed, 18 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2026-03-17-11-46-20.gh-issue-146054.udYcqn.rst diff --git a/Lib/encodings/__init__.py b/Lib/encodings/__init__.py index e205ec326376d8..169c48324f227b 100644 --- a/Lib/encodings/__init__.py +++ b/Lib/encodings/__init__.py @@ -34,6 +34,7 @@ from . import aliases _cache = {} +_MAXCACHE = 500 _unknown = '--unknown--' _import_tail = ['*'] _aliases = aliases.aliases @@ -111,6 +112,8 @@ def search_function(encoding): if mod is None: # Cache misses + if len(_cache) >= _MAXCACHE: + _cache.clear() _cache[encoding] = None return None @@ -132,6 +135,8 @@ def search_function(encoding): entry = codecs.CodecInfo(*entry) # Cache the codec registry entry + if len(_cache) >= _MAXCACHE: + _cache.clear() _cache[encoding] = entry # Register its aliases (without overwriting previously registered diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index c31faec9ee5214..79c8a7ef886482 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -3908,5 +3908,16 @@ def test_encodings_normalize_encoding(self): self.assertEqual(normalize('utf\xE9\u20AC\U0010ffff-8'), 'utf_8') +class CodecCacheTest(unittest.TestCase): + def test_cache_bounded(self): + for i in range(encodings._MAXCACHE + 1000): + try: + b'x'.decode(f'nonexist_{i}') + except LookupError: + pass + + self.assertLessEqual(len(encodings._cache), encodings._MAXCACHE) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2026-03-17-11-46-20.gh-issue-146054.udYcqn.rst b/Misc/NEWS.d/next/Library/2026-03-17-11-46-20.gh-issue-146054.udYcqn.rst new file mode 100644 index 00000000000000..8692c7f171d0fb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-03-17-11-46-20.gh-issue-146054.udYcqn.rst @@ -0,0 +1,2 @@ +Limit the size of :func:`encodings.search_function` cache. +Found by OSS Fuzz in :oss-fuzz:`493449985`. From 1efd9939c8742a251f232f09ccd0c1def7fda66e Mon Sep 17 00:00:00 2001 From: Sacul <183588943+Sacul0457@users.noreply.github.com> Date: Tue, 17 Mar 2026 22:07:17 +0800 Subject: [PATCH 4/8] gh-131798: Optimize `_ITER_CHECK_RANGE` and `_ITER_CHECK_LIST` in the JIT (GH-144583) --- Lib/test/test_capi/test_opt.py | 16 ++++++++++++++++ ...6-02-08-01-19-50.gh-issue-131798.PaWDNH.rst | 1 + Python/optimizer_bytecodes.c | 18 ++++++++++++++++++ Python/optimizer_cases.c.h | 16 ++++++++++++++++ 4 files changed, 51 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-08-01-19-50.gh-issue-131798.PaWDNH.rst diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index 1385a7f840d7be..2a126a7b29cc73 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -3981,6 +3981,22 @@ def testfunc(n): self.assertIn("_POP_TOP_NOP", uops) self.assertLessEqual(count_ops(ex, "_POP_TOP"), 2) + def test_iter_check_list(self): + def testfunc(n): + x = 0 + for _ in range(n): + l = [1] + for num in l: # unguarded + x += num + return x + + res, ex = self._run_with_optimizer(testfunc, TIER2_THRESHOLD) + self.assertEqual(res, TIER2_THRESHOLD) + uops = get_opnames(ex) + + self.assertIn("_BUILD_LIST", uops) + self.assertNotIn("_ITER_CHECK_LIST", uops) + def test_match_class(self): def testfunc(n): class A: diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-08-01-19-50.gh-issue-131798.PaWDNH.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-08-01-19-50.gh-issue-131798.PaWDNH.rst new file mode 100644 index 00000000000000..fe80c2d911b6ee --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-08-01-19-50.gh-issue-131798.PaWDNH.rst @@ -0,0 +1 @@ +Optimize ``_ITER_CHECK_RANGE`` and ``_ITER_CHECK_LIST`` in the JIT diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index f3a391b2e37ef9..9b77fd0c32d9d9 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -1091,6 +1091,24 @@ dummy_func(void) { sym_set_type(iter, &PyTuple_Type); } + op(_ITER_CHECK_LIST, (iter, null_or_index -- iter, null_or_index)) { + if (sym_matches_type(iter, &PyList_Type)) { + ADD_OP(_NOP, 0, 0); + } + else { + sym_set_type(iter, &PyList_Type); + } + } + + op(_ITER_CHECK_RANGE, (iter, null_or_index -- iter, null_or_index)) { + if (sym_matches_type(iter, &PyRange_Type)) { + ADD_OP(_NOP, 0, 0); + } + else { + sym_set_type(iter, &PyRange_Type); + } + } + op(_ITER_NEXT_RANGE, (iter, null_or_index -- iter, null_or_index, next)) { next = sym_new_type(ctx, &PyLong_Type); } diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 52a0c08ac677b7..eef07cedaf38e2 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -2752,6 +2752,14 @@ /* _INSTRUMENTED_FOR_ITER is not a viable micro-op for tier 2 */ case _ITER_CHECK_LIST: { + JitOptRef iter; + iter = stack_pointer[-2]; + if (sym_matches_type(iter, &PyList_Type)) { + ADD_OP(_NOP, 0, 0); + } + else { + sym_set_type(iter, &PyList_Type); + } break; } @@ -2800,6 +2808,14 @@ } case _ITER_CHECK_RANGE: { + JitOptRef iter; + iter = stack_pointer[-2]; + if (sym_matches_type(iter, &PyRange_Type)) { + ADD_OP(_NOP, 0, 0); + } + else { + sym_set_type(iter, &PyRange_Type); + } break; } From dc24b8a6d42231ebc821baeda662e1168b52aa26 Mon Sep 17 00:00:00 2001 From: Ramin Farajpour Cami Date: Tue, 17 Mar 2026 18:38:53 +0330 Subject: [PATCH 5/8] gh-145966: Fix _csv DIALECT_GETATTR macro silently masking non-AttributeError exceptions (GH-145974) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The DIALECT_GETATTR macro in dialect_new() unconditionally called PyErr_Clear() when PyObject_GetAttrString() failed, which suppressed all exceptions including MemoryError, KeyboardInterrupt, and RuntimeError. Now only AttributeError is cleared; other exceptions propagate via the existing error handling path. Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/test/test_csv.py | 13 +++++++++++++ ...026-03-15-00-00-00.gh-issue-145966.tCI0uD4I.rst | 2 ++ Modules/_csv.c | 14 +++++++------- 3 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2026-03-15-00-00-00.gh-issue-145966.tCI0uD4I.rst diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py index df79840088abc3..2e5b72742c3f41 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -1280,6 +1280,19 @@ class mydialect(csv.Dialect): self.assertRaises(ValueError, create_invalid, field_name, " ", skipinitialspace=True) + def test_dialect_getattr_non_attribute_error_propagates(self): + # gh-145966: non-AttributeError exceptions raised by __getattr__ + # during dialect attribute lookup must propagate, not be silenced. + class BadDialect: + def __getattr__(self, name): + raise RuntimeError("boom") + + with self.assertRaises(RuntimeError): + csv.reader([], dialect=BadDialect()) + + with self.assertRaises(RuntimeError): + csv.writer(StringIO(), dialect=BadDialect()) + class TestSniffer(unittest.TestCase): sample1 = """\ diff --git a/Misc/NEWS.d/next/Library/2026-03-15-00-00-00.gh-issue-145966.tCI0uD4I.rst b/Misc/NEWS.d/next/Library/2026-03-15-00-00-00.gh-issue-145966.tCI0uD4I.rst new file mode 100644 index 00000000000000..c0d4907ada073c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-03-15-00-00-00.gh-issue-145966.tCI0uD4I.rst @@ -0,0 +1,2 @@ +Non-:exc:`AttributeError` exceptions raised during dialect attribute lookup +in :mod:`csv` are no longer silently suppressed. diff --git a/Modules/_csv.c b/Modules/_csv.c index 1f41976e95fdb1..c48f44c0f07867 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -497,13 +497,13 @@ dialect_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) Py_XINCREF(skipinitialspace); Py_XINCREF(strict); if (dialect != NULL) { -#define DIALECT_GETATTR(v, n) \ - do { \ - if (v == NULL) { \ - v = PyObject_GetAttrString(dialect, n); \ - if (v == NULL) \ - PyErr_Clear(); \ - } \ +#define DIALECT_GETATTR(v, n) \ + do { \ + if (v == NULL) { \ + if (PyObject_GetOptionalAttrString(dialect, n, &v) < 0) { \ + goto err; \ + } \ + } \ } while (0) DIALECT_GETATTR(delimiter, "delimiter"); DIALECT_GETATTR(doublequote, "doublequote"); From ff287a72de43e7fc6517aba9049cb23470e000b2 Mon Sep 17 00:00:00 2001 From: "Michiel W. Beijen" Date: Tue, 17 Mar 2026 18:01:18 +0100 Subject: [PATCH 6/8] gh-144975: Fix wave.Wave_write.setframerate() validation order (GH-144976) Validate the frame rate after rounding to an integer, not before. This prevents values like 0.5 from passing validation (0.5 > 0) but then rounding to 0, which would cause a confusing delayed error "sampling rate not specified" when writing frames. With this fix, setframerate(0.5) immediately raises "bad frame rate", providing clear feedback at the point of the error. --- Lib/test/test_wave.py | 37 +++++++++++++++++++ Lib/wave.py | 3 +- ...-02-18-21-45-00.gh-issue-144975.Ab3XyZ.rst | 3 ++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2026-02-18-21-45-00.gh-issue-144975.Ab3XyZ.rst diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py index 4c21f16553775c..05e7d377517798 100644 --- a/Lib/test/test_wave.py +++ b/Lib/test/test_wave.py @@ -207,6 +207,43 @@ def test_open_in_write_raises(self): support.gc_collect() self.assertIsNone(cm.unraisable) + @support.subTests('arg', ( + # rounds to 0, should raise: + 0.5, + 0.4, + # Negative values should still raise: + -1, + -0.5, + -0.4, + # 0 should raise: + 0, + )) + def test_setframerate_validates_rounded_values(self, arg): + """Test that setframerate that round to 0 or negative are rejected""" + with wave.open(io.BytesIO(), 'wb') as f: + f.setnchannels(1) + f.setsampwidth(2) + with self.assertRaises(wave.Error): + f.setframerate(arg) + with self.assertRaises(wave.Error): + f.close() + + @support.subTests(('arg', 'expected'), ( + (1.4, 1), + (1.5, 2), + (1.6, 2), + (44100.4, 44100), + (44100.5, 44100), + (44100.6, 44101), + )) + def test_setframerate_rounds(self, arg, expected): + """Test that setframerate is rounded""" + with wave.open(io.BytesIO(), 'wb') as f: + f.setnchannels(1) + f.setsampwidth(2) + f.setframerate(arg) + self.assertEqual(f.getframerate(), expected) + class WaveOpen(unittest.TestCase): def test_open_pathlike(self): diff --git a/Lib/wave.py b/Lib/wave.py index 25ca9ef168e8a5..841da8c49e9a2f 100644 --- a/Lib/wave.py +++ b/Lib/wave.py @@ -493,9 +493,10 @@ def getsampwidth(self): def setframerate(self, framerate): if self._datawritten: raise Error('cannot change parameters after starting to write') + framerate = int(round(framerate)) if framerate <= 0: raise Error('bad frame rate') - self._framerate = int(round(framerate)) + self._framerate = framerate def getframerate(self): if not self._framerate: diff --git a/Misc/NEWS.d/next/Library/2026-02-18-21-45-00.gh-issue-144975.Ab3XyZ.rst b/Misc/NEWS.d/next/Library/2026-02-18-21-45-00.gh-issue-144975.Ab3XyZ.rst new file mode 100644 index 00000000000000..37658064c2c351 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-02-18-21-45-00.gh-issue-144975.Ab3XyZ.rst @@ -0,0 +1,3 @@ +:meth:`wave.Wave_write.setframerate` now validates the frame rate after +rounding to an integer, preventing values like ``0.5`` from being accepted +and causing confusing errors later. Patch by Michiel Beijen. From 966fc8153141ef41885dc36ab3522487657c06fe Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Wed, 18 Mar 2026 01:19:44 +0800 Subject: [PATCH 7/8] gh-146058: Fix _GUARD_CODE_VERSION_* (GH-146060) --- Include/internal/pycore_uop_ids.h | 2179 ++++++++++++------------ Include/internal/pycore_uop_metadata.h | 95 +- Python/bytecodes.c | 33 +- Python/executor_cases.c.h | 334 +++- Python/optimizer.c | 35 +- Python/optimizer_bytecodes.c | 13 - Python/optimizer_cases.c.h | 22 +- 7 files changed, 1557 insertions(+), 1154 deletions(-) diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h index d29d98d3f16697..b00e522c09a49a 100644 --- a/Include/internal/pycore_uop_ids.h +++ b/Include/internal/pycore_uop_ids.h @@ -147,63 +147,66 @@ extern "C" { #define _GUARD_CALLABLE_STR_1 403 #define _GUARD_CALLABLE_TUPLE_1 404 #define _GUARD_CALLABLE_TYPE_1 405 -#define _GUARD_CODE_VERSION 406 -#define _GUARD_DORV_NO_DICT 407 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 408 -#define _GUARD_GLOBALS_VERSION 409 -#define _GUARD_IP_RETURN_GENERATOR 410 -#define _GUARD_IP_RETURN_VALUE 411 -#define _GUARD_IP_YIELD_VALUE 412 -#define _GUARD_IP__PUSH_FRAME 413 -#define _GUARD_IS_FALSE_POP 414 -#define _GUARD_IS_NONE_POP 415 -#define _GUARD_IS_NOT_NONE_POP 416 -#define _GUARD_IS_TRUE_POP 417 -#define _GUARD_KEYS_VERSION 418 -#define _GUARD_NOS_ANY_DICT 419 -#define _GUARD_NOS_COMPACT_ASCII 420 -#define _GUARD_NOS_DICT 421 -#define _GUARD_NOS_FLOAT 422 -#define _GUARD_NOS_INT 423 -#define _GUARD_NOS_LIST 424 -#define _GUARD_NOS_NOT_NULL 425 -#define _GUARD_NOS_NULL 426 -#define _GUARD_NOS_OVERFLOWED 427 -#define _GUARD_NOS_TUPLE 428 -#define _GUARD_NOS_UNICODE 429 -#define _GUARD_NOT_EXHAUSTED_LIST 430 -#define _GUARD_NOT_EXHAUSTED_RANGE 431 -#define _GUARD_NOT_EXHAUSTED_TUPLE 432 -#define _GUARD_THIRD_NULL 433 -#define _GUARD_TOS_ANY_DICT 434 -#define _GUARD_TOS_ANY_SET 435 -#define _GUARD_TOS_DICT 436 -#define _GUARD_TOS_FLOAT 437 -#define _GUARD_TOS_FROZENDICT 438 -#define _GUARD_TOS_FROZENSET 439 -#define _GUARD_TOS_INT 440 -#define _GUARD_TOS_LIST 441 -#define _GUARD_TOS_OVERFLOWED 442 -#define _GUARD_TOS_SET 443 -#define _GUARD_TOS_SLICE 444 -#define _GUARD_TOS_TUPLE 445 -#define _GUARD_TOS_UNICODE 446 -#define _GUARD_TYPE_VERSION 447 -#define _GUARD_TYPE_VERSION_LOCKED 448 -#define _HANDLE_PENDING_AND_DEOPT 449 +#define _GUARD_CODE_VERSION_RETURN_GENERATOR 406 +#define _GUARD_CODE_VERSION_RETURN_VALUE 407 +#define _GUARD_CODE_VERSION_YIELD_VALUE 408 +#define _GUARD_CODE_VERSION__PUSH_FRAME 409 +#define _GUARD_DORV_NO_DICT 410 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 411 +#define _GUARD_GLOBALS_VERSION 412 +#define _GUARD_IP_RETURN_GENERATOR 413 +#define _GUARD_IP_RETURN_VALUE 414 +#define _GUARD_IP_YIELD_VALUE 415 +#define _GUARD_IP__PUSH_FRAME 416 +#define _GUARD_IS_FALSE_POP 417 +#define _GUARD_IS_NONE_POP 418 +#define _GUARD_IS_NOT_NONE_POP 419 +#define _GUARD_IS_TRUE_POP 420 +#define _GUARD_KEYS_VERSION 421 +#define _GUARD_NOS_ANY_DICT 422 +#define _GUARD_NOS_COMPACT_ASCII 423 +#define _GUARD_NOS_DICT 424 +#define _GUARD_NOS_FLOAT 425 +#define _GUARD_NOS_INT 426 +#define _GUARD_NOS_LIST 427 +#define _GUARD_NOS_NOT_NULL 428 +#define _GUARD_NOS_NULL 429 +#define _GUARD_NOS_OVERFLOWED 430 +#define _GUARD_NOS_TUPLE 431 +#define _GUARD_NOS_UNICODE 432 +#define _GUARD_NOT_EXHAUSTED_LIST 433 +#define _GUARD_NOT_EXHAUSTED_RANGE 434 +#define _GUARD_NOT_EXHAUSTED_TUPLE 435 +#define _GUARD_THIRD_NULL 436 +#define _GUARD_TOS_ANY_DICT 437 +#define _GUARD_TOS_ANY_SET 438 +#define _GUARD_TOS_DICT 439 +#define _GUARD_TOS_FLOAT 440 +#define _GUARD_TOS_FROZENDICT 441 +#define _GUARD_TOS_FROZENSET 442 +#define _GUARD_TOS_INT 443 +#define _GUARD_TOS_LIST 444 +#define _GUARD_TOS_OVERFLOWED 445 +#define _GUARD_TOS_SET 446 +#define _GUARD_TOS_SLICE 447 +#define _GUARD_TOS_TUPLE 448 +#define _GUARD_TOS_UNICODE 449 +#define _GUARD_TYPE_VERSION 450 +#define _GUARD_TYPE_VERSION_LOCKED 451 +#define _HANDLE_PENDING_AND_DEOPT 452 #define _IMPORT_FROM IMPORT_FROM #define _IMPORT_NAME IMPORT_NAME -#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 450 -#define _INIT_CALL_PY_EXACT_ARGS 451 -#define _INIT_CALL_PY_EXACT_ARGS_0 452 -#define _INIT_CALL_PY_EXACT_ARGS_1 453 -#define _INIT_CALL_PY_EXACT_ARGS_2 454 -#define _INIT_CALL_PY_EXACT_ARGS_3 455 -#define _INIT_CALL_PY_EXACT_ARGS_4 456 -#define _INSERT_1_LOAD_CONST_INLINE 457 -#define _INSERT_1_LOAD_CONST_INLINE_BORROW 458 -#define _INSERT_2_LOAD_CONST_INLINE_BORROW 459 -#define _INSERT_NULL 460 +#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 453 +#define _INIT_CALL_PY_EXACT_ARGS 454 +#define _INIT_CALL_PY_EXACT_ARGS_0 455 +#define _INIT_CALL_PY_EXACT_ARGS_1 456 +#define _INIT_CALL_PY_EXACT_ARGS_2 457 +#define _INIT_CALL_PY_EXACT_ARGS_3 458 +#define _INIT_CALL_PY_EXACT_ARGS_4 459 +#define _INSERT_1_LOAD_CONST_INLINE 460 +#define _INSERT_1_LOAD_CONST_INLINE_BORROW 461 +#define _INSERT_2_LOAD_CONST_INLINE_BORROW 462 +#define _INSERT_NULL 463 #define _INSTRUMENTED_FOR_ITER INSTRUMENTED_FOR_ITER #define _INSTRUMENTED_INSTRUCTION INSTRUMENTED_INSTRUCTION #define _INSTRUMENTED_JUMP_FORWARD INSTRUMENTED_JUMP_FORWARD @@ -213,1075 +216,1087 @@ extern "C" { #define _INSTRUMENTED_POP_JUMP_IF_NONE INSTRUMENTED_POP_JUMP_IF_NONE #define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE INSTRUMENTED_POP_JUMP_IF_NOT_NONE #define _INSTRUMENTED_POP_JUMP_IF_TRUE INSTRUMENTED_POP_JUMP_IF_TRUE -#define _IS_NONE 461 -#define _IS_OP 462 -#define _ITER_CHECK_LIST 463 -#define _ITER_CHECK_RANGE 464 -#define _ITER_CHECK_TUPLE 465 -#define _ITER_JUMP_LIST 466 -#define _ITER_JUMP_RANGE 467 -#define _ITER_JUMP_TUPLE 468 -#define _ITER_NEXT_LIST 469 -#define _ITER_NEXT_LIST_TIER_TWO 470 -#define _ITER_NEXT_RANGE 471 -#define _ITER_NEXT_TUPLE 472 +#define _IS_NONE 464 +#define _IS_OP 465 +#define _ITER_CHECK_LIST 466 +#define _ITER_CHECK_RANGE 467 +#define _ITER_CHECK_TUPLE 468 +#define _ITER_JUMP_LIST 469 +#define _ITER_JUMP_RANGE 470 +#define _ITER_JUMP_TUPLE 471 +#define _ITER_NEXT_LIST 472 +#define _ITER_NEXT_LIST_TIER_TWO 473 +#define _ITER_NEXT_RANGE 474 +#define _ITER_NEXT_TUPLE 475 #define _JUMP_BACKWARD_NO_INTERRUPT JUMP_BACKWARD_NO_INTERRUPT -#define _JUMP_TO_TOP 473 +#define _JUMP_TO_TOP 476 #define _LIST_APPEND LIST_APPEND #define _LIST_EXTEND LIST_EXTEND -#define _LOAD_ATTR 474 -#define _LOAD_ATTR_CLASS 475 +#define _LOAD_ATTR 477 +#define _LOAD_ATTR_CLASS 478 #define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN -#define _LOAD_ATTR_INSTANCE_VALUE 476 -#define _LOAD_ATTR_METHOD_LAZY_DICT 477 -#define _LOAD_ATTR_METHOD_NO_DICT 478 -#define _LOAD_ATTR_METHOD_WITH_VALUES 479 -#define _LOAD_ATTR_MODULE 480 -#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 481 -#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 482 -#define _LOAD_ATTR_PROPERTY_FRAME 483 -#define _LOAD_ATTR_SLOT 484 -#define _LOAD_ATTR_WITH_HINT 485 +#define _LOAD_ATTR_INSTANCE_VALUE 479 +#define _LOAD_ATTR_METHOD_LAZY_DICT 480 +#define _LOAD_ATTR_METHOD_NO_DICT 481 +#define _LOAD_ATTR_METHOD_WITH_VALUES 482 +#define _LOAD_ATTR_MODULE 483 +#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 484 +#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 485 +#define _LOAD_ATTR_PROPERTY_FRAME 486 +#define _LOAD_ATTR_SLOT 487 +#define _LOAD_ATTR_WITH_HINT 488 #define _LOAD_BUILD_CLASS LOAD_BUILD_CLASS -#define _LOAD_BYTECODE 486 +#define _LOAD_BYTECODE 489 #define _LOAD_COMMON_CONSTANT LOAD_COMMON_CONSTANT #define _LOAD_CONST LOAD_CONST -#define _LOAD_CONST_INLINE 487 -#define _LOAD_CONST_INLINE_BORROW 488 -#define _LOAD_CONST_UNDER_INLINE 489 -#define _LOAD_CONST_UNDER_INLINE_BORROW 490 +#define _LOAD_CONST_INLINE 490 +#define _LOAD_CONST_INLINE_BORROW 491 +#define _LOAD_CONST_UNDER_INLINE 492 +#define _LOAD_CONST_UNDER_INLINE_BORROW 493 #define _LOAD_DEREF LOAD_DEREF -#define _LOAD_FAST 491 -#define _LOAD_FAST_0 492 -#define _LOAD_FAST_1 493 -#define _LOAD_FAST_2 494 -#define _LOAD_FAST_3 495 -#define _LOAD_FAST_4 496 -#define _LOAD_FAST_5 497 -#define _LOAD_FAST_6 498 -#define _LOAD_FAST_7 499 +#define _LOAD_FAST 494 +#define _LOAD_FAST_0 495 +#define _LOAD_FAST_1 496 +#define _LOAD_FAST_2 497 +#define _LOAD_FAST_3 498 +#define _LOAD_FAST_4 499 +#define _LOAD_FAST_5 500 +#define _LOAD_FAST_6 501 +#define _LOAD_FAST_7 502 #define _LOAD_FAST_AND_CLEAR LOAD_FAST_AND_CLEAR -#define _LOAD_FAST_BORROW 500 -#define _LOAD_FAST_BORROW_0 501 -#define _LOAD_FAST_BORROW_1 502 -#define _LOAD_FAST_BORROW_2 503 -#define _LOAD_FAST_BORROW_3 504 -#define _LOAD_FAST_BORROW_4 505 -#define _LOAD_FAST_BORROW_5 506 -#define _LOAD_FAST_BORROW_6 507 -#define _LOAD_FAST_BORROW_7 508 +#define _LOAD_FAST_BORROW 503 +#define _LOAD_FAST_BORROW_0 504 +#define _LOAD_FAST_BORROW_1 505 +#define _LOAD_FAST_BORROW_2 506 +#define _LOAD_FAST_BORROW_3 507 +#define _LOAD_FAST_BORROW_4 508 +#define _LOAD_FAST_BORROW_5 509 +#define _LOAD_FAST_BORROW_6 510 +#define _LOAD_FAST_BORROW_7 511 #define _LOAD_FAST_CHECK LOAD_FAST_CHECK #define _LOAD_FROM_DICT_OR_DEREF LOAD_FROM_DICT_OR_DEREF #define _LOAD_FROM_DICT_OR_GLOBALS LOAD_FROM_DICT_OR_GLOBALS -#define _LOAD_GLOBAL 509 -#define _LOAD_GLOBAL_BUILTINS 510 -#define _LOAD_GLOBAL_MODULE 511 +#define _LOAD_GLOBAL 512 +#define _LOAD_GLOBAL_BUILTINS 513 +#define _LOAD_GLOBAL_MODULE 514 #define _LOAD_LOCALS LOAD_LOCALS #define _LOAD_NAME LOAD_NAME -#define _LOAD_SMALL_INT 512 -#define _LOAD_SMALL_INT_0 513 -#define _LOAD_SMALL_INT_1 514 -#define _LOAD_SMALL_INT_2 515 -#define _LOAD_SMALL_INT_3 516 -#define _LOAD_SPECIAL 517 +#define _LOAD_SMALL_INT 515 +#define _LOAD_SMALL_INT_0 516 +#define _LOAD_SMALL_INT_1 517 +#define _LOAD_SMALL_INT_2 518 +#define _LOAD_SMALL_INT_3 519 +#define _LOAD_SPECIAL 520 #define _LOAD_SUPER_ATTR_ATTR LOAD_SUPER_ATTR_ATTR #define _LOAD_SUPER_ATTR_METHOD LOAD_SUPER_ATTR_METHOD -#define _LOCK_OBJECT 518 -#define _MAKE_CALLARGS_A_TUPLE 519 +#define _LOCK_OBJECT 521 +#define _MAKE_CALLARGS_A_TUPLE 522 #define _MAKE_CELL MAKE_CELL #define _MAKE_FUNCTION MAKE_FUNCTION -#define _MAKE_HEAP_SAFE 520 -#define _MAKE_WARM 521 +#define _MAKE_HEAP_SAFE 523 +#define _MAKE_WARM 524 #define _MAP_ADD MAP_ADD -#define _MATCH_CLASS 522 +#define _MATCH_CLASS 525 #define _MATCH_KEYS MATCH_KEYS #define _MATCH_MAPPING MATCH_MAPPING #define _MATCH_SEQUENCE MATCH_SEQUENCE -#define _MAYBE_EXPAND_METHOD 523 -#define _MAYBE_EXPAND_METHOD_KW 524 -#define _MONITOR_CALL 525 -#define _MONITOR_CALL_KW 526 -#define _MONITOR_JUMP_BACKWARD 527 -#define _MONITOR_RESUME 528 +#define _MAYBE_EXPAND_METHOD 526 +#define _MAYBE_EXPAND_METHOD_KW 527 +#define _MONITOR_CALL 528 +#define _MONITOR_CALL_KW 529 +#define _MONITOR_JUMP_BACKWARD 530 +#define _MONITOR_RESUME 531 #define _NOP NOP -#define _POP_CALL 529 -#define _POP_CALL_LOAD_CONST_INLINE_BORROW 530 -#define _POP_CALL_ONE 531 -#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW 532 -#define _POP_CALL_TWO 533 -#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW 534 +#define _POP_CALL 532 +#define _POP_CALL_LOAD_CONST_INLINE_BORROW 533 +#define _POP_CALL_ONE 534 +#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW 535 +#define _POP_CALL_TWO 536 +#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW 537 #define _POP_EXCEPT POP_EXCEPT #define _POP_ITER POP_ITER -#define _POP_JUMP_IF_FALSE 535 -#define _POP_JUMP_IF_TRUE 536 +#define _POP_JUMP_IF_FALSE 538 +#define _POP_JUMP_IF_TRUE 539 #define _POP_TOP POP_TOP -#define _POP_TOP_FLOAT 537 -#define _POP_TOP_INT 538 -#define _POP_TOP_LOAD_CONST_INLINE 539 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW 540 -#define _POP_TOP_NOP 541 -#define _POP_TOP_UNICODE 542 -#define _POP_TWO 543 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW 544 +#define _POP_TOP_FLOAT 540 +#define _POP_TOP_INT 541 +#define _POP_TOP_LOAD_CONST_INLINE 542 +#define _POP_TOP_LOAD_CONST_INLINE_BORROW 543 +#define _POP_TOP_NOP 544 +#define _POP_TOP_UNICODE 545 +#define _POP_TWO 546 +#define _POP_TWO_LOAD_CONST_INLINE_BORROW 547 #define _PUSH_EXC_INFO PUSH_EXC_INFO -#define _PUSH_FRAME 545 +#define _PUSH_FRAME 548 #define _PUSH_NULL PUSH_NULL -#define _PUSH_NULL_CONDITIONAL 546 -#define _PY_FRAME_EX 547 -#define _PY_FRAME_GENERAL 548 -#define _PY_FRAME_KW 549 -#define _RECORD_4OS 550 -#define _RECORD_BOUND_METHOD 551 -#define _RECORD_CALLABLE 552 -#define _RECORD_CODE 553 -#define _RECORD_NOS 554 -#define _RECORD_NOS_GEN_FUNC 555 -#define _RECORD_TOS 556 -#define _RECORD_TOS_TYPE 557 -#define _REPLACE_WITH_TRUE 558 -#define _RESUME_CHECK 559 +#define _PUSH_NULL_CONDITIONAL 549 +#define _PY_FRAME_EX 550 +#define _PY_FRAME_GENERAL 551 +#define _PY_FRAME_KW 552 +#define _RECORD_4OS 553 +#define _RECORD_BOUND_METHOD 554 +#define _RECORD_CALLABLE 555 +#define _RECORD_CODE 556 +#define _RECORD_NOS 557 +#define _RECORD_NOS_GEN_FUNC 558 +#define _RECORD_TOS 559 +#define _RECORD_TOS_TYPE 560 +#define _REPLACE_WITH_TRUE 561 +#define _RESUME_CHECK 562 #define _RETURN_GENERATOR RETURN_GENERATOR -#define _RETURN_VALUE 560 -#define _SAVE_RETURN_OFFSET 561 -#define _SEND 562 -#define _SEND_GEN_FRAME 563 +#define _RETURN_VALUE 563 +#define _SAVE_RETURN_OFFSET 564 +#define _SEND 565 +#define _SEND_GEN_FRAME 566 #define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS #define _SET_ADD SET_ADD #define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE #define _SET_UPDATE SET_UPDATE -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW 564 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW 565 -#define _SPILL_OR_RELOAD 566 -#define _START_EXECUTOR 567 -#define _STORE_ATTR 568 -#define _STORE_ATTR_INSTANCE_VALUE 569 -#define _STORE_ATTR_SLOT 570 -#define _STORE_ATTR_WITH_HINT 571 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW 567 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW 568 +#define _SPILL_OR_RELOAD 569 +#define _START_EXECUTOR 570 +#define _STORE_ATTR 571 +#define _STORE_ATTR_INSTANCE_VALUE 572 +#define _STORE_ATTR_SLOT 573 +#define _STORE_ATTR_WITH_HINT 574 #define _STORE_DEREF STORE_DEREF #define _STORE_GLOBAL STORE_GLOBAL #define _STORE_NAME STORE_NAME -#define _STORE_SLICE 572 -#define _STORE_SUBSCR 573 -#define _STORE_SUBSCR_DICT 574 -#define _STORE_SUBSCR_LIST_INT 575 -#define _SWAP 576 -#define _SWAP_2 577 -#define _SWAP_3 578 -#define _SWAP_FAST 579 -#define _SWAP_FAST_0 580 -#define _SWAP_FAST_1 581 -#define _SWAP_FAST_2 582 -#define _SWAP_FAST_3 583 -#define _SWAP_FAST_4 584 -#define _SWAP_FAST_5 585 -#define _SWAP_FAST_6 586 -#define _SWAP_FAST_7 587 -#define _TIER2_RESUME_CHECK 588 -#define _TO_BOOL 589 +#define _STORE_SLICE 575 +#define _STORE_SUBSCR 576 +#define _STORE_SUBSCR_DICT 577 +#define _STORE_SUBSCR_LIST_INT 578 +#define _SWAP 579 +#define _SWAP_2 580 +#define _SWAP_3 581 +#define _SWAP_FAST 582 +#define _SWAP_FAST_0 583 +#define _SWAP_FAST_1 584 +#define _SWAP_FAST_2 585 +#define _SWAP_FAST_3 586 +#define _SWAP_FAST_4 587 +#define _SWAP_FAST_5 588 +#define _SWAP_FAST_6 589 +#define _SWAP_FAST_7 590 +#define _TIER2_RESUME_CHECK 591 +#define _TO_BOOL 592 #define _TO_BOOL_BOOL TO_BOOL_BOOL -#define _TO_BOOL_INT 590 -#define _TO_BOOL_LIST 591 +#define _TO_BOOL_INT 593 +#define _TO_BOOL_LIST 594 #define _TO_BOOL_NONE TO_BOOL_NONE -#define _TO_BOOL_STR 592 +#define _TO_BOOL_STR 595 #define _TRACE_RECORD TRACE_RECORD -#define _UNARY_INVERT 593 -#define _UNARY_NEGATIVE 594 +#define _UNARY_INVERT 596 +#define _UNARY_NEGATIVE 597 #define _UNARY_NOT UNARY_NOT #define _UNPACK_EX UNPACK_EX -#define _UNPACK_SEQUENCE 595 -#define _UNPACK_SEQUENCE_LIST 596 -#define _UNPACK_SEQUENCE_TUPLE 597 -#define _UNPACK_SEQUENCE_TWO_TUPLE 598 +#define _UNPACK_SEQUENCE 598 +#define _UNPACK_SEQUENCE_LIST 599 +#define _UNPACK_SEQUENCE_TUPLE 600 +#define _UNPACK_SEQUENCE_TWO_TUPLE 601 #define _WITH_EXCEPT_START WITH_EXCEPT_START -#define _YIELD_VALUE 599 -#define MAX_UOP_ID 599 -#define _BINARY_OP_r23 600 -#define _BINARY_OP_ADD_FLOAT_r03 601 -#define _BINARY_OP_ADD_FLOAT_r13 602 -#define _BINARY_OP_ADD_FLOAT_r23 603 -#define _BINARY_OP_ADD_INT_r03 604 -#define _BINARY_OP_ADD_INT_r13 605 -#define _BINARY_OP_ADD_INT_r23 606 -#define _BINARY_OP_ADD_UNICODE_r03 607 -#define _BINARY_OP_ADD_UNICODE_r13 608 -#define _BINARY_OP_ADD_UNICODE_r23 609 -#define _BINARY_OP_EXTEND_r23 610 -#define _BINARY_OP_INPLACE_ADD_UNICODE_r21 611 -#define _BINARY_OP_MULTIPLY_FLOAT_r03 612 -#define _BINARY_OP_MULTIPLY_FLOAT_r13 613 -#define _BINARY_OP_MULTIPLY_FLOAT_r23 614 -#define _BINARY_OP_MULTIPLY_INT_r03 615 -#define _BINARY_OP_MULTIPLY_INT_r13 616 -#define _BINARY_OP_MULTIPLY_INT_r23 617 -#define _BINARY_OP_SUBSCR_CHECK_FUNC_r23 618 -#define _BINARY_OP_SUBSCR_DICT_r23 619 -#define _BINARY_OP_SUBSCR_INIT_CALL_r01 620 -#define _BINARY_OP_SUBSCR_INIT_CALL_r11 621 -#define _BINARY_OP_SUBSCR_INIT_CALL_r21 622 -#define _BINARY_OP_SUBSCR_INIT_CALL_r31 623 -#define _BINARY_OP_SUBSCR_LIST_INT_r23 624 -#define _BINARY_OP_SUBSCR_LIST_SLICE_r23 625 -#define _BINARY_OP_SUBSCR_STR_INT_r23 626 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r03 627 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r13 628 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r23 629 -#define _BINARY_OP_SUBSCR_USTR_INT_r23 630 -#define _BINARY_OP_SUBTRACT_FLOAT_r03 631 -#define _BINARY_OP_SUBTRACT_FLOAT_r13 632 -#define _BINARY_OP_SUBTRACT_FLOAT_r23 633 -#define _BINARY_OP_SUBTRACT_INT_r03 634 -#define _BINARY_OP_SUBTRACT_INT_r13 635 -#define _BINARY_OP_SUBTRACT_INT_r23 636 -#define _BINARY_SLICE_r31 637 -#define _BUILD_INTERPOLATION_r01 638 -#define _BUILD_LIST_r01 639 -#define _BUILD_MAP_r01 640 -#define _BUILD_SET_r01 641 -#define _BUILD_SLICE_r01 642 -#define _BUILD_STRING_r01 643 -#define _BUILD_TEMPLATE_r21 644 -#define _BUILD_TUPLE_r01 645 -#define _CALL_BUILTIN_CLASS_r01 646 -#define _CALL_BUILTIN_FAST_r01 647 -#define _CALL_BUILTIN_FAST_WITH_KEYWORDS_r01 648 -#define _CALL_BUILTIN_O_r03 649 -#define _CALL_FUNCTION_EX_NON_PY_GENERAL_r31 650 -#define _CALL_INTRINSIC_1_r12 651 -#define _CALL_INTRINSIC_2_r21 652 -#define _CALL_ISINSTANCE_r31 653 -#define _CALL_KW_NON_PY_r11 654 -#define _CALL_LEN_r33 655 -#define _CALL_LIST_APPEND_r03 656 -#define _CALL_LIST_APPEND_r13 657 -#define _CALL_LIST_APPEND_r23 658 -#define _CALL_LIST_APPEND_r33 659 -#define _CALL_METHOD_DESCRIPTOR_FAST_r01 660 -#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r01 661 -#define _CALL_METHOD_DESCRIPTOR_NOARGS_r01 662 -#define _CALL_METHOD_DESCRIPTOR_O_r03 663 -#define _CALL_NON_PY_GENERAL_r01 664 -#define _CALL_STR_1_r32 665 -#define _CALL_TUPLE_1_r32 666 -#define _CALL_TYPE_1_r02 667 -#define _CALL_TYPE_1_r12 668 -#define _CALL_TYPE_1_r22 669 -#define _CALL_TYPE_1_r32 670 -#define _CHECK_AND_ALLOCATE_OBJECT_r00 671 -#define _CHECK_ATTR_CLASS_r01 672 -#define _CHECK_ATTR_CLASS_r11 673 -#define _CHECK_ATTR_CLASS_r22 674 -#define _CHECK_ATTR_CLASS_r33 675 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r01 676 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r11 677 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r22 678 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r33 679 -#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS_r00 680 -#define _CHECK_EG_MATCH_r22 681 -#define _CHECK_EXC_MATCH_r22 682 -#define _CHECK_FUNCTION_EXACT_ARGS_r00 683 -#define _CHECK_FUNCTION_VERSION_r00 684 -#define _CHECK_FUNCTION_VERSION_INLINE_r00 685 -#define _CHECK_FUNCTION_VERSION_INLINE_r11 686 -#define _CHECK_FUNCTION_VERSION_INLINE_r22 687 -#define _CHECK_FUNCTION_VERSION_INLINE_r33 688 -#define _CHECK_FUNCTION_VERSION_KW_r11 689 -#define _CHECK_IS_NOT_PY_CALLABLE_r00 690 -#define _CHECK_IS_NOT_PY_CALLABLE_EX_r03 691 -#define _CHECK_IS_NOT_PY_CALLABLE_EX_r13 692 -#define _CHECK_IS_NOT_PY_CALLABLE_EX_r23 693 -#define _CHECK_IS_NOT_PY_CALLABLE_EX_r33 694 -#define _CHECK_IS_NOT_PY_CALLABLE_KW_r11 695 -#define _CHECK_IS_PY_CALLABLE_EX_r03 696 -#define _CHECK_IS_PY_CALLABLE_EX_r13 697 -#define _CHECK_IS_PY_CALLABLE_EX_r23 698 -#define _CHECK_IS_PY_CALLABLE_EX_r33 699 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r01 700 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r11 701 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r22 702 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r33 703 -#define _CHECK_METHOD_VERSION_r00 704 -#define _CHECK_METHOD_VERSION_KW_r11 705 -#define _CHECK_PEP_523_r00 706 -#define _CHECK_PEP_523_r11 707 -#define _CHECK_PEP_523_r22 708 -#define _CHECK_PEP_523_r33 709 -#define _CHECK_PERIODIC_r00 710 -#define _CHECK_PERIODIC_AT_END_r00 711 -#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM_r00 712 -#define _CHECK_RECURSION_REMAINING_r00 713 -#define _CHECK_RECURSION_REMAINING_r11 714 -#define _CHECK_RECURSION_REMAINING_r22 715 -#define _CHECK_RECURSION_REMAINING_r33 716 -#define _CHECK_STACK_SPACE_r00 717 -#define _CHECK_STACK_SPACE_OPERAND_r00 718 -#define _CHECK_STACK_SPACE_OPERAND_r11 719 -#define _CHECK_STACK_SPACE_OPERAND_r22 720 -#define _CHECK_STACK_SPACE_OPERAND_r33 721 -#define _CHECK_VALIDITY_r00 722 -#define _CHECK_VALIDITY_r11 723 -#define _CHECK_VALIDITY_r22 724 -#define _CHECK_VALIDITY_r33 725 -#define _COLD_DYNAMIC_EXIT_r00 726 -#define _COLD_EXIT_r00 727 -#define _COMPARE_OP_r21 728 -#define _COMPARE_OP_FLOAT_r03 729 -#define _COMPARE_OP_FLOAT_r13 730 -#define _COMPARE_OP_FLOAT_r23 731 -#define _COMPARE_OP_INT_r23 732 -#define _COMPARE_OP_STR_r23 733 -#define _CONTAINS_OP_r23 734 -#define _CONTAINS_OP_DICT_r23 735 -#define _CONTAINS_OP_SET_r23 736 -#define _CONVERT_VALUE_r11 737 -#define _COPY_r01 738 -#define _COPY_1_r02 739 -#define _COPY_1_r12 740 -#define _COPY_1_r23 741 -#define _COPY_2_r03 742 -#define _COPY_2_r13 743 -#define _COPY_2_r23 744 -#define _COPY_3_r03 745 -#define _COPY_3_r13 746 -#define _COPY_3_r23 747 -#define _COPY_3_r33 748 -#define _COPY_FREE_VARS_r00 749 -#define _COPY_FREE_VARS_r11 750 -#define _COPY_FREE_VARS_r22 751 -#define _COPY_FREE_VARS_r33 752 -#define _CREATE_INIT_FRAME_r01 753 -#define _DELETE_ATTR_r10 754 -#define _DELETE_DEREF_r00 755 -#define _DELETE_FAST_r00 756 -#define _DELETE_GLOBAL_r00 757 -#define _DELETE_NAME_r00 758 -#define _DELETE_SUBSCR_r20 759 -#define _DEOPT_r00 760 -#define _DEOPT_r10 761 -#define _DEOPT_r20 762 -#define _DEOPT_r30 763 -#define _DICT_MERGE_r10 764 -#define _DICT_UPDATE_r10 765 -#define _DO_CALL_r01 766 -#define _DO_CALL_FUNCTION_EX_r31 767 -#define _DO_CALL_KW_r11 768 -#define _DYNAMIC_EXIT_r00 769 -#define _DYNAMIC_EXIT_r10 770 -#define _DYNAMIC_EXIT_r20 771 -#define _DYNAMIC_EXIT_r30 772 -#define _END_FOR_r10 773 -#define _END_SEND_r21 774 -#define _ERROR_POP_N_r00 775 -#define _EXIT_INIT_CHECK_r10 776 -#define _EXIT_TRACE_r00 777 -#define _EXIT_TRACE_r10 778 -#define _EXIT_TRACE_r20 779 -#define _EXIT_TRACE_r30 780 -#define _EXPAND_METHOD_r00 781 -#define _EXPAND_METHOD_KW_r11 782 -#define _FATAL_ERROR_r00 783 -#define _FATAL_ERROR_r11 784 -#define _FATAL_ERROR_r22 785 -#define _FATAL_ERROR_r33 786 -#define _FORMAT_SIMPLE_r11 787 -#define _FORMAT_WITH_SPEC_r21 788 -#define _FOR_ITER_r23 789 -#define _FOR_ITER_GEN_FRAME_r03 790 -#define _FOR_ITER_GEN_FRAME_r13 791 -#define _FOR_ITER_GEN_FRAME_r23 792 -#define _FOR_ITER_TIER_TWO_r23 793 -#define _GET_AITER_r11 794 -#define _GET_ANEXT_r12 795 -#define _GET_AWAITABLE_r11 796 -#define _GET_ITER_r12 797 -#define _GET_LEN_r12 798 -#define _GET_YIELD_FROM_ITER_r11 799 -#define _GUARD_BINARY_OP_EXTEND_r22 800 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r02 801 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r12 802 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r22 803 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r33 804 -#define _GUARD_BIT_IS_SET_POP_r00 805 -#define _GUARD_BIT_IS_SET_POP_r10 806 -#define _GUARD_BIT_IS_SET_POP_r21 807 -#define _GUARD_BIT_IS_SET_POP_r32 808 -#define _GUARD_BIT_IS_SET_POP_4_r00 809 -#define _GUARD_BIT_IS_SET_POP_4_r10 810 -#define _GUARD_BIT_IS_SET_POP_4_r21 811 -#define _GUARD_BIT_IS_SET_POP_4_r32 812 -#define _GUARD_BIT_IS_SET_POP_5_r00 813 -#define _GUARD_BIT_IS_SET_POP_5_r10 814 -#define _GUARD_BIT_IS_SET_POP_5_r21 815 -#define _GUARD_BIT_IS_SET_POP_5_r32 816 -#define _GUARD_BIT_IS_SET_POP_6_r00 817 -#define _GUARD_BIT_IS_SET_POP_6_r10 818 -#define _GUARD_BIT_IS_SET_POP_6_r21 819 -#define _GUARD_BIT_IS_SET_POP_6_r32 820 -#define _GUARD_BIT_IS_SET_POP_7_r00 821 -#define _GUARD_BIT_IS_SET_POP_7_r10 822 -#define _GUARD_BIT_IS_SET_POP_7_r21 823 -#define _GUARD_BIT_IS_SET_POP_7_r32 824 -#define _GUARD_BIT_IS_UNSET_POP_r00 825 -#define _GUARD_BIT_IS_UNSET_POP_r10 826 -#define _GUARD_BIT_IS_UNSET_POP_r21 827 -#define _GUARD_BIT_IS_UNSET_POP_r32 828 -#define _GUARD_BIT_IS_UNSET_POP_4_r00 829 -#define _GUARD_BIT_IS_UNSET_POP_4_r10 830 -#define _GUARD_BIT_IS_UNSET_POP_4_r21 831 -#define _GUARD_BIT_IS_UNSET_POP_4_r32 832 -#define _GUARD_BIT_IS_UNSET_POP_5_r00 833 -#define _GUARD_BIT_IS_UNSET_POP_5_r10 834 -#define _GUARD_BIT_IS_UNSET_POP_5_r21 835 -#define _GUARD_BIT_IS_UNSET_POP_5_r32 836 -#define _GUARD_BIT_IS_UNSET_POP_6_r00 837 -#define _GUARD_BIT_IS_UNSET_POP_6_r10 838 -#define _GUARD_BIT_IS_UNSET_POP_6_r21 839 -#define _GUARD_BIT_IS_UNSET_POP_6_r32 840 -#define _GUARD_BIT_IS_UNSET_POP_7_r00 841 -#define _GUARD_BIT_IS_UNSET_POP_7_r10 842 -#define _GUARD_BIT_IS_UNSET_POP_7_r21 843 -#define _GUARD_BIT_IS_UNSET_POP_7_r32 844 -#define _GUARD_CALLABLE_ISINSTANCE_r03 845 -#define _GUARD_CALLABLE_ISINSTANCE_r13 846 -#define _GUARD_CALLABLE_ISINSTANCE_r23 847 -#define _GUARD_CALLABLE_ISINSTANCE_r33 848 -#define _GUARD_CALLABLE_LEN_r03 849 -#define _GUARD_CALLABLE_LEN_r13 850 -#define _GUARD_CALLABLE_LEN_r23 851 -#define _GUARD_CALLABLE_LEN_r33 852 -#define _GUARD_CALLABLE_LIST_APPEND_r03 853 -#define _GUARD_CALLABLE_LIST_APPEND_r13 854 -#define _GUARD_CALLABLE_LIST_APPEND_r23 855 -#define _GUARD_CALLABLE_LIST_APPEND_r33 856 -#define _GUARD_CALLABLE_STR_1_r03 857 -#define _GUARD_CALLABLE_STR_1_r13 858 -#define _GUARD_CALLABLE_STR_1_r23 859 -#define _GUARD_CALLABLE_STR_1_r33 860 -#define _GUARD_CALLABLE_TUPLE_1_r03 861 -#define _GUARD_CALLABLE_TUPLE_1_r13 862 -#define _GUARD_CALLABLE_TUPLE_1_r23 863 -#define _GUARD_CALLABLE_TUPLE_1_r33 864 -#define _GUARD_CALLABLE_TYPE_1_r03 865 -#define _GUARD_CALLABLE_TYPE_1_r13 866 -#define _GUARD_CALLABLE_TYPE_1_r23 867 -#define _GUARD_CALLABLE_TYPE_1_r33 868 -#define _GUARD_CODE_VERSION_r00 869 -#define _GUARD_CODE_VERSION_r11 870 -#define _GUARD_CODE_VERSION_r22 871 -#define _GUARD_CODE_VERSION_r33 872 -#define _GUARD_DORV_NO_DICT_r01 873 -#define _GUARD_DORV_NO_DICT_r11 874 -#define _GUARD_DORV_NO_DICT_r22 875 -#define _GUARD_DORV_NO_DICT_r33 876 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r01 877 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r11 878 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r22 879 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r33 880 -#define _GUARD_GLOBALS_VERSION_r00 881 -#define _GUARD_GLOBALS_VERSION_r11 882 -#define _GUARD_GLOBALS_VERSION_r22 883 -#define _GUARD_GLOBALS_VERSION_r33 884 -#define _GUARD_IP_RETURN_GENERATOR_r00 885 -#define _GUARD_IP_RETURN_GENERATOR_r11 886 -#define _GUARD_IP_RETURN_GENERATOR_r22 887 -#define _GUARD_IP_RETURN_GENERATOR_r33 888 -#define _GUARD_IP_RETURN_VALUE_r00 889 -#define _GUARD_IP_RETURN_VALUE_r11 890 -#define _GUARD_IP_RETURN_VALUE_r22 891 -#define _GUARD_IP_RETURN_VALUE_r33 892 -#define _GUARD_IP_YIELD_VALUE_r00 893 -#define _GUARD_IP_YIELD_VALUE_r11 894 -#define _GUARD_IP_YIELD_VALUE_r22 895 -#define _GUARD_IP_YIELD_VALUE_r33 896 -#define _GUARD_IP__PUSH_FRAME_r00 897 -#define _GUARD_IP__PUSH_FRAME_r11 898 -#define _GUARD_IP__PUSH_FRAME_r22 899 -#define _GUARD_IP__PUSH_FRAME_r33 900 -#define _GUARD_IS_FALSE_POP_r00 901 -#define _GUARD_IS_FALSE_POP_r10 902 -#define _GUARD_IS_FALSE_POP_r21 903 -#define _GUARD_IS_FALSE_POP_r32 904 -#define _GUARD_IS_NONE_POP_r00 905 -#define _GUARD_IS_NONE_POP_r10 906 -#define _GUARD_IS_NONE_POP_r21 907 -#define _GUARD_IS_NONE_POP_r32 908 -#define _GUARD_IS_NOT_NONE_POP_r10 909 -#define _GUARD_IS_TRUE_POP_r00 910 -#define _GUARD_IS_TRUE_POP_r10 911 -#define _GUARD_IS_TRUE_POP_r21 912 -#define _GUARD_IS_TRUE_POP_r32 913 -#define _GUARD_KEYS_VERSION_r01 914 -#define _GUARD_KEYS_VERSION_r11 915 -#define _GUARD_KEYS_VERSION_r22 916 -#define _GUARD_KEYS_VERSION_r33 917 -#define _GUARD_NOS_ANY_DICT_r02 918 -#define _GUARD_NOS_ANY_DICT_r12 919 -#define _GUARD_NOS_ANY_DICT_r22 920 -#define _GUARD_NOS_ANY_DICT_r33 921 -#define _GUARD_NOS_COMPACT_ASCII_r02 922 -#define _GUARD_NOS_COMPACT_ASCII_r12 923 -#define _GUARD_NOS_COMPACT_ASCII_r22 924 -#define _GUARD_NOS_COMPACT_ASCII_r33 925 -#define _GUARD_NOS_DICT_r02 926 -#define _GUARD_NOS_DICT_r12 927 -#define _GUARD_NOS_DICT_r22 928 -#define _GUARD_NOS_DICT_r33 929 -#define _GUARD_NOS_FLOAT_r02 930 -#define _GUARD_NOS_FLOAT_r12 931 -#define _GUARD_NOS_FLOAT_r22 932 -#define _GUARD_NOS_FLOAT_r33 933 -#define _GUARD_NOS_INT_r02 934 -#define _GUARD_NOS_INT_r12 935 -#define _GUARD_NOS_INT_r22 936 -#define _GUARD_NOS_INT_r33 937 -#define _GUARD_NOS_LIST_r02 938 -#define _GUARD_NOS_LIST_r12 939 -#define _GUARD_NOS_LIST_r22 940 -#define _GUARD_NOS_LIST_r33 941 -#define _GUARD_NOS_NOT_NULL_r02 942 -#define _GUARD_NOS_NOT_NULL_r12 943 -#define _GUARD_NOS_NOT_NULL_r22 944 -#define _GUARD_NOS_NOT_NULL_r33 945 -#define _GUARD_NOS_NULL_r02 946 -#define _GUARD_NOS_NULL_r12 947 -#define _GUARD_NOS_NULL_r22 948 -#define _GUARD_NOS_NULL_r33 949 -#define _GUARD_NOS_OVERFLOWED_r02 950 -#define _GUARD_NOS_OVERFLOWED_r12 951 -#define _GUARD_NOS_OVERFLOWED_r22 952 -#define _GUARD_NOS_OVERFLOWED_r33 953 -#define _GUARD_NOS_TUPLE_r02 954 -#define _GUARD_NOS_TUPLE_r12 955 -#define _GUARD_NOS_TUPLE_r22 956 -#define _GUARD_NOS_TUPLE_r33 957 -#define _GUARD_NOS_UNICODE_r02 958 -#define _GUARD_NOS_UNICODE_r12 959 -#define _GUARD_NOS_UNICODE_r22 960 -#define _GUARD_NOS_UNICODE_r33 961 -#define _GUARD_NOT_EXHAUSTED_LIST_r02 962 -#define _GUARD_NOT_EXHAUSTED_LIST_r12 963 -#define _GUARD_NOT_EXHAUSTED_LIST_r22 964 -#define _GUARD_NOT_EXHAUSTED_LIST_r33 965 -#define _GUARD_NOT_EXHAUSTED_RANGE_r02 966 -#define _GUARD_NOT_EXHAUSTED_RANGE_r12 967 -#define _GUARD_NOT_EXHAUSTED_RANGE_r22 968 -#define _GUARD_NOT_EXHAUSTED_RANGE_r33 969 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r02 970 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r12 971 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r22 972 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r33 973 -#define _GUARD_THIRD_NULL_r03 974 -#define _GUARD_THIRD_NULL_r13 975 -#define _GUARD_THIRD_NULL_r23 976 -#define _GUARD_THIRD_NULL_r33 977 -#define _GUARD_TOS_ANY_DICT_r01 978 -#define _GUARD_TOS_ANY_DICT_r11 979 -#define _GUARD_TOS_ANY_DICT_r22 980 -#define _GUARD_TOS_ANY_DICT_r33 981 -#define _GUARD_TOS_ANY_SET_r01 982 -#define _GUARD_TOS_ANY_SET_r11 983 -#define _GUARD_TOS_ANY_SET_r22 984 -#define _GUARD_TOS_ANY_SET_r33 985 -#define _GUARD_TOS_DICT_r01 986 -#define _GUARD_TOS_DICT_r11 987 -#define _GUARD_TOS_DICT_r22 988 -#define _GUARD_TOS_DICT_r33 989 -#define _GUARD_TOS_FLOAT_r01 990 -#define _GUARD_TOS_FLOAT_r11 991 -#define _GUARD_TOS_FLOAT_r22 992 -#define _GUARD_TOS_FLOAT_r33 993 -#define _GUARD_TOS_FROZENDICT_r01 994 -#define _GUARD_TOS_FROZENDICT_r11 995 -#define _GUARD_TOS_FROZENDICT_r22 996 -#define _GUARD_TOS_FROZENDICT_r33 997 -#define _GUARD_TOS_FROZENSET_r01 998 -#define _GUARD_TOS_FROZENSET_r11 999 -#define _GUARD_TOS_FROZENSET_r22 1000 -#define _GUARD_TOS_FROZENSET_r33 1001 -#define _GUARD_TOS_INT_r01 1002 -#define _GUARD_TOS_INT_r11 1003 -#define _GUARD_TOS_INT_r22 1004 -#define _GUARD_TOS_INT_r33 1005 -#define _GUARD_TOS_LIST_r01 1006 -#define _GUARD_TOS_LIST_r11 1007 -#define _GUARD_TOS_LIST_r22 1008 -#define _GUARD_TOS_LIST_r33 1009 -#define _GUARD_TOS_OVERFLOWED_r01 1010 -#define _GUARD_TOS_OVERFLOWED_r11 1011 -#define _GUARD_TOS_OVERFLOWED_r22 1012 -#define _GUARD_TOS_OVERFLOWED_r33 1013 -#define _GUARD_TOS_SET_r01 1014 -#define _GUARD_TOS_SET_r11 1015 -#define _GUARD_TOS_SET_r22 1016 -#define _GUARD_TOS_SET_r33 1017 -#define _GUARD_TOS_SLICE_r01 1018 -#define _GUARD_TOS_SLICE_r11 1019 -#define _GUARD_TOS_SLICE_r22 1020 -#define _GUARD_TOS_SLICE_r33 1021 -#define _GUARD_TOS_TUPLE_r01 1022 -#define _GUARD_TOS_TUPLE_r11 1023 -#define _GUARD_TOS_TUPLE_r22 1024 -#define _GUARD_TOS_TUPLE_r33 1025 -#define _GUARD_TOS_UNICODE_r01 1026 -#define _GUARD_TOS_UNICODE_r11 1027 -#define _GUARD_TOS_UNICODE_r22 1028 -#define _GUARD_TOS_UNICODE_r33 1029 -#define _GUARD_TYPE_VERSION_r01 1030 -#define _GUARD_TYPE_VERSION_r11 1031 -#define _GUARD_TYPE_VERSION_r22 1032 -#define _GUARD_TYPE_VERSION_r33 1033 -#define _GUARD_TYPE_VERSION_LOCKED_r01 1034 -#define _GUARD_TYPE_VERSION_LOCKED_r11 1035 -#define _GUARD_TYPE_VERSION_LOCKED_r22 1036 -#define _GUARD_TYPE_VERSION_LOCKED_r33 1037 -#define _HANDLE_PENDING_AND_DEOPT_r00 1038 -#define _HANDLE_PENDING_AND_DEOPT_r10 1039 -#define _HANDLE_PENDING_AND_DEOPT_r20 1040 -#define _HANDLE_PENDING_AND_DEOPT_r30 1041 -#define _IMPORT_FROM_r12 1042 -#define _IMPORT_NAME_r21 1043 -#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS_r00 1044 -#define _INIT_CALL_PY_EXACT_ARGS_r01 1045 -#define _INIT_CALL_PY_EXACT_ARGS_0_r01 1046 -#define _INIT_CALL_PY_EXACT_ARGS_1_r01 1047 -#define _INIT_CALL_PY_EXACT_ARGS_2_r01 1048 -#define _INIT_CALL_PY_EXACT_ARGS_3_r01 1049 -#define _INIT_CALL_PY_EXACT_ARGS_4_r01 1050 -#define _INSERT_1_LOAD_CONST_INLINE_r02 1051 -#define _INSERT_1_LOAD_CONST_INLINE_r12 1052 -#define _INSERT_1_LOAD_CONST_INLINE_r23 1053 -#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r02 1054 -#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r12 1055 -#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r23 1056 -#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r03 1057 -#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r13 1058 -#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r23 1059 -#define _INSERT_NULL_r10 1060 -#define _INSTRUMENTED_FOR_ITER_r23 1061 -#define _INSTRUMENTED_INSTRUCTION_r00 1062 -#define _INSTRUMENTED_JUMP_FORWARD_r00 1063 -#define _INSTRUMENTED_JUMP_FORWARD_r11 1064 -#define _INSTRUMENTED_JUMP_FORWARD_r22 1065 -#define _INSTRUMENTED_JUMP_FORWARD_r33 1066 -#define _INSTRUMENTED_LINE_r00 1067 -#define _INSTRUMENTED_NOT_TAKEN_r00 1068 -#define _INSTRUMENTED_NOT_TAKEN_r11 1069 -#define _INSTRUMENTED_NOT_TAKEN_r22 1070 -#define _INSTRUMENTED_NOT_TAKEN_r33 1071 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 1072 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 1073 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 1074 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 1075 -#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 1076 -#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 1077 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 1078 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 1079 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 1080 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 1081 -#define _IS_NONE_r11 1082 -#define _IS_OP_r03 1083 -#define _IS_OP_r13 1084 -#define _IS_OP_r23 1085 -#define _ITER_CHECK_LIST_r02 1086 -#define _ITER_CHECK_LIST_r12 1087 -#define _ITER_CHECK_LIST_r22 1088 -#define _ITER_CHECK_LIST_r33 1089 -#define _ITER_CHECK_RANGE_r02 1090 -#define _ITER_CHECK_RANGE_r12 1091 -#define _ITER_CHECK_RANGE_r22 1092 -#define _ITER_CHECK_RANGE_r33 1093 -#define _ITER_CHECK_TUPLE_r02 1094 -#define _ITER_CHECK_TUPLE_r12 1095 -#define _ITER_CHECK_TUPLE_r22 1096 -#define _ITER_CHECK_TUPLE_r33 1097 -#define _ITER_JUMP_LIST_r02 1098 -#define _ITER_JUMP_LIST_r12 1099 -#define _ITER_JUMP_LIST_r22 1100 -#define _ITER_JUMP_LIST_r33 1101 -#define _ITER_JUMP_RANGE_r02 1102 -#define _ITER_JUMP_RANGE_r12 1103 -#define _ITER_JUMP_RANGE_r22 1104 -#define _ITER_JUMP_RANGE_r33 1105 -#define _ITER_JUMP_TUPLE_r02 1106 -#define _ITER_JUMP_TUPLE_r12 1107 -#define _ITER_JUMP_TUPLE_r22 1108 -#define _ITER_JUMP_TUPLE_r33 1109 -#define _ITER_NEXT_LIST_r23 1110 -#define _ITER_NEXT_LIST_TIER_TWO_r23 1111 -#define _ITER_NEXT_RANGE_r03 1112 -#define _ITER_NEXT_RANGE_r13 1113 -#define _ITER_NEXT_RANGE_r23 1114 -#define _ITER_NEXT_TUPLE_r03 1115 -#define _ITER_NEXT_TUPLE_r13 1116 -#define _ITER_NEXT_TUPLE_r23 1117 -#define _JUMP_BACKWARD_NO_INTERRUPT_r00 1118 -#define _JUMP_BACKWARD_NO_INTERRUPT_r11 1119 -#define _JUMP_BACKWARD_NO_INTERRUPT_r22 1120 -#define _JUMP_BACKWARD_NO_INTERRUPT_r33 1121 -#define _JUMP_TO_TOP_r00 1122 -#define _LIST_APPEND_r10 1123 -#define _LIST_EXTEND_r10 1124 -#define _LOAD_ATTR_r10 1125 -#define _LOAD_ATTR_CLASS_r11 1126 -#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 1127 -#define _LOAD_ATTR_INSTANCE_VALUE_r02 1128 -#define _LOAD_ATTR_INSTANCE_VALUE_r12 1129 -#define _LOAD_ATTR_INSTANCE_VALUE_r23 1130 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1131 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1132 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1133 -#define _LOAD_ATTR_METHOD_NO_DICT_r02 1134 -#define _LOAD_ATTR_METHOD_NO_DICT_r12 1135 -#define _LOAD_ATTR_METHOD_NO_DICT_r23 1136 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1137 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1138 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1139 -#define _LOAD_ATTR_MODULE_r12 1140 -#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1141 -#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1142 -#define _LOAD_ATTR_PROPERTY_FRAME_r11 1143 -#define _LOAD_ATTR_SLOT_r02 1144 -#define _LOAD_ATTR_SLOT_r12 1145 -#define _LOAD_ATTR_SLOT_r23 1146 -#define _LOAD_ATTR_WITH_HINT_r12 1147 -#define _LOAD_BUILD_CLASS_r01 1148 -#define _LOAD_BYTECODE_r00 1149 -#define _LOAD_COMMON_CONSTANT_r01 1150 -#define _LOAD_COMMON_CONSTANT_r12 1151 -#define _LOAD_COMMON_CONSTANT_r23 1152 -#define _LOAD_CONST_r01 1153 -#define _LOAD_CONST_r12 1154 -#define _LOAD_CONST_r23 1155 -#define _LOAD_CONST_INLINE_r01 1156 -#define _LOAD_CONST_INLINE_r12 1157 -#define _LOAD_CONST_INLINE_r23 1158 -#define _LOAD_CONST_INLINE_BORROW_r01 1159 -#define _LOAD_CONST_INLINE_BORROW_r12 1160 -#define _LOAD_CONST_INLINE_BORROW_r23 1161 -#define _LOAD_CONST_UNDER_INLINE_r02 1162 -#define _LOAD_CONST_UNDER_INLINE_r12 1163 -#define _LOAD_CONST_UNDER_INLINE_r23 1164 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1165 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1166 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1167 -#define _LOAD_DEREF_r01 1168 -#define _LOAD_FAST_r01 1169 -#define _LOAD_FAST_r12 1170 -#define _LOAD_FAST_r23 1171 -#define _LOAD_FAST_0_r01 1172 -#define _LOAD_FAST_0_r12 1173 -#define _LOAD_FAST_0_r23 1174 -#define _LOAD_FAST_1_r01 1175 -#define _LOAD_FAST_1_r12 1176 -#define _LOAD_FAST_1_r23 1177 -#define _LOAD_FAST_2_r01 1178 -#define _LOAD_FAST_2_r12 1179 -#define _LOAD_FAST_2_r23 1180 -#define _LOAD_FAST_3_r01 1181 -#define _LOAD_FAST_3_r12 1182 -#define _LOAD_FAST_3_r23 1183 -#define _LOAD_FAST_4_r01 1184 -#define _LOAD_FAST_4_r12 1185 -#define _LOAD_FAST_4_r23 1186 -#define _LOAD_FAST_5_r01 1187 -#define _LOAD_FAST_5_r12 1188 -#define _LOAD_FAST_5_r23 1189 -#define _LOAD_FAST_6_r01 1190 -#define _LOAD_FAST_6_r12 1191 -#define _LOAD_FAST_6_r23 1192 -#define _LOAD_FAST_7_r01 1193 -#define _LOAD_FAST_7_r12 1194 -#define _LOAD_FAST_7_r23 1195 -#define _LOAD_FAST_AND_CLEAR_r01 1196 -#define _LOAD_FAST_AND_CLEAR_r12 1197 -#define _LOAD_FAST_AND_CLEAR_r23 1198 -#define _LOAD_FAST_BORROW_r01 1199 -#define _LOAD_FAST_BORROW_r12 1200 -#define _LOAD_FAST_BORROW_r23 1201 -#define _LOAD_FAST_BORROW_0_r01 1202 -#define _LOAD_FAST_BORROW_0_r12 1203 -#define _LOAD_FAST_BORROW_0_r23 1204 -#define _LOAD_FAST_BORROW_1_r01 1205 -#define _LOAD_FAST_BORROW_1_r12 1206 -#define _LOAD_FAST_BORROW_1_r23 1207 -#define _LOAD_FAST_BORROW_2_r01 1208 -#define _LOAD_FAST_BORROW_2_r12 1209 -#define _LOAD_FAST_BORROW_2_r23 1210 -#define _LOAD_FAST_BORROW_3_r01 1211 -#define _LOAD_FAST_BORROW_3_r12 1212 -#define _LOAD_FAST_BORROW_3_r23 1213 -#define _LOAD_FAST_BORROW_4_r01 1214 -#define _LOAD_FAST_BORROW_4_r12 1215 -#define _LOAD_FAST_BORROW_4_r23 1216 -#define _LOAD_FAST_BORROW_5_r01 1217 -#define _LOAD_FAST_BORROW_5_r12 1218 -#define _LOAD_FAST_BORROW_5_r23 1219 -#define _LOAD_FAST_BORROW_6_r01 1220 -#define _LOAD_FAST_BORROW_6_r12 1221 -#define _LOAD_FAST_BORROW_6_r23 1222 -#define _LOAD_FAST_BORROW_7_r01 1223 -#define _LOAD_FAST_BORROW_7_r12 1224 -#define _LOAD_FAST_BORROW_7_r23 1225 -#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1226 -#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1227 -#define _LOAD_FAST_CHECK_r01 1228 -#define _LOAD_FAST_CHECK_r12 1229 -#define _LOAD_FAST_CHECK_r23 1230 -#define _LOAD_FAST_LOAD_FAST_r02 1231 -#define _LOAD_FAST_LOAD_FAST_r13 1232 -#define _LOAD_FROM_DICT_OR_DEREF_r11 1233 -#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1234 -#define _LOAD_GLOBAL_r00 1235 -#define _LOAD_GLOBAL_BUILTINS_r01 1236 -#define _LOAD_GLOBAL_MODULE_r01 1237 -#define _LOAD_LOCALS_r01 1238 -#define _LOAD_LOCALS_r12 1239 -#define _LOAD_LOCALS_r23 1240 -#define _LOAD_NAME_r01 1241 -#define _LOAD_SMALL_INT_r01 1242 -#define _LOAD_SMALL_INT_r12 1243 -#define _LOAD_SMALL_INT_r23 1244 -#define _LOAD_SMALL_INT_0_r01 1245 -#define _LOAD_SMALL_INT_0_r12 1246 -#define _LOAD_SMALL_INT_0_r23 1247 -#define _LOAD_SMALL_INT_1_r01 1248 -#define _LOAD_SMALL_INT_1_r12 1249 -#define _LOAD_SMALL_INT_1_r23 1250 -#define _LOAD_SMALL_INT_2_r01 1251 -#define _LOAD_SMALL_INT_2_r12 1252 -#define _LOAD_SMALL_INT_2_r23 1253 -#define _LOAD_SMALL_INT_3_r01 1254 -#define _LOAD_SMALL_INT_3_r12 1255 -#define _LOAD_SMALL_INT_3_r23 1256 -#define _LOAD_SPECIAL_r00 1257 -#define _LOAD_SUPER_ATTR_ATTR_r31 1258 -#define _LOAD_SUPER_ATTR_METHOD_r32 1259 -#define _LOCK_OBJECT_r01 1260 -#define _LOCK_OBJECT_r11 1261 -#define _LOCK_OBJECT_r22 1262 -#define _LOCK_OBJECT_r33 1263 -#define _MAKE_CALLARGS_A_TUPLE_r33 1264 -#define _MAKE_CELL_r00 1265 -#define _MAKE_FUNCTION_r11 1266 -#define _MAKE_HEAP_SAFE_r01 1267 -#define _MAKE_HEAP_SAFE_r11 1268 -#define _MAKE_HEAP_SAFE_r22 1269 -#define _MAKE_HEAP_SAFE_r33 1270 -#define _MAKE_WARM_r00 1271 -#define _MAKE_WARM_r11 1272 -#define _MAKE_WARM_r22 1273 -#define _MAKE_WARM_r33 1274 -#define _MAP_ADD_r20 1275 -#define _MATCH_CLASS_r33 1276 -#define _MATCH_KEYS_r23 1277 -#define _MATCH_MAPPING_r02 1278 -#define _MATCH_MAPPING_r12 1279 -#define _MATCH_MAPPING_r23 1280 -#define _MATCH_SEQUENCE_r02 1281 -#define _MATCH_SEQUENCE_r12 1282 -#define _MATCH_SEQUENCE_r23 1283 -#define _MAYBE_EXPAND_METHOD_r00 1284 -#define _MAYBE_EXPAND_METHOD_KW_r11 1285 -#define _MONITOR_CALL_r00 1286 -#define _MONITOR_CALL_KW_r11 1287 -#define _MONITOR_JUMP_BACKWARD_r00 1288 -#define _MONITOR_JUMP_BACKWARD_r11 1289 -#define _MONITOR_JUMP_BACKWARD_r22 1290 -#define _MONITOR_JUMP_BACKWARD_r33 1291 -#define _MONITOR_RESUME_r00 1292 -#define _NOP_r00 1293 -#define _NOP_r11 1294 -#define _NOP_r22 1295 -#define _NOP_r33 1296 -#define _POP_CALL_r20 1297 -#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1298 -#define _POP_CALL_ONE_r30 1299 -#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1300 -#define _POP_CALL_TWO_r30 1301 -#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1302 -#define _POP_EXCEPT_r10 1303 -#define _POP_ITER_r20 1304 -#define _POP_JUMP_IF_FALSE_r00 1305 -#define _POP_JUMP_IF_FALSE_r10 1306 -#define _POP_JUMP_IF_FALSE_r21 1307 -#define _POP_JUMP_IF_FALSE_r32 1308 -#define _POP_JUMP_IF_TRUE_r00 1309 -#define _POP_JUMP_IF_TRUE_r10 1310 -#define _POP_JUMP_IF_TRUE_r21 1311 -#define _POP_JUMP_IF_TRUE_r32 1312 -#define _POP_TOP_r10 1313 -#define _POP_TOP_FLOAT_r00 1314 -#define _POP_TOP_FLOAT_r10 1315 -#define _POP_TOP_FLOAT_r21 1316 -#define _POP_TOP_FLOAT_r32 1317 -#define _POP_TOP_INT_r00 1318 -#define _POP_TOP_INT_r10 1319 -#define _POP_TOP_INT_r21 1320 -#define _POP_TOP_INT_r32 1321 -#define _POP_TOP_LOAD_CONST_INLINE_r11 1322 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1323 -#define _POP_TOP_NOP_r00 1324 -#define _POP_TOP_NOP_r10 1325 -#define _POP_TOP_NOP_r21 1326 -#define _POP_TOP_NOP_r32 1327 -#define _POP_TOP_UNICODE_r00 1328 -#define _POP_TOP_UNICODE_r10 1329 -#define _POP_TOP_UNICODE_r21 1330 -#define _POP_TOP_UNICODE_r32 1331 -#define _POP_TWO_r20 1332 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1333 -#define _PUSH_EXC_INFO_r02 1334 -#define _PUSH_EXC_INFO_r12 1335 -#define _PUSH_EXC_INFO_r23 1336 -#define _PUSH_FRAME_r10 1337 -#define _PUSH_NULL_r01 1338 -#define _PUSH_NULL_r12 1339 -#define _PUSH_NULL_r23 1340 -#define _PUSH_NULL_CONDITIONAL_r00 1341 -#define _PY_FRAME_EX_r31 1342 -#define _PY_FRAME_GENERAL_r01 1343 -#define _PY_FRAME_KW_r11 1344 -#define _REPLACE_WITH_TRUE_r02 1345 -#define _REPLACE_WITH_TRUE_r12 1346 -#define _REPLACE_WITH_TRUE_r23 1347 -#define _RESUME_CHECK_r00 1348 -#define _RESUME_CHECK_r11 1349 -#define _RESUME_CHECK_r22 1350 -#define _RESUME_CHECK_r33 1351 -#define _RETURN_GENERATOR_r01 1352 -#define _RETURN_VALUE_r11 1353 -#define _SAVE_RETURN_OFFSET_r00 1354 -#define _SAVE_RETURN_OFFSET_r11 1355 -#define _SAVE_RETURN_OFFSET_r22 1356 -#define _SAVE_RETURN_OFFSET_r33 1357 -#define _SEND_r22 1358 -#define _SEND_GEN_FRAME_r22 1359 -#define _SETUP_ANNOTATIONS_r00 1360 -#define _SET_ADD_r10 1361 -#define _SET_FUNCTION_ATTRIBUTE_r01 1362 -#define _SET_FUNCTION_ATTRIBUTE_r11 1363 -#define _SET_FUNCTION_ATTRIBUTE_r21 1364 -#define _SET_FUNCTION_ATTRIBUTE_r32 1365 -#define _SET_IP_r00 1366 -#define _SET_IP_r11 1367 -#define _SET_IP_r22 1368 -#define _SET_IP_r33 1369 -#define _SET_UPDATE_r10 1370 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1371 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1372 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1373 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1374 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1375 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1376 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1377 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1378 -#define _SPILL_OR_RELOAD_r01 1379 -#define _SPILL_OR_RELOAD_r02 1380 -#define _SPILL_OR_RELOAD_r03 1381 -#define _SPILL_OR_RELOAD_r10 1382 -#define _SPILL_OR_RELOAD_r12 1383 -#define _SPILL_OR_RELOAD_r13 1384 -#define _SPILL_OR_RELOAD_r20 1385 -#define _SPILL_OR_RELOAD_r21 1386 -#define _SPILL_OR_RELOAD_r23 1387 -#define _SPILL_OR_RELOAD_r30 1388 -#define _SPILL_OR_RELOAD_r31 1389 -#define _SPILL_OR_RELOAD_r32 1390 -#define _START_EXECUTOR_r00 1391 -#define _STORE_ATTR_r20 1392 -#define _STORE_ATTR_INSTANCE_VALUE_r21 1393 -#define _STORE_ATTR_SLOT_r21 1394 -#define _STORE_ATTR_WITH_HINT_r21 1395 -#define _STORE_DEREF_r10 1396 -#define _STORE_FAST_LOAD_FAST_r11 1397 -#define _STORE_FAST_STORE_FAST_r20 1398 -#define _STORE_GLOBAL_r10 1399 -#define _STORE_NAME_r10 1400 -#define _STORE_SLICE_r30 1401 -#define _STORE_SUBSCR_r30 1402 -#define _STORE_SUBSCR_DICT_r31 1403 -#define _STORE_SUBSCR_LIST_INT_r32 1404 -#define _SWAP_r11 1405 -#define _SWAP_2_r02 1406 -#define _SWAP_2_r12 1407 -#define _SWAP_2_r22 1408 -#define _SWAP_2_r33 1409 -#define _SWAP_3_r03 1410 -#define _SWAP_3_r13 1411 -#define _SWAP_3_r23 1412 -#define _SWAP_3_r33 1413 -#define _SWAP_FAST_r01 1414 -#define _SWAP_FAST_r11 1415 -#define _SWAP_FAST_r22 1416 -#define _SWAP_FAST_r33 1417 -#define _SWAP_FAST_0_r01 1418 -#define _SWAP_FAST_0_r11 1419 -#define _SWAP_FAST_0_r22 1420 -#define _SWAP_FAST_0_r33 1421 -#define _SWAP_FAST_1_r01 1422 -#define _SWAP_FAST_1_r11 1423 -#define _SWAP_FAST_1_r22 1424 -#define _SWAP_FAST_1_r33 1425 -#define _SWAP_FAST_2_r01 1426 -#define _SWAP_FAST_2_r11 1427 -#define _SWAP_FAST_2_r22 1428 -#define _SWAP_FAST_2_r33 1429 -#define _SWAP_FAST_3_r01 1430 -#define _SWAP_FAST_3_r11 1431 -#define _SWAP_FAST_3_r22 1432 -#define _SWAP_FAST_3_r33 1433 -#define _SWAP_FAST_4_r01 1434 -#define _SWAP_FAST_4_r11 1435 -#define _SWAP_FAST_4_r22 1436 -#define _SWAP_FAST_4_r33 1437 -#define _SWAP_FAST_5_r01 1438 -#define _SWAP_FAST_5_r11 1439 -#define _SWAP_FAST_5_r22 1440 -#define _SWAP_FAST_5_r33 1441 -#define _SWAP_FAST_6_r01 1442 -#define _SWAP_FAST_6_r11 1443 -#define _SWAP_FAST_6_r22 1444 -#define _SWAP_FAST_6_r33 1445 -#define _SWAP_FAST_7_r01 1446 -#define _SWAP_FAST_7_r11 1447 -#define _SWAP_FAST_7_r22 1448 -#define _SWAP_FAST_7_r33 1449 -#define _TIER2_RESUME_CHECK_r00 1450 -#define _TIER2_RESUME_CHECK_r11 1451 -#define _TIER2_RESUME_CHECK_r22 1452 -#define _TIER2_RESUME_CHECK_r33 1453 -#define _TO_BOOL_r11 1454 -#define _TO_BOOL_BOOL_r01 1455 -#define _TO_BOOL_BOOL_r11 1456 -#define _TO_BOOL_BOOL_r22 1457 -#define _TO_BOOL_BOOL_r33 1458 -#define _TO_BOOL_INT_r02 1459 -#define _TO_BOOL_INT_r12 1460 -#define _TO_BOOL_INT_r23 1461 -#define _TO_BOOL_LIST_r02 1462 -#define _TO_BOOL_LIST_r12 1463 -#define _TO_BOOL_LIST_r23 1464 -#define _TO_BOOL_NONE_r01 1465 -#define _TO_BOOL_NONE_r11 1466 -#define _TO_BOOL_NONE_r22 1467 -#define _TO_BOOL_NONE_r33 1468 -#define _TO_BOOL_STR_r02 1469 -#define _TO_BOOL_STR_r12 1470 -#define _TO_BOOL_STR_r23 1471 -#define _TRACE_RECORD_r00 1472 -#define _UNARY_INVERT_r12 1473 -#define _UNARY_NEGATIVE_r12 1474 -#define _UNARY_NOT_r01 1475 -#define _UNARY_NOT_r11 1476 -#define _UNARY_NOT_r22 1477 -#define _UNARY_NOT_r33 1478 -#define _UNPACK_EX_r10 1479 -#define _UNPACK_SEQUENCE_r10 1480 -#define _UNPACK_SEQUENCE_LIST_r10 1481 -#define _UNPACK_SEQUENCE_TUPLE_r10 1482 -#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1483 -#define _WITH_EXCEPT_START_r33 1484 -#define _YIELD_VALUE_r11 1485 -#define MAX_UOP_REGS_ID 1485 +#define _YIELD_VALUE 602 +#define MAX_UOP_ID 602 +#define _BINARY_OP_r23 603 +#define _BINARY_OP_ADD_FLOAT_r03 604 +#define _BINARY_OP_ADD_FLOAT_r13 605 +#define _BINARY_OP_ADD_FLOAT_r23 606 +#define _BINARY_OP_ADD_INT_r03 607 +#define _BINARY_OP_ADD_INT_r13 608 +#define _BINARY_OP_ADD_INT_r23 609 +#define _BINARY_OP_ADD_UNICODE_r03 610 +#define _BINARY_OP_ADD_UNICODE_r13 611 +#define _BINARY_OP_ADD_UNICODE_r23 612 +#define _BINARY_OP_EXTEND_r23 613 +#define _BINARY_OP_INPLACE_ADD_UNICODE_r21 614 +#define _BINARY_OP_MULTIPLY_FLOAT_r03 615 +#define _BINARY_OP_MULTIPLY_FLOAT_r13 616 +#define _BINARY_OP_MULTIPLY_FLOAT_r23 617 +#define _BINARY_OP_MULTIPLY_INT_r03 618 +#define _BINARY_OP_MULTIPLY_INT_r13 619 +#define _BINARY_OP_MULTIPLY_INT_r23 620 +#define _BINARY_OP_SUBSCR_CHECK_FUNC_r23 621 +#define _BINARY_OP_SUBSCR_DICT_r23 622 +#define _BINARY_OP_SUBSCR_INIT_CALL_r01 623 +#define _BINARY_OP_SUBSCR_INIT_CALL_r11 624 +#define _BINARY_OP_SUBSCR_INIT_CALL_r21 625 +#define _BINARY_OP_SUBSCR_INIT_CALL_r31 626 +#define _BINARY_OP_SUBSCR_LIST_INT_r23 627 +#define _BINARY_OP_SUBSCR_LIST_SLICE_r23 628 +#define _BINARY_OP_SUBSCR_STR_INT_r23 629 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r03 630 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r13 631 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r23 632 +#define _BINARY_OP_SUBSCR_USTR_INT_r23 633 +#define _BINARY_OP_SUBTRACT_FLOAT_r03 634 +#define _BINARY_OP_SUBTRACT_FLOAT_r13 635 +#define _BINARY_OP_SUBTRACT_FLOAT_r23 636 +#define _BINARY_OP_SUBTRACT_INT_r03 637 +#define _BINARY_OP_SUBTRACT_INT_r13 638 +#define _BINARY_OP_SUBTRACT_INT_r23 639 +#define _BINARY_SLICE_r31 640 +#define _BUILD_INTERPOLATION_r01 641 +#define _BUILD_LIST_r01 642 +#define _BUILD_MAP_r01 643 +#define _BUILD_SET_r01 644 +#define _BUILD_SLICE_r01 645 +#define _BUILD_STRING_r01 646 +#define _BUILD_TEMPLATE_r21 647 +#define _BUILD_TUPLE_r01 648 +#define _CALL_BUILTIN_CLASS_r01 649 +#define _CALL_BUILTIN_FAST_r01 650 +#define _CALL_BUILTIN_FAST_WITH_KEYWORDS_r01 651 +#define _CALL_BUILTIN_O_r03 652 +#define _CALL_FUNCTION_EX_NON_PY_GENERAL_r31 653 +#define _CALL_INTRINSIC_1_r12 654 +#define _CALL_INTRINSIC_2_r21 655 +#define _CALL_ISINSTANCE_r31 656 +#define _CALL_KW_NON_PY_r11 657 +#define _CALL_LEN_r33 658 +#define _CALL_LIST_APPEND_r03 659 +#define _CALL_LIST_APPEND_r13 660 +#define _CALL_LIST_APPEND_r23 661 +#define _CALL_LIST_APPEND_r33 662 +#define _CALL_METHOD_DESCRIPTOR_FAST_r01 663 +#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r01 664 +#define _CALL_METHOD_DESCRIPTOR_NOARGS_r01 665 +#define _CALL_METHOD_DESCRIPTOR_O_r03 666 +#define _CALL_NON_PY_GENERAL_r01 667 +#define _CALL_STR_1_r32 668 +#define _CALL_TUPLE_1_r32 669 +#define _CALL_TYPE_1_r02 670 +#define _CALL_TYPE_1_r12 671 +#define _CALL_TYPE_1_r22 672 +#define _CALL_TYPE_1_r32 673 +#define _CHECK_AND_ALLOCATE_OBJECT_r00 674 +#define _CHECK_ATTR_CLASS_r01 675 +#define _CHECK_ATTR_CLASS_r11 676 +#define _CHECK_ATTR_CLASS_r22 677 +#define _CHECK_ATTR_CLASS_r33 678 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r01 679 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r11 680 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r22 681 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r33 682 +#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS_r00 683 +#define _CHECK_EG_MATCH_r22 684 +#define _CHECK_EXC_MATCH_r22 685 +#define _CHECK_FUNCTION_EXACT_ARGS_r00 686 +#define _CHECK_FUNCTION_VERSION_r00 687 +#define _CHECK_FUNCTION_VERSION_INLINE_r00 688 +#define _CHECK_FUNCTION_VERSION_INLINE_r11 689 +#define _CHECK_FUNCTION_VERSION_INLINE_r22 690 +#define _CHECK_FUNCTION_VERSION_INLINE_r33 691 +#define _CHECK_FUNCTION_VERSION_KW_r11 692 +#define _CHECK_IS_NOT_PY_CALLABLE_r00 693 +#define _CHECK_IS_NOT_PY_CALLABLE_EX_r03 694 +#define _CHECK_IS_NOT_PY_CALLABLE_EX_r13 695 +#define _CHECK_IS_NOT_PY_CALLABLE_EX_r23 696 +#define _CHECK_IS_NOT_PY_CALLABLE_EX_r33 697 +#define _CHECK_IS_NOT_PY_CALLABLE_KW_r11 698 +#define _CHECK_IS_PY_CALLABLE_EX_r03 699 +#define _CHECK_IS_PY_CALLABLE_EX_r13 700 +#define _CHECK_IS_PY_CALLABLE_EX_r23 701 +#define _CHECK_IS_PY_CALLABLE_EX_r33 702 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r01 703 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r11 704 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r22 705 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r33 706 +#define _CHECK_METHOD_VERSION_r00 707 +#define _CHECK_METHOD_VERSION_KW_r11 708 +#define _CHECK_PEP_523_r00 709 +#define _CHECK_PEP_523_r11 710 +#define _CHECK_PEP_523_r22 711 +#define _CHECK_PEP_523_r33 712 +#define _CHECK_PERIODIC_r00 713 +#define _CHECK_PERIODIC_AT_END_r00 714 +#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM_r00 715 +#define _CHECK_RECURSION_REMAINING_r00 716 +#define _CHECK_RECURSION_REMAINING_r11 717 +#define _CHECK_RECURSION_REMAINING_r22 718 +#define _CHECK_RECURSION_REMAINING_r33 719 +#define _CHECK_STACK_SPACE_r00 720 +#define _CHECK_STACK_SPACE_OPERAND_r00 721 +#define _CHECK_STACK_SPACE_OPERAND_r11 722 +#define _CHECK_STACK_SPACE_OPERAND_r22 723 +#define _CHECK_STACK_SPACE_OPERAND_r33 724 +#define _CHECK_VALIDITY_r00 725 +#define _CHECK_VALIDITY_r11 726 +#define _CHECK_VALIDITY_r22 727 +#define _CHECK_VALIDITY_r33 728 +#define _COLD_DYNAMIC_EXIT_r00 729 +#define _COLD_EXIT_r00 730 +#define _COMPARE_OP_r21 731 +#define _COMPARE_OP_FLOAT_r03 732 +#define _COMPARE_OP_FLOAT_r13 733 +#define _COMPARE_OP_FLOAT_r23 734 +#define _COMPARE_OP_INT_r23 735 +#define _COMPARE_OP_STR_r23 736 +#define _CONTAINS_OP_r23 737 +#define _CONTAINS_OP_DICT_r23 738 +#define _CONTAINS_OP_SET_r23 739 +#define _CONVERT_VALUE_r11 740 +#define _COPY_r01 741 +#define _COPY_1_r02 742 +#define _COPY_1_r12 743 +#define _COPY_1_r23 744 +#define _COPY_2_r03 745 +#define _COPY_2_r13 746 +#define _COPY_2_r23 747 +#define _COPY_3_r03 748 +#define _COPY_3_r13 749 +#define _COPY_3_r23 750 +#define _COPY_3_r33 751 +#define _COPY_FREE_VARS_r00 752 +#define _COPY_FREE_VARS_r11 753 +#define _COPY_FREE_VARS_r22 754 +#define _COPY_FREE_VARS_r33 755 +#define _CREATE_INIT_FRAME_r01 756 +#define _DELETE_ATTR_r10 757 +#define _DELETE_DEREF_r00 758 +#define _DELETE_FAST_r00 759 +#define _DELETE_GLOBAL_r00 760 +#define _DELETE_NAME_r00 761 +#define _DELETE_SUBSCR_r20 762 +#define _DEOPT_r00 763 +#define _DEOPT_r10 764 +#define _DEOPT_r20 765 +#define _DEOPT_r30 766 +#define _DICT_MERGE_r10 767 +#define _DICT_UPDATE_r10 768 +#define _DO_CALL_r01 769 +#define _DO_CALL_FUNCTION_EX_r31 770 +#define _DO_CALL_KW_r11 771 +#define _DYNAMIC_EXIT_r00 772 +#define _DYNAMIC_EXIT_r10 773 +#define _DYNAMIC_EXIT_r20 774 +#define _DYNAMIC_EXIT_r30 775 +#define _END_FOR_r10 776 +#define _END_SEND_r21 777 +#define _ERROR_POP_N_r00 778 +#define _EXIT_INIT_CHECK_r10 779 +#define _EXIT_TRACE_r00 780 +#define _EXIT_TRACE_r10 781 +#define _EXIT_TRACE_r20 782 +#define _EXIT_TRACE_r30 783 +#define _EXPAND_METHOD_r00 784 +#define _EXPAND_METHOD_KW_r11 785 +#define _FATAL_ERROR_r00 786 +#define _FATAL_ERROR_r11 787 +#define _FATAL_ERROR_r22 788 +#define _FATAL_ERROR_r33 789 +#define _FORMAT_SIMPLE_r11 790 +#define _FORMAT_WITH_SPEC_r21 791 +#define _FOR_ITER_r23 792 +#define _FOR_ITER_GEN_FRAME_r03 793 +#define _FOR_ITER_GEN_FRAME_r13 794 +#define _FOR_ITER_GEN_FRAME_r23 795 +#define _FOR_ITER_TIER_TWO_r23 796 +#define _GET_AITER_r11 797 +#define _GET_ANEXT_r12 798 +#define _GET_AWAITABLE_r11 799 +#define _GET_ITER_r12 800 +#define _GET_LEN_r12 801 +#define _GET_YIELD_FROM_ITER_r11 802 +#define _GUARD_BINARY_OP_EXTEND_r22 803 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r02 804 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r12 805 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r22 806 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r33 807 +#define _GUARD_BIT_IS_SET_POP_r00 808 +#define _GUARD_BIT_IS_SET_POP_r10 809 +#define _GUARD_BIT_IS_SET_POP_r21 810 +#define _GUARD_BIT_IS_SET_POP_r32 811 +#define _GUARD_BIT_IS_SET_POP_4_r00 812 +#define _GUARD_BIT_IS_SET_POP_4_r10 813 +#define _GUARD_BIT_IS_SET_POP_4_r21 814 +#define _GUARD_BIT_IS_SET_POP_4_r32 815 +#define _GUARD_BIT_IS_SET_POP_5_r00 816 +#define _GUARD_BIT_IS_SET_POP_5_r10 817 +#define _GUARD_BIT_IS_SET_POP_5_r21 818 +#define _GUARD_BIT_IS_SET_POP_5_r32 819 +#define _GUARD_BIT_IS_SET_POP_6_r00 820 +#define _GUARD_BIT_IS_SET_POP_6_r10 821 +#define _GUARD_BIT_IS_SET_POP_6_r21 822 +#define _GUARD_BIT_IS_SET_POP_6_r32 823 +#define _GUARD_BIT_IS_SET_POP_7_r00 824 +#define _GUARD_BIT_IS_SET_POP_7_r10 825 +#define _GUARD_BIT_IS_SET_POP_7_r21 826 +#define _GUARD_BIT_IS_SET_POP_7_r32 827 +#define _GUARD_BIT_IS_UNSET_POP_r00 828 +#define _GUARD_BIT_IS_UNSET_POP_r10 829 +#define _GUARD_BIT_IS_UNSET_POP_r21 830 +#define _GUARD_BIT_IS_UNSET_POP_r32 831 +#define _GUARD_BIT_IS_UNSET_POP_4_r00 832 +#define _GUARD_BIT_IS_UNSET_POP_4_r10 833 +#define _GUARD_BIT_IS_UNSET_POP_4_r21 834 +#define _GUARD_BIT_IS_UNSET_POP_4_r32 835 +#define _GUARD_BIT_IS_UNSET_POP_5_r00 836 +#define _GUARD_BIT_IS_UNSET_POP_5_r10 837 +#define _GUARD_BIT_IS_UNSET_POP_5_r21 838 +#define _GUARD_BIT_IS_UNSET_POP_5_r32 839 +#define _GUARD_BIT_IS_UNSET_POP_6_r00 840 +#define _GUARD_BIT_IS_UNSET_POP_6_r10 841 +#define _GUARD_BIT_IS_UNSET_POP_6_r21 842 +#define _GUARD_BIT_IS_UNSET_POP_6_r32 843 +#define _GUARD_BIT_IS_UNSET_POP_7_r00 844 +#define _GUARD_BIT_IS_UNSET_POP_7_r10 845 +#define _GUARD_BIT_IS_UNSET_POP_7_r21 846 +#define _GUARD_BIT_IS_UNSET_POP_7_r32 847 +#define _GUARD_CALLABLE_ISINSTANCE_r03 848 +#define _GUARD_CALLABLE_ISINSTANCE_r13 849 +#define _GUARD_CALLABLE_ISINSTANCE_r23 850 +#define _GUARD_CALLABLE_ISINSTANCE_r33 851 +#define _GUARD_CALLABLE_LEN_r03 852 +#define _GUARD_CALLABLE_LEN_r13 853 +#define _GUARD_CALLABLE_LEN_r23 854 +#define _GUARD_CALLABLE_LEN_r33 855 +#define _GUARD_CALLABLE_LIST_APPEND_r03 856 +#define _GUARD_CALLABLE_LIST_APPEND_r13 857 +#define _GUARD_CALLABLE_LIST_APPEND_r23 858 +#define _GUARD_CALLABLE_LIST_APPEND_r33 859 +#define _GUARD_CALLABLE_STR_1_r03 860 +#define _GUARD_CALLABLE_STR_1_r13 861 +#define _GUARD_CALLABLE_STR_1_r23 862 +#define _GUARD_CALLABLE_STR_1_r33 863 +#define _GUARD_CALLABLE_TUPLE_1_r03 864 +#define _GUARD_CALLABLE_TUPLE_1_r13 865 +#define _GUARD_CALLABLE_TUPLE_1_r23 866 +#define _GUARD_CALLABLE_TUPLE_1_r33 867 +#define _GUARD_CALLABLE_TYPE_1_r03 868 +#define _GUARD_CALLABLE_TYPE_1_r13 869 +#define _GUARD_CALLABLE_TYPE_1_r23 870 +#define _GUARD_CALLABLE_TYPE_1_r33 871 +#define _GUARD_CODE_VERSION_RETURN_GENERATOR_r00 872 +#define _GUARD_CODE_VERSION_RETURN_GENERATOR_r11 873 +#define _GUARD_CODE_VERSION_RETURN_GENERATOR_r22 874 +#define _GUARD_CODE_VERSION_RETURN_GENERATOR_r33 875 +#define _GUARD_CODE_VERSION_RETURN_VALUE_r00 876 +#define _GUARD_CODE_VERSION_RETURN_VALUE_r11 877 +#define _GUARD_CODE_VERSION_RETURN_VALUE_r22 878 +#define _GUARD_CODE_VERSION_RETURN_VALUE_r33 879 +#define _GUARD_CODE_VERSION_YIELD_VALUE_r00 880 +#define _GUARD_CODE_VERSION_YIELD_VALUE_r11 881 +#define _GUARD_CODE_VERSION_YIELD_VALUE_r22 882 +#define _GUARD_CODE_VERSION_YIELD_VALUE_r33 883 +#define _GUARD_CODE_VERSION__PUSH_FRAME_r00 884 +#define _GUARD_CODE_VERSION__PUSH_FRAME_r11 885 +#define _GUARD_CODE_VERSION__PUSH_FRAME_r22 886 +#define _GUARD_CODE_VERSION__PUSH_FRAME_r33 887 +#define _GUARD_DORV_NO_DICT_r01 888 +#define _GUARD_DORV_NO_DICT_r11 889 +#define _GUARD_DORV_NO_DICT_r22 890 +#define _GUARD_DORV_NO_DICT_r33 891 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r01 892 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r11 893 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r22 894 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r33 895 +#define _GUARD_GLOBALS_VERSION_r00 896 +#define _GUARD_GLOBALS_VERSION_r11 897 +#define _GUARD_GLOBALS_VERSION_r22 898 +#define _GUARD_GLOBALS_VERSION_r33 899 +#define _GUARD_IP_RETURN_GENERATOR_r00 900 +#define _GUARD_IP_RETURN_GENERATOR_r11 901 +#define _GUARD_IP_RETURN_GENERATOR_r22 902 +#define _GUARD_IP_RETURN_GENERATOR_r33 903 +#define _GUARD_IP_RETURN_VALUE_r00 904 +#define _GUARD_IP_RETURN_VALUE_r11 905 +#define _GUARD_IP_RETURN_VALUE_r22 906 +#define _GUARD_IP_RETURN_VALUE_r33 907 +#define _GUARD_IP_YIELD_VALUE_r00 908 +#define _GUARD_IP_YIELD_VALUE_r11 909 +#define _GUARD_IP_YIELD_VALUE_r22 910 +#define _GUARD_IP_YIELD_VALUE_r33 911 +#define _GUARD_IP__PUSH_FRAME_r00 912 +#define _GUARD_IP__PUSH_FRAME_r11 913 +#define _GUARD_IP__PUSH_FRAME_r22 914 +#define _GUARD_IP__PUSH_FRAME_r33 915 +#define _GUARD_IS_FALSE_POP_r00 916 +#define _GUARD_IS_FALSE_POP_r10 917 +#define _GUARD_IS_FALSE_POP_r21 918 +#define _GUARD_IS_FALSE_POP_r32 919 +#define _GUARD_IS_NONE_POP_r00 920 +#define _GUARD_IS_NONE_POP_r10 921 +#define _GUARD_IS_NONE_POP_r21 922 +#define _GUARD_IS_NONE_POP_r32 923 +#define _GUARD_IS_NOT_NONE_POP_r10 924 +#define _GUARD_IS_TRUE_POP_r00 925 +#define _GUARD_IS_TRUE_POP_r10 926 +#define _GUARD_IS_TRUE_POP_r21 927 +#define _GUARD_IS_TRUE_POP_r32 928 +#define _GUARD_KEYS_VERSION_r01 929 +#define _GUARD_KEYS_VERSION_r11 930 +#define _GUARD_KEYS_VERSION_r22 931 +#define _GUARD_KEYS_VERSION_r33 932 +#define _GUARD_NOS_ANY_DICT_r02 933 +#define _GUARD_NOS_ANY_DICT_r12 934 +#define _GUARD_NOS_ANY_DICT_r22 935 +#define _GUARD_NOS_ANY_DICT_r33 936 +#define _GUARD_NOS_COMPACT_ASCII_r02 937 +#define _GUARD_NOS_COMPACT_ASCII_r12 938 +#define _GUARD_NOS_COMPACT_ASCII_r22 939 +#define _GUARD_NOS_COMPACT_ASCII_r33 940 +#define _GUARD_NOS_DICT_r02 941 +#define _GUARD_NOS_DICT_r12 942 +#define _GUARD_NOS_DICT_r22 943 +#define _GUARD_NOS_DICT_r33 944 +#define _GUARD_NOS_FLOAT_r02 945 +#define _GUARD_NOS_FLOAT_r12 946 +#define _GUARD_NOS_FLOAT_r22 947 +#define _GUARD_NOS_FLOAT_r33 948 +#define _GUARD_NOS_INT_r02 949 +#define _GUARD_NOS_INT_r12 950 +#define _GUARD_NOS_INT_r22 951 +#define _GUARD_NOS_INT_r33 952 +#define _GUARD_NOS_LIST_r02 953 +#define _GUARD_NOS_LIST_r12 954 +#define _GUARD_NOS_LIST_r22 955 +#define _GUARD_NOS_LIST_r33 956 +#define _GUARD_NOS_NOT_NULL_r02 957 +#define _GUARD_NOS_NOT_NULL_r12 958 +#define _GUARD_NOS_NOT_NULL_r22 959 +#define _GUARD_NOS_NOT_NULL_r33 960 +#define _GUARD_NOS_NULL_r02 961 +#define _GUARD_NOS_NULL_r12 962 +#define _GUARD_NOS_NULL_r22 963 +#define _GUARD_NOS_NULL_r33 964 +#define _GUARD_NOS_OVERFLOWED_r02 965 +#define _GUARD_NOS_OVERFLOWED_r12 966 +#define _GUARD_NOS_OVERFLOWED_r22 967 +#define _GUARD_NOS_OVERFLOWED_r33 968 +#define _GUARD_NOS_TUPLE_r02 969 +#define _GUARD_NOS_TUPLE_r12 970 +#define _GUARD_NOS_TUPLE_r22 971 +#define _GUARD_NOS_TUPLE_r33 972 +#define _GUARD_NOS_UNICODE_r02 973 +#define _GUARD_NOS_UNICODE_r12 974 +#define _GUARD_NOS_UNICODE_r22 975 +#define _GUARD_NOS_UNICODE_r33 976 +#define _GUARD_NOT_EXHAUSTED_LIST_r02 977 +#define _GUARD_NOT_EXHAUSTED_LIST_r12 978 +#define _GUARD_NOT_EXHAUSTED_LIST_r22 979 +#define _GUARD_NOT_EXHAUSTED_LIST_r33 980 +#define _GUARD_NOT_EXHAUSTED_RANGE_r02 981 +#define _GUARD_NOT_EXHAUSTED_RANGE_r12 982 +#define _GUARD_NOT_EXHAUSTED_RANGE_r22 983 +#define _GUARD_NOT_EXHAUSTED_RANGE_r33 984 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r02 985 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r12 986 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r22 987 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r33 988 +#define _GUARD_THIRD_NULL_r03 989 +#define _GUARD_THIRD_NULL_r13 990 +#define _GUARD_THIRD_NULL_r23 991 +#define _GUARD_THIRD_NULL_r33 992 +#define _GUARD_TOS_ANY_DICT_r01 993 +#define _GUARD_TOS_ANY_DICT_r11 994 +#define _GUARD_TOS_ANY_DICT_r22 995 +#define _GUARD_TOS_ANY_DICT_r33 996 +#define _GUARD_TOS_ANY_SET_r01 997 +#define _GUARD_TOS_ANY_SET_r11 998 +#define _GUARD_TOS_ANY_SET_r22 999 +#define _GUARD_TOS_ANY_SET_r33 1000 +#define _GUARD_TOS_DICT_r01 1001 +#define _GUARD_TOS_DICT_r11 1002 +#define _GUARD_TOS_DICT_r22 1003 +#define _GUARD_TOS_DICT_r33 1004 +#define _GUARD_TOS_FLOAT_r01 1005 +#define _GUARD_TOS_FLOAT_r11 1006 +#define _GUARD_TOS_FLOAT_r22 1007 +#define _GUARD_TOS_FLOAT_r33 1008 +#define _GUARD_TOS_FROZENDICT_r01 1009 +#define _GUARD_TOS_FROZENDICT_r11 1010 +#define _GUARD_TOS_FROZENDICT_r22 1011 +#define _GUARD_TOS_FROZENDICT_r33 1012 +#define _GUARD_TOS_FROZENSET_r01 1013 +#define _GUARD_TOS_FROZENSET_r11 1014 +#define _GUARD_TOS_FROZENSET_r22 1015 +#define _GUARD_TOS_FROZENSET_r33 1016 +#define _GUARD_TOS_INT_r01 1017 +#define _GUARD_TOS_INT_r11 1018 +#define _GUARD_TOS_INT_r22 1019 +#define _GUARD_TOS_INT_r33 1020 +#define _GUARD_TOS_LIST_r01 1021 +#define _GUARD_TOS_LIST_r11 1022 +#define _GUARD_TOS_LIST_r22 1023 +#define _GUARD_TOS_LIST_r33 1024 +#define _GUARD_TOS_OVERFLOWED_r01 1025 +#define _GUARD_TOS_OVERFLOWED_r11 1026 +#define _GUARD_TOS_OVERFLOWED_r22 1027 +#define _GUARD_TOS_OVERFLOWED_r33 1028 +#define _GUARD_TOS_SET_r01 1029 +#define _GUARD_TOS_SET_r11 1030 +#define _GUARD_TOS_SET_r22 1031 +#define _GUARD_TOS_SET_r33 1032 +#define _GUARD_TOS_SLICE_r01 1033 +#define _GUARD_TOS_SLICE_r11 1034 +#define _GUARD_TOS_SLICE_r22 1035 +#define _GUARD_TOS_SLICE_r33 1036 +#define _GUARD_TOS_TUPLE_r01 1037 +#define _GUARD_TOS_TUPLE_r11 1038 +#define _GUARD_TOS_TUPLE_r22 1039 +#define _GUARD_TOS_TUPLE_r33 1040 +#define _GUARD_TOS_UNICODE_r01 1041 +#define _GUARD_TOS_UNICODE_r11 1042 +#define _GUARD_TOS_UNICODE_r22 1043 +#define _GUARD_TOS_UNICODE_r33 1044 +#define _GUARD_TYPE_VERSION_r01 1045 +#define _GUARD_TYPE_VERSION_r11 1046 +#define _GUARD_TYPE_VERSION_r22 1047 +#define _GUARD_TYPE_VERSION_r33 1048 +#define _GUARD_TYPE_VERSION_LOCKED_r01 1049 +#define _GUARD_TYPE_VERSION_LOCKED_r11 1050 +#define _GUARD_TYPE_VERSION_LOCKED_r22 1051 +#define _GUARD_TYPE_VERSION_LOCKED_r33 1052 +#define _HANDLE_PENDING_AND_DEOPT_r00 1053 +#define _HANDLE_PENDING_AND_DEOPT_r10 1054 +#define _HANDLE_PENDING_AND_DEOPT_r20 1055 +#define _HANDLE_PENDING_AND_DEOPT_r30 1056 +#define _IMPORT_FROM_r12 1057 +#define _IMPORT_NAME_r21 1058 +#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS_r00 1059 +#define _INIT_CALL_PY_EXACT_ARGS_r01 1060 +#define _INIT_CALL_PY_EXACT_ARGS_0_r01 1061 +#define _INIT_CALL_PY_EXACT_ARGS_1_r01 1062 +#define _INIT_CALL_PY_EXACT_ARGS_2_r01 1063 +#define _INIT_CALL_PY_EXACT_ARGS_3_r01 1064 +#define _INIT_CALL_PY_EXACT_ARGS_4_r01 1065 +#define _INSERT_1_LOAD_CONST_INLINE_r02 1066 +#define _INSERT_1_LOAD_CONST_INLINE_r12 1067 +#define _INSERT_1_LOAD_CONST_INLINE_r23 1068 +#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r02 1069 +#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r12 1070 +#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r23 1071 +#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r03 1072 +#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r13 1073 +#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r23 1074 +#define _INSERT_NULL_r10 1075 +#define _INSTRUMENTED_FOR_ITER_r23 1076 +#define _INSTRUMENTED_INSTRUCTION_r00 1077 +#define _INSTRUMENTED_JUMP_FORWARD_r00 1078 +#define _INSTRUMENTED_JUMP_FORWARD_r11 1079 +#define _INSTRUMENTED_JUMP_FORWARD_r22 1080 +#define _INSTRUMENTED_JUMP_FORWARD_r33 1081 +#define _INSTRUMENTED_LINE_r00 1082 +#define _INSTRUMENTED_NOT_TAKEN_r00 1083 +#define _INSTRUMENTED_NOT_TAKEN_r11 1084 +#define _INSTRUMENTED_NOT_TAKEN_r22 1085 +#define _INSTRUMENTED_NOT_TAKEN_r33 1086 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 1087 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 1088 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 1089 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 1090 +#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 1091 +#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 1092 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 1093 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 1094 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 1095 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 1096 +#define _IS_NONE_r11 1097 +#define _IS_OP_r03 1098 +#define _IS_OP_r13 1099 +#define _IS_OP_r23 1100 +#define _ITER_CHECK_LIST_r02 1101 +#define _ITER_CHECK_LIST_r12 1102 +#define _ITER_CHECK_LIST_r22 1103 +#define _ITER_CHECK_LIST_r33 1104 +#define _ITER_CHECK_RANGE_r02 1105 +#define _ITER_CHECK_RANGE_r12 1106 +#define _ITER_CHECK_RANGE_r22 1107 +#define _ITER_CHECK_RANGE_r33 1108 +#define _ITER_CHECK_TUPLE_r02 1109 +#define _ITER_CHECK_TUPLE_r12 1110 +#define _ITER_CHECK_TUPLE_r22 1111 +#define _ITER_CHECK_TUPLE_r33 1112 +#define _ITER_JUMP_LIST_r02 1113 +#define _ITER_JUMP_LIST_r12 1114 +#define _ITER_JUMP_LIST_r22 1115 +#define _ITER_JUMP_LIST_r33 1116 +#define _ITER_JUMP_RANGE_r02 1117 +#define _ITER_JUMP_RANGE_r12 1118 +#define _ITER_JUMP_RANGE_r22 1119 +#define _ITER_JUMP_RANGE_r33 1120 +#define _ITER_JUMP_TUPLE_r02 1121 +#define _ITER_JUMP_TUPLE_r12 1122 +#define _ITER_JUMP_TUPLE_r22 1123 +#define _ITER_JUMP_TUPLE_r33 1124 +#define _ITER_NEXT_LIST_r23 1125 +#define _ITER_NEXT_LIST_TIER_TWO_r23 1126 +#define _ITER_NEXT_RANGE_r03 1127 +#define _ITER_NEXT_RANGE_r13 1128 +#define _ITER_NEXT_RANGE_r23 1129 +#define _ITER_NEXT_TUPLE_r03 1130 +#define _ITER_NEXT_TUPLE_r13 1131 +#define _ITER_NEXT_TUPLE_r23 1132 +#define _JUMP_BACKWARD_NO_INTERRUPT_r00 1133 +#define _JUMP_BACKWARD_NO_INTERRUPT_r11 1134 +#define _JUMP_BACKWARD_NO_INTERRUPT_r22 1135 +#define _JUMP_BACKWARD_NO_INTERRUPT_r33 1136 +#define _JUMP_TO_TOP_r00 1137 +#define _LIST_APPEND_r10 1138 +#define _LIST_EXTEND_r10 1139 +#define _LOAD_ATTR_r10 1140 +#define _LOAD_ATTR_CLASS_r11 1141 +#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 1142 +#define _LOAD_ATTR_INSTANCE_VALUE_r02 1143 +#define _LOAD_ATTR_INSTANCE_VALUE_r12 1144 +#define _LOAD_ATTR_INSTANCE_VALUE_r23 1145 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1146 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1147 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1148 +#define _LOAD_ATTR_METHOD_NO_DICT_r02 1149 +#define _LOAD_ATTR_METHOD_NO_DICT_r12 1150 +#define _LOAD_ATTR_METHOD_NO_DICT_r23 1151 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1152 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1153 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1154 +#define _LOAD_ATTR_MODULE_r12 1155 +#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1156 +#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1157 +#define _LOAD_ATTR_PROPERTY_FRAME_r11 1158 +#define _LOAD_ATTR_SLOT_r02 1159 +#define _LOAD_ATTR_SLOT_r12 1160 +#define _LOAD_ATTR_SLOT_r23 1161 +#define _LOAD_ATTR_WITH_HINT_r12 1162 +#define _LOAD_BUILD_CLASS_r01 1163 +#define _LOAD_BYTECODE_r00 1164 +#define _LOAD_COMMON_CONSTANT_r01 1165 +#define _LOAD_COMMON_CONSTANT_r12 1166 +#define _LOAD_COMMON_CONSTANT_r23 1167 +#define _LOAD_CONST_r01 1168 +#define _LOAD_CONST_r12 1169 +#define _LOAD_CONST_r23 1170 +#define _LOAD_CONST_INLINE_r01 1171 +#define _LOAD_CONST_INLINE_r12 1172 +#define _LOAD_CONST_INLINE_r23 1173 +#define _LOAD_CONST_INLINE_BORROW_r01 1174 +#define _LOAD_CONST_INLINE_BORROW_r12 1175 +#define _LOAD_CONST_INLINE_BORROW_r23 1176 +#define _LOAD_CONST_UNDER_INLINE_r02 1177 +#define _LOAD_CONST_UNDER_INLINE_r12 1178 +#define _LOAD_CONST_UNDER_INLINE_r23 1179 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1180 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1181 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1182 +#define _LOAD_DEREF_r01 1183 +#define _LOAD_FAST_r01 1184 +#define _LOAD_FAST_r12 1185 +#define _LOAD_FAST_r23 1186 +#define _LOAD_FAST_0_r01 1187 +#define _LOAD_FAST_0_r12 1188 +#define _LOAD_FAST_0_r23 1189 +#define _LOAD_FAST_1_r01 1190 +#define _LOAD_FAST_1_r12 1191 +#define _LOAD_FAST_1_r23 1192 +#define _LOAD_FAST_2_r01 1193 +#define _LOAD_FAST_2_r12 1194 +#define _LOAD_FAST_2_r23 1195 +#define _LOAD_FAST_3_r01 1196 +#define _LOAD_FAST_3_r12 1197 +#define _LOAD_FAST_3_r23 1198 +#define _LOAD_FAST_4_r01 1199 +#define _LOAD_FAST_4_r12 1200 +#define _LOAD_FAST_4_r23 1201 +#define _LOAD_FAST_5_r01 1202 +#define _LOAD_FAST_5_r12 1203 +#define _LOAD_FAST_5_r23 1204 +#define _LOAD_FAST_6_r01 1205 +#define _LOAD_FAST_6_r12 1206 +#define _LOAD_FAST_6_r23 1207 +#define _LOAD_FAST_7_r01 1208 +#define _LOAD_FAST_7_r12 1209 +#define _LOAD_FAST_7_r23 1210 +#define _LOAD_FAST_AND_CLEAR_r01 1211 +#define _LOAD_FAST_AND_CLEAR_r12 1212 +#define _LOAD_FAST_AND_CLEAR_r23 1213 +#define _LOAD_FAST_BORROW_r01 1214 +#define _LOAD_FAST_BORROW_r12 1215 +#define _LOAD_FAST_BORROW_r23 1216 +#define _LOAD_FAST_BORROW_0_r01 1217 +#define _LOAD_FAST_BORROW_0_r12 1218 +#define _LOAD_FAST_BORROW_0_r23 1219 +#define _LOAD_FAST_BORROW_1_r01 1220 +#define _LOAD_FAST_BORROW_1_r12 1221 +#define _LOAD_FAST_BORROW_1_r23 1222 +#define _LOAD_FAST_BORROW_2_r01 1223 +#define _LOAD_FAST_BORROW_2_r12 1224 +#define _LOAD_FAST_BORROW_2_r23 1225 +#define _LOAD_FAST_BORROW_3_r01 1226 +#define _LOAD_FAST_BORROW_3_r12 1227 +#define _LOAD_FAST_BORROW_3_r23 1228 +#define _LOAD_FAST_BORROW_4_r01 1229 +#define _LOAD_FAST_BORROW_4_r12 1230 +#define _LOAD_FAST_BORROW_4_r23 1231 +#define _LOAD_FAST_BORROW_5_r01 1232 +#define _LOAD_FAST_BORROW_5_r12 1233 +#define _LOAD_FAST_BORROW_5_r23 1234 +#define _LOAD_FAST_BORROW_6_r01 1235 +#define _LOAD_FAST_BORROW_6_r12 1236 +#define _LOAD_FAST_BORROW_6_r23 1237 +#define _LOAD_FAST_BORROW_7_r01 1238 +#define _LOAD_FAST_BORROW_7_r12 1239 +#define _LOAD_FAST_BORROW_7_r23 1240 +#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1241 +#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1242 +#define _LOAD_FAST_CHECK_r01 1243 +#define _LOAD_FAST_CHECK_r12 1244 +#define _LOAD_FAST_CHECK_r23 1245 +#define _LOAD_FAST_LOAD_FAST_r02 1246 +#define _LOAD_FAST_LOAD_FAST_r13 1247 +#define _LOAD_FROM_DICT_OR_DEREF_r11 1248 +#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1249 +#define _LOAD_GLOBAL_r00 1250 +#define _LOAD_GLOBAL_BUILTINS_r01 1251 +#define _LOAD_GLOBAL_MODULE_r01 1252 +#define _LOAD_LOCALS_r01 1253 +#define _LOAD_LOCALS_r12 1254 +#define _LOAD_LOCALS_r23 1255 +#define _LOAD_NAME_r01 1256 +#define _LOAD_SMALL_INT_r01 1257 +#define _LOAD_SMALL_INT_r12 1258 +#define _LOAD_SMALL_INT_r23 1259 +#define _LOAD_SMALL_INT_0_r01 1260 +#define _LOAD_SMALL_INT_0_r12 1261 +#define _LOAD_SMALL_INT_0_r23 1262 +#define _LOAD_SMALL_INT_1_r01 1263 +#define _LOAD_SMALL_INT_1_r12 1264 +#define _LOAD_SMALL_INT_1_r23 1265 +#define _LOAD_SMALL_INT_2_r01 1266 +#define _LOAD_SMALL_INT_2_r12 1267 +#define _LOAD_SMALL_INT_2_r23 1268 +#define _LOAD_SMALL_INT_3_r01 1269 +#define _LOAD_SMALL_INT_3_r12 1270 +#define _LOAD_SMALL_INT_3_r23 1271 +#define _LOAD_SPECIAL_r00 1272 +#define _LOAD_SUPER_ATTR_ATTR_r31 1273 +#define _LOAD_SUPER_ATTR_METHOD_r32 1274 +#define _LOCK_OBJECT_r01 1275 +#define _LOCK_OBJECT_r11 1276 +#define _LOCK_OBJECT_r22 1277 +#define _LOCK_OBJECT_r33 1278 +#define _MAKE_CALLARGS_A_TUPLE_r33 1279 +#define _MAKE_CELL_r00 1280 +#define _MAKE_FUNCTION_r11 1281 +#define _MAKE_HEAP_SAFE_r01 1282 +#define _MAKE_HEAP_SAFE_r11 1283 +#define _MAKE_HEAP_SAFE_r22 1284 +#define _MAKE_HEAP_SAFE_r33 1285 +#define _MAKE_WARM_r00 1286 +#define _MAKE_WARM_r11 1287 +#define _MAKE_WARM_r22 1288 +#define _MAKE_WARM_r33 1289 +#define _MAP_ADD_r20 1290 +#define _MATCH_CLASS_r33 1291 +#define _MATCH_KEYS_r23 1292 +#define _MATCH_MAPPING_r02 1293 +#define _MATCH_MAPPING_r12 1294 +#define _MATCH_MAPPING_r23 1295 +#define _MATCH_SEQUENCE_r02 1296 +#define _MATCH_SEQUENCE_r12 1297 +#define _MATCH_SEQUENCE_r23 1298 +#define _MAYBE_EXPAND_METHOD_r00 1299 +#define _MAYBE_EXPAND_METHOD_KW_r11 1300 +#define _MONITOR_CALL_r00 1301 +#define _MONITOR_CALL_KW_r11 1302 +#define _MONITOR_JUMP_BACKWARD_r00 1303 +#define _MONITOR_JUMP_BACKWARD_r11 1304 +#define _MONITOR_JUMP_BACKWARD_r22 1305 +#define _MONITOR_JUMP_BACKWARD_r33 1306 +#define _MONITOR_RESUME_r00 1307 +#define _NOP_r00 1308 +#define _NOP_r11 1309 +#define _NOP_r22 1310 +#define _NOP_r33 1311 +#define _POP_CALL_r20 1312 +#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1313 +#define _POP_CALL_ONE_r30 1314 +#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1315 +#define _POP_CALL_TWO_r30 1316 +#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1317 +#define _POP_EXCEPT_r10 1318 +#define _POP_ITER_r20 1319 +#define _POP_JUMP_IF_FALSE_r00 1320 +#define _POP_JUMP_IF_FALSE_r10 1321 +#define _POP_JUMP_IF_FALSE_r21 1322 +#define _POP_JUMP_IF_FALSE_r32 1323 +#define _POP_JUMP_IF_TRUE_r00 1324 +#define _POP_JUMP_IF_TRUE_r10 1325 +#define _POP_JUMP_IF_TRUE_r21 1326 +#define _POP_JUMP_IF_TRUE_r32 1327 +#define _POP_TOP_r10 1328 +#define _POP_TOP_FLOAT_r00 1329 +#define _POP_TOP_FLOAT_r10 1330 +#define _POP_TOP_FLOAT_r21 1331 +#define _POP_TOP_FLOAT_r32 1332 +#define _POP_TOP_INT_r00 1333 +#define _POP_TOP_INT_r10 1334 +#define _POP_TOP_INT_r21 1335 +#define _POP_TOP_INT_r32 1336 +#define _POP_TOP_LOAD_CONST_INLINE_r11 1337 +#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1338 +#define _POP_TOP_NOP_r00 1339 +#define _POP_TOP_NOP_r10 1340 +#define _POP_TOP_NOP_r21 1341 +#define _POP_TOP_NOP_r32 1342 +#define _POP_TOP_UNICODE_r00 1343 +#define _POP_TOP_UNICODE_r10 1344 +#define _POP_TOP_UNICODE_r21 1345 +#define _POP_TOP_UNICODE_r32 1346 +#define _POP_TWO_r20 1347 +#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1348 +#define _PUSH_EXC_INFO_r02 1349 +#define _PUSH_EXC_INFO_r12 1350 +#define _PUSH_EXC_INFO_r23 1351 +#define _PUSH_FRAME_r10 1352 +#define _PUSH_NULL_r01 1353 +#define _PUSH_NULL_r12 1354 +#define _PUSH_NULL_r23 1355 +#define _PUSH_NULL_CONDITIONAL_r00 1356 +#define _PY_FRAME_EX_r31 1357 +#define _PY_FRAME_GENERAL_r01 1358 +#define _PY_FRAME_KW_r11 1359 +#define _REPLACE_WITH_TRUE_r02 1360 +#define _REPLACE_WITH_TRUE_r12 1361 +#define _REPLACE_WITH_TRUE_r23 1362 +#define _RESUME_CHECK_r00 1363 +#define _RESUME_CHECK_r11 1364 +#define _RESUME_CHECK_r22 1365 +#define _RESUME_CHECK_r33 1366 +#define _RETURN_GENERATOR_r01 1367 +#define _RETURN_VALUE_r11 1368 +#define _SAVE_RETURN_OFFSET_r00 1369 +#define _SAVE_RETURN_OFFSET_r11 1370 +#define _SAVE_RETURN_OFFSET_r22 1371 +#define _SAVE_RETURN_OFFSET_r33 1372 +#define _SEND_r22 1373 +#define _SEND_GEN_FRAME_r22 1374 +#define _SETUP_ANNOTATIONS_r00 1375 +#define _SET_ADD_r10 1376 +#define _SET_FUNCTION_ATTRIBUTE_r01 1377 +#define _SET_FUNCTION_ATTRIBUTE_r11 1378 +#define _SET_FUNCTION_ATTRIBUTE_r21 1379 +#define _SET_FUNCTION_ATTRIBUTE_r32 1380 +#define _SET_IP_r00 1381 +#define _SET_IP_r11 1382 +#define _SET_IP_r22 1383 +#define _SET_IP_r33 1384 +#define _SET_UPDATE_r10 1385 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1386 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1387 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1388 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1389 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1390 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1391 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1392 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1393 +#define _SPILL_OR_RELOAD_r01 1394 +#define _SPILL_OR_RELOAD_r02 1395 +#define _SPILL_OR_RELOAD_r03 1396 +#define _SPILL_OR_RELOAD_r10 1397 +#define _SPILL_OR_RELOAD_r12 1398 +#define _SPILL_OR_RELOAD_r13 1399 +#define _SPILL_OR_RELOAD_r20 1400 +#define _SPILL_OR_RELOAD_r21 1401 +#define _SPILL_OR_RELOAD_r23 1402 +#define _SPILL_OR_RELOAD_r30 1403 +#define _SPILL_OR_RELOAD_r31 1404 +#define _SPILL_OR_RELOAD_r32 1405 +#define _START_EXECUTOR_r00 1406 +#define _STORE_ATTR_r20 1407 +#define _STORE_ATTR_INSTANCE_VALUE_r21 1408 +#define _STORE_ATTR_SLOT_r21 1409 +#define _STORE_ATTR_WITH_HINT_r21 1410 +#define _STORE_DEREF_r10 1411 +#define _STORE_FAST_LOAD_FAST_r11 1412 +#define _STORE_FAST_STORE_FAST_r20 1413 +#define _STORE_GLOBAL_r10 1414 +#define _STORE_NAME_r10 1415 +#define _STORE_SLICE_r30 1416 +#define _STORE_SUBSCR_r30 1417 +#define _STORE_SUBSCR_DICT_r31 1418 +#define _STORE_SUBSCR_LIST_INT_r32 1419 +#define _SWAP_r11 1420 +#define _SWAP_2_r02 1421 +#define _SWAP_2_r12 1422 +#define _SWAP_2_r22 1423 +#define _SWAP_2_r33 1424 +#define _SWAP_3_r03 1425 +#define _SWAP_3_r13 1426 +#define _SWAP_3_r23 1427 +#define _SWAP_3_r33 1428 +#define _SWAP_FAST_r01 1429 +#define _SWAP_FAST_r11 1430 +#define _SWAP_FAST_r22 1431 +#define _SWAP_FAST_r33 1432 +#define _SWAP_FAST_0_r01 1433 +#define _SWAP_FAST_0_r11 1434 +#define _SWAP_FAST_0_r22 1435 +#define _SWAP_FAST_0_r33 1436 +#define _SWAP_FAST_1_r01 1437 +#define _SWAP_FAST_1_r11 1438 +#define _SWAP_FAST_1_r22 1439 +#define _SWAP_FAST_1_r33 1440 +#define _SWAP_FAST_2_r01 1441 +#define _SWAP_FAST_2_r11 1442 +#define _SWAP_FAST_2_r22 1443 +#define _SWAP_FAST_2_r33 1444 +#define _SWAP_FAST_3_r01 1445 +#define _SWAP_FAST_3_r11 1446 +#define _SWAP_FAST_3_r22 1447 +#define _SWAP_FAST_3_r33 1448 +#define _SWAP_FAST_4_r01 1449 +#define _SWAP_FAST_4_r11 1450 +#define _SWAP_FAST_4_r22 1451 +#define _SWAP_FAST_4_r33 1452 +#define _SWAP_FAST_5_r01 1453 +#define _SWAP_FAST_5_r11 1454 +#define _SWAP_FAST_5_r22 1455 +#define _SWAP_FAST_5_r33 1456 +#define _SWAP_FAST_6_r01 1457 +#define _SWAP_FAST_6_r11 1458 +#define _SWAP_FAST_6_r22 1459 +#define _SWAP_FAST_6_r33 1460 +#define _SWAP_FAST_7_r01 1461 +#define _SWAP_FAST_7_r11 1462 +#define _SWAP_FAST_7_r22 1463 +#define _SWAP_FAST_7_r33 1464 +#define _TIER2_RESUME_CHECK_r00 1465 +#define _TIER2_RESUME_CHECK_r11 1466 +#define _TIER2_RESUME_CHECK_r22 1467 +#define _TIER2_RESUME_CHECK_r33 1468 +#define _TO_BOOL_r11 1469 +#define _TO_BOOL_BOOL_r01 1470 +#define _TO_BOOL_BOOL_r11 1471 +#define _TO_BOOL_BOOL_r22 1472 +#define _TO_BOOL_BOOL_r33 1473 +#define _TO_BOOL_INT_r02 1474 +#define _TO_BOOL_INT_r12 1475 +#define _TO_BOOL_INT_r23 1476 +#define _TO_BOOL_LIST_r02 1477 +#define _TO_BOOL_LIST_r12 1478 +#define _TO_BOOL_LIST_r23 1479 +#define _TO_BOOL_NONE_r01 1480 +#define _TO_BOOL_NONE_r11 1481 +#define _TO_BOOL_NONE_r22 1482 +#define _TO_BOOL_NONE_r33 1483 +#define _TO_BOOL_STR_r02 1484 +#define _TO_BOOL_STR_r12 1485 +#define _TO_BOOL_STR_r23 1486 +#define _TRACE_RECORD_r00 1487 +#define _UNARY_INVERT_r12 1488 +#define _UNARY_NEGATIVE_r12 1489 +#define _UNARY_NOT_r01 1490 +#define _UNARY_NOT_r11 1491 +#define _UNARY_NOT_r22 1492 +#define _UNARY_NOT_r33 1493 +#define _UNPACK_EX_r10 1494 +#define _UNPACK_SEQUENCE_r10 1495 +#define _UNPACK_SEQUENCE_LIST_r10 1496 +#define _UNPACK_SEQUENCE_TUPLE_r10 1497 +#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1498 +#define _WITH_EXCEPT_START_r33 1499 +#define _YIELD_VALUE_r11 1500 +#define MAX_UOP_REGS_ID 1500 #ifdef __cplusplus } diff --git a/Include/internal/pycore_uop_metadata.h b/Include/internal/pycore_uop_metadata.h index ce7ea4c3a77b36..c804dbb87f7ccd 100644 --- a/Include/internal/pycore_uop_metadata.h +++ b/Include/internal/pycore_uop_metadata.h @@ -377,7 +377,10 @@ const uint32_t _PyUop_Flags[MAX_UOP_ID+1] = { [_TIER2_RESUME_CHECK] = HAS_PERIODIC_FLAG, [_COLD_EXIT] = HAS_SYNC_SP_FLAG, [_COLD_DYNAMIC_EXIT] = HAS_SYNC_SP_FLAG, - [_GUARD_CODE_VERSION] = HAS_EXIT_FLAG, + [_GUARD_CODE_VERSION__PUSH_FRAME] = HAS_EXIT_FLAG, + [_GUARD_CODE_VERSION_YIELD_VALUE] = HAS_EXIT_FLAG, + [_GUARD_CODE_VERSION_RETURN_VALUE] = HAS_EXIT_FLAG, + [_GUARD_CODE_VERSION_RETURN_GENERATOR] = HAS_EXIT_FLAG, [_GUARD_IP__PUSH_FRAME] = HAS_EXIT_FLAG, [_GUARD_IP_YIELD_VALUE] = HAS_EXIT_FLAG, [_GUARD_IP_RETURN_VALUE] = HAS_EXIT_FLAG, @@ -3474,13 +3477,40 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = { { -1, -1, -1 }, }, }, - [_GUARD_CODE_VERSION] = { + [_GUARD_CODE_VERSION__PUSH_FRAME] = { .best = { 0, 1, 2, 3 }, .entries = { - { 0, 0, _GUARD_CODE_VERSION_r00 }, - { 1, 1, _GUARD_CODE_VERSION_r11 }, - { 2, 2, _GUARD_CODE_VERSION_r22 }, - { 3, 3, _GUARD_CODE_VERSION_r33 }, + { 0, 0, _GUARD_CODE_VERSION__PUSH_FRAME_r00 }, + { 1, 1, _GUARD_CODE_VERSION__PUSH_FRAME_r11 }, + { 2, 2, _GUARD_CODE_VERSION__PUSH_FRAME_r22 }, + { 3, 3, _GUARD_CODE_VERSION__PUSH_FRAME_r33 }, + }, + }, + [_GUARD_CODE_VERSION_YIELD_VALUE] = { + .best = { 0, 1, 2, 3 }, + .entries = { + { 0, 0, _GUARD_CODE_VERSION_YIELD_VALUE_r00 }, + { 1, 1, _GUARD_CODE_VERSION_YIELD_VALUE_r11 }, + { 2, 2, _GUARD_CODE_VERSION_YIELD_VALUE_r22 }, + { 3, 3, _GUARD_CODE_VERSION_YIELD_VALUE_r33 }, + }, + }, + [_GUARD_CODE_VERSION_RETURN_VALUE] = { + .best = { 0, 1, 2, 3 }, + .entries = { + { 0, 0, _GUARD_CODE_VERSION_RETURN_VALUE_r00 }, + { 1, 1, _GUARD_CODE_VERSION_RETURN_VALUE_r11 }, + { 2, 2, _GUARD_CODE_VERSION_RETURN_VALUE_r22 }, + { 3, 3, _GUARD_CODE_VERSION_RETURN_VALUE_r33 }, + }, + }, + [_GUARD_CODE_VERSION_RETURN_GENERATOR] = { + .best = { 0, 1, 2, 3 }, + .entries = { + { 0, 0, _GUARD_CODE_VERSION_RETURN_GENERATOR_r00 }, + { 1, 1, _GUARD_CODE_VERSION_RETURN_GENERATOR_r11 }, + { 2, 2, _GUARD_CODE_VERSION_RETURN_GENERATOR_r22 }, + { 3, 3, _GUARD_CODE_VERSION_RETURN_GENERATOR_r33 }, }, }, [_GUARD_IP__PUSH_FRAME] = { @@ -4319,10 +4349,22 @@ const uint16_t _PyUop_Uncached[MAX_UOP_REGS_ID+1] = { [_TIER2_RESUME_CHECK_r33] = _TIER2_RESUME_CHECK, [_COLD_EXIT_r00] = _COLD_EXIT, [_COLD_DYNAMIC_EXIT_r00] = _COLD_DYNAMIC_EXIT, - [_GUARD_CODE_VERSION_r00] = _GUARD_CODE_VERSION, - [_GUARD_CODE_VERSION_r11] = _GUARD_CODE_VERSION, - [_GUARD_CODE_VERSION_r22] = _GUARD_CODE_VERSION, - [_GUARD_CODE_VERSION_r33] = _GUARD_CODE_VERSION, + [_GUARD_CODE_VERSION__PUSH_FRAME_r00] = _GUARD_CODE_VERSION__PUSH_FRAME, + [_GUARD_CODE_VERSION__PUSH_FRAME_r11] = _GUARD_CODE_VERSION__PUSH_FRAME, + [_GUARD_CODE_VERSION__PUSH_FRAME_r22] = _GUARD_CODE_VERSION__PUSH_FRAME, + [_GUARD_CODE_VERSION__PUSH_FRAME_r33] = _GUARD_CODE_VERSION__PUSH_FRAME, + [_GUARD_CODE_VERSION_YIELD_VALUE_r00] = _GUARD_CODE_VERSION_YIELD_VALUE, + [_GUARD_CODE_VERSION_YIELD_VALUE_r11] = _GUARD_CODE_VERSION_YIELD_VALUE, + [_GUARD_CODE_VERSION_YIELD_VALUE_r22] = _GUARD_CODE_VERSION_YIELD_VALUE, + [_GUARD_CODE_VERSION_YIELD_VALUE_r33] = _GUARD_CODE_VERSION_YIELD_VALUE, + [_GUARD_CODE_VERSION_RETURN_VALUE_r00] = _GUARD_CODE_VERSION_RETURN_VALUE, + [_GUARD_CODE_VERSION_RETURN_VALUE_r11] = _GUARD_CODE_VERSION_RETURN_VALUE, + [_GUARD_CODE_VERSION_RETURN_VALUE_r22] = _GUARD_CODE_VERSION_RETURN_VALUE, + [_GUARD_CODE_VERSION_RETURN_VALUE_r33] = _GUARD_CODE_VERSION_RETURN_VALUE, + [_GUARD_CODE_VERSION_RETURN_GENERATOR_r00] = _GUARD_CODE_VERSION_RETURN_GENERATOR, + [_GUARD_CODE_VERSION_RETURN_GENERATOR_r11] = _GUARD_CODE_VERSION_RETURN_GENERATOR, + [_GUARD_CODE_VERSION_RETURN_GENERATOR_r22] = _GUARD_CODE_VERSION_RETURN_GENERATOR, + [_GUARD_CODE_VERSION_RETURN_GENERATOR_r33] = _GUARD_CODE_VERSION_RETURN_GENERATOR, [_GUARD_IP__PUSH_FRAME_r00] = _GUARD_IP__PUSH_FRAME, [_GUARD_IP__PUSH_FRAME_r11] = _GUARD_IP__PUSH_FRAME, [_GUARD_IP__PUSH_FRAME_r22] = _GUARD_IP__PUSH_FRAME, @@ -4753,11 +4795,26 @@ const char *const _PyOpcode_uop_name[MAX_UOP_REGS_ID+1] = { [_GUARD_CALLABLE_TYPE_1_r13] = "_GUARD_CALLABLE_TYPE_1_r13", [_GUARD_CALLABLE_TYPE_1_r23] = "_GUARD_CALLABLE_TYPE_1_r23", [_GUARD_CALLABLE_TYPE_1_r33] = "_GUARD_CALLABLE_TYPE_1_r33", - [_GUARD_CODE_VERSION] = "_GUARD_CODE_VERSION", - [_GUARD_CODE_VERSION_r00] = "_GUARD_CODE_VERSION_r00", - [_GUARD_CODE_VERSION_r11] = "_GUARD_CODE_VERSION_r11", - [_GUARD_CODE_VERSION_r22] = "_GUARD_CODE_VERSION_r22", - [_GUARD_CODE_VERSION_r33] = "_GUARD_CODE_VERSION_r33", + [_GUARD_CODE_VERSION_RETURN_GENERATOR] = "_GUARD_CODE_VERSION_RETURN_GENERATOR", + [_GUARD_CODE_VERSION_RETURN_GENERATOR_r00] = "_GUARD_CODE_VERSION_RETURN_GENERATOR_r00", + [_GUARD_CODE_VERSION_RETURN_GENERATOR_r11] = "_GUARD_CODE_VERSION_RETURN_GENERATOR_r11", + [_GUARD_CODE_VERSION_RETURN_GENERATOR_r22] = "_GUARD_CODE_VERSION_RETURN_GENERATOR_r22", + [_GUARD_CODE_VERSION_RETURN_GENERATOR_r33] = "_GUARD_CODE_VERSION_RETURN_GENERATOR_r33", + [_GUARD_CODE_VERSION_RETURN_VALUE] = "_GUARD_CODE_VERSION_RETURN_VALUE", + [_GUARD_CODE_VERSION_RETURN_VALUE_r00] = "_GUARD_CODE_VERSION_RETURN_VALUE_r00", + [_GUARD_CODE_VERSION_RETURN_VALUE_r11] = "_GUARD_CODE_VERSION_RETURN_VALUE_r11", + [_GUARD_CODE_VERSION_RETURN_VALUE_r22] = "_GUARD_CODE_VERSION_RETURN_VALUE_r22", + [_GUARD_CODE_VERSION_RETURN_VALUE_r33] = "_GUARD_CODE_VERSION_RETURN_VALUE_r33", + [_GUARD_CODE_VERSION_YIELD_VALUE] = "_GUARD_CODE_VERSION_YIELD_VALUE", + [_GUARD_CODE_VERSION_YIELD_VALUE_r00] = "_GUARD_CODE_VERSION_YIELD_VALUE_r00", + [_GUARD_CODE_VERSION_YIELD_VALUE_r11] = "_GUARD_CODE_VERSION_YIELD_VALUE_r11", + [_GUARD_CODE_VERSION_YIELD_VALUE_r22] = "_GUARD_CODE_VERSION_YIELD_VALUE_r22", + [_GUARD_CODE_VERSION_YIELD_VALUE_r33] = "_GUARD_CODE_VERSION_YIELD_VALUE_r33", + [_GUARD_CODE_VERSION__PUSH_FRAME] = "_GUARD_CODE_VERSION__PUSH_FRAME", + [_GUARD_CODE_VERSION__PUSH_FRAME_r00] = "_GUARD_CODE_VERSION__PUSH_FRAME_r00", + [_GUARD_CODE_VERSION__PUSH_FRAME_r11] = "_GUARD_CODE_VERSION__PUSH_FRAME_r11", + [_GUARD_CODE_VERSION__PUSH_FRAME_r22] = "_GUARD_CODE_VERSION__PUSH_FRAME_r22", + [_GUARD_CODE_VERSION__PUSH_FRAME_r33] = "_GUARD_CODE_VERSION__PUSH_FRAME_r33", [_GUARD_DORV_NO_DICT] = "_GUARD_DORV_NO_DICT", [_GUARD_DORV_NO_DICT_r01] = "_GUARD_DORV_NO_DICT_r01", [_GUARD_DORV_NO_DICT_r11] = "_GUARD_DORV_NO_DICT_r11", @@ -6217,7 +6274,13 @@ int _PyUop_num_popped(int opcode, int oparg) return 0; case _COLD_DYNAMIC_EXIT: return 0; - case _GUARD_CODE_VERSION: + case _GUARD_CODE_VERSION__PUSH_FRAME: + return 0; + case _GUARD_CODE_VERSION_YIELD_VALUE: + return 0; + case _GUARD_CODE_VERSION_RETURN_VALUE: + return 0; + case _GUARD_CODE_VERSION_RETURN_GENERATOR: return 0; case _GUARD_IP__PUSH_FRAME: return 0; diff --git a/Python/bytecodes.c b/Python/bytecodes.c index eaa123f88507a7..2fb2c33428255a 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -5755,10 +5755,39 @@ dummy_func( Py_UNREACHABLE(); } - tier2 op(_GUARD_CODE_VERSION, (version/2 -- )) { + tier2 op(_GUARD_CODE_VERSION__PUSH_FRAME, (version/2 -- )) { PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); assert(PyCode_Check(code)); - EXIT_IF(((PyCodeObject *)code)->co_version != version); + if (((PyCodeObject *)code)->co_version != version) { + EXIT_IF(true); + } + } + + tier2 op(_GUARD_CODE_VERSION_YIELD_VALUE, (version/2 -- )) { + PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); + assert(PyCode_Check(code)); + if (((PyCodeObject *)code)->co_version != version) { + frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND; + EXIT_IF(true); + } + } + + tier2 op(_GUARD_CODE_VERSION_RETURN_VALUE, (version/2 -- )) { + PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); + assert(PyCode_Check(code)); + if (((PyCodeObject *)code)->co_version != version) { + frame->instr_ptr += frame->return_offset; + EXIT_IF(true); + } + } + + tier2 op(_GUARD_CODE_VERSION_RETURN_GENERATOR, (version/2 -- )) { + PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); + assert(PyCode_Check(code)); + if (((PyCodeObject *)code)->co_version != version) { + frame->instr_ptr += frame->return_offset; + EXIT_IF(true); + } } tier2 op(_GUARD_IP__PUSH_FRAME, (ip/4 --)) { diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index e57bdd686dc338..d89d512fd5630a 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -20753,23 +20753,25 @@ GOTO_TIER_ONE(target); } - case _GUARD_CODE_VERSION_r00: { + case _GUARD_CODE_VERSION__PUSH_FRAME_r00: { CHECK_CURRENT_CACHED_VALUES(0); assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); uint32_t version = (uint32_t)CURRENT_OPERAND0_32(); PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); assert(PyCode_Check(code)); if (((PyCodeObject *)code)->co_version != version) { - UOP_STAT_INC(uopcode, miss); - SET_CURRENT_CACHED_VALUES(0); - JUMP_TO_JUMP_TARGET(); + if (true) { + UOP_STAT_INC(uopcode, miss); + SET_CURRENT_CACHED_VALUES(0); + JUMP_TO_JUMP_TARGET(); + } } SET_CURRENT_CACHED_VALUES(0); assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); break; } - case _GUARD_CODE_VERSION_r11: { + case _GUARD_CODE_VERSION__PUSH_FRAME_r11: { CHECK_CURRENT_CACHED_VALUES(1); assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); _PyStackRef _stack_item_0 = _tos_cache0; @@ -20777,10 +20779,12 @@ PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); assert(PyCode_Check(code)); if (((PyCodeObject *)code)->co_version != version) { - UOP_STAT_INC(uopcode, miss); - _tos_cache0 = _stack_item_0; - SET_CURRENT_CACHED_VALUES(1); - JUMP_TO_JUMP_TARGET(); + if (true) { + UOP_STAT_INC(uopcode, miss); + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(1); + JUMP_TO_JUMP_TARGET(); + } } _tos_cache0 = _stack_item_0; SET_CURRENT_CACHED_VALUES(1); @@ -20788,7 +20792,7 @@ break; } - case _GUARD_CODE_VERSION_r22: { + case _GUARD_CODE_VERSION__PUSH_FRAME_r22: { CHECK_CURRENT_CACHED_VALUES(2); assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); _PyStackRef _stack_item_0 = _tos_cache0; @@ -20797,11 +20801,13 @@ PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); assert(PyCode_Check(code)); if (((PyCodeObject *)code)->co_version != version) { - UOP_STAT_INC(uopcode, miss); - _tos_cache1 = _stack_item_1; - _tos_cache0 = _stack_item_0; - SET_CURRENT_CACHED_VALUES(2); - JUMP_TO_JUMP_TARGET(); + if (true) { + UOP_STAT_INC(uopcode, miss); + _tos_cache1 = _stack_item_1; + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(2); + JUMP_TO_JUMP_TARGET(); + } } _tos_cache1 = _stack_item_1; _tos_cache0 = _stack_item_0; @@ -20810,7 +20816,7 @@ break; } - case _GUARD_CODE_VERSION_r33: { + case _GUARD_CODE_VERSION__PUSH_FRAME_r33: { CHECK_CURRENT_CACHED_VALUES(3); assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); _PyStackRef _stack_item_0 = _tos_cache0; @@ -20820,12 +20826,296 @@ PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); assert(PyCode_Check(code)); if (((PyCodeObject *)code)->co_version != version) { - UOP_STAT_INC(uopcode, miss); - _tos_cache2 = _stack_item_2; - _tos_cache1 = _stack_item_1; - _tos_cache0 = _stack_item_0; - SET_CURRENT_CACHED_VALUES(3); - JUMP_TO_JUMP_TARGET(); + if (true) { + UOP_STAT_INC(uopcode, miss); + _tos_cache2 = _stack_item_2; + _tos_cache1 = _stack_item_1; + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(3); + JUMP_TO_JUMP_TARGET(); + } + } + _tos_cache2 = _stack_item_2; + _tos_cache1 = _stack_item_1; + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(3); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + break; + } + + case _GUARD_CODE_VERSION_YIELD_VALUE_r00: { + CHECK_CURRENT_CACHED_VALUES(0); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + uint32_t version = (uint32_t)CURRENT_OPERAND0_32(); + PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); + assert(PyCode_Check(code)); + if (((PyCodeObject *)code)->co_version != version) { + frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND; + if (true) { + UOP_STAT_INC(uopcode, miss); + SET_CURRENT_CACHED_VALUES(0); + JUMP_TO_JUMP_TARGET(); + } + } + SET_CURRENT_CACHED_VALUES(0); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + break; + } + + case _GUARD_CODE_VERSION_YIELD_VALUE_r11: { + CHECK_CURRENT_CACHED_VALUES(1); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + _PyStackRef _stack_item_0 = _tos_cache0; + uint32_t version = (uint32_t)CURRENT_OPERAND0_32(); + PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); + assert(PyCode_Check(code)); + if (((PyCodeObject *)code)->co_version != version) { + frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND; + if (true) { + UOP_STAT_INC(uopcode, miss); + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(1); + JUMP_TO_JUMP_TARGET(); + } + } + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(1); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + break; + } + + case _GUARD_CODE_VERSION_YIELD_VALUE_r22: { + CHECK_CURRENT_CACHED_VALUES(2); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + _PyStackRef _stack_item_0 = _tos_cache0; + _PyStackRef _stack_item_1 = _tos_cache1; + uint32_t version = (uint32_t)CURRENT_OPERAND0_32(); + PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); + assert(PyCode_Check(code)); + if (((PyCodeObject *)code)->co_version != version) { + frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND; + if (true) { + UOP_STAT_INC(uopcode, miss); + _tos_cache1 = _stack_item_1; + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(2); + JUMP_TO_JUMP_TARGET(); + } + } + _tos_cache1 = _stack_item_1; + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(2); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + break; + } + + case _GUARD_CODE_VERSION_YIELD_VALUE_r33: { + CHECK_CURRENT_CACHED_VALUES(3); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + _PyStackRef _stack_item_0 = _tos_cache0; + _PyStackRef _stack_item_1 = _tos_cache1; + _PyStackRef _stack_item_2 = _tos_cache2; + uint32_t version = (uint32_t)CURRENT_OPERAND0_32(); + PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); + assert(PyCode_Check(code)); + if (((PyCodeObject *)code)->co_version != version) { + frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND; + if (true) { + UOP_STAT_INC(uopcode, miss); + _tos_cache2 = _stack_item_2; + _tos_cache1 = _stack_item_1; + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(3); + JUMP_TO_JUMP_TARGET(); + } + } + _tos_cache2 = _stack_item_2; + _tos_cache1 = _stack_item_1; + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(3); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + break; + } + + case _GUARD_CODE_VERSION_RETURN_VALUE_r00: { + CHECK_CURRENT_CACHED_VALUES(0); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + uint32_t version = (uint32_t)CURRENT_OPERAND0_32(); + PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); + assert(PyCode_Check(code)); + if (((PyCodeObject *)code)->co_version != version) { + frame->instr_ptr += frame->return_offset; + if (true) { + UOP_STAT_INC(uopcode, miss); + SET_CURRENT_CACHED_VALUES(0); + JUMP_TO_JUMP_TARGET(); + } + } + SET_CURRENT_CACHED_VALUES(0); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + break; + } + + case _GUARD_CODE_VERSION_RETURN_VALUE_r11: { + CHECK_CURRENT_CACHED_VALUES(1); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + _PyStackRef _stack_item_0 = _tos_cache0; + uint32_t version = (uint32_t)CURRENT_OPERAND0_32(); + PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); + assert(PyCode_Check(code)); + if (((PyCodeObject *)code)->co_version != version) { + frame->instr_ptr += frame->return_offset; + if (true) { + UOP_STAT_INC(uopcode, miss); + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(1); + JUMP_TO_JUMP_TARGET(); + } + } + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(1); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + break; + } + + case _GUARD_CODE_VERSION_RETURN_VALUE_r22: { + CHECK_CURRENT_CACHED_VALUES(2); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + _PyStackRef _stack_item_0 = _tos_cache0; + _PyStackRef _stack_item_1 = _tos_cache1; + uint32_t version = (uint32_t)CURRENT_OPERAND0_32(); + PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); + assert(PyCode_Check(code)); + if (((PyCodeObject *)code)->co_version != version) { + frame->instr_ptr += frame->return_offset; + if (true) { + UOP_STAT_INC(uopcode, miss); + _tos_cache1 = _stack_item_1; + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(2); + JUMP_TO_JUMP_TARGET(); + } + } + _tos_cache1 = _stack_item_1; + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(2); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + break; + } + + case _GUARD_CODE_VERSION_RETURN_VALUE_r33: { + CHECK_CURRENT_CACHED_VALUES(3); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + _PyStackRef _stack_item_0 = _tos_cache0; + _PyStackRef _stack_item_1 = _tos_cache1; + _PyStackRef _stack_item_2 = _tos_cache2; + uint32_t version = (uint32_t)CURRENT_OPERAND0_32(); + PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); + assert(PyCode_Check(code)); + if (((PyCodeObject *)code)->co_version != version) { + frame->instr_ptr += frame->return_offset; + if (true) { + UOP_STAT_INC(uopcode, miss); + _tos_cache2 = _stack_item_2; + _tos_cache1 = _stack_item_1; + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(3); + JUMP_TO_JUMP_TARGET(); + } + } + _tos_cache2 = _stack_item_2; + _tos_cache1 = _stack_item_1; + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(3); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + break; + } + + case _GUARD_CODE_VERSION_RETURN_GENERATOR_r00: { + CHECK_CURRENT_CACHED_VALUES(0); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + uint32_t version = (uint32_t)CURRENT_OPERAND0_32(); + PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); + assert(PyCode_Check(code)); + if (((PyCodeObject *)code)->co_version != version) { + frame->instr_ptr += frame->return_offset; + if (true) { + UOP_STAT_INC(uopcode, miss); + SET_CURRENT_CACHED_VALUES(0); + JUMP_TO_JUMP_TARGET(); + } + } + SET_CURRENT_CACHED_VALUES(0); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + break; + } + + case _GUARD_CODE_VERSION_RETURN_GENERATOR_r11: { + CHECK_CURRENT_CACHED_VALUES(1); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + _PyStackRef _stack_item_0 = _tos_cache0; + uint32_t version = (uint32_t)CURRENT_OPERAND0_32(); + PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); + assert(PyCode_Check(code)); + if (((PyCodeObject *)code)->co_version != version) { + frame->instr_ptr += frame->return_offset; + if (true) { + UOP_STAT_INC(uopcode, miss); + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(1); + JUMP_TO_JUMP_TARGET(); + } + } + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(1); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + break; + } + + case _GUARD_CODE_VERSION_RETURN_GENERATOR_r22: { + CHECK_CURRENT_CACHED_VALUES(2); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + _PyStackRef _stack_item_0 = _tos_cache0; + _PyStackRef _stack_item_1 = _tos_cache1; + uint32_t version = (uint32_t)CURRENT_OPERAND0_32(); + PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); + assert(PyCode_Check(code)); + if (((PyCodeObject *)code)->co_version != version) { + frame->instr_ptr += frame->return_offset; + if (true) { + UOP_STAT_INC(uopcode, miss); + _tos_cache1 = _stack_item_1; + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(2); + JUMP_TO_JUMP_TARGET(); + } + } + _tos_cache1 = _stack_item_1; + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(2); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + break; + } + + case _GUARD_CODE_VERSION_RETURN_GENERATOR_r33: { + CHECK_CURRENT_CACHED_VALUES(3); + assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); + _PyStackRef _stack_item_0 = _tos_cache0; + _PyStackRef _stack_item_1 = _tos_cache1; + _PyStackRef _stack_item_2 = _tos_cache2; + uint32_t version = (uint32_t)CURRENT_OPERAND0_32(); + PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); + assert(PyCode_Check(code)); + if (((PyCodeObject *)code)->co_version != version) { + frame->instr_ptr += frame->return_offset; + if (true) { + UOP_STAT_INC(uopcode, miss); + _tos_cache2 = _stack_item_2; + _tos_cache1 = _stack_item_1; + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(3); + JUMP_TO_JUMP_TARGET(); + } } _tos_cache2 = _stack_item_2; _tos_cache1 = _stack_item_1; diff --git a/Python/optimizer.c b/Python/optimizer.c index f350b82397f575..83a11f613a2db7 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -528,6 +528,26 @@ guard_ip_uop[MAX_UOP_ID + 1] = { [_YIELD_VALUE] = _GUARD_IP_YIELD_VALUE, }; +static const uint16_t +guard_code_version_uop[MAX_UOP_ID + 1] = { + [_PUSH_FRAME] = _GUARD_CODE_VERSION__PUSH_FRAME, + [_RETURN_GENERATOR] = _GUARD_CODE_VERSION_RETURN_GENERATOR, + [_RETURN_VALUE] = _GUARD_CODE_VERSION_RETURN_VALUE, + [_YIELD_VALUE] = _GUARD_CODE_VERSION_YIELD_VALUE, +}; + +static const uint16_t +dynamic_exit_uop[MAX_UOP_ID + 1] = { + [_GUARD_IP__PUSH_FRAME] = 1, + [_GUARD_IP_RETURN_GENERATOR] = 1, + [_GUARD_IP_RETURN_VALUE] = 1, + [_GUARD_IP_YIELD_VALUE] = 1, + [_GUARD_CODE_VERSION__PUSH_FRAME] = 1, + [_GUARD_CODE_VERSION_RETURN_GENERATOR] = 1, + [_GUARD_CODE_VERSION_RETURN_VALUE] = 1, + [_GUARD_CODE_VERSION_YIELD_VALUE] = 1, +}; + #define CONFIDENCE_RANGE 1000 #define CONFIDENCE_CUTOFF 333 @@ -939,9 +959,10 @@ _PyJit_translate_single_bytecode_to_trace( } // End switch (opcode) if (needs_guard_ip) { - uint16_t guard_ip = guard_ip_uop[uop_buffer_last(trace)->opcode]; + int last_opcode = uop_buffer_last(trace)->opcode; + uint16_t guard_ip = guard_ip_uop[last_opcode]; if (guard_ip == 0) { - DPRINTF(1, "Unknown uop needing guard ip %s\n", _PyOpcode_uop_name[uop_buffer_last(trace)->opcode]); + DPRINTF(1, "Unknown uop needing guard ip %s\n", _PyOpcode_uop_name[last_opcode]); Py_UNREACHABLE(); } PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable); @@ -952,7 +973,7 @@ _PyJit_translate_single_bytecode_to_trace( /* Record stack depth, in operand1 */ int stack_depth = (int)(frame->stackpointer - _PyFrame_Stackbase(frame)); uop_buffer_last(trace)->operand1 = stack_depth; - ADD_TO_TRACE(_GUARD_CODE_VERSION, 0, ((PyCodeObject *)code)->co_version, 0); + ADD_TO_TRACE(guard_code_version_uop[last_opcode], 0, ((PyCodeObject *)code)->co_version, 0); } } // Loop back to the start @@ -1219,13 +1240,7 @@ prepare_for_execution(_PyUOpInstruction *buffer, int length) base_exit_op = _HANDLE_PENDING_AND_DEOPT; } int32_t jump_target = target; - if ( - base_opcode == _GUARD_IP__PUSH_FRAME || - base_opcode == _GUARD_IP_RETURN_VALUE || - base_opcode == _GUARD_IP_YIELD_VALUE || - base_opcode == _GUARD_IP_RETURN_GENERATOR || - base_opcode == _GUARD_CODE_VERSION - ) { + if (dynamic_exit_uop[base_opcode]) { base_exit_op = _DYNAMIC_EXIT; } int exit_depth = get_cached_entries_for_side_exit(inst); diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 9b77fd0c32d9d9..7ca33e9e77fb74 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -1775,19 +1775,6 @@ dummy_func(void) { // do not need an IP guard. } - op(_GUARD_CODE_VERSION, (version/2 -- )) { - PyCodeObject *co = get_current_code_object(ctx); - if (co->co_version == version) { - _Py_BloomFilter_Add(dependencies, co); - // TODO gh-144651: - // If we've previously guarded on this code version in a trace, we - // can avoid guarding it again. - } - else { - ctx->done = true; - } - } - op(_GUARD_IP_YIELD_VALUE, (ip/4 --)) { (void)ip; if (ctx->frame->caller) { diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index eef07cedaf38e2..df6368ca8ce011 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -4299,15 +4299,19 @@ break; } - case _GUARD_CODE_VERSION: { - uint32_t version = (uint32_t)this_instr->operand0; - PyCodeObject *co = get_current_code_object(ctx); - if (co->co_version == version) { - _Py_BloomFilter_Add(dependencies, co); - } - else { - ctx->done = true; - } + case _GUARD_CODE_VERSION__PUSH_FRAME: { + break; + } + + case _GUARD_CODE_VERSION_YIELD_VALUE: { + break; + } + + case _GUARD_CODE_VERSION_RETURN_VALUE: { + break; + } + + case _GUARD_CODE_VERSION_RETURN_GENERATOR: { break; } From e0f7c1097e19b6f5c2399e19f283c9fb373c243f Mon Sep 17 00:00:00 2001 From: Sam Gross Date: Tue, 17 Mar 2026 14:24:44 -0400 Subject: [PATCH 8/8] gh-145779: Improve classmethod/staticmethod scaling in free-threaded build (#145826) Add special cases for classmethod and staticmethod descriptors in _PyObject_GetMethodStackRef() to avoid calling tp_descr_get, which avoids reference count contention on the bound method and underlying callable. This improves scaling when calling classmethods and staticmethods from multiple threads. Also refactor method_vectorcall in classobject.c into a new _PyObject_VectorcallPrepend() helper so that it can be used by PyObject_VectorcallMethod as well. --- Include/internal/pycore_call.h | 8 ++ Include/internal/pycore_function.h | 5 + Include/internal/pycore_object.h | 2 +- ...10-22-38-40.gh-issue-145779.5375381d80.rst | 2 + Objects/call.c | 105 +++++++++++++++--- Objects/classobject.c | 49 +------- Objects/funcobject.c | 8 ++ Objects/object.c | 53 +++++++-- Python/ceval.c | 52 ++++----- Tools/ftscalingbench/ftscalingbench.py | 21 ++++ 10 files changed, 201 insertions(+), 104 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-03-10-22-38-40.gh-issue-145779.5375381d80.rst diff --git a/Include/internal/pycore_call.h b/Include/internal/pycore_call.h index 4f4cf02f64b828..e544b4cf49d1fb 100644 --- a/Include/internal/pycore_call.h +++ b/Include/internal/pycore_call.h @@ -65,6 +65,14 @@ PyAPI_FUNC(PyObject*) _PyObject_CallMethod( const char *format, ...); +extern PyObject *_PyObject_VectorcallPrepend( + PyThreadState *tstate, + PyObject *callable, + PyObject *arg, + PyObject *const *args, + size_t nargsf, + PyObject *kwnames); + /* === Vectorcall protocol (PEP 590) ============================= */ // Call callable using tp_call. Arguments are like PyObject_Vectorcall(), diff --git a/Include/internal/pycore_function.h b/Include/internal/pycore_function.h index 9c2121f59a4a0c..99dacaf0fe7c54 100644 --- a/Include/internal/pycore_function.h +++ b/Include/internal/pycore_function.h @@ -46,6 +46,11 @@ static inline PyObject* _PyFunction_GET_BUILTINS(PyObject *func) { #define _PyFunction_GET_BUILTINS(func) _PyFunction_GET_BUILTINS(_PyObject_CAST(func)) +/* Get the callable wrapped by a classmethod. + Returns a borrowed reference. + The caller must ensure 'cm' is a classmethod object. */ +extern PyObject *_PyClassMethod_GetFunc(PyObject *cm); + /* Get the callable wrapped by a staticmethod. Returns a borrowed reference. The caller must ensure 'sm' is a staticmethod object. */ diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index 8c241c7707d074..96685af02cd0e3 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -895,7 +895,7 @@ extern PyObject *_PyType_LookupRefAndVersion(PyTypeObject *, PyObject *, extern unsigned int _PyType_LookupStackRefAndVersion(PyTypeObject *type, PyObject *name, _PyStackRef *out); -PyAPI_FUNC(int) _PyObject_GetMethodStackRef(PyThreadState *ts, PyObject *obj, +extern int _PyObject_GetMethodStackRef(PyThreadState *ts, _PyStackRef *self, PyObject *name, _PyStackRef *method); // Like PyObject_GetAttr but returns a _PyStackRef. For types, this can diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-10-22-38-40.gh-issue-145779.5375381d80.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-10-22-38-40.gh-issue-145779.5375381d80.rst new file mode 100644 index 00000000000000..9cd0263a107f16 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-10-22-38-40.gh-issue-145779.5375381d80.rst @@ -0,0 +1,2 @@ +Improve scaling of :func:`classmethod` and :func:`staticmethod` calls in +the free-threaded build by avoiding the descriptor ``__get__`` call. diff --git a/Objects/call.c b/Objects/call.c index 4b1b4bd52a2e56..9718642473103c 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -828,6 +828,60 @@ object_vacall(PyThreadState *tstate, PyObject *base, return result; } +PyObject * +_PyObject_VectorcallPrepend(PyThreadState *tstate, PyObject *callable, + PyObject *arg, PyObject *const *args, + size_t nargsf, PyObject *kwnames) +{ + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + assert(nargs == 0 || args[nargs-1]); + + PyObject *result; + if (nargsf & PY_VECTORCALL_ARGUMENTS_OFFSET) { + /* PY_VECTORCALL_ARGUMENTS_OFFSET is set, so we are allowed to mutate the vector */ + PyObject **newargs = (PyObject**)args - 1; + nargs += 1; + PyObject *tmp = newargs[0]; + newargs[0] = arg; + assert(newargs[nargs-1]); + result = _PyObject_VectorcallTstate(tstate, callable, newargs, + nargs, kwnames); + newargs[0] = tmp; + } + else { + Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames); + Py_ssize_t totalargs = nargs + nkwargs; + if (totalargs == 0) { + return _PyObject_VectorcallTstate(tstate, callable, &arg, 1, NULL); + } + + PyObject *newargs_stack[_PY_FASTCALL_SMALL_STACK]; + PyObject **newargs; + if (totalargs <= (Py_ssize_t)Py_ARRAY_LENGTH(newargs_stack) - 1) { + newargs = newargs_stack; + } + else { + newargs = PyMem_Malloc((totalargs+1) * sizeof(PyObject *)); + if (newargs == NULL) { + _PyErr_NoMemory(tstate); + return NULL; + } + } + /* use borrowed references */ + newargs[0] = arg; + /* bpo-37138: since totalargs > 0, it's impossible that args is NULL. + * We need this, since calling memcpy() with a NULL pointer is + * undefined behaviour. */ + assert(args != NULL); + memcpy(newargs + 1, args, totalargs * sizeof(PyObject *)); + result = _PyObject_VectorcallTstate(tstate, callable, + newargs, nargs+1, kwnames); + if (newargs != newargs_stack) { + PyMem_Free(newargs); + } + } + return result; +} PyObject * PyObject_VectorcallMethod(PyObject *name, PyObject *const *args, @@ -838,31 +892,44 @@ PyObject_VectorcallMethod(PyObject *name, PyObject *const *args, assert(PyVectorcall_NARGS(nargsf) >= 1); PyThreadState *tstate = _PyThreadState_GET(); - _PyCStackRef method; + _PyCStackRef self, method; + _PyThreadState_PushCStackRef(tstate, &self); _PyThreadState_PushCStackRef(tstate, &method); /* Use args[0] as "self" argument */ - int unbound = _PyObject_GetMethodStackRef(tstate, args[0], name, &method.ref); - if (PyStackRef_IsNull(method.ref)) { + self.ref = PyStackRef_FromPyObjectBorrow(args[0]); + int unbound = _PyObject_GetMethodStackRef(tstate, &self.ref, name, &method.ref); + if (unbound < 0) { _PyThreadState_PopCStackRef(tstate, &method); + _PyThreadState_PopCStackRef(tstate, &self); return NULL; } + PyObject *callable = PyStackRef_AsPyObjectBorrow(method.ref); + PyObject *self_obj = PyStackRef_AsPyObjectBorrow(self.ref); + PyObject *result; - if (unbound) { + EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_METHOD, callable); + if (self_obj == NULL) { + /* Skip "self". We can keep PY_VECTORCALL_ARGUMENTS_OFFSET since + * args[-1] in the onward call is args[0] here. */ + result = _PyObject_VectorcallTstate(tstate, callable, + args + 1, nargsf - 1, kwnames); + } + else if (self_obj == args[0]) { /* We must remove PY_VECTORCALL_ARGUMENTS_OFFSET since * that would be interpreted as allowing to change args[-1] */ - nargsf &= ~PY_VECTORCALL_ARGUMENTS_OFFSET; + result = _PyObject_VectorcallTstate(tstate, callable, args, + nargsf & ~PY_VECTORCALL_ARGUMENTS_OFFSET, + kwnames); } else { - /* Skip "self". We can keep PY_VECTORCALL_ARGUMENTS_OFFSET since - * args[-1] in the onward call is args[0] here. */ - args++; - nargsf--; + /* classmethod: self_obj is the type, not args[0]. Replace + * args[0] with self_obj and call the underlying callable. */ + result = _PyObject_VectorcallPrepend(tstate, callable, self_obj, + args + 1, nargsf - 1, kwnames); } - EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_METHOD, callable); - PyObject *result = _PyObject_VectorcallTstate(tstate, callable, - args, nargsf, kwnames); _PyThreadState_PopCStackRef(tstate, &method); + _PyThreadState_PopCStackRef(tstate, &self); return result; } @@ -875,22 +942,26 @@ PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...) return null_error(tstate); } - _PyCStackRef method; + _PyCStackRef self, method; + _PyThreadState_PushCStackRef(tstate, &self); _PyThreadState_PushCStackRef(tstate, &method); - int is_method = _PyObject_GetMethodStackRef(tstate, obj, name, &method.ref); - if (PyStackRef_IsNull(method.ref)) { + self.ref = PyStackRef_FromPyObjectBorrow(obj); + int res = _PyObject_GetMethodStackRef(tstate, &self.ref, name, &method.ref); + if (res < 0) { _PyThreadState_PopCStackRef(tstate, &method); + _PyThreadState_PopCStackRef(tstate, &self); return NULL; } PyObject *callable = PyStackRef_AsPyObjectBorrow(method.ref); - obj = is_method ? obj : NULL; + PyObject *self_obj = PyStackRef_AsPyObjectBorrow(self.ref); va_list vargs; va_start(vargs, name); - PyObject *result = object_vacall(tstate, obj, callable, vargs); + PyObject *result = object_vacall(tstate, self_obj, callable, vargs); va_end(vargs); _PyThreadState_PopCStackRef(tstate, &method); + _PyThreadState_PopCStackRef(tstate, &self); return result; } diff --git a/Objects/classobject.c b/Objects/classobject.c index 4c99c194df53a5..238f1c1dad7d86 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -52,54 +52,7 @@ method_vectorcall(PyObject *method, PyObject *const *args, PyThreadState *tstate = _PyThreadState_GET(); PyObject *self = PyMethod_GET_SELF(method); PyObject *func = PyMethod_GET_FUNCTION(method); - Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); - assert(nargs == 0 || args[nargs-1]); - - PyObject *result; - if (nargsf & PY_VECTORCALL_ARGUMENTS_OFFSET) { - /* PY_VECTORCALL_ARGUMENTS_OFFSET is set, so we are allowed to mutate the vector */ - PyObject **newargs = (PyObject**)args - 1; - nargs += 1; - PyObject *tmp = newargs[0]; - newargs[0] = self; - assert(newargs[nargs-1]); - result = _PyObject_VectorcallTstate(tstate, func, newargs, - nargs, kwnames); - newargs[0] = tmp; - } - else { - Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames); - Py_ssize_t totalargs = nargs + nkwargs; - if (totalargs == 0) { - return _PyObject_VectorcallTstate(tstate, func, &self, 1, NULL); - } - - PyObject *newargs_stack[_PY_FASTCALL_SMALL_STACK]; - PyObject **newargs; - if (totalargs <= (Py_ssize_t)Py_ARRAY_LENGTH(newargs_stack) - 1) { - newargs = newargs_stack; - } - else { - newargs = PyMem_Malloc((totalargs+1) * sizeof(PyObject *)); - if (newargs == NULL) { - _PyErr_NoMemory(tstate); - return NULL; - } - } - /* use borrowed references */ - newargs[0] = self; - /* bpo-37138: since totalargs > 0, it's impossible that args is NULL. - * We need this, since calling memcpy() with a NULL pointer is - * undefined behaviour. */ - assert(args != NULL); - memcpy(newargs + 1, args, totalargs * sizeof(PyObject *)); - result = _PyObject_VectorcallTstate(tstate, func, - newargs, nargs+1, kwnames); - if (newargs != newargs_stack) { - PyMem_Free(newargs); - } - } - return result; + return _PyObject_VectorcallPrepend(tstate, func, self, args, nargsf, kwnames); } diff --git a/Objects/funcobject.c b/Objects/funcobject.c index a7a3d9c78ef3d0..585c7b9a85412c 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -1469,6 +1469,7 @@ cm_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (cm == NULL) { return NULL; } + _PyObject_SetDeferredRefcount((PyObject *)cm); if (cm_set_callable(cm, callable) < 0) { Py_DECREF(cm); return NULL; @@ -1905,6 +1906,13 @@ PyStaticMethod_New(PyObject *callable) return (PyObject *)sm; } +PyObject * +_PyClassMethod_GetFunc(PyObject *self) +{ + classmethod *cm = _PyClassMethod_CAST(self); + return cm->cm_callable; +} + PyObject * _PyStaticMethod_GetFunc(PyObject *self) { diff --git a/Objects/object.c b/Objects/object.c index e405963614689f..ae6ad558ff6c37 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -10,6 +10,7 @@ #include "pycore_descrobject.h" // _PyMethodWrapper_Type #include "pycore_dict.h" // _PyObject_MaterializeManagedDict() #include "pycore_floatobject.h" // _PyFloat_DebugMallocStats() +#include "pycore_function.h" // _PyClassMethod_GetFunc() #include "pycore_freelist.h" // _PyObject_ClearFreeLists() #include "pycore_genobject.h" // _PyAsyncGenAThrow_Type #include "pycore_hamt.h" // _PyHamtItems_Type @@ -1741,27 +1742,39 @@ _PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) return 0; } +// Look up a method on `self` by `name`. +// +// On success, `*method` is set and the function returns 0 or 1. If the +// return value is 1, the call is an unbound method and `*self` is the +// "self" or "cls" argument to pass. If the return value is 0, the call is +// a regular function and `*self` is cleared. +// +// On error, returns -1, clears `*self`, and sets an exception. int -_PyObject_GetMethodStackRef(PyThreadState *ts, PyObject *obj, +_PyObject_GetMethodStackRef(PyThreadState *ts, _PyStackRef *self, PyObject *name, _PyStackRef *method) { int meth_found = 0; + PyObject *obj = PyStackRef_AsPyObjectBorrow(*self); assert(PyStackRef_IsNull(*method)); PyTypeObject *tp = Py_TYPE(obj); if (!_PyType_IsReady(tp)) { if (PyType_Ready(tp) < 0) { - return 0; + PyStackRef_CLEAR(*self); + return -1; } } if (tp->tp_getattro != PyObject_GenericGetAttr || !PyUnicode_CheckExact(name)) { PyObject *res = PyObject_GetAttr(obj, name); + PyStackRef_CLEAR(*self); if (res != NULL) { *method = PyStackRef_FromPyObjectSteal(res); + return 0; } - return 0; + return -1; } _PyType_LookupStackRefAndVersion(tp, name, method); @@ -1776,10 +1789,12 @@ _PyObject_GetMethodStackRef(PyThreadState *ts, PyObject *obj, if (f != NULL && PyDescr_IsData(descr)) { PyObject *value = f(descr, obj, (PyObject *)Py_TYPE(obj)); PyStackRef_CLEAR(*method); + PyStackRef_CLEAR(*self); if (value != NULL) { *method = PyStackRef_FromPyObjectSteal(value); + return 0; } - return 0; + return -1; } } } @@ -1787,9 +1802,9 @@ _PyObject_GetMethodStackRef(PyThreadState *ts, PyObject *obj, if ((tp->tp_flags & Py_TPFLAGS_INLINE_VALUES) && _PyObject_TryGetInstanceAttribute(obj, name, &attr)) { if (attr != NULL) { - PyStackRef_CLEAR(*method); - *method = PyStackRef_FromPyObjectSteal(attr); - return 0; + PyStackRef_XSETREF(*method, PyStackRef_FromPyObjectSteal(attr)); + PyStackRef_CLEAR(*self); + return 0; } dict = NULL; } @@ -1810,9 +1825,11 @@ _PyObject_GetMethodStackRef(PyThreadState *ts, PyObject *obj, int found = _PyDict_GetMethodStackRef((PyDictObject *)dict, name, method); if (found < 0) { assert(PyStackRef_IsNull(*method)); + PyStackRef_CLEAR(*self); return -1; } else if (found) { + PyStackRef_CLEAR(*self); return 0; } } @@ -1823,16 +1840,31 @@ _PyObject_GetMethodStackRef(PyThreadState *ts, PyObject *obj, } if (f != NULL) { - PyObject *value = f(descr, obj, (PyObject *)Py_TYPE(obj)); + if (Py_IS_TYPE(descr, &PyClassMethod_Type)) { + PyObject *callable = _PyClassMethod_GetFunc(descr); + PyStackRef_XSETREF(*method, PyStackRef_FromPyObjectNew(callable)); + PyStackRef_XSETREF(*self, PyStackRef_FromPyObjectNew((PyObject *)tp)); + return 1; + } + else if (Py_IS_TYPE(descr, &PyStaticMethod_Type)) { + PyObject *callable = _PyStaticMethod_GetFunc(descr); + PyStackRef_XSETREF(*method, PyStackRef_FromPyObjectNew(callable)); + PyStackRef_CLEAR(*self); + return 0; + } + PyObject *value = f(descr, obj, (PyObject *)tp); PyStackRef_CLEAR(*method); + PyStackRef_CLEAR(*self); if (value) { *method = PyStackRef_FromPyObjectSteal(value); + return 0; } - return 0; + return -1; } if (descr != NULL) { assert(!PyStackRef_IsNull(*method)); + PyStackRef_CLEAR(*self); return 0; } @@ -1842,7 +1874,8 @@ _PyObject_GetMethodStackRef(PyThreadState *ts, PyObject *obj, _PyObject_SetAttributeErrorContext(obj, name); assert(PyStackRef_IsNull(*method)); - return 0; + PyStackRef_CLEAR(*self); + return -1; } diff --git a/Python/ceval.c b/Python/ceval.c index da41851e7448a6..29f81317722a80 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -437,13 +437,15 @@ _PyEval_MatchKeys(PyThreadState *tstate, PyObject *map, PyObject *keys) // - Atomically check for a key and get its value without error handling. // - Don't cause key creation or resizing in dict subclasses like // collections.defaultdict that define __missing__ (or similar). - _PyCStackRef cref; - _PyThreadState_PushCStackRef(tstate, &cref); - int meth_found = _PyObject_GetMethodStackRef(tstate, map, &_Py_ID(get), &cref.ref); - PyObject *get = PyStackRef_AsPyObjectBorrow(cref.ref); - if (get == NULL) { + _PyCStackRef self, method; + _PyThreadState_PushCStackRef(tstate, &self); + _PyThreadState_PushCStackRef(tstate, &method); + self.ref = PyStackRef_FromPyObjectBorrow(map); + int res = _PyObject_GetMethodStackRef(tstate, &self.ref, &_Py_ID(get), &method.ref); + if (res < 0) { goto fail; } + PyObject *get = PyStackRef_AsPyObjectBorrow(method.ref); seen = PySet_New(NULL); if (seen == NULL) { goto fail; @@ -467,9 +469,10 @@ _PyEval_MatchKeys(PyThreadState *tstate, PyObject *map, PyObject *keys) } goto fail; } - PyObject *args[] = { map, key, dummy }; + PyObject *self_obj = PyStackRef_AsPyObjectBorrow(self.ref); + PyObject *args[] = { self_obj, key, dummy }; PyObject *value = NULL; - if (meth_found) { + if (!PyStackRef_IsNull(self.ref)) { value = PyObject_Vectorcall(get, args, 3, NULL); } else { @@ -490,12 +493,14 @@ _PyEval_MatchKeys(PyThreadState *tstate, PyObject *map, PyObject *keys) } // Success: done: - _PyThreadState_PopCStackRef(tstate, &cref); + _PyThreadState_PopCStackRef(tstate, &method); + _PyThreadState_PopCStackRef(tstate, &self); Py_DECREF(seen); Py_DECREF(dummy); return values; fail: - _PyThreadState_PopCStackRef(tstate, &cref); + _PyThreadState_PopCStackRef(tstate, &method); + _PyThreadState_PopCStackRef(tstate, &self); Py_XDECREF(seen); Py_XDECREF(dummy); Py_XDECREF(values); @@ -1020,26 +1025,17 @@ _Py_LoadAttr_StackRefSteal( PyThreadState *tstate, _PyStackRef owner, PyObject *name, _PyStackRef *self_or_null) { - _PyCStackRef method; + // Use _PyCStackRefs to ensure that both method and self are visible to + // the GC. Even though self_or_null is on the evaluation stack, it may be + // after the stackpointer and therefore not visible to the GC. + _PyCStackRef method, self; _PyThreadState_PushCStackRef(tstate, &method); - int is_meth = _PyObject_GetMethodStackRef(tstate, PyStackRef_AsPyObjectBorrow(owner), name, &method.ref); - if (is_meth) { - /* We can bypass temporary bound method object. - meth is unbound method and obj is self. - meth | self | arg1 | ... | argN - */ - assert(!PyStackRef_IsNull(method.ref)); // No errors on this branch - self_or_null[0] = owner; // Transfer ownership - return _PyThreadState_PopCStackRefSteal(tstate, &method); - } - /* meth is not an unbound method (but a regular attr, or - something was returned by a descriptor protocol). Set - the second element of the stack to NULL, to signal - CALL that it's not a method call. - meth | NULL | arg1 | ... | argN - */ - PyStackRef_CLOSE(owner); - self_or_null[0] = PyStackRef_NULL; + _PyThreadState_PushCStackRef(tstate, &self); + self.ref = owner; // steal reference to owner + // NOTE: method.ref is initialized to PyStackRef_NULL and remains null on + // error, so we don't need to explicitly use the return code from the call. + _PyObject_GetMethodStackRef(tstate, &self.ref, name, &method.ref); + *self_or_null = _PyThreadState_PopCStackRefSteal(tstate, &self); return _PyThreadState_PopCStackRefSteal(tstate, &method); } diff --git a/Tools/ftscalingbench/ftscalingbench.py b/Tools/ftscalingbench/ftscalingbench.py index 8d8bbc88e7f30a..bcbd61f601a7d3 100644 --- a/Tools/ftscalingbench/ftscalingbench.py +++ b/Tools/ftscalingbench/ftscalingbench.py @@ -258,6 +258,27 @@ def method(self): obj.method() +class MyClassMethod: + @classmethod + def my_classmethod(cls): + return cls + + @staticmethod + def my_staticmethod(): + pass + +@register_benchmark +def classmethod_call(): + obj = MyClassMethod() + for _ in range(1000 * WORK_SCALE): + obj.my_classmethod() + +@register_benchmark +def staticmethod_call(): + obj = MyClassMethod() + for _ in range(1000 * WORK_SCALE): + obj.my_staticmethod() + @register_benchmark def deepcopy(): x = {'list': [1, 2], 'tuple': (1, None)}