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