gh-145855: Remove the DELETE_ATTR bytecode (GH-146216)

This commit is contained in:
An Long authored and GitHub committed 2026-07-06 10:41:47 +01:00
1 parent db3a4773e1
commit 8bee2a39b8
19 files changed
+999 -1134

No files matched your search

-11
View File
@@ -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.
+1
View File
@@ -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
+2 -1
View File
@@ -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
View File
@@ -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: \
+791 -793
View File
File diff suppressed because it is too large. Load diff
-15
View File
@@ -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:
+58 -59
View File
@@ -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
+58 -59
View File
@@ -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,
+4 -1
View File
@@ -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``.
+22 -51
View File
@@ -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);
}
+4 -5
View File
@@ -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,
+10 -10
View File
@@ -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
View File
@@ -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
View File
@@ -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;
+6 -43
View File
@@ -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();
+22 -51
View File
@@ -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);
}
+4 -5
View File
@@ -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,
-7
View File
@@ -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;