gh-105775: Convert LOAD_CLOSURE to a pseudo-op (#106059)

This enables super-instruction formation,
removal of checks for uninitialized variables,
and frees up an instruction.
This commit is contained in:
hms 2023-06-29 10:34:00 -06:00 committed by GitHub
parent 3c70d467c1
commit 8bff940ad6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 733 additions and 702 deletions

View file

@ -1291,18 +1291,6 @@ iterations of the loop.
.. versionadded:: 3.11 .. versionadded:: 3.11
.. opcode:: LOAD_CLOSURE (i)
Pushes a reference to the cell contained in slot ``i`` of the "fast locals"
storage. The name of the variable is ``co_fastlocalnames[i]``.
Note that ``LOAD_CLOSURE`` is effectively an alias for ``LOAD_FAST``.
It exists to keep bytecode a little more readable.
.. versionchanged:: 3.11
``i`` is no longer offset by the length of ``co_varnames``.
.. opcode:: LOAD_DEREF (i) .. opcode:: LOAD_DEREF (i)
Loads the cell contained in slot ``i`` of the "fast locals" storage. Loads the cell contained in slot ``i`` of the "fast locals" storage.
@ -1725,6 +1713,17 @@ but are replaced by real opcodes or removed before bytecode is generated.
Undirected relative jump instructions which are replaced by their Undirected relative jump instructions which are replaced by their
directed (forward/backward) counterparts by the assembler. directed (forward/backward) counterparts by the assembler.
.. opcode:: LOAD_CLOSURE (i)
Pushes a reference to the cell contained in slot ``i`` of the "fast locals"
storage.
Note that ``LOAD_CLOSURE`` is replaced with ``LOAD_FAST`` in the assembler.
.. versionchanged:: 3.13
This opcode is now a pseudo-instruction.
.. opcode:: LOAD_METHOD .. opcode:: LOAD_METHOD
Optimized unbound method lookup. Emitted as a ``LOAD_ATTR`` opcode Optimized unbound method lookup. Emitted as a ``LOAD_ATTR`` opcode

View file

@ -161,7 +161,6 @@ const uint8_t _PyOpcode_Deopt[256] = {
[LOAD_ATTR_SLOT] = LOAD_ATTR, [LOAD_ATTR_SLOT] = LOAD_ATTR,
[LOAD_ATTR_WITH_HINT] = LOAD_ATTR, [LOAD_ATTR_WITH_HINT] = LOAD_ATTR,
[LOAD_BUILD_CLASS] = LOAD_BUILD_CLASS, [LOAD_BUILD_CLASS] = LOAD_BUILD_CLASS,
[LOAD_CLOSURE] = LOAD_CLOSURE,
[LOAD_CONST] = LOAD_CONST, [LOAD_CONST] = LOAD_CONST,
[LOAD_DEREF] = LOAD_DEREF, [LOAD_DEREF] = LOAD_DEREF,
[LOAD_FAST] = LOAD_FAST, [LOAD_FAST] = LOAD_FAST,
@ -236,7 +235,7 @@ const uint8_t _PyOpcode_Deopt[256] = {
#endif // NEED_OPCODE_TABLES #endif // NEED_OPCODE_TABLES
#ifdef Py_DEBUG #ifdef Py_DEBUG
static const char *const _PyOpcode_OpName[267] = { static const char *const _PyOpcode_OpName[268] = {
[CACHE] = "CACHE", [CACHE] = "CACHE",
[POP_TOP] = "POP_TOP", [POP_TOP] = "POP_TOP",
[PUSH_NULL] = "PUSH_NULL", [PUSH_NULL] = "PUSH_NULL",
@ -373,7 +372,7 @@ static const char *const _PyOpcode_OpName[267] = {
[BUILD_SLICE] = "BUILD_SLICE", [BUILD_SLICE] = "BUILD_SLICE",
[JUMP_BACKWARD_NO_INTERRUPT] = "JUMP_BACKWARD_NO_INTERRUPT", [JUMP_BACKWARD_NO_INTERRUPT] = "JUMP_BACKWARD_NO_INTERRUPT",
[MAKE_CELL] = "MAKE_CELL", [MAKE_CELL] = "MAKE_CELL",
[LOAD_CLOSURE] = "LOAD_CLOSURE", [CALL_BUILTIN_FAST_WITH_KEYWORDS] = "CALL_BUILTIN_FAST_WITH_KEYWORDS",
[LOAD_DEREF] = "LOAD_DEREF", [LOAD_DEREF] = "LOAD_DEREF",
[STORE_DEREF] = "STORE_DEREF", [STORE_DEREF] = "STORE_DEREF",
[DELETE_DEREF] = "DELETE_DEREF", [DELETE_DEREF] = "DELETE_DEREF",
@ -385,26 +384,26 @@ static const char *const _PyOpcode_OpName[267] = {
[LIST_APPEND] = "LIST_APPEND", [LIST_APPEND] = "LIST_APPEND",
[SET_ADD] = "SET_ADD", [SET_ADD] = "SET_ADD",
[MAP_ADD] = "MAP_ADD", [MAP_ADD] = "MAP_ADD",
[CALL_BUILTIN_FAST_WITH_KEYWORDS] = "CALL_BUILTIN_FAST_WITH_KEYWORDS", [CALL_NO_KW_LEN] = "CALL_NO_KW_LEN",
[COPY_FREE_VARS] = "COPY_FREE_VARS", [COPY_FREE_VARS] = "COPY_FREE_VARS",
[YIELD_VALUE] = "YIELD_VALUE", [YIELD_VALUE] = "YIELD_VALUE",
[RESUME] = "RESUME", [RESUME] = "RESUME",
[MATCH_CLASS] = "MATCH_CLASS", [MATCH_CLASS] = "MATCH_CLASS",
[CALL_NO_KW_LEN] = "CALL_NO_KW_LEN",
[CALL_NO_KW_ISINSTANCE] = "CALL_NO_KW_ISINSTANCE", [CALL_NO_KW_ISINSTANCE] = "CALL_NO_KW_ISINSTANCE",
[CALL_NO_KW_LIST_APPEND] = "CALL_NO_KW_LIST_APPEND", [CALL_NO_KW_LIST_APPEND] = "CALL_NO_KW_LIST_APPEND",
[CALL_NO_KW_METHOD_DESCRIPTOR_O] = "CALL_NO_KW_METHOD_DESCRIPTOR_O",
[BUILD_CONST_KEY_MAP] = "BUILD_CONST_KEY_MAP", [BUILD_CONST_KEY_MAP] = "BUILD_CONST_KEY_MAP",
[BUILD_STRING] = "BUILD_STRING", [BUILD_STRING] = "BUILD_STRING",
[CONVERT_VALUE] = "CONVERT_VALUE", [CONVERT_VALUE] = "CONVERT_VALUE",
[CALL_NO_KW_METHOD_DESCRIPTOR_O] = "CALL_NO_KW_METHOD_DESCRIPTOR_O",
[CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS", [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS",
[CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = "CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS", [CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = "CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS",
[CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = "CALL_NO_KW_METHOD_DESCRIPTOR_FAST",
[LIST_EXTEND] = "LIST_EXTEND", [LIST_EXTEND] = "LIST_EXTEND",
[SET_UPDATE] = "SET_UPDATE", [SET_UPDATE] = "SET_UPDATE",
[DICT_MERGE] = "DICT_MERGE", [DICT_MERGE] = "DICT_MERGE",
[DICT_UPDATE] = "DICT_UPDATE", [DICT_UPDATE] = "DICT_UPDATE",
[CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = "CALL_NO_KW_METHOD_DESCRIPTOR_FAST",
[CALL_NO_KW_ALLOC_AND_ENTER_INIT] = "CALL_NO_KW_ALLOC_AND_ENTER_INIT", [CALL_NO_KW_ALLOC_AND_ENTER_INIT] = "CALL_NO_KW_ALLOC_AND_ENTER_INIT",
[167] = "<167>",
[LOAD_FAST_LOAD_FAST] = "LOAD_FAST_LOAD_FAST", [LOAD_FAST_LOAD_FAST] = "LOAD_FAST_LOAD_FAST",
[STORE_FAST_LOAD_FAST] = "STORE_FAST_LOAD_FAST", [STORE_FAST_LOAD_FAST] = "STORE_FAST_LOAD_FAST",
[STORE_FAST_STORE_FAST] = "STORE_FAST_STORE_FAST", [STORE_FAST_STORE_FAST] = "STORE_FAST_STORE_FAST",
@ -504,10 +503,12 @@ static const char *const _PyOpcode_OpName[267] = {
[LOAD_ZERO_SUPER_METHOD] = "LOAD_ZERO_SUPER_METHOD", [LOAD_ZERO_SUPER_METHOD] = "LOAD_ZERO_SUPER_METHOD",
[LOAD_ZERO_SUPER_ATTR] = "LOAD_ZERO_SUPER_ATTR", [LOAD_ZERO_SUPER_ATTR] = "LOAD_ZERO_SUPER_ATTR",
[STORE_FAST_MAYBE_NULL] = "STORE_FAST_MAYBE_NULL", [STORE_FAST_MAYBE_NULL] = "STORE_FAST_MAYBE_NULL",
[LOAD_CLOSURE] = "LOAD_CLOSURE",
}; };
#endif #endif
#define EXTRA_CASES \ #define EXTRA_CASES \
case 167: \
case 178: \ case 178: \
case 179: \ case 179: \
case 180: \ case 180: \

22
Include/opcode.h generated
View file

@ -93,7 +93,6 @@ extern "C" {
#define BUILD_SLICE 133 #define BUILD_SLICE 133
#define JUMP_BACKWARD_NO_INTERRUPT 134 #define JUMP_BACKWARD_NO_INTERRUPT 134
#define MAKE_CELL 135 #define MAKE_CELL 135
#define LOAD_CLOSURE 136
#define LOAD_DEREF 137 #define LOAD_DEREF 137
#define STORE_DEREF 138 #define STORE_DEREF 138
#define DELETE_DEREF 139 #define DELETE_DEREF 139
@ -158,7 +157,8 @@ extern "C" {
#define LOAD_ZERO_SUPER_METHOD 264 #define LOAD_ZERO_SUPER_METHOD 264
#define LOAD_ZERO_SUPER_ATTR 265 #define LOAD_ZERO_SUPER_ATTR 265
#define STORE_FAST_MAYBE_NULL 266 #define STORE_FAST_MAYBE_NULL 266
#define MAX_PSEUDO_OPCODE 266 #define LOAD_CLOSURE 267
#define MAX_PSEUDO_OPCODE 267
#define BINARY_OP_MULTIPLY_INT 6 #define BINARY_OP_MULTIPLY_INT 6
#define BINARY_OP_ADD_INT 7 #define BINARY_OP_ADD_INT 7
#define BINARY_OP_SUBTRACT_INT 8 #define BINARY_OP_SUBTRACT_INT 8
@ -210,15 +210,15 @@ extern "C" {
#define CALL_BUILTIN_CLASS 112 #define CALL_BUILTIN_CLASS 112
#define CALL_NO_KW_BUILTIN_O 113 #define CALL_NO_KW_BUILTIN_O 113
#define CALL_NO_KW_BUILTIN_FAST 132 #define CALL_NO_KW_BUILTIN_FAST 132
#define CALL_BUILTIN_FAST_WITH_KEYWORDS 148 #define CALL_BUILTIN_FAST_WITH_KEYWORDS 136
#define CALL_NO_KW_LEN 153 #define CALL_NO_KW_LEN 148
#define CALL_NO_KW_ISINSTANCE 154 #define CALL_NO_KW_ISINSTANCE 153
#define CALL_NO_KW_LIST_APPEND 155 #define CALL_NO_KW_LIST_APPEND 154
#define CALL_NO_KW_METHOD_DESCRIPTOR_O 159 #define CALL_NO_KW_METHOD_DESCRIPTOR_O 155
#define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 160 #define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 159
#define CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS 161 #define CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS 160
#define CALL_NO_KW_METHOD_DESCRIPTOR_FAST 166 #define CALL_NO_KW_METHOD_DESCRIPTOR_FAST 161
#define CALL_NO_KW_ALLOC_AND_ENTER_INIT 167 #define CALL_NO_KW_ALLOC_AND_ENTER_INIT 166
#define NB_ADD 0 #define NB_ADD 0
#define NB_AND 1 #define NB_AND 1

View file

@ -451,6 +451,7 @@ def _write_atomic(path, data, mode=0o666):
# Python 3.13a1 3553 (Add SET_FUNCTION_ATTRIBUTE) # Python 3.13a1 3553 (Add SET_FUNCTION_ATTRIBUTE)
# Python 3.13a1 3554 (more efficient bytecodes for f-strings) # Python 3.13a1 3554 (more efficient bytecodes for f-strings)
# Python 3.13a1 3555 (generate specialized opcodes metadata from bytecodes.c) # Python 3.13a1 3555 (generate specialized opcodes metadata from bytecodes.c)
# Python 3.13a1 3556 (Convert LOAD_CLOSURE to a pseudo-op)
# Python 3.14 will start with 3600 # Python 3.14 will start with 3600
@ -467,7 +468,7 @@ def _write_atomic(path, data, mode=0o666):
# Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array
# in PC/launcher.c must also be updated. # in PC/launcher.c must also be updated.
MAGIC_NUMBER = (3555).to_bytes(2, 'little') + b'\r\n' MAGIC_NUMBER = (3556).to_bytes(2, 'little') + b'\r\n'
_RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c

View file

@ -198,8 +198,6 @@ def pseudo_op(name, op, real_ops):
jrel_op('JUMP_BACKWARD_NO_INTERRUPT', 134) # Number of words to skip (backwards) jrel_op('JUMP_BACKWARD_NO_INTERRUPT', 134) # Number of words to skip (backwards)
def_op('MAKE_CELL', 135) def_op('MAKE_CELL', 135)
hasfree.append(135) hasfree.append(135)
def_op('LOAD_CLOSURE', 136)
hasfree.append(136)
def_op('LOAD_DEREF', 137) def_op('LOAD_DEREF', 137)
hasfree.append(137) hasfree.append(137)
def_op('STORE_DEREF', 138) def_op('STORE_DEREF', 138)
@ -293,6 +291,7 @@ def pseudo_op(name, op, real_ops):
pseudo_op('LOAD_ZERO_SUPER_ATTR', 265, ['LOAD_SUPER_ATTR']) pseudo_op('LOAD_ZERO_SUPER_ATTR', 265, ['LOAD_SUPER_ATTR'])
pseudo_op('STORE_FAST_MAYBE_NULL', 266, ['STORE_FAST']) pseudo_op('STORE_FAST_MAYBE_NULL', 266, ['STORE_FAST'])
pseudo_op('LOAD_CLOSURE', 267, ['LOAD_FAST'])
MAX_PSEUDO_OPCODE = MIN_PSEUDO_OPCODE + len(_pseudo_ops) - 1 MAX_PSEUDO_OPCODE = MIN_PSEUDO_OPCODE + len(_pseudo_ops) - 1

View file

@ -70,3 +70,41 @@ def test_simple_expr(self):
] ]
expected = {(3, 4) : 3.5, (-100, 200) : 50, (10, 18) : 14} expected = {(3, 4) : 3.5, (-100, 200) : 50, (10, 18) : 14}
self.assemble_test(insts, metadata, expected) self.assemble_test(insts, metadata, expected)
def test_expression_with_pseudo_instruction_load_closure(self):
def mod_two(x):
def inner():
return x
return inner() % 2
inner_code = mod_two.__code__.co_consts[1]
assert isinstance(inner_code, types.CodeType)
metadata = {
'filename' : 'mod_two.py',
'name' : 'mod_two',
'qualname' : 'nested.mod_two',
'cellvars' : {'x' : 0},
'consts': {None: 0, inner_code: 1, 2: 2},
'argcount' : 1,
'varnames' : {'x' : 0},
}
instructions = [
('RESUME', 0,),
('PUSH_NULL', 0, 1),
('LOAD_CLOSURE', 0, 1),
('BUILD_TUPLE', 1, 1),
('LOAD_CONST', 1, 1),
('MAKE_FUNCTION', 0, 2),
('SET_FUNCTION_ATTRIBUTE', 8, 2),
('CALL', 0, 2), # (lambda: x)()
('LOAD_CONST', 2, 2), # 2
('BINARY_OP', 6, 2), # %
('RETURN_VALUE', 0, 2)
]
expected = {(0,): 0, (1,): 1, (2,): 0, (120,): 0, (121,): 1}
self.assemble_test(instructions, metadata, expected)

View file

@ -685,7 +685,7 @@ def foo(x):
%3d RESUME 0 %3d RESUME 0
%3d LOAD_CLOSURE 0 (y) %3d LOAD_FAST 0 (y)
BUILD_TUPLE 1 BUILD_TUPLE 1
LOAD_CONST 1 (<code object foo at 0x..., file "%s", line %d>) LOAD_CONST 1 (<code object foo at 0x..., file "%s", line %d>)
MAKE_FUNCTION MAKE_FUNCTION
@ -709,7 +709,7 @@ def foo(x):
%3d RESUME 0 %3d RESUME 0
%3d LOAD_GLOBAL 1 (NULL + list) %3d LOAD_GLOBAL 1 (NULL + list)
LOAD_CLOSURE 0 (x) LOAD_FAST 0 (x)
BUILD_TUPLE 1 BUILD_TUPLE 1
LOAD_CONST 1 (<code object <genexpr> at 0x..., file "%s", line %d>) LOAD_CONST 1 (<code object <genexpr> at 0x..., file "%s", line %d>)
MAKE_FUNCTION MAKE_FUNCTION
@ -1596,8 +1596,8 @@ def _prepare_test_cases():
Instruction(opname='MAKE_CELL', opcode=135, arg=1, argval='b', argrepr='b', offset=2, start_offset=2, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='MAKE_CELL', opcode=135, arg=1, argval='b', argrepr='b', offset=2, start_offset=2, starts_line=None, is_jump_target=False, positions=None),
Instruction(opname='RESUME', opcode=151, arg=0, argval=0, argrepr='', offset=4, start_offset=4, starts_line=1, is_jump_target=False, positions=None), Instruction(opname='RESUME', opcode=151, arg=0, argval=0, argrepr='', offset=4, start_offset=4, starts_line=1, is_jump_target=False, positions=None),
Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=(3, 4), argrepr='(3, 4)', offset=6, start_offset=6, starts_line=2, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=(3, 4), argrepr='(3, 4)', offset=6, start_offset=6, starts_line=2, is_jump_target=False, positions=None),
Instruction(opname='LOAD_CLOSURE', opcode=136, arg=0, argval='a', argrepr='a', offset=8, start_offset=8, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='a', argrepr='a', offset=8, start_offset=8, starts_line=None, is_jump_target=False, positions=None),
Instruction(opname='LOAD_CLOSURE', opcode=136, arg=1, argval='b', argrepr='b', offset=10, start_offset=10, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_FAST', opcode=124, arg=1, argval='b', argrepr='b', offset=10, start_offset=10, starts_line=None, is_jump_target=False, positions=None),
Instruction(opname='BUILD_TUPLE', opcode=102, arg=2, argval=2, argrepr='', offset=12, start_offset=12, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='BUILD_TUPLE', opcode=102, arg=2, argval=2, argrepr='', offset=12, start_offset=12, starts_line=None, is_jump_target=False, positions=None),
Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=code_object_f, argrepr=repr(code_object_f), offset=14, start_offset=14, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=code_object_f, argrepr=repr(code_object_f), offset=14, start_offset=14, starts_line=None, is_jump_target=False, positions=None),
Instruction(opname='MAKE_FUNCTION', opcode=24, arg=None, argval=None, argrepr='', offset=16, start_offset=16, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='MAKE_FUNCTION', opcode=24, arg=None, argval=None, argrepr='', offset=16, start_offset=16, starts_line=None, is_jump_target=False, positions=None),
@ -1624,10 +1624,10 @@ def _prepare_test_cases():
Instruction(opname='MAKE_CELL', opcode=135, arg=1, argval='d', argrepr='d', offset=4, start_offset=4, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='MAKE_CELL', opcode=135, arg=1, argval='d', argrepr='d', offset=4, start_offset=4, starts_line=None, is_jump_target=False, positions=None),
Instruction(opname='RESUME', opcode=151, arg=0, argval=0, argrepr='', offset=6, start_offset=6, starts_line=2, is_jump_target=False, positions=None), Instruction(opname='RESUME', opcode=151, arg=0, argval=0, argrepr='', offset=6, start_offset=6, starts_line=2, is_jump_target=False, positions=None),
Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=(5, 6), argrepr='(5, 6)', offset=8, start_offset=8, starts_line=3, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=(5, 6), argrepr='(5, 6)', offset=8, start_offset=8, starts_line=3, is_jump_target=False, positions=None),
Instruction(opname='LOAD_CLOSURE', opcode=136, arg=3, argval='a', argrepr='a', offset=10, start_offset=10, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_FAST', opcode=124, arg=3, argval='a', argrepr='a', offset=10, start_offset=10, starts_line=None, is_jump_target=False, positions=None),
Instruction(opname='LOAD_CLOSURE', opcode=136, arg=4, argval='b', argrepr='b', offset=12, start_offset=12, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_FAST', opcode=124, arg=4, argval='b', argrepr='b', offset=12, start_offset=12, starts_line=None, is_jump_target=False, positions=None),
Instruction(opname='LOAD_CLOSURE', opcode=136, arg=0, argval='c', argrepr='c', offset=14, start_offset=14, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='c', argrepr='c', offset=14, start_offset=14, starts_line=None, is_jump_target=False, positions=None),
Instruction(opname='LOAD_CLOSURE', opcode=136, arg=1, argval='d', argrepr='d', offset=16, start_offset=16, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_FAST', opcode=124, arg=1, argval='d', argrepr='d', offset=16, start_offset=16, starts_line=None, is_jump_target=False, positions=None),
Instruction(opname='BUILD_TUPLE', opcode=102, arg=4, argval=4, argrepr='', offset=18, start_offset=18, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='BUILD_TUPLE', opcode=102, arg=4, argval=4, argrepr='', offset=18, start_offset=18, starts_line=None, is_jump_target=False, positions=None),
Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=code_object_inner, argrepr=repr(code_object_inner), offset=20, start_offset=20, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=code_object_inner, argrepr=repr(code_object_inner), offset=20, start_offset=20, starts_line=None, is_jump_target=False, positions=None),
Instruction(opname='MAKE_FUNCTION', opcode=24, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='MAKE_FUNCTION', opcode=24, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=None, is_jump_target=False, positions=None),

View file

@ -0,0 +1 @@
:opcode:`LOAD_CLOSURE` is now a pseudo-op.

View file

@ -1270,6 +1270,7 @@ static PYC_MAGIC magic_values[] = {
/* Allow 50 magic numbers per version from here on */ /* Allow 50 magic numbers per version from here on */
{ 3450, 3499, L"3.11" }, { 3450, 3499, L"3.11" },
{ 3500, 3549, L"3.12" }, { 3500, 3549, L"3.12" },
{ 3550, 3599, L"3.13" },
{ 0 } { 0 }
}; };

View file

@ -175,12 +175,9 @@ dummy_func(
} }
} }
inst(LOAD_CLOSURE, (-- value)) { pseudo(LOAD_CLOSURE) = {
/* We keep LOAD_CLOSURE so that the bytecode stays more readable. */ LOAD_FAST,
value = GETLOCAL(oparg); };
ERROR_IF(value == NULL, unbound_local_error);
Py_INCREF(value);
}
inst(LOAD_FAST_CHECK, (-- value)) { inst(LOAD_FAST_CHECK, (-- value)) {
value = GETLOCAL(oparg); value = GETLOCAL(oparg);

View file

@ -836,6 +836,8 @@ stack_effect(int opcode, int oparg, int jump)
case STORE_FAST_MAYBE_NULL: case STORE_FAST_MAYBE_NULL:
return -1; return -1;
case LOAD_CLOSURE:
return 1;
case LOAD_METHOD: case LOAD_METHOD:
return 1; return 1;
case LOAD_SUPER_METHOD: case LOAD_SUPER_METHOD:

View file

@ -9,7 +9,7 @@
case LOAD_FAST: { case LOAD_FAST: {
PyObject *value; PyObject *value;
#line 192 "Python/bytecodes.c" #line 189 "Python/bytecodes.c"
value = GETLOCAL(oparg); value = GETLOCAL(oparg);
assert(value != NULL); assert(value != NULL);
Py_INCREF(value); Py_INCREF(value);
@ -21,7 +21,7 @@
case LOAD_FAST_AND_CLEAR: { case LOAD_FAST_AND_CLEAR: {
PyObject *value; PyObject *value;
#line 198 "Python/bytecodes.c" #line 195 "Python/bytecodes.c"
value = GETLOCAL(oparg); value = GETLOCAL(oparg);
// do not use SETLOCAL here, it decrefs the old value // do not use SETLOCAL here, it decrefs the old value
GETLOCAL(oparg) = NULL; GETLOCAL(oparg) = NULL;
@ -33,7 +33,7 @@
case LOAD_CONST: { case LOAD_CONST: {
PyObject *value; PyObject *value;
#line 213 "Python/bytecodes.c" #line 210 "Python/bytecodes.c"
value = GETITEM(FRAME_CO_CONSTS, oparg); value = GETITEM(FRAME_CO_CONSTS, oparg);
Py_INCREF(value); Py_INCREF(value);
#line 40 "Python/executor_cases.c.h" #line 40 "Python/executor_cases.c.h"
@ -44,7 +44,7 @@
case STORE_FAST: { case STORE_FAST: {
PyObject *value = stack_pointer[-1]; PyObject *value = stack_pointer[-1];
#line 218 "Python/bytecodes.c" #line 215 "Python/bytecodes.c"
SETLOCAL(oparg, value); SETLOCAL(oparg, value);
#line 50 "Python/executor_cases.c.h" #line 50 "Python/executor_cases.c.h"
STACK_SHRINK(1); STACK_SHRINK(1);
@ -53,7 +53,7 @@
case POP_TOP: { case POP_TOP: {
PyObject *value = stack_pointer[-1]; PyObject *value = stack_pointer[-1];
#line 241 "Python/bytecodes.c" #line 238 "Python/bytecodes.c"
#line 58 "Python/executor_cases.c.h" #line 58 "Python/executor_cases.c.h"
Py_DECREF(value); Py_DECREF(value);
STACK_SHRINK(1); STACK_SHRINK(1);
@ -62,7 +62,7 @@
case PUSH_NULL: { case PUSH_NULL: {
PyObject *res; PyObject *res;
#line 245 "Python/bytecodes.c" #line 242 "Python/bytecodes.c"
res = NULL; res = NULL;
#line 68 "Python/executor_cases.c.h" #line 68 "Python/executor_cases.c.h"
STACK_GROW(1); STACK_GROW(1);
@ -73,7 +73,7 @@
case END_SEND: { case END_SEND: {
PyObject *value = stack_pointer[-1]; PyObject *value = stack_pointer[-1];
PyObject *receiver = stack_pointer[-2]; PyObject *receiver = stack_pointer[-2];
#line 264 "Python/bytecodes.c" #line 261 "Python/bytecodes.c"
Py_DECREF(receiver); Py_DECREF(receiver);
#line 79 "Python/executor_cases.c.h" #line 79 "Python/executor_cases.c.h"
STACK_SHRINK(1); STACK_SHRINK(1);
@ -84,11 +84,11 @@
case UNARY_NEGATIVE: { case UNARY_NEGATIVE: {
PyObject *value = stack_pointer[-1]; PyObject *value = stack_pointer[-1];
PyObject *res; PyObject *res;
#line 279 "Python/bytecodes.c" #line 276 "Python/bytecodes.c"
res = PyNumber_Negative(value); res = PyNumber_Negative(value);
#line 90 "Python/executor_cases.c.h" #line 90 "Python/executor_cases.c.h"
Py_DECREF(value); Py_DECREF(value);
#line 281 "Python/bytecodes.c" #line 278 "Python/bytecodes.c"
if (res == NULL) goto pop_1_error; if (res == NULL) goto pop_1_error;
#line 94 "Python/executor_cases.c.h" #line 94 "Python/executor_cases.c.h"
stack_pointer[-1] = res; stack_pointer[-1] = res;
@ -98,11 +98,11 @@
case UNARY_NOT: { case UNARY_NOT: {
PyObject *value = stack_pointer[-1]; PyObject *value = stack_pointer[-1];
PyObject *res; PyObject *res;
#line 285 "Python/bytecodes.c" #line 282 "Python/bytecodes.c"
int err = PyObject_IsTrue(value); int err = PyObject_IsTrue(value);
#line 104 "Python/executor_cases.c.h" #line 104 "Python/executor_cases.c.h"
Py_DECREF(value); Py_DECREF(value);
#line 287 "Python/bytecodes.c" #line 284 "Python/bytecodes.c"
if (err < 0) goto pop_1_error; if (err < 0) goto pop_1_error;
if (err == 0) { if (err == 0) {
res = Py_True; res = Py_True;
@ -118,11 +118,11 @@
case UNARY_INVERT: { case UNARY_INVERT: {
PyObject *value = stack_pointer[-1]; PyObject *value = stack_pointer[-1];
PyObject *res; PyObject *res;
#line 297 "Python/bytecodes.c" #line 294 "Python/bytecodes.c"
res = PyNumber_Invert(value); res = PyNumber_Invert(value);
#line 124 "Python/executor_cases.c.h" #line 124 "Python/executor_cases.c.h"
Py_DECREF(value); Py_DECREF(value);
#line 299 "Python/bytecodes.c" #line 296 "Python/bytecodes.c"
if (res == NULL) goto pop_1_error; if (res == NULL) goto pop_1_error;
#line 128 "Python/executor_cases.c.h" #line 128 "Python/executor_cases.c.h"
stack_pointer[-1] = res; stack_pointer[-1] = res;
@ -132,7 +132,7 @@
case _GUARD_BOTH_INT: { case _GUARD_BOTH_INT: {
PyObject *right = stack_pointer[-1]; PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2]; PyObject *left = stack_pointer[-2];
#line 315 "Python/bytecodes.c" #line 312 "Python/bytecodes.c"
DEOPT_IF(!PyLong_CheckExact(left), BINARY_OP); DEOPT_IF(!PyLong_CheckExact(left), BINARY_OP);
DEOPT_IF(!PyLong_CheckExact(right), BINARY_OP); DEOPT_IF(!PyLong_CheckExact(right), BINARY_OP);
#line 139 "Python/executor_cases.c.h" #line 139 "Python/executor_cases.c.h"
@ -143,7 +143,7 @@
PyObject *right = stack_pointer[-1]; PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2]; PyObject *left = stack_pointer[-2];
PyObject *res; PyObject *res;
#line 320 "Python/bytecodes.c" #line 317 "Python/bytecodes.c"
STAT_INC(BINARY_OP, hit); STAT_INC(BINARY_OP, hit);
res = _PyLong_Multiply((PyLongObject *)left, (PyLongObject *)right); res = _PyLong_Multiply((PyLongObject *)left, (PyLongObject *)right);
_Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free); _Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free);
@ -159,7 +159,7 @@
PyObject *right = stack_pointer[-1]; PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2]; PyObject *left = stack_pointer[-2];
PyObject *res; PyObject *res;
#line 328 "Python/bytecodes.c" #line 325 "Python/bytecodes.c"
STAT_INC(BINARY_OP, hit); STAT_INC(BINARY_OP, hit);
res = _PyLong_Add((PyLongObject *)left, (PyLongObject *)right); res = _PyLong_Add((PyLongObject *)left, (PyLongObject *)right);
_Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free); _Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free);
@ -175,7 +175,7 @@
PyObject *right = stack_pointer[-1]; PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2]; PyObject *left = stack_pointer[-2];
PyObject *res; PyObject *res;
#line 336 "Python/bytecodes.c" #line 333 "Python/bytecodes.c"
STAT_INC(BINARY_OP, hit); STAT_INC(BINARY_OP, hit);
res = _PyLong_Subtract((PyLongObject *)left, (PyLongObject *)right); res = _PyLong_Subtract((PyLongObject *)left, (PyLongObject *)right);
_Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free); _Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free);
@ -190,7 +190,7 @@
case _GUARD_BOTH_FLOAT: { case _GUARD_BOTH_FLOAT: {
PyObject *right = stack_pointer[-1]; PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2]; PyObject *left = stack_pointer[-2];
#line 351 "Python/bytecodes.c" #line 348 "Python/bytecodes.c"
DEOPT_IF(!PyFloat_CheckExact(left), BINARY_OP); DEOPT_IF(!PyFloat_CheckExact(left), BINARY_OP);
DEOPT_IF(!PyFloat_CheckExact(right), BINARY_OP); DEOPT_IF(!PyFloat_CheckExact(right), BINARY_OP);
#line 197 "Python/executor_cases.c.h" #line 197 "Python/executor_cases.c.h"
@ -201,7 +201,7 @@
PyObject *right = stack_pointer[-1]; PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2]; PyObject *left = stack_pointer[-2];
PyObject *res; PyObject *res;
#line 356 "Python/bytecodes.c" #line 353 "Python/bytecodes.c"
STAT_INC(BINARY_OP, hit); STAT_INC(BINARY_OP, hit);
double dres = double dres =
((PyFloatObject *)left)->ob_fval * ((PyFloatObject *)left)->ob_fval *
@ -217,7 +217,7 @@
PyObject *right = stack_pointer[-1]; PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2]; PyObject *left = stack_pointer[-2];
PyObject *res; PyObject *res;
#line 364 "Python/bytecodes.c" #line 361 "Python/bytecodes.c"
STAT_INC(BINARY_OP, hit); STAT_INC(BINARY_OP, hit);
double dres = double dres =
((PyFloatObject *)left)->ob_fval + ((PyFloatObject *)left)->ob_fval +
@ -233,7 +233,7 @@
PyObject *right = stack_pointer[-1]; PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2]; PyObject *left = stack_pointer[-2];
PyObject *res; PyObject *res;
#line 372 "Python/bytecodes.c" #line 369 "Python/bytecodes.c"
STAT_INC(BINARY_OP, hit); STAT_INC(BINARY_OP, hit);
double dres = double dres =
((PyFloatObject *)left)->ob_fval - ((PyFloatObject *)left)->ob_fval -
@ -248,7 +248,7 @@
case _GUARD_BOTH_UNICODE: { case _GUARD_BOTH_UNICODE: {
PyObject *right = stack_pointer[-1]; PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2]; PyObject *left = stack_pointer[-2];
#line 387 "Python/bytecodes.c" #line 384 "Python/bytecodes.c"
DEOPT_IF(!PyUnicode_CheckExact(left), BINARY_OP); DEOPT_IF(!PyUnicode_CheckExact(left), BINARY_OP);
DEOPT_IF(!PyUnicode_CheckExact(right), BINARY_OP); DEOPT_IF(!PyUnicode_CheckExact(right), BINARY_OP);
#line 255 "Python/executor_cases.c.h" #line 255 "Python/executor_cases.c.h"
@ -259,7 +259,7 @@
PyObject *right = stack_pointer[-1]; PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2]; PyObject *left = stack_pointer[-2];
PyObject *res; PyObject *res;
#line 392 "Python/bytecodes.c" #line 389 "Python/bytecodes.c"
STAT_INC(BINARY_OP, hit); STAT_INC(BINARY_OP, hit);
res = PyUnicode_Concat(left, right); res = PyUnicode_Concat(left, right);
_Py_DECREF_SPECIALIZED(left, _PyUnicode_ExactDealloc); _Py_DECREF_SPECIALIZED(left, _PyUnicode_ExactDealloc);
@ -276,7 +276,7 @@
PyObject *start = stack_pointer[-2]; PyObject *start = stack_pointer[-2];
PyObject *container = stack_pointer[-3]; PyObject *container = stack_pointer[-3];
PyObject *res; PyObject *res;
#line 462 "Python/bytecodes.c" #line 459 "Python/bytecodes.c"
PyObject *slice = _PyBuildSlice_ConsumeRefs(start, stop); PyObject *slice = _PyBuildSlice_ConsumeRefs(start, stop);
// Can't use ERROR_IF() here, because we haven't // Can't use ERROR_IF() here, because we haven't
// DECREF'ed container yet, and we still own slice. // DECREF'ed container yet, and we still own slice.
@ -300,7 +300,7 @@
PyObject *start = stack_pointer[-2]; PyObject *start = stack_pointer[-2];
PyObject *container = stack_pointer[-3]; PyObject *container = stack_pointer[-3];
PyObject *v = stack_pointer[-4]; PyObject *v = stack_pointer[-4];
#line 477 "Python/bytecodes.c" #line 474 "Python/bytecodes.c"
PyObject *slice = _PyBuildSlice_ConsumeRefs(start, stop); PyObject *slice = _PyBuildSlice_ConsumeRefs(start, stop);
int err; int err;
if (slice == NULL) { if (slice == NULL) {
@ -322,7 +322,7 @@
PyObject *sub = stack_pointer[-1]; PyObject *sub = stack_pointer[-1];
PyObject *list = stack_pointer[-2]; PyObject *list = stack_pointer[-2];
PyObject *res; PyObject *res;
#line 492 "Python/bytecodes.c" #line 489 "Python/bytecodes.c"
DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR); DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR);
DEOPT_IF(!PyList_CheckExact(list), BINARY_SUBSCR); DEOPT_IF(!PyList_CheckExact(list), BINARY_SUBSCR);
@ -346,7 +346,7 @@
PyObject *sub = stack_pointer[-1]; PyObject *sub = stack_pointer[-1];
PyObject *tuple = stack_pointer[-2]; PyObject *tuple = stack_pointer[-2];
PyObject *res; PyObject *res;
#line 508 "Python/bytecodes.c" #line 505 "Python/bytecodes.c"
DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR); DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR);
DEOPT_IF(!PyTuple_CheckExact(tuple), BINARY_SUBSCR); DEOPT_IF(!PyTuple_CheckExact(tuple), BINARY_SUBSCR);
@ -370,7 +370,7 @@
PyObject *sub = stack_pointer[-1]; PyObject *sub = stack_pointer[-1];
PyObject *dict = stack_pointer[-2]; PyObject *dict = stack_pointer[-2];
PyObject *res; PyObject *res;
#line 524 "Python/bytecodes.c" #line 521 "Python/bytecodes.c"
DEOPT_IF(!PyDict_CheckExact(dict), BINARY_SUBSCR); DEOPT_IF(!PyDict_CheckExact(dict), BINARY_SUBSCR);
STAT_INC(BINARY_SUBSCR, hit); STAT_INC(BINARY_SUBSCR, hit);
res = PyDict_GetItemWithError(dict, sub); res = PyDict_GetItemWithError(dict, sub);
@ -381,7 +381,7 @@
#line 382 "Python/executor_cases.c.h" #line 382 "Python/executor_cases.c.h"
Py_DECREF(dict); Py_DECREF(dict);
Py_DECREF(sub); Py_DECREF(sub);
#line 532 "Python/bytecodes.c" #line 529 "Python/bytecodes.c"
if (true) goto pop_2_error; if (true) goto pop_2_error;
} }
Py_INCREF(res); // Do this before DECREF'ing dict, sub Py_INCREF(res); // Do this before DECREF'ing dict, sub
@ -396,7 +396,7 @@
case LIST_APPEND: { case LIST_APPEND: {
PyObject *v = stack_pointer[-1]; PyObject *v = stack_pointer[-1];
PyObject *list = stack_pointer[-(2 + (oparg-1))]; PyObject *list = stack_pointer[-(2 + (oparg-1))];
#line 564 "Python/bytecodes.c" #line 561 "Python/bytecodes.c"
if (_PyList_AppendTakeRef((PyListObject *)list, v) < 0) goto pop_1_error; if (_PyList_AppendTakeRef((PyListObject *)list, v) < 0) goto pop_1_error;
#line 402 "Python/executor_cases.c.h" #line 402 "Python/executor_cases.c.h"
STACK_SHRINK(1); STACK_SHRINK(1);
@ -406,11 +406,11 @@
case SET_ADD: { case SET_ADD: {
PyObject *v = stack_pointer[-1]; PyObject *v = stack_pointer[-1];
PyObject *set = stack_pointer[-(2 + (oparg-1))]; PyObject *set = stack_pointer[-(2 + (oparg-1))];
#line 568 "Python/bytecodes.c" #line 565 "Python/bytecodes.c"
int err = PySet_Add(set, v); int err = PySet_Add(set, v);
#line 412 "Python/executor_cases.c.h" #line 412 "Python/executor_cases.c.h"
Py_DECREF(v); Py_DECREF(v);
#line 570 "Python/bytecodes.c" #line 567 "Python/bytecodes.c"
if (err) goto pop_1_error; if (err) goto pop_1_error;
#line 416 "Python/executor_cases.c.h" #line 416 "Python/executor_cases.c.h"
STACK_SHRINK(1); STACK_SHRINK(1);
@ -421,7 +421,7 @@
PyObject *sub = stack_pointer[-1]; PyObject *sub = stack_pointer[-1];
PyObject *list = stack_pointer[-2]; PyObject *list = stack_pointer[-2];
PyObject *value = stack_pointer[-3]; PyObject *value = stack_pointer[-3];
#line 599 "Python/bytecodes.c" #line 596 "Python/bytecodes.c"
DEOPT_IF(!PyLong_CheckExact(sub), STORE_SUBSCR); DEOPT_IF(!PyLong_CheckExact(sub), STORE_SUBSCR);
DEOPT_IF(!PyList_CheckExact(list), STORE_SUBSCR); DEOPT_IF(!PyList_CheckExact(list), STORE_SUBSCR);
@ -447,7 +447,7 @@
PyObject *sub = stack_pointer[-1]; PyObject *sub = stack_pointer[-1];
PyObject *dict = stack_pointer[-2]; PyObject *dict = stack_pointer[-2];
PyObject *value = stack_pointer[-3]; PyObject *value = stack_pointer[-3];
#line 618 "Python/bytecodes.c" #line 615 "Python/bytecodes.c"
DEOPT_IF(!PyDict_CheckExact(dict), STORE_SUBSCR); DEOPT_IF(!PyDict_CheckExact(dict), STORE_SUBSCR);
STAT_INC(STORE_SUBSCR, hit); STAT_INC(STORE_SUBSCR, hit);
int err = _PyDict_SetItem_Take2((PyDictObject *)dict, sub, value); int err = _PyDict_SetItem_Take2((PyDictObject *)dict, sub, value);
@ -461,13 +461,13 @@
case DELETE_SUBSCR: { case DELETE_SUBSCR: {
PyObject *sub = stack_pointer[-1]; PyObject *sub = stack_pointer[-1];
PyObject *container = stack_pointer[-2]; PyObject *container = stack_pointer[-2];
#line 626 "Python/bytecodes.c" #line 623 "Python/bytecodes.c"
/* del container[sub] */ /* del container[sub] */
int err = PyObject_DelItem(container, sub); int err = PyObject_DelItem(container, sub);
#line 468 "Python/executor_cases.c.h" #line 468 "Python/executor_cases.c.h"
Py_DECREF(container); Py_DECREF(container);
Py_DECREF(sub); Py_DECREF(sub);
#line 629 "Python/bytecodes.c" #line 626 "Python/bytecodes.c"
if (err) goto pop_2_error; if (err) goto pop_2_error;
#line 473 "Python/executor_cases.c.h" #line 473 "Python/executor_cases.c.h"
STACK_SHRINK(2); STACK_SHRINK(2);
@ -477,12 +477,12 @@
case CALL_INTRINSIC_1: { case CALL_INTRINSIC_1: {
PyObject *value = stack_pointer[-1]; PyObject *value = stack_pointer[-1];
PyObject *res; PyObject *res;
#line 633 "Python/bytecodes.c" #line 630 "Python/bytecodes.c"
assert(oparg <= MAX_INTRINSIC_1); assert(oparg <= MAX_INTRINSIC_1);
res = _PyIntrinsics_UnaryFunctions[oparg](tstate, value); res = _PyIntrinsics_UnaryFunctions[oparg](tstate, value);
#line 484 "Python/executor_cases.c.h" #line 484 "Python/executor_cases.c.h"
Py_DECREF(value); Py_DECREF(value);
#line 636 "Python/bytecodes.c" #line 633 "Python/bytecodes.c"
if (res == NULL) goto pop_1_error; if (res == NULL) goto pop_1_error;
#line 488 "Python/executor_cases.c.h" #line 488 "Python/executor_cases.c.h"
stack_pointer[-1] = res; stack_pointer[-1] = res;
@ -493,13 +493,13 @@
PyObject *value1 = stack_pointer[-1]; PyObject *value1 = stack_pointer[-1];
PyObject *value2 = stack_pointer[-2]; PyObject *value2 = stack_pointer[-2];
PyObject *res; PyObject *res;
#line 640 "Python/bytecodes.c" #line 637 "Python/bytecodes.c"
assert(oparg <= MAX_INTRINSIC_2); assert(oparg <= MAX_INTRINSIC_2);
res = _PyIntrinsics_BinaryFunctions[oparg](tstate, value2, value1); res = _PyIntrinsics_BinaryFunctions[oparg](tstate, value2, value1);
#line 500 "Python/executor_cases.c.h" #line 500 "Python/executor_cases.c.h"
Py_DECREF(value2); Py_DECREF(value2);
Py_DECREF(value1); Py_DECREF(value1);
#line 643 "Python/bytecodes.c" #line 640 "Python/bytecodes.c"
if (res == NULL) goto pop_2_error; if (res == NULL) goto pop_2_error;
#line 505 "Python/executor_cases.c.h" #line 505 "Python/executor_cases.c.h"
STACK_SHRINK(1); STACK_SHRINK(1);
@ -510,7 +510,7 @@
case GET_AITER: { case GET_AITER: {
PyObject *obj = stack_pointer[-1]; PyObject *obj = stack_pointer[-1];
PyObject *iter; PyObject *iter;
#line 748 "Python/bytecodes.c" #line 745 "Python/bytecodes.c"
unaryfunc getter = NULL; unaryfunc getter = NULL;
PyTypeObject *type = Py_TYPE(obj); PyTypeObject *type = Py_TYPE(obj);
@ -525,14 +525,14 @@
type->tp_name); type->tp_name);
#line 527 "Python/executor_cases.c.h" #line 527 "Python/executor_cases.c.h"
Py_DECREF(obj); Py_DECREF(obj);
#line 761 "Python/bytecodes.c" #line 758 "Python/bytecodes.c"
if (true) goto pop_1_error; if (true) goto pop_1_error;
} }
iter = (*getter)(obj); iter = (*getter)(obj);
#line 534 "Python/executor_cases.c.h" #line 534 "Python/executor_cases.c.h"
Py_DECREF(obj); Py_DECREF(obj);
#line 766 "Python/bytecodes.c" #line 763 "Python/bytecodes.c"
if (iter == NULL) goto pop_1_error; if (iter == NULL) goto pop_1_error;
if (Py_TYPE(iter)->tp_as_async == NULL || if (Py_TYPE(iter)->tp_as_async == NULL ||
@ -553,7 +553,7 @@
case GET_ANEXT: { case GET_ANEXT: {
PyObject *aiter = stack_pointer[-1]; PyObject *aiter = stack_pointer[-1];
PyObject *awaitable; PyObject *awaitable;
#line 781 "Python/bytecodes.c" #line 778 "Python/bytecodes.c"
unaryfunc getter = NULL; unaryfunc getter = NULL;
PyObject *next_iter = NULL; PyObject *next_iter = NULL;
PyTypeObject *type = Py_TYPE(aiter); PyTypeObject *type = Py_TYPE(aiter);
@ -605,7 +605,7 @@
case GET_AWAITABLE: { case GET_AWAITABLE: {
PyObject *iterable = stack_pointer[-1]; PyObject *iterable = stack_pointer[-1];
PyObject *iter; PyObject *iter;
#line 826 "Python/bytecodes.c" #line 823 "Python/bytecodes.c"
iter = _PyCoro_GetAwaitableIter(iterable); iter = _PyCoro_GetAwaitableIter(iterable);
if (iter == NULL) { if (iter == NULL) {
@ -614,7 +614,7 @@
#line 616 "Python/executor_cases.c.h" #line 616 "Python/executor_cases.c.h"
Py_DECREF(iterable); Py_DECREF(iterable);
#line 833 "Python/bytecodes.c" #line 830 "Python/bytecodes.c"
if (iter != NULL && PyCoro_CheckExact(iter)) { if (iter != NULL && PyCoro_CheckExact(iter)) {
PyObject *yf = _PyGen_yf((PyGenObject*)iter); PyObject *yf = _PyGen_yf((PyGenObject*)iter);
@ -638,7 +638,7 @@
case POP_EXCEPT: { case POP_EXCEPT: {
PyObject *exc_value = stack_pointer[-1]; PyObject *exc_value = stack_pointer[-1];
#line 963 "Python/bytecodes.c" #line 960 "Python/bytecodes.c"
_PyErr_StackItem *exc_info = tstate->exc_info; _PyErr_StackItem *exc_info = tstate->exc_info;
Py_XSETREF(exc_info->exc_value, exc_value); Py_XSETREF(exc_info->exc_value, exc_value);
#line 645 "Python/executor_cases.c.h" #line 645 "Python/executor_cases.c.h"
@ -648,7 +648,7 @@
case LOAD_ASSERTION_ERROR: { case LOAD_ASSERTION_ERROR: {
PyObject *value; PyObject *value;
#line 1014 "Python/bytecodes.c" #line 1011 "Python/bytecodes.c"
value = Py_NewRef(PyExc_AssertionError); value = Py_NewRef(PyExc_AssertionError);
#line 654 "Python/executor_cases.c.h" #line 654 "Python/executor_cases.c.h"
STACK_GROW(1); STACK_GROW(1);
@ -658,7 +658,7 @@
case LOAD_BUILD_CLASS: { case LOAD_BUILD_CLASS: {
PyObject *bc; PyObject *bc;
#line 1018 "Python/bytecodes.c" #line 1015 "Python/bytecodes.c"
if (PyDict_CheckExact(BUILTINS())) { if (PyDict_CheckExact(BUILTINS())) {
bc = _PyDict_GetItemWithError(BUILTINS(), bc = _PyDict_GetItemWithError(BUILTINS(),
&_Py_ID(__build_class__)); &_Py_ID(__build_class__));
@ -688,7 +688,7 @@
case STORE_NAME: { case STORE_NAME: {
PyObject *v = stack_pointer[-1]; PyObject *v = stack_pointer[-1];
#line 1043 "Python/bytecodes.c" #line 1040 "Python/bytecodes.c"
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg); PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
PyObject *ns = LOCALS(); PyObject *ns = LOCALS();
int err; int err;
@ -697,7 +697,7 @@
"no locals found when storing %R", name); "no locals found when storing %R", name);
#line 699 "Python/executor_cases.c.h" #line 699 "Python/executor_cases.c.h"
Py_DECREF(v); Py_DECREF(v);
#line 1050 "Python/bytecodes.c" #line 1047 "Python/bytecodes.c"
if (true) goto pop_1_error; if (true) goto pop_1_error;
} }
if (PyDict_CheckExact(ns)) if (PyDict_CheckExact(ns))
@ -706,7 +706,7 @@
err = PyObject_SetItem(ns, name, v); err = PyObject_SetItem(ns, name, v);
#line 708 "Python/executor_cases.c.h" #line 708 "Python/executor_cases.c.h"
Py_DECREF(v); Py_DECREF(v);
#line 1057 "Python/bytecodes.c" #line 1054 "Python/bytecodes.c"
if (err) goto pop_1_error; if (err) goto pop_1_error;
#line 712 "Python/executor_cases.c.h" #line 712 "Python/executor_cases.c.h"
STACK_SHRINK(1); STACK_SHRINK(1);
@ -714,7 +714,7 @@
} }
case DELETE_NAME: { case DELETE_NAME: {
#line 1061 "Python/bytecodes.c" #line 1058 "Python/bytecodes.c"
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg); PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
PyObject *ns = LOCALS(); PyObject *ns = LOCALS();
int err; int err;
@ -738,7 +738,7 @@
case UNPACK_SEQUENCE_TWO_TUPLE: { case UNPACK_SEQUENCE_TWO_TUPLE: {
PyObject *seq = stack_pointer[-1]; PyObject *seq = stack_pointer[-1];
PyObject **values = stack_pointer - (1); PyObject **values = stack_pointer - (1);
#line 1104 "Python/bytecodes.c" #line 1101 "Python/bytecodes.c"
DEOPT_IF(!PyTuple_CheckExact(seq), UNPACK_SEQUENCE); DEOPT_IF(!PyTuple_CheckExact(seq), UNPACK_SEQUENCE);
DEOPT_IF(PyTuple_GET_SIZE(seq) != 2, UNPACK_SEQUENCE); DEOPT_IF(PyTuple_GET_SIZE(seq) != 2, UNPACK_SEQUENCE);
assert(oparg == 2); assert(oparg == 2);
@ -755,7 +755,7 @@
case UNPACK_SEQUENCE_TUPLE: { case UNPACK_SEQUENCE_TUPLE: {
PyObject *seq = stack_pointer[-1]; PyObject *seq = stack_pointer[-1];
PyObject **values = stack_pointer - (1); PyObject **values = stack_pointer - (1);
#line 1114 "Python/bytecodes.c" #line 1111 "Python/bytecodes.c"
DEOPT_IF(!PyTuple_CheckExact(seq), UNPACK_SEQUENCE); DEOPT_IF(!PyTuple_CheckExact(seq), UNPACK_SEQUENCE);
DEOPT_IF(PyTuple_GET_SIZE(seq) != oparg, UNPACK_SEQUENCE); DEOPT_IF(PyTuple_GET_SIZE(seq) != oparg, UNPACK_SEQUENCE);
STAT_INC(UNPACK_SEQUENCE, hit); STAT_INC(UNPACK_SEQUENCE, hit);
@ -773,7 +773,7 @@
case UNPACK_SEQUENCE_LIST: { case UNPACK_SEQUENCE_LIST: {
PyObject *seq = stack_pointer[-1]; PyObject *seq = stack_pointer[-1];
PyObject **values = stack_pointer - (1); PyObject **values = stack_pointer - (1);
#line 1125 "Python/bytecodes.c" #line 1122 "Python/bytecodes.c"
DEOPT_IF(!PyList_CheckExact(seq), UNPACK_SEQUENCE); DEOPT_IF(!PyList_CheckExact(seq), UNPACK_SEQUENCE);
DEOPT_IF(PyList_GET_SIZE(seq) != oparg, UNPACK_SEQUENCE); DEOPT_IF(PyList_GET_SIZE(seq) != oparg, UNPACK_SEQUENCE);
STAT_INC(UNPACK_SEQUENCE, hit); STAT_INC(UNPACK_SEQUENCE, hit);
@ -790,13 +790,13 @@
case UNPACK_EX: { case UNPACK_EX: {
PyObject *seq = stack_pointer[-1]; PyObject *seq = stack_pointer[-1];
#line 1136 "Python/bytecodes.c" #line 1133 "Python/bytecodes.c"
int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8); int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
PyObject **top = stack_pointer + totalargs - 1; PyObject **top = stack_pointer + totalargs - 1;
int res = unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8, top); int res = unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8, top);
#line 798 "Python/executor_cases.c.h" #line 798 "Python/executor_cases.c.h"
Py_DECREF(seq); Py_DECREF(seq);
#line 1140 "Python/bytecodes.c" #line 1137 "Python/bytecodes.c"
if (res == 0) goto pop_1_error; if (res == 0) goto pop_1_error;
#line 802 "Python/executor_cases.c.h" #line 802 "Python/executor_cases.c.h"
STACK_GROW((oparg & 0xFF) + (oparg >> 8)); STACK_GROW((oparg & 0xFF) + (oparg >> 8));
@ -805,12 +805,12 @@
case DELETE_ATTR: { case DELETE_ATTR: {
PyObject *owner = stack_pointer[-1]; PyObject *owner = stack_pointer[-1];
#line 1171 "Python/bytecodes.c" #line 1168 "Python/bytecodes.c"
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg); PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
int err = PyObject_SetAttr(owner, name, (PyObject *)NULL); int err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
#line 812 "Python/executor_cases.c.h" #line 812 "Python/executor_cases.c.h"
Py_DECREF(owner); Py_DECREF(owner);
#line 1174 "Python/bytecodes.c" #line 1171 "Python/bytecodes.c"
if (err) goto pop_1_error; if (err) goto pop_1_error;
#line 816 "Python/executor_cases.c.h" #line 816 "Python/executor_cases.c.h"
STACK_SHRINK(1); STACK_SHRINK(1);
@ -819,12 +819,12 @@
case STORE_GLOBAL: { case STORE_GLOBAL: {
PyObject *v = stack_pointer[-1]; PyObject *v = stack_pointer[-1];
#line 1178 "Python/bytecodes.c" #line 1175 "Python/bytecodes.c"
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg); PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
int err = PyDict_SetItem(GLOBALS(), name, v); int err = PyDict_SetItem(GLOBALS(), name, v);
#line 826 "Python/executor_cases.c.h" #line 826 "Python/executor_cases.c.h"
Py_DECREF(v); Py_DECREF(v);
#line 1181 "Python/bytecodes.c" #line 1178 "Python/bytecodes.c"
if (err) goto pop_1_error; if (err) goto pop_1_error;
#line 830 "Python/executor_cases.c.h" #line 830 "Python/executor_cases.c.h"
STACK_SHRINK(1); STACK_SHRINK(1);
@ -832,7 +832,7 @@
} }
case DELETE_GLOBAL: { case DELETE_GLOBAL: {
#line 1185 "Python/bytecodes.c" #line 1182 "Python/bytecodes.c"
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg); PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
int err; int err;
err = PyDict_DelItem(GLOBALS(), name); err = PyDict_DelItem(GLOBALS(), name);
@ -850,7 +850,7 @@
case _LOAD_LOCALS: { case _LOAD_LOCALS: {
PyObject *locals; PyObject *locals;
#line 1199 "Python/bytecodes.c" #line 1196 "Python/bytecodes.c"
locals = LOCALS(); locals = LOCALS();
if (locals == NULL) { if (locals == NULL) {
_PyErr_SetString(tstate, PyExc_SystemError, _PyErr_SetString(tstate, PyExc_SystemError,
@ -867,7 +867,7 @@
case _LOAD_FROM_DICT_OR_GLOBALS: { case _LOAD_FROM_DICT_OR_GLOBALS: {
PyObject *mod_or_class_dict = stack_pointer[-1]; PyObject *mod_or_class_dict = stack_pointer[-1];
PyObject *v; PyObject *v;
#line 1211 "Python/bytecodes.c" #line 1208 "Python/bytecodes.c"
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg); PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
if (PyDict_CheckExact(mod_or_class_dict)) { if (PyDict_CheckExact(mod_or_class_dict)) {
v = PyDict_GetItemWithError(mod_or_class_dict, name); v = PyDict_GetItemWithError(mod_or_class_dict, name);
@ -930,7 +930,7 @@
} }
case DELETE_DEREF: { case DELETE_DEREF: {
#line 1381 "Python/bytecodes.c" #line 1378 "Python/bytecodes.c"
PyObject *cell = GETLOCAL(oparg); PyObject *cell = GETLOCAL(oparg);
PyObject *oldobj = PyCell_GET(cell); PyObject *oldobj = PyCell_GET(cell);
// Can't use ERROR_IF here. // Can't use ERROR_IF here.
@ -948,7 +948,7 @@
case LOAD_FROM_DICT_OR_DEREF: { case LOAD_FROM_DICT_OR_DEREF: {
PyObject *class_dict = stack_pointer[-1]; PyObject *class_dict = stack_pointer[-1];
PyObject *value; PyObject *value;
#line 1394 "Python/bytecodes.c" #line 1391 "Python/bytecodes.c"
PyObject *name; PyObject *name;
assert(class_dict); assert(class_dict);
assert(oparg >= 0 && oparg < _PyFrame_GetCode(frame)->co_nlocalsplus); assert(oparg >= 0 && oparg < _PyFrame_GetCode(frame)->co_nlocalsplus);
@ -990,7 +990,7 @@
case LOAD_DEREF: { case LOAD_DEREF: {
PyObject *value; PyObject *value;
#line 1431 "Python/bytecodes.c" #line 1428 "Python/bytecodes.c"
PyObject *cell = GETLOCAL(oparg); PyObject *cell = GETLOCAL(oparg);
value = PyCell_GET(cell); value = PyCell_GET(cell);
if (value == NULL) { if (value == NULL) {
@ -1006,7 +1006,7 @@
case STORE_DEREF: { case STORE_DEREF: {
PyObject *v = stack_pointer[-1]; PyObject *v = stack_pointer[-1];
#line 1441 "Python/bytecodes.c" #line 1438 "Python/bytecodes.c"
PyObject *cell = GETLOCAL(oparg); PyObject *cell = GETLOCAL(oparg);
PyObject *oldobj = PyCell_GET(cell); PyObject *oldobj = PyCell_GET(cell);
PyCell_SET(cell, v); PyCell_SET(cell, v);
@ -1017,7 +1017,7 @@
} }
case COPY_FREE_VARS: { case COPY_FREE_VARS: {
#line 1448 "Python/bytecodes.c" #line 1445 "Python/bytecodes.c"
/* Copy closure variables to free variables */ /* Copy closure variables to free variables */
PyCodeObject *co = _PyFrame_GetCode(frame); PyCodeObject *co = _PyFrame_GetCode(frame);
assert(PyFunction_Check(frame->f_funcobj)); assert(PyFunction_Check(frame->f_funcobj));
@ -1035,13 +1035,13 @@
case BUILD_STRING: { case BUILD_STRING: {
PyObject **pieces = (stack_pointer - oparg); PyObject **pieces = (stack_pointer - oparg);
PyObject *str; PyObject *str;
#line 1461 "Python/bytecodes.c" #line 1458 "Python/bytecodes.c"
str = _PyUnicode_JoinArray(&_Py_STR(empty), pieces, oparg); str = _PyUnicode_JoinArray(&_Py_STR(empty), pieces, oparg);
#line 1041 "Python/executor_cases.c.h" #line 1041 "Python/executor_cases.c.h"
for (int _i = oparg; --_i >= 0;) { for (int _i = oparg; --_i >= 0;) {
Py_DECREF(pieces[_i]); Py_DECREF(pieces[_i]);
} }
#line 1463 "Python/bytecodes.c" #line 1460 "Python/bytecodes.c"
if (str == NULL) { STACK_SHRINK(oparg); goto error; } if (str == NULL) { STACK_SHRINK(oparg); goto error; }
#line 1047 "Python/executor_cases.c.h" #line 1047 "Python/executor_cases.c.h"
STACK_SHRINK(oparg); STACK_SHRINK(oparg);
@ -1053,7 +1053,7 @@
case BUILD_TUPLE: { case BUILD_TUPLE: {
PyObject **values = (stack_pointer - oparg); PyObject **values = (stack_pointer - oparg);
PyObject *tup; PyObject *tup;
#line 1467 "Python/bytecodes.c" #line 1464 "Python/bytecodes.c"
tup = _PyTuple_FromArraySteal(values, oparg); tup = _PyTuple_FromArraySteal(values, oparg);
if (tup == NULL) { STACK_SHRINK(oparg); goto error; } if (tup == NULL) { STACK_SHRINK(oparg); goto error; }
#line 1060 "Python/executor_cases.c.h" #line 1060 "Python/executor_cases.c.h"
@ -1066,7 +1066,7 @@
case BUILD_LIST: { case BUILD_LIST: {
PyObject **values = (stack_pointer - oparg); PyObject **values = (stack_pointer - oparg);
PyObject *list; PyObject *list;
#line 1472 "Python/bytecodes.c" #line 1469 "Python/bytecodes.c"
list = _PyList_FromArraySteal(values, oparg); list = _PyList_FromArraySteal(values, oparg);
if (list == NULL) { STACK_SHRINK(oparg); goto error; } if (list == NULL) { STACK_SHRINK(oparg); goto error; }
#line 1073 "Python/executor_cases.c.h" #line 1073 "Python/executor_cases.c.h"
@ -1079,7 +1079,7 @@
case LIST_EXTEND: { case LIST_EXTEND: {
PyObject *iterable = stack_pointer[-1]; PyObject *iterable = stack_pointer[-1];
PyObject *list = stack_pointer[-(2 + (oparg-1))]; PyObject *list = stack_pointer[-(2 + (oparg-1))];
#line 1477 "Python/bytecodes.c" #line 1474 "Python/bytecodes.c"
PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable); PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
if (none_val == NULL) { if (none_val == NULL) {
if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) && if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
@ -1092,7 +1092,7 @@
} }
#line 1094 "Python/executor_cases.c.h" #line 1094 "Python/executor_cases.c.h"
Py_DECREF(iterable); Py_DECREF(iterable);
#line 1488 "Python/bytecodes.c" #line 1485 "Python/bytecodes.c"
if (true) goto pop_1_error; if (true) goto pop_1_error;
} }
assert(Py_IsNone(none_val)); assert(Py_IsNone(none_val));
@ -1105,11 +1105,11 @@
case SET_UPDATE: { case SET_UPDATE: {
PyObject *iterable = stack_pointer[-1]; PyObject *iterable = stack_pointer[-1];
PyObject *set = stack_pointer[-(2 + (oparg-1))]; PyObject *set = stack_pointer[-(2 + (oparg-1))];
#line 1495 "Python/bytecodes.c" #line 1492 "Python/bytecodes.c"
int err = _PySet_Update(set, iterable); int err = _PySet_Update(set, iterable);
#line 1111 "Python/executor_cases.c.h" #line 1111 "Python/executor_cases.c.h"
Py_DECREF(iterable); Py_DECREF(iterable);
#line 1497 "Python/bytecodes.c" #line 1494 "Python/bytecodes.c"
if (err < 0) goto pop_1_error; if (err < 0) goto pop_1_error;
#line 1115 "Python/executor_cases.c.h" #line 1115 "Python/executor_cases.c.h"
STACK_SHRINK(1); STACK_SHRINK(1);
@ -1119,7 +1119,7 @@
case BUILD_SET: { case BUILD_SET: {
PyObject **values = (stack_pointer - oparg); PyObject **values = (stack_pointer - oparg);
PyObject *set; PyObject *set;
#line 1501 "Python/bytecodes.c" #line 1498 "Python/bytecodes.c"
set = PySet_New(NULL); set = PySet_New(NULL);
if (set == NULL) if (set == NULL)
goto error; goto error;
@ -1144,7 +1144,7 @@
case BUILD_MAP: { case BUILD_MAP: {
PyObject **values = (stack_pointer - oparg*2); PyObject **values = (stack_pointer - oparg*2);
PyObject *map; PyObject *map;
#line 1518 "Python/bytecodes.c" #line 1515 "Python/bytecodes.c"
map = _PyDict_FromItems( map = _PyDict_FromItems(
values, 2, values, 2,
values+1, 2, values+1, 2,
@ -1156,7 +1156,7 @@
for (int _i = oparg*2; --_i >= 0;) { for (int _i = oparg*2; --_i >= 0;) {
Py_DECREF(values[_i]); Py_DECREF(values[_i]);
} }
#line 1526 "Python/bytecodes.c" #line 1523 "Python/bytecodes.c"
if (map == NULL) { STACK_SHRINK(oparg*2); goto error; } if (map == NULL) { STACK_SHRINK(oparg*2); goto error; }
#line 1162 "Python/executor_cases.c.h" #line 1162 "Python/executor_cases.c.h"
STACK_SHRINK(oparg*2); STACK_SHRINK(oparg*2);
@ -1166,7 +1166,7 @@
} }
case SETUP_ANNOTATIONS: { case SETUP_ANNOTATIONS: {
#line 1530 "Python/bytecodes.c" #line 1527 "Python/bytecodes.c"
int err; int err;
PyObject *ann_dict; PyObject *ann_dict;
if (LOCALS() == NULL) { if (LOCALS() == NULL) {
@ -1214,7 +1214,7 @@
PyObject *keys = stack_pointer[-1]; PyObject *keys = stack_pointer[-1];
PyObject **values = (stack_pointer - (1 + oparg)); PyObject **values = (stack_pointer - (1 + oparg));
PyObject *map; PyObject *map;
#line 1572 "Python/bytecodes.c" #line 1569 "Python/bytecodes.c"
if (!PyTuple_CheckExact(keys) || if (!PyTuple_CheckExact(keys) ||
PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) { PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
_PyErr_SetString(tstate, PyExc_SystemError, _PyErr_SetString(tstate, PyExc_SystemError,
@ -1229,7 +1229,7 @@
Py_DECREF(values[_i]); Py_DECREF(values[_i]);
} }
Py_DECREF(keys); Py_DECREF(keys);
#line 1582 "Python/bytecodes.c" #line 1579 "Python/bytecodes.c"
if (map == NULL) { STACK_SHRINK(oparg); goto pop_1_error; } if (map == NULL) { STACK_SHRINK(oparg); goto pop_1_error; }
#line 1235 "Python/executor_cases.c.h" #line 1235 "Python/executor_cases.c.h"
STACK_SHRINK(oparg); STACK_SHRINK(oparg);
@ -1239,7 +1239,7 @@
case DICT_UPDATE: { case DICT_UPDATE: {
PyObject *update = stack_pointer[-1]; PyObject *update = stack_pointer[-1];
#line 1586 "Python/bytecodes.c" #line 1583 "Python/bytecodes.c"
PyObject *dict = PEEK(oparg + 1); // update is still on the stack PyObject *dict = PEEK(oparg + 1); // update is still on the stack
if (PyDict_Update(dict, update) < 0) { if (PyDict_Update(dict, update) < 0) {
if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
@ -1249,7 +1249,7 @@
} }
#line 1251 "Python/executor_cases.c.h" #line 1251 "Python/executor_cases.c.h"
Py_DECREF(update); Py_DECREF(update);
#line 1594 "Python/bytecodes.c" #line 1591 "Python/bytecodes.c"
if (true) goto pop_1_error; if (true) goto pop_1_error;
} }
#line 1256 "Python/executor_cases.c.h" #line 1256 "Python/executor_cases.c.h"
@ -1260,14 +1260,14 @@
case DICT_MERGE: { case DICT_MERGE: {
PyObject *update = stack_pointer[-1]; PyObject *update = stack_pointer[-1];
#line 1600 "Python/bytecodes.c" #line 1597 "Python/bytecodes.c"
PyObject *dict = PEEK(oparg + 1); // update is still on the stack PyObject *dict = PEEK(oparg + 1); // update is still on the stack
if (_PyDict_MergeEx(dict, update, 2) < 0) { if (_PyDict_MergeEx(dict, update, 2) < 0) {
format_kwargs_error(tstate, PEEK(3 + oparg), update); format_kwargs_error(tstate, PEEK(3 + oparg), update);
#line 1269 "Python/executor_cases.c.h" #line 1269 "Python/executor_cases.c.h"
Py_DECREF(update); Py_DECREF(update);
#line 1605 "Python/bytecodes.c" #line 1602 "Python/bytecodes.c"
if (true) goto pop_1_error; if (true) goto pop_1_error;
} }
#line 1274 "Python/executor_cases.c.h" #line 1274 "Python/executor_cases.c.h"
@ -1279,7 +1279,7 @@
case MAP_ADD: { case MAP_ADD: {
PyObject *value = stack_pointer[-1]; PyObject *value = stack_pointer[-1];
PyObject *key = stack_pointer[-2]; PyObject *key = stack_pointer[-2];
#line 1611 "Python/bytecodes.c" #line 1608 "Python/bytecodes.c"
PyObject *dict = PEEK(oparg + 2); // key, value are still on the stack PyObject *dict = PEEK(oparg + 2); // key, value are still on the stack
assert(PyDict_CheckExact(dict)); assert(PyDict_CheckExact(dict));
/* dict[key] = value */ /* dict[key] = value */
@ -1296,7 +1296,7 @@
PyObject *global_super = stack_pointer[-3]; PyObject *global_super = stack_pointer[-3];
PyObject *res2 = NULL; PyObject *res2 = NULL;
PyObject *res; PyObject *res;
#line 1694 "Python/bytecodes.c" #line 1691 "Python/bytecodes.c"
assert(!(oparg & 1)); assert(!(oparg & 1));
DEOPT_IF(global_super != (PyObject *)&PySuper_Type, LOAD_SUPER_ATTR); DEOPT_IF(global_super != (PyObject *)&PySuper_Type, LOAD_SUPER_ATTR);
DEOPT_IF(!PyType_Check(class), LOAD_SUPER_ATTR); DEOPT_IF(!PyType_Check(class), LOAD_SUPER_ATTR);
@ -1307,7 +1307,7 @@
Py_DECREF(global_super); Py_DECREF(global_super);
Py_DECREF(class); Py_DECREF(class);
Py_DECREF(self); Py_DECREF(self);
#line 1701 "Python/bytecodes.c" #line 1698 "Python/bytecodes.c"
if (res == NULL) goto pop_3_error; if (res == NULL) goto pop_3_error;
#line 1313 "Python/executor_cases.c.h" #line 1313 "Python/executor_cases.c.h"
STACK_SHRINK(2); STACK_SHRINK(2);
@ -1323,7 +1323,7 @@
PyObject *global_super = stack_pointer[-3]; PyObject *global_super = stack_pointer[-3];
PyObject *res2; PyObject *res2;
PyObject *res; PyObject *res;
#line 1705 "Python/bytecodes.c" #line 1702 "Python/bytecodes.c"
assert(oparg & 1); assert(oparg & 1);
DEOPT_IF(global_super != (PyObject *)&PySuper_Type, LOAD_SUPER_ATTR); DEOPT_IF(global_super != (PyObject *)&PySuper_Type, LOAD_SUPER_ATTR);
DEOPT_IF(!PyType_Check(class), LOAD_SUPER_ATTR); DEOPT_IF(!PyType_Check(class), LOAD_SUPER_ATTR);
@ -1357,7 +1357,7 @@
PyObject *right = stack_pointer[-1]; PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2]; PyObject *left = stack_pointer[-2];
PyObject *res; PyObject *res;
#line 2037 "Python/bytecodes.c" #line 2034 "Python/bytecodes.c"
DEOPT_IF(!PyFloat_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyFloat_CheckExact(left), COMPARE_OP);
DEOPT_IF(!PyFloat_CheckExact(right), COMPARE_OP); DEOPT_IF(!PyFloat_CheckExact(right), COMPARE_OP);
STAT_INC(COMPARE_OP, hit); STAT_INC(COMPARE_OP, hit);
@ -1378,7 +1378,7 @@
PyObject *right = stack_pointer[-1]; PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2]; PyObject *left = stack_pointer[-2];
PyObject *res; PyObject *res;
#line 2051 "Python/bytecodes.c" #line 2048 "Python/bytecodes.c"
DEOPT_IF(!PyLong_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyLong_CheckExact(left), COMPARE_OP);
DEOPT_IF(!PyLong_CheckExact(right), COMPARE_OP); DEOPT_IF(!PyLong_CheckExact(right), COMPARE_OP);
DEOPT_IF(!_PyLong_IsCompact((PyLongObject *)left), COMPARE_OP); DEOPT_IF(!_PyLong_IsCompact((PyLongObject *)left), COMPARE_OP);
@ -1403,7 +1403,7 @@
PyObject *right = stack_pointer[-1]; PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2]; PyObject *left = stack_pointer[-2];
PyObject *res; PyObject *res;
#line 2069 "Python/bytecodes.c" #line 2066 "Python/bytecodes.c"
DEOPT_IF(!PyUnicode_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyUnicode_CheckExact(left), COMPARE_OP);
DEOPT_IF(!PyUnicode_CheckExact(right), COMPARE_OP); DEOPT_IF(!PyUnicode_CheckExact(right), COMPARE_OP);
STAT_INC(COMPARE_OP, hit); STAT_INC(COMPARE_OP, hit);
@ -1425,12 +1425,12 @@
PyObject *right = stack_pointer[-1]; PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2]; PyObject *left = stack_pointer[-2];
PyObject *b; PyObject *b;
#line 2083 "Python/bytecodes.c" #line 2080 "Python/bytecodes.c"
int res = Py_Is(left, right) ^ oparg; int res = Py_Is(left, right) ^ oparg;
#line 1431 "Python/executor_cases.c.h" #line 1431 "Python/executor_cases.c.h"
Py_DECREF(left); Py_DECREF(left);
Py_DECREF(right); Py_DECREF(right);
#line 2085 "Python/bytecodes.c" #line 2082 "Python/bytecodes.c"
b = res ? Py_True : Py_False; b = res ? Py_True : Py_False;
#line 1436 "Python/executor_cases.c.h" #line 1436 "Python/executor_cases.c.h"
STACK_SHRINK(1); STACK_SHRINK(1);
@ -1442,12 +1442,12 @@
PyObject *right = stack_pointer[-1]; PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2]; PyObject *left = stack_pointer[-2];
PyObject *b; PyObject *b;
#line 2089 "Python/bytecodes.c" #line 2086 "Python/bytecodes.c"
int res = PySequence_Contains(right, left); int res = PySequence_Contains(right, left);
#line 1448 "Python/executor_cases.c.h" #line 1448 "Python/executor_cases.c.h"
Py_DECREF(left); Py_DECREF(left);
Py_DECREF(right); Py_DECREF(right);
#line 2091 "Python/bytecodes.c" #line 2088 "Python/bytecodes.c"
if (res < 0) goto pop_2_error; if (res < 0) goto pop_2_error;
b = (res ^ oparg) ? Py_True : Py_False; b = (res ^ oparg) ? Py_True : Py_False;
#line 1454 "Python/executor_cases.c.h" #line 1454 "Python/executor_cases.c.h"
@ -1461,12 +1461,12 @@
PyObject *exc_value = stack_pointer[-2]; PyObject *exc_value = stack_pointer[-2];
PyObject *rest; PyObject *rest;
PyObject *match; PyObject *match;
#line 2096 "Python/bytecodes.c" #line 2093 "Python/bytecodes.c"
if (check_except_star_type_valid(tstate, match_type) < 0) { if (check_except_star_type_valid(tstate, match_type) < 0) {
#line 1467 "Python/executor_cases.c.h" #line 1467 "Python/executor_cases.c.h"
Py_DECREF(exc_value); Py_DECREF(exc_value);
Py_DECREF(match_type); Py_DECREF(match_type);
#line 2098 "Python/bytecodes.c" #line 2095 "Python/bytecodes.c"
if (true) goto pop_2_error; if (true) goto pop_2_error;
} }
@ -1477,7 +1477,7 @@
#line 1478 "Python/executor_cases.c.h" #line 1478 "Python/executor_cases.c.h"
Py_DECREF(exc_value); Py_DECREF(exc_value);
Py_DECREF(match_type); Py_DECREF(match_type);
#line 2106 "Python/bytecodes.c" #line 2103 "Python/bytecodes.c"
if (res < 0) goto pop_2_error; if (res < 0) goto pop_2_error;
assert((match == NULL) == (rest == NULL)); assert((match == NULL) == (rest == NULL));
@ -1496,19 +1496,19 @@
PyObject *right = stack_pointer[-1]; PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2]; PyObject *left = stack_pointer[-2];
PyObject *b; PyObject *b;
#line 2117 "Python/bytecodes.c" #line 2114 "Python/bytecodes.c"
assert(PyExceptionInstance_Check(left)); assert(PyExceptionInstance_Check(left));
if (check_except_type_valid(tstate, right) < 0) { if (check_except_type_valid(tstate, right) < 0) {
#line 1503 "Python/executor_cases.c.h" #line 1503 "Python/executor_cases.c.h"
Py_DECREF(right); Py_DECREF(right);
#line 2120 "Python/bytecodes.c" #line 2117 "Python/bytecodes.c"
if (true) goto pop_1_error; if (true) goto pop_1_error;
} }
int res = PyErr_GivenExceptionMatches(left, right); int res = PyErr_GivenExceptionMatches(left, right);
#line 1510 "Python/executor_cases.c.h" #line 1510 "Python/executor_cases.c.h"
Py_DECREF(right); Py_DECREF(right);
#line 2125 "Python/bytecodes.c" #line 2122 "Python/bytecodes.c"
b = res ? Py_True : Py_False; b = res ? Py_True : Py_False;
#line 1514 "Python/executor_cases.c.h" #line 1514 "Python/executor_cases.c.h"
stack_pointer[-1] = b; stack_pointer[-1] = b;
@ -1518,7 +1518,7 @@
case GET_LEN: { case GET_LEN: {
PyObject *obj = stack_pointer[-1]; PyObject *obj = stack_pointer[-1];
PyObject *len_o; PyObject *len_o;
#line 2246 "Python/bytecodes.c" #line 2243 "Python/bytecodes.c"
// PUSH(len(TOS)) // PUSH(len(TOS))
Py_ssize_t len_i = PyObject_Length(obj); Py_ssize_t len_i = PyObject_Length(obj);
if (len_i < 0) goto error; if (len_i < 0) goto error;
@ -1535,7 +1535,7 @@
PyObject *type = stack_pointer[-2]; PyObject *type = stack_pointer[-2];
PyObject *subject = stack_pointer[-3]; PyObject *subject = stack_pointer[-3];
PyObject *attrs; PyObject *attrs;
#line 2254 "Python/bytecodes.c" #line 2251 "Python/bytecodes.c"
// Pop TOS and TOS1. Set TOS to a tuple of attributes on success, or // Pop TOS and TOS1. Set TOS to a tuple of attributes on success, or
// None on failure. // None on failure.
assert(PyTuple_CheckExact(names)); assert(PyTuple_CheckExact(names));
@ -1544,7 +1544,7 @@
Py_DECREF(subject); Py_DECREF(subject);
Py_DECREF(type); Py_DECREF(type);
Py_DECREF(names); Py_DECREF(names);
#line 2259 "Python/bytecodes.c" #line 2256 "Python/bytecodes.c"
if (attrs) { if (attrs) {
assert(PyTuple_CheckExact(attrs)); // Success! assert(PyTuple_CheckExact(attrs)); // Success!
} }
@ -1561,7 +1561,7 @@
case MATCH_MAPPING: { case MATCH_MAPPING: {
PyObject *subject = stack_pointer[-1]; PyObject *subject = stack_pointer[-1];
PyObject *res; PyObject *res;
#line 2269 "Python/bytecodes.c" #line 2266 "Python/bytecodes.c"
int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING; int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING;
res = match ? Py_True : Py_False; res = match ? Py_True : Py_False;
#line 1568 "Python/executor_cases.c.h" #line 1568 "Python/executor_cases.c.h"
@ -1573,7 +1573,7 @@
case MATCH_SEQUENCE: { case MATCH_SEQUENCE: {
PyObject *subject = stack_pointer[-1]; PyObject *subject = stack_pointer[-1];
PyObject *res; PyObject *res;
#line 2274 "Python/bytecodes.c" #line 2271 "Python/bytecodes.c"
int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE; int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE;
res = match ? Py_True : Py_False; res = match ? Py_True : Py_False;
#line 1580 "Python/executor_cases.c.h" #line 1580 "Python/executor_cases.c.h"
@ -1586,7 +1586,7 @@
PyObject *keys = stack_pointer[-1]; PyObject *keys = stack_pointer[-1];
PyObject *subject = stack_pointer[-2]; PyObject *subject = stack_pointer[-2];
PyObject *values_or_none; PyObject *values_or_none;
#line 2279 "Python/bytecodes.c" #line 2276 "Python/bytecodes.c"
// On successful match, PUSH(values). Otherwise, PUSH(None). // On successful match, PUSH(values). Otherwise, PUSH(None).
values_or_none = match_keys(tstate, subject, keys); values_or_none = match_keys(tstate, subject, keys);
if (values_or_none == NULL) goto error; if (values_or_none == NULL) goto error;
@ -1599,12 +1599,12 @@
case GET_ITER: { case GET_ITER: {
PyObject *iterable = stack_pointer[-1]; PyObject *iterable = stack_pointer[-1];
PyObject *iter; PyObject *iter;
#line 2285 "Python/bytecodes.c" #line 2282 "Python/bytecodes.c"
/* before: [obj]; after [getiter(obj)] */ /* before: [obj]; after [getiter(obj)] */
iter = PyObject_GetIter(iterable); iter = PyObject_GetIter(iterable);
#line 1606 "Python/executor_cases.c.h" #line 1606 "Python/executor_cases.c.h"
Py_DECREF(iterable); Py_DECREF(iterable);
#line 2288 "Python/bytecodes.c" #line 2285 "Python/bytecodes.c"
if (iter == NULL) goto pop_1_error; if (iter == NULL) goto pop_1_error;
#line 1610 "Python/executor_cases.c.h" #line 1610 "Python/executor_cases.c.h"
stack_pointer[-1] = iter; stack_pointer[-1] = iter;
@ -1614,7 +1614,7 @@
case GET_YIELD_FROM_ITER: { case GET_YIELD_FROM_ITER: {
PyObject *iterable = stack_pointer[-1]; PyObject *iterable = stack_pointer[-1];
PyObject *iter; PyObject *iter;
#line 2292 "Python/bytecodes.c" #line 2289 "Python/bytecodes.c"
/* before: [obj]; after [getiter(obj)] */ /* before: [obj]; after [getiter(obj)] */
if (PyCoro_CheckExact(iterable)) { if (PyCoro_CheckExact(iterable)) {
/* `iterable` is a coroutine */ /* `iterable` is a coroutine */
@ -1639,7 +1639,7 @@
} }
#line 1641 "Python/executor_cases.c.h" #line 1641 "Python/executor_cases.c.h"
Py_DECREF(iterable); Py_DECREF(iterable);
#line 2315 "Python/bytecodes.c" #line 2312 "Python/bytecodes.c"
} }
#line 1645 "Python/executor_cases.c.h" #line 1645 "Python/executor_cases.c.h"
stack_pointer[-1] = iter; stack_pointer[-1] = iter;
@ -1651,7 +1651,7 @@
PyObject *lasti = stack_pointer[-3]; PyObject *lasti = stack_pointer[-3];
PyObject *exit_func = stack_pointer[-4]; PyObject *exit_func = stack_pointer[-4];
PyObject *res; PyObject *res;
#line 2547 "Python/bytecodes.c" #line 2544 "Python/bytecodes.c"
/* At the top of the stack are 4 values: /* At the top of the stack are 4 values:
- val: TOP = exc_info() - val: TOP = exc_info()
- unused: SECOND = previous exception - unused: SECOND = previous exception
@ -1681,7 +1681,7 @@
case PUSH_EXC_INFO: { case PUSH_EXC_INFO: {
PyObject *new_exc = stack_pointer[-1]; PyObject *new_exc = stack_pointer[-1];
PyObject *prev_exc; PyObject *prev_exc;
#line 2586 "Python/bytecodes.c" #line 2583 "Python/bytecodes.c"
_PyErr_StackItem *exc_info = tstate->exc_info; _PyErr_StackItem *exc_info = tstate->exc_info;
if (exc_info->exc_value != NULL) { if (exc_info->exc_value != NULL) {
prev_exc = exc_info->exc_value; prev_exc = exc_info->exc_value;
@ -1700,7 +1700,7 @@
case EXIT_INIT_CHECK: { case EXIT_INIT_CHECK: {
PyObject *should_be_none = stack_pointer[-1]; PyObject *should_be_none = stack_pointer[-1];
#line 2955 "Python/bytecodes.c" #line 2952 "Python/bytecodes.c"
assert(STACK_LEVEL() == 2); assert(STACK_LEVEL() == 2);
if (should_be_none != Py_None) { if (should_be_none != Py_None) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
@ -1716,7 +1716,7 @@
case MAKE_FUNCTION: { case MAKE_FUNCTION: {
PyObject *codeobj = stack_pointer[-1]; PyObject *codeobj = stack_pointer[-1];
PyObject *func; PyObject *func;
#line 3369 "Python/bytecodes.c" #line 3366 "Python/bytecodes.c"
PyFunctionObject *func_obj = (PyFunctionObject *) PyFunctionObject *func_obj = (PyFunctionObject *)
PyFunction_New(codeobj, GLOBALS()); PyFunction_New(codeobj, GLOBALS());
@ -1736,7 +1736,7 @@
case SET_FUNCTION_ATTRIBUTE: { case SET_FUNCTION_ATTRIBUTE: {
PyObject *func = stack_pointer[-1]; PyObject *func = stack_pointer[-1];
PyObject *attr = stack_pointer[-2]; PyObject *attr = stack_pointer[-2];
#line 3383 "Python/bytecodes.c" #line 3380 "Python/bytecodes.c"
assert(PyFunction_Check(func)); assert(PyFunction_Check(func));
PyFunctionObject *func_obj = (PyFunctionObject *)func; PyFunctionObject *func_obj = (PyFunctionObject *)func;
switch(oparg) { switch(oparg) {
@ -1772,13 +1772,13 @@
PyObject *stop = stack_pointer[-(1 + ((oparg == 3) ? 1 : 0))]; PyObject *stop = stack_pointer[-(1 + ((oparg == 3) ? 1 : 0))];
PyObject *start = stack_pointer[-(2 + ((oparg == 3) ? 1 : 0))]; PyObject *start = stack_pointer[-(2 + ((oparg == 3) ? 1 : 0))];
PyObject *slice; PyObject *slice;
#line 3433 "Python/bytecodes.c" #line 3430 "Python/bytecodes.c"
slice = PySlice_New(start, stop, step); slice = PySlice_New(start, stop, step);
#line 1778 "Python/executor_cases.c.h" #line 1778 "Python/executor_cases.c.h"
Py_DECREF(start); Py_DECREF(start);
Py_DECREF(stop); Py_DECREF(stop);
Py_XDECREF(step); Py_XDECREF(step);
#line 3435 "Python/bytecodes.c" #line 3432 "Python/bytecodes.c"
if (slice == NULL) { STACK_SHRINK(((oparg == 3) ? 1 : 0)); goto pop_2_error; } if (slice == NULL) { STACK_SHRINK(((oparg == 3) ? 1 : 0)); goto pop_2_error; }
#line 1784 "Python/executor_cases.c.h" #line 1784 "Python/executor_cases.c.h"
STACK_SHRINK(((oparg == 3) ? 1 : 0)); STACK_SHRINK(((oparg == 3) ? 1 : 0));
@ -1790,7 +1790,7 @@
case CONVERT_VALUE: { case CONVERT_VALUE: {
PyObject *value = stack_pointer[-1]; PyObject *value = stack_pointer[-1];
PyObject *result; PyObject *result;
#line 3439 "Python/bytecodes.c" #line 3436 "Python/bytecodes.c"
convertion_func_ptr conv_fn; convertion_func_ptr conv_fn;
assert(oparg >= FVC_STR && oparg <= FVC_ASCII); assert(oparg >= FVC_STR && oparg <= FVC_ASCII);
conv_fn = CONVERSION_FUNCTIONS[oparg]; conv_fn = CONVERSION_FUNCTIONS[oparg];
@ -1805,7 +1805,7 @@
case FORMAT_SIMPLE: { case FORMAT_SIMPLE: {
PyObject *value = stack_pointer[-1]; PyObject *value = stack_pointer[-1];
PyObject *res; PyObject *res;
#line 3448 "Python/bytecodes.c" #line 3445 "Python/bytecodes.c"
/* If value is a unicode object, then we know the result /* If value is a unicode object, then we know the result
* of format(value) is value itself. */ * of format(value) is value itself. */
if (!PyUnicode_CheckExact(value)) { if (!PyUnicode_CheckExact(value)) {
@ -1825,7 +1825,7 @@
PyObject *fmt_spec = stack_pointer[-1]; PyObject *fmt_spec = stack_pointer[-1];
PyObject *value = stack_pointer[-2]; PyObject *value = stack_pointer[-2];
PyObject *res; PyObject *res;
#line 3461 "Python/bytecodes.c" #line 3458 "Python/bytecodes.c"
res = PyObject_Format(value, fmt_spec); res = PyObject_Format(value, fmt_spec);
Py_DECREF(value); Py_DECREF(value);
Py_DECREF(fmt_spec); Py_DECREF(fmt_spec);
@ -1839,7 +1839,7 @@
case COPY: { case COPY: {
PyObject *bottom = stack_pointer[-(1 + (oparg-1))]; PyObject *bottom = stack_pointer[-(1 + (oparg-1))];
PyObject *top; PyObject *top;
#line 3468 "Python/bytecodes.c" #line 3465 "Python/bytecodes.c"
assert(oparg > 0); assert(oparg > 0);
top = Py_NewRef(bottom); top = Py_NewRef(bottom);
#line 1846 "Python/executor_cases.c.h" #line 1846 "Python/executor_cases.c.h"
@ -1851,7 +1851,7 @@
case SWAP: { case SWAP: {
PyObject *top = stack_pointer[-1]; PyObject *top = stack_pointer[-1];
PyObject *bottom = stack_pointer[-(2 + (oparg-2))]; PyObject *bottom = stack_pointer[-(2 + (oparg-2))];
#line 3493 "Python/bytecodes.c" #line 3490 "Python/bytecodes.c"
assert(oparg >= 2); assert(oparg >= 2);
#line 1857 "Python/executor_cases.c.h" #line 1857 "Python/executor_cases.c.h"
stack_pointer[-1] = bottom; stack_pointer[-1] = bottom;

View file

@ -2002,6 +2002,10 @@ _PyCfg_ConvertPseudoOps(basicblock *entryblock)
assert(SAME_OPCODE_METADATA(instr->i_opcode, NOP)); assert(SAME_OPCODE_METADATA(instr->i_opcode, NOP));
INSTR_SET_OP0(instr, NOP); INSTR_SET_OP0(instr, NOP);
} }
else if (instr->i_opcode == LOAD_CLOSURE) {
assert(SAME_OPCODE_METADATA(LOAD_CLOSURE, LOAD_FAST));
instr->i_opcode = LOAD_FAST;
}
else if (instr->i_opcode == STORE_FAST_MAYBE_NULL) { else if (instr->i_opcode == STORE_FAST_MAYBE_NULL) {
assert(SAME_OPCODE_METADATA(STORE_FAST_MAYBE_NULL, STORE_FAST)); assert(SAME_OPCODE_METADATA(STORE_FAST_MAYBE_NULL, STORE_FAST));
instr->i_opcode = STORE_FAST; instr->i_opcode = STORE_FAST;

File diff suppressed because it is too large Load diff

View file

@ -5,6 +5,7 @@
#define IS_PSEUDO_INSTR(OP) \ #define IS_PSEUDO_INSTR(OP) \
((OP) == LOAD_CLOSURE) || \
((OP) == STORE_FAST_MAYBE_NULL) || \ ((OP) == STORE_FAST_MAYBE_NULL) || \
((OP) == LOAD_SUPER_METHOD) || \ ((OP) == LOAD_SUPER_METHOD) || \
((OP) == LOAD_ZERO_SUPER_METHOD) || \ ((OP) == LOAD_ZERO_SUPER_METHOD) || \

View file

@ -135,7 +135,7 @@ static void *opcode_targets[256] = {
&&TARGET_BUILD_SLICE, &&TARGET_BUILD_SLICE,
&&TARGET_JUMP_BACKWARD_NO_INTERRUPT, &&TARGET_JUMP_BACKWARD_NO_INTERRUPT,
&&TARGET_MAKE_CELL, &&TARGET_MAKE_CELL,
&&TARGET_LOAD_CLOSURE, &&TARGET_CALL_BUILTIN_FAST_WITH_KEYWORDS,
&&TARGET_LOAD_DEREF, &&TARGET_LOAD_DEREF,
&&TARGET_STORE_DEREF, &&TARGET_STORE_DEREF,
&&TARGET_DELETE_DEREF, &&TARGET_DELETE_DEREF,
@ -147,26 +147,26 @@ static void *opcode_targets[256] = {
&&TARGET_LIST_APPEND, &&TARGET_LIST_APPEND,
&&TARGET_SET_ADD, &&TARGET_SET_ADD,
&&TARGET_MAP_ADD, &&TARGET_MAP_ADD,
&&TARGET_CALL_BUILTIN_FAST_WITH_KEYWORDS, &&TARGET_CALL_NO_KW_LEN,
&&TARGET_COPY_FREE_VARS, &&TARGET_COPY_FREE_VARS,
&&TARGET_YIELD_VALUE, &&TARGET_YIELD_VALUE,
&&TARGET_RESUME, &&TARGET_RESUME,
&&TARGET_MATCH_CLASS, &&TARGET_MATCH_CLASS,
&&TARGET_CALL_NO_KW_LEN,
&&TARGET_CALL_NO_KW_ISINSTANCE, &&TARGET_CALL_NO_KW_ISINSTANCE,
&&TARGET_CALL_NO_KW_LIST_APPEND, &&TARGET_CALL_NO_KW_LIST_APPEND,
&&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_O,
&&TARGET_BUILD_CONST_KEY_MAP, &&TARGET_BUILD_CONST_KEY_MAP,
&&TARGET_BUILD_STRING, &&TARGET_BUILD_STRING,
&&TARGET_CONVERT_VALUE, &&TARGET_CONVERT_VALUE,
&&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_O,
&&TARGET_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, &&TARGET_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS,
&&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS, &&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS,
&&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_FAST,
&&TARGET_LIST_EXTEND, &&TARGET_LIST_EXTEND,
&&TARGET_SET_UPDATE, &&TARGET_SET_UPDATE,
&&TARGET_DICT_MERGE, &&TARGET_DICT_MERGE,
&&TARGET_DICT_UPDATE, &&TARGET_DICT_UPDATE,
&&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_FAST,
&&TARGET_CALL_NO_KW_ALLOC_AND_ENTER_INIT, &&TARGET_CALL_NO_KW_ALLOC_AND_ENTER_INIT,
&&_unknown_opcode,
&&TARGET_LOAD_FAST_LOAD_FAST, &&TARGET_LOAD_FAST_LOAD_FAST,
&&TARGET_STORE_FAST_LOAD_FAST, &&TARGET_STORE_FAST_LOAD_FAST,
&&TARGET_STORE_FAST_STORE_FAST, &&TARGET_STORE_FAST_STORE_FAST,