mirror of
https://github.com/python/cpython.git
synced 2026-01-06 15:32:22 +00:00
GH-91079: Revert "GH-91079: Implement C stack limits using addresses, not counters. (GH-130007)" for now (GH130413)
Revert "GH-91079: Implement C stack limits using addresses, not counters. (GH-130007)" for now
Unfortunatlely, the change broke some buildbots.
This reverts commit 2498c22fa0.
This commit is contained in:
parent
0ff1611574
commit
ef29104f7d
47 changed files with 1466 additions and 1220 deletions
|
|
@ -612,9 +612,12 @@ PyObject_Print(PyObject *op, FILE *fp, int flags)
|
|||
int write_error = 0;
|
||||
if (PyErr_CheckSignals())
|
||||
return -1;
|
||||
if (_Py_EnterRecursiveCall(" printing an object")) {
|
||||
#ifdef USE_STACKCHECK
|
||||
if (PyOS_CheckStack()) {
|
||||
PyErr_SetString(PyExc_MemoryError, "stack overflow");
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
clearerr(fp); /* Clear any previous error condition */
|
||||
if (op == NULL) {
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
|
|
@ -735,6 +738,12 @@ PyObject_Repr(PyObject *v)
|
|||
PyObject *res;
|
||||
if (PyErr_CheckSignals())
|
||||
return NULL;
|
||||
#ifdef USE_STACKCHECK
|
||||
if (PyOS_CheckStack()) {
|
||||
PyErr_SetString(PyExc_MemoryError, "stack overflow");
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
if (v == NULL)
|
||||
return PyUnicode_FromString("<NULL>");
|
||||
if (Py_TYPE(v)->tp_repr == NULL)
|
||||
|
|
@ -777,6 +786,12 @@ PyObject_Str(PyObject *v)
|
|||
PyObject *res;
|
||||
if (PyErr_CheckSignals())
|
||||
return NULL;
|
||||
#ifdef USE_STACKCHECK
|
||||
if (PyOS_CheckStack()) {
|
||||
PyErr_SetString(PyExc_MemoryError, "stack overflow");
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
if (v == NULL)
|
||||
return PyUnicode_FromString("<NULL>");
|
||||
if (PyUnicode_CheckExact(v)) {
|
||||
|
|
@ -2885,6 +2900,19 @@ _PyTrash_thread_deposit_object(PyThreadState *tstate, PyObject *op)
|
|||
void
|
||||
_PyTrash_thread_destroy_chain(PyThreadState *tstate)
|
||||
{
|
||||
/* We need to increase c_recursion_remaining here, otherwise,
|
||||
_PyTrash_thread_destroy_chain will be called recursively
|
||||
and then possibly crash. An example that may crash without
|
||||
increase:
|
||||
N = 500000 # need to be large enough
|
||||
ob = object()
|
||||
tups = [(ob,) for i in range(N)]
|
||||
for i in range(49):
|
||||
tups = [(tup,) for tup in tups]
|
||||
del tups
|
||||
*/
|
||||
assert(tstate->c_recursion_remaining > Py_TRASHCAN_HEADROOM);
|
||||
tstate->c_recursion_remaining--;
|
||||
while (tstate->delete_later) {
|
||||
PyObject *op = tstate->delete_later;
|
||||
destructor dealloc = Py_TYPE(op)->tp_dealloc;
|
||||
|
|
@ -2906,6 +2934,7 @@ _PyTrash_thread_destroy_chain(PyThreadState *tstate)
|
|||
_PyObject_ASSERT(op, Py_REFCNT(op) == 0);
|
||||
(*dealloc)(op);
|
||||
}
|
||||
tstate->c_recursion_remaining++;
|
||||
}
|
||||
|
||||
void _Py_NO_RETURN
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue