aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--Doc/library/dis.rst11
-rw-r--r--Doc/whatsnew/3.14.rst6
-rw-r--r--Include/internal/pycore_code.h3
-rw-r--r--Include/internal/pycore_magic_number.h3
-rw-r--r--Include/internal/pycore_opcode_metadata.h122
-rw-r--r--Include/internal/pycore_uop_ids.h355
-rw-r--r--Include/internal/pycore_uop_metadata.h40
-rw-r--r--Include/opcode.h3
-rw-r--r--Include/opcode_ids.h243
-rw-r--r--Lib/_opcode_metadata.py255
-rw-r--r--Lib/test/test__opcode.py2
-rw-r--r--Lib/test/test_compile.py18
-rw-r--r--Lib/test/test_dis.py372
-rw-r--r--Lib/test/test_opcache.py16
-rw-r--r--Lib/test/test_peepholer.py15
-rw-r--r--Misc/NEWS.d/next/Core_and_Builtins/2025-02-07-17-06-39.gh-issue-100239.WvBTPL.rst1
-rw-r--r--Modules/_opcode.c1
-rw-r--r--Programs/test_frozenmain.h29
-rw-r--r--Python/bytecodes.c72
-rw-r--r--Python/ceval.c1
-rw-r--r--Python/codegen.c21
-rw-r--r--Python/executor_cases.c.h51
-rw-r--r--Python/flowgraph.c13
-rw-r--r--Python/generated_cases.c.h583
-rw-r--r--Python/opcode_targets.h39
-rw-r--r--Python/optimizer.c2
-rw-r--r--Python/optimizer_bytecodes.c2
-rw-r--r--Python/optimizer_cases.c.h21
-rw-r--r--Python/specialize.c298
-rw-r--r--Tools/c-analyzer/cpython/ignored.tsv4
30 files changed, 1218 insertions, 1384 deletions
diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst
index f8f4188d27b..d914acbbc67 100644
--- a/Doc/library/dis.rst
+++ b/Doc/library/dis.rst
@@ -703,15 +703,8 @@ not have to be) the original ``STACK[-2]``.
STACK.append(lhs op rhs)
.. versionadded:: 3.11
-
-
-.. opcode:: BINARY_SUBSCR
-
- Implements::
-
- key = STACK.pop()
- container = STACK.pop()
- STACK.append(container[key])
+ .. versionchanged:: 3.14
+ With oparg :``NB_SUBSCR``, implements binary subscript (replaces opcode ``BINARY_SUBSCR``)
.. opcode:: STORE_SUBSCR
diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst
index 6eb256586e7..5cef8999944 100644
--- a/Doc/whatsnew/3.14.rst
+++ b/Doc/whatsnew/3.14.rst
@@ -1199,6 +1199,12 @@ Others
:meth:`~object.__index__`. (Contributed by Mark Dickinson in :gh:`119743`.)
+CPython Bytecode Changes
+========================
+
+* Replaced the opcode ``BINARY_SUBSCR`` by :opcode:`BINARY_OP` with oparg ``NB_SUBSCR``.
+ (Contributed by Irit Katriel in :gh:`100239`.)
+
Porting to Python 3.14
======================
diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h
index 65c3d142458..6d45d5f0c40 100644
--- a/Include/internal/pycore_code.h
+++ b/Include/internal/pycore_code.h
@@ -338,8 +338,6 @@ extern void _Py_Specialize_StoreAttr(_PyStackRef owner, _Py_CODEUNIT *instr,
PyObject *name);
extern void _Py_Specialize_LoadGlobal(PyObject *globals, PyObject *builtins,
_Py_CODEUNIT *instr, PyObject *name);
-extern void _Py_Specialize_BinarySubscr(_PyStackRef sub, _PyStackRef container,
- _Py_CODEUNIT *instr);
extern void _Py_Specialize_StoreSubscr(_PyStackRef container, _PyStackRef sub,
_Py_CODEUNIT *instr);
extern void _Py_Specialize_Call(_PyStackRef callable, _Py_CODEUNIT *instr,
@@ -586,6 +584,7 @@ typedef int (*binaryopguardfunc)(PyObject *lhs, PyObject *rhs);
typedef PyObject *(*binaryopactionfunc)(PyObject *lhs, PyObject *rhs);
typedef struct {
+ int oparg;
binaryopguardfunc guard;
binaryopactionfunc action;
} _PyBinaryOpSpecializationDescr;
diff --git a/Include/internal/pycore_magic_number.h b/Include/internal/pycore_magic_number.h
index 5a0b6dae8a5..4803213e84b 100644
--- a/Include/internal/pycore_magic_number.h
+++ b/Include/internal/pycore_magic_number.h
@@ -268,6 +268,7 @@ Known values:
Python 3.14a4 3613 (Add LOAD_CONST_MORTAL instruction)
Python 3.14a5 3614 (Add BINARY_OP_EXTEND)
Python 3.14a5 3615 (CALL_FUNCTION_EX always take a kwargs argument)
+ Python 3.14a5 3616 (Remove BINARY_SUBSCR and family. Make them BINARY_OPs)
Python 3.15 will start with 3650
@@ -280,7 +281,7 @@ PC/launcher.c must also be updated.
*/
-#define PYC_MAGIC_NUMBER 3615
+#define PYC_MAGIC_NUMBER 3616
/* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes
(little-endian) and then appending b'\r\n'. */
#define PYC_MAGIC_NUMBER_TOKEN \
diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h
index beb0baa7bb6..24c698adb31 100644
--- a/Include/internal/pycore_opcode_metadata.h
+++ b/Include/internal/pycore_opcode_metadata.h
@@ -51,24 +51,22 @@ int _PyOpcode_num_popped(int opcode, int oparg) {
return 2;
case BINARY_OP_MULTIPLY_INT:
return 2;
- case BINARY_OP_SUBTRACT_FLOAT:
- return 2;
- case BINARY_OP_SUBTRACT_INT:
+ case BINARY_OP_SUBSCR_DICT:
return 2;
- case BINARY_SLICE:
- return 3;
- case BINARY_SUBSCR:
+ case BINARY_OP_SUBSCR_GETITEM:
return 2;
- case BINARY_SUBSCR_DICT:
+ case BINARY_OP_SUBSCR_LIST_INT:
return 2;
- case BINARY_SUBSCR_GETITEM:
+ case BINARY_OP_SUBSCR_STR_INT:
return 2;
- case BINARY_SUBSCR_LIST_INT:
+ case BINARY_OP_SUBSCR_TUPLE_INT:
return 2;
- case BINARY_SUBSCR_STR_INT:
+ case BINARY_OP_SUBTRACT_FLOAT:
return 2;
- case BINARY_SUBSCR_TUPLE_INT:
+ case BINARY_OP_SUBTRACT_INT:
return 2;
+ case BINARY_SLICE:
+ return 3;
case BUILD_LIST:
return oparg;
case BUILD_MAP:
@@ -526,23 +524,21 @@ int _PyOpcode_num_pushed(int opcode, int oparg) {
return 1;
case BINARY_OP_MULTIPLY_INT:
return 1;
- case BINARY_OP_SUBTRACT_FLOAT:
- return 1;
- case BINARY_OP_SUBTRACT_INT:
+ case BINARY_OP_SUBSCR_DICT:
return 1;
- case BINARY_SLICE:
+ case BINARY_OP_SUBSCR_GETITEM:
+ return 0;
+ case BINARY_OP_SUBSCR_LIST_INT:
return 1;
- case BINARY_SUBSCR:
+ case BINARY_OP_SUBSCR_STR_INT:
return 1;
- case BINARY_SUBSCR_DICT:
+ case BINARY_OP_SUBSCR_TUPLE_INT:
return 1;
- case BINARY_SUBSCR_GETITEM:
- return 0;
- case BINARY_SUBSCR_LIST_INT:
+ case BINARY_OP_SUBTRACT_FLOAT:
return 1;
- case BINARY_SUBSCR_STR_INT:
+ case BINARY_OP_SUBTRACT_INT:
return 1;
- case BINARY_SUBSCR_TUPLE_INT:
+ case BINARY_SLICE:
return 1;
case BUILD_LIST:
return 1;
@@ -986,7 +982,7 @@ extern int _PyOpcode_max_stack_effect(int opcode, int oparg, int *effect);
int _PyOpcode_max_stack_effect(int opcode, int oparg, int *effect) {
switch(opcode) {
case BINARY_OP: {
- *effect = 0;
+ *effect = 1;
return 0;
}
case BINARY_OP_ADD_FLOAT: {
@@ -1017,40 +1013,36 @@ int _PyOpcode_max_stack_effect(int opcode, int oparg, int *effect) {
*effect = 0;
return 0;
}
- case BINARY_OP_SUBTRACT_FLOAT: {
- *effect = 0;
- return 0;
- }
- case BINARY_OP_SUBTRACT_INT: {
- *effect = 0;
- return 0;
- }
- case BINARY_SLICE: {
- *effect = 0;
+ case BINARY_OP_SUBSCR_DICT: {
+ *effect = -1;
return 0;
}
- case BINARY_SUBSCR: {
+ case BINARY_OP_SUBSCR_GETITEM: {
*effect = 1;
return 0;
}
- case BINARY_SUBSCR_DICT: {
+ case BINARY_OP_SUBSCR_LIST_INT: {
*effect = -1;
return 0;
}
- case BINARY_SUBSCR_GETITEM: {
- *effect = 1;
+ case BINARY_OP_SUBSCR_STR_INT: {
+ *effect = -1;
return 0;
}
- case BINARY_SUBSCR_LIST_INT: {
+ case BINARY_OP_SUBSCR_TUPLE_INT: {
*effect = -1;
return 0;
}
- case BINARY_SUBSCR_STR_INT: {
- *effect = -1;
+ case BINARY_OP_SUBTRACT_FLOAT: {
+ *effect = 0;
return 0;
}
- case BINARY_SUBSCR_TUPLE_INT: {
- *effect = -1;
+ case BINARY_OP_SUBTRACT_INT: {
+ *effect = 0;
+ return 0;
+ }
+ case BINARY_SLICE: {
+ *effect = 0;
return 0;
}
case BUILD_LIST: {
@@ -2017,15 +2009,14 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[266] = {
[BINARY_OP_INPLACE_ADD_UNICODE] = { true, INSTR_FMT_IXC0000, HAS_LOCAL_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG },
[BINARY_OP_MULTIPLY_FLOAT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
[BINARY_OP_MULTIPLY_INT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
+ [BINARY_OP_SUBSCR_DICT] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
+ [BINARY_OP_SUBSCR_GETITEM] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG },
+ [BINARY_OP_SUBSCR_LIST_INT] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG },
+ [BINARY_OP_SUBSCR_STR_INT] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG },
+ [BINARY_OP_SUBSCR_TUPLE_INT] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG },
[BINARY_OP_SUBTRACT_FLOAT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
[BINARY_OP_SUBTRACT_INT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
[BINARY_SLICE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
- [BINARY_SUBSCR] = { true, INSTR_FMT_IXC, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
- [BINARY_SUBSCR_DICT] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
- [BINARY_SUBSCR_GETITEM] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG },
- [BINARY_SUBSCR_LIST_INT] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG },
- [BINARY_SUBSCR_STR_INT] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG },
- [BINARY_SUBSCR_TUPLE_INT] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG },
[BUILD_LIST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG },
[BUILD_MAP] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[BUILD_SET] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
@@ -2262,15 +2253,14 @@ _PyOpcode_macro_expansion[256] = {
[BINARY_OP_INPLACE_ADD_UNICODE] = { .nuops = 2, .uops = { { _GUARD_BOTH_UNICODE, 0, 0 }, { _BINARY_OP_INPLACE_ADD_UNICODE, 0, 0 } } },
[BINARY_OP_MULTIPLY_FLOAT] = { .nuops = 2, .uops = { { _GUARD_BOTH_FLOAT, 0, 0 }, { _BINARY_OP_MULTIPLY_FLOAT, 0, 0 } } },
[BINARY_OP_MULTIPLY_INT] = { .nuops = 2, .uops = { { _GUARD_BOTH_INT, 0, 0 }, { _BINARY_OP_MULTIPLY_INT, 0, 0 } } },
+ [BINARY_OP_SUBSCR_DICT] = { .nuops = 1, .uops = { { _BINARY_OP_SUBSCR_DICT, 0, 0 } } },
+ [BINARY_OP_SUBSCR_GETITEM] = { .nuops = 4, .uops = { { _CHECK_PEP_523, 0, 0 }, { _BINARY_OP_SUBSCR_CHECK_FUNC, 0, 0 }, { _BINARY_OP_SUBSCR_INIT_CALL, 0, 0 }, { _PUSH_FRAME, 0, 0 } } },
+ [BINARY_OP_SUBSCR_LIST_INT] = { .nuops = 1, .uops = { { _BINARY_OP_SUBSCR_LIST_INT, 0, 0 } } },
+ [BINARY_OP_SUBSCR_STR_INT] = { .nuops = 1, .uops = { { _BINARY_OP_SUBSCR_STR_INT, 0, 0 } } },
+ [BINARY_OP_SUBSCR_TUPLE_INT] = { .nuops = 1, .uops = { { _BINARY_OP_SUBSCR_TUPLE_INT, 0, 0 } } },
[BINARY_OP_SUBTRACT_FLOAT] = { .nuops = 2, .uops = { { _GUARD_BOTH_FLOAT, 0, 0 }, { _BINARY_OP_SUBTRACT_FLOAT, 0, 0 } } },
[BINARY_OP_SUBTRACT_INT] = { .nuops = 2, .uops = { { _GUARD_BOTH_INT, 0, 0 }, { _BINARY_OP_SUBTRACT_INT, 0, 0 } } },
[BINARY_SLICE] = { .nuops = 1, .uops = { { _BINARY_SLICE, 0, 0 } } },
- [BINARY_SUBSCR] = { .nuops = 1, .uops = { { _BINARY_SUBSCR, 0, 0 } } },
- [BINARY_SUBSCR_DICT] = { .nuops = 1, .uops = { { _BINARY_SUBSCR_DICT, 0, 0 } } },
- [BINARY_SUBSCR_GETITEM] = { .nuops = 4, .uops = { { _CHECK_PEP_523, 0, 0 }, { _BINARY_SUBSCR_CHECK_FUNC, 0, 0 }, { _BINARY_SUBSCR_INIT_CALL, 0, 0 }, { _PUSH_FRAME, 0, 0 } } },
- [BINARY_SUBSCR_LIST_INT] = { .nuops = 1, .uops = { { _BINARY_SUBSCR_LIST_INT, 0, 0 } } },
- [BINARY_SUBSCR_STR_INT] = { .nuops = 1, .uops = { { _BINARY_SUBSCR_STR_INT, 0, 0 } } },
- [BINARY_SUBSCR_TUPLE_INT] = { .nuops = 1, .uops = { { _BINARY_SUBSCR_TUPLE_INT, 0, 0 } } },
[BUILD_LIST] = { .nuops = 1, .uops = { { _BUILD_LIST, 0, 0 } } },
[BUILD_MAP] = { .nuops = 1, .uops = { { _BUILD_MAP, 0, 0 } } },
[BUILD_SET] = { .nuops = 1, .uops = { { _BUILD_SET, 0, 0 } } },
@@ -2447,15 +2437,14 @@ const char *_PyOpcode_OpName[266] = {
[BINARY_OP_INPLACE_ADD_UNICODE] = "BINARY_OP_INPLACE_ADD_UNICODE",
[BINARY_OP_MULTIPLY_FLOAT] = "BINARY_OP_MULTIPLY_FLOAT",
[BINARY_OP_MULTIPLY_INT] = "BINARY_OP_MULTIPLY_INT",
+ [BINARY_OP_SUBSCR_DICT] = "BINARY_OP_SUBSCR_DICT",
+ [BINARY_OP_SUBSCR_GETITEM] = "BINARY_OP_SUBSCR_GETITEM",
+ [BINARY_OP_SUBSCR_LIST_INT] = "BINARY_OP_SUBSCR_LIST_INT",
+ [BINARY_OP_SUBSCR_STR_INT] = "BINARY_OP_SUBSCR_STR_INT",
+ [BINARY_OP_SUBSCR_TUPLE_INT] = "BINARY_OP_SUBSCR_TUPLE_INT",
[BINARY_OP_SUBTRACT_FLOAT] = "BINARY_OP_SUBTRACT_FLOAT",
[BINARY_OP_SUBTRACT_INT] = "BINARY_OP_SUBTRACT_INT",
[BINARY_SLICE] = "BINARY_SLICE",
- [BINARY_SUBSCR] = "BINARY_SUBSCR",
- [BINARY_SUBSCR_DICT] = "BINARY_SUBSCR_DICT",
- [BINARY_SUBSCR_GETITEM] = "BINARY_SUBSCR_GETITEM",
- [BINARY_SUBSCR_LIST_INT] = "BINARY_SUBSCR_LIST_INT",
- [BINARY_SUBSCR_STR_INT] = "BINARY_SUBSCR_STR_INT",
- [BINARY_SUBSCR_TUPLE_INT] = "BINARY_SUBSCR_TUPLE_INT",
[BUILD_LIST] = "BUILD_LIST",
[BUILD_MAP] = "BUILD_MAP",
[BUILD_SET] = "BUILD_SET",
@@ -2678,7 +2667,6 @@ extern const uint8_t _PyOpcode_Caches[256];
#ifdef NEED_OPCODE_METADATA
const uint8_t _PyOpcode_Caches[256] = {
[TO_BOOL] = 3,
- [BINARY_SUBSCR] = 1,
[STORE_SUBSCR] = 1,
[SEND] = 1,
[UNPACK_SEQUENCE] = 1,
@@ -2711,15 +2699,14 @@ const uint8_t _PyOpcode_Deopt[256] = {
[BINARY_OP_INPLACE_ADD_UNICODE] = BINARY_OP,
[BINARY_OP_MULTIPLY_FLOAT] = BINARY_OP,
[BINARY_OP_MULTIPLY_INT] = BINARY_OP,
+ [BINARY_OP_SUBSCR_DICT] = BINARY_OP,
+ [BINARY_OP_SUBSCR_GETITEM] = BINARY_OP,
+ [BINARY_OP_SUBSCR_LIST_INT] = BINARY_OP,
+ [BINARY_OP_SUBSCR_STR_INT] = BINARY_OP,
+ [BINARY_OP_SUBSCR_TUPLE_INT] = BINARY_OP,
[BINARY_OP_SUBTRACT_FLOAT] = BINARY_OP,
[BINARY_OP_SUBTRACT_INT] = BINARY_OP,
[BINARY_SLICE] = BINARY_SLICE,
- [BINARY_SUBSCR] = BINARY_SUBSCR,
- [BINARY_SUBSCR_DICT] = BINARY_SUBSCR,
- [BINARY_SUBSCR_GETITEM] = BINARY_SUBSCR,
- [BINARY_SUBSCR_LIST_INT] = BINARY_SUBSCR,
- [BINARY_SUBSCR_STR_INT] = BINARY_SUBSCR,
- [BINARY_SUBSCR_TUPLE_INT] = BINARY_SUBSCR,
[BUILD_LIST] = BUILD_LIST,
[BUILD_MAP] = BUILD_MAP,
[BUILD_SET] = BUILD_SET,
@@ -2930,6 +2917,7 @@ const uint8_t _PyOpcode_Deopt[256] = {
#endif // NEED_OPCODE_METADATA
#define EXTRA_CASES \
+ case 117: \
case 118: \
case 119: \
case 120: \
diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h
index 554e3439e0b..4e04dd69542 100644
--- a/Include/internal/pycore_uop_ids.h
+++ b/Include/internal/pycore_uop_ids.h
@@ -19,138 +19,137 @@ extern "C" {
#define _BINARY_OP_INPLACE_ADD_UNICODE 307
#define _BINARY_OP_MULTIPLY_FLOAT 308
#define _BINARY_OP_MULTIPLY_INT 309
-#define _BINARY_OP_SUBTRACT_FLOAT 310
-#define _BINARY_OP_SUBTRACT_INT 311
-#define _BINARY_SLICE 312
-#define _BINARY_SUBSCR 313
-#define _BINARY_SUBSCR_CHECK_FUNC 314
-#define _BINARY_SUBSCR_DICT BINARY_SUBSCR_DICT
-#define _BINARY_SUBSCR_INIT_CALL 315
-#define _BINARY_SUBSCR_LIST_INT BINARY_SUBSCR_LIST_INT
-#define _BINARY_SUBSCR_STR_INT BINARY_SUBSCR_STR_INT
-#define _BINARY_SUBSCR_TUPLE_INT BINARY_SUBSCR_TUPLE_INT
+#define _BINARY_OP_SUBSCR_CHECK_FUNC 310
+#define _BINARY_OP_SUBSCR_DICT BINARY_OP_SUBSCR_DICT
+#define _BINARY_OP_SUBSCR_INIT_CALL 311
+#define _BINARY_OP_SUBSCR_LIST_INT BINARY_OP_SUBSCR_LIST_INT
+#define _BINARY_OP_SUBSCR_STR_INT BINARY_OP_SUBSCR_STR_INT
+#define _BINARY_OP_SUBSCR_TUPLE_INT BINARY_OP_SUBSCR_TUPLE_INT
+#define _BINARY_OP_SUBTRACT_FLOAT 312
+#define _BINARY_OP_SUBTRACT_INT 313
+#define _BINARY_SLICE 314
#define _BUILD_LIST BUILD_LIST
#define _BUILD_MAP BUILD_MAP
#define _BUILD_SET BUILD_SET
#define _BUILD_SLICE BUILD_SLICE
#define _BUILD_STRING BUILD_STRING
#define _BUILD_TUPLE BUILD_TUPLE
-#define _CALL_BUILTIN_CLASS 316
-#define _CALL_BUILTIN_FAST 317
-#define _CALL_BUILTIN_FAST_WITH_KEYWORDS 318
-#define _CALL_BUILTIN_O 319
+#define _CALL_BUILTIN_CLASS 315
+#define _CALL_BUILTIN_FAST 316
+#define _CALL_BUILTIN_FAST_WITH_KEYWORDS 317
+#define _CALL_BUILTIN_O 318
#define _CALL_INTRINSIC_1 CALL_INTRINSIC_1
#define _CALL_INTRINSIC_2 CALL_INTRINSIC_2
#define _CALL_ISINSTANCE CALL_ISINSTANCE
-#define _CALL_KW_NON_PY 320
+#define _CALL_KW_NON_PY 319
#define _CALL_LEN CALL_LEN
#define _CALL_LIST_APPEND CALL_LIST_APPEND
-#define _CALL_METHOD_DESCRIPTOR_FAST 321
-#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 322
-#define _CALL_METHOD_DESCRIPTOR_NOARGS 323
-#define _CALL_METHOD_DESCRIPTOR_O 324
-#define _CALL_NON_PY_GENERAL 325
-#define _CALL_STR_1 326
-#define _CALL_TUPLE_1 327
+#define _CALL_METHOD_DESCRIPTOR_FAST 320
+#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 321
+#define _CALL_METHOD_DESCRIPTOR_NOARGS 322
+#define _CALL_METHOD_DESCRIPTOR_O 323
+#define _CALL_NON_PY_GENERAL 324
+#define _CALL_STR_1 325
+#define _CALL_TUPLE_1 326
#define _CALL_TYPE_1 CALL_TYPE_1
-#define _CHECK_AND_ALLOCATE_OBJECT 328
-#define _CHECK_ATTR_CLASS 329
-#define _CHECK_ATTR_METHOD_LAZY_DICT 330
-#define _CHECK_ATTR_MODULE_PUSH_KEYS 331
-#define _CHECK_ATTR_WITH_HINT 332
-#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 333
+#define _CHECK_AND_ALLOCATE_OBJECT 327
+#define _CHECK_ATTR_CLASS 328
+#define _CHECK_ATTR_METHOD_LAZY_DICT 329
+#define _CHECK_ATTR_MODULE_PUSH_KEYS 330
+#define _CHECK_ATTR_WITH_HINT 331
+#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 332
#define _CHECK_EG_MATCH CHECK_EG_MATCH
#define _CHECK_EXC_MATCH CHECK_EXC_MATCH
-#define _CHECK_FUNCTION 334
-#define _CHECK_FUNCTION_EXACT_ARGS 335
-#define _CHECK_FUNCTION_VERSION 336
-#define _CHECK_FUNCTION_VERSION_INLINE 337
-#define _CHECK_FUNCTION_VERSION_KW 338
-#define _CHECK_IS_NOT_PY_CALLABLE 339
-#define _CHECK_IS_NOT_PY_CALLABLE_KW 340
-#define _CHECK_MANAGED_OBJECT_HAS_VALUES 341
-#define _CHECK_METHOD_VERSION 342
-#define _CHECK_METHOD_VERSION_KW 343
-#define _CHECK_PEP_523 344
-#define _CHECK_PERIODIC 345
-#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM 346
-#define _CHECK_STACK_SPACE 347
-#define _CHECK_STACK_SPACE_OPERAND 348
-#define _CHECK_VALIDITY 349
-#define _CHECK_VALIDITY_AND_SET_IP 350
-#define _COMPARE_OP 351
-#define _COMPARE_OP_FLOAT 352
-#define _COMPARE_OP_INT 353
-#define _COMPARE_OP_STR 354
-#define _CONTAINS_OP 355
+#define _CHECK_FUNCTION 333
+#define _CHECK_FUNCTION_EXACT_ARGS 334
+#define _CHECK_FUNCTION_VERSION 335
+#define _CHECK_FUNCTION_VERSION_INLINE 336
+#define _CHECK_FUNCTION_VERSION_KW 337
+#define _CHECK_IS_NOT_PY_CALLABLE 338
+#define _CHECK_IS_NOT_PY_CALLABLE_KW 339
+#define _CHECK_MANAGED_OBJECT_HAS_VALUES 340
+#define _CHECK_METHOD_VERSION 341
+#define _CHECK_METHOD_VERSION_KW 342
+#define _CHECK_PEP_523 343
+#define _CHECK_PERIODIC 344
+#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM 345
+#define _CHECK_STACK_SPACE 346
+#define _CHECK_STACK_SPACE_OPERAND 347
+#define _CHECK_VALIDITY 348
+#define _CHECK_VALIDITY_AND_SET_IP 349
+#define _COMPARE_OP 350
+#define _COMPARE_OP_FLOAT 351
+#define _COMPARE_OP_INT 352
+#define _COMPARE_OP_STR 353
+#define _CONTAINS_OP 354
#define _CONTAINS_OP_DICT CONTAINS_OP_DICT
#define _CONTAINS_OP_SET CONTAINS_OP_SET
#define _CONVERT_VALUE CONVERT_VALUE
#define _COPY COPY
#define _COPY_FREE_VARS COPY_FREE_VARS
-#define _CREATE_INIT_FRAME 356
+#define _CREATE_INIT_FRAME 355
#define _DELETE_ATTR DELETE_ATTR
#define _DELETE_DEREF DELETE_DEREF
#define _DELETE_FAST DELETE_FAST
#define _DELETE_GLOBAL DELETE_GLOBAL
#define _DELETE_NAME DELETE_NAME
#define _DELETE_SUBSCR DELETE_SUBSCR
-#define _DEOPT 357
+#define _DEOPT 356
#define _DICT_MERGE DICT_MERGE
#define _DICT_UPDATE DICT_UPDATE
-#define _DO_CALL 358
-#define _DO_CALL_FUNCTION_EX 359
-#define _DO_CALL_KW 360
+#define _DO_CALL 357
+#define _DO_CALL_FUNCTION_EX 358
+#define _DO_CALL_KW 359
#define _END_FOR END_FOR
#define _END_SEND END_SEND
-#define _ERROR_POP_N 361
+#define _ERROR_POP_N 360
#define _EXIT_INIT_CHECK EXIT_INIT_CHECK
-#define _EXPAND_METHOD 362
-#define _EXPAND_METHOD_KW 363
-#define _FATAL_ERROR 364
+#define _EXPAND_METHOD 361
+#define _EXPAND_METHOD_KW 362
+#define _FATAL_ERROR 363
#define _FORMAT_SIMPLE FORMAT_SIMPLE
#define _FORMAT_WITH_SPEC FORMAT_WITH_SPEC
-#define _FOR_ITER 365
-#define _FOR_ITER_GEN_FRAME 366
-#define _FOR_ITER_TIER_TWO 367
+#define _FOR_ITER 364
+#define _FOR_ITER_GEN_FRAME 365
+#define _FOR_ITER_TIER_TWO 366
#define _GET_AITER GET_AITER
#define _GET_ANEXT GET_ANEXT
#define _GET_AWAITABLE GET_AWAITABLE
#define _GET_ITER GET_ITER
#define _GET_LEN GET_LEN
#define _GET_YIELD_FROM_ITER GET_YIELD_FROM_ITER
-#define _GUARD_BINARY_OP_EXTEND 368
-#define _GUARD_BOTH_FLOAT 369
-#define _GUARD_BOTH_INT 370
-#define _GUARD_BOTH_UNICODE 371
-#define _GUARD_BUILTINS_VERSION_PUSH_KEYS 372
-#define _GUARD_DORV_NO_DICT 373
-#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 374
-#define _GUARD_GLOBALS_VERSION 375
-#define _GUARD_GLOBALS_VERSION_PUSH_KEYS 376
-#define _GUARD_IS_FALSE_POP 377
-#define _GUARD_IS_NONE_POP 378
-#define _GUARD_IS_NOT_NONE_POP 379
-#define _GUARD_IS_TRUE_POP 380
-#define _GUARD_KEYS_VERSION 381
-#define _GUARD_NOS_FLOAT 382
-#define _GUARD_NOS_INT 383
-#define _GUARD_NOT_EXHAUSTED_LIST 384
-#define _GUARD_NOT_EXHAUSTED_RANGE 385
-#define _GUARD_NOT_EXHAUSTED_TUPLE 386
-#define _GUARD_TOS_FLOAT 387
-#define _GUARD_TOS_INT 388
-#define _GUARD_TYPE_VERSION 389
-#define _GUARD_TYPE_VERSION_AND_LOCK 390
+#define _GUARD_BINARY_OP_EXTEND 367
+#define _GUARD_BOTH_FLOAT 368
+#define _GUARD_BOTH_INT 369
+#define _GUARD_BOTH_UNICODE 370
+#define _GUARD_BUILTINS_VERSION_PUSH_KEYS 371
+#define _GUARD_DORV_NO_DICT 372
+#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 373
+#define _GUARD_GLOBALS_VERSION 374
+#define _GUARD_GLOBALS_VERSION_PUSH_KEYS 375
+#define _GUARD_IS_FALSE_POP 376
+#define _GUARD_IS_NONE_POP 377
+#define _GUARD_IS_NOT_NONE_POP 378
+#define _GUARD_IS_TRUE_POP 379
+#define _GUARD_KEYS_VERSION 380
+#define _GUARD_NOS_FLOAT 381
+#define _GUARD_NOS_INT 382
+#define _GUARD_NOT_EXHAUSTED_LIST 383
+#define _GUARD_NOT_EXHAUSTED_RANGE 384
+#define _GUARD_NOT_EXHAUSTED_TUPLE 385
+#define _GUARD_TOS_FLOAT 386
+#define _GUARD_TOS_INT 387
+#define _GUARD_TYPE_VERSION 388
+#define _GUARD_TYPE_VERSION_AND_LOCK 389
#define _IMPORT_FROM IMPORT_FROM
#define _IMPORT_NAME IMPORT_NAME
-#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 391
-#define _INIT_CALL_PY_EXACT_ARGS 392
-#define _INIT_CALL_PY_EXACT_ARGS_0 393
-#define _INIT_CALL_PY_EXACT_ARGS_1 394
-#define _INIT_CALL_PY_EXACT_ARGS_2 395
-#define _INIT_CALL_PY_EXACT_ARGS_3 396
-#define _INIT_CALL_PY_EXACT_ARGS_4 397
+#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 390
+#define _INIT_CALL_PY_EXACT_ARGS 391
+#define _INIT_CALL_PY_EXACT_ARGS_0 392
+#define _INIT_CALL_PY_EXACT_ARGS_1 393
+#define _INIT_CALL_PY_EXACT_ARGS_2 394
+#define _INIT_CALL_PY_EXACT_ARGS_3 395
+#define _INIT_CALL_PY_EXACT_ARGS_4 396
#define _INSTRUMENTED_FOR_ITER INSTRUMENTED_FOR_ITER
#define _INSTRUMENTED_INSTRUCTION INSTRUMENTED_INSTRUCTION
#define _INSTRUMENTED_JUMP_FORWARD INSTRUMENTED_JUMP_FORWARD
@@ -160,137 +159,137 @@ 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 398
+#define _IS_NONE 397
#define _IS_OP IS_OP
-#define _ITER_CHECK_LIST 399
-#define _ITER_CHECK_RANGE 400
-#define _ITER_CHECK_TUPLE 401
-#define _ITER_JUMP_LIST 402
-#define _ITER_JUMP_RANGE 403
-#define _ITER_JUMP_TUPLE 404
-#define _ITER_NEXT_LIST 405
-#define _ITER_NEXT_RANGE 406
-#define _ITER_NEXT_TUPLE 407
-#define _JUMP_TO_TOP 408
+#define _ITER_CHECK_LIST 398
+#define _ITER_CHECK_RANGE 399
+#define _ITER_CHECK_TUPLE 400
+#define _ITER_JUMP_LIST 401
+#define _ITER_JUMP_RANGE 402
+#define _ITER_JUMP_TUPLE 403
+#define _ITER_NEXT_LIST 404
+#define _ITER_NEXT_RANGE 405
+#define _ITER_NEXT_TUPLE 406
+#define _JUMP_TO_TOP 407
#define _LIST_APPEND LIST_APPEND
#define _LIST_EXTEND LIST_EXTEND
-#define _LOAD_ATTR 409
-#define _LOAD_ATTR_CLASS 410
+#define _LOAD_ATTR 408
+#define _LOAD_ATTR_CLASS 409
#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN
-#define _LOAD_ATTR_INSTANCE_VALUE 411
-#define _LOAD_ATTR_METHOD_LAZY_DICT 412
-#define _LOAD_ATTR_METHOD_NO_DICT 413
-#define _LOAD_ATTR_METHOD_WITH_VALUES 414
-#define _LOAD_ATTR_MODULE 415
-#define _LOAD_ATTR_MODULE_FROM_KEYS 416
-#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 417
-#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 418
-#define _LOAD_ATTR_PROPERTY_FRAME 419
-#define _LOAD_ATTR_SLOT 420
-#define _LOAD_ATTR_WITH_HINT 421
+#define _LOAD_ATTR_INSTANCE_VALUE 410
+#define _LOAD_ATTR_METHOD_LAZY_DICT 411
+#define _LOAD_ATTR_METHOD_NO_DICT 412
+#define _LOAD_ATTR_METHOD_WITH_VALUES 413
+#define _LOAD_ATTR_MODULE 414
+#define _LOAD_ATTR_MODULE_FROM_KEYS 415
+#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 416
+#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 417
+#define _LOAD_ATTR_PROPERTY_FRAME 418
+#define _LOAD_ATTR_SLOT 419
+#define _LOAD_ATTR_WITH_HINT 420
#define _LOAD_BUILD_CLASS LOAD_BUILD_CLASS
-#define _LOAD_BYTECODE 422
+#define _LOAD_BYTECODE 421
#define _LOAD_COMMON_CONSTANT LOAD_COMMON_CONSTANT
#define _LOAD_CONST LOAD_CONST
#define _LOAD_CONST_IMMORTAL LOAD_CONST_IMMORTAL
-#define _LOAD_CONST_INLINE 423
-#define _LOAD_CONST_INLINE_BORROW 424
+#define _LOAD_CONST_INLINE 422
+#define _LOAD_CONST_INLINE_BORROW 423
#define _LOAD_CONST_MORTAL LOAD_CONST_MORTAL
#define _LOAD_DEREF LOAD_DEREF
-#define _LOAD_FAST 425
-#define _LOAD_FAST_0 426
-#define _LOAD_FAST_1 427
-#define _LOAD_FAST_2 428
-#define _LOAD_FAST_3 429
-#define _LOAD_FAST_4 430
-#define _LOAD_FAST_5 431
-#define _LOAD_FAST_6 432
-#define _LOAD_FAST_7 433
+#define _LOAD_FAST 424
+#define _LOAD_FAST_0 425
+#define _LOAD_FAST_1 426
+#define _LOAD_FAST_2 427
+#define _LOAD_FAST_3 428
+#define _LOAD_FAST_4 429
+#define _LOAD_FAST_5 430
+#define _LOAD_FAST_6 431
+#define _LOAD_FAST_7 432
#define _LOAD_FAST_AND_CLEAR LOAD_FAST_AND_CLEAR
#define _LOAD_FAST_CHECK LOAD_FAST_CHECK
#define _LOAD_FAST_LOAD_FAST LOAD_FAST_LOAD_FAST
#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 434
-#define _LOAD_GLOBAL_BUILTINS 435
-#define _LOAD_GLOBAL_BUILTINS_FROM_KEYS 436
-#define _LOAD_GLOBAL_MODULE 437
-#define _LOAD_GLOBAL_MODULE_FROM_KEYS 438
+#define _LOAD_GLOBAL 433
+#define _LOAD_GLOBAL_BUILTINS 434
+#define _LOAD_GLOBAL_BUILTINS_FROM_KEYS 435
+#define _LOAD_GLOBAL_MODULE 436
+#define _LOAD_GLOBAL_MODULE_FROM_KEYS 437
#define _LOAD_LOCALS LOAD_LOCALS
#define _LOAD_NAME LOAD_NAME
-#define _LOAD_SMALL_INT 439
-#define _LOAD_SMALL_INT_0 440
-#define _LOAD_SMALL_INT_1 441
-#define _LOAD_SMALL_INT_2 442
-#define _LOAD_SMALL_INT_3 443
+#define _LOAD_SMALL_INT 438
+#define _LOAD_SMALL_INT_0 439
+#define _LOAD_SMALL_INT_1 440
+#define _LOAD_SMALL_INT_2 441
+#define _LOAD_SMALL_INT_3 442
#define _LOAD_SPECIAL LOAD_SPECIAL
#define _LOAD_SUPER_ATTR_ATTR LOAD_SUPER_ATTR_ATTR
#define _LOAD_SUPER_ATTR_METHOD LOAD_SUPER_ATTR_METHOD
-#define _MAKE_CALLARGS_A_TUPLE 444
+#define _MAKE_CALLARGS_A_TUPLE 443
#define _MAKE_CELL MAKE_CELL
#define _MAKE_FUNCTION MAKE_FUNCTION
-#define _MAKE_WARM 445
+#define _MAKE_WARM 444
#define _MAP_ADD MAP_ADD
#define _MATCH_CLASS MATCH_CLASS
#define _MATCH_KEYS MATCH_KEYS
#define _MATCH_MAPPING MATCH_MAPPING
#define _MATCH_SEQUENCE MATCH_SEQUENCE
-#define _MAYBE_EXPAND_METHOD 446
-#define _MAYBE_EXPAND_METHOD_KW 447
-#define _MONITOR_CALL 448
-#define _MONITOR_CALL_KW 449
-#define _MONITOR_JUMP_BACKWARD 450
-#define _MONITOR_RESUME 451
+#define _MAYBE_EXPAND_METHOD 445
+#define _MAYBE_EXPAND_METHOD_KW 446
+#define _MONITOR_CALL 447
+#define _MONITOR_CALL_KW 448
+#define _MONITOR_JUMP_BACKWARD 449
+#define _MONITOR_RESUME 450
#define _NOP NOP
#define _POP_EXCEPT POP_EXCEPT
-#define _POP_JUMP_IF_FALSE 452
-#define _POP_JUMP_IF_TRUE 453
+#define _POP_JUMP_IF_FALSE 451
+#define _POP_JUMP_IF_TRUE 452
#define _POP_TOP POP_TOP
-#define _POP_TOP_LOAD_CONST_INLINE_BORROW 454
+#define _POP_TOP_LOAD_CONST_INLINE_BORROW 453
#define _PUSH_EXC_INFO PUSH_EXC_INFO
-#define _PUSH_FRAME 455
+#define _PUSH_FRAME 454
#define _PUSH_NULL PUSH_NULL
-#define _PUSH_NULL_CONDITIONAL 456
-#define _PY_FRAME_GENERAL 457
-#define _PY_FRAME_KW 458
-#define _QUICKEN_RESUME 459
-#define _REPLACE_WITH_TRUE 460
+#define _PUSH_NULL_CONDITIONAL 455
+#define _PY_FRAME_GENERAL 456
+#define _PY_FRAME_KW 457
+#define _QUICKEN_RESUME 458
+#define _REPLACE_WITH_TRUE 459
#define _RESUME_CHECK RESUME_CHECK
#define _RETURN_GENERATOR RETURN_GENERATOR
#define _RETURN_VALUE RETURN_VALUE
-#define _SAVE_RETURN_OFFSET 461
-#define _SEND 462
-#define _SEND_GEN_FRAME 463
+#define _SAVE_RETURN_OFFSET 460
+#define _SEND 461
+#define _SEND_GEN_FRAME 462
#define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS
#define _SET_ADD SET_ADD
#define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE
#define _SET_UPDATE SET_UPDATE
-#define _START_EXECUTOR 464
-#define _STORE_ATTR 465
-#define _STORE_ATTR_INSTANCE_VALUE 466
-#define _STORE_ATTR_SLOT 467
-#define _STORE_ATTR_WITH_HINT 468
+#define _START_EXECUTOR 463
+#define _STORE_ATTR 464
+#define _STORE_ATTR_INSTANCE_VALUE 465
+#define _STORE_ATTR_SLOT 466
+#define _STORE_ATTR_WITH_HINT 467
#define _STORE_DEREF STORE_DEREF
-#define _STORE_FAST 469
-#define _STORE_FAST_0 470
-#define _STORE_FAST_1 471
-#define _STORE_FAST_2 472
-#define _STORE_FAST_3 473
-#define _STORE_FAST_4 474
-#define _STORE_FAST_5 475
-#define _STORE_FAST_6 476
-#define _STORE_FAST_7 477
+#define _STORE_FAST 468
+#define _STORE_FAST_0 469
+#define _STORE_FAST_1 470
+#define _STORE_FAST_2 471
+#define _STORE_FAST_3 472
+#define _STORE_FAST_4 473
+#define _STORE_FAST_5 474
+#define _STORE_FAST_6 475
+#define _STORE_FAST_7 476
#define _STORE_FAST_LOAD_FAST STORE_FAST_LOAD_FAST
#define _STORE_FAST_STORE_FAST STORE_FAST_STORE_FAST
#define _STORE_GLOBAL STORE_GLOBAL
#define _STORE_NAME STORE_NAME
-#define _STORE_SLICE 478
-#define _STORE_SUBSCR 479
+#define _STORE_SLICE 477
+#define _STORE_SUBSCR 478
#define _STORE_SUBSCR_DICT STORE_SUBSCR_DICT
#define _STORE_SUBSCR_LIST_INT STORE_SUBSCR_LIST_INT
#define _SWAP SWAP
-#define _TIER2_RESUME_CHECK 480
-#define _TO_BOOL 481
+#define _TIER2_RESUME_CHECK 479
+#define _TO_BOOL 480
#define _TO_BOOL_BOOL TO_BOOL_BOOL
#define _TO_BOOL_INT TO_BOOL_INT
#define _TO_BOOL_LIST TO_BOOL_LIST
@@ -300,13 +299,13 @@ extern "C" {
#define _UNARY_NEGATIVE UNARY_NEGATIVE
#define _UNARY_NOT UNARY_NOT
#define _UNPACK_EX UNPACK_EX
-#define _UNPACK_SEQUENCE 482
+#define _UNPACK_SEQUENCE 481
#define _UNPACK_SEQUENCE_LIST UNPACK_SEQUENCE_LIST
#define _UNPACK_SEQUENCE_TUPLE UNPACK_SEQUENCE_TUPLE
#define _UNPACK_SEQUENCE_TWO_TUPLE UNPACK_SEQUENCE_TWO_TUPLE
#define _WITH_EXCEPT_START WITH_EXCEPT_START
#define _YIELD_VALUE YIELD_VALUE
-#define MAX_UOP_ID 482
+#define MAX_UOP_ID 481
#ifdef __cplusplus
}
diff --git a/Include/internal/pycore_uop_metadata.h b/Include/internal/pycore_uop_metadata.h
index 2e126b57aa7..86a4843ea05 100644
--- a/Include/internal/pycore_uop_metadata.h
+++ b/Include/internal/pycore_uop_metadata.h
@@ -84,15 +84,14 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_BINARY_OP_INPLACE_ADD_UNICODE] = HAS_LOCAL_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG,
[_GUARD_BINARY_OP_EXTEND] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
[_BINARY_OP_EXTEND] = HAS_ESCAPES_FLAG | HAS_PURE_FLAG,
- [_BINARY_SUBSCR] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_BINARY_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_STORE_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
- [_BINARY_SUBSCR_LIST_INT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
- [_BINARY_SUBSCR_STR_INT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
- [_BINARY_SUBSCR_TUPLE_INT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
- [_BINARY_SUBSCR_DICT] = HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
- [_BINARY_SUBSCR_CHECK_FUNC] = HAS_DEOPT_FLAG,
- [_BINARY_SUBSCR_INIT_CALL] = 0,
+ [_BINARY_OP_SUBSCR_LIST_INT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
+ [_BINARY_OP_SUBSCR_STR_INT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
+ [_BINARY_OP_SUBSCR_TUPLE_INT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
+ [_BINARY_OP_SUBSCR_DICT] = HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
+ [_BINARY_OP_SUBSCR_CHECK_FUNC] = HAS_DEOPT_FLAG,
+ [_BINARY_OP_SUBSCR_INIT_CALL] = 0,
[_LIST_APPEND] = HAS_ARG_FLAG | HAS_ERROR_FLAG,
[_SET_ADD] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_STORE_SUBSCR] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
@@ -306,16 +305,15 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
[_BINARY_OP_INPLACE_ADD_UNICODE] = "_BINARY_OP_INPLACE_ADD_UNICODE",
[_BINARY_OP_MULTIPLY_FLOAT] = "_BINARY_OP_MULTIPLY_FLOAT",
[_BINARY_OP_MULTIPLY_INT] = "_BINARY_OP_MULTIPLY_INT",
+ [_BINARY_OP_SUBSCR_CHECK_FUNC] = "_BINARY_OP_SUBSCR_CHECK_FUNC",
+ [_BINARY_OP_SUBSCR_DICT] = "_BINARY_OP_SUBSCR_DICT",
+ [_BINARY_OP_SUBSCR_INIT_CALL] = "_BINARY_OP_SUBSCR_INIT_CALL",
+ [_BINARY_OP_SUBSCR_LIST_INT] = "_BINARY_OP_SUBSCR_LIST_INT",
+ [_BINARY_OP_SUBSCR_STR_INT] = "_BINARY_OP_SUBSCR_STR_INT",
+ [_BINARY_OP_SUBSCR_TUPLE_INT] = "_BINARY_OP_SUBSCR_TUPLE_INT",
[_BINARY_OP_SUBTRACT_FLOAT] = "_BINARY_OP_SUBTRACT_FLOAT",
[_BINARY_OP_SUBTRACT_INT] = "_BINARY_OP_SUBTRACT_INT",
[_BINARY_SLICE] = "_BINARY_SLICE",
- [_BINARY_SUBSCR] = "_BINARY_SUBSCR",
- [_BINARY_SUBSCR_CHECK_FUNC] = "_BINARY_SUBSCR_CHECK_FUNC",
- [_BINARY_SUBSCR_DICT] = "_BINARY_SUBSCR_DICT",
- [_BINARY_SUBSCR_INIT_CALL] = "_BINARY_SUBSCR_INIT_CALL",
- [_BINARY_SUBSCR_LIST_INT] = "_BINARY_SUBSCR_LIST_INT",
- [_BINARY_SUBSCR_STR_INT] = "_BINARY_SUBSCR_STR_INT",
- [_BINARY_SUBSCR_TUPLE_INT] = "_BINARY_SUBSCR_TUPLE_INT",
[_BUILD_LIST] = "_BUILD_LIST",
[_BUILD_MAP] = "_BUILD_MAP",
[_BUILD_SET] = "_BUILD_SET",
@@ -701,23 +699,21 @@ int _PyUop_num_popped(int opcode, int oparg)
return 0;
case _BINARY_OP_EXTEND:
return 2;
- case _BINARY_SUBSCR:
- return 2;
case _BINARY_SLICE:
return 3;
case _STORE_SLICE:
return 4;
- case _BINARY_SUBSCR_LIST_INT:
+ case _BINARY_OP_SUBSCR_LIST_INT:
return 2;
- case _BINARY_SUBSCR_STR_INT:
+ case _BINARY_OP_SUBSCR_STR_INT:
return 2;
- case _BINARY_SUBSCR_TUPLE_INT:
+ case _BINARY_OP_SUBSCR_TUPLE_INT:
return 2;
- case _BINARY_SUBSCR_DICT:
+ case _BINARY_OP_SUBSCR_DICT:
return 2;
- case _BINARY_SUBSCR_CHECK_FUNC:
+ case _BINARY_OP_SUBSCR_CHECK_FUNC:
return 0;
- case _BINARY_SUBSCR_INIT_CALL:
+ case _BINARY_OP_SUBSCR_INIT_CALL:
return 3;
case _LIST_APPEND:
return 1;
diff --git a/Include/opcode.h b/Include/opcode.h
index 2619b690019..fcb972f2ec2 100644
--- a/Include/opcode.h
+++ b/Include/opcode.h
@@ -33,8 +33,9 @@ extern "C" {
#define NB_INPLACE_SUBTRACT 23
#define NB_INPLACE_TRUE_DIVIDE 24
#define NB_INPLACE_XOR 25
+#define NB_SUBSCR 26
-#define NB_OPARG_LAST 25
+#define NB_OPARG_LAST 26
#ifdef __cplusplus
}
diff --git a/Include/opcode_ids.h b/Include/opcode_ids.h
index dfe7fa36ccc..54f543f4a8a 100644
--- a/Include/opcode_ids.h
+++ b/Include/opcode_ids.h
@@ -12,122 +12,121 @@ extern "C" {
/* Instruction opcodes for compiled code */
#define CACHE 0
#define BINARY_SLICE 1
-#define BINARY_SUBSCR 2
+#define CALL_FUNCTION_EX 2
#define BINARY_OP_INPLACE_ADD_UNICODE 3
-#define CALL_FUNCTION_EX 4
-#define CHECK_EG_MATCH 5
-#define CHECK_EXC_MATCH 6
-#define CLEANUP_THROW 7
-#define DELETE_SUBSCR 8
-#define END_ASYNC_FOR 9
-#define END_FOR 10
-#define END_SEND 11
-#define EXIT_INIT_CHECK 12
-#define FORMAT_SIMPLE 13
-#define FORMAT_WITH_SPEC 14
-#define GET_AITER 15
-#define GET_ANEXT 16
+#define CHECK_EG_MATCH 4
+#define CHECK_EXC_MATCH 5
+#define CLEANUP_THROW 6
+#define DELETE_SUBSCR 7
+#define END_ASYNC_FOR 8
+#define END_FOR 9
+#define END_SEND 10
+#define EXIT_INIT_CHECK 11
+#define FORMAT_SIMPLE 12
+#define FORMAT_WITH_SPEC 13
+#define GET_AITER 14
+#define GET_ANEXT 15
+#define GET_ITER 16
#define RESERVED 17
-#define GET_ITER 18
-#define GET_LEN 19
-#define GET_YIELD_FROM_ITER 20
-#define INTERPRETER_EXIT 21
-#define LOAD_BUILD_CLASS 22
-#define LOAD_LOCALS 23
-#define MAKE_FUNCTION 24
-#define MATCH_KEYS 25
-#define MATCH_MAPPING 26
-#define MATCH_SEQUENCE 27
-#define NOP 28
-#define NOT_TAKEN 29
-#define POP_EXCEPT 30
-#define POP_ITER 31
-#define POP_TOP 32
-#define PUSH_EXC_INFO 33
-#define PUSH_NULL 34
-#define RETURN_GENERATOR 35
-#define RETURN_VALUE 36
-#define SETUP_ANNOTATIONS 37
-#define STORE_SLICE 38
-#define STORE_SUBSCR 39
-#define TO_BOOL 40
-#define UNARY_INVERT 41
-#define UNARY_NEGATIVE 42
-#define UNARY_NOT 43
-#define WITH_EXCEPT_START 44
-#define BINARY_OP 45
-#define BUILD_LIST 46
-#define BUILD_MAP 47
-#define BUILD_SET 48
-#define BUILD_SLICE 49
-#define BUILD_STRING 50
-#define BUILD_TUPLE 51
-#define CALL 52
-#define CALL_INTRINSIC_1 53
-#define CALL_INTRINSIC_2 54
-#define CALL_KW 55
-#define COMPARE_OP 56
-#define CONTAINS_OP 57
-#define CONVERT_VALUE 58
-#define COPY 59
-#define COPY_FREE_VARS 60
-#define DELETE_ATTR 61
-#define DELETE_DEREF 62
-#define DELETE_FAST 63
-#define DELETE_GLOBAL 64
-#define DELETE_NAME 65
-#define DICT_MERGE 66
-#define DICT_UPDATE 67
-#define EXTENDED_ARG 68
-#define FOR_ITER 69
-#define GET_AWAITABLE 70
-#define IMPORT_FROM 71
-#define IMPORT_NAME 72
-#define IS_OP 73
-#define JUMP_BACKWARD 74
-#define JUMP_BACKWARD_NO_INTERRUPT 75
-#define JUMP_FORWARD 76
-#define LIST_APPEND 77
-#define LIST_EXTEND 78
-#define LOAD_ATTR 79
-#define LOAD_COMMON_CONSTANT 80
-#define LOAD_CONST 81
-#define LOAD_DEREF 82
-#define LOAD_FAST 83
-#define LOAD_FAST_AND_CLEAR 84
-#define LOAD_FAST_CHECK 85
-#define LOAD_FAST_LOAD_FAST 86
-#define LOAD_FROM_DICT_OR_DEREF 87
-#define LOAD_FROM_DICT_OR_GLOBALS 88
-#define LOAD_GLOBAL 89
-#define LOAD_NAME 90
-#define LOAD_SMALL_INT 91
-#define LOAD_SPECIAL 92
-#define LOAD_SUPER_ATTR 93
-#define MAKE_CELL 94
-#define MAP_ADD 95
-#define MATCH_CLASS 96
-#define POP_JUMP_IF_FALSE 97
-#define POP_JUMP_IF_NONE 98
-#define POP_JUMP_IF_NOT_NONE 99
-#define POP_JUMP_IF_TRUE 100
-#define RAISE_VARARGS 101
-#define RERAISE 102
-#define SEND 103
-#define SET_ADD 104
-#define SET_FUNCTION_ATTRIBUTE 105
-#define SET_UPDATE 106
-#define STORE_ATTR 107
-#define STORE_DEREF 108
-#define STORE_FAST 109
-#define STORE_FAST_LOAD_FAST 110
-#define STORE_FAST_STORE_FAST 111
-#define STORE_GLOBAL 112
-#define STORE_NAME 113
-#define SWAP 114
-#define UNPACK_EX 115
-#define UNPACK_SEQUENCE 116
-#define YIELD_VALUE 117
+#define GET_LEN 18
+#define GET_YIELD_FROM_ITER 19
+#define INTERPRETER_EXIT 20
+#define LOAD_BUILD_CLASS 21
+#define LOAD_LOCALS 22
+#define MAKE_FUNCTION 23
+#define MATCH_KEYS 24
+#define MATCH_MAPPING 25
+#define MATCH_SEQUENCE 26
+#define NOP 27
+#define NOT_TAKEN 28
+#define POP_EXCEPT 29
+#define POP_ITER 30
+#define POP_TOP 31
+#define PUSH_EXC_INFO 32
+#define PUSH_NULL 33
+#define RETURN_GENERATOR 34
+#define RETURN_VALUE 35
+#define SETUP_ANNOTATIONS 36
+#define STORE_SLICE 37
+#define STORE_SUBSCR 38
+#define TO_BOOL 39
+#define UNARY_INVERT 40
+#define UNARY_NEGATIVE 41
+#define UNARY_NOT 42
+#define WITH_EXCEPT_START 43
+#define BINARY_OP 44
+#define BUILD_LIST 45
+#define BUILD_MAP 46
+#define BUILD_SET 47
+#define BUILD_SLICE 48
+#define BUILD_STRING 49
+#define BUILD_TUPLE 50
+#define CALL 51
+#define CALL_INTRINSIC_1 52
+#define CALL_INTRINSIC_2 53
+#define CALL_KW 54
+#define COMPARE_OP 55
+#define CONTAINS_OP 56
+#define CONVERT_VALUE 57
+#define COPY 58
+#define COPY_FREE_VARS 59
+#define DELETE_ATTR 60
+#define DELETE_DEREF 61
+#define DELETE_FAST 62
+#define DELETE_GLOBAL 63
+#define DELETE_NAME 64
+#define DICT_MERGE 65
+#define DICT_UPDATE 66
+#define EXTENDED_ARG 67
+#define FOR_ITER 68
+#define GET_AWAITABLE 69
+#define IMPORT_FROM 70
+#define IMPORT_NAME 71
+#define IS_OP 72
+#define JUMP_BACKWARD 73
+#define JUMP_BACKWARD_NO_INTERRUPT 74
+#define JUMP_FORWARD 75
+#define LIST_APPEND 76
+#define LIST_EXTEND 77
+#define LOAD_ATTR 78
+#define LOAD_COMMON_CONSTANT 79
+#define LOAD_CONST 80
+#define LOAD_DEREF 81
+#define LOAD_FAST 82
+#define LOAD_FAST_AND_CLEAR 83
+#define LOAD_FAST_CHECK 84
+#define LOAD_FAST_LOAD_FAST 85
+#define LOAD_FROM_DICT_OR_DEREF 86
+#define LOAD_FROM_DICT_OR_GLOBALS 87
+#define LOAD_GLOBAL 88
+#define LOAD_NAME 89
+#define LOAD_SMALL_INT 90
+#define LOAD_SPECIAL 91
+#define LOAD_SUPER_ATTR 92
+#define MAKE_CELL 93
+#define MAP_ADD 94
+#define MATCH_CLASS 95
+#define POP_JUMP_IF_FALSE 96
+#define POP_JUMP_IF_NONE 97
+#define POP_JUMP_IF_NOT_NONE 98
+#define POP_JUMP_IF_TRUE 99
+#define RAISE_VARARGS 100
+#define RERAISE 101
+#define SEND 102
+#define SET_ADD 103
+#define SET_FUNCTION_ATTRIBUTE 104
+#define SET_UPDATE 105
+#define STORE_ATTR 106
+#define STORE_DEREF 107
+#define STORE_FAST 108
+#define STORE_FAST_LOAD_FAST 109
+#define STORE_FAST_STORE_FAST 110
+#define STORE_GLOBAL 111
+#define STORE_NAME 112
+#define SWAP 113
+#define UNPACK_EX 114
+#define UNPACK_SEQUENCE 115
+#define YIELD_VALUE 116
#define RESUME 149
#define BINARY_OP_ADD_FLOAT 150
#define BINARY_OP_ADD_INT 151
@@ -135,13 +134,13 @@ extern "C" {
#define BINARY_OP_EXTEND 153
#define BINARY_OP_MULTIPLY_FLOAT 154
#define BINARY_OP_MULTIPLY_INT 155
-#define BINARY_OP_SUBTRACT_FLOAT 156
-#define BINARY_OP_SUBTRACT_INT 157
-#define BINARY_SUBSCR_DICT 158
-#define BINARY_SUBSCR_GETITEM 159
-#define BINARY_SUBSCR_LIST_INT 160
-#define BINARY_SUBSCR_STR_INT 161
-#define BINARY_SUBSCR_TUPLE_INT 162
+#define BINARY_OP_SUBSCR_DICT 156
+#define BINARY_OP_SUBSCR_GETITEM 157
+#define BINARY_OP_SUBSCR_LIST_INT 158
+#define BINARY_OP_SUBSCR_STR_INT 159
+#define BINARY_OP_SUBSCR_TUPLE_INT 160
+#define BINARY_OP_SUBTRACT_FLOAT 161
+#define BINARY_OP_SUBTRACT_INT 162
#define CALL_ALLOC_AND_ENTER_INIT 163
#define CALL_BOUND_METHOD_EXACT_ARGS 164
#define CALL_BOUND_METHOD_GENERAL 165
@@ -243,7 +242,7 @@ extern "C" {
#define SETUP_WITH 264
#define STORE_FAST_MAYBE_NULL 265
-#define HAVE_ARGUMENT 44
+#define HAVE_ARGUMENT 43
#define MIN_SPECIALIZED_OPCODE 150
#define MIN_INSTRUMENTED_OPCODE 235
diff --git a/Lib/_opcode_metadata.py b/Lib/_opcode_metadata.py
index ae3e9bd0ab4..0e18792402d 100644
--- a/Lib/_opcode_metadata.py
+++ b/Lib/_opcode_metadata.py
@@ -26,16 +26,14 @@ _specializations = {
"BINARY_OP_ADD_FLOAT",
"BINARY_OP_SUBTRACT_FLOAT",
"BINARY_OP_ADD_UNICODE",
+ "BINARY_OP_SUBSCR_LIST_INT",
+ "BINARY_OP_SUBSCR_TUPLE_INT",
+ "BINARY_OP_SUBSCR_STR_INT",
+ "BINARY_OP_SUBSCR_DICT",
+ "BINARY_OP_SUBSCR_GETITEM",
"BINARY_OP_EXTEND",
"BINARY_OP_INPLACE_ADD_UNICODE",
],
- "BINARY_SUBSCR": [
- "BINARY_SUBSCR_DICT",
- "BINARY_SUBSCR_GETITEM",
- "BINARY_SUBSCR_LIST_INT",
- "BINARY_SUBSCR_STR_INT",
- "BINARY_SUBSCR_TUPLE_INT",
- ],
"STORE_SUBSCR": [
"STORE_SUBSCR_DICT",
"STORE_SUBSCR_LIST_INT",
@@ -132,13 +130,13 @@ _specialized_opmap = {
'BINARY_OP_INPLACE_ADD_UNICODE': 3,
'BINARY_OP_MULTIPLY_FLOAT': 154,
'BINARY_OP_MULTIPLY_INT': 155,
- 'BINARY_OP_SUBTRACT_FLOAT': 156,
- 'BINARY_OP_SUBTRACT_INT': 157,
- 'BINARY_SUBSCR_DICT': 158,
- 'BINARY_SUBSCR_GETITEM': 159,
- 'BINARY_SUBSCR_LIST_INT': 160,
- 'BINARY_SUBSCR_STR_INT': 161,
- 'BINARY_SUBSCR_TUPLE_INT': 162,
+ 'BINARY_OP_SUBSCR_DICT': 156,
+ 'BINARY_OP_SUBSCR_GETITEM': 157,
+ 'BINARY_OP_SUBSCR_LIST_INT': 158,
+ 'BINARY_OP_SUBSCR_STR_INT': 159,
+ 'BINARY_OP_SUBSCR_TUPLE_INT': 160,
+ 'BINARY_OP_SUBTRACT_FLOAT': 161,
+ 'BINARY_OP_SUBTRACT_INT': 162,
'CALL_ALLOC_AND_ENTER_INIT': 163,
'CALL_BOUND_METHOD_EXACT_ARGS': 164,
'CALL_BOUND_METHOD_GENERAL': 165,
@@ -217,120 +215,119 @@ opmap = {
'INSTRUMENTED_LINE': 254,
'ENTER_EXECUTOR': 255,
'BINARY_SLICE': 1,
- 'BINARY_SUBSCR': 2,
- 'CALL_FUNCTION_EX': 4,
- 'CHECK_EG_MATCH': 5,
- 'CHECK_EXC_MATCH': 6,
- 'CLEANUP_THROW': 7,
- 'DELETE_SUBSCR': 8,
- 'END_ASYNC_FOR': 9,
- 'END_FOR': 10,
- 'END_SEND': 11,
- 'EXIT_INIT_CHECK': 12,
- 'FORMAT_SIMPLE': 13,
- 'FORMAT_WITH_SPEC': 14,
- 'GET_AITER': 15,
- 'GET_ANEXT': 16,
- 'GET_ITER': 18,
- 'GET_LEN': 19,
- 'GET_YIELD_FROM_ITER': 20,
- 'INTERPRETER_EXIT': 21,
- 'LOAD_BUILD_CLASS': 22,
- 'LOAD_LOCALS': 23,
- 'MAKE_FUNCTION': 24,
- 'MATCH_KEYS': 25,
- 'MATCH_MAPPING': 26,
- 'MATCH_SEQUENCE': 27,
- 'NOP': 28,
- 'NOT_TAKEN': 29,
- 'POP_EXCEPT': 30,
- 'POP_ITER': 31,
- 'POP_TOP': 32,
- 'PUSH_EXC_INFO': 33,
- 'PUSH_NULL': 34,
- 'RETURN_GENERATOR': 35,
- 'RETURN_VALUE': 36,
- 'SETUP_ANNOTATIONS': 37,
- 'STORE_SLICE': 38,
- 'STORE_SUBSCR': 39,
- 'TO_BOOL': 40,
- 'UNARY_INVERT': 41,
- 'UNARY_NEGATIVE': 42,
- 'UNARY_NOT': 43,
- 'WITH_EXCEPT_START': 44,
- 'BINARY_OP': 45,
- 'BUILD_LIST': 46,
- 'BUILD_MAP': 47,
- 'BUILD_SET': 48,
- 'BUILD_SLICE': 49,
- 'BUILD_STRING': 50,
- 'BUILD_TUPLE': 51,
- 'CALL': 52,
- 'CALL_INTRINSIC_1': 53,
- 'CALL_INTRINSIC_2': 54,
- 'CALL_KW': 55,
- 'COMPARE_OP': 56,
- 'CONTAINS_OP': 57,
- 'CONVERT_VALUE': 58,
- 'COPY': 59,
- 'COPY_FREE_VARS': 60,
- 'DELETE_ATTR': 61,
- 'DELETE_DEREF': 62,
- 'DELETE_FAST': 63,
- 'DELETE_GLOBAL': 64,
- 'DELETE_NAME': 65,
- 'DICT_MERGE': 66,
- 'DICT_UPDATE': 67,
- 'EXTENDED_ARG': 68,
- 'FOR_ITER': 69,
- 'GET_AWAITABLE': 70,
- 'IMPORT_FROM': 71,
- 'IMPORT_NAME': 72,
- 'IS_OP': 73,
- 'JUMP_BACKWARD': 74,
- 'JUMP_BACKWARD_NO_INTERRUPT': 75,
- 'JUMP_FORWARD': 76,
- 'LIST_APPEND': 77,
- 'LIST_EXTEND': 78,
- 'LOAD_ATTR': 79,
- 'LOAD_COMMON_CONSTANT': 80,
- 'LOAD_CONST': 81,
- 'LOAD_DEREF': 82,
- 'LOAD_FAST': 83,
- 'LOAD_FAST_AND_CLEAR': 84,
- 'LOAD_FAST_CHECK': 85,
- 'LOAD_FAST_LOAD_FAST': 86,
- 'LOAD_FROM_DICT_OR_DEREF': 87,
- 'LOAD_FROM_DICT_OR_GLOBALS': 88,
- 'LOAD_GLOBAL': 89,
- 'LOAD_NAME': 90,
- 'LOAD_SMALL_INT': 91,
- 'LOAD_SPECIAL': 92,
- 'LOAD_SUPER_ATTR': 93,
- 'MAKE_CELL': 94,
- 'MAP_ADD': 95,
- 'MATCH_CLASS': 96,
- 'POP_JUMP_IF_FALSE': 97,
- 'POP_JUMP_IF_NONE': 98,
- 'POP_JUMP_IF_NOT_NONE': 99,
- 'POP_JUMP_IF_TRUE': 100,
- 'RAISE_VARARGS': 101,
- 'RERAISE': 102,
- 'SEND': 103,
- 'SET_ADD': 104,
- 'SET_FUNCTION_ATTRIBUTE': 105,
- 'SET_UPDATE': 106,
- 'STORE_ATTR': 107,
- 'STORE_DEREF': 108,
- 'STORE_FAST': 109,
- 'STORE_FAST_LOAD_FAST': 110,
- 'STORE_FAST_STORE_FAST': 111,
- 'STORE_GLOBAL': 112,
- 'STORE_NAME': 113,
- 'SWAP': 114,
- 'UNPACK_EX': 115,
- 'UNPACK_SEQUENCE': 116,
- 'YIELD_VALUE': 117,
+ 'CALL_FUNCTION_EX': 2,
+ 'CHECK_EG_MATCH': 4,
+ 'CHECK_EXC_MATCH': 5,
+ 'CLEANUP_THROW': 6,
+ 'DELETE_SUBSCR': 7,
+ 'END_ASYNC_FOR': 8,
+ 'END_FOR': 9,
+ 'END_SEND': 10,
+ 'EXIT_INIT_CHECK': 11,
+ 'FORMAT_SIMPLE': 12,
+ 'FORMAT_WITH_SPEC': 13,
+ 'GET_AITER': 14,
+ 'GET_ANEXT': 15,
+ 'GET_ITER': 16,
+ 'GET_LEN': 18,
+ 'GET_YIELD_FROM_ITER': 19,
+ 'INTERPRETER_EXIT': 20,
+ 'LOAD_BUILD_CLASS': 21,
+ 'LOAD_LOCALS': 22,
+ 'MAKE_FUNCTION': 23,
+ 'MATCH_KEYS': 24,
+ 'MATCH_MAPPING': 25,
+ 'MATCH_SEQUENCE': 26,
+ 'NOP': 27,
+ 'NOT_TAKEN': 28,
+ 'POP_EXCEPT': 29,
+ 'POP_ITER': 30,
+ 'POP_TOP': 31,
+ 'PUSH_EXC_INFO': 32,
+ 'PUSH_NULL': 33,
+ 'RETURN_GENERATOR': 34,
+ 'RETURN_VALUE': 35,
+ 'SETUP_ANNOTATIONS': 36,
+ 'STORE_SLICE': 37,
+ 'STORE_SUBSCR': 38,
+ 'TO_BOOL': 39,
+ 'UNARY_INVERT': 40,
+ 'UNARY_NEGATIVE': 41,
+ 'UNARY_NOT': 42,
+ 'WITH_EXCEPT_START': 43,
+ 'BINARY_OP': 44,
+ 'BUILD_LIST': 45,
+ 'BUILD_MAP': 46,
+ 'BUILD_SET': 47,
+ 'BUILD_SLICE': 48,
+ 'BUILD_STRING': 49,
+ 'BUILD_TUPLE': 50,
+ 'CALL': 51,
+ 'CALL_INTRINSIC_1': 52,
+ 'CALL_INTRINSIC_2': 53,
+ 'CALL_KW': 54,
+ 'COMPARE_OP': 55,
+ 'CONTAINS_OP': 56,
+ 'CONVERT_VALUE': 57,
+ 'COPY': 58,
+ 'COPY_FREE_VARS': 59,
+ 'DELETE_ATTR': 60,
+ 'DELETE_DEREF': 61,
+ 'DELETE_FAST': 62,
+ 'DELETE_GLOBAL': 63,
+ 'DELETE_NAME': 64,
+ 'DICT_MERGE': 65,
+ 'DICT_UPDATE': 66,
+ 'EXTENDED_ARG': 67,
+ 'FOR_ITER': 68,
+ 'GET_AWAITABLE': 69,
+ 'IMPORT_FROM': 70,
+ 'IMPORT_NAME': 71,
+ 'IS_OP': 72,
+ 'JUMP_BACKWARD': 73,
+ 'JUMP_BACKWARD_NO_INTERRUPT': 74,
+ 'JUMP_FORWARD': 75,
+ 'LIST_APPEND': 76,
+ 'LIST_EXTEND': 77,
+ 'LOAD_ATTR': 78,
+ 'LOAD_COMMON_CONSTANT': 79,
+ 'LOAD_CONST': 80,
+ 'LOAD_DEREF': 81,
+ 'LOAD_FAST': 82,
+ 'LOAD_FAST_AND_CLEAR': 83,
+ 'LOAD_FAST_CHECK': 84,
+ 'LOAD_FAST_LOAD_FAST': 85,
+ 'LOAD_FROM_DICT_OR_DEREF': 86,
+ 'LOAD_FROM_DICT_OR_GLOBALS': 87,
+ 'LOAD_GLOBAL': 88,
+ 'LOAD_NAME': 89,
+ 'LOAD_SMALL_INT': 90,
+ 'LOAD_SPECIAL': 91,
+ 'LOAD_SUPER_ATTR': 92,
+ 'MAKE_CELL': 93,
+ 'MAP_ADD': 94,
+ 'MATCH_CLASS': 95,
+ 'POP_JUMP_IF_FALSE': 96,
+ 'POP_JUMP_IF_NONE': 97,
+ 'POP_JUMP_IF_NOT_NONE': 98,
+ 'POP_JUMP_IF_TRUE': 99,
+ 'RAISE_VARARGS': 100,
+ 'RERAISE': 101,
+ 'SEND': 102,
+ 'SET_ADD': 103,
+ 'SET_FUNCTION_ATTRIBUTE': 104,
+ 'SET_UPDATE': 105,
+ 'STORE_ATTR': 106,
+ 'STORE_DEREF': 107,
+ 'STORE_FAST': 108,
+ 'STORE_FAST_LOAD_FAST': 109,
+ 'STORE_FAST_STORE_FAST': 110,
+ 'STORE_GLOBAL': 111,
+ 'STORE_NAME': 112,
+ 'SWAP': 113,
+ 'UNPACK_EX': 114,
+ 'UNPACK_SEQUENCE': 115,
+ 'YIELD_VALUE': 116,
'INSTRUMENTED_END_FOR': 235,
'INSTRUMENTED_POP_ITER': 236,
'INSTRUMENTED_END_SEND': 237,
@@ -362,5 +359,5 @@ opmap = {
'STORE_FAST_MAYBE_NULL': 265,
}
-HAVE_ARGUMENT = 44
+HAVE_ARGUMENT = 43
MIN_INSTRUMENTED_OPCODE = 235
diff --git a/Lib/test/test__opcode.py b/Lib/test/test__opcode.py
index 4b11e83ae59..c253bc2be02 100644
--- a/Lib/test/test__opcode.py
+++ b/Lib/test/test__opcode.py
@@ -123,7 +123,7 @@ class SpecializationStatsTests(unittest.TestCase):
if opcode._inline_cache_entries.get(op, 0)
]
self.assertIn('load_attr', specialized_opcodes)
- self.assertIn('binary_subscr', specialized_opcodes)
+ self.assertIn('binary_op', specialized_opcodes)
stats = _opcode.get_specialization_stats()
if stats is not None:
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index b5cf2ad18fe..6c3de2091c4 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -1410,7 +1410,7 @@ class TestSpecifics(unittest.TestCase):
check_op_count(load, "BINARY_SLICE", 3)
check_op_count(load, "BUILD_SLICE", 0)
check_consts(load, slice, [slice(None, None, None)])
- check_op_count(load, "BINARY_SUBSCR", 1)
+ check_op_count(load, "BINARY_OP", 4)
def store():
x[a:b] = y
@@ -1429,7 +1429,7 @@ class TestSpecifics(unittest.TestCase):
check_op_count(long_slice, "BUILD_SLICE", 1)
check_op_count(long_slice, "BINARY_SLICE", 0)
check_consts(long_slice, slice, [])
- check_op_count(long_slice, "BINARY_SUBSCR", 1)
+ check_op_count(long_slice, "BINARY_OP", 1)
def aug():
x[a:b] += y
@@ -1437,7 +1437,7 @@ class TestSpecifics(unittest.TestCase):
check_op_count(aug, "BINARY_SLICE", 1)
check_op_count(aug, "STORE_SLICE", 1)
check_op_count(aug, "BUILD_SLICE", 0)
- check_op_count(aug, "BINARY_SUBSCR", 0)
+ check_op_count(aug, "BINARY_OP", 1)
check_op_count(aug, "STORE_SUBSCR", 0)
check_consts(aug, slice, [])
@@ -1446,7 +1446,7 @@ class TestSpecifics(unittest.TestCase):
check_op_count(aug_const, "BINARY_SLICE", 0)
check_op_count(aug_const, "STORE_SLICE", 0)
- check_op_count(aug_const, "BINARY_SUBSCR", 1)
+ check_op_count(aug_const, "BINARY_OP", 2)
check_op_count(aug_const, "STORE_SUBSCR", 1)
check_consts(aug_const, slice, [slice(1, 2)])
@@ -2050,16 +2050,16 @@ class TestSourcePositions(unittest.TestCase):
snippet = "a - b @ (c * x['key'] + 23)"
compiled_code, _ = self.check_positions_against_ast(snippet)
- self.assertOpcodeSourcePositionIs(compiled_code, 'BINARY_SUBSCR',
+ self.assertOpcodeSourcePositionIs(compiled_code, 'BINARY_OP',
line=1, end_line=1, column=13, end_column=21)
self.assertOpcodeSourcePositionIs(compiled_code, 'BINARY_OP',
- line=1, end_line=1, column=9, end_column=21, occurrence=1)
+ line=1, end_line=1, column=9, end_column=21, occurrence=2)
self.assertOpcodeSourcePositionIs(compiled_code, 'BINARY_OP',
- line=1, end_line=1, column=9, end_column=26, occurrence=2)
+ line=1, end_line=1, column=9, end_column=26, occurrence=3)
self.assertOpcodeSourcePositionIs(compiled_code, 'BINARY_OP',
- line=1, end_line=1, column=4, end_column=27, occurrence=3)
+ line=1, end_line=1, column=4, end_column=27, occurrence=4)
self.assertOpcodeSourcePositionIs(compiled_code, 'BINARY_OP',
- line=1, end_line=1, column=0, end_column=27, occurrence=4)
+ line=1, end_line=1, column=0, end_column=27, occurrence=5)
def test_multiline_assert_rewritten_as_method_call(self):
# GH-94694: Don't crash if pytest rewrites a multiline assert as a
diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py
index 0b273cbd63e..27350120d66 100644
--- a/Lib/test/test_dis.py
+++ b/Lib/test/test_dis.py
@@ -1706,211 +1706,211 @@ def _prepare_test_cases():
Instruction = dis.Instruction
expected_opinfo_outer = [
- Instruction(opname='MAKE_CELL', opcode=94, arg=0, argval='a', argrepr='a', offset=0, start_offset=0, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='MAKE_CELL', opcode=94, arg=1, argval='b', argrepr='b', offset=2, start_offset=2, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='MAKE_CELL', opcode=93, arg=0, argval='a', argrepr='a', offset=0, start_offset=0, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='MAKE_CELL', opcode=93, arg=1, argval='b', argrepr='b', offset=2, start_offset=2, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', offset=4, start_offset=4, starts_line=True, line_number=1, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=(3, 4), argrepr='(3, 4)', offset=6, start_offset=6, starts_line=True, line_number=2, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='a', argrepr='a', offset=8, start_offset=8, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_FAST', opcode=83, arg=1, argval='b', argrepr='b', offset=10, start_offset=10, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
- Instruction(opname='BUILD_TUPLE', opcode=51, arg=2, argval=2, argrepr='', offset=12, start_offset=12, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_CONST', opcode=81, arg=0, argval=code_object_f, argrepr=repr(code_object_f), offset=14, start_offset=14, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
- Instruction(opname='MAKE_FUNCTION', opcode=24, arg=None, argval=None, argrepr='', offset=16, start_offset=16, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
- Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=105, arg=8, argval=8, argrepr='closure', offset=18, start_offset=18, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
- Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=105, arg=1, argval=1, argrepr='defaults', offset=20, start_offset=20, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
- Instruction(opname='STORE_FAST', opcode=109, arg=2, argval='f', argrepr='f', offset=22, start_offset=22, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_GLOBAL', opcode=89, arg=1, argval='print', argrepr='print + NULL', offset=24, start_offset=24, starts_line=True, line_number=7, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
- Instruction(opname='LOAD_DEREF', opcode=82, arg=0, argval='a', argrepr='a', offset=34, start_offset=34, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_DEREF', opcode=82, arg=1, argval='b', argrepr='b', offset=36, start_offset=36, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_CONST', opcode=81, arg=1, argval='', argrepr="''", offset=38, start_offset=38, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=1, argval=1, argrepr='', offset=40, start_offset=40, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
- Instruction(opname='BUILD_LIST', opcode=46, arg=0, argval=0, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
- Instruction(opname='BUILD_MAP', opcode=47, arg=0, argval=0, argrepr='', offset=44, start_offset=44, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_CONST', opcode=81, arg=2, argval='Hello world!', argrepr="'Hello world!'", offset=46, start_offset=46, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=52, arg=7, argval=7, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=7, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_FAST', opcode=83, arg=2, argval='f', argrepr='f', offset=58, start_offset=58, starts_line=True, line_number=8, label=None, positions=None, cache_info=None),
- Instruction(opname='RETURN_VALUE', opcode=36, arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=8, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=3, argval=(3, 4), argrepr='(3, 4)', offset=6, start_offset=6, starts_line=True, line_number=2, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='a', argrepr='a', offset=8, start_offset=8, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_FAST', opcode=82, arg=1, argval='b', argrepr='b', offset=10, start_offset=10, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
+ Instruction(opname='BUILD_TUPLE', opcode=50, arg=2, argval=2, argrepr='', offset=12, start_offset=12, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=0, argval=code_object_f, argrepr=repr(code_object_f), offset=14, start_offset=14, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
+ Instruction(opname='MAKE_FUNCTION', opcode=23, arg=None, argval=None, argrepr='', offset=16, start_offset=16, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
+ Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=104, arg=8, argval=8, argrepr='closure', offset=18, start_offset=18, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
+ Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=104, arg=1, argval=1, argrepr='defaults', offset=20, start_offset=20, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
+ Instruction(opname='STORE_FAST', opcode=108, arg=2, argval='f', argrepr='f', offset=22, start_offset=22, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_GLOBAL', opcode=88, arg=1, argval='print', argrepr='print + NULL', offset=24, start_offset=24, starts_line=True, line_number=7, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+ Instruction(opname='LOAD_DEREF', opcode=81, arg=0, argval='a', argrepr='a', offset=34, start_offset=34, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_DEREF', opcode=81, arg=1, argval='b', argrepr='b', offset=36, start_offset=36, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=1, argval='', argrepr="''", offset=38, start_offset=38, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_SMALL_INT', opcode=90, arg=1, argval=1, argrepr='', offset=40, start_offset=40, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
+ Instruction(opname='BUILD_LIST', opcode=45, arg=0, argval=0, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
+ Instruction(opname='BUILD_MAP', opcode=46, arg=0, argval=0, argrepr='', offset=44, start_offset=44, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=2, argval='Hello world!', argrepr="'Hello world!'", offset=46, start_offset=46, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=51, arg=7, argval=7, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=7, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_FAST', opcode=82, arg=2, argval='f', argrepr='f', offset=58, start_offset=58, starts_line=True, line_number=8, label=None, positions=None, cache_info=None),
+ Instruction(opname='RETURN_VALUE', opcode=35, arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=8, label=None, positions=None, cache_info=None),
]
expected_opinfo_f = [
- Instruction(opname='COPY_FREE_VARS', opcode=60, arg=2, argval=2, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='MAKE_CELL', opcode=94, arg=0, argval='c', argrepr='c', offset=2, start_offset=2, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='MAKE_CELL', opcode=94, arg=1, argval='d', argrepr='d', offset=4, start_offset=4, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='COPY_FREE_VARS', opcode=59, arg=2, argval=2, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='MAKE_CELL', opcode=93, arg=0, argval='c', argrepr='c', offset=2, start_offset=2, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='MAKE_CELL', opcode=93, arg=1, argval='d', argrepr='d', offset=4, start_offset=4, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', offset=6, start_offset=6, starts_line=True, line_number=2, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_CONST', opcode=81, arg=1, argval=(5, 6), argrepr='(5, 6)', offset=8, start_offset=8, starts_line=True, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_FAST', opcode=83, arg=3, argval='a', argrepr='a', offset=10, start_offset=10, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_FAST', opcode=83, arg=4, argval='b', argrepr='b', offset=12, start_offset=12, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='c', argrepr='c', offset=14, start_offset=14, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_FAST', opcode=83, arg=1, argval='d', argrepr='d', offset=16, start_offset=16, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='BUILD_TUPLE', opcode=51, arg=4, argval=4, argrepr='', offset=18, start_offset=18, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_CONST', opcode=81, arg=0, argval=code_object_inner, argrepr=repr(code_object_inner), offset=20, start_offset=20, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='MAKE_FUNCTION', opcode=24, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=105, arg=8, argval=8, argrepr='closure', offset=24, start_offset=24, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=105, arg=1, argval=1, argrepr='defaults', offset=26, start_offset=26, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='STORE_FAST', opcode=109, arg=2, argval='inner', argrepr='inner', offset=28, start_offset=28, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_GLOBAL', opcode=89, arg=1, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=5, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
- Instruction(opname='LOAD_DEREF', opcode=82, arg=3, argval='a', argrepr='a', offset=40, start_offset=40, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_DEREF', opcode=82, arg=4, argval='b', argrepr='b', offset=42, start_offset=42, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_DEREF', opcode=82, arg=0, argval='c', argrepr='c', offset=44, start_offset=44, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_DEREF', opcode=82, arg=1, argval='d', argrepr='d', offset=46, start_offset=46, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=52, arg=4, argval=4, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=5, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_FAST', opcode=83, arg=2, argval='inner', argrepr='inner', offset=58, start_offset=58, starts_line=True, line_number=6, label=None, positions=None, cache_info=None),
- Instruction(opname='RETURN_VALUE', opcode=36, arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=6, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=1, argval=(5, 6), argrepr='(5, 6)', offset=8, start_offset=8, starts_line=True, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_FAST', opcode=82, arg=3, argval='a', argrepr='a', offset=10, start_offset=10, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_FAST', opcode=82, arg=4, argval='b', argrepr='b', offset=12, start_offset=12, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='c', argrepr='c', offset=14, start_offset=14, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_FAST', opcode=82, arg=1, argval='d', argrepr='d', offset=16, start_offset=16, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='BUILD_TUPLE', opcode=50, arg=4, argval=4, argrepr='', offset=18, start_offset=18, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=0, argval=code_object_inner, argrepr=repr(code_object_inner), offset=20, start_offset=20, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='MAKE_FUNCTION', opcode=23, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=104, arg=8, argval=8, argrepr='closure', offset=24, start_offset=24, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=104, arg=1, argval=1, argrepr='defaults', offset=26, start_offset=26, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='STORE_FAST', opcode=108, arg=2, argval='inner', argrepr='inner', offset=28, start_offset=28, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_GLOBAL', opcode=88, arg=1, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=5, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+ Instruction(opname='LOAD_DEREF', opcode=81, arg=3, argval='a', argrepr='a', offset=40, start_offset=40, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_DEREF', opcode=81, arg=4, argval='b', argrepr='b', offset=42, start_offset=42, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_DEREF', opcode=81, arg=0, argval='c', argrepr='c', offset=44, start_offset=44, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_DEREF', opcode=81, arg=1, argval='d', argrepr='d', offset=46, start_offset=46, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=51, arg=4, argval=4, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=5, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_FAST', opcode=82, arg=2, argval='inner', argrepr='inner', offset=58, start_offset=58, starts_line=True, line_number=6, label=None, positions=None, cache_info=None),
+ Instruction(opname='RETURN_VALUE', opcode=35, arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=6, label=None, positions=None, cache_info=None),
]
expected_opinfo_inner = [
- Instruction(opname='COPY_FREE_VARS', opcode=60, arg=4, argval=4, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='COPY_FREE_VARS', opcode=59, arg=4, argval=4, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', offset=2, start_offset=2, starts_line=True, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_GLOBAL', opcode=89, arg=1, argval='print', argrepr='print + NULL', offset=4, start_offset=4, starts_line=True, line_number=4, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
- Instruction(opname='LOAD_DEREF', opcode=82, arg=2, argval='a', argrepr='a', offset=14, start_offset=14, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_DEREF', opcode=82, arg=3, argval='b', argrepr='b', offset=16, start_offset=16, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_DEREF', opcode=82, arg=4, argval='c', argrepr='c', offset=18, start_offset=18, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_DEREF', opcode=82, arg=5, argval='d', argrepr='d', offset=20, start_offset=20, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_FAST_LOAD_FAST', opcode=86, arg=1, argval=('e', 'f'), argrepr='e, f', offset=22, start_offset=22, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=52, arg=6, argval=6, argrepr='', offset=24, start_offset=24, starts_line=False, line_number=4, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=32, start_offset=32, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_CONST', opcode=81, arg=0, argval=None, argrepr='None', offset=34, start_offset=34, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
- Instruction(opname='RETURN_VALUE', opcode=36, arg=None, argval=None, argrepr='', offset=36, start_offset=36, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_GLOBAL', opcode=88, arg=1, argval='print', argrepr='print + NULL', offset=4, start_offset=4, starts_line=True, line_number=4, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+ Instruction(opname='LOAD_DEREF', opcode=81, arg=2, argval='a', argrepr='a', offset=14, start_offset=14, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_DEREF', opcode=81, arg=3, argval='b', argrepr='b', offset=16, start_offset=16, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_DEREF', opcode=81, arg=4, argval='c', argrepr='c', offset=18, start_offset=18, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_DEREF', opcode=81, arg=5, argval='d', argrepr='d', offset=20, start_offset=20, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_FAST_LOAD_FAST', opcode=85, arg=1, argval=('e', 'f'), argrepr='e, f', offset=22, start_offset=22, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=51, arg=6, argval=6, argrepr='', offset=24, start_offset=24, starts_line=False, line_number=4, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=32, start_offset=32, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=0, argval=None, argrepr='None', offset=34, start_offset=34, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
+ Instruction(opname='RETURN_VALUE', opcode=35, arg=None, argval=None, argrepr='', offset=36, start_offset=36, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
]
expected_opinfo_jumpy = [
Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=1, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_GLOBAL', opcode=89, arg=1, argval='range', argrepr='range + NULL', offset=2, start_offset=2, starts_line=True, line_number=3, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
- Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=10, argval=10, argrepr='', offset=12, start_offset=12, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=14, start_offset=14, starts_line=False, line_number=3, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='GET_ITER', opcode=18, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='FOR_ITER', opcode=69, arg=32, argval=92, argrepr='to L4', offset=24, start_offset=24, starts_line=False, line_number=3, label=1, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='STORE_FAST', opcode=109, arg=0, argval='i', argrepr='i', offset=28, start_offset=28, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=4, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
- Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=40, start_offset=40, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=4, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=50, start_offset=50, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=52, start_offset=52, starts_line=True, line_number=5, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=4, argval=4, argrepr='', offset=54, start_offset=54, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
- Instruction(opname='COMPARE_OP', opcode=56, arg=18, argval='<', argrepr='bool(<)', offset=56, start_offset=56, starts_line=False, line_number=5, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=3, argval=70, argrepr='to L2', offset=60, start_offset=60, starts_line=False, line_number=5, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='NOT_TAKEN', opcode=29, arg=None, argval=None, argrepr='', offset=64, start_offset=64, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
- Instruction(opname='JUMP_BACKWARD', opcode=74, arg=23, argval=24, argrepr='to L1', offset=66, start_offset=66, starts_line=True, line_number=6, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=70, start_offset=70, starts_line=True, line_number=7, label=2, positions=None, cache_info=None),
- Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=6, argval=6, argrepr='', offset=72, start_offset=72, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
- Instruction(opname='COMPARE_OP', opcode=56, arg=148, argval='>', argrepr='bool(>)', offset=74, start_offset=74, starts_line=False, line_number=7, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='POP_JUMP_IF_TRUE', opcode=100, arg=3, argval=88, argrepr='to L3', offset=78, start_offset=78, starts_line=False, line_number=7, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='NOT_TAKEN', opcode=29, arg=None, argval=None, argrepr='', offset=82, start_offset=82, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
- Instruction(opname='JUMP_BACKWARD', opcode=74, arg=32, argval=24, argrepr='to L1', offset=84, start_offset=84, starts_line=False, line_number=7, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=88, start_offset=88, starts_line=True, line_number=8, label=3, positions=None, cache_info=None),
- Instruction(opname='JUMP_FORWARD', opcode=76, arg=13, argval=118, argrepr='to L5', offset=90, start_offset=90, starts_line=False, line_number=8, label=None, positions=None, cache_info=None),
- Instruction(opname='END_FOR', opcode=10, arg=None, argval=None, argrepr='', offset=92, start_offset=92, starts_line=True, line_number=3, label=4, positions=None, cache_info=None),
- Instruction(opname='POP_ITER', opcode=31, arg=None, argval=None, argrepr='', offset=94, start_offset=94, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=96, start_offset=96, starts_line=True, line_number=10, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
- Instruction(opname='LOAD_CONST', opcode=81, arg=0, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=106, start_offset=106, starts_line=False, line_number=10, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=108, start_offset=108, starts_line=False, line_number=10, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=116, start_offset=116, starts_line=False, line_number=10, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_FAST_CHECK', opcode=85, arg=0, argval='i', argrepr='i', offset=118, start_offset=118, starts_line=True, line_number=11, label=5, positions=None, cache_info=None),
- Instruction(opname='TO_BOOL', opcode=40, arg=None, argval=None, argrepr='', offset=120, start_offset=120, starts_line=False, line_number=11, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=40, argval=212, argrepr='to L8', offset=128, start_offset=128, starts_line=False, line_number=11, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='NOT_TAKEN', opcode=29, arg=None, argval=None, argrepr='', offset=132, start_offset=132, starts_line=False, line_number=11, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=134, start_offset=134, starts_line=True, line_number=12, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
- Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=144, start_offset=144, starts_line=False, line_number=12, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=146, start_offset=146, starts_line=False, line_number=12, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=154, start_offset=154, starts_line=False, line_number=12, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=156, start_offset=156, starts_line=True, line_number=13, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=1, argval=1, argrepr='', offset=158, start_offset=158, starts_line=False, line_number=13, label=None, positions=None, cache_info=None),
- Instruction(opname='BINARY_OP', opcode=45, arg=23, argval=23, argrepr='-=', offset=160, start_offset=160, starts_line=False, line_number=13, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]),
- Instruction(opname='STORE_FAST', opcode=109, arg=0, argval='i', argrepr='i', offset=172, start_offset=172, starts_line=False, line_number=13, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=174, start_offset=174, starts_line=True, line_number=14, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=6, argval=6, argrepr='', offset=176, start_offset=176, starts_line=False, line_number=14, label=None, positions=None, cache_info=None),
- Instruction(opname='COMPARE_OP', opcode=56, arg=148, argval='>', argrepr='bool(>)', offset=178, start_offset=178, starts_line=False, line_number=14, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=3, argval=192, argrepr='to L6', offset=182, start_offset=182, starts_line=False, line_number=14, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='NOT_TAKEN', opcode=29, arg=None, argval=None, argrepr='', offset=186, start_offset=186, starts_line=False, line_number=14, label=None, positions=None, cache_info=None),
- Instruction(opname='JUMP_BACKWARD', opcode=74, arg=37, argval=118, argrepr='to L5', offset=188, start_offset=188, starts_line=True, line_number=15, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=192, start_offset=192, starts_line=True, line_number=16, label=6, positions=None, cache_info=None),
- Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=4, argval=4, argrepr='', offset=194, start_offset=194, starts_line=False, line_number=16, label=None, positions=None, cache_info=None),
- Instruction(opname='COMPARE_OP', opcode=56, arg=18, argval='<', argrepr='bool(<)', offset=196, start_offset=196, starts_line=False, line_number=16, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='POP_JUMP_IF_TRUE', opcode=100, arg=3, argval=210, argrepr='to L7', offset=200, start_offset=200, starts_line=False, line_number=16, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='NOT_TAKEN', opcode=29, arg=None, argval=None, argrepr='', offset=204, start_offset=204, starts_line=False, line_number=16, label=None, positions=None, cache_info=None),
- Instruction(opname='JUMP_BACKWARD', opcode=74, arg=46, argval=118, argrepr='to L5', offset=206, start_offset=206, starts_line=False, line_number=16, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='JUMP_FORWARD', opcode=76, arg=11, argval=234, argrepr='to L9', offset=210, start_offset=210, starts_line=True, line_number=17, label=7, positions=None, cache_info=None),
- Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=212, start_offset=212, starts_line=True, line_number=19, label=8, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
- Instruction(opname='LOAD_CONST', opcode=81, arg=1, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=222, start_offset=222, starts_line=False, line_number=19, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=224, start_offset=224, starts_line=False, line_number=19, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=232, start_offset=232, starts_line=False, line_number=19, label=None, positions=None, cache_info=None),
- Instruction(opname='NOP', opcode=28, arg=None, argval=None, argrepr='', offset=234, start_offset=234, starts_line=True, line_number=20, label=9, positions=None, cache_info=None),
- Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=1, argval=1, argrepr='', offset=236, start_offset=236, starts_line=True, line_number=21, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=0, argval=0, argrepr='', offset=238, start_offset=238, starts_line=False, line_number=21, label=None, positions=None, cache_info=None),
- Instruction(opname='BINARY_OP', opcode=45, arg=11, argval=11, argrepr='/', offset=240, start_offset=240, starts_line=False, line_number=21, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=252, start_offset=252, starts_line=False, line_number=21, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=254, start_offset=254, starts_line=True, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='COPY', opcode=59, arg=1, argval=1, argrepr='', offset=256, start_offset=256, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_SPECIAL', opcode=92, arg=1, argval=1, argrepr='__exit__', offset=258, start_offset=258, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='SWAP', opcode=114, arg=2, argval=2, argrepr='', offset=260, start_offset=260, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='SWAP', opcode=114, arg=3, argval=3, argrepr='', offset=262, start_offset=262, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_SPECIAL', opcode=92, arg=0, argval=0, argrepr='__enter__', offset=264, start_offset=264, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=52, arg=0, argval=0, argrepr='', offset=266, start_offset=266, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='STORE_FAST', opcode=109, arg=1, argval='dodgy', argrepr='dodgy', offset=274, start_offset=274, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=276, start_offset=276, starts_line=True, line_number=26, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
- Instruction(opname='LOAD_CONST', opcode=81, arg=2, argval='Never reach this', argrepr="'Never reach this'", offset=286, start_offset=286, starts_line=False, line_number=26, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=288, start_offset=288, starts_line=False, line_number=26, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=296, start_offset=296, starts_line=False, line_number=26, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=None, argrepr='None', offset=298, start_offset=298, starts_line=True, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=None, argrepr='None', offset=300, start_offset=300, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=None, argrepr='None', offset=302, start_offset=302, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=52, arg=3, argval=3, argrepr='', offset=304, start_offset=304, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=312, start_offset=312, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=314, start_offset=314, starts_line=True, line_number=28, label=10, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
- Instruction(opname='LOAD_CONST', opcode=81, arg=5, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=324, start_offset=324, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=326, start_offset=326, starts_line=False, line_number=28, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=334, start_offset=334, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=None, argrepr='None', offset=336, start_offset=336, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
- Instruction(opname='RETURN_VALUE', opcode=36, arg=None, argval=None, argrepr='', offset=338, start_offset=338, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
- Instruction(opname='PUSH_EXC_INFO', opcode=33, arg=None, argval=None, argrepr='', offset=340, start_offset=340, starts_line=True, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='WITH_EXCEPT_START', opcode=44, arg=None, argval=None, argrepr='', offset=342, start_offset=342, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='TO_BOOL', opcode=40, arg=None, argval=None, argrepr='', offset=344, start_offset=344, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_JUMP_IF_TRUE', opcode=100, arg=2, argval=360, argrepr='to L11', offset=352, start_offset=352, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='NOT_TAKEN', opcode=29, arg=None, argval=None, argrepr='', offset=356, start_offset=356, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='RERAISE', opcode=102, arg=2, argval=2, argrepr='', offset=358, start_offset=358, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=360, start_offset=360, starts_line=False, line_number=25, label=11, positions=None, cache_info=None),
- Instruction(opname='POP_EXCEPT', opcode=30, arg=None, argval=None, argrepr='', offset=362, start_offset=362, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=364, start_offset=364, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=366, start_offset=366, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=368, start_offset=368, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=75, arg=29, argval=314, argrepr='to L10', offset=370, start_offset=370, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
- Instruction(opname='COPY', opcode=59, arg=3, argval=3, argrepr='', offset=372, start_offset=372, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_EXCEPT', opcode=30, arg=None, argval=None, argrepr='', offset=374, start_offset=374, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=376, start_offset=376, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='PUSH_EXC_INFO', opcode=33, arg=None, argval=None, argrepr='', offset=378, start_offset=378, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_GLOBAL', opcode=89, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=380, start_offset=380, starts_line=True, line_number=22, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
- Instruction(opname='CHECK_EXC_MATCH', opcode=6, arg=None, argval=None, argrepr='', offset=390, start_offset=390, starts_line=False, line_number=22, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=15, argval=426, argrepr='to L12', offset=392, start_offset=392, starts_line=False, line_number=22, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
- Instruction(opname='NOT_TAKEN', opcode=29, arg=None, argval=None, argrepr='', offset=396, start_offset=396, starts_line=False, line_number=22, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=398, start_offset=398, starts_line=False, line_number=22, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=400, start_offset=400, starts_line=True, line_number=23, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
- Instruction(opname='LOAD_CONST', opcode=81, arg=4, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=410, start_offset=410, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=412, start_offset=412, starts_line=False, line_number=23, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=420, start_offset=420, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_EXCEPT', opcode=30, arg=None, argval=None, argrepr='', offset=422, start_offset=422, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
- Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=75, arg=56, argval=314, argrepr='to L10', offset=424, start_offset=424, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
- Instruction(opname='RERAISE', opcode=102, arg=0, argval=0, argrepr='', offset=426, start_offset=426, starts_line=True, line_number=22, label=12, positions=None, cache_info=None),
- Instruction(opname='COPY', opcode=59, arg=3, argval=3, argrepr='', offset=428, start_offset=428, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_EXCEPT', opcode=30, arg=None, argval=None, argrepr='', offset=430, start_offset=430, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=432, start_offset=432, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='PUSH_EXC_INFO', opcode=33, arg=None, argval=None, argrepr='', offset=434, start_offset=434, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=436, start_offset=436, starts_line=True, line_number=28, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
- Instruction(opname='LOAD_CONST', opcode=81, arg=5, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=446, start_offset=446, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
- Instruction(opname='CALL', opcode=52, arg=1, argval=1, argrepr='', offset=448, start_offset=448, starts_line=False, line_number=28, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
- Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=456, start_offset=456, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
- Instruction(opname='RERAISE', opcode=102, arg=0, argval=0, argrepr='', offset=458, start_offset=458, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
- Instruction(opname='COPY', opcode=59, arg=3, argval=3, argrepr='', offset=460, start_offset=460, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='POP_EXCEPT', opcode=30, arg=None, argval=None, argrepr='', offset=462, start_offset=462, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
- Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=464, start_offset=464, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_GLOBAL', opcode=88, arg=1, argval='range', argrepr='range + NULL', offset=2, start_offset=2, starts_line=True, line_number=3, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+ Instruction(opname='LOAD_SMALL_INT', opcode=90, arg=10, argval=10, argrepr='', offset=12, start_offset=12, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=14, start_offset=14, starts_line=False, line_number=3, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='GET_ITER', opcode=16, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='FOR_ITER', opcode=68, arg=32, argval=92, argrepr='to L4', offset=24, start_offset=24, starts_line=False, line_number=3, label=1, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+ Instruction(opname='STORE_FAST', opcode=108, arg=0, argval='i', argrepr='i', offset=28, start_offset=28, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=4, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+ Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', offset=40, start_offset=40, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=4, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=50, start_offset=50, starts_line=False, line_number=4, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', offset=52, start_offset=52, starts_line=True, line_number=5, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_SMALL_INT', opcode=90, arg=4, argval=4, argrepr='', offset=54, start_offset=54, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
+ Instruction(opname='COMPARE_OP', opcode=55, arg=18, argval='<', argrepr='bool(<)', offset=56, start_offset=56, starts_line=False, line_number=5, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+ Instruction(opname='POP_JUMP_IF_FALSE', opcode=96, arg=3, argval=70, argrepr='to L2', offset=60, start_offset=60, starts_line=False, line_number=5, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+ Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=64, start_offset=64, starts_line=False, line_number=5, label=None, positions=None, cache_info=None),
+ Instruction(opname='JUMP_BACKWARD', opcode=73, arg=23, argval=24, argrepr='to L1', offset=66, start_offset=66, starts_line=True, line_number=6, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+ Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', offset=70, start_offset=70, starts_line=True, line_number=7, label=2, positions=None, cache_info=None),
+ Instruction(opname='LOAD_SMALL_INT', opcode=90, arg=6, argval=6, argrepr='', offset=72, start_offset=72, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
+ Instruction(opname='COMPARE_OP', opcode=55, arg=148, argval='>', argrepr='bool(>)', offset=74, start_offset=74, starts_line=False, line_number=7, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+ Instruction(opname='POP_JUMP_IF_TRUE', opcode=99, arg=3, argval=88, argrepr='to L3', offset=78, start_offset=78, starts_line=False, line_number=7, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+ Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=82, start_offset=82, starts_line=False, line_number=7, label=None, positions=None, cache_info=None),
+ Instruction(opname='JUMP_BACKWARD', opcode=73, arg=32, argval=24, argrepr='to L1', offset=84, start_offset=84, starts_line=False, line_number=7, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=88, start_offset=88, starts_line=True, line_number=8, label=3, positions=None, cache_info=None),
+ Instruction(opname='JUMP_FORWARD', opcode=75, arg=13, argval=118, argrepr='to L5', offset=90, start_offset=90, starts_line=False, line_number=8, label=None, positions=None, cache_info=None),
+ Instruction(opname='END_FOR', opcode=9, arg=None, argval=None, argrepr='', offset=92, start_offset=92, starts_line=True, line_number=3, label=4, positions=None, cache_info=None),
+ Instruction(opname='POP_ITER', opcode=30, arg=None, argval=None, argrepr='', offset=94, start_offset=94, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', argrepr='print + NULL', offset=96, start_offset=96, starts_line=True, line_number=10, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=0, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=106, start_offset=106, starts_line=False, line_number=10, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=108, start_offset=108, starts_line=False, line_number=10, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=116, start_offset=116, starts_line=False, line_number=10, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_FAST_CHECK', opcode=84, arg=0, argval='i', argrepr='i', offset=118, start_offset=118, starts_line=True, line_number=11, label=5, positions=None, cache_info=None),
+ Instruction(opname='TO_BOOL', opcode=39, arg=None, argval=None, argrepr='', offset=120, start_offset=120, starts_line=False, line_number=11, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_JUMP_IF_FALSE', opcode=96, arg=40, argval=212, argrepr='to L8', offset=128, start_offset=128, starts_line=False, line_number=11, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+ Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=132, start_offset=132, starts_line=False, line_number=11, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', argrepr='print + NULL', offset=134, start_offset=134, starts_line=True, line_number=12, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+ Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', offset=144, start_offset=144, starts_line=False, line_number=12, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=146, start_offset=146, starts_line=False, line_number=12, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=154, start_offset=154, starts_line=False, line_number=12, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', offset=156, start_offset=156, starts_line=True, line_number=13, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_SMALL_INT', opcode=90, arg=1, argval=1, argrepr='', offset=158, start_offset=158, starts_line=False, line_number=13, label=None, positions=None, cache_info=None),
+ Instruction(opname='BINARY_OP', opcode=44, arg=23, argval=23, argrepr='-=', offset=160, start_offset=160, starts_line=False, line_number=13, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]),
+ Instruction(opname='STORE_FAST', opcode=108, arg=0, argval='i', argrepr='i', offset=172, start_offset=172, starts_line=False, line_number=13, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', offset=174, start_offset=174, starts_line=True, line_number=14, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_SMALL_INT', opcode=90, arg=6, argval=6, argrepr='', offset=176, start_offset=176, starts_line=False, line_number=14, label=None, positions=None, cache_info=None),
+ Instruction(opname='COMPARE_OP', opcode=55, arg=148, argval='>', argrepr='bool(>)', offset=178, start_offset=178, starts_line=False, line_number=14, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+ Instruction(opname='POP_JUMP_IF_FALSE', opcode=96, arg=3, argval=192, argrepr='to L6', offset=182, start_offset=182, starts_line=False, line_number=14, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+ Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=186, start_offset=186, starts_line=False, line_number=14, label=None, positions=None, cache_info=None),
+ Instruction(opname='JUMP_BACKWARD', opcode=73, arg=37, argval=118, argrepr='to L5', offset=188, start_offset=188, starts_line=True, line_number=15, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+ Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', offset=192, start_offset=192, starts_line=True, line_number=16, label=6, positions=None, cache_info=None),
+ Instruction(opname='LOAD_SMALL_INT', opcode=90, arg=4, argval=4, argrepr='', offset=194, start_offset=194, starts_line=False, line_number=16, label=None, positions=None, cache_info=None),
+ Instruction(opname='COMPARE_OP', opcode=55, arg=18, argval='<', argrepr='bool(<)', offset=196, start_offset=196, starts_line=False, line_number=16, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+ Instruction(opname='POP_JUMP_IF_TRUE', opcode=99, arg=3, argval=210, argrepr='to L7', offset=200, start_offset=200, starts_line=False, line_number=16, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+ Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=204, start_offset=204, starts_line=False, line_number=16, label=None, positions=None, cache_info=None),
+ Instruction(opname='JUMP_BACKWARD', opcode=73, arg=46, argval=118, argrepr='to L5', offset=206, start_offset=206, starts_line=False, line_number=16, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+ Instruction(opname='JUMP_FORWARD', opcode=75, arg=11, argval=234, argrepr='to L9', offset=210, start_offset=210, starts_line=True, line_number=17, label=7, positions=None, cache_info=None),
+ Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', argrepr='print + NULL', offset=212, start_offset=212, starts_line=True, line_number=19, label=8, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=1, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=222, start_offset=222, starts_line=False, line_number=19, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=224, start_offset=224, starts_line=False, line_number=19, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=232, start_offset=232, starts_line=False, line_number=19, label=None, positions=None, cache_info=None),
+ Instruction(opname='NOP', opcode=27, arg=None, argval=None, argrepr='', offset=234, start_offset=234, starts_line=True, line_number=20, label=9, positions=None, cache_info=None),
+ Instruction(opname='LOAD_SMALL_INT', opcode=90, arg=1, argval=1, argrepr='', offset=236, start_offset=236, starts_line=True, line_number=21, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_SMALL_INT', opcode=90, arg=0, argval=0, argrepr='', offset=238, start_offset=238, starts_line=False, line_number=21, label=None, positions=None, cache_info=None),
+ Instruction(opname='BINARY_OP', opcode=44, arg=11, argval=11, argrepr='/', offset=240, start_offset=240, starts_line=False, line_number=21, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=252, start_offset=252, starts_line=False, line_number=21, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', offset=254, start_offset=254, starts_line=True, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='COPY', opcode=58, arg=1, argval=1, argrepr='', offset=256, start_offset=256, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_SPECIAL', opcode=91, arg=1, argval=1, argrepr='__exit__', offset=258, start_offset=258, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='SWAP', opcode=113, arg=2, argval=2, argrepr='', offset=260, start_offset=260, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='SWAP', opcode=113, arg=3, argval=3, argrepr='', offset=262, start_offset=262, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_SPECIAL', opcode=91, arg=0, argval=0, argrepr='__enter__', offset=264, start_offset=264, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=51, arg=0, argval=0, argrepr='', offset=266, start_offset=266, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='STORE_FAST', opcode=108, arg=1, argval='dodgy', argrepr='dodgy', offset=274, start_offset=274, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', argrepr='print + NULL', offset=276, start_offset=276, starts_line=True, line_number=26, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=2, argval='Never reach this', argrepr="'Never reach this'", offset=286, start_offset=286, starts_line=False, line_number=26, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=288, start_offset=288, starts_line=False, line_number=26, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=296, start_offset=296, starts_line=False, line_number=26, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=3, argval=None, argrepr='None', offset=298, start_offset=298, starts_line=True, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=3, argval=None, argrepr='None', offset=300, start_offset=300, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=3, argval=None, argrepr='None', offset=302, start_offset=302, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=51, arg=3, argval=3, argrepr='', offset=304, start_offset=304, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=312, start_offset=312, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', argrepr='print + NULL', offset=314, start_offset=314, starts_line=True, line_number=28, label=10, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=5, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=324, start_offset=324, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=326, start_offset=326, starts_line=False, line_number=28, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=334, start_offset=334, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=3, argval=None, argrepr='None', offset=336, start_offset=336, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
+ Instruction(opname='RETURN_VALUE', opcode=35, arg=None, argval=None, argrepr='', offset=338, start_offset=338, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
+ Instruction(opname='PUSH_EXC_INFO', opcode=32, arg=None, argval=None, argrepr='', offset=340, start_offset=340, starts_line=True, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='WITH_EXCEPT_START', opcode=43, arg=None, argval=None, argrepr='', offset=342, start_offset=342, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='TO_BOOL', opcode=39, arg=None, argval=None, argrepr='', offset=344, start_offset=344, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_JUMP_IF_TRUE', opcode=99, arg=2, argval=360, argrepr='to L11', offset=352, start_offset=352, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+ Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=356, start_offset=356, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='RERAISE', opcode=101, arg=2, argval=2, argrepr='', offset=358, start_offset=358, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=360, start_offset=360, starts_line=False, line_number=25, label=11, positions=None, cache_info=None),
+ Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=362, start_offset=362, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=364, start_offset=364, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=366, start_offset=366, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=368, start_offset=368, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=74, arg=29, argval=314, argrepr='to L10', offset=370, start_offset=370, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
+ Instruction(opname='COPY', opcode=58, arg=3, argval=3, argrepr='', offset=372, start_offset=372, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=374, start_offset=374, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='RERAISE', opcode=101, arg=1, argval=1, argrepr='', offset=376, start_offset=376, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='PUSH_EXC_INFO', opcode=32, arg=None, argval=None, argrepr='', offset=378, start_offset=378, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_GLOBAL', opcode=88, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=380, start_offset=380, starts_line=True, line_number=22, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+ Instruction(opname='CHECK_EXC_MATCH', opcode=5, arg=None, argval=None, argrepr='', offset=390, start_offset=390, starts_line=False, line_number=22, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_JUMP_IF_FALSE', opcode=96, arg=15, argval=426, argrepr='to L12', offset=392, start_offset=392, starts_line=False, line_number=22, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+ Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=396, start_offset=396, starts_line=False, line_number=22, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=398, start_offset=398, starts_line=False, line_number=22, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', argrepr='print + NULL', offset=400, start_offset=400, starts_line=True, line_number=23, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=4, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=410, start_offset=410, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=412, start_offset=412, starts_line=False, line_number=23, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=420, start_offset=420, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=422, start_offset=422, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
+ Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=74, arg=56, argval=314, argrepr='to L10', offset=424, start_offset=424, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
+ Instruction(opname='RERAISE', opcode=101, arg=0, argval=0, argrepr='', offset=426, start_offset=426, starts_line=True, line_number=22, label=12, positions=None, cache_info=None),
+ Instruction(opname='COPY', opcode=58, arg=3, argval=3, argrepr='', offset=428, start_offset=428, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=430, start_offset=430, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='RERAISE', opcode=101, arg=1, argval=1, argrepr='', offset=432, start_offset=432, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='PUSH_EXC_INFO', opcode=32, arg=None, argval=None, argrepr='', offset=434, start_offset=434, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', argrepr='print + NULL', offset=436, start_offset=436, starts_line=True, line_number=28, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=5, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=446, start_offset=446, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
+ Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=448, start_offset=448, starts_line=False, line_number=28, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
+ Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=456, start_offset=456, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
+ Instruction(opname='RERAISE', opcode=101, arg=0, argval=0, argrepr='', offset=458, start_offset=458, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
+ Instruction(opname='COPY', opcode=58, arg=3, argval=3, argrepr='', offset=460, start_offset=460, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=462, start_offset=462, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
+ Instruction(opname='RERAISE', opcode=101, arg=1, argval=1, argrepr='', offset=464, start_offset=464, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
]
# One last piece of inspect fodder to check the default line number handling
def simple(): pass
expected_opinfo_simple = [
Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=simple.__code__.co_firstlineno, label=None, positions=None),
- Instruction(opname='LOAD_CONST', opcode=81, arg=0, argval=None, argrepr='None', offset=2, start_offset=2, starts_line=False, line_number=simple.__code__.co_firstlineno, label=None),
- Instruction(opname='RETURN_VALUE', opcode=36, arg=None, argval=None, argrepr='', offset=4, start_offset=4, starts_line=False, line_number=simple.__code__.co_firstlineno, label=None),
+ Instruction(opname='LOAD_CONST', opcode=80, arg=0, argval=None, argrepr='None', offset=2, start_offset=2, starts_line=False, line_number=simple.__code__.co_firstlineno, label=None),
+ Instruction(opname='RETURN_VALUE', opcode=35, arg=None, argval=None, argrepr='', offset=4, start_offset=4, starts_line=False, line_number=simple.__code__.co_firstlineno, label=None),
]
diff --git a/Lib/test/test_opcache.py b/Lib/test/test_opcache.py
index 87de4c94ba2..e4224b843b2 100644
--- a/Lib/test/test_opcache.py
+++ b/Lib/test/test_opcache.py
@@ -629,7 +629,7 @@ class TestRacesDoNotCrash(TestBase):
pass
type(item).__getitem__ = lambda self, item: None
- opname = "BINARY_SUBSCR_GETITEM"
+ opname = "BINARY_OP_SUBSCR_GETITEM"
self.assert_races_do_not_crash(opname, get_items, read, write)
@requires_specialization_ft
@@ -653,7 +653,7 @@ class TestRacesDoNotCrash(TestBase):
item.clear()
item.append(None)
- opname = "BINARY_SUBSCR_LIST_INT"
+ opname = "BINARY_OP_SUBSCR_LIST_INT"
self.assert_races_do_not_crash(opname, get_items, read, write)
@requires_specialization
@@ -1705,7 +1705,7 @@ class TestSpecializer(TestBase):
binary_subscr_list_int()
self.assert_specialized(binary_subscr_list_int,
- "BINARY_SUBSCR_LIST_INT")
+ "BINARY_OP_SUBSCR_LIST_INT")
self.assert_no_opcode(binary_subscr_list_int, "BINARY_SUBSCR")
def binary_subscr_tuple_int():
@@ -1716,7 +1716,7 @@ class TestSpecializer(TestBase):
binary_subscr_tuple_int()
self.assert_specialized(binary_subscr_tuple_int,
- "BINARY_SUBSCR_TUPLE_INT")
+ "BINARY_OP_SUBSCR_TUPLE_INT")
self.assert_no_opcode(binary_subscr_tuple_int, "BINARY_SUBSCR")
def binary_subscr_dict():
@@ -1726,8 +1726,8 @@ class TestSpecializer(TestBase):
self.assertEqual(a[2], 3)
binary_subscr_dict()
- self.assert_specialized(binary_subscr_dict, "BINARY_SUBSCR_DICT")
- self.assert_no_opcode(binary_subscr_dict, "BINARY_SUBSCR")
+ self.assert_specialized(binary_subscr_dict, "BINARY_OP_SUBSCR_DICT")
+ self.assert_no_opcode(binary_subscr_dict, "BINARY_OP")
def binary_subscr_str_int():
for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
@@ -1736,7 +1736,7 @@ class TestSpecializer(TestBase):
self.assertEqual(a[idx], expected)
binary_subscr_str_int()
- self.assert_specialized(binary_subscr_str_int, "BINARY_SUBSCR_STR_INT")
+ self.assert_specialized(binary_subscr_str_int, "BINARY_OP_SUBSCR_STR_INT")
self.assert_no_opcode(binary_subscr_str_int, "BINARY_SUBSCR")
def binary_subscr_getitems():
@@ -1751,7 +1751,7 @@ class TestSpecializer(TestBase):
self.assertEqual(items[i][i], i)
binary_subscr_getitems()
- self.assert_specialized(binary_subscr_getitems, "BINARY_SUBSCR_GETITEM")
+ self.assert_specialized(binary_subscr_getitems, "BINARY_OP_SUBSCR_GETITEM")
self.assert_no_opcode(binary_subscr_getitems, "BINARY_SUBSCR")
@cpython_only
diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py
index 9f2f9350d74..a9e55a1af51 100644
--- a/Lib/test/test_peepholer.py
+++ b/Lib/test/test_peepholer.py
@@ -1,5 +1,6 @@
import dis
from itertools import combinations, product
+import opcode
import sys
import textwrap
import unittest
@@ -280,23 +281,23 @@ class TestTranforms(BytecodeTestCase):
# valid code get optimized
code = compile('"foo"[0]', '', 'single')
self.assertInBytecode(code, 'LOAD_CONST', 'f')
- self.assertNotInBytecode(code, 'BINARY_SUBSCR')
+ self.assertNotInBytecode(code, 'BINARY_OP')
self.check_lnotab(code)
code = compile('"\u0061\uffff"[1]', '', 'single')
self.assertInBytecode(code, 'LOAD_CONST', '\uffff')
- self.assertNotInBytecode(code,'BINARY_SUBSCR')
+ self.assertNotInBytecode(code,'BINARY_OP')
self.check_lnotab(code)
# With PEP 393, non-BMP char get optimized
code = compile('"\U00012345"[0]', '', 'single')
self.assertInBytecode(code, 'LOAD_CONST', '\U00012345')
- self.assertNotInBytecode(code, 'BINARY_SUBSCR')
+ self.assertNotInBytecode(code, 'BINARY_OP')
self.check_lnotab(code)
# invalid code doesn't get optimized
# out of range
code = compile('"fuu"[10]', '', 'single')
- self.assertInBytecode(code, 'BINARY_SUBSCR')
+ self.assertInBytecode(code, 'BINARY_OP')
self.check_lnotab(code)
def test_folding_of_unaryops_on_constants(self):
@@ -517,13 +518,15 @@ class TestTranforms(BytecodeTestCase):
('("a" * 10)[10]', True),
('(1, (1, 2))[2:6][0][2-1]', True),
]
+ subscr_argval = 26
+ assert opcode._nb_ops[subscr_argval][0] == 'NB_SUBSCR'
for expr, has_error in tests:
with self.subTest(expr=expr, has_error=has_error):
code = compile(expr, '', 'single')
if not has_error:
- self.assertNotInBytecode(code, 'BINARY_SUBSCR')
+ self.assertNotInBytecode(code, 'BINARY_OP', argval=subscr_argval)
else:
- self.assertInBytecode(code, 'BINARY_SUBSCR')
+ self.assertInBytecode(code, 'BINARY_OP', argval=subscr_argval)
self.check_lnotab(code)
def test_in_literal_list(self):
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-02-07-17-06-39.gh-issue-100239.WvBTPL.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-02-07-17-06-39.gh-issue-100239.WvBTPL.rst
new file mode 100644
index 00000000000..428111cff1b
--- /dev/null
+++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-02-07-17-06-39.gh-issue-100239.WvBTPL.rst
@@ -0,0 +1 @@
+Replace the opcode BINARY_SUBSCR and its family by BINARY_OP with oparg NB_SUBSCR.
diff --git a/Modules/_opcode.c b/Modules/_opcode.c
index 7ccf7af6bf9..c295f7b3152 100644
--- a/Modules/_opcode.c
+++ b/Modules/_opcode.c
@@ -274,6 +274,7 @@ _opcode_get_nb_ops_impl(PyObject *module)
ADD_NB_OP(NB_INPLACE_SUBTRACT, "-=");
ADD_NB_OP(NB_INPLACE_TRUE_DIVIDE, "/=");
ADD_NB_OP(NB_INPLACE_XOR, "^=");
+ ADD_NB_OP(NB_SUBSCR, "[]");
#undef ADD_NB_OP
diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h
index 1442434f9eb..0fe8d3d3f7d 100644
--- a/Programs/test_frozenmain.h
+++ b/Programs/test_frozenmain.h
@@ -1,18 +1,19 @@
// Auto-generated by Programs/freeze_test_frozenmain.py
unsigned char M_test_frozenmain[] = {
227,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,
- 0,0,0,0,0,243,168,0,0,0,149,0,91,0,81,0,
- 72,0,113,0,91,0,81,0,72,1,113,1,90,2,34,0,
- 81,1,52,1,0,0,0,0,0,0,32,0,90,2,34,0,
- 81,2,90,0,79,6,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,52,2,0,0,0,0,0,0,
- 32,0,90,1,79,8,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,34,0,52,0,0,0,0,0,
- 0,0,81,3,2,0,0,0,113,5,81,4,18,0,69,20,
- 0,0,113,6,90,2,34,0,81,5,90,6,13,0,81,6,
- 90,5,90,6,2,0,0,0,13,0,50,4,52,1,0,0,
- 0,0,0,0,32,0,74,22,0,0,10,0,31,0,81,0,
- 36,0,41,7,78,122,18,70,114,111,122,101,110,32,72,101,
+ 0,0,0,0,0,243,184,0,0,0,149,0,90,0,80,0,
+ 71,0,112,0,90,0,80,0,71,1,112,1,89,2,33,0,
+ 80,1,51,1,0,0,0,0,0,0,31,0,89,2,33,0,
+ 80,2,89,0,78,6,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,51,2,0,0,0,0,0,0,
+ 31,0,89,1,78,8,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,33,0,51,0,0,0,0,0,
+ 0,0,80,3,44,26,0,0,0,0,0,0,0,0,0,0,
+ 112,5,80,4,16,0,68,24,0,0,112,6,89,2,33,0,
+ 80,5,89,6,12,0,80,6,89,5,89,6,44,26,0,0,
+ 0,0,0,0,0,0,0,0,12,0,49,4,51,1,0,0,
+ 0,0,0,0,31,0,73,26,0,0,9,0,30,0,80,0,
+ 35,0,41,7,78,122,18,70,114,111,122,101,110,32,72,101,
108,108,111,32,87,111,114,108,100,122,8,115,121,115,46,97,
114,103,118,218,6,99,111,110,102,105,103,41,5,218,12,112,
114,111,103,114,97,109,95,110,97,109,101,218,10,101,120,101,
@@ -30,8 +31,8 @@ unsigned char M_test_frozenmain[] = {
1,0,0,0,115,94,0,0,0,240,3,1,1,1,243,8,
0,1,11,219,0,24,225,0,5,208,6,26,212,0,27,217,
0,5,128,106,144,35,151,40,145,40,212,0,27,216,9,26,
- 215,9,38,210,9,38,211,9,40,168,24,209,9,50,128,6,
+ 215,9,38,210,9,38,211,9,40,168,24,213,9,50,128,6,
243,2,6,12,2,128,67,241,14,0,5,10,136,71,144,67,
- 144,53,152,2,152,54,160,35,153,59,152,45,208,10,40,214,
+ 144,53,152,2,152,54,160,35,157,59,152,45,208,10,40,214,
4,41,243,15,6,12,2,114,15,0,0,0,
};
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index bef120b6477..703d7ec61eb 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -537,6 +537,11 @@ dummy_func(
BINARY_OP_ADD_FLOAT,
BINARY_OP_SUBTRACT_FLOAT,
BINARY_OP_ADD_UNICODE,
+ BINARY_OP_SUBSCR_LIST_INT,
+ BINARY_OP_SUBSCR_TUPLE_INT,
+ BINARY_OP_SUBSCR_STR_INT,
+ BINARY_OP_SUBSCR_DICT,
+ BINARY_OP_SUBSCR_GETITEM,
// BINARY_OP_INPLACE_ADD_UNICODE, // See comments at that opcode.
BINARY_OP_EXTEND,
};
@@ -787,39 +792,6 @@ dummy_func(
macro(BINARY_OP_INPLACE_ADD_UNICODE) =
_GUARD_BOTH_UNICODE + unused/5 + _BINARY_OP_INPLACE_ADD_UNICODE;
- family(BINARY_SUBSCR, INLINE_CACHE_ENTRIES_BINARY_SUBSCR) = {
- BINARY_SUBSCR_DICT,
- BINARY_SUBSCR_GETITEM,
- BINARY_SUBSCR_LIST_INT,
- BINARY_SUBSCR_STR_INT,
- BINARY_SUBSCR_TUPLE_INT,
- };
-
- specializing op(_SPECIALIZE_BINARY_SUBSCR, (counter/1, container, sub -- container, sub)) {
- #if ENABLE_SPECIALIZATION_FT
- assert(frame->stackpointer == NULL);
- if (ADAPTIVE_COUNTER_TRIGGERS(counter)) {
- next_instr = this_instr;
- _Py_Specialize_BinarySubscr(container, sub, next_instr);
- DISPATCH_SAME_OPARG();
- }
- OPCODE_DEFERRED_INC(BINARY_SUBSCR);
- ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter);
- #endif /* ENABLE_SPECIALIZATION_FT */
- }
-
- op(_BINARY_SUBSCR, (container, sub -- res)) {
- PyObject *container_o = PyStackRef_AsPyObjectBorrow(container);
- PyObject *sub_o = PyStackRef_AsPyObjectBorrow(sub);
-
- PyObject *res_o = PyObject_GetItem(container_o, sub_o);
- DECREF_INPUTS();
- ERROR_IF(res_o == NULL, error);
- res = PyStackRef_FromPyObjectSteal(res_o);
- }
-
- macro(BINARY_SUBSCR) = _SPECIALIZE_BINARY_SUBSCR + _BINARY_SUBSCR;
-
specializing op(_SPECIALIZE_BINARY_SLICE, (container, start, stop -- container, start, stop)) {
// Placeholder until we implement BINARY_SLICE specialization
#if ENABLE_SPECIALIZATION
@@ -871,7 +843,7 @@ dummy_func(
macro(STORE_SLICE) = _SPECIALIZE_STORE_SLICE + _STORE_SLICE;
- inst(BINARY_SUBSCR_LIST_INT, (unused/1, list_st, sub_st -- res)) {
+ inst(BINARY_OP_SUBSCR_LIST_INT, (unused/5, list_st, sub_st -- res)) {
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *list = PyStackRef_AsPyObjectBorrow(list_st);
@@ -884,10 +856,10 @@ dummy_func(
#ifdef Py_GIL_DISABLED
PyObject *res_o = _PyList_GetItemRef((PyListObject*)list, index);
DEOPT_IF(res_o == NULL);
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
#else
DEOPT_IF(index >= PyList_GET_SIZE(list));
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
PyObject *res_o = PyList_GET_ITEM(list, index);
assert(res_o != NULL);
Py_INCREF(res_o);
@@ -898,7 +870,7 @@ dummy_func(
res = PyStackRef_FromPyObjectSteal(res_o);
}
- inst(BINARY_SUBSCR_STR_INT, (unused/1, str_st, sub_st -- res)) {
+ inst(BINARY_OP_SUBSCR_STR_INT, (unused/5, str_st, sub_st -- res)) {
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *str = PyStackRef_AsPyObjectBorrow(str_st);
@@ -910,7 +882,7 @@ dummy_func(
// Specialize for reading an ASCII character from any string:
Py_UCS4 c = PyUnicode_READ_CHAR(str, index);
DEOPT_IF(Py_ARRAY_LENGTH(_Py_SINGLETON(strings).ascii) <= c);
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
PyObject *res_o = (PyObject*)&_Py_SINGLETON(strings).ascii[c];
PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc);
DEAD(sub_st);
@@ -918,7 +890,7 @@ dummy_func(
res = PyStackRef_FromPyObjectSteal(res_o);
}
- inst(BINARY_SUBSCR_TUPLE_INT, (unused/1, tuple_st, sub_st -- res)) {
+ inst(BINARY_OP_SUBSCR_TUPLE_INT, (unused/5, tuple_st, sub_st -- res)) {
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *tuple = PyStackRef_AsPyObjectBorrow(tuple_st);
@@ -929,7 +901,7 @@ dummy_func(
DEOPT_IF(!_PyLong_IsNonNegativeCompact((PyLongObject *)sub));
Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
DEOPT_IF(index >= PyTuple_GET_SIZE(tuple));
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
PyObject *res_o = PyTuple_GET_ITEM(tuple, index);
assert(res_o != NULL);
Py_INCREF(res_o);
@@ -939,12 +911,12 @@ dummy_func(
res = PyStackRef_FromPyObjectSteal(res_o);
}
- inst(BINARY_SUBSCR_DICT, (unused/1, dict_st, sub_st -- res)) {
+ inst(BINARY_OP_SUBSCR_DICT, (unused/5, dict_st, sub_st -- res)) {
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *dict = PyStackRef_AsPyObjectBorrow(dict_st);
DEOPT_IF(!PyDict_CheckExact(dict));
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
PyObject *res_o;
int rc = PyDict_GetItemRef(dict, sub, &res_o);
if (rc == 0) {
@@ -955,7 +927,7 @@ dummy_func(
res = PyStackRef_FromPyObjectSteal(res_o);
}
- op(_BINARY_SUBSCR_CHECK_FUNC, (container, unused -- container, unused, getitem)) {
+ op(_BINARY_OP_SUBSCR_CHECK_FUNC, (container, unused -- container, unused, getitem)) {
PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(container));
DEOPT_IF(!PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE));
PyHeapTypeObject *ht = (PyHeapTypeObject *)tp;
@@ -968,10 +940,10 @@ dummy_func(
assert(code->co_argcount == 2);
DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize));
getitem = PyStackRef_FromPyObjectNew(getitem_o);
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
}
- op(_BINARY_SUBSCR_INIT_CALL, (container, sub, getitem -- new_frame: _PyInterpreterFrame* )) {
+ op(_BINARY_OP_SUBSCR_INIT_CALL, (container, sub, getitem -- new_frame: _PyInterpreterFrame* )) {
new_frame = _PyFrame_PushUnchecked(tstate, getitem, 2, frame);
new_frame->localsplus[0] = container;
new_frame->localsplus[1] = sub;
@@ -979,11 +951,11 @@ dummy_func(
frame->return_offset = INSTRUCTION_SIZE;
}
- macro(BINARY_SUBSCR_GETITEM) =
- unused/1 + // Skip over the counter
+ macro(BINARY_OP_SUBSCR_GETITEM) =
+ unused/5 + // Skip over the counter and cache
_CHECK_PEP_523 +
- _BINARY_SUBSCR_CHECK_FUNC +
- _BINARY_SUBSCR_INIT_CALL +
+ _BINARY_OP_SUBSCR_CHECK_FUNC +
+ _BINARY_OP_SUBSCR_INIT_CALL +
_PUSH_FRAME;
inst(LIST_APPEND, (list, unused[oparg-1], v -- list, unused[oparg-1])) {
@@ -4816,7 +4788,7 @@ dummy_func(
ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter);
#endif /* ENABLE_SPECIALIZATION_FT */
assert(NB_ADD <= oparg);
- assert(oparg <= NB_INPLACE_XOR);
+ assert(oparg <= NB_OPARG_LAST);
}
op(_BINARY_OP, (lhs, rhs -- res)) {
diff --git a/Python/ceval.c b/Python/ceval.c
index 6c8e39a09c2..1e4f1f3af20 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -362,6 +362,7 @@ const binaryfunc _PyEval_BinaryOps[] = {
[NB_INPLACE_SUBTRACT] = PyNumber_InPlaceSubtract,
[NB_INPLACE_TRUE_DIVIDE] = PyNumber_InPlaceTrueDivide,
[NB_INPLACE_XOR] = PyNumber_InPlaceXor,
+ [NB_SUBSCR] = PyObject_GetItem,
};
const conversion_func _PyEval_ConversionFuncs[4] = {
diff --git a/Python/codegen.c b/Python/codegen.c
index e9853d7302f..cd77b34c062 100644
--- a/Python/codegen.c
+++ b/Python/codegen.c
@@ -5076,7 +5076,7 @@ codegen_augassign(compiler *c, stmt_ty s)
VISIT(c, expr, e->v.Subscript.slice);
ADDOP_I(c, loc, COPY, 2);
ADDOP_I(c, loc, COPY, 2);
- ADDOP(c, loc, BINARY_SUBSCR);
+ ADDOP_I(c, loc, BINARY_OP, NB_SUBSCR);
}
break;
case Name_kind:
@@ -5242,7 +5242,6 @@ codegen_subscript(compiler *c, expr_ty e)
{
location loc = LOC(e);
expr_context_ty ctx = e->v.Subscript.ctx;
- int op = 0;
if (ctx == Load) {
RETURN_IF_ERROR(check_subscripter(c, e->v.Subscript.value));
@@ -5265,12 +5264,16 @@ codegen_subscript(compiler *c, expr_ty e)
else {
VISIT(c, expr, e->v.Subscript.slice);
switch (ctx) {
- case Load: op = BINARY_SUBSCR; break;
- case Store: op = STORE_SUBSCR; break;
- case Del: op = DELETE_SUBSCR; break;
+ case Load:
+ ADDOP_I(c, loc, BINARY_OP, NB_SUBSCR);
+ break;
+ case Store:
+ ADDOP(c, loc, STORE_SUBSCR);
+ break;
+ case Del:
+ ADDOP(c, loc, DELETE_SUBSCR);
+ break;
}
- assert(op);
- ADDOP(c, loc, op);
}
return SUCCESS;
}
@@ -5502,7 +5505,7 @@ pattern_helper_sequence_unpack(compiler *c, location loc,
return SUCCESS;
}
-// Like pattern_helper_sequence_unpack, but uses BINARY_SUBSCR instead of
+// Like pattern_helper_sequence_unpack, but uses BINARY_OP/NB_SUBSCR instead of
// UNPACK_SEQUENCE / UNPACK_EX. This is more efficient for patterns with a
// starred wildcard like [first, *_] / [first, *_, last] / [*_, last] / etc.
static int
@@ -5533,7 +5536,7 @@ pattern_helper_sequence_subscr(compiler *c, location loc,
ADDOP_LOAD_CONST_NEW(c, loc, PyLong_FromSsize_t(size - i));
ADDOP_BINARY(c, loc, Sub);
}
- ADDOP(c, loc, BINARY_SUBSCR);
+ ADDOP_I(c, loc, BINARY_OP, NB_SUBSCR);
RETURN_IF_ERROR(codegen_pattern_subpattern(c, pattern, pc));
}
// Pop the subject, we're done with it:
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index dc657281321..96b7386bd24 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -1029,31 +1029,6 @@
break;
}
- case _BINARY_SUBSCR: {
- _PyStackRef sub;
- _PyStackRef container;
- _PyStackRef res;
- sub = stack_pointer[-1];
- container = stack_pointer[-2];
- PyObject *container_o = PyStackRef_AsPyObjectBorrow(container);
- PyObject *sub_o = PyStackRef_AsPyObjectBorrow(sub);
- _PyFrame_SetStackPointer(frame, stack_pointer);
- PyObject *res_o = PyObject_GetItem(container_o, sub_o);
- stack_pointer = _PyFrame_GetStackPointer(frame);
- PyStackRef_CLOSE(container);
- PyStackRef_CLOSE(sub);
- if (res_o == NULL) {
- stack_pointer += -2;
- assert(WITHIN_STACK_BOUNDS());
- JUMP_TO_ERROR();
- }
- res = PyStackRef_FromPyObjectSteal(res_o);
- stack_pointer[-2] = res;
- stack_pointer += -1;
- assert(WITHIN_STACK_BOUNDS());
- break;
- }
-
case _BINARY_SLICE: {
_PyStackRef stop;
_PyStackRef start;
@@ -1136,7 +1111,7 @@
break;
}
- case _BINARY_SUBSCR_LIST_INT: {
+ case _BINARY_OP_SUBSCR_LIST_INT: {
_PyStackRef sub_st;
_PyStackRef list_st;
_PyStackRef res;
@@ -1166,13 +1141,13 @@
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
}
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
#else
if (index >= PyList_GET_SIZE(list)) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
}
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
PyObject *res_o = PyList_GET_ITEM(list, index);
assert(res_o != NULL);
Py_INCREF(res_o);
@@ -1190,7 +1165,7 @@
break;
}
- case _BINARY_SUBSCR_STR_INT: {
+ case _BINARY_OP_SUBSCR_STR_INT: {
_PyStackRef sub_st;
_PyStackRef str_st;
_PyStackRef res;
@@ -1221,7 +1196,7 @@
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
}
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
PyObject *res_o = (PyObject*)&_Py_SINGLETON(strings).ascii[c];
PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc);
stack_pointer += -2;
@@ -1236,7 +1211,7 @@
break;
}
- case _BINARY_SUBSCR_TUPLE_INT: {
+ case _BINARY_OP_SUBSCR_TUPLE_INT: {
_PyStackRef sub_st;
_PyStackRef tuple_st;
_PyStackRef res;
@@ -1262,7 +1237,7 @@
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
}
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
PyObject *res_o = PyTuple_GET_ITEM(tuple, index);
assert(res_o != NULL);
Py_INCREF(res_o);
@@ -1279,7 +1254,7 @@
break;
}
- case _BINARY_SUBSCR_DICT: {
+ case _BINARY_OP_SUBSCR_DICT: {
_PyStackRef sub_st;
_PyStackRef dict_st;
_PyStackRef res;
@@ -1291,7 +1266,7 @@
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
}
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
PyObject *res_o;
_PyFrame_SetStackPointer(frame, stack_pointer);
int rc = PyDict_GetItemRef(dict, sub, &res_o);
@@ -1316,7 +1291,7 @@
break;
}
- case _BINARY_SUBSCR_CHECK_FUNC: {
+ case _BINARY_OP_SUBSCR_CHECK_FUNC: {
_PyStackRef container;
_PyStackRef getitem;
container = stack_pointer[-2];
@@ -1344,14 +1319,14 @@
JUMP_TO_JUMP_TARGET();
}
getitem = PyStackRef_FromPyObjectNew(getitem_o);
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
stack_pointer[0] = getitem;
stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
break;
}
- case _BINARY_SUBSCR_INIT_CALL: {
+ case _BINARY_OP_SUBSCR_INIT_CALL: {
_PyStackRef getitem;
_PyStackRef sub;
_PyStackRef container;
@@ -1362,7 +1337,7 @@
new_frame = _PyFrame_PushUnchecked(tstate, getitem, 2, frame);
new_frame->localsplus[0] = container;
new_frame->localsplus[1] = sub;
- frame->return_offset = 2 ;
+ frame->return_offset = 6 ;
stack_pointer[-3].bits = (uintptr_t)new_frame;
stack_pointer += -2;
assert(WITHIN_STACK_BOUNDS());
diff --git a/Python/flowgraph.c b/Python/flowgraph.c
index 95ab53ce643..12eedc33e42 100644
--- a/Python/flowgraph.c
+++ b/Python/flowgraph.c
@@ -2,6 +2,7 @@
#include <stdbool.h>
#include "Python.h"
+#include "opcode.h"
#include "pycore_flowgraph.h"
#include "pycore_compile.h"
#include "pycore_intrinsics.h"
@@ -1492,10 +1493,14 @@ newop_from_folded(PyObject *newconst, PyObject *consts,
}
static int
-optimize_if_const_subscr(basicblock *bb, int n, PyObject *consts, PyObject *const_cache)
+optimize_if_const_op(basicblock *bb, int n, PyObject *consts, PyObject *const_cache)
{
cfg_instr *subscr = &bb->b_instr[n];
- assert(subscr->i_opcode == BINARY_SUBSCR);
+ assert(subscr->i_opcode == BINARY_OP);
+ if (subscr->i_oparg != NB_SUBSCR) {
+ /* TODO: support other binary ops */
+ return SUCCESS;
+ }
cfg_instr *arg, *idx;
if (!find_load_const_pair(bb, n-1, &arg, &idx)) {
return SUCCESS;
@@ -2033,8 +2038,8 @@ optimize_basic_block(PyObject *const_cache, basicblock *bb, PyObject *consts)
INSTR_SET_OP0(inst, NOP);
}
break;
- case BINARY_SUBSCR:
- RETURN_IF_ERROR(optimize_if_const_subscr(bb, i, consts, const_cache));
+ case BINARY_OP:
+ RETURN_IF_ERROR(optimize_if_const_op(bb, i, consts, const_cache));
break;
}
}
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index 914b06987ed..f02e13f5e3f 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -50,7 +50,7 @@
ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter);
#endif /* ENABLE_SPECIALIZATION_FT */
assert(NB_ADD <= oparg);
- assert(oparg <= NB_INPLACE_XOR);
+ assert(oparg <= NB_OPARG_LAST);
}
/* Skip 4 cache entries */
// _BINARY_OP
@@ -480,251 +480,31 @@
DISPATCH();
}
- TARGET(BINARY_OP_SUBTRACT_FLOAT) {
+ TARGET(BINARY_OP_SUBSCR_DICT) {
#if defined(Py_TAIL_CALL_INTERP)
- int opcode = BINARY_OP_SUBTRACT_FLOAT;
+ int opcode = BINARY_OP_SUBSCR_DICT;
(void)(opcode);
#endif
_Py_CODEUNIT* const this_instr = next_instr;
(void)this_instr;
frame->instr_ptr = next_instr;
next_instr += 6;
- INSTRUCTION_STATS(BINARY_OP_SUBTRACT_FLOAT);
+ INSTRUCTION_STATS(BINARY_OP_SUBSCR_DICT);
static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
- _PyStackRef left;
- _PyStackRef right;
- _PyStackRef res;
- // _GUARD_BOTH_FLOAT
- {
- right = stack_pointer[-1];
- left = stack_pointer[-2];
- PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
- PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
- if (!PyFloat_CheckExact(left_o)) {
- UPDATE_MISS_STATS(BINARY_OP);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
- JUMP_TO_PREDICTED(BINARY_OP);
- }
- if (!PyFloat_CheckExact(right_o)) {
- UPDATE_MISS_STATS(BINARY_OP);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
- JUMP_TO_PREDICTED(BINARY_OP);
- }
- }
- /* Skip 5 cache entries */
- // _BINARY_OP_SUBTRACT_FLOAT
- {
- PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
- PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
- assert(PyFloat_CheckExact(left_o));
- assert(PyFloat_CheckExact(right_o));
- STAT_INC(BINARY_OP, hit);
- double dres =
- ((PyFloatObject *)left_o)->ob_fval -
- ((PyFloatObject *)right_o)->ob_fval;
- PyObject *res_o = _PyFloat_FromDouble_ConsumeInputs(left, right, dres);
- if (res_o == NULL) {
- JUMP_TO_LABEL(pop_2_error);
- }
- res = PyStackRef_FromPyObjectSteal(res_o);
- }
- stack_pointer[-2] = res;
- stack_pointer += -1;
- assert(WITHIN_STACK_BOUNDS());
- DISPATCH();
- }
-
- TARGET(BINARY_OP_SUBTRACT_INT) {
- #if defined(Py_TAIL_CALL_INTERP)
- int opcode = BINARY_OP_SUBTRACT_INT;
- (void)(opcode);
- #endif
- _Py_CODEUNIT* const this_instr = next_instr;
- (void)this_instr;
- frame->instr_ptr = next_instr;
- next_instr += 6;
- INSTRUCTION_STATS(BINARY_OP_SUBTRACT_INT);
- static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
- _PyStackRef left;
- _PyStackRef right;
- _PyStackRef res;
- // _GUARD_BOTH_INT
- {
- right = stack_pointer[-1];
- left = stack_pointer[-2];
- PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
- PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
- if (!PyLong_CheckExact(left_o)) {
- UPDATE_MISS_STATS(BINARY_OP);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
- JUMP_TO_PREDICTED(BINARY_OP);
- }
- if (!PyLong_CheckExact(right_o)) {
- UPDATE_MISS_STATS(BINARY_OP);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
- JUMP_TO_PREDICTED(BINARY_OP);
- }
- }
- /* Skip 5 cache entries */
- // _BINARY_OP_SUBTRACT_INT
- {
- PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
- PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
- assert(PyLong_CheckExact(left_o));
- assert(PyLong_CheckExact(right_o));
- STAT_INC(BINARY_OP, hit);
- PyObject *res_o = _PyLong_Subtract((PyLongObject *)left_o, (PyLongObject *)right_o);
- PyStackRef_CLOSE_SPECIALIZED(right, _PyLong_ExactDealloc);
- PyStackRef_CLOSE_SPECIALIZED(left, _PyLong_ExactDealloc);
- if (res_o == NULL) {
- JUMP_TO_LABEL(pop_2_error);
- }
- res = PyStackRef_FromPyObjectSteal(res_o);
- }
- stack_pointer[-2] = res;
- stack_pointer += -1;
- assert(WITHIN_STACK_BOUNDS());
- DISPATCH();
- }
-
- TARGET(BINARY_SLICE) {
- #if defined(Py_TAIL_CALL_INTERP)
- int opcode = BINARY_SLICE;
- (void)(opcode);
- #endif
- frame->instr_ptr = next_instr;
- next_instr += 1;
- INSTRUCTION_STATS(BINARY_SLICE);
- _PyStackRef container;
- _PyStackRef start;
- _PyStackRef stop;
- _PyStackRef res;
- // _SPECIALIZE_BINARY_SLICE
- {
- // Placeholder until we implement BINARY_SLICE specialization
- #if ENABLE_SPECIALIZATION
- OPCODE_DEFERRED_INC(BINARY_SLICE);
- #endif /* ENABLE_SPECIALIZATION */
- }
- // _BINARY_SLICE
- {
- stop = stack_pointer[-1];
- start = stack_pointer[-2];
- container = stack_pointer[-3];
- _PyFrame_SetStackPointer(frame, stack_pointer);
- PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
- PyStackRef_AsPyObjectSteal(stop));
- stack_pointer = _PyFrame_GetStackPointer(frame);
- PyObject *res_o;
- // Can't use ERROR_IF() here, because we haven't
- // DECREF'ed container yet, and we still own slice.
- if (slice == NULL) {
- res_o = NULL;
- }
- else {
- stack_pointer += -2;
- assert(WITHIN_STACK_BOUNDS());
- _PyFrame_SetStackPointer(frame, stack_pointer);
- res_o = PyObject_GetItem(PyStackRef_AsPyObjectBorrow(container), slice);
- Py_DECREF(slice);
- stack_pointer = _PyFrame_GetStackPointer(frame);
- stack_pointer += 2;
- assert(WITHIN_STACK_BOUNDS());
- }
- stack_pointer += -3;
- assert(WITHIN_STACK_BOUNDS());
- _PyFrame_SetStackPointer(frame, stack_pointer);
- PyStackRef_CLOSE(container);
- stack_pointer = _PyFrame_GetStackPointer(frame);
- if (res_o == NULL) {
- JUMP_TO_LABEL(error);
- }
- res = PyStackRef_FromPyObjectSteal(res_o);
- }
- stack_pointer[0] = res;
- stack_pointer += 1;
- assert(WITHIN_STACK_BOUNDS());
- DISPATCH();
- }
-
- TARGET(BINARY_SUBSCR) {
- #if defined(Py_TAIL_CALL_INTERP)
- int opcode = BINARY_SUBSCR;
- (void)(opcode);
- #endif
- frame->instr_ptr = next_instr;
- next_instr += 2;
- INSTRUCTION_STATS(BINARY_SUBSCR);
- PREDICTED_BINARY_SUBSCR:;
- _Py_CODEUNIT* const this_instr = next_instr - 2;
- (void)this_instr;
- _PyStackRef container;
- _PyStackRef sub;
- _PyStackRef res;
- // _SPECIALIZE_BINARY_SUBSCR
- {
- sub = stack_pointer[-1];
- container = stack_pointer[-2];
- uint16_t counter = read_u16(&this_instr[1].cache);
- (void)counter;
- #if ENABLE_SPECIALIZATION_FT
- assert(frame->stackpointer == NULL);
- if (ADAPTIVE_COUNTER_TRIGGERS(counter)) {
- next_instr = this_instr;
- _PyFrame_SetStackPointer(frame, stack_pointer);
- _Py_Specialize_BinarySubscr(container, sub, next_instr);
- stack_pointer = _PyFrame_GetStackPointer(frame);
- DISPATCH_SAME_OPARG();
- }
- OPCODE_DEFERRED_INC(BINARY_SUBSCR);
- ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter);
- #endif /* ENABLE_SPECIALIZATION_FT */
- }
- // _BINARY_SUBSCR
- {
- PyObject *container_o = PyStackRef_AsPyObjectBorrow(container);
- PyObject *sub_o = PyStackRef_AsPyObjectBorrow(sub);
- _PyFrame_SetStackPointer(frame, stack_pointer);
- PyObject *res_o = PyObject_GetItem(container_o, sub_o);
- stack_pointer = _PyFrame_GetStackPointer(frame);
- PyStackRef_CLOSE(container);
- PyStackRef_CLOSE(sub);
- if (res_o == NULL) {
- JUMP_TO_LABEL(pop_2_error);
- }
- res = PyStackRef_FromPyObjectSteal(res_o);
- }
- stack_pointer[-2] = res;
- stack_pointer += -1;
- assert(WITHIN_STACK_BOUNDS());
- DISPATCH();
- }
-
- TARGET(BINARY_SUBSCR_DICT) {
- #if defined(Py_TAIL_CALL_INTERP)
- int opcode = BINARY_SUBSCR_DICT;
- (void)(opcode);
- #endif
- _Py_CODEUNIT* const this_instr = next_instr;
- (void)this_instr;
- frame->instr_ptr = next_instr;
- next_instr += 2;
- INSTRUCTION_STATS(BINARY_SUBSCR_DICT);
- static_assert(INLINE_CACHE_ENTRIES_BINARY_SUBSCR == 1, "incorrect cache size");
_PyStackRef dict_st;
_PyStackRef sub_st;
_PyStackRef res;
- /* Skip 1 cache entry */
+ /* Skip 5 cache entries */
sub_st = stack_pointer[-1];
dict_st = stack_pointer[-2];
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *dict = PyStackRef_AsPyObjectBorrow(dict_st);
if (!PyDict_CheckExact(dict)) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
PyObject *res_o;
_PyFrame_SetStackPointer(frame, stack_pointer);
int rc = PyDict_GetItemRef(dict, sub, &res_o);
@@ -747,70 +527,70 @@
DISPATCH();
}
- TARGET(BINARY_SUBSCR_GETITEM) {
+ TARGET(BINARY_OP_SUBSCR_GETITEM) {
#if defined(Py_TAIL_CALL_INTERP)
- int opcode = BINARY_SUBSCR_GETITEM;
+ int opcode = BINARY_OP_SUBSCR_GETITEM;
(void)(opcode);
#endif
_Py_CODEUNIT* const this_instr = next_instr;
(void)this_instr;
frame->instr_ptr = next_instr;
- next_instr += 2;
- INSTRUCTION_STATS(BINARY_SUBSCR_GETITEM);
- static_assert(INLINE_CACHE_ENTRIES_BINARY_SUBSCR == 1, "incorrect cache size");
+ next_instr += 6;
+ INSTRUCTION_STATS(BINARY_OP_SUBSCR_GETITEM);
+ static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
_PyStackRef container;
_PyStackRef getitem;
_PyStackRef sub;
_PyInterpreterFrame *new_frame;
- /* Skip 1 cache entry */
+ /* Skip 5 cache entries */
// _CHECK_PEP_523
{
if (tstate->interp->eval_frame) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
}
- // _BINARY_SUBSCR_CHECK_FUNC
+ // _BINARY_OP_SUBSCR_CHECK_FUNC
{
container = stack_pointer[-2];
PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(container));
if (!PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
PyHeapTypeObject *ht = (PyHeapTypeObject *)tp;
PyObject *getitem_o = FT_ATOMIC_LOAD_PTR_ACQUIRE(ht->_spec_cache.getitem);
if (getitem_o == NULL) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
assert(PyFunction_Check(getitem_o));
uint32_t cached_version = FT_ATOMIC_LOAD_UINT32_RELAXED(ht->_spec_cache.getitem_version);
if (((PyFunctionObject *)getitem_o)->func_version != cached_version) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
PyCodeObject *code = (PyCodeObject *)PyFunction_GET_CODE(getitem_o);
assert(code->co_argcount == 2);
if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize)) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
getitem = PyStackRef_FromPyObjectNew(getitem_o);
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
}
- // _BINARY_SUBSCR_INIT_CALL
+ // _BINARY_OP_SUBSCR_INIT_CALL
{
sub = stack_pointer[-1];
new_frame = _PyFrame_PushUnchecked(tstate, getitem, 2, frame);
new_frame->localsplus[0] = container;
new_frame->localsplus[1] = sub;
- frame->return_offset = 2 ;
+ frame->return_offset = 6 ;
}
// _PUSH_FRAME
{
@@ -832,40 +612,40 @@
DISPATCH();
}
- TARGET(BINARY_SUBSCR_LIST_INT) {
+ TARGET(BINARY_OP_SUBSCR_LIST_INT) {
#if defined(Py_TAIL_CALL_INTERP)
- int opcode = BINARY_SUBSCR_LIST_INT;
+ int opcode = BINARY_OP_SUBSCR_LIST_INT;
(void)(opcode);
#endif
_Py_CODEUNIT* const this_instr = next_instr;
(void)this_instr;
frame->instr_ptr = next_instr;
- next_instr += 2;
- INSTRUCTION_STATS(BINARY_SUBSCR_LIST_INT);
- static_assert(INLINE_CACHE_ENTRIES_BINARY_SUBSCR == 1, "incorrect cache size");
+ next_instr += 6;
+ INSTRUCTION_STATS(BINARY_OP_SUBSCR_LIST_INT);
+ static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
_PyStackRef list_st;
_PyStackRef sub_st;
_PyStackRef res;
- /* Skip 1 cache entry */
+ /* Skip 5 cache entries */
sub_st = stack_pointer[-1];
list_st = stack_pointer[-2];
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *list = PyStackRef_AsPyObjectBorrow(list_st);
if (!PyLong_CheckExact(sub)) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
if (!PyList_CheckExact(list)) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
// Deopt unless 0 <= sub < PyList_Size(list)
if (!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
#ifdef Py_GIL_DISABLED
@@ -873,18 +653,18 @@
PyObject *res_o = _PyList_GetItemRef((PyListObject*)list, index);
stack_pointer = _PyFrame_GetStackPointer(frame);
if (res_o == NULL) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
#else
if (index >= PyList_GET_SIZE(list)) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
PyObject *res_o = PyList_GET_ITEM(list, index);
assert(res_o != NULL);
Py_INCREF(res_o);
@@ -902,54 +682,54 @@
DISPATCH();
}
- TARGET(BINARY_SUBSCR_STR_INT) {
+ TARGET(BINARY_OP_SUBSCR_STR_INT) {
#if defined(Py_TAIL_CALL_INTERP)
- int opcode = BINARY_SUBSCR_STR_INT;
+ int opcode = BINARY_OP_SUBSCR_STR_INT;
(void)(opcode);
#endif
_Py_CODEUNIT* const this_instr = next_instr;
(void)this_instr;
frame->instr_ptr = next_instr;
- next_instr += 2;
- INSTRUCTION_STATS(BINARY_SUBSCR_STR_INT);
- static_assert(INLINE_CACHE_ENTRIES_BINARY_SUBSCR == 1, "incorrect cache size");
+ next_instr += 6;
+ INSTRUCTION_STATS(BINARY_OP_SUBSCR_STR_INT);
+ static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
_PyStackRef str_st;
_PyStackRef sub_st;
_PyStackRef res;
- /* Skip 1 cache entry */
+ /* Skip 5 cache entries */
sub_st = stack_pointer[-1];
str_st = stack_pointer[-2];
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *str = PyStackRef_AsPyObjectBorrow(str_st);
if (!PyLong_CheckExact(sub)) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
if (!PyUnicode_CheckExact(str)) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
if (!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
if (PyUnicode_GET_LENGTH(str) <= index) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
// Specialize for reading an ASCII character from any string:
Py_UCS4 c = PyUnicode_READ_CHAR(str, index);
if (Py_ARRAY_LENGTH(_Py_SINGLETON(strings).ascii) <= c) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
PyObject *res_o = (PyObject*)&_Py_SINGLETON(strings).ascii[c];
PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc);
stack_pointer += -2;
@@ -964,48 +744,48 @@
DISPATCH();
}
- TARGET(BINARY_SUBSCR_TUPLE_INT) {
+ TARGET(BINARY_OP_SUBSCR_TUPLE_INT) {
#if defined(Py_TAIL_CALL_INTERP)
- int opcode = BINARY_SUBSCR_TUPLE_INT;
+ int opcode = BINARY_OP_SUBSCR_TUPLE_INT;
(void)(opcode);
#endif
_Py_CODEUNIT* const this_instr = next_instr;
(void)this_instr;
frame->instr_ptr = next_instr;
- next_instr += 2;
- INSTRUCTION_STATS(BINARY_SUBSCR_TUPLE_INT);
- static_assert(INLINE_CACHE_ENTRIES_BINARY_SUBSCR == 1, "incorrect cache size");
+ next_instr += 6;
+ INSTRUCTION_STATS(BINARY_OP_SUBSCR_TUPLE_INT);
+ static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
_PyStackRef tuple_st;
_PyStackRef sub_st;
_PyStackRef res;
- /* Skip 1 cache entry */
+ /* Skip 5 cache entries */
sub_st = stack_pointer[-1];
tuple_st = stack_pointer[-2];
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *tuple = PyStackRef_AsPyObjectBorrow(tuple_st);
if (!PyLong_CheckExact(sub)) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
if (!PyTuple_CheckExact(tuple)) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
// Deopt unless 0 <= sub < PyTuple_Size(list)
if (!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
if (index >= PyTuple_GET_SIZE(tuple)) {
- UPDATE_MISS_STATS(BINARY_SUBSCR);
- assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
- JUMP_TO_PREDICTED(BINARY_SUBSCR);
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
}
- STAT_INC(BINARY_SUBSCR, hit);
+ STAT_INC(BINARY_OP, hit);
PyObject *res_o = PyTuple_GET_ITEM(tuple, index);
assert(res_o != NULL);
Py_INCREF(res_o);
@@ -1022,6 +802,173 @@
DISPATCH();
}
+ TARGET(BINARY_OP_SUBTRACT_FLOAT) {
+ #if defined(Py_TAIL_CALL_INTERP)
+ int opcode = BINARY_OP_SUBTRACT_FLOAT;
+ (void)(opcode);
+ #endif
+ _Py_CODEUNIT* const this_instr = next_instr;
+ (void)this_instr;
+ frame->instr_ptr = next_instr;
+ next_instr += 6;
+ INSTRUCTION_STATS(BINARY_OP_SUBTRACT_FLOAT);
+ static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
+ _PyStackRef left;
+ _PyStackRef right;
+ _PyStackRef res;
+ // _GUARD_BOTH_FLOAT
+ {
+ right = stack_pointer[-1];
+ left = stack_pointer[-2];
+ PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
+ PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
+ if (!PyFloat_CheckExact(left_o)) {
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
+ }
+ if (!PyFloat_CheckExact(right_o)) {
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
+ }
+ }
+ /* Skip 5 cache entries */
+ // _BINARY_OP_SUBTRACT_FLOAT
+ {
+ PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
+ PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
+ assert(PyFloat_CheckExact(left_o));
+ assert(PyFloat_CheckExact(right_o));
+ STAT_INC(BINARY_OP, hit);
+ double dres =
+ ((PyFloatObject *)left_o)->ob_fval -
+ ((PyFloatObject *)right_o)->ob_fval;
+ PyObject *res_o = _PyFloat_FromDouble_ConsumeInputs(left, right, dres);
+ if (res_o == NULL) {
+ JUMP_TO_LABEL(pop_2_error);
+ }
+ res = PyStackRef_FromPyObjectSteal(res_o);
+ }
+ stack_pointer[-2] = res;
+ stack_pointer += -1;
+ assert(WITHIN_STACK_BOUNDS());
+ DISPATCH();
+ }
+
+ TARGET(BINARY_OP_SUBTRACT_INT) {
+ #if defined(Py_TAIL_CALL_INTERP)
+ int opcode = BINARY_OP_SUBTRACT_INT;
+ (void)(opcode);
+ #endif
+ _Py_CODEUNIT* const this_instr = next_instr;
+ (void)this_instr;
+ frame->instr_ptr = next_instr;
+ next_instr += 6;
+ INSTRUCTION_STATS(BINARY_OP_SUBTRACT_INT);
+ static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
+ _PyStackRef left;
+ _PyStackRef right;
+ _PyStackRef res;
+ // _GUARD_BOTH_INT
+ {
+ right = stack_pointer[-1];
+ left = stack_pointer[-2];
+ PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
+ PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
+ if (!PyLong_CheckExact(left_o)) {
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
+ }
+ if (!PyLong_CheckExact(right_o)) {
+ UPDATE_MISS_STATS(BINARY_OP);
+ assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
+ JUMP_TO_PREDICTED(BINARY_OP);
+ }
+ }
+ /* Skip 5 cache entries */
+ // _BINARY_OP_SUBTRACT_INT
+ {
+ PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
+ PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
+ assert(PyLong_CheckExact(left_o));
+ assert(PyLong_CheckExact(right_o));
+ STAT_INC(BINARY_OP, hit);
+ PyObject *res_o = _PyLong_Subtract((PyLongObject *)left_o, (PyLongObject *)right_o);
+ PyStackRef_CLOSE_SPECIALIZED(right, _PyLong_ExactDealloc);
+ PyStackRef_CLOSE_SPECIALIZED(left, _PyLong_ExactDealloc);
+ if (res_o == NULL) {
+ JUMP_TO_LABEL(pop_2_error);
+ }
+ res = PyStackRef_FromPyObjectSteal(res_o);
+ }
+ stack_pointer[-2] = res;
+ stack_pointer += -1;
+ assert(WITHIN_STACK_BOUNDS());
+ DISPATCH();
+ }
+
+ TARGET(BINARY_SLICE) {
+ #if defined(Py_TAIL_CALL_INTERP)
+ int opcode = BINARY_SLICE;
+ (void)(opcode);
+ #endif
+ frame->instr_ptr = next_instr;
+ next_instr += 1;
+ INSTRUCTION_STATS(BINARY_SLICE);
+ _PyStackRef container;
+ _PyStackRef start;
+ _PyStackRef stop;
+ _PyStackRef res;
+ // _SPECIALIZE_BINARY_SLICE
+ {
+ // Placeholder until we implement BINARY_SLICE specialization
+ #if ENABLE_SPECIALIZATION
+ OPCODE_DEFERRED_INC(BINARY_SLICE);
+ #endif /* ENABLE_SPECIALIZATION */
+ }
+ // _BINARY_SLICE
+ {
+ stop = stack_pointer[-1];
+ start = stack_pointer[-2];
+ container = stack_pointer[-3];
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
+ PyStackRef_AsPyObjectSteal(stop));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ PyObject *res_o;
+ // Can't use ERROR_IF() here, because we haven't
+ // DECREF'ed container yet, and we still own slice.
+ if (slice == NULL) {
+ res_o = NULL;
+ }
+ else {
+ stack_pointer += -2;
+ assert(WITHIN_STACK_BOUNDS());
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ res_o = PyObject_GetItem(PyStackRef_AsPyObjectBorrow(container), slice);
+ Py_DECREF(slice);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ stack_pointer += 2;
+ assert(WITHIN_STACK_BOUNDS());
+ }
+ stack_pointer += -3;
+ assert(WITHIN_STACK_BOUNDS());
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ PyStackRef_CLOSE(container);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ if (res_o == NULL) {
+ JUMP_TO_LABEL(error);
+ }
+ res = PyStackRef_FromPyObjectSteal(res_o);
+ }
+ stack_pointer[0] = res;
+ stack_pointer += 1;
+ assert(WITHIN_STACK_BOUNDS());
+ DISPATCH();
+ }
+
TARGET(BUILD_LIST) {
#if defined(Py_TAIL_CALL_INTERP)
int opcode = BUILD_LIST;
diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h
index 27c4d537b80..039a6eee379 100644
--- a/Python/opcode_targets.h
+++ b/Python/opcode_targets.h
@@ -2,9 +2,8 @@
static void *opcode_targets[256] = {
&&TARGET_CACHE,
&&TARGET_BINARY_SLICE,
- &&TARGET_BINARY_SUBSCR,
- &&TARGET_BINARY_OP_INPLACE_ADD_UNICODE,
&&TARGET_CALL_FUNCTION_EX,
+ &&TARGET_BINARY_OP_INPLACE_ADD_UNICODE,
&&TARGET_CHECK_EG_MATCH,
&&TARGET_CHECK_EXC_MATCH,
&&TARGET_CLEANUP_THROW,
@@ -17,8 +16,8 @@ static void *opcode_targets[256] = {
&&TARGET_FORMAT_WITH_SPEC,
&&TARGET_GET_AITER,
&&TARGET_GET_ANEXT,
- &&TARGET_RESERVED,
&&TARGET_GET_ITER,
+ &&TARGET_RESERVED,
&&TARGET_GET_LEN,
&&TARGET_GET_YIELD_FROM_ITER,
&&TARGET_INTERPRETER_EXIT,
@@ -149,6 +148,7 @@ static void *opcode_targets[256] = {
&&_unknown_opcode,
&&_unknown_opcode,
&&_unknown_opcode,
+ &&_unknown_opcode,
&&TARGET_RESUME,
&&TARGET_BINARY_OP_ADD_FLOAT,
&&TARGET_BINARY_OP_ADD_INT,
@@ -156,13 +156,13 @@ static void *opcode_targets[256] = {
&&TARGET_BINARY_OP_EXTEND,
&&TARGET_BINARY_OP_MULTIPLY_FLOAT,
&&TARGET_BINARY_OP_MULTIPLY_INT,
+ &&TARGET_BINARY_OP_SUBSCR_DICT,
+ &&TARGET_BINARY_OP_SUBSCR_GETITEM,
+ &&TARGET_BINARY_OP_SUBSCR_LIST_INT,
+ &&TARGET_BINARY_OP_SUBSCR_STR_INT,
+ &&TARGET_BINARY_OP_SUBSCR_TUPLE_INT,
&&TARGET_BINARY_OP_SUBTRACT_FLOAT,
&&TARGET_BINARY_OP_SUBTRACT_INT,
- &&TARGET_BINARY_SUBSCR_DICT,
- &&TARGET_BINARY_SUBSCR_GETITEM,
- &&TARGET_BINARY_SUBSCR_LIST_INT,
- &&TARGET_BINARY_SUBSCR_STR_INT,
- &&TARGET_BINARY_SUBSCR_TUPLE_INT,
&&TARGET_CALL_ALLOC_AND_ENTER_INIT,
&&TARGET_CALL_BOUND_METHOD_EXACT_ARGS,
&&TARGET_CALL_BOUND_METHOD_GENERAL,
@@ -277,15 +277,14 @@ Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_EXTEND(TAIL_CALL_PARAM
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_INPLACE_ADD_UNICODE(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_MULTIPLY_FLOAT(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_MULTIPLY_INT(TAIL_CALL_PARAMS);
+Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_SUBSCR_DICT(TAIL_CALL_PARAMS);
+Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_SUBSCR_GETITEM(TAIL_CALL_PARAMS);
+Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_SUBSCR_LIST_INT(TAIL_CALL_PARAMS);
+Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_SUBSCR_STR_INT(TAIL_CALL_PARAMS);
+Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_SUBSCR_TUPLE_INT(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_SUBTRACT_FLOAT(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_SUBTRACT_INT(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_SLICE(TAIL_CALL_PARAMS);
-Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_SUBSCR(TAIL_CALL_PARAMS);
-Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_SUBSCR_DICT(TAIL_CALL_PARAMS);
-Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_SUBSCR_GETITEM(TAIL_CALL_PARAMS);
-Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_SUBSCR_LIST_INT(TAIL_CALL_PARAMS);
-Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_SUBSCR_STR_INT(TAIL_CALL_PARAMS);
-Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_SUBSCR_TUPLE_INT(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BUILD_LIST(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BUILD_MAP(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BUILD_SET(TAIL_CALL_PARAMS);
@@ -511,15 +510,14 @@ static py_tail_call_funcptr INSTRUCTION_TABLE[256] = {
[BINARY_OP_INPLACE_ADD_UNICODE] = _TAIL_CALL_BINARY_OP_INPLACE_ADD_UNICODE,
[BINARY_OP_MULTIPLY_FLOAT] = _TAIL_CALL_BINARY_OP_MULTIPLY_FLOAT,
[BINARY_OP_MULTIPLY_INT] = _TAIL_CALL_BINARY_OP_MULTIPLY_INT,
+ [BINARY_OP_SUBSCR_DICT] = _TAIL_CALL_BINARY_OP_SUBSCR_DICT,
+ [BINARY_OP_SUBSCR_GETITEM] = _TAIL_CALL_BINARY_OP_SUBSCR_GETITEM,
+ [BINARY_OP_SUBSCR_LIST_INT] = _TAIL_CALL_BINARY_OP_SUBSCR_LIST_INT,
+ [BINARY_OP_SUBSCR_STR_INT] = _TAIL_CALL_BINARY_OP_SUBSCR_STR_INT,
+ [BINARY_OP_SUBSCR_TUPLE_INT] = _TAIL_CALL_BINARY_OP_SUBSCR_TUPLE_INT,
[BINARY_OP_SUBTRACT_FLOAT] = _TAIL_CALL_BINARY_OP_SUBTRACT_FLOAT,
[BINARY_OP_SUBTRACT_INT] = _TAIL_CALL_BINARY_OP_SUBTRACT_INT,
[BINARY_SLICE] = _TAIL_CALL_BINARY_SLICE,
- [BINARY_SUBSCR] = _TAIL_CALL_BINARY_SUBSCR,
- [BINARY_SUBSCR_DICT] = _TAIL_CALL_BINARY_SUBSCR_DICT,
- [BINARY_SUBSCR_GETITEM] = _TAIL_CALL_BINARY_SUBSCR_GETITEM,
- [BINARY_SUBSCR_LIST_INT] = _TAIL_CALL_BINARY_SUBSCR_LIST_INT,
- [BINARY_SUBSCR_STR_INT] = _TAIL_CALL_BINARY_SUBSCR_STR_INT,
- [BINARY_SUBSCR_TUPLE_INT] = _TAIL_CALL_BINARY_SUBSCR_TUPLE_INT,
[BUILD_LIST] = _TAIL_CALL_BUILD_LIST,
[BUILD_MAP] = _TAIL_CALL_BUILD_MAP,
[BUILD_SET] = _TAIL_CALL_BUILD_SET,
@@ -725,6 +723,7 @@ static py_tail_call_funcptr INSTRUCTION_TABLE[256] = {
[UNPACK_SEQUENCE_TWO_TUPLE] = _TAIL_CALL_UNPACK_SEQUENCE_TWO_TUPLE,
[WITH_EXCEPT_START] = _TAIL_CALL_WITH_EXCEPT_START,
[YIELD_VALUE] = _TAIL_CALL_YIELD_VALUE,
+ [117] = _TAIL_CALL_UNKNOWN_OPCODE,
[118] = _TAIL_CALL_UNKNOWN_OPCODE,
[119] = _TAIL_CALL_UNKNOWN_OPCODE,
[120] = _TAIL_CALL_UNKNOWN_OPCODE,
diff --git a/Python/optimizer.c b/Python/optimizer.c
index 340770ae55e..bef5728349a 100644
--- a/Python/optimizer.c
+++ b/Python/optimizer.c
@@ -753,7 +753,7 @@ translate_bytecode_to_trace(
assert(i + 1 == nuops);
if (opcode == FOR_ITER_GEN ||
opcode == LOAD_ATTR_PROPERTY ||
- opcode == BINARY_SUBSCR_GETITEM ||
+ opcode == BINARY_OP_SUBSCR_GETITEM ||
opcode == SEND_GEN)
{
DPRINTF(2, "Bailing due to dynamic target\n");
diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c
index 09f1915bb3a..41eb59c931a 100644
--- a/Python/optimizer_bytecodes.c
+++ b/Python/optimizer_bytecodes.c
@@ -384,7 +384,7 @@ dummy_func(void) {
GETLOCAL(this_instr->operand0) = res;
}
- op(_BINARY_SUBSCR_INIT_CALL, (container, sub, getitem -- new_frame: _Py_UOpsAbstractFrame *)) {
+ op(_BINARY_OP_SUBSCR_INIT_CALL, (container, sub, getitem -- new_frame: _Py_UOpsAbstractFrame *)) {
new_frame = NULL;
ctx->done = true;
}
diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h
index 2383be8ea30..fd8486785ed 100644
--- a/Python/optimizer_cases.c.h
+++ b/Python/optimizer_cases.c.h
@@ -575,15 +575,6 @@
break;
}
- case _BINARY_SUBSCR: {
- JitOptSymbol *res;
- res = sym_new_not_null(ctx);
- stack_pointer[-2] = res;
- stack_pointer += -1;
- assert(WITHIN_STACK_BOUNDS());
- break;
- }
-
case _BINARY_SLICE: {
JitOptSymbol *res;
res = sym_new_not_null(ctx);
@@ -599,7 +590,7 @@
break;
}
- case _BINARY_SUBSCR_LIST_INT: {
+ case _BINARY_OP_SUBSCR_LIST_INT: {
JitOptSymbol *res;
res = sym_new_not_null(ctx);
stack_pointer[-2] = res;
@@ -608,7 +599,7 @@
break;
}
- case _BINARY_SUBSCR_STR_INT: {
+ case _BINARY_OP_SUBSCR_STR_INT: {
JitOptSymbol *res;
res = sym_new_not_null(ctx);
stack_pointer[-2] = res;
@@ -617,7 +608,7 @@
break;
}
- case _BINARY_SUBSCR_TUPLE_INT: {
+ case _BINARY_OP_SUBSCR_TUPLE_INT: {
JitOptSymbol *res;
res = sym_new_not_null(ctx);
stack_pointer[-2] = res;
@@ -626,7 +617,7 @@
break;
}
- case _BINARY_SUBSCR_DICT: {
+ case _BINARY_OP_SUBSCR_DICT: {
JitOptSymbol *res;
res = sym_new_not_null(ctx);
stack_pointer[-2] = res;
@@ -635,7 +626,7 @@
break;
}
- case _BINARY_SUBSCR_CHECK_FUNC: {
+ case _BINARY_OP_SUBSCR_CHECK_FUNC: {
JitOptSymbol *getitem;
getitem = sym_new_not_null(ctx);
stack_pointer[0] = getitem;
@@ -644,7 +635,7 @@
break;
}
- case _BINARY_SUBSCR_INIT_CALL: {
+ case _BINARY_OP_SUBSCR_INIT_CALL: {
_Py_UOpsAbstractFrame *new_frame;
new_frame = NULL;
ctx->done = true;
diff --git a/Python/specialize.c b/Python/specialize.c
index 4f84b2970ba..c741c4f93f3 100644
--- a/Python/specialize.c
+++ b/Python/specialize.c
@@ -113,7 +113,6 @@ _Py_GetSpecializationStats(void) {
err += add_stat_dict(stats, LOAD_SUPER_ATTR, "load_super_attr");
err += add_stat_dict(stats, LOAD_ATTR, "load_attr");
err += add_stat_dict(stats, LOAD_GLOBAL, "load_global");
- err += add_stat_dict(stats, BINARY_SUBSCR, "binary_subscr");
err += add_stat_dict(stats, STORE_SUBSCR, "store_subscr");
err += add_stat_dict(stats, STORE_ATTR, "store_attr");
err += add_stat_dict(stats, CALL, "call");
@@ -553,11 +552,8 @@ _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t size, int enable_counters
#define SPEC_FAIL_SUBSCR_ARRAY_INT 9
#define SPEC_FAIL_SUBSCR_ARRAY_SLICE 10
#define SPEC_FAIL_SUBSCR_LIST_SLICE 11
-#define SPEC_FAIL_SUBSCR_TUPLE_SLICE 12
-#define SPEC_FAIL_SUBSCR_STRING_SLICE 14
-#define SPEC_FAIL_SUBSCR_BUFFER_INT 15
-#define SPEC_FAIL_SUBSCR_BUFFER_SLICE 16
-#define SPEC_FAIL_SUBSCR_SEQUENCE_INT 17
+#define SPEC_FAIL_SUBSCR_BUFFER_INT 12
+#define SPEC_FAIL_SUBSCR_BUFFER_SLICE 13
/* Store subscr */
#define SPEC_FAIL_SUBSCR_BYTEARRAY_INT 18
@@ -593,6 +589,11 @@ _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t size, int enable_counters
#define SPEC_FAIL_BINARY_OP_OR_DIFFERENT_TYPES 30
#define SPEC_FAIL_BINARY_OP_XOR_INT 31
#define SPEC_FAIL_BINARY_OP_XOR_DIFFERENT_TYPES 32
+#define SPEC_FAIL_BINARY_OP_SUBSCR 33
+#define SPEC_FAIL_BINARY_OP_SUBSCR_LIST_SLICE 34
+#define SPEC_FAIL_BINARY_OP_SUBSCR_TUPLE_SLICE 35
+#define SPEC_FAIL_BINARY_OP_SUBSCR_STRING_SLICE 36
+#define SPEC_FAIL_BINARY_OP_SUBSCR_NOT_HEAP_TYPE 37
/* Calls */
@@ -1761,37 +1762,6 @@ _Py_Specialize_LoadGlobal(
Py_END_CRITICAL_SECTION2();
}
-#ifdef Py_STATS
-static int
-binary_subscr_fail_kind(PyTypeObject *container_type, PyObject *sub)
-{
- if (strcmp(container_type->tp_name, "array.array") == 0) {
- if (PyLong_CheckExact(sub)) {
- return SPEC_FAIL_SUBSCR_ARRAY_INT;
- }
- if (PySlice_Check(sub)) {
- return SPEC_FAIL_SUBSCR_ARRAY_SLICE;
- }
- return SPEC_FAIL_OTHER;
- }
- else if (container_type->tp_as_buffer) {
- if (PyLong_CheckExact(sub)) {
- return SPEC_FAIL_SUBSCR_BUFFER_INT;
- }
- if (PySlice_Check(sub)) {
- return SPEC_FAIL_SUBSCR_BUFFER_SLICE;
- }
- return SPEC_FAIL_OTHER;
- }
- else if (container_type->tp_as_sequence) {
- if (PyLong_CheckExact(sub) && container_type->tp_as_sequence->sq_item) {
- return SPEC_FAIL_SUBSCR_SEQUENCE_INT;
- }
- }
- return SPEC_FAIL_OTHER;
-}
-#endif // Py_STATS
-
static int
function_kind(PyCodeObject *code) {
int flags = code->co_flags;
@@ -1837,107 +1807,6 @@ function_get_version(PyObject *o, int opcode)
return version;
}
-void
-_Py_Specialize_BinarySubscr(
- _PyStackRef container_st, _PyStackRef sub_st, _Py_CODEUNIT *instr)
-{
- PyObject *container = PyStackRef_AsPyObjectBorrow(container_st);
- PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
-
- assert(ENABLE_SPECIALIZATION_FT);
- assert(_PyOpcode_Caches[BINARY_SUBSCR] ==
- INLINE_CACHE_ENTRIES_BINARY_SUBSCR);
- PyTypeObject *container_type = Py_TYPE(container);
- uint8_t specialized_op;
- if (container_type == &PyList_Type) {
- if (PyLong_CheckExact(sub)) {
- if (_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
- specialized_op = BINARY_SUBSCR_LIST_INT;
- goto success;
- }
- SPECIALIZATION_FAIL(BINARY_SUBSCR, SPEC_FAIL_OUT_OF_RANGE);
- goto fail;
- }
- SPECIALIZATION_FAIL(BINARY_SUBSCR,
- PySlice_Check(sub) ? SPEC_FAIL_SUBSCR_LIST_SLICE : SPEC_FAIL_OTHER);
- goto fail;
- }
- if (container_type == &PyTuple_Type) {
- if (PyLong_CheckExact(sub)) {
- if (_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
- specialized_op = BINARY_SUBSCR_TUPLE_INT;
- goto success;
- }
- SPECIALIZATION_FAIL(BINARY_SUBSCR, SPEC_FAIL_OUT_OF_RANGE);
- goto fail;
- }
- SPECIALIZATION_FAIL(BINARY_SUBSCR,
- PySlice_Check(sub) ? SPEC_FAIL_SUBSCR_TUPLE_SLICE : SPEC_FAIL_OTHER);
- goto fail;
- }
- if (container_type == &PyUnicode_Type) {
- if (PyLong_CheckExact(sub)) {
- if (_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
- specialized_op = BINARY_SUBSCR_STR_INT;
- goto success;
- }
- SPECIALIZATION_FAIL(BINARY_SUBSCR, SPEC_FAIL_OUT_OF_RANGE);
- goto fail;
- }
- SPECIALIZATION_FAIL(BINARY_SUBSCR,
- PySlice_Check(sub) ? SPEC_FAIL_SUBSCR_STRING_SLICE : SPEC_FAIL_OTHER);
- goto fail;
- }
- if (container_type == &PyDict_Type) {
- specialized_op = BINARY_SUBSCR_DICT;
- goto success;
- }
- unsigned int tp_version;
- PyObject *descriptor = _PyType_LookupRefAndVersion(container_type, &_Py_ID(__getitem__), &tp_version);
- if (descriptor && Py_TYPE(descriptor) == &PyFunction_Type) {
- if (!(container_type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
- SPECIALIZATION_FAIL(BINARY_SUBSCR, SPEC_FAIL_SUBSCR_NOT_HEAP_TYPE);
- Py_DECREF(descriptor);
- goto fail;
- }
- PyFunctionObject *func = (PyFunctionObject *)descriptor;
- PyCodeObject *fcode = (PyCodeObject *)func->func_code;
- int kind = function_kind(fcode);
- if (kind != SIMPLE_FUNCTION) {
- SPECIALIZATION_FAIL(BINARY_SUBSCR, kind);
- Py_DECREF(descriptor);
- goto fail;
- }
- if (fcode->co_argcount != 2) {
- SPECIALIZATION_FAIL(BINARY_SUBSCR, SPEC_FAIL_WRONG_NUMBER_ARGUMENTS);
- Py_DECREF(descriptor);
- goto fail;
- }
-
- PyHeapTypeObject *ht = (PyHeapTypeObject *)container_type;
- /* Don't specialize if PEP 523 is active */
- if (_PyInterpreterState_GET()->eval_frame) {
- SPECIALIZATION_FAIL(BINARY_SUBSCR, SPEC_FAIL_OTHER);
- Py_DECREF(descriptor);
- goto fail;
- }
- if (_PyType_CacheGetItemForSpecialization(ht, descriptor, (uint32_t)tp_version)) {
- specialized_op = BINARY_SUBSCR_GETITEM;
- Py_DECREF(descriptor);
- goto success;
- }
- }
- Py_XDECREF(descriptor);
- SPECIALIZATION_FAIL(BINARY_SUBSCR,
- binary_subscr_fail_kind(container_type, sub));
-fail:
- unspecialize(instr);
- return;
-success:
- specialize(instr, specialized_op);
-}
-
-
#ifdef Py_STATS
static int
store_subscr_fail_kind(PyObject *container, PyObject *sub)
@@ -2431,6 +2300,59 @@ binary_op_fail_kind(int oparg, PyObject *lhs, PyObject *rhs)
return SPEC_FAIL_BINARY_OP_XOR_INT;
}
return SPEC_FAIL_BINARY_OP_XOR;
+ case NB_SUBSCR:
+ if (PyList_CheckExact(lhs)) {
+ if (PyLong_CheckExact(rhs) && !_PyLong_IsNonNegativeCompact((PyLongObject *)rhs)) {
+ return SPEC_FAIL_OUT_OF_RANGE;
+ }
+ if (PySlice_Check(rhs)) {
+ return SPEC_FAIL_BINARY_OP_SUBSCR_LIST_SLICE;
+ }
+ }
+ if (PyTuple_CheckExact(lhs)) {
+ if (PyLong_CheckExact(rhs) && !_PyLong_IsNonNegativeCompact((PyLongObject *)rhs)) {
+ return SPEC_FAIL_OUT_OF_RANGE;
+ }
+ if (PySlice_Check(rhs)) {
+ return SPEC_FAIL_BINARY_OP_SUBSCR_TUPLE_SLICE;
+ }
+ }
+ if (PyUnicode_CheckExact(lhs)) {
+ if (PyLong_CheckExact(rhs) && !_PyLong_IsNonNegativeCompact((PyLongObject *)rhs)) {
+ return SPEC_FAIL_OUT_OF_RANGE;
+ }
+ if (PySlice_Check(rhs)) {
+ return SPEC_FAIL_BINARY_OP_SUBSCR_STRING_SLICE;
+ }
+ }
+ unsigned int tp_version;
+ PyTypeObject *container_type = Py_TYPE(lhs);
+ PyObject *descriptor = _PyType_LookupRefAndVersion(container_type, &_Py_ID(__getitem__), &tp_version);
+ if (descriptor && Py_TYPE(descriptor) == &PyFunction_Type) {
+ if (!(container_type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
+ Py_DECREF(descriptor);
+ return SPEC_FAIL_BINARY_OP_SUBSCR_NOT_HEAP_TYPE;
+ }
+ PyFunctionObject *func = (PyFunctionObject *)descriptor;
+ PyCodeObject *fcode = (PyCodeObject *)func->func_code;
+ int kind = function_kind(fcode);
+ if (kind != SIMPLE_FUNCTION) {
+ Py_DECREF(descriptor);
+ return kind;
+ }
+ if (fcode->co_argcount != 2) {
+ Py_DECREF(descriptor);
+ return SPEC_FAIL_WRONG_NUMBER_ARGUMENTS;
+ }
+
+ if (_PyInterpreterState_GET()->eval_frame) {
+ /* Don't specialize if PEP 523 is active */
+ Py_DECREF(descriptor);
+ return SPEC_FAIL_OTHER;
+ }
+ }
+ Py_XDECREF(descriptor);
+ return SPEC_FAIL_BINARY_OP_SUBSCR;
}
Py_UNREACHABLE();
}
@@ -2536,45 +2458,40 @@ LONG_FLOAT_ACTION(compactlong_float_multiply, *)
LONG_FLOAT_ACTION(compactlong_float_true_div, /)
#undef LONG_FLOAT_ACTION
-static _PyBinaryOpSpecializationDescr compactlongs_specs[NB_OPARG_LAST+1] = {
- [NB_OR] = {compactlongs_guard, compactlongs_or},
- [NB_AND] = {compactlongs_guard, compactlongs_and},
- [NB_XOR] = {compactlongs_guard, compactlongs_xor},
- [NB_INPLACE_OR] = {compactlongs_guard, compactlongs_or},
- [NB_INPLACE_AND] = {compactlongs_guard, compactlongs_and},
- [NB_INPLACE_XOR] = {compactlongs_guard, compactlongs_xor},
-};
-
-static _PyBinaryOpSpecializationDescr float_compactlong_specs[NB_OPARG_LAST+1] = {
- [NB_ADD] = {float_compactlong_guard, float_compactlong_add},
- [NB_SUBTRACT] = {float_compactlong_guard, float_compactlong_subtract},
- [NB_TRUE_DIVIDE] = {nonzero_float_compactlong_guard, float_compactlong_true_div},
- [NB_MULTIPLY] = {float_compactlong_guard, float_compactlong_multiply},
-};
-
-static _PyBinaryOpSpecializationDescr compactlong_float_specs[NB_OPARG_LAST+1] = {
- [NB_ADD] = {compactlong_float_guard, compactlong_float_add},
- [NB_SUBTRACT] = {compactlong_float_guard, compactlong_float_subtract},
- [NB_TRUE_DIVIDE] = {nonzero_compactlong_float_guard, compactlong_float_true_div},
- [NB_MULTIPLY] = {compactlong_float_guard, compactlong_float_multiply},
+static _PyBinaryOpSpecializationDescr binaryop_extend_descrs[] = {
+ /* long-long arithmetic */
+ {NB_OR, compactlongs_guard, compactlongs_or},
+ {NB_AND, compactlongs_guard, compactlongs_and},
+ {NB_XOR, compactlongs_guard, compactlongs_xor},
+ {NB_INPLACE_OR, compactlongs_guard, compactlongs_or},
+ {NB_INPLACE_AND, compactlongs_guard, compactlongs_and},
+ {NB_INPLACE_XOR, compactlongs_guard, compactlongs_xor},
+
+ /* float-long arithemetic */
+ {NB_ADD, float_compactlong_guard, float_compactlong_add},
+ {NB_SUBTRACT, float_compactlong_guard, float_compactlong_subtract},
+ {NB_TRUE_DIVIDE, nonzero_float_compactlong_guard, float_compactlong_true_div},
+ {NB_MULTIPLY, float_compactlong_guard, float_compactlong_multiply},
+
+ /* float-float arithmetic */
+ {NB_ADD, compactlong_float_guard, compactlong_float_add},
+ {NB_SUBTRACT, compactlong_float_guard, compactlong_float_subtract},
+ {NB_TRUE_DIVIDE, nonzero_compactlong_float_guard, compactlong_float_true_div},
+ {NB_MULTIPLY, compactlong_float_guard, compactlong_float_multiply},
};
static int
binary_op_extended_specialization(PyObject *lhs, PyObject *rhs, int oparg,
_PyBinaryOpSpecializationDescr **descr)
{
-#define LOOKUP_SPEC(TABLE, OPARG) \
- if ((TABLE)[(OPARG)].action) { \
- if ((TABLE)[(OPARG)].guard(lhs, rhs)) { \
- *descr = &((TABLE)[OPARG]); \
- return 1; \
- } \
+ size_t n = sizeof(binaryop_extend_descrs)/sizeof(_PyBinaryOpSpecializationDescr);
+ for (size_t i = 0; i < n; i++) {
+ _PyBinaryOpSpecializationDescr *d = &binaryop_extend_descrs[i];
+ if (d->oparg == oparg && d->guard(lhs, rhs)) {
+ *descr = d;
+ return 1;
+ }
}
-
- LOOKUP_SPEC(compactlong_float_specs, oparg);
- LOOKUP_SPEC(float_compactlong_specs, oparg);
- LOOKUP_SPEC(compactlongs_specs, oparg);
-#undef LOOKUP_SPEC
return 0;
}
@@ -2645,6 +2562,47 @@ _Py_Specialize_BinaryOp(_PyStackRef lhs_st, _PyStackRef rhs_st, _Py_CODEUNIT *in
return;
}
break;
+ case NB_SUBSCR:
+ if (PyLong_CheckExact(rhs) && _PyLong_IsNonNegativeCompact((PyLongObject *)rhs)) {
+ if (PyList_CheckExact(lhs)) {
+ specialize(instr, BINARY_OP_SUBSCR_LIST_INT);
+ return;
+ }
+ if (PyTuple_CheckExact(lhs)) {
+ specialize(instr, BINARY_OP_SUBSCR_TUPLE_INT);
+ return;
+ }
+ if (PyUnicode_CheckExact(lhs)) {
+ specialize(instr, BINARY_OP_SUBSCR_STR_INT);
+ return;
+ }
+ }
+ if (PyDict_CheckExact(lhs)) {
+ specialize(instr, BINARY_OP_SUBSCR_DICT);
+ return;
+ }
+ unsigned int tp_version;
+ PyTypeObject *container_type = Py_TYPE(lhs);
+ PyObject *descriptor = _PyType_LookupRefAndVersion(container_type, &_Py_ID(__getitem__), &tp_version);
+ if (descriptor && Py_TYPE(descriptor) == &PyFunction_Type &&
+ container_type->tp_flags & Py_TPFLAGS_HEAPTYPE)
+ {
+ PyFunctionObject *func = (PyFunctionObject *)descriptor;
+ PyCodeObject *fcode = (PyCodeObject *)func->func_code;
+ int kind = function_kind(fcode);
+ PyHeapTypeObject *ht = (PyHeapTypeObject *)container_type;
+ if (kind == SIMPLE_FUNCTION &&
+ fcode->co_argcount == 2 &&
+ !_PyInterpreterState_GET()->eval_frame && /* Don't specialize if PEP 523 is active */
+ _PyType_CacheGetItemForSpecialization(ht, descriptor, (uint32_t)tp_version))
+ {
+ specialize(instr, BINARY_OP_SUBSCR_GETITEM);
+ Py_DECREF(descriptor);
+ return;
+ }
+ }
+ Py_XDECREF(descriptor);
+ break;
}
_PyBinaryOpSpecializationDescr *descr;
diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv
index be3ded9f07e..df0262f9c84 100644
--- a/Tools/c-analyzer/cpython/ignored.tsv
+++ b/Tools/c-analyzer/cpython/ignored.tsv
@@ -381,9 +381,7 @@ Python/pylifecycle.c - INTERPRETER_TRAMPOLINE_CODEDEF -
Python/pystate.c - initial -
Python/specialize.c - adaptive_opcodes -
Python/specialize.c - cache_requirements -
-Python/specialize.c - compactlongs_specs -
-Python/specialize.c - float_compactlong_specs -
-Python/specialize.c - compactlong_float_specs -
+Python/specialize.c - binaryop_extend_descrs -
Python/stdlib_module_names.h - _Py_stdlib_module_names -
Python/sysmodule.c - perf_map_state -
Python/sysmodule.c - _PySys_ImplCacheTag -