mirror of
https://github.com/python/cpython.git
synced 2026-10-28 10:25:05 +08:00
gh-145855: Remove the DELETE_ATTR bytecode (GH-146216)
This commit is contained in:
1 parent
db3a4773e1
commit
8bee2a39b8
19 files changed
+999
-1134
No files matched your search
@@ -1095,17 +1095,6 @@ iterations of the loop.
|
||||
where *namei* is the index of name in :attr:`~codeobject.co_names` of the
|
||||
:ref:`code object <code-objects>`.
|
||||
|
||||
.. opcode:: DELETE_ATTR (namei)
|
||||
|
||||
Implements::
|
||||
|
||||
obj = STACK.pop()
|
||||
del obj.name
|
||||
|
||||
where *namei* is the index of name into :attr:`~codeobject.co_names` of the
|
||||
:ref:`code object <code-objects>`.
|
||||
|
||||
|
||||
.. opcode:: STORE_GLOBAL (namei)
|
||||
|
||||
Works as :opcode:`STORE_NAME`, but stores the name as a global.
|
||||
|
||||
@@ -6,6 +6,7 @@ c-api/file.html: deprecated-api
|
||||
|
||||
# Removed sections
|
||||
library/asyncio-task.html: terminating-a-task-group
|
||||
library/dis.html: opcode-DELETE_ATTR
|
||||
library/dis.html: opcode-DELETE_GLOBAL
|
||||
library/dis.html: opcode-DELETE_NAME
|
||||
library/asyncio-llapi-index.html: event-loop-policies
|
||||
|
||||
@@ -301,6 +301,7 @@ Known values:
|
||||
Python 3.16a0 3701 (Add CONSTANT_EMPTY_TUPLE to LOAD_COMMON_CONSTANT)
|
||||
Python 3.16a1 3702 (Replace DELETE_NAME with PUSH_NULL; STORE_NAME)
|
||||
Python 3.16a1 3703 (Replace DELETE_GLOBAL with PUSH_NULL; STORE_GLOBAL)
|
||||
Python 3.16a1 3704 (Replace DELETE_ATTR with PUSH_NULL; STORE_ATTR)
|
||||
|
||||
|
||||
Python 3.17 will start with 3750
|
||||
@@ -314,7 +315,7 @@ PC/launcher.c must also be updated.
|
||||
|
||||
*/
|
||||
|
||||
#define PYC_MAGIC_NUMBER 3703
|
||||
#define PYC_MAGIC_NUMBER 3704
|
||||
/* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes
|
||||
(little-endian) and then appending b'\r\n'. */
|
||||
#define PYC_MAGIC_NUMBER_TOKEN \
|
||||
|
||||
+2
-8
@@ -178,8 +178,6 @@ int _PyOpcode_num_popped(int opcode, int oparg) {
|
||||
return 1 + (oparg-1);
|
||||
case COPY_FREE_VARS:
|
||||
return 0;
|
||||
case DELETE_ATTR:
|
||||
return 1;
|
||||
case DELETE_DEREF:
|
||||
return 0;
|
||||
case DELETE_FAST:
|
||||
@@ -675,8 +673,6 @@ int _PyOpcode_num_pushed(int opcode, int oparg) {
|
||||
return 2 + (oparg-1);
|
||||
case COPY_FREE_VARS:
|
||||
return 0;
|
||||
case DELETE_ATTR:
|
||||
return 0;
|
||||
case DELETE_DEREF:
|
||||
return 0;
|
||||
case DELETE_FAST:
|
||||
@@ -1174,7 +1170,6 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = {
|
||||
[CONVERT_VALUE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
||||
[COPY] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_PURE_FLAG },
|
||||
[COPY_FREE_VARS] = { true, INSTR_FMT_IB, HAS_ARG_FLAG },
|
||||
[DELETE_ATTR] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
||||
[DELETE_DEREF] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
|
||||
[DELETE_FAST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
||||
[DELETE_SUBSCR] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
||||
@@ -1425,7 +1420,6 @@ _PyOpcode_macro_expansion[256] = {
|
||||
[CONVERT_VALUE] = { .nuops = 1, .uops = { { _CONVERT_VALUE, OPARG_SIMPLE, 0 } } },
|
||||
[COPY] = { .nuops = 1, .uops = { { _COPY, OPARG_SIMPLE, 0 } } },
|
||||
[COPY_FREE_VARS] = { .nuops = 1, .uops = { { _COPY_FREE_VARS, OPARG_SIMPLE, 0 } } },
|
||||
[DELETE_ATTR] = { .nuops = 1, .uops = { { _DELETE_ATTR, OPARG_SIMPLE, 0 } } },
|
||||
[DELETE_DEREF] = { .nuops = 1, .uops = { { _DELETE_DEREF, OPARG_SIMPLE, 0 } } },
|
||||
[DELETE_FAST] = { .nuops = 1, .uops = { { _DELETE_FAST, OPARG_SIMPLE, 0 } } },
|
||||
[DELETE_SUBSCR] = { .nuops = 1, .uops = { { _DELETE_SUBSCR, OPARG_SIMPLE, 0 } } },
|
||||
@@ -1628,7 +1622,6 @@ const char *_PyOpcode_OpName[267] = {
|
||||
[CONVERT_VALUE] = "CONVERT_VALUE",
|
||||
[COPY] = "COPY",
|
||||
[COPY_FREE_VARS] = "COPY_FREE_VARS",
|
||||
[DELETE_ATTR] = "DELETE_ATTR",
|
||||
[DELETE_DEREF] = "DELETE_DEREF",
|
||||
[DELETE_FAST] = "DELETE_FAST",
|
||||
[DELETE_SUBSCR] = "DELETE_SUBSCR",
|
||||
@@ -1834,6 +1827,7 @@ const uint8_t _PyOpcode_Caches[256] = {
|
||||
PyAPI_DATA(const uint8_t) _PyOpcode_Deopt[256];
|
||||
#ifdef NEED_OPCODE_METADATA
|
||||
const uint8_t _PyOpcode_Deopt[256] = {
|
||||
[117] = 117,
|
||||
[118] = 118,
|
||||
[119] = 119,
|
||||
[120] = 120,
|
||||
@@ -1928,7 +1922,6 @@ const uint8_t _PyOpcode_Deopt[256] = {
|
||||
[CONVERT_VALUE] = CONVERT_VALUE,
|
||||
[COPY] = COPY,
|
||||
[COPY_FREE_VARS] = COPY_FREE_VARS,
|
||||
[DELETE_ATTR] = DELETE_ATTR,
|
||||
[DELETE_DEREF] = DELETE_DEREF,
|
||||
[DELETE_FAST] = DELETE_FAST,
|
||||
[DELETE_SUBSCR] = DELETE_SUBSCR,
|
||||
@@ -2095,6 +2088,7 @@ const uint8_t _PyOpcode_Deopt[256] = {
|
||||
#endif // NEED_OPCODE_METADATA
|
||||
|
||||
#define EXTRA_CASES \
|
||||
case 117: \
|
||||
case 118: \
|
||||
case 119: \
|
||||
case 120: \
|
||||
|
||||
Generated
+791
-793
File diff suppressed because it is too large.
Load diff
Generated
-15
@@ -187,7 +187,6 @@ const uint32_t _PyUop_Flags[MAX_UOP_ID+1] = {
|
||||
[_UNPACK_SEQUENCE_LIST] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
|
||||
[_UNPACK_EX] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
|
||||
[_STORE_ATTR] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
|
||||
[_DELETE_ATTR] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
|
||||
[_STORE_GLOBAL] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
|
||||
[_LOAD_LOCALS] = HAS_ERROR_FLAG,
|
||||
[_LOAD_NAME] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
|
||||
@@ -1814,15 +1813,6 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
|
||||
{ -1, -1, -1 },
|
||||
},
|
||||
},
|
||||
[_DELETE_ATTR] = {
|
||||
.best = { 1, 1, 1, 1 },
|
||||
.entries = {
|
||||
{ -1, -1, -1 },
|
||||
{ 0, 1, _DELETE_ATTR_r10 },
|
||||
{ -1, -1, -1 },
|
||||
{ -1, -1, -1 },
|
||||
},
|
||||
},
|
||||
[_STORE_GLOBAL] = {
|
||||
.best = { 1, 1, 1, 1 },
|
||||
.entries = {
|
||||
@@ -4308,7 +4298,6 @@ const uint16_t _PyUop_Uncached[MAX_UOP_REGS_ID+1] = {
|
||||
[_UNPACK_SEQUENCE_LIST_r10] = _UNPACK_SEQUENCE_LIST,
|
||||
[_UNPACK_EX_r10] = _UNPACK_EX,
|
||||
[_STORE_ATTR_r20] = _STORE_ATTR,
|
||||
[_DELETE_ATTR_r10] = _DELETE_ATTR,
|
||||
[_STORE_GLOBAL_r10] = _STORE_GLOBAL,
|
||||
[_LOAD_LOCALS_r01] = _LOAD_LOCALS,
|
||||
[_LOAD_LOCALS_r12] = _LOAD_LOCALS,
|
||||
@@ -5165,8 +5154,6 @@ const char *const _PyOpcode_uop_name[MAX_UOP_REGS_ID+1] = {
|
||||
[_COPY_FREE_VARS_r33] = "_COPY_FREE_VARS_r33",
|
||||
[_CREATE_INIT_FRAME] = "_CREATE_INIT_FRAME",
|
||||
[_CREATE_INIT_FRAME_r01] = "_CREATE_INIT_FRAME_r01",
|
||||
[_DELETE_ATTR] = "_DELETE_ATTR",
|
||||
[_DELETE_ATTR_r10] = "_DELETE_ATTR_r10",
|
||||
[_DELETE_DEREF] = "_DELETE_DEREF",
|
||||
[_DELETE_DEREF_r00] = "_DELETE_DEREF_r00",
|
||||
[_DELETE_FAST] = "_DELETE_FAST",
|
||||
@@ -6483,8 +6470,6 @@ int _PyUop_num_popped(int opcode, int oparg)
|
||||
return 1;
|
||||
case _STORE_ATTR:
|
||||
return 2;
|
||||
case _DELETE_ATTR:
|
||||
return 1;
|
||||
case _STORE_GLOBAL:
|
||||
return 1;
|
||||
case _LOAD_LOCALS:
|
||||
|
||||
Generated
+58
-59
@@ -69,65 +69,64 @@ extern "C" {
|
||||
#define CONVERT_VALUE 56
|
||||
#define COPY 57
|
||||
#define COPY_FREE_VARS 58
|
||||
#define DELETE_ATTR 59
|
||||
#define DELETE_DEREF 60
|
||||
#define DELETE_FAST 61
|
||||
#define DICT_MERGE 62
|
||||
#define DICT_UPDATE 63
|
||||
#define END_ASYNC_FOR 64
|
||||
#define EXTENDED_ARG 65
|
||||
#define FOR_ITER 66
|
||||
#define GET_AWAITABLE 67
|
||||
#define GET_ITER 68
|
||||
#define IMPORT_FROM 69
|
||||
#define IMPORT_NAME 70
|
||||
#define IS_OP 71
|
||||
#define JUMP_BACKWARD 72
|
||||
#define JUMP_BACKWARD_NO_INTERRUPT 73
|
||||
#define JUMP_FORWARD 74
|
||||
#define LIST_APPEND 75
|
||||
#define LIST_EXTEND 76
|
||||
#define LOAD_ATTR 77
|
||||
#define LOAD_COMMON_CONSTANT 78
|
||||
#define LOAD_CONST 79
|
||||
#define LOAD_DEREF 80
|
||||
#define LOAD_FAST 81
|
||||
#define LOAD_FAST_AND_CLEAR 82
|
||||
#define LOAD_FAST_BORROW 83
|
||||
#define LOAD_FAST_BORROW_LOAD_FAST_BORROW 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 DELETE_DEREF 59
|
||||
#define DELETE_FAST 60
|
||||
#define DICT_MERGE 61
|
||||
#define DICT_UPDATE 62
|
||||
#define END_ASYNC_FOR 63
|
||||
#define EXTENDED_ARG 64
|
||||
#define FOR_ITER 65
|
||||
#define GET_AWAITABLE 66
|
||||
#define GET_ITER 67
|
||||
#define IMPORT_FROM 68
|
||||
#define IMPORT_NAME 69
|
||||
#define IS_OP 70
|
||||
#define JUMP_BACKWARD 71
|
||||
#define JUMP_BACKWARD_NO_INTERRUPT 72
|
||||
#define JUMP_FORWARD 73
|
||||
#define LIST_APPEND 74
|
||||
#define LIST_EXTEND 75
|
||||
#define LOAD_ATTR 76
|
||||
#define LOAD_COMMON_CONSTANT 77
|
||||
#define LOAD_CONST 78
|
||||
#define LOAD_DEREF 79
|
||||
#define LOAD_FAST 80
|
||||
#define LOAD_FAST_AND_CLEAR 81
|
||||
#define LOAD_FAST_BORROW 82
|
||||
#define LOAD_FAST_BORROW_LOAD_FAST_BORROW 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 128
|
||||
#define BINARY_OP_ADD_FLOAT 129
|
||||
#define BINARY_OP_ADD_INT 130
|
||||
|
||||
Generated
+58
-59
@@ -289,65 +289,64 @@ opmap = frozendict(
|
||||
CONVERT_VALUE=56,
|
||||
COPY=57,
|
||||
COPY_FREE_VARS=58,
|
||||
DELETE_ATTR=59,
|
||||
DELETE_DEREF=60,
|
||||
DELETE_FAST=61,
|
||||
DICT_MERGE=62,
|
||||
DICT_UPDATE=63,
|
||||
END_ASYNC_FOR=64,
|
||||
EXTENDED_ARG=65,
|
||||
FOR_ITER=66,
|
||||
GET_AWAITABLE=67,
|
||||
GET_ITER=68,
|
||||
IMPORT_FROM=69,
|
||||
IMPORT_NAME=70,
|
||||
IS_OP=71,
|
||||
JUMP_BACKWARD=72,
|
||||
JUMP_BACKWARD_NO_INTERRUPT=73,
|
||||
JUMP_FORWARD=74,
|
||||
LIST_APPEND=75,
|
||||
LIST_EXTEND=76,
|
||||
LOAD_ATTR=77,
|
||||
LOAD_COMMON_CONSTANT=78,
|
||||
LOAD_CONST=79,
|
||||
LOAD_DEREF=80,
|
||||
LOAD_FAST=81,
|
||||
LOAD_FAST_AND_CLEAR=82,
|
||||
LOAD_FAST_BORROW=83,
|
||||
LOAD_FAST_BORROW_LOAD_FAST_BORROW=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,
|
||||
DELETE_DEREF=59,
|
||||
DELETE_FAST=60,
|
||||
DICT_MERGE=61,
|
||||
DICT_UPDATE=62,
|
||||
END_ASYNC_FOR=63,
|
||||
EXTENDED_ARG=64,
|
||||
FOR_ITER=65,
|
||||
GET_AWAITABLE=66,
|
||||
GET_ITER=67,
|
||||
IMPORT_FROM=68,
|
||||
IMPORT_NAME=69,
|
||||
IS_OP=70,
|
||||
JUMP_BACKWARD=71,
|
||||
JUMP_BACKWARD_NO_INTERRUPT=72,
|
||||
JUMP_FORWARD=73,
|
||||
LIST_APPEND=74,
|
||||
LIST_EXTEND=75,
|
||||
LOAD_ATTR=76,
|
||||
LOAD_COMMON_CONSTANT=77,
|
||||
LOAD_CONST=78,
|
||||
LOAD_DEREF=79,
|
||||
LOAD_FAST=80,
|
||||
LOAD_FAST_AND_CLEAR=81,
|
||||
LOAD_FAST_BORROW=82,
|
||||
LOAD_FAST_BORROW_LOAD_FAST_BORROW=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=233,
|
||||
INSTRUMENTED_POP_ITER=234,
|
||||
INSTRUMENTED_END_SEND=235,
|
||||
|
||||
@@ -2369,7 +2369,10 @@ class TestSourcePositions(unittest.TestCase):
|
||||
source = "del (\n lhs \n . \n rhs \n )"
|
||||
code = compile(source, "<test>", "exec")
|
||||
self.assertOpcodeSourcePositionIs(
|
||||
code, "DELETE_ATTR", line=4, end_line=4, column=5, end_column=8
|
||||
code, "PUSH_NULL", line=4, end_line=4, column=5, end_column=8
|
||||
)
|
||||
self.assertOpcodeSourcePositionIs(
|
||||
code, "STORE_ATTR", line=4, end_line=4, column=5, end_column=8
|
||||
)
|
||||
|
||||
def test_attribute_load(self):
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
The ``DELETE_ATTR`` opcode is now replaced with ``PUSH_NULL; STORE_ATTR``.
|
||||
Generated
+22
-51
@@ -5827,33 +5827,6 @@
|
||||
DISPATCH();
|
||||
}
|
||||
|
||||
TARGET(DELETE_ATTR) {
|
||||
#if _Py_TAIL_CALL_INTERP
|
||||
int opcode = DELETE_ATTR;
|
||||
(void)(opcode);
|
||||
#endif
|
||||
frame->instr_ptr = next_instr;
|
||||
next_instr += 1;
|
||||
INSTRUCTION_STATS(DELETE_ATTR);
|
||||
_PyStackRef owner;
|
||||
owner = stack_pointer[-1];
|
||||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
int err = PyObject_DelAttr(PyStackRef_AsPyObjectBorrow(owner), name);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
stack_pointer += -1;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
PyStackRef_CLOSE(owner);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
if (err) {
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
DISPATCH();
|
||||
}
|
||||
|
||||
TARGET(DELETE_DEREF) {
|
||||
#if _Py_TAIL_CALL_INTERP
|
||||
int opcode = DELETE_DEREF;
|
||||
@@ -12076,22 +12049,25 @@
|
||||
PREDICTED_STORE_ATTR:;
|
||||
_Py_CODEUNIT* const this_instr = next_instr - 5;
|
||||
(void)this_instr;
|
||||
_PyStackRef owner;
|
||||
_PyStackRef v;
|
||||
_PyStackRef owner;
|
||||
// _SPECIALIZE_STORE_ATTR
|
||||
{
|
||||
owner = stack_pointer[-1];
|
||||
v = stack_pointer[-2];
|
||||
uint16_t counter = read_u16(&this_instr[1].cache);
|
||||
(void)counter;
|
||||
#if ENABLE_SPECIALIZATION
|
||||
if (ADAPTIVE_COUNTER_TRIGGERS(counter)) {
|
||||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
|
||||
next_instr = this_instr;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
_Py_Specialize_StoreAttr(owner, next_instr, name);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
DISPATCH_SAME_OPARG();
|
||||
if (!PyStackRef_IsNull(v)) {
|
||||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
|
||||
next_instr = this_instr;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
_Py_Specialize_StoreAttr(owner, next_instr, name);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
DISPATCH_SAME_OPARG();
|
||||
}
|
||||
}
|
||||
OPCODE_DEFERRED_INC(STORE_ATTR);
|
||||
ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter);
|
||||
@@ -12100,29 +12076,24 @@
|
||||
/* Skip 3 cache entries */
|
||||
// _STORE_ATTR
|
||||
{
|
||||
v = stack_pointer[-2];
|
||||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
int err = PyObject_SetAttr(PyStackRef_AsPyObjectBorrow(owner),
|
||||
name, PyStackRef_AsPyObjectBorrow(v));
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
_PyStackRef tmp = owner;
|
||||
owner = PyStackRef_NULL;
|
||||
stack_pointer[-1] = owner;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
tmp = v;
|
||||
v = PyStackRef_NULL;
|
||||
stack_pointer[-2] = v;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
stack_pointer += -2;
|
||||
stack_pointer += -1;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
PyStackRef_CLOSE(owner);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
stack_pointer += -1;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
PyStackRef_XCLOSE(v);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
if (err) {
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
|
||||
Generated
+4
-5
@@ -59,7 +59,6 @@ static void *opcode_targets_table[256] = {
|
||||
&&TARGET_CONVERT_VALUE,
|
||||
&&TARGET_COPY,
|
||||
&&TARGET_COPY_FREE_VARS,
|
||||
&&TARGET_DELETE_ATTR,
|
||||
&&TARGET_DELETE_DEREF,
|
||||
&&TARGET_DELETE_FAST,
|
||||
&&TARGET_DICT_MERGE,
|
||||
@@ -128,6 +127,7 @@ static void *opcode_targets_table[256] = {
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_RESUME,
|
||||
&&TARGET_BINARY_OP_ADD_FLOAT,
|
||||
&&TARGET_BINARY_OP_ADD_INT,
|
||||
@@ -376,7 +376,7 @@ static void *opcode_tracing_targets_table[256] = {
|
||||
&&TARGET_TRACE_RECORD,
|
||||
&&TARGET_TRACE_RECORD,
|
||||
&&TARGET_TRACE_RECORD,
|
||||
&&TARGET_TRACE_RECORD,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
@@ -601,7 +601,6 @@ static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_CONTAINS_OP_SET(TAIL_CALL_PARAMS
|
||||
static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_CONVERT_VALUE(TAIL_CALL_PARAMS);
|
||||
static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_COPY(TAIL_CALL_PARAMS);
|
||||
static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_COPY_FREE_VARS(TAIL_CALL_PARAMS);
|
||||
static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_DELETE_ATTR(TAIL_CALL_PARAMS);
|
||||
static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_DELETE_DEREF(TAIL_CALL_PARAMS);
|
||||
static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_DELETE_FAST(TAIL_CALL_PARAMS);
|
||||
static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_DELETE_SUBSCR(TAIL_CALL_PARAMS);
|
||||
@@ -845,7 +844,6 @@ static py_tail_call_funcptr instruction_funcptr_handler_table[256] = {
|
||||
[CONVERT_VALUE] = _TAIL_CALL_CONVERT_VALUE,
|
||||
[COPY] = _TAIL_CALL_COPY,
|
||||
[COPY_FREE_VARS] = _TAIL_CALL_COPY_FREE_VARS,
|
||||
[DELETE_ATTR] = _TAIL_CALL_DELETE_ATTR,
|
||||
[DELETE_DEREF] = _TAIL_CALL_DELETE_DEREF,
|
||||
[DELETE_FAST] = _TAIL_CALL_DELETE_FAST,
|
||||
[DELETE_SUBSCR] = _TAIL_CALL_DELETE_SUBSCR,
|
||||
@@ -1007,6 +1005,7 @@ static py_tail_call_funcptr instruction_funcptr_handler_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,
|
||||
@@ -1103,7 +1102,6 @@ static py_tail_call_funcptr instruction_funcptr_tracing_table[256] = {
|
||||
[CONVERT_VALUE] = _TAIL_CALL_TRACE_RECORD,
|
||||
[COPY] = _TAIL_CALL_TRACE_RECORD,
|
||||
[COPY_FREE_VARS] = _TAIL_CALL_TRACE_RECORD,
|
||||
[DELETE_ATTR] = _TAIL_CALL_TRACE_RECORD,
|
||||
[DELETE_DEREF] = _TAIL_CALL_TRACE_RECORD,
|
||||
[DELETE_FAST] = _TAIL_CALL_TRACE_RECORD,
|
||||
[DELETE_SUBSCR] = _TAIL_CALL_TRACE_RECORD,
|
||||
@@ -1265,6 +1263,7 @@ static py_tail_call_funcptr instruction_funcptr_tracing_table[256] = {
|
||||
[UNPACK_SEQUENCE_TWO_TUPLE] = _TAIL_CALL_TRACE_RECORD,
|
||||
[WITH_EXCEPT_START] = _TAIL_CALL_TRACE_RECORD,
|
||||
[YIELD_VALUE] = _TAIL_CALL_TRACE_RECORD,
|
||||
[117] = _TAIL_CALL_UNKNOWN_OPCODE,
|
||||
[118] = _TAIL_CALL_UNKNOWN_OPCODE,
|
||||
[119] = _TAIL_CALL_UNKNOWN_OPCODE,
|
||||
[120] = _TAIL_CALL_UNKNOWN_OPCODE,
|
||||
|
||||
Generated
+10
-10
@@ -1,19 +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,188,0,0,0,128,0,0,0,91,0,
|
||||
78,7,70,0,113,0,91,0,78,7,70,4,113,1,90,2,
|
||||
31,0,79,1,50,1,0,0,0,0,0,0,29,0,90,2,
|
||||
31,0,79,2,90,0,77,6,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,243,188,0,0,0,128,0,0,0,90,0,
|
||||
77,7,69,0,112,0,90,0,77,7,69,4,112,1,89,2,
|
||||
31,0,78,1,50,1,0,0,0,0,0,0,29,0,89,2,
|
||||
31,0,78,2,89,0,76,6,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,50,2,0,0,0,0,
|
||||
0,0,29,0,90,1,77,8,0,0,0,0,0,0,0,0,
|
||||
0,0,29,0,89,1,76,8,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,31,0,50,0,0,0,
|
||||
0,0,0,0,79,3,42,26,0,0,0,0,0,0,0,0,
|
||||
0,0,113,5,79,6,68,0,0,0,66,24,0,0,113,6,
|
||||
90,2,31,0,79,4,90,6,12,0,79,5,90,5,90,6,
|
||||
0,0,0,0,78,3,42,26,0,0,0,0,0,0,0,0,
|
||||
0,0,112,5,78,6,67,0,0,0,65,24,0,0,112,6,
|
||||
89,2,31,0,78,4,89,6,12,0,78,5,89,5,89,6,
|
||||
42,26,0,0,0,0,0,0,0,0,0,0,12,0,48,4,
|
||||
50,1,0,0,0,0,0,0,29,0,72,26,0,0,9,0,
|
||||
28,0,78,7,33,0,41,7,233,0,0,0,0,122,18,70,
|
||||
50,1,0,0,0,0,0,0,29,0,71,26,0,0,9,0,
|
||||
28,0,77,7,33,0,41,7,233,0,0,0,0,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,122,7,99,111,110,102,105,103,32,122,2,58,32,
|
||||
|
||||
+9
-13
@@ -2131,13 +2131,15 @@ dummy_func(
|
||||
STORE_ATTR_WITH_HINT,
|
||||
};
|
||||
|
||||
specializing op(_SPECIALIZE_STORE_ATTR, (counter/1, owner -- owner)) {
|
||||
specializing op(_SPECIALIZE_STORE_ATTR, (counter/1, v, owner -- v, owner)) {
|
||||
#if ENABLE_SPECIALIZATION
|
||||
if (ADAPTIVE_COUNTER_TRIGGERS(counter)) {
|
||||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
|
||||
next_instr = this_instr;
|
||||
_Py_Specialize_StoreAttr(owner, next_instr, name);
|
||||
DISPATCH_SAME_OPARG();
|
||||
if (!PyStackRef_IsNull(v)) {
|
||||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
|
||||
next_instr = this_instr;
|
||||
_Py_Specialize_StoreAttr(owner, next_instr, name);
|
||||
DISPATCH_SAME_OPARG();
|
||||
}
|
||||
}
|
||||
OPCODE_DEFERRED_INC(STORE_ATTR);
|
||||
ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter);
|
||||
@@ -2148,19 +2150,13 @@ dummy_func(
|
||||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
|
||||
int err = PyObject_SetAttr(PyStackRef_AsPyObjectBorrow(owner),
|
||||
name, PyStackRef_AsPyObjectBorrow(v));
|
||||
DECREF_INPUTS();
|
||||
PyStackRef_CLOSE(owner);
|
||||
PyStackRef_XCLOSE(v);
|
||||
ERROR_IF(err);
|
||||
}
|
||||
|
||||
macro(STORE_ATTR) = _SPECIALIZE_STORE_ATTR + unused/3 + _STORE_ATTR;
|
||||
|
||||
inst(DELETE_ATTR, (owner --)) {
|
||||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
|
||||
int err = PyObject_DelAttr(PyStackRef_AsPyObjectBorrow(owner), name);
|
||||
PyStackRef_CLOSE(owner);
|
||||
ERROR_IF(err);
|
||||
}
|
||||
|
||||
inst(STORE_GLOBAL, (v --)) {
|
||||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
|
||||
int err;
|
||||
|
||||
+5
-2
@@ -5534,18 +5534,21 @@ codegen_visit_expr(compiler *c, expr_ty e)
|
||||
}
|
||||
}
|
||||
RETURN_IF_ERROR(_PyCompile_MaybeAddStaticAttributeToClass(c, e));
|
||||
VISIT(c, expr, e->v.Attribute.value);
|
||||
loc = LOC(e);
|
||||
loc = update_start_location_to_match_attr(c, loc, e);
|
||||
switch (e->v.Attribute.ctx) {
|
||||
case Load:
|
||||
VISIT(c, expr, e->v.Attribute.value);
|
||||
ADDOP_NAME(c, loc, LOAD_ATTR, e->v.Attribute.attr, names);
|
||||
break;
|
||||
case Store:
|
||||
VISIT(c, expr, e->v.Attribute.value);
|
||||
ADDOP_NAME(c, loc, STORE_ATTR, e->v.Attribute.attr, names);
|
||||
break;
|
||||
case Del:
|
||||
ADDOP_NAME(c, loc, DELETE_ATTR, e->v.Attribute.attr, names);
|
||||
ADDOP(c, loc, PUSH_NULL);
|
||||
VISIT(c, expr, e->v.Attribute.value);
|
||||
ADDOP_NAME(c, loc, STORE_ATTR, e->v.Attribute.attr, names);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
Generated
+6
-43
@@ -9948,55 +9948,18 @@
|
||||
int err = PyObject_SetAttr(PyStackRef_AsPyObjectBorrow(owner),
|
||||
name, PyStackRef_AsPyObjectBorrow(v));
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
_PyStackRef tmp = owner;
|
||||
owner = PyStackRef_NULL;
|
||||
stack_pointer[-1] = owner;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
tmp = v;
|
||||
v = PyStackRef_NULL;
|
||||
stack_pointer[-2] = v;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
stack_pointer += -2;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
if (err) {
|
||||
SET_CURRENT_CACHED_VALUES(0);
|
||||
JUMP_TO_ERROR();
|
||||
}
|
||||
_tos_cache0 = PyStackRef_ZERO_BITS;
|
||||
_tos_cache1 = PyStackRef_ZERO_BITS;
|
||||
_tos_cache2 = PyStackRef_ZERO_BITS;
|
||||
SET_CURRENT_CACHED_VALUES(0);
|
||||
ASSERT_WITHIN_STACK_BOUNDS_IGNORING_CACHE(__FILE__, __LINE__);
|
||||
break;
|
||||
}
|
||||
|
||||
case _DELETE_ATTR_r10: {
|
||||
CHECK_CURRENT_CACHED_VALUES(1);
|
||||
ASSERT_WITHIN_STACK_BOUNDS_IGNORING_CACHE(__FILE__, __LINE__);
|
||||
_PyStackRef owner;
|
||||
_PyStackRef _stack_item_0 = _tos_cache0;
|
||||
oparg = CURRENT_OPARG();
|
||||
owner = _stack_item_0;
|
||||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
|
||||
stack_pointer[0] = owner;
|
||||
stack_pointer += 1;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
int err = PyObject_DelAttr(PyStackRef_AsPyObjectBorrow(owner), name);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
stack_pointer += -1;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
PyStackRef_CLOSE(owner);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
stack_pointer += -1;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
PyStackRef_XCLOSE(v);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
if (err) {
|
||||
SET_CURRENT_CACHED_VALUES(0);
|
||||
JUMP_TO_ERROR();
|
||||
|
||||
Generated
+22
-51
@@ -5827,33 +5827,6 @@
|
||||
DISPATCH();
|
||||
}
|
||||
|
||||
TARGET(DELETE_ATTR) {
|
||||
#if _Py_TAIL_CALL_INTERP
|
||||
int opcode = DELETE_ATTR;
|
||||
(void)(opcode);
|
||||
#endif
|
||||
frame->instr_ptr = next_instr;
|
||||
next_instr += 1;
|
||||
INSTRUCTION_STATS(DELETE_ATTR);
|
||||
_PyStackRef owner;
|
||||
owner = stack_pointer[-1];
|
||||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
int err = PyObject_DelAttr(PyStackRef_AsPyObjectBorrow(owner), name);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
stack_pointer += -1;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
PyStackRef_CLOSE(owner);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
if (err) {
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
DISPATCH();
|
||||
}
|
||||
|
||||
TARGET(DELETE_DEREF) {
|
||||
#if _Py_TAIL_CALL_INTERP
|
||||
int opcode = DELETE_DEREF;
|
||||
@@ -12073,22 +12046,25 @@
|
||||
PREDICTED_STORE_ATTR:;
|
||||
_Py_CODEUNIT* const this_instr = next_instr - 5;
|
||||
(void)this_instr;
|
||||
_PyStackRef owner;
|
||||
_PyStackRef v;
|
||||
_PyStackRef owner;
|
||||
// _SPECIALIZE_STORE_ATTR
|
||||
{
|
||||
owner = stack_pointer[-1];
|
||||
v = stack_pointer[-2];
|
||||
uint16_t counter = read_u16(&this_instr[1].cache);
|
||||
(void)counter;
|
||||
#if ENABLE_SPECIALIZATION
|
||||
if (ADAPTIVE_COUNTER_TRIGGERS(counter)) {
|
||||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
|
||||
next_instr = this_instr;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
_Py_Specialize_StoreAttr(owner, next_instr, name);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
DISPATCH_SAME_OPARG();
|
||||
if (!PyStackRef_IsNull(v)) {
|
||||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
|
||||
next_instr = this_instr;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
_Py_Specialize_StoreAttr(owner, next_instr, name);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
DISPATCH_SAME_OPARG();
|
||||
}
|
||||
}
|
||||
OPCODE_DEFERRED_INC(STORE_ATTR);
|
||||
ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter);
|
||||
@@ -12097,29 +12073,24 @@
|
||||
/* Skip 3 cache entries */
|
||||
// _STORE_ATTR
|
||||
{
|
||||
v = stack_pointer[-2];
|
||||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
int err = PyObject_SetAttr(PyStackRef_AsPyObjectBorrow(owner),
|
||||
name, PyStackRef_AsPyObjectBorrow(v));
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
_PyStackRef tmp = owner;
|
||||
owner = PyStackRef_NULL;
|
||||
stack_pointer[-1] = owner;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
tmp = v;
|
||||
v = PyStackRef_NULL;
|
||||
stack_pointer[-2] = v;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
stack_pointer += -2;
|
||||
stack_pointer += -1;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
PyStackRef_CLOSE(owner);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
stack_pointer += -1;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyFrame_StackPointerValidate(frame);
|
||||
PyStackRef_XCLOSE(v);
|
||||
_PyFrame_StackPointerInvalidate(frame);
|
||||
if (err) {
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
|
||||
Generated
+4
-5
@@ -59,7 +59,6 @@ static void *opcode_targets_table[256] = {
|
||||
&&TARGET_CONVERT_VALUE,
|
||||
&&TARGET_COPY,
|
||||
&&TARGET_COPY_FREE_VARS,
|
||||
&&TARGET_DELETE_ATTR,
|
||||
&&TARGET_DELETE_DEREF,
|
||||
&&TARGET_DELETE_FAST,
|
||||
&&TARGET_DICT_MERGE,
|
||||
@@ -128,6 +127,7 @@ static void *opcode_targets_table[256] = {
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_RESUME,
|
||||
&&TARGET_BINARY_OP_ADD_FLOAT,
|
||||
&&TARGET_BINARY_OP_ADD_INT,
|
||||
@@ -376,7 +376,7 @@ static void *opcode_tracing_targets_table[256] = {
|
||||
&&TARGET_TRACE_RECORD,
|
||||
&&TARGET_TRACE_RECORD,
|
||||
&&TARGET_TRACE_RECORD,
|
||||
&&TARGET_TRACE_RECORD,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
@@ -601,7 +601,6 @@ static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_CONTAINS_OP_SET(TAIL_CALL_PARAMS
|
||||
static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_CONVERT_VALUE(TAIL_CALL_PARAMS);
|
||||
static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_COPY(TAIL_CALL_PARAMS);
|
||||
static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_COPY_FREE_VARS(TAIL_CALL_PARAMS);
|
||||
static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_DELETE_ATTR(TAIL_CALL_PARAMS);
|
||||
static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_DELETE_DEREF(TAIL_CALL_PARAMS);
|
||||
static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_DELETE_FAST(TAIL_CALL_PARAMS);
|
||||
static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_DELETE_SUBSCR(TAIL_CALL_PARAMS);
|
||||
@@ -845,7 +844,6 @@ static py_tail_call_funcptr instruction_funcptr_handler_table[256] = {
|
||||
[CONVERT_VALUE] = _TAIL_CALL_CONVERT_VALUE,
|
||||
[COPY] = _TAIL_CALL_COPY,
|
||||
[COPY_FREE_VARS] = _TAIL_CALL_COPY_FREE_VARS,
|
||||
[DELETE_ATTR] = _TAIL_CALL_DELETE_ATTR,
|
||||
[DELETE_DEREF] = _TAIL_CALL_DELETE_DEREF,
|
||||
[DELETE_FAST] = _TAIL_CALL_DELETE_FAST,
|
||||
[DELETE_SUBSCR] = _TAIL_CALL_DELETE_SUBSCR,
|
||||
@@ -1007,6 +1005,7 @@ static py_tail_call_funcptr instruction_funcptr_handler_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,
|
||||
@@ -1103,7 +1102,6 @@ static py_tail_call_funcptr instruction_funcptr_tracing_table[256] = {
|
||||
[CONVERT_VALUE] = _TAIL_CALL_TRACE_RECORD,
|
||||
[COPY] = _TAIL_CALL_TRACE_RECORD,
|
||||
[COPY_FREE_VARS] = _TAIL_CALL_TRACE_RECORD,
|
||||
[DELETE_ATTR] = _TAIL_CALL_TRACE_RECORD,
|
||||
[DELETE_DEREF] = _TAIL_CALL_TRACE_RECORD,
|
||||
[DELETE_FAST] = _TAIL_CALL_TRACE_RECORD,
|
||||
[DELETE_SUBSCR] = _TAIL_CALL_TRACE_RECORD,
|
||||
@@ -1265,6 +1263,7 @@ static py_tail_call_funcptr instruction_funcptr_tracing_table[256] = {
|
||||
[UNPACK_SEQUENCE_TWO_TUPLE] = _TAIL_CALL_TRACE_RECORD,
|
||||
[WITH_EXCEPT_START] = _TAIL_CALL_TRACE_RECORD,
|
||||
[YIELD_VALUE] = _TAIL_CALL_TRACE_RECORD,
|
||||
[117] = _TAIL_CALL_UNKNOWN_OPCODE,
|
||||
[118] = _TAIL_CALL_UNKNOWN_OPCODE,
|
||||
[119] = _TAIL_CALL_UNKNOWN_OPCODE,
|
||||
[120] = _TAIL_CALL_UNKNOWN_OPCODE,
|
||||
|
||||
Generated
-7
@@ -2149,13 +2149,6 @@
|
||||
break;
|
||||
}
|
||||
|
||||
case _DELETE_ATTR: {
|
||||
CHECK_STACK_BOUNDS(-1);
|
||||
stack_pointer += -1;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
break;
|
||||
}
|
||||
|
||||
case _STORE_GLOBAL: {
|
||||
CHECK_STACK_BOUNDS(-1);
|
||||
stack_pointer += -1;
|
||||
|
||||
Reference in new issue
Block a user