summaryrefslogtreecommitdiffstats
path: root/Python/ceval.c
diff options
context:
space:
mode:
authorDennis Sweeney <36520290+sweeneyde@users.noreply.github.com>2022-04-19 18:02:19 (GMT)
committerGitHub <noreply@github.com>2022-04-19 18:02:19 (GMT)
commitda6c78584b1f45ce3766bf7f27fb033169715292 (patch)
treeaadde6ee2f5323357a7e0e8eff7a97f1fd44ec4b /Python/ceval.c
parentab0d35d70dfe0b4c11583f8f735a8cc49b58c58b (diff)
downloadcpython-da6c78584b1f45ce3766bf7f27fb033169715292.zip
cpython-da6c78584b1f45ce3766bf7f27fb033169715292.tar.gz
cpython-da6c78584b1f45ce3766bf7f27fb033169715292.tar.bz2
gh-90667: Add specializations of Py_DECREF when types are known (GH-30872)
Diffstat (limited to 'Python/ceval.c')
-rw-r--r--Python/ceval.c84
1 files changed, 44 insertions, 40 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index f523e52..45754ff 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -1977,8 +1977,8 @@ handle_eval_breaker:
STAT_INC(BINARY_OP, hit);
PyObject *prod = _PyLong_Multiply((PyLongObject *)left, (PyLongObject *)right);
SET_SECOND(prod);
- Py_DECREF(right);
- Py_DECREF(left);
+ _Py_DECREF_SPECIALIZED(right, PyObject_Free);
+ _Py_DECREF_SPECIALIZED(left, PyObject_Free);
STACK_SHRINK(1);
if (prod == NULL) {
goto error;
@@ -1998,8 +1998,8 @@ handle_eval_breaker:
((PyFloatObject *)right)->ob_fval;
PyObject *prod = PyFloat_FromDouble(dprod);
SET_SECOND(prod);
- Py_DECREF(right);
- Py_DECREF(left);
+ _Py_DECREF_SPECIALIZED(right, _PyFloat_ExactDealloc);
+ _Py_DECREF_SPECIALIZED(left, _PyFloat_ExactDealloc);
STACK_SHRINK(1);
if (prod == NULL) {
goto error;
@@ -2017,8 +2017,8 @@ handle_eval_breaker:
STAT_INC(BINARY_OP, hit);
PyObject *sub = _PyLong_Subtract((PyLongObject *)left, (PyLongObject *)right);
SET_SECOND(sub);
- Py_DECREF(right);
- Py_DECREF(left);
+ _Py_DECREF_SPECIALIZED(right, PyObject_Free);
+ _Py_DECREF_SPECIALIZED(left, PyObject_Free);
STACK_SHRINK(1);
if (sub == NULL) {
goto error;
@@ -2037,8 +2037,8 @@ handle_eval_breaker:
double dsub = ((PyFloatObject *)left)->ob_fval - ((PyFloatObject *)right)->ob_fval;
PyObject *sub = PyFloat_FromDouble(dsub);
SET_SECOND(sub);
- Py_DECREF(right);
- Py_DECREF(left);
+ _Py_DECREF_SPECIALIZED(right, _PyFloat_ExactDealloc);
+ _Py_DECREF_SPECIALIZED(left, _PyFloat_ExactDealloc);
STACK_SHRINK(1);
if (sub == NULL) {
goto error;
@@ -2057,8 +2057,8 @@ handle_eval_breaker:
PyObject *res = PyUnicode_Concat(left, right);
STACK_SHRINK(1);
SET_TOP(res);
- Py_DECREF(left);
- Py_DECREF(right);
+ _Py_DECREF_SPECIALIZED(left, _PyUnicode_ExactDealloc);
+ _Py_DECREF_SPECIALIZED(right, _PyUnicode_ExactDealloc);
if (TOP() == NULL) {
goto error;
}
@@ -2090,10 +2090,10 @@ handle_eval_breaker:
* that the string is safe to mutate.
*/
assert(Py_REFCNT(left) >= 2);
- Py_DECREF(left); // XXX never need to dealloc
+ _Py_DECREF_NO_DEALLOC(left);
STACK_SHRINK(2);
PyUnicode_Append(target_local, right);
- Py_DECREF(right);
+ _Py_DECREF_SPECIALIZED(right, _PyUnicode_ExactDealloc);
if (*target_local == NULL) {
goto error;
}
@@ -2113,8 +2113,8 @@ handle_eval_breaker:
((PyFloatObject *)right)->ob_fval;
PyObject *sum = PyFloat_FromDouble(dsum);
SET_SECOND(sum);
- Py_DECREF(right);
- Py_DECREF(left);
+ _Py_DECREF_SPECIALIZED(right, _PyFloat_ExactDealloc);
+ _Py_DECREF_SPECIALIZED(left, _PyFloat_ExactDealloc);
STACK_SHRINK(1);
if (sum == NULL) {
goto error;
@@ -2132,8 +2132,8 @@ handle_eval_breaker:
STAT_INC(BINARY_OP, hit);
PyObject *sum = _PyLong_Add((PyLongObject *)left, (PyLongObject *)right);
SET_SECOND(sum);
- Py_DECREF(right);
- Py_DECREF(left);
+ _Py_DECREF_SPECIALIZED(right, PyObject_Free);
+ _Py_DECREF_SPECIALIZED(left, PyObject_Free);
STACK_SHRINK(1);
if (sum == NULL) {
goto error;
@@ -2192,7 +2192,7 @@ handle_eval_breaker:
assert(res != NULL);
Py_INCREF(res);
STACK_SHRINK(1);
- Py_DECREF(sub);
+ _Py_DECREF_SPECIALIZED(sub, PyObject_Free);
SET_TOP(res);
Py_DECREF(list);
JUMPBY(INLINE_CACHE_ENTRIES_BINARY_SUBSCR);
@@ -2217,7 +2217,7 @@ handle_eval_breaker:
assert(res != NULL);
Py_INCREF(res);
STACK_SHRINK(1);
- Py_DECREF(sub);
+ _Py_DECREF_SPECIALIZED(sub, PyObject_Free);
SET_TOP(res);
Py_DECREF(tuple);
JUMPBY(INLINE_CACHE_ENTRIES_BINARY_SUBSCR);
@@ -2359,7 +2359,7 @@ handle_eval_breaker:
STACK_SHRINK(3);
assert(old_value != NULL);
Py_DECREF(old_value);
- Py_DECREF(sub);
+ _Py_DECREF_SPECIALIZED(sub, PyObject_Free);
Py_DECREF(list);
JUMPBY(INLINE_CACHE_ENTRIES_STORE_SUBSCR);
NOTRACE_DISPATCH();
@@ -3752,8 +3752,8 @@ handle_eval_breaker:
JUMPBY(INLINE_CACHE_ENTRIES_COMPARE_OP);
NEXTOPARG();
STACK_SHRINK(2);
- Py_DECREF(left);
- Py_DECREF(right);
+ _Py_DECREF_SPECIALIZED(left, _PyFloat_ExactDealloc);
+ _Py_DECREF_SPECIALIZED(right, _PyFloat_ExactDealloc);
assert(opcode == POP_JUMP_FORWARD_IF_FALSE ||
opcode == POP_JUMP_BACKWARD_IF_FALSE ||
opcode == POP_JUMP_FORWARD_IF_TRUE ||
@@ -3795,8 +3795,8 @@ handle_eval_breaker:
JUMPBY(INLINE_CACHE_ENTRIES_COMPARE_OP);
NEXTOPARG();
STACK_SHRINK(2);
- Py_DECREF(left);
- Py_DECREF(right);
+ _Py_DECREF_SPECIALIZED(left, PyObject_Free);
+ _Py_DECREF_SPECIALIZED(right, PyObject_Free);
assert(opcode == POP_JUMP_FORWARD_IF_FALSE ||
opcode == POP_JUMP_BACKWARD_IF_FALSE ||
opcode == POP_JUMP_FORWARD_IF_TRUE ||
@@ -3841,8 +3841,8 @@ handle_eval_breaker:
opcode == POP_JUMP_FORWARD_IF_TRUE ||
opcode == POP_JUMP_BACKWARD_IF_TRUE);
STACK_SHRINK(2);
- Py_DECREF(left);
- Py_DECREF(right);
+ _Py_DECREF_SPECIALIZED(left, _PyUnicode_ExactDealloc);
+ _Py_DECREF_SPECIALIZED(right, _PyUnicode_ExactDealloc);
assert(res == 0 || res == 1);
int sign = 1 - res;
int jump = (9 << (sign + 1)) & when_to_jump_mask;
@@ -4008,11 +4008,11 @@ handle_eval_breaker:
PREDICTED(POP_JUMP_BACKWARD_IF_FALSE);
PyObject *cond = POP();
if (Py_IsTrue(cond)) {
- Py_DECREF(cond);
+ _Py_DECREF_NO_DEALLOC(cond);
DISPATCH();
}
if (Py_IsFalse(cond)) {
- Py_DECREF(cond);
+ _Py_DECREF_NO_DEALLOC(cond);
JUMPBY(-oparg);
CHECK_EVAL_BREAKER();
DISPATCH();
@@ -4034,10 +4034,10 @@ handle_eval_breaker:
PREDICTED(POP_JUMP_FORWARD_IF_FALSE);
PyObject *cond = POP();
if (Py_IsTrue(cond)) {
- Py_DECREF(cond);
+ _Py_DECREF_NO_DEALLOC(cond);
}
else if (Py_IsFalse(cond)) {
- Py_DECREF(cond);
+ _Py_DECREF_NO_DEALLOC(cond);
JUMPBY(oparg);
}
else {
@@ -4057,11 +4057,11 @@ handle_eval_breaker:
TARGET(POP_JUMP_BACKWARD_IF_TRUE) {
PyObject *cond = POP();
if (Py_IsFalse(cond)) {
- Py_DECREF(cond);
+ _Py_DECREF_NO_DEALLOC(cond);
DISPATCH();
}
if (Py_IsTrue(cond)) {
- Py_DECREF(cond);
+ _Py_DECREF_NO_DEALLOC(cond);
JUMPBY(-oparg);
CHECK_EVAL_BREAKER();
DISPATCH();
@@ -4082,10 +4082,10 @@ handle_eval_breaker:
TARGET(POP_JUMP_FORWARD_IF_TRUE) {
PyObject *cond = POP();
if (Py_IsFalse(cond)) {
- Py_DECREF(cond);
+ _Py_DECREF_NO_DEALLOC(cond);
}
else if (Py_IsTrue(cond)) {
- Py_DECREF(cond);
+ _Py_DECREF_NO_DEALLOC(cond);
JUMPBY(oparg);
}
else {
@@ -4110,7 +4110,7 @@ handle_eval_breaker:
CHECK_EVAL_BREAKER();
DISPATCH();
}
- Py_DECREF(value);
+ _Py_DECREF_NO_DEALLOC(value);
DISPATCH();
}
@@ -4126,21 +4126,25 @@ handle_eval_breaker:
TARGET(POP_JUMP_BACKWARD_IF_NONE) {
PyObject *value = POP();
if (Py_IsNone(value)) {
- Py_DECREF(value);
+ _Py_DECREF_NO_DEALLOC(value);
JUMPBY(-oparg);
CHECK_EVAL_BREAKER();
- DISPATCH();
}
- Py_DECREF(value);
+ else {
+ Py_DECREF(value);
+ }
DISPATCH();
}
TARGET(POP_JUMP_FORWARD_IF_NONE) {
PyObject *value = POP();
if (Py_IsNone(value)) {
+ _Py_DECREF_NO_DEALLOC(value);
JUMPBY(oparg);
}
- Py_DECREF(value);
+ else {
+ Py_DECREF(value);
+ }
DISPATCH();
}
@@ -4149,7 +4153,7 @@ handle_eval_breaker:
int err;
if (Py_IsTrue(cond)) {
STACK_SHRINK(1);
- Py_DECREF(cond);
+ _Py_DECREF_NO_DEALLOC(cond);
DISPATCH();
}
if (Py_IsFalse(cond)) {
@@ -4173,7 +4177,7 @@ handle_eval_breaker:
int err;
if (Py_IsFalse(cond)) {
STACK_SHRINK(1);
- Py_DECREF(cond);
+ _Py_DECREF_NO_DEALLOC(cond);
DISPATCH();
}
if (Py_IsTrue(cond)) {