mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
GH-134282: Always borrow references LOAD_CONST (GH-134284)
This commit is contained in:
parent
f695eca60c
commit
6dcb0fdfe0
17 changed files with 87 additions and 327 deletions
|
@ -295,55 +295,18 @@ dummy_func(
|
|||
value2 = PyStackRef_Borrow(GETLOCAL(oparg2));
|
||||
}
|
||||
|
||||
family(LOAD_CONST, 0) = {
|
||||
LOAD_CONST_MORTAL,
|
||||
LOAD_CONST_IMMORTAL,
|
||||
};
|
||||
|
||||
inst(LOAD_CONST, (-- value)) {
|
||||
/* We can't do this in the bytecode compiler as
|
||||
* marshalling can intern strings and make them immortal. */
|
||||
PyObject *obj = GETITEM(FRAME_CO_CONSTS, oparg);
|
||||
value = PyStackRef_FromPyObjectNew(obj);
|
||||
#if ENABLE_SPECIALIZATION_FT
|
||||
#ifdef Py_GIL_DISABLED
|
||||
uint8_t expected = LOAD_CONST;
|
||||
if (!_Py_atomic_compare_exchange_uint8(
|
||||
&this_instr->op.code, &expected,
|
||||
_Py_IsImmortal(obj) ? LOAD_CONST_IMMORTAL : LOAD_CONST_MORTAL)) {
|
||||
// We might lose a race with instrumentation, which we don't care about.
|
||||
assert(expected >= MIN_INSTRUMENTED_OPCODE);
|
||||
}
|
||||
#else
|
||||
if (this_instr->op.code == LOAD_CONST) {
|
||||
this_instr->op.code = _Py_IsImmortal(obj) ? LOAD_CONST_IMMORTAL : LOAD_CONST_MORTAL;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
inst(LOAD_CONST_MORTAL, (-- value)) {
|
||||
PyObject *obj = GETITEM(FRAME_CO_CONSTS, oparg);
|
||||
value = PyStackRef_FromPyObjectNewMortal(obj);
|
||||
}
|
||||
|
||||
inst(LOAD_CONST_IMMORTAL, (-- value)) {
|
||||
PyObject *obj = GETITEM(FRAME_CO_CONSTS, oparg);
|
||||
assert(_Py_IsImmortal(obj));
|
||||
value = PyStackRef_FromPyObjectImmortal(obj);
|
||||
value = PyStackRef_FromPyObjectBorrow(obj);
|
||||
}
|
||||
|
||||
replicate(4) inst(LOAD_SMALL_INT, (-- value)) {
|
||||
assert(oparg < _PY_NSMALLPOSINTS);
|
||||
PyObject *obj = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + oparg];
|
||||
value = PyStackRef_FromPyObjectImmortal(obj);
|
||||
value = PyStackRef_FromPyObjectBorrow(obj);
|
||||
}
|
||||
|
||||
replicate(8) inst(STORE_FAST, (value --)) {
|
||||
assert(
|
||||
((_PyFrame_GetCode(frame)->co_flags & (CO_COROUTINE | CO_GENERATOR)) == 0) ||
|
||||
PyStackRef_IsHeapSafe(value)
|
||||
);
|
||||
_PyStackRef tmp = GETLOCAL(oparg);
|
||||
GETLOCAL(oparg) = value;
|
||||
DEAD(value);
|
||||
|
@ -355,10 +318,6 @@ dummy_func(
|
|||
};
|
||||
|
||||
inst(STORE_FAST_LOAD_FAST, (value1 -- value2)) {
|
||||
assert(
|
||||
((_PyFrame_GetCode(frame)->co_flags & (CO_COROUTINE | CO_GENERATOR)) == 0) ||
|
||||
PyStackRef_IsHeapSafe(value1)
|
||||
);
|
||||
uint32_t oparg1 = oparg >> 4;
|
||||
uint32_t oparg2 = oparg & 15;
|
||||
_PyStackRef tmp = GETLOCAL(oparg1);
|
||||
|
@ -369,14 +328,6 @@ dummy_func(
|
|||
}
|
||||
|
||||
inst(STORE_FAST_STORE_FAST, (value2, value1 --)) {
|
||||
assert(
|
||||
((_PyFrame_GetCode(frame)->co_flags & (CO_COROUTINE | CO_GENERATOR)) == 0) ||
|
||||
PyStackRef_IsHeapSafe(value1)
|
||||
);
|
||||
assert(
|
||||
((_PyFrame_GetCode(frame)->co_flags & (CO_COROUTINE | CO_GENERATOR)) == 0) ||
|
||||
PyStackRef_IsHeapSafe(value2)
|
||||
);
|
||||
uint32_t oparg1 = oparg >> 4;
|
||||
uint32_t oparg2 = oparg & 15;
|
||||
_PyStackRef tmp = GETLOCAL(oparg1);
|
||||
|
@ -942,7 +893,7 @@ dummy_func(
|
|||
PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc);
|
||||
DEAD(sub_st);
|
||||
PyStackRef_CLOSE(str_st);
|
||||
res = PyStackRef_FromPyObjectImmortal(res_o);
|
||||
res = PyStackRef_FromPyObjectBorrow(res_o);
|
||||
}
|
||||
|
||||
op(_GUARD_NOS_TUPLE, (nos, unused -- nos, unused)) {
|
||||
|
@ -5328,18 +5279,18 @@ dummy_func(
|
|||
}
|
||||
|
||||
tier2 pure op(_LOAD_CONST_INLINE_BORROW, (ptr/4 -- value)) {
|
||||
value = PyStackRef_FromPyObjectImmortal(ptr);
|
||||
value = PyStackRef_FromPyObjectBorrow(ptr);
|
||||
}
|
||||
|
||||
tier2 pure op (_POP_TOP_LOAD_CONST_INLINE_BORROW, (ptr/4, pop -- value)) {
|
||||
PyStackRef_CLOSE(pop);
|
||||
value = PyStackRef_FromPyObjectImmortal(ptr);
|
||||
value = PyStackRef_FromPyObjectBorrow(ptr);
|
||||
}
|
||||
|
||||
tier2 pure op(_POP_TWO_LOAD_CONST_INLINE_BORROW, (ptr/4, pop1, pop2 -- value)) {
|
||||
PyStackRef_CLOSE(pop2);
|
||||
PyStackRef_CLOSE(pop1);
|
||||
value = PyStackRef_FromPyObjectImmortal(ptr);
|
||||
value = PyStackRef_FromPyObjectBorrow(ptr);
|
||||
}
|
||||
|
||||
tier2 pure op(_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, (ptr/4, callable, null, pop1, pop2 -- value)) {
|
||||
|
@ -5348,7 +5299,7 @@ dummy_func(
|
|||
(void)null; // Silence compiler warnings about unused variables
|
||||
DEAD(null);
|
||||
PyStackRef_CLOSE(callable);
|
||||
value = PyStackRef_FromPyObjectImmortal(ptr);
|
||||
value = PyStackRef_FromPyObjectBorrow(ptr);
|
||||
}
|
||||
|
||||
tier2 op(_CHECK_FUNCTION, (func_version/2 -- )) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue