Mercurial > cpython-lru_cache-weakref
diff Objects/object.c @ 27314:cdab2b74f307 legacy-trunk
Recursive compare machinery: The code that intended to exempt tuples
was broken because new-in-2.3 code added a tp_as_mapping slot to tuples.
Repaired that.
Added basic docs to check_recursion().
The code that intended to exempt tuples and strings was also broken here,
and in 2.2: these should use PyXYZ_CheckExact(), not PyXYZ_Check() -- we
can't know whether subclass instances are immutable. This part (and this
part alone) is a bugfix candidate.
| author | Tim Peters <tim.peters@gmail.com> |
|---|---|
| date | Mon, 20 Jan 2003 16:54:59 +0000 |
| parents | e9f45b8efd6b |
| children | 84f2c438c3f5 |
line wrap: on
line diff
--- a/Objects/object.c Mon Jan 20 10:47:48 2003 +0000 +++ b/Objects/object.c Mon Jan 20 16:54:59 2003 +0000 @@ -742,6 +742,14 @@ return inprogress; } +/* If the comparison "v op w" is already in progress in this thread, returns + * a borrowed reference to Py_None (the caller must not decref). + * If it's not already in progress, returns "a token" which must eventually + * be passed to delete_token(). The caller must not decref this either + * (delete_token decrefs it). The token must not survive beyond any point + * where v or w may die. + * If an error occurs (out-of-memory), returns NULL. + */ static PyObject * check_recursion(PyObject *v, PyObject *w, int op) { @@ -830,10 +838,9 @@ vtp = v->ob_type; compare_nesting++; if (compare_nesting > NESTING_LIMIT && - (vtp->tp_as_mapping - || (vtp->tp_as_sequence - && !PyString_Check(v) - && !PyTuple_Check(v)))) { + (vtp->tp_as_mapping || vtp->tp_as_sequence) && + !PyString_CheckExact(v) && + !PyTuple_CheckExact(v)) { /* try to detect circular data structures */ PyObject *token = check_recursion(v, w, -1); @@ -927,11 +934,9 @@ compare_nesting++; if (compare_nesting > NESTING_LIMIT && - (v->ob_type->tp_as_mapping - || (v->ob_type->tp_as_sequence - && !PyString_Check(v) - && !PyTuple_Check(v)))) { - + (v->ob_type->tp_as_mapping || v->ob_type->tp_as_sequence) && + !PyString_CheckExact(v) && + !PyTuple_CheckExact(v)) { /* try to detect circular data structures */ PyObject *token = check_recursion(v, w, op); if (token == NULL) {
