mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
GH-125323: Convert DECREF_INPUTS_AND_REUSE_FLOAT into a function that takes PyStackRefs. (GH-125439)
This commit is contained in:
parent
67f6e08147
commit
06ca33020e
10 changed files with 69 additions and 44 deletions
|
@ -316,6 +316,8 @@ _Py_eval_breaker_bit_is_set(PyThreadState *tstate, uintptr_t bit)
|
||||||
void _Py_set_eval_breaker_bit_all(PyInterpreterState *interp, uintptr_t bit);
|
void _Py_set_eval_breaker_bit_all(PyInterpreterState *interp, uintptr_t bit);
|
||||||
void _Py_unset_eval_breaker_bit_all(PyInterpreterState *interp, uintptr_t bit);
|
void _Py_unset_eval_breaker_bit_all(PyInterpreterState *interp, uintptr_t bit);
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) _PyFloat_FromDouble_ConsumeInputs(_PyStackRef left, _PyStackRef right, double value);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
6
Include/internal/pycore_opcode_metadata.h
generated
6
Include/internal/pycore_opcode_metadata.h
generated
|
@ -1015,13 +1015,13 @@ extern const struct opcode_metadata _PyOpcode_opcode_metadata[266];
|
||||||
#ifdef NEED_OPCODE_METADATA
|
#ifdef NEED_OPCODE_METADATA
|
||||||
const struct opcode_metadata _PyOpcode_opcode_metadata[266] = {
|
const struct opcode_metadata _PyOpcode_opcode_metadata[266] = {
|
||||||
[BINARY_OP] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
[BINARY_OP] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
||||||
[BINARY_OP_ADD_FLOAT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG },
|
[BINARY_OP_ADD_FLOAT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
|
||||||
[BINARY_OP_ADD_INT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
|
[BINARY_OP_ADD_INT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
|
||||||
[BINARY_OP_ADD_UNICODE] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
|
[BINARY_OP_ADD_UNICODE] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
|
||||||
[BINARY_OP_INPLACE_ADD_UNICODE] = { true, INSTR_FMT_IXC, HAS_LOCAL_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG },
|
[BINARY_OP_INPLACE_ADD_UNICODE] = { true, INSTR_FMT_IXC, HAS_LOCAL_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG },
|
||||||
[BINARY_OP_MULTIPLY_FLOAT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG },
|
[BINARY_OP_MULTIPLY_FLOAT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
|
||||||
[BINARY_OP_MULTIPLY_INT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
|
[BINARY_OP_MULTIPLY_INT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
|
||||||
[BINARY_OP_SUBTRACT_FLOAT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG },
|
[BINARY_OP_SUBTRACT_FLOAT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
|
||||||
[BINARY_OP_SUBTRACT_INT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
|
[BINARY_OP_SUBTRACT_INT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
|
||||||
[BINARY_SLICE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
[BINARY_SLICE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
||||||
[BINARY_SUBSCR] = { true, INSTR_FMT_IXC, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
[BINARY_SUBSCR] = { true, INSTR_FMT_IXC, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
||||||
|
|
|
@ -76,6 +76,13 @@ PyStackRef_AsPyObjectBorrow(_PyStackRef stackref)
|
||||||
|
|
||||||
#define PyStackRef_IsDeferred(ref) (((ref).bits & Py_TAG_BITS) == Py_TAG_DEFERRED)
|
#define PyStackRef_IsDeferred(ref) (((ref).bits & Py_TAG_BITS) == Py_TAG_DEFERRED)
|
||||||
|
|
||||||
|
static inline PyObject *
|
||||||
|
PyStackRef_NotDeferred_AsPyObject(_PyStackRef stackref)
|
||||||
|
{
|
||||||
|
assert(!PyStackRef_IsDeferred(stackref));
|
||||||
|
return (PyObject *)stackref.bits;
|
||||||
|
}
|
||||||
|
|
||||||
static inline PyObject *
|
static inline PyObject *
|
||||||
PyStackRef_AsPyObjectSteal(_PyStackRef stackref)
|
PyStackRef_AsPyObjectSteal(_PyStackRef stackref)
|
||||||
{
|
{
|
||||||
|
|
6
Include/internal/pycore_uop_metadata.h
generated
6
Include/internal/pycore_uop_metadata.h
generated
|
@ -69,9 +69,9 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
|
||||||
[_GUARD_BOTH_FLOAT] = HAS_EXIT_FLAG,
|
[_GUARD_BOTH_FLOAT] = HAS_EXIT_FLAG,
|
||||||
[_GUARD_NOS_FLOAT] = HAS_EXIT_FLAG,
|
[_GUARD_NOS_FLOAT] = HAS_EXIT_FLAG,
|
||||||
[_GUARD_TOS_FLOAT] = HAS_EXIT_FLAG,
|
[_GUARD_TOS_FLOAT] = HAS_EXIT_FLAG,
|
||||||
[_BINARY_OP_MULTIPLY_FLOAT] = HAS_PURE_FLAG,
|
[_BINARY_OP_MULTIPLY_FLOAT] = HAS_ERROR_FLAG | HAS_PURE_FLAG,
|
||||||
[_BINARY_OP_ADD_FLOAT] = HAS_PURE_FLAG,
|
[_BINARY_OP_ADD_FLOAT] = HAS_ERROR_FLAG | HAS_PURE_FLAG,
|
||||||
[_BINARY_OP_SUBTRACT_FLOAT] = HAS_PURE_FLAG,
|
[_BINARY_OP_SUBTRACT_FLOAT] = HAS_ERROR_FLAG | HAS_PURE_FLAG,
|
||||||
[_GUARD_BOTH_UNICODE] = HAS_EXIT_FLAG,
|
[_GUARD_BOTH_UNICODE] = HAS_EXIT_FLAG,
|
||||||
[_BINARY_OP_ADD_UNICODE] = HAS_ERROR_FLAG | HAS_PURE_FLAG,
|
[_BINARY_OP_ADD_UNICODE] = HAS_ERROR_FLAG | HAS_PURE_FLAG,
|
||||||
[_BINARY_OP_INPLACE_ADD_UNICODE] = HAS_LOCAL_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG,
|
[_BINARY_OP_INPLACE_ADD_UNICODE] = HAS_LOCAL_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG,
|
||||||
|
|
|
@ -134,6 +134,41 @@ PyFloat_FromDouble(double fval)
|
||||||
return (PyObject *) op;
|
return (PyObject *) op;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef Py_GIL_DISABLED
|
||||||
|
|
||||||
|
PyObject *_PyFloat_FromDouble_ConsumeInputs(_PyStackRef left, _PyStackRef right, double value)
|
||||||
|
{
|
||||||
|
PyStackRef_CLOSE(left);
|
||||||
|
PyStackRef_CLOSE(right);
|
||||||
|
return PyFloat_FromDouble(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else // Py_GIL_DISABLED
|
||||||
|
|
||||||
|
PyObject *_PyFloat_FromDouble_ConsumeInputs(_PyStackRef left, _PyStackRef right, double value)
|
||||||
|
{
|
||||||
|
PyObject *left_o = PyStackRef_AsPyObjectSteal(left);
|
||||||
|
PyObject *right_o = PyStackRef_AsPyObjectSteal(right);
|
||||||
|
if (Py_REFCNT(left_o) == 1) {
|
||||||
|
((PyFloatObject *)left_o)->ob_fval = value;
|
||||||
|
_Py_DECREF_SPECIALIZED(right_o, _PyFloat_ExactDealloc);
|
||||||
|
return left_o;
|
||||||
|
}
|
||||||
|
else if (Py_REFCNT(right_o) == 1) {
|
||||||
|
((PyFloatObject *)right_o)->ob_fval = value;
|
||||||
|
_Py_DECREF_NO_DEALLOC(left_o);
|
||||||
|
return right_o;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
PyObject *result = PyFloat_FromDouble(value);
|
||||||
|
_Py_DECREF_NO_DEALLOC(left_o);
|
||||||
|
_Py_DECREF_NO_DEALLOC(right_o);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // Py_GIL_DISABLED
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
float_from_string_inner(const char *s, Py_ssize_t len, void *obj)
|
float_from_string_inner(const char *s, Py_ssize_t len, void *obj)
|
||||||
{
|
{
|
||||||
|
|
|
@ -539,9 +539,9 @@ dummy_func(
|
||||||
double dres =
|
double dres =
|
||||||
((PyFloatObject *)left_o)->ob_fval *
|
((PyFloatObject *)left_o)->ob_fval *
|
||||||
((PyFloatObject *)right_o)->ob_fval;
|
((PyFloatObject *)right_o)->ob_fval;
|
||||||
PyObject *res_o;
|
PyObject *res_o = _PyFloat_FromDouble_ConsumeInputs(left, right, dres);
|
||||||
DECREF_INPUTS_AND_REUSE_FLOAT(left_o, right_o, dres, res_o);
|
|
||||||
INPUTS_DEAD();
|
INPUTS_DEAD();
|
||||||
|
ERROR_IF(res_o == NULL, error);
|
||||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -553,9 +553,9 @@ dummy_func(
|
||||||
double dres =
|
double dres =
|
||||||
((PyFloatObject *)left_o)->ob_fval +
|
((PyFloatObject *)left_o)->ob_fval +
|
||||||
((PyFloatObject *)right_o)->ob_fval;
|
((PyFloatObject *)right_o)->ob_fval;
|
||||||
PyObject *res_o;
|
PyObject *res_o = _PyFloat_FromDouble_ConsumeInputs(left, right, dres);
|
||||||
DECREF_INPUTS_AND_REUSE_FLOAT(left_o, right_o, dres, res_o);
|
|
||||||
INPUTS_DEAD();
|
INPUTS_DEAD();
|
||||||
|
ERROR_IF(res_o == NULL, error);
|
||||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -567,9 +567,9 @@ dummy_func(
|
||||||
double dres =
|
double dres =
|
||||||
((PyFloatObject *)left_o)->ob_fval -
|
((PyFloatObject *)left_o)->ob_fval -
|
||||||
((PyFloatObject *)right_o)->ob_fval;
|
((PyFloatObject *)right_o)->ob_fval;
|
||||||
PyObject *res_o;
|
PyObject *res_o = _PyFloat_FromDouble_ConsumeInputs(left, right, dres);
|
||||||
DECREF_INPUTS_AND_REUSE_FLOAT(left_o, right_o, dres, res_o);
|
|
||||||
INPUTS_DEAD();
|
INPUTS_DEAD();
|
||||||
|
ERROR_IF(res_o == NULL, error);
|
||||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -327,26 +327,6 @@ GETITEM(PyObject *v, Py_ssize_t i) {
|
||||||
" in enclosing scope"
|
" in enclosing scope"
|
||||||
#define NAME_ERROR_MSG "name '%.200s' is not defined"
|
#define NAME_ERROR_MSG "name '%.200s' is not defined"
|
||||||
|
|
||||||
#define DECREF_INPUTS_AND_REUSE_FLOAT(left, right, dval, result) \
|
|
||||||
do { \
|
|
||||||
if (Py_REFCNT(left) == 1) { \
|
|
||||||
((PyFloatObject *)left)->ob_fval = (dval); \
|
|
||||||
_Py_DECREF_SPECIALIZED(right, _PyFloat_ExactDealloc);\
|
|
||||||
result = (left); \
|
|
||||||
} \
|
|
||||||
else if (Py_REFCNT(right) == 1) {\
|
|
||||||
((PyFloatObject *)right)->ob_fval = (dval); \
|
|
||||||
_Py_DECREF_NO_DEALLOC(left); \
|
|
||||||
result = (right); \
|
|
||||||
}\
|
|
||||||
else { \
|
|
||||||
result = PyFloat_FromDouble(dval); \
|
|
||||||
if ((result) == NULL) GOTO_ERROR(error); \
|
|
||||||
_Py_DECREF_NO_DEALLOC(left); \
|
|
||||||
_Py_DECREF_NO_DEALLOC(right); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
// If a trace function sets a new f_lineno and
|
// If a trace function sets a new f_lineno and
|
||||||
// *then* raises, we use the destination when searching
|
// *then* raises, we use the destination when searching
|
||||||
// for an exception handler, displaying the traceback, and so on
|
// for an exception handler, displaying the traceback, and so on
|
||||||
|
|
12
Python/executor_cases.c.h
generated
12
Python/executor_cases.c.h
generated
|
@ -643,8 +643,8 @@
|
||||||
double dres =
|
double dres =
|
||||||
((PyFloatObject *)left_o)->ob_fval *
|
((PyFloatObject *)left_o)->ob_fval *
|
||||||
((PyFloatObject *)right_o)->ob_fval;
|
((PyFloatObject *)right_o)->ob_fval;
|
||||||
PyObject *res_o;
|
PyObject *res_o = _PyFloat_FromDouble_ConsumeInputs(left, right, dres);
|
||||||
DECREF_INPUTS_AND_REUSE_FLOAT(left_o, right_o, dres, res_o);
|
if (res_o == NULL) JUMP_TO_ERROR();
|
||||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||||
stack_pointer[-2] = res;
|
stack_pointer[-2] = res;
|
||||||
stack_pointer += -1;
|
stack_pointer += -1;
|
||||||
|
@ -664,8 +664,8 @@
|
||||||
double dres =
|
double dres =
|
||||||
((PyFloatObject *)left_o)->ob_fval +
|
((PyFloatObject *)left_o)->ob_fval +
|
||||||
((PyFloatObject *)right_o)->ob_fval;
|
((PyFloatObject *)right_o)->ob_fval;
|
||||||
PyObject *res_o;
|
PyObject *res_o = _PyFloat_FromDouble_ConsumeInputs(left, right, dres);
|
||||||
DECREF_INPUTS_AND_REUSE_FLOAT(left_o, right_o, dres, res_o);
|
if (res_o == NULL) JUMP_TO_ERROR();
|
||||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||||
stack_pointer[-2] = res;
|
stack_pointer[-2] = res;
|
||||||
stack_pointer += -1;
|
stack_pointer += -1;
|
||||||
|
@ -685,8 +685,8 @@
|
||||||
double dres =
|
double dres =
|
||||||
((PyFloatObject *)left_o)->ob_fval -
|
((PyFloatObject *)left_o)->ob_fval -
|
||||||
((PyFloatObject *)right_o)->ob_fval;
|
((PyFloatObject *)right_o)->ob_fval;
|
||||||
PyObject *res_o;
|
PyObject *res_o = _PyFloat_FromDouble_ConsumeInputs(left, right, dres);
|
||||||
DECREF_INPUTS_AND_REUSE_FLOAT(left_o, right_o, dres, res_o);
|
if (res_o == NULL) JUMP_TO_ERROR();
|
||||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||||
stack_pointer[-2] = res;
|
stack_pointer[-2] = res;
|
||||||
stack_pointer += -1;
|
stack_pointer += -1;
|
||||||
|
|
12
Python/generated_cases.c.h
generated
12
Python/generated_cases.c.h
generated
|
@ -84,8 +84,8 @@
|
||||||
double dres =
|
double dres =
|
||||||
((PyFloatObject *)left_o)->ob_fval +
|
((PyFloatObject *)left_o)->ob_fval +
|
||||||
((PyFloatObject *)right_o)->ob_fval;
|
((PyFloatObject *)right_o)->ob_fval;
|
||||||
PyObject *res_o;
|
PyObject *res_o = _PyFloat_FromDouble_ConsumeInputs(left, right, dres);
|
||||||
DECREF_INPUTS_AND_REUSE_FLOAT(left_o, right_o, dres, res_o);
|
if (res_o == NULL) goto pop_2_error;
|
||||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||||
}
|
}
|
||||||
stack_pointer[-2] = res;
|
stack_pointer[-2] = res;
|
||||||
|
@ -251,8 +251,8 @@
|
||||||
double dres =
|
double dres =
|
||||||
((PyFloatObject *)left_o)->ob_fval *
|
((PyFloatObject *)left_o)->ob_fval *
|
||||||
((PyFloatObject *)right_o)->ob_fval;
|
((PyFloatObject *)right_o)->ob_fval;
|
||||||
PyObject *res_o;
|
PyObject *res_o = _PyFloat_FromDouble_ConsumeInputs(left, right, dres);
|
||||||
DECREF_INPUTS_AND_REUSE_FLOAT(left_o, right_o, dres, res_o);
|
if (res_o == NULL) goto pop_2_error;
|
||||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||||
}
|
}
|
||||||
stack_pointer[-2] = res;
|
stack_pointer[-2] = res;
|
||||||
|
@ -322,8 +322,8 @@
|
||||||
double dres =
|
double dres =
|
||||||
((PyFloatObject *)left_o)->ob_fval -
|
((PyFloatObject *)left_o)->ob_fval -
|
||||||
((PyFloatObject *)right_o)->ob_fval;
|
((PyFloatObject *)right_o)->ob_fval;
|
||||||
PyObject *res_o;
|
PyObject *res_o = _PyFloat_FromDouble_ConsumeInputs(left, right, dres);
|
||||||
DECREF_INPUTS_AND_REUSE_FLOAT(left_o, right_o, dres, res_o);
|
if (res_o == NULL) goto pop_2_error;
|
||||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||||
}
|
}
|
||||||
stack_pointer[-2] = res;
|
stack_pointer[-2] = res;
|
||||||
|
|
|
@ -575,6 +575,7 @@ NON_ESCAPING_FUNCTIONS = (
|
||||||
"_PyDictValues_AddToInsertionOrder",
|
"_PyDictValues_AddToInsertionOrder",
|
||||||
"_PyErr_Occurred",
|
"_PyErr_Occurred",
|
||||||
"_PyEval_FrameClearAndPop",
|
"_PyEval_FrameClearAndPop",
|
||||||
|
"_PyFloat_FromDouble_ConsumeInputs",
|
||||||
"_PyFrame_GetCode",
|
"_PyFrame_GetCode",
|
||||||
"_PyFrame_IsIncomplete",
|
"_PyFrame_IsIncomplete",
|
||||||
"_PyFrame_PushUnchecked",
|
"_PyFrame_PushUnchecked",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue