gh-100239: replace BINARY_SUBSCR & family by BINARY_OP with oparg NB_SUBSCR (#129700)

This commit is contained in:
Irit Katriel 2025-02-07 22:39:54 +00:00 committed by GitHub
parent 2248a9c153
commit a1417b211f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
30 changed files with 1281 additions and 1447 deletions

View file

@ -703,15 +703,8 @@ not have to be) the original ``STACK[-2]``.
STACK.append(lhs op rhs) STACK.append(lhs op rhs)
.. versionadded:: 3.11 .. versionadded:: 3.11
.. versionchanged:: 3.14
With oparg :``NB_SUBSCR``, implements binary subscript (replaces opcode ``BINARY_SUBSCR``)
.. opcode:: BINARY_SUBSCR
Implements::
key = STACK.pop()
container = STACK.pop()
STACK.append(container[key])
.. opcode:: STORE_SUBSCR .. opcode:: STORE_SUBSCR

View file

@ -1199,6 +1199,12 @@ Others
:meth:`~object.__index__`. (Contributed by Mark Dickinson in :gh:`119743`.) :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 Porting to Python 3.14
====================== ======================

View file

@ -338,8 +338,6 @@ extern void _Py_Specialize_StoreAttr(_PyStackRef owner, _Py_CODEUNIT *instr,
PyObject *name); PyObject *name);
extern void _Py_Specialize_LoadGlobal(PyObject *globals, PyObject *builtins, extern void _Py_Specialize_LoadGlobal(PyObject *globals, PyObject *builtins,
_Py_CODEUNIT *instr, PyObject *name); _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, extern void _Py_Specialize_StoreSubscr(_PyStackRef container, _PyStackRef sub,
_Py_CODEUNIT *instr); _Py_CODEUNIT *instr);
extern void _Py_Specialize_Call(_PyStackRef callable, _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 PyObject *(*binaryopactionfunc)(PyObject *lhs, PyObject *rhs);
typedef struct { typedef struct {
int oparg;
binaryopguardfunc guard; binaryopguardfunc guard;
binaryopactionfunc action; binaryopactionfunc action;
} _PyBinaryOpSpecializationDescr; } _PyBinaryOpSpecializationDescr;

View file

@ -268,6 +268,7 @@ Known values:
Python 3.14a4 3613 (Add LOAD_CONST_MORTAL instruction) Python 3.14a4 3613 (Add LOAD_CONST_MORTAL instruction)
Python 3.14a5 3614 (Add BINARY_OP_EXTEND) Python 3.14a5 3614 (Add BINARY_OP_EXTEND)
Python 3.14a5 3615 (CALL_FUNCTION_EX always take a kwargs argument) 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 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 /* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes
(little-endian) and then appending b'\r\n'. */ (little-endian) and then appending b'\r\n'. */
#define PYC_MAGIC_NUMBER_TOKEN \ #define PYC_MAGIC_NUMBER_TOKEN \

View file

@ -51,24 +51,22 @@ int _PyOpcode_num_popped(int opcode, int oparg) {
return 2; return 2;
case BINARY_OP_MULTIPLY_INT: case BINARY_OP_MULTIPLY_INT:
return 2; return 2;
case BINARY_OP_SUBSCR_DICT:
return 2;
case BINARY_OP_SUBSCR_GETITEM:
return 2;
case BINARY_OP_SUBSCR_LIST_INT:
return 2;
case BINARY_OP_SUBSCR_STR_INT:
return 2;
case BINARY_OP_SUBSCR_TUPLE_INT:
return 2;
case BINARY_OP_SUBTRACT_FLOAT: case BINARY_OP_SUBTRACT_FLOAT:
return 2; return 2;
case BINARY_OP_SUBTRACT_INT: case BINARY_OP_SUBTRACT_INT:
return 2; return 2;
case BINARY_SLICE: case BINARY_SLICE:
return 3; return 3;
case BINARY_SUBSCR:
return 2;
case BINARY_SUBSCR_DICT:
return 2;
case BINARY_SUBSCR_GETITEM:
return 2;
case BINARY_SUBSCR_LIST_INT:
return 2;
case BINARY_SUBSCR_STR_INT:
return 2;
case BINARY_SUBSCR_TUPLE_INT:
return 2;
case BUILD_LIST: case BUILD_LIST:
return oparg; return oparg;
case BUILD_MAP: case BUILD_MAP:
@ -526,24 +524,22 @@ int _PyOpcode_num_pushed(int opcode, int oparg) {
return 1; return 1;
case BINARY_OP_MULTIPLY_INT: case BINARY_OP_MULTIPLY_INT:
return 1; return 1;
case BINARY_OP_SUBSCR_DICT:
return 1;
case BINARY_OP_SUBSCR_GETITEM:
return 0;
case BINARY_OP_SUBSCR_LIST_INT:
return 1;
case BINARY_OP_SUBSCR_STR_INT:
return 1;
case BINARY_OP_SUBSCR_TUPLE_INT:
return 1;
case BINARY_OP_SUBTRACT_FLOAT: case BINARY_OP_SUBTRACT_FLOAT:
return 1; return 1;
case BINARY_OP_SUBTRACT_INT: case BINARY_OP_SUBTRACT_INT:
return 1; return 1;
case BINARY_SLICE: case BINARY_SLICE:
return 1; return 1;
case BINARY_SUBSCR:
return 1;
case BINARY_SUBSCR_DICT:
return 1;
case BINARY_SUBSCR_GETITEM:
return 0;
case BINARY_SUBSCR_LIST_INT:
return 1;
case BINARY_SUBSCR_STR_INT:
return 1;
case BINARY_SUBSCR_TUPLE_INT:
return 1;
case BUILD_LIST: case BUILD_LIST:
return 1; return 1;
case BUILD_MAP: case BUILD_MAP:
@ -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) { int _PyOpcode_max_stack_effect(int opcode, int oparg, int *effect) {
switch(opcode) { switch(opcode) {
case BINARY_OP: { case BINARY_OP: {
*effect = 0; *effect = 1;
return 0; return 0;
} }
case BINARY_OP_ADD_FLOAT: { case BINARY_OP_ADD_FLOAT: {
@ -1017,6 +1013,26 @@ int _PyOpcode_max_stack_effect(int opcode, int oparg, int *effect) {
*effect = 0; *effect = 0;
return 0; return 0;
} }
case BINARY_OP_SUBSCR_DICT: {
*effect = -1;
return 0;
}
case BINARY_OP_SUBSCR_GETITEM: {
*effect = 1;
return 0;
}
case BINARY_OP_SUBSCR_LIST_INT: {
*effect = -1;
return 0;
}
case BINARY_OP_SUBSCR_STR_INT: {
*effect = -1;
return 0;
}
case BINARY_OP_SUBSCR_TUPLE_INT: {
*effect = -1;
return 0;
}
case BINARY_OP_SUBTRACT_FLOAT: { case BINARY_OP_SUBTRACT_FLOAT: {
*effect = 0; *effect = 0;
return 0; return 0;
@ -1029,30 +1045,6 @@ int _PyOpcode_max_stack_effect(int opcode, int oparg, int *effect) {
*effect = 0; *effect = 0;
return 0; return 0;
} }
case BINARY_SUBSCR: {
*effect = 1;
return 0;
}
case BINARY_SUBSCR_DICT: {
*effect = -1;
return 0;
}
case BINARY_SUBSCR_GETITEM: {
*effect = 1;
return 0;
}
case BINARY_SUBSCR_LIST_INT: {
*effect = -1;
return 0;
}
case BINARY_SUBSCR_STR_INT: {
*effect = -1;
return 0;
}
case BINARY_SUBSCR_TUPLE_INT: {
*effect = -1;
return 0;
}
case BUILD_LIST: { case BUILD_LIST: {
*effect = 1 - oparg; *effect = 1 - oparg;
return 0; return 0;
@ -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_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_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_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_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_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_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_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_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 }, [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_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_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_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_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_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_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_LIST] = { .nuops = 1, .uops = { { _BUILD_LIST, 0, 0 } } },
[BUILD_MAP] = { .nuops = 1, .uops = { { _BUILD_MAP, 0, 0 } } }, [BUILD_MAP] = { .nuops = 1, .uops = { { _BUILD_MAP, 0, 0 } } },
[BUILD_SET] = { .nuops = 1, .uops = { { _BUILD_SET, 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_INPLACE_ADD_UNICODE] = "BINARY_OP_INPLACE_ADD_UNICODE",
[BINARY_OP_MULTIPLY_FLOAT] = "BINARY_OP_MULTIPLY_FLOAT", [BINARY_OP_MULTIPLY_FLOAT] = "BINARY_OP_MULTIPLY_FLOAT",
[BINARY_OP_MULTIPLY_INT] = "BINARY_OP_MULTIPLY_INT", [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_FLOAT] = "BINARY_OP_SUBTRACT_FLOAT",
[BINARY_OP_SUBTRACT_INT] = "BINARY_OP_SUBTRACT_INT", [BINARY_OP_SUBTRACT_INT] = "BINARY_OP_SUBTRACT_INT",
[BINARY_SLICE] = "BINARY_SLICE", [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_LIST] = "BUILD_LIST",
[BUILD_MAP] = "BUILD_MAP", [BUILD_MAP] = "BUILD_MAP",
[BUILD_SET] = "BUILD_SET", [BUILD_SET] = "BUILD_SET",
@ -2678,7 +2667,6 @@ extern const uint8_t _PyOpcode_Caches[256];
#ifdef NEED_OPCODE_METADATA #ifdef NEED_OPCODE_METADATA
const uint8_t _PyOpcode_Caches[256] = { const uint8_t _PyOpcode_Caches[256] = {
[TO_BOOL] = 3, [TO_BOOL] = 3,
[BINARY_SUBSCR] = 1,
[STORE_SUBSCR] = 1, [STORE_SUBSCR] = 1,
[SEND] = 1, [SEND] = 1,
[UNPACK_SEQUENCE] = 1, [UNPACK_SEQUENCE] = 1,
@ -2711,15 +2699,14 @@ const uint8_t _PyOpcode_Deopt[256] = {
[BINARY_OP_INPLACE_ADD_UNICODE] = BINARY_OP, [BINARY_OP_INPLACE_ADD_UNICODE] = BINARY_OP,
[BINARY_OP_MULTIPLY_FLOAT] = BINARY_OP, [BINARY_OP_MULTIPLY_FLOAT] = BINARY_OP,
[BINARY_OP_MULTIPLY_INT] = 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_FLOAT] = BINARY_OP,
[BINARY_OP_SUBTRACT_INT] = BINARY_OP, [BINARY_OP_SUBTRACT_INT] = BINARY_OP,
[BINARY_SLICE] = BINARY_SLICE, [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_LIST] = BUILD_LIST,
[BUILD_MAP] = BUILD_MAP, [BUILD_MAP] = BUILD_MAP,
[BUILD_SET] = BUILD_SET, [BUILD_SET] = BUILD_SET,
@ -2930,6 +2917,7 @@ const uint8_t _PyOpcode_Deopt[256] = {
#endif // NEED_OPCODE_METADATA #endif // NEED_OPCODE_METADATA
#define EXTRA_CASES \ #define EXTRA_CASES \
case 117: \
case 118: \ case 118: \
case 119: \ case 119: \
case 120: \ case 120: \

View file

@ -19,138 +19,137 @@ extern "C" {
#define _BINARY_OP_INPLACE_ADD_UNICODE 307 #define _BINARY_OP_INPLACE_ADD_UNICODE 307
#define _BINARY_OP_MULTIPLY_FLOAT 308 #define _BINARY_OP_MULTIPLY_FLOAT 308
#define _BINARY_OP_MULTIPLY_INT 309 #define _BINARY_OP_MULTIPLY_INT 309
#define _BINARY_OP_SUBTRACT_FLOAT 310 #define _BINARY_OP_SUBSCR_CHECK_FUNC 310
#define _BINARY_OP_SUBTRACT_INT 311 #define _BINARY_OP_SUBSCR_DICT BINARY_OP_SUBSCR_DICT
#define _BINARY_SLICE 312 #define _BINARY_OP_SUBSCR_INIT_CALL 311
#define _BINARY_SUBSCR 313 #define _BINARY_OP_SUBSCR_LIST_INT BINARY_OP_SUBSCR_LIST_INT
#define _BINARY_SUBSCR_CHECK_FUNC 314 #define _BINARY_OP_SUBSCR_STR_INT BINARY_OP_SUBSCR_STR_INT
#define _BINARY_SUBSCR_DICT BINARY_SUBSCR_DICT #define _BINARY_OP_SUBSCR_TUPLE_INT BINARY_OP_SUBSCR_TUPLE_INT
#define _BINARY_SUBSCR_INIT_CALL 315 #define _BINARY_OP_SUBTRACT_FLOAT 312
#define _BINARY_SUBSCR_LIST_INT BINARY_SUBSCR_LIST_INT #define _BINARY_OP_SUBTRACT_INT 313
#define _BINARY_SUBSCR_STR_INT BINARY_SUBSCR_STR_INT #define _BINARY_SLICE 314
#define _BINARY_SUBSCR_TUPLE_INT BINARY_SUBSCR_TUPLE_INT
#define _BUILD_LIST BUILD_LIST #define _BUILD_LIST BUILD_LIST
#define _BUILD_MAP BUILD_MAP #define _BUILD_MAP BUILD_MAP
#define _BUILD_SET BUILD_SET #define _BUILD_SET BUILD_SET
#define _BUILD_SLICE BUILD_SLICE #define _BUILD_SLICE BUILD_SLICE
#define _BUILD_STRING BUILD_STRING #define _BUILD_STRING BUILD_STRING
#define _BUILD_TUPLE BUILD_TUPLE #define _BUILD_TUPLE BUILD_TUPLE
#define _CALL_BUILTIN_CLASS 316 #define _CALL_BUILTIN_CLASS 315
#define _CALL_BUILTIN_FAST 317 #define _CALL_BUILTIN_FAST 316
#define _CALL_BUILTIN_FAST_WITH_KEYWORDS 318 #define _CALL_BUILTIN_FAST_WITH_KEYWORDS 317
#define _CALL_BUILTIN_O 319 #define _CALL_BUILTIN_O 318
#define _CALL_INTRINSIC_1 CALL_INTRINSIC_1 #define _CALL_INTRINSIC_1 CALL_INTRINSIC_1
#define _CALL_INTRINSIC_2 CALL_INTRINSIC_2 #define _CALL_INTRINSIC_2 CALL_INTRINSIC_2
#define _CALL_ISINSTANCE CALL_ISINSTANCE #define _CALL_ISINSTANCE CALL_ISINSTANCE
#define _CALL_KW_NON_PY 320 #define _CALL_KW_NON_PY 319
#define _CALL_LEN CALL_LEN #define _CALL_LEN CALL_LEN
#define _CALL_LIST_APPEND CALL_LIST_APPEND #define _CALL_LIST_APPEND CALL_LIST_APPEND
#define _CALL_METHOD_DESCRIPTOR_FAST 321 #define _CALL_METHOD_DESCRIPTOR_FAST 320
#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 322 #define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 321
#define _CALL_METHOD_DESCRIPTOR_NOARGS 323 #define _CALL_METHOD_DESCRIPTOR_NOARGS 322
#define _CALL_METHOD_DESCRIPTOR_O 324 #define _CALL_METHOD_DESCRIPTOR_O 323
#define _CALL_NON_PY_GENERAL 325 #define _CALL_NON_PY_GENERAL 324
#define _CALL_STR_1 326 #define _CALL_STR_1 325
#define _CALL_TUPLE_1 327 #define _CALL_TUPLE_1 326
#define _CALL_TYPE_1 CALL_TYPE_1 #define _CALL_TYPE_1 CALL_TYPE_1
#define _CHECK_AND_ALLOCATE_OBJECT 328 #define _CHECK_AND_ALLOCATE_OBJECT 327
#define _CHECK_ATTR_CLASS 329 #define _CHECK_ATTR_CLASS 328
#define _CHECK_ATTR_METHOD_LAZY_DICT 330 #define _CHECK_ATTR_METHOD_LAZY_DICT 329
#define _CHECK_ATTR_MODULE_PUSH_KEYS 331 #define _CHECK_ATTR_MODULE_PUSH_KEYS 330
#define _CHECK_ATTR_WITH_HINT 332 #define _CHECK_ATTR_WITH_HINT 331
#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 333 #define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 332
#define _CHECK_EG_MATCH CHECK_EG_MATCH #define _CHECK_EG_MATCH CHECK_EG_MATCH
#define _CHECK_EXC_MATCH CHECK_EXC_MATCH #define _CHECK_EXC_MATCH CHECK_EXC_MATCH
#define _CHECK_FUNCTION 334 #define _CHECK_FUNCTION 333
#define _CHECK_FUNCTION_EXACT_ARGS 335 #define _CHECK_FUNCTION_EXACT_ARGS 334
#define _CHECK_FUNCTION_VERSION 336 #define _CHECK_FUNCTION_VERSION 335
#define _CHECK_FUNCTION_VERSION_INLINE 337 #define _CHECK_FUNCTION_VERSION_INLINE 336
#define _CHECK_FUNCTION_VERSION_KW 338 #define _CHECK_FUNCTION_VERSION_KW 337
#define _CHECK_IS_NOT_PY_CALLABLE 339 #define _CHECK_IS_NOT_PY_CALLABLE 338
#define _CHECK_IS_NOT_PY_CALLABLE_KW 340 #define _CHECK_IS_NOT_PY_CALLABLE_KW 339
#define _CHECK_MANAGED_OBJECT_HAS_VALUES 341 #define _CHECK_MANAGED_OBJECT_HAS_VALUES 340
#define _CHECK_METHOD_VERSION 342 #define _CHECK_METHOD_VERSION 341
#define _CHECK_METHOD_VERSION_KW 343 #define _CHECK_METHOD_VERSION_KW 342
#define _CHECK_PEP_523 344 #define _CHECK_PEP_523 343
#define _CHECK_PERIODIC 345 #define _CHECK_PERIODIC 344
#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM 346 #define _CHECK_PERIODIC_IF_NOT_YIELD_FROM 345
#define _CHECK_STACK_SPACE 347 #define _CHECK_STACK_SPACE 346
#define _CHECK_STACK_SPACE_OPERAND 348 #define _CHECK_STACK_SPACE_OPERAND 347
#define _CHECK_VALIDITY 349 #define _CHECK_VALIDITY 348
#define _CHECK_VALIDITY_AND_SET_IP 350 #define _CHECK_VALIDITY_AND_SET_IP 349
#define _COMPARE_OP 351 #define _COMPARE_OP 350
#define _COMPARE_OP_FLOAT 352 #define _COMPARE_OP_FLOAT 351
#define _COMPARE_OP_INT 353 #define _COMPARE_OP_INT 352
#define _COMPARE_OP_STR 354 #define _COMPARE_OP_STR 353
#define _CONTAINS_OP 355 #define _CONTAINS_OP 354
#define _CONTAINS_OP_DICT CONTAINS_OP_DICT #define _CONTAINS_OP_DICT CONTAINS_OP_DICT
#define _CONTAINS_OP_SET CONTAINS_OP_SET #define _CONTAINS_OP_SET CONTAINS_OP_SET
#define _CONVERT_VALUE CONVERT_VALUE #define _CONVERT_VALUE CONVERT_VALUE
#define _COPY COPY #define _COPY COPY
#define _COPY_FREE_VARS COPY_FREE_VARS #define _COPY_FREE_VARS COPY_FREE_VARS
#define _CREATE_INIT_FRAME 356 #define _CREATE_INIT_FRAME 355
#define _DELETE_ATTR DELETE_ATTR #define _DELETE_ATTR DELETE_ATTR
#define _DELETE_DEREF DELETE_DEREF #define _DELETE_DEREF DELETE_DEREF
#define _DELETE_FAST DELETE_FAST #define _DELETE_FAST DELETE_FAST
#define _DELETE_GLOBAL DELETE_GLOBAL #define _DELETE_GLOBAL DELETE_GLOBAL
#define _DELETE_NAME DELETE_NAME #define _DELETE_NAME DELETE_NAME
#define _DELETE_SUBSCR DELETE_SUBSCR #define _DELETE_SUBSCR DELETE_SUBSCR
#define _DEOPT 357 #define _DEOPT 356
#define _DICT_MERGE DICT_MERGE #define _DICT_MERGE DICT_MERGE
#define _DICT_UPDATE DICT_UPDATE #define _DICT_UPDATE DICT_UPDATE
#define _DO_CALL 358 #define _DO_CALL 357
#define _DO_CALL_FUNCTION_EX 359 #define _DO_CALL_FUNCTION_EX 358
#define _DO_CALL_KW 360 #define _DO_CALL_KW 359
#define _END_FOR END_FOR #define _END_FOR END_FOR
#define _END_SEND END_SEND #define _END_SEND END_SEND
#define _ERROR_POP_N 361 #define _ERROR_POP_N 360
#define _EXIT_INIT_CHECK EXIT_INIT_CHECK #define _EXIT_INIT_CHECK EXIT_INIT_CHECK
#define _EXPAND_METHOD 362 #define _EXPAND_METHOD 361
#define _EXPAND_METHOD_KW 363 #define _EXPAND_METHOD_KW 362
#define _FATAL_ERROR 364 #define _FATAL_ERROR 363
#define _FORMAT_SIMPLE FORMAT_SIMPLE #define _FORMAT_SIMPLE FORMAT_SIMPLE
#define _FORMAT_WITH_SPEC FORMAT_WITH_SPEC #define _FORMAT_WITH_SPEC FORMAT_WITH_SPEC
#define _FOR_ITER 365 #define _FOR_ITER 364
#define _FOR_ITER_GEN_FRAME 366 #define _FOR_ITER_GEN_FRAME 365
#define _FOR_ITER_TIER_TWO 367 #define _FOR_ITER_TIER_TWO 366
#define _GET_AITER GET_AITER #define _GET_AITER GET_AITER
#define _GET_ANEXT GET_ANEXT #define _GET_ANEXT GET_ANEXT
#define _GET_AWAITABLE GET_AWAITABLE #define _GET_AWAITABLE GET_AWAITABLE
#define _GET_ITER GET_ITER #define _GET_ITER GET_ITER
#define _GET_LEN GET_LEN #define _GET_LEN GET_LEN
#define _GET_YIELD_FROM_ITER GET_YIELD_FROM_ITER #define _GET_YIELD_FROM_ITER GET_YIELD_FROM_ITER
#define _GUARD_BINARY_OP_EXTEND 368 #define _GUARD_BINARY_OP_EXTEND 367
#define _GUARD_BOTH_FLOAT 369 #define _GUARD_BOTH_FLOAT 368
#define _GUARD_BOTH_INT 370 #define _GUARD_BOTH_INT 369
#define _GUARD_BOTH_UNICODE 371 #define _GUARD_BOTH_UNICODE 370
#define _GUARD_BUILTINS_VERSION_PUSH_KEYS 372 #define _GUARD_BUILTINS_VERSION_PUSH_KEYS 371
#define _GUARD_DORV_NO_DICT 373 #define _GUARD_DORV_NO_DICT 372
#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 374 #define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 373
#define _GUARD_GLOBALS_VERSION 375 #define _GUARD_GLOBALS_VERSION 374
#define _GUARD_GLOBALS_VERSION_PUSH_KEYS 376 #define _GUARD_GLOBALS_VERSION_PUSH_KEYS 375
#define _GUARD_IS_FALSE_POP 377 #define _GUARD_IS_FALSE_POP 376
#define _GUARD_IS_NONE_POP 378 #define _GUARD_IS_NONE_POP 377
#define _GUARD_IS_NOT_NONE_POP 379 #define _GUARD_IS_NOT_NONE_POP 378
#define _GUARD_IS_TRUE_POP 380 #define _GUARD_IS_TRUE_POP 379
#define _GUARD_KEYS_VERSION 381 #define _GUARD_KEYS_VERSION 380
#define _GUARD_NOS_FLOAT 382 #define _GUARD_NOS_FLOAT 381
#define _GUARD_NOS_INT 383 #define _GUARD_NOS_INT 382
#define _GUARD_NOT_EXHAUSTED_LIST 384 #define _GUARD_NOT_EXHAUSTED_LIST 383
#define _GUARD_NOT_EXHAUSTED_RANGE 385 #define _GUARD_NOT_EXHAUSTED_RANGE 384
#define _GUARD_NOT_EXHAUSTED_TUPLE 386 #define _GUARD_NOT_EXHAUSTED_TUPLE 385
#define _GUARD_TOS_FLOAT 387 #define _GUARD_TOS_FLOAT 386
#define _GUARD_TOS_INT 388 #define _GUARD_TOS_INT 387
#define _GUARD_TYPE_VERSION 389 #define _GUARD_TYPE_VERSION 388
#define _GUARD_TYPE_VERSION_AND_LOCK 390 #define _GUARD_TYPE_VERSION_AND_LOCK 389
#define _IMPORT_FROM IMPORT_FROM #define _IMPORT_FROM IMPORT_FROM
#define _IMPORT_NAME IMPORT_NAME #define _IMPORT_NAME IMPORT_NAME
#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 391 #define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 390
#define _INIT_CALL_PY_EXACT_ARGS 392 #define _INIT_CALL_PY_EXACT_ARGS 391
#define _INIT_CALL_PY_EXACT_ARGS_0 393 #define _INIT_CALL_PY_EXACT_ARGS_0 392
#define _INIT_CALL_PY_EXACT_ARGS_1 394 #define _INIT_CALL_PY_EXACT_ARGS_1 393
#define _INIT_CALL_PY_EXACT_ARGS_2 395 #define _INIT_CALL_PY_EXACT_ARGS_2 394
#define _INIT_CALL_PY_EXACT_ARGS_3 396 #define _INIT_CALL_PY_EXACT_ARGS_3 395
#define _INIT_CALL_PY_EXACT_ARGS_4 397 #define _INIT_CALL_PY_EXACT_ARGS_4 396
#define _INSTRUMENTED_FOR_ITER INSTRUMENTED_FOR_ITER #define _INSTRUMENTED_FOR_ITER INSTRUMENTED_FOR_ITER
#define _INSTRUMENTED_INSTRUCTION INSTRUMENTED_INSTRUCTION #define _INSTRUMENTED_INSTRUCTION INSTRUMENTED_INSTRUCTION
#define _INSTRUMENTED_JUMP_FORWARD INSTRUMENTED_JUMP_FORWARD #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_NONE INSTRUMENTED_POP_JUMP_IF_NONE
#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE INSTRUMENTED_POP_JUMP_IF_NOT_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 _INSTRUMENTED_POP_JUMP_IF_TRUE INSTRUMENTED_POP_JUMP_IF_TRUE
#define _IS_NONE 398 #define _IS_NONE 397
#define _IS_OP IS_OP #define _IS_OP IS_OP
#define _ITER_CHECK_LIST 399 #define _ITER_CHECK_LIST 398
#define _ITER_CHECK_RANGE 400 #define _ITER_CHECK_RANGE 399
#define _ITER_CHECK_TUPLE 401 #define _ITER_CHECK_TUPLE 400
#define _ITER_JUMP_LIST 402 #define _ITER_JUMP_LIST 401
#define _ITER_JUMP_RANGE 403 #define _ITER_JUMP_RANGE 402
#define _ITER_JUMP_TUPLE 404 #define _ITER_JUMP_TUPLE 403
#define _ITER_NEXT_LIST 405 #define _ITER_NEXT_LIST 404
#define _ITER_NEXT_RANGE 406 #define _ITER_NEXT_RANGE 405
#define _ITER_NEXT_TUPLE 407 #define _ITER_NEXT_TUPLE 406
#define _JUMP_TO_TOP 408 #define _JUMP_TO_TOP 407
#define _LIST_APPEND LIST_APPEND #define _LIST_APPEND LIST_APPEND
#define _LIST_EXTEND LIST_EXTEND #define _LIST_EXTEND LIST_EXTEND
#define _LOAD_ATTR 409 #define _LOAD_ATTR 408
#define _LOAD_ATTR_CLASS 410 #define _LOAD_ATTR_CLASS 409
#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN #define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN
#define _LOAD_ATTR_INSTANCE_VALUE 411 #define _LOAD_ATTR_INSTANCE_VALUE 410
#define _LOAD_ATTR_METHOD_LAZY_DICT 412 #define _LOAD_ATTR_METHOD_LAZY_DICT 411
#define _LOAD_ATTR_METHOD_NO_DICT 413 #define _LOAD_ATTR_METHOD_NO_DICT 412
#define _LOAD_ATTR_METHOD_WITH_VALUES 414 #define _LOAD_ATTR_METHOD_WITH_VALUES 413
#define _LOAD_ATTR_MODULE 415 #define _LOAD_ATTR_MODULE 414
#define _LOAD_ATTR_MODULE_FROM_KEYS 416 #define _LOAD_ATTR_MODULE_FROM_KEYS 415
#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 417 #define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 416
#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 418 #define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 417
#define _LOAD_ATTR_PROPERTY_FRAME 419 #define _LOAD_ATTR_PROPERTY_FRAME 418
#define _LOAD_ATTR_SLOT 420 #define _LOAD_ATTR_SLOT 419
#define _LOAD_ATTR_WITH_HINT 421 #define _LOAD_ATTR_WITH_HINT 420
#define _LOAD_BUILD_CLASS LOAD_BUILD_CLASS #define _LOAD_BUILD_CLASS LOAD_BUILD_CLASS
#define _LOAD_BYTECODE 422 #define _LOAD_BYTECODE 421
#define _LOAD_COMMON_CONSTANT LOAD_COMMON_CONSTANT #define _LOAD_COMMON_CONSTANT LOAD_COMMON_CONSTANT
#define _LOAD_CONST LOAD_CONST #define _LOAD_CONST LOAD_CONST
#define _LOAD_CONST_IMMORTAL LOAD_CONST_IMMORTAL #define _LOAD_CONST_IMMORTAL LOAD_CONST_IMMORTAL
#define _LOAD_CONST_INLINE 423 #define _LOAD_CONST_INLINE 422
#define _LOAD_CONST_INLINE_BORROW 424 #define _LOAD_CONST_INLINE_BORROW 423
#define _LOAD_CONST_MORTAL LOAD_CONST_MORTAL #define _LOAD_CONST_MORTAL LOAD_CONST_MORTAL
#define _LOAD_DEREF LOAD_DEREF #define _LOAD_DEREF LOAD_DEREF
#define _LOAD_FAST 425 #define _LOAD_FAST 424
#define _LOAD_FAST_0 426 #define _LOAD_FAST_0 425
#define _LOAD_FAST_1 427 #define _LOAD_FAST_1 426
#define _LOAD_FAST_2 428 #define _LOAD_FAST_2 427
#define _LOAD_FAST_3 429 #define _LOAD_FAST_3 428
#define _LOAD_FAST_4 430 #define _LOAD_FAST_4 429
#define _LOAD_FAST_5 431 #define _LOAD_FAST_5 430
#define _LOAD_FAST_6 432 #define _LOAD_FAST_6 431
#define _LOAD_FAST_7 433 #define _LOAD_FAST_7 432
#define _LOAD_FAST_AND_CLEAR LOAD_FAST_AND_CLEAR #define _LOAD_FAST_AND_CLEAR LOAD_FAST_AND_CLEAR
#define _LOAD_FAST_CHECK LOAD_FAST_CHECK #define _LOAD_FAST_CHECK LOAD_FAST_CHECK
#define _LOAD_FAST_LOAD_FAST LOAD_FAST_LOAD_FAST #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_DEREF LOAD_FROM_DICT_OR_DEREF
#define _LOAD_FROM_DICT_OR_GLOBALS LOAD_FROM_DICT_OR_GLOBALS #define _LOAD_FROM_DICT_OR_GLOBALS LOAD_FROM_DICT_OR_GLOBALS
#define _LOAD_GLOBAL 434 #define _LOAD_GLOBAL 433
#define _LOAD_GLOBAL_BUILTINS 435 #define _LOAD_GLOBAL_BUILTINS 434
#define _LOAD_GLOBAL_BUILTINS_FROM_KEYS 436 #define _LOAD_GLOBAL_BUILTINS_FROM_KEYS 435
#define _LOAD_GLOBAL_MODULE 437 #define _LOAD_GLOBAL_MODULE 436
#define _LOAD_GLOBAL_MODULE_FROM_KEYS 438 #define _LOAD_GLOBAL_MODULE_FROM_KEYS 437
#define _LOAD_LOCALS LOAD_LOCALS #define _LOAD_LOCALS LOAD_LOCALS
#define _LOAD_NAME LOAD_NAME #define _LOAD_NAME LOAD_NAME
#define _LOAD_SMALL_INT 439 #define _LOAD_SMALL_INT 438
#define _LOAD_SMALL_INT_0 440 #define _LOAD_SMALL_INT_0 439
#define _LOAD_SMALL_INT_1 441 #define _LOAD_SMALL_INT_1 440
#define _LOAD_SMALL_INT_2 442 #define _LOAD_SMALL_INT_2 441
#define _LOAD_SMALL_INT_3 443 #define _LOAD_SMALL_INT_3 442
#define _LOAD_SPECIAL LOAD_SPECIAL #define _LOAD_SPECIAL LOAD_SPECIAL
#define _LOAD_SUPER_ATTR_ATTR LOAD_SUPER_ATTR_ATTR #define _LOAD_SUPER_ATTR_ATTR LOAD_SUPER_ATTR_ATTR
#define _LOAD_SUPER_ATTR_METHOD LOAD_SUPER_ATTR_METHOD #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_CELL MAKE_CELL
#define _MAKE_FUNCTION MAKE_FUNCTION #define _MAKE_FUNCTION MAKE_FUNCTION
#define _MAKE_WARM 445 #define _MAKE_WARM 444
#define _MAP_ADD MAP_ADD #define _MAP_ADD MAP_ADD
#define _MATCH_CLASS MATCH_CLASS #define _MATCH_CLASS MATCH_CLASS
#define _MATCH_KEYS MATCH_KEYS #define _MATCH_KEYS MATCH_KEYS
#define _MATCH_MAPPING MATCH_MAPPING #define _MATCH_MAPPING MATCH_MAPPING
#define _MATCH_SEQUENCE MATCH_SEQUENCE #define _MATCH_SEQUENCE MATCH_SEQUENCE
#define _MAYBE_EXPAND_METHOD 446 #define _MAYBE_EXPAND_METHOD 445
#define _MAYBE_EXPAND_METHOD_KW 447 #define _MAYBE_EXPAND_METHOD_KW 446
#define _MONITOR_CALL 448 #define _MONITOR_CALL 447
#define _MONITOR_CALL_KW 449 #define _MONITOR_CALL_KW 448
#define _MONITOR_JUMP_BACKWARD 450 #define _MONITOR_JUMP_BACKWARD 449
#define _MONITOR_RESUME 451 #define _MONITOR_RESUME 450
#define _NOP NOP #define _NOP NOP
#define _POP_EXCEPT POP_EXCEPT #define _POP_EXCEPT POP_EXCEPT
#define _POP_JUMP_IF_FALSE 452 #define _POP_JUMP_IF_FALSE 451
#define _POP_JUMP_IF_TRUE 453 #define _POP_JUMP_IF_TRUE 452
#define _POP_TOP POP_TOP #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_EXC_INFO PUSH_EXC_INFO
#define _PUSH_FRAME 455 #define _PUSH_FRAME 454
#define _PUSH_NULL PUSH_NULL #define _PUSH_NULL PUSH_NULL
#define _PUSH_NULL_CONDITIONAL 456 #define _PUSH_NULL_CONDITIONAL 455
#define _PY_FRAME_GENERAL 457 #define _PY_FRAME_GENERAL 456
#define _PY_FRAME_KW 458 #define _PY_FRAME_KW 457
#define _QUICKEN_RESUME 459 #define _QUICKEN_RESUME 458
#define _REPLACE_WITH_TRUE 460 #define _REPLACE_WITH_TRUE 459
#define _RESUME_CHECK RESUME_CHECK #define _RESUME_CHECK RESUME_CHECK
#define _RETURN_GENERATOR RETURN_GENERATOR #define _RETURN_GENERATOR RETURN_GENERATOR
#define _RETURN_VALUE RETURN_VALUE #define _RETURN_VALUE RETURN_VALUE
#define _SAVE_RETURN_OFFSET 461 #define _SAVE_RETURN_OFFSET 460
#define _SEND 462 #define _SEND 461
#define _SEND_GEN_FRAME 463 #define _SEND_GEN_FRAME 462
#define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS #define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS
#define _SET_ADD SET_ADD #define _SET_ADD SET_ADD
#define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE #define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE
#define _SET_UPDATE SET_UPDATE #define _SET_UPDATE SET_UPDATE
#define _START_EXECUTOR 464 #define _START_EXECUTOR 463
#define _STORE_ATTR 465 #define _STORE_ATTR 464
#define _STORE_ATTR_INSTANCE_VALUE 466 #define _STORE_ATTR_INSTANCE_VALUE 465
#define _STORE_ATTR_SLOT 467 #define _STORE_ATTR_SLOT 466
#define _STORE_ATTR_WITH_HINT 468 #define _STORE_ATTR_WITH_HINT 467
#define _STORE_DEREF STORE_DEREF #define _STORE_DEREF STORE_DEREF
#define _STORE_FAST 469 #define _STORE_FAST 468
#define _STORE_FAST_0 470 #define _STORE_FAST_0 469
#define _STORE_FAST_1 471 #define _STORE_FAST_1 470
#define _STORE_FAST_2 472 #define _STORE_FAST_2 471
#define _STORE_FAST_3 473 #define _STORE_FAST_3 472
#define _STORE_FAST_4 474 #define _STORE_FAST_4 473
#define _STORE_FAST_5 475 #define _STORE_FAST_5 474
#define _STORE_FAST_6 476 #define _STORE_FAST_6 475
#define _STORE_FAST_7 477 #define _STORE_FAST_7 476
#define _STORE_FAST_LOAD_FAST STORE_FAST_LOAD_FAST #define _STORE_FAST_LOAD_FAST STORE_FAST_LOAD_FAST
#define _STORE_FAST_STORE_FAST STORE_FAST_STORE_FAST #define _STORE_FAST_STORE_FAST STORE_FAST_STORE_FAST
#define _STORE_GLOBAL STORE_GLOBAL #define _STORE_GLOBAL STORE_GLOBAL
#define _STORE_NAME STORE_NAME #define _STORE_NAME STORE_NAME
#define _STORE_SLICE 478 #define _STORE_SLICE 477
#define _STORE_SUBSCR 479 #define _STORE_SUBSCR 478
#define _STORE_SUBSCR_DICT STORE_SUBSCR_DICT #define _STORE_SUBSCR_DICT STORE_SUBSCR_DICT
#define _STORE_SUBSCR_LIST_INT STORE_SUBSCR_LIST_INT #define _STORE_SUBSCR_LIST_INT STORE_SUBSCR_LIST_INT
#define _SWAP SWAP #define _SWAP SWAP
#define _TIER2_RESUME_CHECK 480 #define _TIER2_RESUME_CHECK 479
#define _TO_BOOL 481 #define _TO_BOOL 480
#define _TO_BOOL_BOOL TO_BOOL_BOOL #define _TO_BOOL_BOOL TO_BOOL_BOOL
#define _TO_BOOL_INT TO_BOOL_INT #define _TO_BOOL_INT TO_BOOL_INT
#define _TO_BOOL_LIST TO_BOOL_LIST #define _TO_BOOL_LIST TO_BOOL_LIST
@ -300,13 +299,13 @@ extern "C" {
#define _UNARY_NEGATIVE UNARY_NEGATIVE #define _UNARY_NEGATIVE UNARY_NEGATIVE
#define _UNARY_NOT UNARY_NOT #define _UNARY_NOT UNARY_NOT
#define _UNPACK_EX UNPACK_EX #define _UNPACK_EX UNPACK_EX
#define _UNPACK_SEQUENCE 482 #define _UNPACK_SEQUENCE 481
#define _UNPACK_SEQUENCE_LIST UNPACK_SEQUENCE_LIST #define _UNPACK_SEQUENCE_LIST UNPACK_SEQUENCE_LIST
#define _UNPACK_SEQUENCE_TUPLE UNPACK_SEQUENCE_TUPLE #define _UNPACK_SEQUENCE_TUPLE UNPACK_SEQUENCE_TUPLE
#define _UNPACK_SEQUENCE_TWO_TUPLE UNPACK_SEQUENCE_TWO_TUPLE #define _UNPACK_SEQUENCE_TWO_TUPLE UNPACK_SEQUENCE_TWO_TUPLE
#define _WITH_EXCEPT_START WITH_EXCEPT_START #define _WITH_EXCEPT_START WITH_EXCEPT_START
#define _YIELD_VALUE YIELD_VALUE #define _YIELD_VALUE YIELD_VALUE
#define MAX_UOP_ID 482 #define MAX_UOP_ID 481
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -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, [_BINARY_OP_INPLACE_ADD_UNICODE] = HAS_LOCAL_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG,
[_GUARD_BINARY_OP_EXTEND] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG, [_GUARD_BINARY_OP_EXTEND] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
[_BINARY_OP_EXTEND] = HAS_ESCAPES_FLAG | HAS_PURE_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, [_BINARY_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_STORE_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_OP_SUBSCR_LIST_INT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
[_BINARY_SUBSCR_STR_INT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG, [_BINARY_OP_SUBSCR_STR_INT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
[_BINARY_SUBSCR_TUPLE_INT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG, [_BINARY_OP_SUBSCR_TUPLE_INT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
[_BINARY_SUBSCR_DICT] = HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, [_BINARY_OP_SUBSCR_DICT] = HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_BINARY_SUBSCR_CHECK_FUNC] = HAS_DEOPT_FLAG, [_BINARY_OP_SUBSCR_CHECK_FUNC] = HAS_DEOPT_FLAG,
[_BINARY_SUBSCR_INIT_CALL] = 0, [_BINARY_OP_SUBSCR_INIT_CALL] = 0,
[_LIST_APPEND] = HAS_ARG_FLAG | HAS_ERROR_FLAG, [_LIST_APPEND] = HAS_ARG_FLAG | HAS_ERROR_FLAG,
[_SET_ADD] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, [_SET_ADD] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_STORE_SUBSCR] = 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_INPLACE_ADD_UNICODE] = "_BINARY_OP_INPLACE_ADD_UNICODE",
[_BINARY_OP_MULTIPLY_FLOAT] = "_BINARY_OP_MULTIPLY_FLOAT", [_BINARY_OP_MULTIPLY_FLOAT] = "_BINARY_OP_MULTIPLY_FLOAT",
[_BINARY_OP_MULTIPLY_INT] = "_BINARY_OP_MULTIPLY_INT", [_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_FLOAT] = "_BINARY_OP_SUBTRACT_FLOAT",
[_BINARY_OP_SUBTRACT_INT] = "_BINARY_OP_SUBTRACT_INT", [_BINARY_OP_SUBTRACT_INT] = "_BINARY_OP_SUBTRACT_INT",
[_BINARY_SLICE] = "_BINARY_SLICE", [_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_LIST] = "_BUILD_LIST",
[_BUILD_MAP] = "_BUILD_MAP", [_BUILD_MAP] = "_BUILD_MAP",
[_BUILD_SET] = "_BUILD_SET", [_BUILD_SET] = "_BUILD_SET",
@ -701,23 +699,21 @@ int _PyUop_num_popped(int opcode, int oparg)
return 0; return 0;
case _BINARY_OP_EXTEND: case _BINARY_OP_EXTEND:
return 2; return 2;
case _BINARY_SUBSCR:
return 2;
case _BINARY_SLICE: case _BINARY_SLICE:
return 3; return 3;
case _STORE_SLICE: case _STORE_SLICE:
return 4; return 4;
case _BINARY_SUBSCR_LIST_INT: case _BINARY_OP_SUBSCR_LIST_INT:
return 2; return 2;
case _BINARY_SUBSCR_STR_INT: case _BINARY_OP_SUBSCR_STR_INT:
return 2; return 2;
case _BINARY_SUBSCR_TUPLE_INT: case _BINARY_OP_SUBSCR_TUPLE_INT:
return 2; return 2;
case _BINARY_SUBSCR_DICT: case _BINARY_OP_SUBSCR_DICT:
return 2; return 2;
case _BINARY_SUBSCR_CHECK_FUNC: case _BINARY_OP_SUBSCR_CHECK_FUNC:
return 0; return 0;
case _BINARY_SUBSCR_INIT_CALL: case _BINARY_OP_SUBSCR_INIT_CALL:
return 3; return 3;
case _LIST_APPEND: case _LIST_APPEND:
return 1; return 1;

3
Include/opcode.h generated
View file

@ -33,8 +33,9 @@ extern "C" {
#define NB_INPLACE_SUBTRACT 23 #define NB_INPLACE_SUBTRACT 23
#define NB_INPLACE_TRUE_DIVIDE 24 #define NB_INPLACE_TRUE_DIVIDE 24
#define NB_INPLACE_XOR 25 #define NB_INPLACE_XOR 25
#define NB_SUBSCR 26
#define NB_OPARG_LAST 25 #define NB_OPARG_LAST 26
#ifdef __cplusplus #ifdef __cplusplus
} }

243
Include/opcode_ids.h generated
View file

@ -12,122 +12,121 @@ extern "C" {
/* Instruction opcodes for compiled code */ /* Instruction opcodes for compiled code */
#define CACHE 0 #define CACHE 0
#define BINARY_SLICE 1 #define BINARY_SLICE 1
#define BINARY_SUBSCR 2 #define CALL_FUNCTION_EX 2
#define BINARY_OP_INPLACE_ADD_UNICODE 3 #define BINARY_OP_INPLACE_ADD_UNICODE 3
#define CALL_FUNCTION_EX 4 #define CHECK_EG_MATCH 4
#define CHECK_EG_MATCH 5 #define CHECK_EXC_MATCH 5
#define CHECK_EXC_MATCH 6 #define CLEANUP_THROW 6
#define CLEANUP_THROW 7 #define DELETE_SUBSCR 7
#define DELETE_SUBSCR 8 #define END_ASYNC_FOR 8
#define END_ASYNC_FOR 9 #define END_FOR 9
#define END_FOR 10 #define END_SEND 10
#define END_SEND 11 #define EXIT_INIT_CHECK 11
#define EXIT_INIT_CHECK 12 #define FORMAT_SIMPLE 12
#define FORMAT_SIMPLE 13 #define FORMAT_WITH_SPEC 13
#define FORMAT_WITH_SPEC 14 #define GET_AITER 14
#define GET_AITER 15 #define GET_ANEXT 15
#define GET_ANEXT 16 #define GET_ITER 16
#define RESERVED 17 #define RESERVED 17
#define GET_ITER 18 #define GET_LEN 18
#define GET_LEN 19 #define GET_YIELD_FROM_ITER 19
#define GET_YIELD_FROM_ITER 20 #define INTERPRETER_EXIT 20
#define INTERPRETER_EXIT 21 #define LOAD_BUILD_CLASS 21
#define LOAD_BUILD_CLASS 22 #define LOAD_LOCALS 22
#define LOAD_LOCALS 23 #define MAKE_FUNCTION 23
#define MAKE_FUNCTION 24 #define MATCH_KEYS 24
#define MATCH_KEYS 25 #define MATCH_MAPPING 25
#define MATCH_MAPPING 26 #define MATCH_SEQUENCE 26
#define MATCH_SEQUENCE 27 #define NOP 27
#define NOP 28 #define NOT_TAKEN 28
#define NOT_TAKEN 29 #define POP_EXCEPT 29
#define POP_EXCEPT 30 #define POP_ITER 30
#define POP_ITER 31 #define POP_TOP 31
#define POP_TOP 32 #define PUSH_EXC_INFO 32
#define PUSH_EXC_INFO 33 #define PUSH_NULL 33
#define PUSH_NULL 34 #define RETURN_GENERATOR 34
#define RETURN_GENERATOR 35 #define RETURN_VALUE 35
#define RETURN_VALUE 36 #define SETUP_ANNOTATIONS 36
#define SETUP_ANNOTATIONS 37 #define STORE_SLICE 37
#define STORE_SLICE 38 #define STORE_SUBSCR 38
#define STORE_SUBSCR 39 #define TO_BOOL 39
#define TO_BOOL 40 #define UNARY_INVERT 40
#define UNARY_INVERT 41 #define UNARY_NEGATIVE 41
#define UNARY_NEGATIVE 42 #define UNARY_NOT 42
#define UNARY_NOT 43 #define WITH_EXCEPT_START 43
#define WITH_EXCEPT_START 44 #define BINARY_OP 44
#define BINARY_OP 45 #define BUILD_LIST 45
#define BUILD_LIST 46 #define BUILD_MAP 46
#define BUILD_MAP 47 #define BUILD_SET 47
#define BUILD_SET 48 #define BUILD_SLICE 48
#define BUILD_SLICE 49 #define BUILD_STRING 49
#define BUILD_STRING 50 #define BUILD_TUPLE 50
#define BUILD_TUPLE 51 #define CALL 51
#define CALL 52 #define CALL_INTRINSIC_1 52
#define CALL_INTRINSIC_1 53 #define CALL_INTRINSIC_2 53
#define CALL_INTRINSIC_2 54 #define CALL_KW 54
#define CALL_KW 55 #define COMPARE_OP 55
#define COMPARE_OP 56 #define CONTAINS_OP 56
#define CONTAINS_OP 57 #define CONVERT_VALUE 57
#define CONVERT_VALUE 58 #define COPY 58
#define COPY 59 #define COPY_FREE_VARS 59
#define COPY_FREE_VARS 60 #define DELETE_ATTR 60
#define DELETE_ATTR 61 #define DELETE_DEREF 61
#define DELETE_DEREF 62 #define DELETE_FAST 62
#define DELETE_FAST 63 #define DELETE_GLOBAL 63
#define DELETE_GLOBAL 64 #define DELETE_NAME 64
#define DELETE_NAME 65 #define DICT_MERGE 65
#define DICT_MERGE 66 #define DICT_UPDATE 66
#define DICT_UPDATE 67 #define EXTENDED_ARG 67
#define EXTENDED_ARG 68 #define FOR_ITER 68
#define FOR_ITER 69 #define GET_AWAITABLE 69
#define GET_AWAITABLE 70 #define IMPORT_FROM 70
#define IMPORT_FROM 71 #define IMPORT_NAME 71
#define IMPORT_NAME 72 #define IS_OP 72
#define IS_OP 73 #define JUMP_BACKWARD 73
#define JUMP_BACKWARD 74 #define JUMP_BACKWARD_NO_INTERRUPT 74
#define JUMP_BACKWARD_NO_INTERRUPT 75 #define JUMP_FORWARD 75
#define JUMP_FORWARD 76 #define LIST_APPEND 76
#define LIST_APPEND 77 #define LIST_EXTEND 77
#define LIST_EXTEND 78 #define LOAD_ATTR 78
#define LOAD_ATTR 79 #define LOAD_COMMON_CONSTANT 79
#define LOAD_COMMON_CONSTANT 80 #define LOAD_CONST 80
#define LOAD_CONST 81 #define LOAD_DEREF 81
#define LOAD_DEREF 82 #define LOAD_FAST 82
#define LOAD_FAST 83 #define LOAD_FAST_AND_CLEAR 83
#define LOAD_FAST_AND_CLEAR 84 #define LOAD_FAST_CHECK 84
#define LOAD_FAST_CHECK 85 #define LOAD_FAST_LOAD_FAST 85
#define LOAD_FAST_LOAD_FAST 86 #define LOAD_FROM_DICT_OR_DEREF 86
#define LOAD_FROM_DICT_OR_DEREF 87 #define LOAD_FROM_DICT_OR_GLOBALS 87
#define LOAD_FROM_DICT_OR_GLOBALS 88 #define LOAD_GLOBAL 88
#define LOAD_GLOBAL 89 #define LOAD_NAME 89
#define LOAD_NAME 90 #define LOAD_SMALL_INT 90
#define LOAD_SMALL_INT 91 #define LOAD_SPECIAL 91
#define LOAD_SPECIAL 92 #define LOAD_SUPER_ATTR 92
#define LOAD_SUPER_ATTR 93 #define MAKE_CELL 93
#define MAKE_CELL 94 #define MAP_ADD 94
#define MAP_ADD 95 #define MATCH_CLASS 95
#define MATCH_CLASS 96 #define POP_JUMP_IF_FALSE 96
#define POP_JUMP_IF_FALSE 97 #define POP_JUMP_IF_NONE 97
#define POP_JUMP_IF_NONE 98 #define POP_JUMP_IF_NOT_NONE 98
#define POP_JUMP_IF_NOT_NONE 99 #define POP_JUMP_IF_TRUE 99
#define POP_JUMP_IF_TRUE 100 #define RAISE_VARARGS 100
#define RAISE_VARARGS 101 #define RERAISE 101
#define RERAISE 102 #define SEND 102
#define SEND 103 #define SET_ADD 103
#define SET_ADD 104 #define SET_FUNCTION_ATTRIBUTE 104
#define SET_FUNCTION_ATTRIBUTE 105 #define SET_UPDATE 105
#define SET_UPDATE 106 #define STORE_ATTR 106
#define STORE_ATTR 107 #define STORE_DEREF 107
#define STORE_DEREF 108 #define STORE_FAST 108
#define STORE_FAST 109 #define STORE_FAST_LOAD_FAST 109
#define STORE_FAST_LOAD_FAST 110 #define STORE_FAST_STORE_FAST 110
#define STORE_FAST_STORE_FAST 111 #define STORE_GLOBAL 111
#define STORE_GLOBAL 112 #define STORE_NAME 112
#define STORE_NAME 113 #define SWAP 113
#define SWAP 114 #define UNPACK_EX 114
#define UNPACK_EX 115 #define UNPACK_SEQUENCE 115
#define UNPACK_SEQUENCE 116 #define YIELD_VALUE 116
#define YIELD_VALUE 117
#define RESUME 149 #define RESUME 149
#define BINARY_OP_ADD_FLOAT 150 #define BINARY_OP_ADD_FLOAT 150
#define BINARY_OP_ADD_INT 151 #define BINARY_OP_ADD_INT 151
@ -135,13 +134,13 @@ extern "C" {
#define BINARY_OP_EXTEND 153 #define BINARY_OP_EXTEND 153
#define BINARY_OP_MULTIPLY_FLOAT 154 #define BINARY_OP_MULTIPLY_FLOAT 154
#define BINARY_OP_MULTIPLY_INT 155 #define BINARY_OP_MULTIPLY_INT 155
#define BINARY_OP_SUBTRACT_FLOAT 156 #define BINARY_OP_SUBSCR_DICT 156
#define BINARY_OP_SUBTRACT_INT 157 #define BINARY_OP_SUBSCR_GETITEM 157
#define BINARY_SUBSCR_DICT 158 #define BINARY_OP_SUBSCR_LIST_INT 158
#define BINARY_SUBSCR_GETITEM 159 #define BINARY_OP_SUBSCR_STR_INT 159
#define BINARY_SUBSCR_LIST_INT 160 #define BINARY_OP_SUBSCR_TUPLE_INT 160
#define BINARY_SUBSCR_STR_INT 161 #define BINARY_OP_SUBTRACT_FLOAT 161
#define BINARY_SUBSCR_TUPLE_INT 162 #define BINARY_OP_SUBTRACT_INT 162
#define CALL_ALLOC_AND_ENTER_INIT 163 #define CALL_ALLOC_AND_ENTER_INIT 163
#define CALL_BOUND_METHOD_EXACT_ARGS 164 #define CALL_BOUND_METHOD_EXACT_ARGS 164
#define CALL_BOUND_METHOD_GENERAL 165 #define CALL_BOUND_METHOD_GENERAL 165
@ -243,7 +242,7 @@ extern "C" {
#define SETUP_WITH 264 #define SETUP_WITH 264
#define STORE_FAST_MAYBE_NULL 265 #define STORE_FAST_MAYBE_NULL 265
#define HAVE_ARGUMENT 44 #define HAVE_ARGUMENT 43
#define MIN_SPECIALIZED_OPCODE 150 #define MIN_SPECIALIZED_OPCODE 150
#define MIN_INSTRUMENTED_OPCODE 235 #define MIN_INSTRUMENTED_OPCODE 235

255
Lib/_opcode_metadata.py generated
View file

@ -26,16 +26,14 @@ _specializations = {
"BINARY_OP_ADD_FLOAT", "BINARY_OP_ADD_FLOAT",
"BINARY_OP_SUBTRACT_FLOAT", "BINARY_OP_SUBTRACT_FLOAT",
"BINARY_OP_ADD_UNICODE", "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_EXTEND",
"BINARY_OP_INPLACE_ADD_UNICODE", "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": [
"STORE_SUBSCR_DICT", "STORE_SUBSCR_DICT",
"STORE_SUBSCR_LIST_INT", "STORE_SUBSCR_LIST_INT",
@ -132,13 +130,13 @@ _specialized_opmap = {
'BINARY_OP_INPLACE_ADD_UNICODE': 3, 'BINARY_OP_INPLACE_ADD_UNICODE': 3,
'BINARY_OP_MULTIPLY_FLOAT': 154, 'BINARY_OP_MULTIPLY_FLOAT': 154,
'BINARY_OP_MULTIPLY_INT': 155, 'BINARY_OP_MULTIPLY_INT': 155,
'BINARY_OP_SUBTRACT_FLOAT': 156, 'BINARY_OP_SUBSCR_DICT': 156,
'BINARY_OP_SUBTRACT_INT': 157, 'BINARY_OP_SUBSCR_GETITEM': 157,
'BINARY_SUBSCR_DICT': 158, 'BINARY_OP_SUBSCR_LIST_INT': 158,
'BINARY_SUBSCR_GETITEM': 159, 'BINARY_OP_SUBSCR_STR_INT': 159,
'BINARY_SUBSCR_LIST_INT': 160, 'BINARY_OP_SUBSCR_TUPLE_INT': 160,
'BINARY_SUBSCR_STR_INT': 161, 'BINARY_OP_SUBTRACT_FLOAT': 161,
'BINARY_SUBSCR_TUPLE_INT': 162, 'BINARY_OP_SUBTRACT_INT': 162,
'CALL_ALLOC_AND_ENTER_INIT': 163, 'CALL_ALLOC_AND_ENTER_INIT': 163,
'CALL_BOUND_METHOD_EXACT_ARGS': 164, 'CALL_BOUND_METHOD_EXACT_ARGS': 164,
'CALL_BOUND_METHOD_GENERAL': 165, 'CALL_BOUND_METHOD_GENERAL': 165,
@ -217,120 +215,119 @@ opmap = {
'INSTRUMENTED_LINE': 254, 'INSTRUMENTED_LINE': 254,
'ENTER_EXECUTOR': 255, 'ENTER_EXECUTOR': 255,
'BINARY_SLICE': 1, 'BINARY_SLICE': 1,
'BINARY_SUBSCR': 2, 'CALL_FUNCTION_EX': 2,
'CALL_FUNCTION_EX': 4, 'CHECK_EG_MATCH': 4,
'CHECK_EG_MATCH': 5, 'CHECK_EXC_MATCH': 5,
'CHECK_EXC_MATCH': 6, 'CLEANUP_THROW': 6,
'CLEANUP_THROW': 7, 'DELETE_SUBSCR': 7,
'DELETE_SUBSCR': 8, 'END_ASYNC_FOR': 8,
'END_ASYNC_FOR': 9, 'END_FOR': 9,
'END_FOR': 10, 'END_SEND': 10,
'END_SEND': 11, 'EXIT_INIT_CHECK': 11,
'EXIT_INIT_CHECK': 12, 'FORMAT_SIMPLE': 12,
'FORMAT_SIMPLE': 13, 'FORMAT_WITH_SPEC': 13,
'FORMAT_WITH_SPEC': 14, 'GET_AITER': 14,
'GET_AITER': 15, 'GET_ANEXT': 15,
'GET_ANEXT': 16, 'GET_ITER': 16,
'GET_ITER': 18, 'GET_LEN': 18,
'GET_LEN': 19, 'GET_YIELD_FROM_ITER': 19,
'GET_YIELD_FROM_ITER': 20, 'INTERPRETER_EXIT': 20,
'INTERPRETER_EXIT': 21, 'LOAD_BUILD_CLASS': 21,
'LOAD_BUILD_CLASS': 22, 'LOAD_LOCALS': 22,
'LOAD_LOCALS': 23, 'MAKE_FUNCTION': 23,
'MAKE_FUNCTION': 24, 'MATCH_KEYS': 24,
'MATCH_KEYS': 25, 'MATCH_MAPPING': 25,
'MATCH_MAPPING': 26, 'MATCH_SEQUENCE': 26,
'MATCH_SEQUENCE': 27, 'NOP': 27,
'NOP': 28, 'NOT_TAKEN': 28,
'NOT_TAKEN': 29, 'POP_EXCEPT': 29,
'POP_EXCEPT': 30, 'POP_ITER': 30,
'POP_ITER': 31, 'POP_TOP': 31,
'POP_TOP': 32, 'PUSH_EXC_INFO': 32,
'PUSH_EXC_INFO': 33, 'PUSH_NULL': 33,
'PUSH_NULL': 34, 'RETURN_GENERATOR': 34,
'RETURN_GENERATOR': 35, 'RETURN_VALUE': 35,
'RETURN_VALUE': 36, 'SETUP_ANNOTATIONS': 36,
'SETUP_ANNOTATIONS': 37, 'STORE_SLICE': 37,
'STORE_SLICE': 38, 'STORE_SUBSCR': 38,
'STORE_SUBSCR': 39, 'TO_BOOL': 39,
'TO_BOOL': 40, 'UNARY_INVERT': 40,
'UNARY_INVERT': 41, 'UNARY_NEGATIVE': 41,
'UNARY_NEGATIVE': 42, 'UNARY_NOT': 42,
'UNARY_NOT': 43, 'WITH_EXCEPT_START': 43,
'WITH_EXCEPT_START': 44, 'BINARY_OP': 44,
'BINARY_OP': 45, 'BUILD_LIST': 45,
'BUILD_LIST': 46, 'BUILD_MAP': 46,
'BUILD_MAP': 47, 'BUILD_SET': 47,
'BUILD_SET': 48, 'BUILD_SLICE': 48,
'BUILD_SLICE': 49, 'BUILD_STRING': 49,
'BUILD_STRING': 50, 'BUILD_TUPLE': 50,
'BUILD_TUPLE': 51, 'CALL': 51,
'CALL': 52, 'CALL_INTRINSIC_1': 52,
'CALL_INTRINSIC_1': 53, 'CALL_INTRINSIC_2': 53,
'CALL_INTRINSIC_2': 54, 'CALL_KW': 54,
'CALL_KW': 55, 'COMPARE_OP': 55,
'COMPARE_OP': 56, 'CONTAINS_OP': 56,
'CONTAINS_OP': 57, 'CONVERT_VALUE': 57,
'CONVERT_VALUE': 58, 'COPY': 58,
'COPY': 59, 'COPY_FREE_VARS': 59,
'COPY_FREE_VARS': 60, 'DELETE_ATTR': 60,
'DELETE_ATTR': 61, 'DELETE_DEREF': 61,
'DELETE_DEREF': 62, 'DELETE_FAST': 62,
'DELETE_FAST': 63, 'DELETE_GLOBAL': 63,
'DELETE_GLOBAL': 64, 'DELETE_NAME': 64,
'DELETE_NAME': 65, 'DICT_MERGE': 65,
'DICT_MERGE': 66, 'DICT_UPDATE': 66,
'DICT_UPDATE': 67, 'EXTENDED_ARG': 67,
'EXTENDED_ARG': 68, 'FOR_ITER': 68,
'FOR_ITER': 69, 'GET_AWAITABLE': 69,
'GET_AWAITABLE': 70, 'IMPORT_FROM': 70,
'IMPORT_FROM': 71, 'IMPORT_NAME': 71,
'IMPORT_NAME': 72, 'IS_OP': 72,
'IS_OP': 73, 'JUMP_BACKWARD': 73,
'JUMP_BACKWARD': 74, 'JUMP_BACKWARD_NO_INTERRUPT': 74,
'JUMP_BACKWARD_NO_INTERRUPT': 75, 'JUMP_FORWARD': 75,
'JUMP_FORWARD': 76, 'LIST_APPEND': 76,
'LIST_APPEND': 77, 'LIST_EXTEND': 77,
'LIST_EXTEND': 78, 'LOAD_ATTR': 78,
'LOAD_ATTR': 79, 'LOAD_COMMON_CONSTANT': 79,
'LOAD_COMMON_CONSTANT': 80, 'LOAD_CONST': 80,
'LOAD_CONST': 81, 'LOAD_DEREF': 81,
'LOAD_DEREF': 82, 'LOAD_FAST': 82,
'LOAD_FAST': 83, 'LOAD_FAST_AND_CLEAR': 83,
'LOAD_FAST_AND_CLEAR': 84, 'LOAD_FAST_CHECK': 84,
'LOAD_FAST_CHECK': 85, 'LOAD_FAST_LOAD_FAST': 85,
'LOAD_FAST_LOAD_FAST': 86, 'LOAD_FROM_DICT_OR_DEREF': 86,
'LOAD_FROM_DICT_OR_DEREF': 87, 'LOAD_FROM_DICT_OR_GLOBALS': 87,
'LOAD_FROM_DICT_OR_GLOBALS': 88, 'LOAD_GLOBAL': 88,
'LOAD_GLOBAL': 89, 'LOAD_NAME': 89,
'LOAD_NAME': 90, 'LOAD_SMALL_INT': 90,
'LOAD_SMALL_INT': 91, 'LOAD_SPECIAL': 91,
'LOAD_SPECIAL': 92, 'LOAD_SUPER_ATTR': 92,
'LOAD_SUPER_ATTR': 93, 'MAKE_CELL': 93,
'MAKE_CELL': 94, 'MAP_ADD': 94,
'MAP_ADD': 95, 'MATCH_CLASS': 95,
'MATCH_CLASS': 96, 'POP_JUMP_IF_FALSE': 96,
'POP_JUMP_IF_FALSE': 97, 'POP_JUMP_IF_NONE': 97,
'POP_JUMP_IF_NONE': 98, 'POP_JUMP_IF_NOT_NONE': 98,
'POP_JUMP_IF_NOT_NONE': 99, 'POP_JUMP_IF_TRUE': 99,
'POP_JUMP_IF_TRUE': 100, 'RAISE_VARARGS': 100,
'RAISE_VARARGS': 101, 'RERAISE': 101,
'RERAISE': 102, 'SEND': 102,
'SEND': 103, 'SET_ADD': 103,
'SET_ADD': 104, 'SET_FUNCTION_ATTRIBUTE': 104,
'SET_FUNCTION_ATTRIBUTE': 105, 'SET_UPDATE': 105,
'SET_UPDATE': 106, 'STORE_ATTR': 106,
'STORE_ATTR': 107, 'STORE_DEREF': 107,
'STORE_DEREF': 108, 'STORE_FAST': 108,
'STORE_FAST': 109, 'STORE_FAST_LOAD_FAST': 109,
'STORE_FAST_LOAD_FAST': 110, 'STORE_FAST_STORE_FAST': 110,
'STORE_FAST_STORE_FAST': 111, 'STORE_GLOBAL': 111,
'STORE_GLOBAL': 112, 'STORE_NAME': 112,
'STORE_NAME': 113, 'SWAP': 113,
'SWAP': 114, 'UNPACK_EX': 114,
'UNPACK_EX': 115, 'UNPACK_SEQUENCE': 115,
'UNPACK_SEQUENCE': 116, 'YIELD_VALUE': 116,
'YIELD_VALUE': 117,
'INSTRUMENTED_END_FOR': 235, 'INSTRUMENTED_END_FOR': 235,
'INSTRUMENTED_POP_ITER': 236, 'INSTRUMENTED_POP_ITER': 236,
'INSTRUMENTED_END_SEND': 237, 'INSTRUMENTED_END_SEND': 237,
@ -362,5 +359,5 @@ opmap = {
'STORE_FAST_MAYBE_NULL': 265, 'STORE_FAST_MAYBE_NULL': 265,
} }
HAVE_ARGUMENT = 44 HAVE_ARGUMENT = 43
MIN_INSTRUMENTED_OPCODE = 235 MIN_INSTRUMENTED_OPCODE = 235

View file

@ -123,7 +123,7 @@ class SpecializationStatsTests(unittest.TestCase):
if opcode._inline_cache_entries.get(op, 0) if opcode._inline_cache_entries.get(op, 0)
] ]
self.assertIn('load_attr', specialized_opcodes) self.assertIn('load_attr', specialized_opcodes)
self.assertIn('binary_subscr', specialized_opcodes) self.assertIn('binary_op', specialized_opcodes)
stats = _opcode.get_specialization_stats() stats = _opcode.get_specialization_stats()
if stats is not None: if stats is not None:

View file

@ -1410,7 +1410,7 @@ class TestSpecifics(unittest.TestCase):
check_op_count(load, "BINARY_SLICE", 3) check_op_count(load, "BINARY_SLICE", 3)
check_op_count(load, "BUILD_SLICE", 0) check_op_count(load, "BUILD_SLICE", 0)
check_consts(load, slice, [slice(None, None, None)]) check_consts(load, slice, [slice(None, None, None)])
check_op_count(load, "BINARY_SUBSCR", 1) check_op_count(load, "BINARY_OP", 4)
def store(): def store():
x[a:b] = y 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, "BUILD_SLICE", 1)
check_op_count(long_slice, "BINARY_SLICE", 0) check_op_count(long_slice, "BINARY_SLICE", 0)
check_consts(long_slice, slice, []) check_consts(long_slice, slice, [])
check_op_count(long_slice, "BINARY_SUBSCR", 1) check_op_count(long_slice, "BINARY_OP", 1)
def aug(): def aug():
x[a:b] += y x[a:b] += y
@ -1437,7 +1437,7 @@ class TestSpecifics(unittest.TestCase):
check_op_count(aug, "BINARY_SLICE", 1) check_op_count(aug, "BINARY_SLICE", 1)
check_op_count(aug, "STORE_SLICE", 1) check_op_count(aug, "STORE_SLICE", 1)
check_op_count(aug, "BUILD_SLICE", 0) 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_op_count(aug, "STORE_SUBSCR", 0)
check_consts(aug, slice, []) 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, "BINARY_SLICE", 0)
check_op_count(aug_const, "STORE_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_op_count(aug_const, "STORE_SUBSCR", 1)
check_consts(aug_const, slice, [slice(1, 2)]) check_consts(aug_const, slice, [slice(1, 2)])
@ -2050,16 +2050,16 @@ class TestSourcePositions(unittest.TestCase):
snippet = "a - b @ (c * x['key'] + 23)" snippet = "a - b @ (c * x['key'] + 23)"
compiled_code, _ = self.check_positions_against_ast(snippet) 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) line=1, end_line=1, column=13, end_column=21)
self.assertOpcodeSourcePositionIs(compiled_code, 'BINARY_OP', 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', 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', 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', 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): def test_multiline_assert_rewritten_as_method_call(self):
# GH-94694: Don't crash if pytest rewrites a multiline assert as a # GH-94694: Don't crash if pytest rewrites a multiline assert as a

View file

@ -1706,211 +1706,211 @@ def _prepare_test_cases():
Instruction = dis.Instruction Instruction = dis.Instruction
expected_opinfo_outer = [ 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=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=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=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='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_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=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=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=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='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=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='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=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='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=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='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=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=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=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='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=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='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=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_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=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=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=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_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=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_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=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='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=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_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=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='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=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='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=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='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=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='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=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='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=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='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 = [ 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='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=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=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=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='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='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_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=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=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=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=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=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=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=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='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=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='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=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='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=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='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=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=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=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='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=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='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=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_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=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=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=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=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=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=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=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='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=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='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=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='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=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='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=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='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 = [ 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='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_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=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=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=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=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=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=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=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_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=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='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=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='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=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='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=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='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=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='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 = [ 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='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_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=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='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=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='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=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='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=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='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=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='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=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_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=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='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=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='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=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='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=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_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=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='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=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='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=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='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=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='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=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='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=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_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=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='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=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='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=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='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=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='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=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='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=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='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=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='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=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='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=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='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=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_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=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='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=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='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=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='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=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='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=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='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=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='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=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='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=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_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=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='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=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='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=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='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=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_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=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='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=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='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=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='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=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_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=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='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=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='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=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='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=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='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=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='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=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_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=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='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=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='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=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='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=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='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=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_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=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='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=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_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=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='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=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='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=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='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=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='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=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=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=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='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=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='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=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='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=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='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=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='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=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='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=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=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=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='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=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='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=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='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=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='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=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_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=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='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=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='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=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='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=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=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=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=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=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='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=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='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=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='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=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_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=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='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=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='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=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='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=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='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=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='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=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='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=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='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=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='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=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='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=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='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=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='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=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_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=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_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=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=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=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=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=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='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=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='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=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='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=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='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=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='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=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='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=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='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=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='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=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='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=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='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=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='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=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_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=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='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=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='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=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_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=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='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=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='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=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='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=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='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=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='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=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='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=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='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=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_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=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='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=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='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=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='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=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='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=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='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=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='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=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='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 # One last piece of inspect fodder to check the default line number handling
def simple(): pass def simple(): pass
expected_opinfo_simple = [ 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='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='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=36, arg=None, argval=None, argrepr='', offset=4, start_offset=4, 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),
] ]

View file

@ -629,7 +629,7 @@ class TestRacesDoNotCrash(TestBase):
pass pass
type(item).__getitem__ = lambda self, item: None 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) self.assert_races_do_not_crash(opname, get_items, read, write)
@requires_specialization_ft @requires_specialization_ft
@ -653,7 +653,7 @@ class TestRacesDoNotCrash(TestBase):
item.clear() item.clear()
item.append(None) 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) self.assert_races_do_not_crash(opname, get_items, read, write)
@requires_specialization @requires_specialization
@ -1705,7 +1705,7 @@ class TestSpecializer(TestBase):
binary_subscr_list_int() binary_subscr_list_int()
self.assert_specialized(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") self.assert_no_opcode(binary_subscr_list_int, "BINARY_SUBSCR")
def binary_subscr_tuple_int(): def binary_subscr_tuple_int():
@ -1716,7 +1716,7 @@ class TestSpecializer(TestBase):
binary_subscr_tuple_int() binary_subscr_tuple_int()
self.assert_specialized(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") self.assert_no_opcode(binary_subscr_tuple_int, "BINARY_SUBSCR")
def binary_subscr_dict(): def binary_subscr_dict():
@ -1726,8 +1726,8 @@ class TestSpecializer(TestBase):
self.assertEqual(a[2], 3) self.assertEqual(a[2], 3)
binary_subscr_dict() binary_subscr_dict()
self.assert_specialized(binary_subscr_dict, "BINARY_SUBSCR_DICT") self.assert_specialized(binary_subscr_dict, "BINARY_OP_SUBSCR_DICT")
self.assert_no_opcode(binary_subscr_dict, "BINARY_SUBSCR") self.assert_no_opcode(binary_subscr_dict, "BINARY_OP")
def binary_subscr_str_int(): def binary_subscr_str_int():
for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD): for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
@ -1736,7 +1736,7 @@ class TestSpecializer(TestBase):
self.assertEqual(a[idx], expected) self.assertEqual(a[idx], expected)
binary_subscr_str_int() 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") self.assert_no_opcode(binary_subscr_str_int, "BINARY_SUBSCR")
def binary_subscr_getitems(): def binary_subscr_getitems():
@ -1751,7 +1751,7 @@ class TestSpecializer(TestBase):
self.assertEqual(items[i][i], i) self.assertEqual(items[i][i], i)
binary_subscr_getitems() 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") self.assert_no_opcode(binary_subscr_getitems, "BINARY_SUBSCR")
@cpython_only @cpython_only

View file

@ -1,5 +1,6 @@
import dis import dis
from itertools import combinations, product from itertools import combinations, product
import opcode
import sys import sys
import textwrap import textwrap
import unittest import unittest
@ -280,23 +281,23 @@ class TestTranforms(BytecodeTestCase):
# valid code get optimized # valid code get optimized
code = compile('"foo"[0]', '', 'single') code = compile('"foo"[0]', '', 'single')
self.assertInBytecode(code, 'LOAD_CONST', 'f') self.assertInBytecode(code, 'LOAD_CONST', 'f')
self.assertNotInBytecode(code, 'BINARY_SUBSCR') self.assertNotInBytecode(code, 'BINARY_OP')
self.check_lnotab(code) self.check_lnotab(code)
code = compile('"\u0061\uffff"[1]', '', 'single') code = compile('"\u0061\uffff"[1]', '', 'single')
self.assertInBytecode(code, 'LOAD_CONST', '\uffff') self.assertInBytecode(code, 'LOAD_CONST', '\uffff')
self.assertNotInBytecode(code,'BINARY_SUBSCR') self.assertNotInBytecode(code,'BINARY_OP')
self.check_lnotab(code) self.check_lnotab(code)
# With PEP 393, non-BMP char get optimized # With PEP 393, non-BMP char get optimized
code = compile('"\U00012345"[0]', '', 'single') code = compile('"\U00012345"[0]', '', 'single')
self.assertInBytecode(code, 'LOAD_CONST', '\U00012345') self.assertInBytecode(code, 'LOAD_CONST', '\U00012345')
self.assertNotInBytecode(code, 'BINARY_SUBSCR') self.assertNotInBytecode(code, 'BINARY_OP')
self.check_lnotab(code) self.check_lnotab(code)
# invalid code doesn't get optimized # invalid code doesn't get optimized
# out of range # out of range
code = compile('"fuu"[10]', '', 'single') code = compile('"fuu"[10]', '', 'single')
self.assertInBytecode(code, 'BINARY_SUBSCR') self.assertInBytecode(code, 'BINARY_OP')
self.check_lnotab(code) self.check_lnotab(code)
def test_folding_of_unaryops_on_constants(self): def test_folding_of_unaryops_on_constants(self):
@ -517,13 +518,15 @@ class TestTranforms(BytecodeTestCase):
('("a" * 10)[10]', True), ('("a" * 10)[10]', True),
('(1, (1, 2))[2:6][0][2-1]', 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: for expr, has_error in tests:
with self.subTest(expr=expr, has_error=has_error): with self.subTest(expr=expr, has_error=has_error):
code = compile(expr, '', 'single') code = compile(expr, '', 'single')
if not has_error: if not has_error:
self.assertNotInBytecode(code, 'BINARY_SUBSCR') self.assertNotInBytecode(code, 'BINARY_OP', argval=subscr_argval)
else: else:
self.assertInBytecode(code, 'BINARY_SUBSCR') self.assertInBytecode(code, 'BINARY_OP', argval=subscr_argval)
self.check_lnotab(code) self.check_lnotab(code)
def test_in_literal_list(self): def test_in_literal_list(self):

View file

@ -0,0 +1 @@
Replace the opcode BINARY_SUBSCR and its family by BINARY_OP with oparg NB_SUBSCR.

View file

@ -274,6 +274,7 @@ _opcode_get_nb_ops_impl(PyObject *module)
ADD_NB_OP(NB_INPLACE_SUBTRACT, "-="); ADD_NB_OP(NB_INPLACE_SUBTRACT, "-=");
ADD_NB_OP(NB_INPLACE_TRUE_DIVIDE, "/="); ADD_NB_OP(NB_INPLACE_TRUE_DIVIDE, "/=");
ADD_NB_OP(NB_INPLACE_XOR, "^="); ADD_NB_OP(NB_INPLACE_XOR, "^=");
ADD_NB_OP(NB_SUBSCR, "[]");
#undef ADD_NB_OP #undef ADD_NB_OP

View file

@ -1,18 +1,19 @@
// Auto-generated by Programs/freeze_test_frozenmain.py // Auto-generated by Programs/freeze_test_frozenmain.py
unsigned char M_test_frozenmain[] = { unsigned char M_test_frozenmain[] = {
227,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0, 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, 0,0,0,0,0,243,184,0,0,0,149,0,90,0,80,0,
72,0,113,0,91,0,81,0,72,1,113,1,90,2,34,0, 71,0,112,0,90,0,80,0,71,1,112,1,89,2,33,0,
81,1,52,1,0,0,0,0,0,0,32,0,90,2,34,0, 80,1,51,1,0,0,0,0,0,0,31,0,89,2,33,0,
81,2,90,0,79,6,0,0,0,0,0,0,0,0,0,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,52,2,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,51,2,0,0,0,0,0,0,
32,0,90,1,79,8,0,0,0,0,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,34,0,52,0,0,0,0,0, 0,0,0,0,0,0,0,0,33,0,51,0,0,0,0,0,
0,0,81,3,2,0,0,0,113,5,81,4,18,0,69,20, 0,0,80,3,44,26,0,0,0,0,0,0,0,0,0,0,
0,0,113,6,90,2,34,0,81,5,90,6,13,0,81,6, 112,5,80,4,16,0,68,24,0,0,112,6,89,2,33,0,
90,5,90,6,2,0,0,0,13,0,50,4,52,1,0,0, 80,5,89,6,12,0,80,6,89,5,89,6,44,26,0,0,
0,0,0,0,32,0,74,22,0,0,10,0,31,0,81,0, 0,0,0,0,0,0,0,0,12,0,49,4,51,1,0,0,
36,0,41,7,78,122,18,70,114,111,122,101,110,32,72,101, 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, 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,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, 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, 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,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, 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, 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, 4,41,243,15,6,12,2,114,15,0,0,0,
}; };

View file

@ -537,6 +537,11 @@ dummy_func(
BINARY_OP_ADD_FLOAT, BINARY_OP_ADD_FLOAT,
BINARY_OP_SUBTRACT_FLOAT, BINARY_OP_SUBTRACT_FLOAT,
BINARY_OP_ADD_UNICODE, 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_INPLACE_ADD_UNICODE, // See comments at that opcode.
BINARY_OP_EXTEND, BINARY_OP_EXTEND,
}; };
@ -787,39 +792,6 @@ dummy_func(
macro(BINARY_OP_INPLACE_ADD_UNICODE) = macro(BINARY_OP_INPLACE_ADD_UNICODE) =
_GUARD_BOTH_UNICODE + unused/5 + _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)) { specializing op(_SPECIALIZE_BINARY_SLICE, (container, start, stop -- container, start, stop)) {
// Placeholder until we implement BINARY_SLICE specialization // Placeholder until we implement BINARY_SLICE specialization
#if ENABLE_SPECIALIZATION #if ENABLE_SPECIALIZATION
@ -871,7 +843,7 @@ dummy_func(
macro(STORE_SLICE) = _SPECIALIZE_STORE_SLICE + _STORE_SLICE; 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 *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *list = PyStackRef_AsPyObjectBorrow(list_st); PyObject *list = PyStackRef_AsPyObjectBorrow(list_st);
@ -884,10 +856,10 @@ dummy_func(
#ifdef Py_GIL_DISABLED #ifdef Py_GIL_DISABLED
PyObject *res_o = _PyList_GetItemRef((PyListObject*)list, index); PyObject *res_o = _PyList_GetItemRef((PyListObject*)list, index);
DEOPT_IF(res_o == NULL); DEOPT_IF(res_o == NULL);
STAT_INC(BINARY_SUBSCR, hit); STAT_INC(BINARY_OP, hit);
#else #else
DEOPT_IF(index >= PyList_GET_SIZE(list)); 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); PyObject *res_o = PyList_GET_ITEM(list, index);
assert(res_o != NULL); assert(res_o != NULL);
Py_INCREF(res_o); Py_INCREF(res_o);
@ -898,7 +870,7 @@ dummy_func(
res = PyStackRef_FromPyObjectSteal(res_o); 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 *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *str = PyStackRef_AsPyObjectBorrow(str_st); PyObject *str = PyStackRef_AsPyObjectBorrow(str_st);
@ -910,7 +882,7 @@ dummy_func(
// Specialize for reading an ASCII character from any string: // Specialize for reading an ASCII character from any string:
Py_UCS4 c = PyUnicode_READ_CHAR(str, index); Py_UCS4 c = PyUnicode_READ_CHAR(str, index);
DEOPT_IF(Py_ARRAY_LENGTH(_Py_SINGLETON(strings).ascii) <= c); 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]; PyObject *res_o = (PyObject*)&_Py_SINGLETON(strings).ascii[c];
PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc); PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc);
DEAD(sub_st); DEAD(sub_st);
@ -918,7 +890,7 @@ dummy_func(
res = PyStackRef_FromPyObjectSteal(res_o); 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 *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *tuple = PyStackRef_AsPyObjectBorrow(tuple_st); PyObject *tuple = PyStackRef_AsPyObjectBorrow(tuple_st);
@ -929,7 +901,7 @@ dummy_func(
DEOPT_IF(!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)); DEOPT_IF(!_PyLong_IsNonNegativeCompact((PyLongObject *)sub));
Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0]; Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
DEOPT_IF(index >= PyTuple_GET_SIZE(tuple)); 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); PyObject *res_o = PyTuple_GET_ITEM(tuple, index);
assert(res_o != NULL); assert(res_o != NULL);
Py_INCREF(res_o); Py_INCREF(res_o);
@ -939,12 +911,12 @@ dummy_func(
res = PyStackRef_FromPyObjectSteal(res_o); 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 *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *dict = PyStackRef_AsPyObjectBorrow(dict_st); PyObject *dict = PyStackRef_AsPyObjectBorrow(dict_st);
DEOPT_IF(!PyDict_CheckExact(dict)); DEOPT_IF(!PyDict_CheckExact(dict));
STAT_INC(BINARY_SUBSCR, hit); STAT_INC(BINARY_OP, hit);
PyObject *res_o; PyObject *res_o;
int rc = PyDict_GetItemRef(dict, sub, &res_o); int rc = PyDict_GetItemRef(dict, sub, &res_o);
if (rc == 0) { if (rc == 0) {
@ -955,7 +927,7 @@ dummy_func(
res = PyStackRef_FromPyObjectSteal(res_o); 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)); PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(container));
DEOPT_IF(!PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)); DEOPT_IF(!PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE));
PyHeapTypeObject *ht = (PyHeapTypeObject *)tp; PyHeapTypeObject *ht = (PyHeapTypeObject *)tp;
@ -968,10 +940,10 @@ dummy_func(
assert(code->co_argcount == 2); assert(code->co_argcount == 2);
DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize)); DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize));
getitem = PyStackRef_FromPyObjectNew(getitem_o); 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 = _PyFrame_PushUnchecked(tstate, getitem, 2, frame);
new_frame->localsplus[0] = container; new_frame->localsplus[0] = container;
new_frame->localsplus[1] = sub; new_frame->localsplus[1] = sub;
@ -979,11 +951,11 @@ dummy_func(
frame->return_offset = INSTRUCTION_SIZE; frame->return_offset = INSTRUCTION_SIZE;
} }
macro(BINARY_SUBSCR_GETITEM) = macro(BINARY_OP_SUBSCR_GETITEM) =
unused/1 + // Skip over the counter unused/5 + // Skip over the counter and cache
_CHECK_PEP_523 + _CHECK_PEP_523 +
_BINARY_SUBSCR_CHECK_FUNC + _BINARY_OP_SUBSCR_CHECK_FUNC +
_BINARY_SUBSCR_INIT_CALL + _BINARY_OP_SUBSCR_INIT_CALL +
_PUSH_FRAME; _PUSH_FRAME;
inst(LIST_APPEND, (list, unused[oparg-1], v -- list, unused[oparg-1])) { 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); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter);
#endif /* ENABLE_SPECIALIZATION_FT */ #endif /* ENABLE_SPECIALIZATION_FT */
assert(NB_ADD <= oparg); assert(NB_ADD <= oparg);
assert(oparg <= NB_INPLACE_XOR); assert(oparg <= NB_OPARG_LAST);
} }
op(_BINARY_OP, (lhs, rhs -- res)) { op(_BINARY_OP, (lhs, rhs -- res)) {

View file

@ -362,6 +362,7 @@ const binaryfunc _PyEval_BinaryOps[] = {
[NB_INPLACE_SUBTRACT] = PyNumber_InPlaceSubtract, [NB_INPLACE_SUBTRACT] = PyNumber_InPlaceSubtract,
[NB_INPLACE_TRUE_DIVIDE] = PyNumber_InPlaceTrueDivide, [NB_INPLACE_TRUE_DIVIDE] = PyNumber_InPlaceTrueDivide,
[NB_INPLACE_XOR] = PyNumber_InPlaceXor, [NB_INPLACE_XOR] = PyNumber_InPlaceXor,
[NB_SUBSCR] = PyObject_GetItem,
}; };
const conversion_func _PyEval_ConversionFuncs[4] = { const conversion_func _PyEval_ConversionFuncs[4] = {

View file

@ -5076,7 +5076,7 @@ codegen_augassign(compiler *c, stmt_ty s)
VISIT(c, expr, e->v.Subscript.slice); VISIT(c, expr, e->v.Subscript.slice);
ADDOP_I(c, loc, COPY, 2); ADDOP_I(c, loc, COPY, 2);
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; break;
case Name_kind: case Name_kind:
@ -5242,7 +5242,6 @@ codegen_subscript(compiler *c, expr_ty e)
{ {
location loc = LOC(e); location loc = LOC(e);
expr_context_ty ctx = e->v.Subscript.ctx; expr_context_ty ctx = e->v.Subscript.ctx;
int op = 0;
if (ctx == Load) { if (ctx == Load) {
RETURN_IF_ERROR(check_subscripter(c, e->v.Subscript.value)); RETURN_IF_ERROR(check_subscripter(c, e->v.Subscript.value));
@ -5265,12 +5264,16 @@ codegen_subscript(compiler *c, expr_ty e)
else { else {
VISIT(c, expr, e->v.Subscript.slice); VISIT(c, expr, e->v.Subscript.slice);
switch (ctx) { switch (ctx) {
case Load: op = BINARY_SUBSCR; break; case Load:
case Store: op = STORE_SUBSCR; break; ADDOP_I(c, loc, BINARY_OP, NB_SUBSCR);
case Del: op = DELETE_SUBSCR; break; 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; return SUCCESS;
} }
@ -5502,7 +5505,7 @@ pattern_helper_sequence_unpack(compiler *c, location loc,
return SUCCESS; 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 // UNPACK_SEQUENCE / UNPACK_EX. This is more efficient for patterns with a
// starred wildcard like [first, *_] / [first, *_, last] / [*_, last] / etc. // starred wildcard like [first, *_] / [first, *_, last] / [*_, last] / etc.
static int 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_LOAD_CONST_NEW(c, loc, PyLong_FromSsize_t(size - i));
ADDOP_BINARY(c, loc, Sub); 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)); RETURN_IF_ERROR(codegen_pattern_subpattern(c, pattern, pc));
} }
// Pop the subject, we're done with it: // Pop the subject, we're done with it:

View file

@ -1029,31 +1029,6 @@
break; 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: { case _BINARY_SLICE: {
_PyStackRef stop; _PyStackRef stop;
_PyStackRef start; _PyStackRef start;
@ -1136,7 +1111,7 @@
break; break;
} }
case _BINARY_SUBSCR_LIST_INT: { case _BINARY_OP_SUBSCR_LIST_INT: {
_PyStackRef sub_st; _PyStackRef sub_st;
_PyStackRef list_st; _PyStackRef list_st;
_PyStackRef res; _PyStackRef res;
@ -1166,13 +1141,13 @@
UOP_STAT_INC(uopcode, miss); UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET(); JUMP_TO_JUMP_TARGET();
} }
STAT_INC(BINARY_SUBSCR, hit); STAT_INC(BINARY_OP, hit);
#else #else
if (index >= PyList_GET_SIZE(list)) { if (index >= PyList_GET_SIZE(list)) {
UOP_STAT_INC(uopcode, miss); UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET(); JUMP_TO_JUMP_TARGET();
} }
STAT_INC(BINARY_SUBSCR, hit); STAT_INC(BINARY_OP, hit);
PyObject *res_o = PyList_GET_ITEM(list, index); PyObject *res_o = PyList_GET_ITEM(list, index);
assert(res_o != NULL); assert(res_o != NULL);
Py_INCREF(res_o); Py_INCREF(res_o);
@ -1190,7 +1165,7 @@
break; break;
} }
case _BINARY_SUBSCR_STR_INT: { case _BINARY_OP_SUBSCR_STR_INT: {
_PyStackRef sub_st; _PyStackRef sub_st;
_PyStackRef str_st; _PyStackRef str_st;
_PyStackRef res; _PyStackRef res;
@ -1221,7 +1196,7 @@
UOP_STAT_INC(uopcode, miss); UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET(); JUMP_TO_JUMP_TARGET();
} }
STAT_INC(BINARY_SUBSCR, hit); STAT_INC(BINARY_OP, hit);
PyObject *res_o = (PyObject*)&_Py_SINGLETON(strings).ascii[c]; PyObject *res_o = (PyObject*)&_Py_SINGLETON(strings).ascii[c];
PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc); PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc);
stack_pointer += -2; stack_pointer += -2;
@ -1236,7 +1211,7 @@
break; break;
} }
case _BINARY_SUBSCR_TUPLE_INT: { case _BINARY_OP_SUBSCR_TUPLE_INT: {
_PyStackRef sub_st; _PyStackRef sub_st;
_PyStackRef tuple_st; _PyStackRef tuple_st;
_PyStackRef res; _PyStackRef res;
@ -1262,7 +1237,7 @@
UOP_STAT_INC(uopcode, miss); UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET(); JUMP_TO_JUMP_TARGET();
} }
STAT_INC(BINARY_SUBSCR, hit); STAT_INC(BINARY_OP, hit);
PyObject *res_o = PyTuple_GET_ITEM(tuple, index); PyObject *res_o = PyTuple_GET_ITEM(tuple, index);
assert(res_o != NULL); assert(res_o != NULL);
Py_INCREF(res_o); Py_INCREF(res_o);
@ -1279,7 +1254,7 @@
break; break;
} }
case _BINARY_SUBSCR_DICT: { case _BINARY_OP_SUBSCR_DICT: {
_PyStackRef sub_st; _PyStackRef sub_st;
_PyStackRef dict_st; _PyStackRef dict_st;
_PyStackRef res; _PyStackRef res;
@ -1291,7 +1266,7 @@
UOP_STAT_INC(uopcode, miss); UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET(); JUMP_TO_JUMP_TARGET();
} }
STAT_INC(BINARY_SUBSCR, hit); STAT_INC(BINARY_OP, hit);
PyObject *res_o; PyObject *res_o;
_PyFrame_SetStackPointer(frame, stack_pointer); _PyFrame_SetStackPointer(frame, stack_pointer);
int rc = PyDict_GetItemRef(dict, sub, &res_o); int rc = PyDict_GetItemRef(dict, sub, &res_o);
@ -1316,7 +1291,7 @@
break; break;
} }
case _BINARY_SUBSCR_CHECK_FUNC: { case _BINARY_OP_SUBSCR_CHECK_FUNC: {
_PyStackRef container; _PyStackRef container;
_PyStackRef getitem; _PyStackRef getitem;
container = stack_pointer[-2]; container = stack_pointer[-2];
@ -1344,14 +1319,14 @@
JUMP_TO_JUMP_TARGET(); JUMP_TO_JUMP_TARGET();
} }
getitem = PyStackRef_FromPyObjectNew(getitem_o); getitem = PyStackRef_FromPyObjectNew(getitem_o);
STAT_INC(BINARY_SUBSCR, hit); STAT_INC(BINARY_OP, hit);
stack_pointer[0] = getitem; stack_pointer[0] = getitem;
stack_pointer += 1; stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS()); assert(WITHIN_STACK_BOUNDS());
break; break;
} }
case _BINARY_SUBSCR_INIT_CALL: { case _BINARY_OP_SUBSCR_INIT_CALL: {
_PyStackRef getitem; _PyStackRef getitem;
_PyStackRef sub; _PyStackRef sub;
_PyStackRef container; _PyStackRef container;
@ -1362,7 +1337,7 @@
new_frame = _PyFrame_PushUnchecked(tstate, getitem, 2, frame); new_frame = _PyFrame_PushUnchecked(tstate, getitem, 2, frame);
new_frame->localsplus[0] = container; new_frame->localsplus[0] = container;
new_frame->localsplus[1] = sub; new_frame->localsplus[1] = sub;
frame->return_offset = 2 ; frame->return_offset = 6 ;
stack_pointer[-3].bits = (uintptr_t)new_frame; stack_pointer[-3].bits = (uintptr_t)new_frame;
stack_pointer += -2; stack_pointer += -2;
assert(WITHIN_STACK_BOUNDS()); assert(WITHIN_STACK_BOUNDS());

View file

@ -2,6 +2,7 @@
#include <stdbool.h> #include <stdbool.h>
#include "Python.h" #include "Python.h"
#include "opcode.h"
#include "pycore_flowgraph.h" #include "pycore_flowgraph.h"
#include "pycore_compile.h" #include "pycore_compile.h"
#include "pycore_intrinsics.h" #include "pycore_intrinsics.h"
@ -1492,10 +1493,14 @@ newop_from_folded(PyObject *newconst, PyObject *consts,
} }
static int 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]; 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; cfg_instr *arg, *idx;
if (!find_load_const_pair(bb, n-1, &arg, &idx)) { if (!find_load_const_pair(bb, n-1, &arg, &idx)) {
return SUCCESS; return SUCCESS;
@ -2033,8 +2038,8 @@ optimize_basic_block(PyObject *const_cache, basicblock *bb, PyObject *consts)
INSTR_SET_OP0(inst, NOP); INSTR_SET_OP0(inst, NOP);
} }
break; break;
case BINARY_SUBSCR: case BINARY_OP:
RETURN_IF_ERROR(optimize_if_const_subscr(bb, i, consts, const_cache)); RETURN_IF_ERROR(optimize_if_const_op(bb, i, consts, const_cache));
break; break;
} }
} }

View file

@ -50,7 +50,7 @@
ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter);
#endif /* ENABLE_SPECIALIZATION_FT */ #endif /* ENABLE_SPECIALIZATION_FT */
assert(NB_ADD <= oparg); assert(NB_ADD <= oparg);
assert(oparg <= NB_INPLACE_XOR); assert(oparg <= NB_OPARG_LAST);
} }
/* Skip 4 cache entries */ /* Skip 4 cache entries */
// _BINARY_OP // _BINARY_OP
@ -480,6 +480,328 @@
DISPATCH(); DISPATCH();
} }
TARGET(BINARY_OP_SUBSCR_DICT) {
#if defined(Py_TAIL_CALL_INTERP)
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_SUBSCR_DICT);
static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
_PyStackRef dict_st;
_PyStackRef sub_st;
_PyStackRef res;
/* 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_OP);
assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
JUMP_TO_PREDICTED(BINARY_OP);
}
STAT_INC(BINARY_OP, hit);
PyObject *res_o;
_PyFrame_SetStackPointer(frame, stack_pointer);
int rc = PyDict_GetItemRef(dict, sub, &res_o);
stack_pointer = _PyFrame_GetStackPointer(frame);
if (rc == 0) {
_PyFrame_SetStackPointer(frame, stack_pointer);
_PyErr_SetKeyError(sub);
stack_pointer = _PyFrame_GetStackPointer(frame);
}
PyStackRef_CLOSE(dict_st);
PyStackRef_CLOSE(sub_st);
if (rc <= 0) {
JUMP_TO_LABEL(pop_2_error);
}
// not found or error
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[-2] = res;
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
DISPATCH();
}
TARGET(BINARY_OP_SUBSCR_GETITEM) {
#if defined(Py_TAIL_CALL_INTERP)
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 += 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 5 cache entries */
// _CHECK_PEP_523
{
if (tstate->interp->eval_frame) {
UPDATE_MISS_STATS(BINARY_OP);
assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
JUMP_TO_PREDICTED(BINARY_OP);
}
}
// _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_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_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_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_OP);
assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
JUMP_TO_PREDICTED(BINARY_OP);
}
getitem = PyStackRef_FromPyObjectNew(getitem_o);
STAT_INC(BINARY_OP, hit);
}
// _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 = 6 ;
}
// _PUSH_FRAME
{
// Write it out explicitly because it's subtly different.
// Eventually this should be the only occurrence of this code.
assert(tstate->interp->eval_frame == NULL);
_PyInterpreterFrame *temp = new_frame;
stack_pointer += -2;
assert(WITHIN_STACK_BOUNDS());
_PyFrame_SetStackPointer(frame, stack_pointer);
assert(new_frame->previous == frame || new_frame->previous->previous == frame);
CALL_STAT_INC(inlined_py_calls);
frame = tstate->current_frame = temp;
tstate->py_recursion_remaining--;
LOAD_SP();
LOAD_IP(0);
LLTRACE_RESUME_FRAME();
}
DISPATCH();
}
TARGET(BINARY_OP_SUBSCR_LIST_INT) {
#if defined(Py_TAIL_CALL_INTERP)
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 += 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 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_OP);
assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
JUMP_TO_PREDICTED(BINARY_OP);
}
if (!PyList_CheckExact(list)) {
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_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
_PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = _PyList_GetItemRef((PyListObject*)list, index);
stack_pointer = _PyFrame_GetStackPointer(frame);
if (res_o == NULL) {
UPDATE_MISS_STATS(BINARY_OP);
assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
JUMP_TO_PREDICTED(BINARY_OP);
}
STAT_INC(BINARY_OP, hit);
#else
if (index >= PyList_GET_SIZE(list)) {
UPDATE_MISS_STATS(BINARY_OP);
assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
JUMP_TO_PREDICTED(BINARY_OP);
}
STAT_INC(BINARY_OP, hit);
PyObject *res_o = PyList_GET_ITEM(list, index);
assert(res_o != NULL);
Py_INCREF(res_o);
#endif
PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc);
stack_pointer += -2;
assert(WITHIN_STACK_BOUNDS());
_PyFrame_SetStackPointer(frame, stack_pointer);
PyStackRef_CLOSE(list_st);
stack_pointer = _PyFrame_GetStackPointer(frame);
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[0] = res;
stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
DISPATCH();
}
TARGET(BINARY_OP_SUBSCR_STR_INT) {
#if defined(Py_TAIL_CALL_INTERP)
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 += 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 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_OP);
assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
JUMP_TO_PREDICTED(BINARY_OP);
}
if (!PyUnicode_CheckExact(str)) {
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_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_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_OP);
assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
JUMP_TO_PREDICTED(BINARY_OP);
}
STAT_INC(BINARY_OP, hit);
PyObject *res_o = (PyObject*)&_Py_SINGLETON(strings).ascii[c];
PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc);
stack_pointer += -2;
assert(WITHIN_STACK_BOUNDS());
_PyFrame_SetStackPointer(frame, stack_pointer);
PyStackRef_CLOSE(str_st);
stack_pointer = _PyFrame_GetStackPointer(frame);
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[0] = res;
stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
DISPATCH();
}
TARGET(BINARY_OP_SUBSCR_TUPLE_INT) {
#if defined(Py_TAIL_CALL_INTERP)
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 += 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 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_OP);
assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
JUMP_TO_PREDICTED(BINARY_OP);
}
if (!PyTuple_CheckExact(tuple)) {
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_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_OP);
assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
JUMP_TO_PREDICTED(BINARY_OP);
}
STAT_INC(BINARY_OP, hit);
PyObject *res_o = PyTuple_GET_ITEM(tuple, index);
assert(res_o != NULL);
Py_INCREF(res_o);
PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc);
stack_pointer += -2;
assert(WITHIN_STACK_BOUNDS());
_PyFrame_SetStackPointer(frame, stack_pointer);
PyStackRef_CLOSE(tuple_st);
stack_pointer = _PyFrame_GetStackPointer(frame);
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[0] = res;
stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
DISPATCH();
}
TARGET(BINARY_OP_SUBTRACT_FLOAT) { TARGET(BINARY_OP_SUBTRACT_FLOAT) {
#if defined(Py_TAIL_CALL_INTERP) #if defined(Py_TAIL_CALL_INTERP)
int opcode = BINARY_OP_SUBTRACT_FLOAT; int opcode = BINARY_OP_SUBTRACT_FLOAT;
@ -647,381 +969,6 @@
DISPATCH(); 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 */
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);
}
STAT_INC(BINARY_SUBSCR, hit);
PyObject *res_o;
_PyFrame_SetStackPointer(frame, stack_pointer);
int rc = PyDict_GetItemRef(dict, sub, &res_o);
stack_pointer = _PyFrame_GetStackPointer(frame);
if (rc == 0) {
_PyFrame_SetStackPointer(frame, stack_pointer);
_PyErr_SetKeyError(sub);
stack_pointer = _PyFrame_GetStackPointer(frame);
}
PyStackRef_CLOSE(dict_st);
PyStackRef_CLOSE(sub_st);
if (rc <= 0) {
JUMP_TO_LABEL(pop_2_error);
}
// not found or error
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[-2] = res;
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
DISPATCH();
}
TARGET(BINARY_SUBSCR_GETITEM) {
#if defined(Py_TAIL_CALL_INTERP)
int opcode = BINARY_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");
_PyStackRef container;
_PyStackRef getitem;
_PyStackRef sub;
_PyInterpreterFrame *new_frame;
/* Skip 1 cache entry */
// _CHECK_PEP_523
{
if (tstate->interp->eval_frame) {
UPDATE_MISS_STATS(BINARY_SUBSCR);
assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
JUMP_TO_PREDICTED(BINARY_SUBSCR);
}
}
// _BINARY_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);
}
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);
}
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);
}
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);
}
getitem = PyStackRef_FromPyObjectNew(getitem_o);
STAT_INC(BINARY_SUBSCR, hit);
}
// _BINARY_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 ;
}
// _PUSH_FRAME
{
// Write it out explicitly because it's subtly different.
// Eventually this should be the only occurrence of this code.
assert(tstate->interp->eval_frame == NULL);
_PyInterpreterFrame *temp = new_frame;
stack_pointer += -2;
assert(WITHIN_STACK_BOUNDS());
_PyFrame_SetStackPointer(frame, stack_pointer);
assert(new_frame->previous == frame || new_frame->previous->previous == frame);
CALL_STAT_INC(inlined_py_calls);
frame = tstate->current_frame = temp;
tstate->py_recursion_remaining--;
LOAD_SP();
LOAD_IP(0);
LLTRACE_RESUME_FRAME();
}
DISPATCH();
}
TARGET(BINARY_SUBSCR_LIST_INT) {
#if defined(Py_TAIL_CALL_INTERP)
int opcode = BINARY_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");
_PyStackRef list_st;
_PyStackRef sub_st;
_PyStackRef res;
/* Skip 1 cache entry */
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);
}
if (!PyList_CheckExact(list)) {
UPDATE_MISS_STATS(BINARY_SUBSCR);
assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
JUMP_TO_PREDICTED(BINARY_SUBSCR);
}
// 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);
}
Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
#ifdef Py_GIL_DISABLED
_PyFrame_SetStackPointer(frame, stack_pointer);
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);
}
STAT_INC(BINARY_SUBSCR, hit);
#else
if (index >= PyList_GET_SIZE(list)) {
UPDATE_MISS_STATS(BINARY_SUBSCR);
assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
JUMP_TO_PREDICTED(BINARY_SUBSCR);
}
STAT_INC(BINARY_SUBSCR, hit);
PyObject *res_o = PyList_GET_ITEM(list, index);
assert(res_o != NULL);
Py_INCREF(res_o);
#endif
PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc);
stack_pointer += -2;
assert(WITHIN_STACK_BOUNDS());
_PyFrame_SetStackPointer(frame, stack_pointer);
PyStackRef_CLOSE(list_st);
stack_pointer = _PyFrame_GetStackPointer(frame);
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[0] = res;
stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
DISPATCH();
}
TARGET(BINARY_SUBSCR_STR_INT) {
#if defined(Py_TAIL_CALL_INTERP)
int opcode = BINARY_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");
_PyStackRef str_st;
_PyStackRef sub_st;
_PyStackRef res;
/* Skip 1 cache entry */
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);
}
if (!PyUnicode_CheckExact(str)) {
UPDATE_MISS_STATS(BINARY_SUBSCR);
assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
JUMP_TO_PREDICTED(BINARY_SUBSCR);
}
if (!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
UPDATE_MISS_STATS(BINARY_SUBSCR);
assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
JUMP_TO_PREDICTED(BINARY_SUBSCR);
}
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);
}
// 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);
}
STAT_INC(BINARY_SUBSCR, hit);
PyObject *res_o = (PyObject*)&_Py_SINGLETON(strings).ascii[c];
PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc);
stack_pointer += -2;
assert(WITHIN_STACK_BOUNDS());
_PyFrame_SetStackPointer(frame, stack_pointer);
PyStackRef_CLOSE(str_st);
stack_pointer = _PyFrame_GetStackPointer(frame);
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[0] = res;
stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
DISPATCH();
}
TARGET(BINARY_SUBSCR_TUPLE_INT) {
#if defined(Py_TAIL_CALL_INTERP)
int opcode = BINARY_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");
_PyStackRef tuple_st;
_PyStackRef sub_st;
_PyStackRef res;
/* Skip 1 cache entry */
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);
}
if (!PyTuple_CheckExact(tuple)) {
UPDATE_MISS_STATS(BINARY_SUBSCR);
assert(_PyOpcode_Deopt[opcode] == (BINARY_SUBSCR));
JUMP_TO_PREDICTED(BINARY_SUBSCR);
}
// 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);
}
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);
}
STAT_INC(BINARY_SUBSCR, hit);
PyObject *res_o = PyTuple_GET_ITEM(tuple, index);
assert(res_o != NULL);
Py_INCREF(res_o);
PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc);
stack_pointer += -2;
assert(WITHIN_STACK_BOUNDS());
_PyFrame_SetStackPointer(frame, stack_pointer);
PyStackRef_CLOSE(tuple_st);
stack_pointer = _PyFrame_GetStackPointer(frame);
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[0] = res;
stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
DISPATCH();
}
TARGET(BUILD_LIST) { TARGET(BUILD_LIST) {
#if defined(Py_TAIL_CALL_INTERP) #if defined(Py_TAIL_CALL_INTERP)
int opcode = BUILD_LIST; int opcode = BUILD_LIST;

View file

@ -2,9 +2,8 @@
static void *opcode_targets[256] = { static void *opcode_targets[256] = {
&&TARGET_CACHE, &&TARGET_CACHE,
&&TARGET_BINARY_SLICE, &&TARGET_BINARY_SLICE,
&&TARGET_BINARY_SUBSCR,
&&TARGET_BINARY_OP_INPLACE_ADD_UNICODE,
&&TARGET_CALL_FUNCTION_EX, &&TARGET_CALL_FUNCTION_EX,
&&TARGET_BINARY_OP_INPLACE_ADD_UNICODE,
&&TARGET_CHECK_EG_MATCH, &&TARGET_CHECK_EG_MATCH,
&&TARGET_CHECK_EXC_MATCH, &&TARGET_CHECK_EXC_MATCH,
&&TARGET_CLEANUP_THROW, &&TARGET_CLEANUP_THROW,
@ -17,8 +16,8 @@ static void *opcode_targets[256] = {
&&TARGET_FORMAT_WITH_SPEC, &&TARGET_FORMAT_WITH_SPEC,
&&TARGET_GET_AITER, &&TARGET_GET_AITER,
&&TARGET_GET_ANEXT, &&TARGET_GET_ANEXT,
&&TARGET_RESERVED,
&&TARGET_GET_ITER, &&TARGET_GET_ITER,
&&TARGET_RESERVED,
&&TARGET_GET_LEN, &&TARGET_GET_LEN,
&&TARGET_GET_YIELD_FROM_ITER, &&TARGET_GET_YIELD_FROM_ITER,
&&TARGET_INTERPRETER_EXIT, &&TARGET_INTERPRETER_EXIT,
@ -149,6 +148,7 @@ static void *opcode_targets[256] = {
&&_unknown_opcode, &&_unknown_opcode,
&&_unknown_opcode, &&_unknown_opcode,
&&_unknown_opcode, &&_unknown_opcode,
&&_unknown_opcode,
&&TARGET_RESUME, &&TARGET_RESUME,
&&TARGET_BINARY_OP_ADD_FLOAT, &&TARGET_BINARY_OP_ADD_FLOAT,
&&TARGET_BINARY_OP_ADD_INT, &&TARGET_BINARY_OP_ADD_INT,
@ -156,13 +156,13 @@ static void *opcode_targets[256] = {
&&TARGET_BINARY_OP_EXTEND, &&TARGET_BINARY_OP_EXTEND,
&&TARGET_BINARY_OP_MULTIPLY_FLOAT, &&TARGET_BINARY_OP_MULTIPLY_FLOAT,
&&TARGET_BINARY_OP_MULTIPLY_INT, &&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_FLOAT,
&&TARGET_BINARY_OP_SUBTRACT_INT, &&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_ALLOC_AND_ENTER_INIT,
&&TARGET_CALL_BOUND_METHOD_EXACT_ARGS, &&TARGET_CALL_BOUND_METHOD_EXACT_ARGS,
&&TARGET_CALL_BOUND_METHOD_GENERAL, &&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_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_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_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_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_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_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_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_MAP(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BUILD_SET(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_INPLACE_ADD_UNICODE] = _TAIL_CALL_BINARY_OP_INPLACE_ADD_UNICODE,
[BINARY_OP_MULTIPLY_FLOAT] = _TAIL_CALL_BINARY_OP_MULTIPLY_FLOAT, [BINARY_OP_MULTIPLY_FLOAT] = _TAIL_CALL_BINARY_OP_MULTIPLY_FLOAT,
[BINARY_OP_MULTIPLY_INT] = _TAIL_CALL_BINARY_OP_MULTIPLY_INT, [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_FLOAT] = _TAIL_CALL_BINARY_OP_SUBTRACT_FLOAT,
[BINARY_OP_SUBTRACT_INT] = _TAIL_CALL_BINARY_OP_SUBTRACT_INT, [BINARY_OP_SUBTRACT_INT] = _TAIL_CALL_BINARY_OP_SUBTRACT_INT,
[BINARY_SLICE] = _TAIL_CALL_BINARY_SLICE, [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_LIST] = _TAIL_CALL_BUILD_LIST,
[BUILD_MAP] = _TAIL_CALL_BUILD_MAP, [BUILD_MAP] = _TAIL_CALL_BUILD_MAP,
[BUILD_SET] = _TAIL_CALL_BUILD_SET, [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, [UNPACK_SEQUENCE_TWO_TUPLE] = _TAIL_CALL_UNPACK_SEQUENCE_TWO_TUPLE,
[WITH_EXCEPT_START] = _TAIL_CALL_WITH_EXCEPT_START, [WITH_EXCEPT_START] = _TAIL_CALL_WITH_EXCEPT_START,
[YIELD_VALUE] = _TAIL_CALL_YIELD_VALUE, [YIELD_VALUE] = _TAIL_CALL_YIELD_VALUE,
[117] = _TAIL_CALL_UNKNOWN_OPCODE,
[118] = _TAIL_CALL_UNKNOWN_OPCODE, [118] = _TAIL_CALL_UNKNOWN_OPCODE,
[119] = _TAIL_CALL_UNKNOWN_OPCODE, [119] = _TAIL_CALL_UNKNOWN_OPCODE,
[120] = _TAIL_CALL_UNKNOWN_OPCODE, [120] = _TAIL_CALL_UNKNOWN_OPCODE,

View file

@ -753,7 +753,7 @@ translate_bytecode_to_trace(
assert(i + 1 == nuops); assert(i + 1 == nuops);
if (opcode == FOR_ITER_GEN || if (opcode == FOR_ITER_GEN ||
opcode == LOAD_ATTR_PROPERTY || opcode == LOAD_ATTR_PROPERTY ||
opcode == BINARY_SUBSCR_GETITEM || opcode == BINARY_OP_SUBSCR_GETITEM ||
opcode == SEND_GEN) opcode == SEND_GEN)
{ {
DPRINTF(2, "Bailing due to dynamic target\n"); DPRINTF(2, "Bailing due to dynamic target\n");

View file

@ -384,7 +384,7 @@ dummy_func(void) {
GETLOCAL(this_instr->operand0) = res; 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; new_frame = NULL;
ctx->done = true; ctx->done = true;
} }

View file

@ -575,15 +575,6 @@
break; 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: { case _BINARY_SLICE: {
JitOptSymbol *res; JitOptSymbol *res;
res = sym_new_not_null(ctx); res = sym_new_not_null(ctx);
@ -599,7 +590,7 @@
break; break;
} }
case _BINARY_SUBSCR_LIST_INT: { case _BINARY_OP_SUBSCR_LIST_INT: {
JitOptSymbol *res; JitOptSymbol *res;
res = sym_new_not_null(ctx); res = sym_new_not_null(ctx);
stack_pointer[-2] = res; stack_pointer[-2] = res;
@ -608,7 +599,7 @@
break; break;
} }
case _BINARY_SUBSCR_STR_INT: { case _BINARY_OP_SUBSCR_STR_INT: {
JitOptSymbol *res; JitOptSymbol *res;
res = sym_new_not_null(ctx); res = sym_new_not_null(ctx);
stack_pointer[-2] = res; stack_pointer[-2] = res;
@ -617,7 +608,7 @@
break; break;
} }
case _BINARY_SUBSCR_TUPLE_INT: { case _BINARY_OP_SUBSCR_TUPLE_INT: {
JitOptSymbol *res; JitOptSymbol *res;
res = sym_new_not_null(ctx); res = sym_new_not_null(ctx);
stack_pointer[-2] = res; stack_pointer[-2] = res;
@ -626,7 +617,7 @@
break; break;
} }
case _BINARY_SUBSCR_DICT: { case _BINARY_OP_SUBSCR_DICT: {
JitOptSymbol *res; JitOptSymbol *res;
res = sym_new_not_null(ctx); res = sym_new_not_null(ctx);
stack_pointer[-2] = res; stack_pointer[-2] = res;
@ -635,7 +626,7 @@
break; break;
} }
case _BINARY_SUBSCR_CHECK_FUNC: { case _BINARY_OP_SUBSCR_CHECK_FUNC: {
JitOptSymbol *getitem; JitOptSymbol *getitem;
getitem = sym_new_not_null(ctx); getitem = sym_new_not_null(ctx);
stack_pointer[0] = getitem; stack_pointer[0] = getitem;
@ -644,7 +635,7 @@
break; break;
} }
case _BINARY_SUBSCR_INIT_CALL: { case _BINARY_OP_SUBSCR_INIT_CALL: {
_Py_UOpsAbstractFrame *new_frame; _Py_UOpsAbstractFrame *new_frame;
new_frame = NULL; new_frame = NULL;
ctx->done = true; ctx->done = true;

View file

@ -113,7 +113,6 @@ _Py_GetSpecializationStats(void) {
err += add_stat_dict(stats, LOAD_SUPER_ATTR, "load_super_attr"); 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_ATTR, "load_attr");
err += add_stat_dict(stats, LOAD_GLOBAL, "load_global"); 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_SUBSCR, "store_subscr");
err += add_stat_dict(stats, STORE_ATTR, "store_attr"); err += add_stat_dict(stats, STORE_ATTR, "store_attr");
err += add_stat_dict(stats, CALL, "call"); 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_INT 9
#define SPEC_FAIL_SUBSCR_ARRAY_SLICE 10 #define SPEC_FAIL_SUBSCR_ARRAY_SLICE 10
#define SPEC_FAIL_SUBSCR_LIST_SLICE 11 #define SPEC_FAIL_SUBSCR_LIST_SLICE 11
#define SPEC_FAIL_SUBSCR_TUPLE_SLICE 12 #define SPEC_FAIL_SUBSCR_BUFFER_INT 12
#define SPEC_FAIL_SUBSCR_STRING_SLICE 14 #define SPEC_FAIL_SUBSCR_BUFFER_SLICE 13
#define SPEC_FAIL_SUBSCR_BUFFER_INT 15
#define SPEC_FAIL_SUBSCR_BUFFER_SLICE 16
#define SPEC_FAIL_SUBSCR_SEQUENCE_INT 17
/* Store subscr */ /* Store subscr */
#define SPEC_FAIL_SUBSCR_BYTEARRAY_INT 18 #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_OR_DIFFERENT_TYPES 30
#define SPEC_FAIL_BINARY_OP_XOR_INT 31 #define SPEC_FAIL_BINARY_OP_XOR_INT 31
#define SPEC_FAIL_BINARY_OP_XOR_DIFFERENT_TYPES 32 #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 */ /* Calls */
@ -1761,37 +1762,6 @@ _Py_Specialize_LoadGlobal(
Py_END_CRITICAL_SECTION2(); 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 static int
function_kind(PyCodeObject *code) { function_kind(PyCodeObject *code) {
int flags = code->co_flags; int flags = code->co_flags;
@ -1837,107 +1807,6 @@ function_get_version(PyObject *o, int opcode)
return version; 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 #ifdef Py_STATS
static int static int
store_subscr_fail_kind(PyObject *container, PyObject *sub) 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_INT;
} }
return SPEC_FAIL_BINARY_OP_XOR; 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(); Py_UNREACHABLE();
} }
@ -2536,45 +2458,40 @@ LONG_FLOAT_ACTION(compactlong_float_multiply, *)
LONG_FLOAT_ACTION(compactlong_float_true_div, /) LONG_FLOAT_ACTION(compactlong_float_true_div, /)
#undef LONG_FLOAT_ACTION #undef LONG_FLOAT_ACTION
static _PyBinaryOpSpecializationDescr compactlongs_specs[NB_OPARG_LAST+1] = { static _PyBinaryOpSpecializationDescr binaryop_extend_descrs[] = {
[NB_OR] = {compactlongs_guard, compactlongs_or}, /* long-long arithmetic */
[NB_AND] = {compactlongs_guard, compactlongs_and}, {NB_OR, compactlongs_guard, compactlongs_or},
[NB_XOR] = {compactlongs_guard, compactlongs_xor}, {NB_AND, compactlongs_guard, compactlongs_and},
[NB_INPLACE_OR] = {compactlongs_guard, compactlongs_or}, {NB_XOR, compactlongs_guard, compactlongs_xor},
[NB_INPLACE_AND] = {compactlongs_guard, compactlongs_and}, {NB_INPLACE_OR, compactlongs_guard, compactlongs_or},
[NB_INPLACE_XOR] = {compactlongs_guard, compactlongs_xor}, {NB_INPLACE_AND, compactlongs_guard, compactlongs_and},
}; {NB_INPLACE_XOR, compactlongs_guard, compactlongs_xor},
static _PyBinaryOpSpecializationDescr float_compactlong_specs[NB_OPARG_LAST+1] = { /* float-long arithemetic */
[NB_ADD] = {float_compactlong_guard, float_compactlong_add}, {NB_ADD, float_compactlong_guard, float_compactlong_add},
[NB_SUBTRACT] = {float_compactlong_guard, float_compactlong_subtract}, {NB_SUBTRACT, float_compactlong_guard, float_compactlong_subtract},
[NB_TRUE_DIVIDE] = {nonzero_float_compactlong_guard, float_compactlong_true_div}, {NB_TRUE_DIVIDE, nonzero_float_compactlong_guard, float_compactlong_true_div},
[NB_MULTIPLY] = {float_compactlong_guard, float_compactlong_multiply}, {NB_MULTIPLY, float_compactlong_guard, float_compactlong_multiply},
};
static _PyBinaryOpSpecializationDescr compactlong_float_specs[NB_OPARG_LAST+1] = { /* float-float arithmetic */
[NB_ADD] = {compactlong_float_guard, compactlong_float_add}, {NB_ADD, compactlong_float_guard, compactlong_float_add},
[NB_SUBTRACT] = {compactlong_float_guard, compactlong_float_subtract}, {NB_SUBTRACT, compactlong_float_guard, compactlong_float_subtract},
[NB_TRUE_DIVIDE] = {nonzero_compactlong_float_guard, compactlong_float_true_div}, {NB_TRUE_DIVIDE, nonzero_compactlong_float_guard, compactlong_float_true_div},
[NB_MULTIPLY] = {compactlong_float_guard, compactlong_float_multiply}, {NB_MULTIPLY, compactlong_float_guard, compactlong_float_multiply},
}; };
static int static int
binary_op_extended_specialization(PyObject *lhs, PyObject *rhs, int oparg, binary_op_extended_specialization(PyObject *lhs, PyObject *rhs, int oparg,
_PyBinaryOpSpecializationDescr **descr) _PyBinaryOpSpecializationDescr **descr)
{ {
#define LOOKUP_SPEC(TABLE, OPARG) \ size_t n = sizeof(binaryop_extend_descrs)/sizeof(_PyBinaryOpSpecializationDescr);
if ((TABLE)[(OPARG)].action) { \ for (size_t i = 0; i < n; i++) {
if ((TABLE)[(OPARG)].guard(lhs, rhs)) { \ _PyBinaryOpSpecializationDescr *d = &binaryop_extend_descrs[i];
*descr = &((TABLE)[OPARG]); \ if (d->oparg == oparg && d->guard(lhs, rhs)) {
return 1; \ *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; return 0;
} }
@ -2645,6 +2562,47 @@ _Py_Specialize_BinaryOp(_PyStackRef lhs_st, _PyStackRef rhs_st, _Py_CODEUNIT *in
return; return;
} }
break; 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; _PyBinaryOpSpecializationDescr *descr;

View file

@ -381,9 +381,7 @@ Python/pylifecycle.c - INTERPRETER_TRAMPOLINE_CODEDEF -
Python/pystate.c - initial - Python/pystate.c - initial -
Python/specialize.c - adaptive_opcodes - Python/specialize.c - adaptive_opcodes -
Python/specialize.c - cache_requirements - Python/specialize.c - cache_requirements -
Python/specialize.c - compactlongs_specs - Python/specialize.c - binaryop_extend_descrs -
Python/specialize.c - float_compactlong_specs -
Python/specialize.c - compactlong_float_specs -
Python/stdlib_module_names.h - _Py_stdlib_module_names - Python/stdlib_module_names.h - _Py_stdlib_module_names -
Python/sysmodule.c - perf_map_state - Python/sysmodule.c - perf_map_state -
Python/sysmodule.c - _PySys_ImplCacheTag - Python/sysmodule.c - _PySys_ImplCacheTag -

Can't render this file because it has a wrong number of fields in line 4.