[Checkins] SVN: Acquisition/trunk/ Raise `RuntimeError: Recursion detected in acquisition wrapper` if an object with a `__parent__` pointer points to a wrapper that in turn points to the original object.
Hanno Schlichting
hannosch at hannosch.eu
Tue Dec 13 14:36:36 UTC 2011
Log message for revision 123800:
Raise `RuntimeError: Recursion detected in acquisition wrapper` if an object with a `__parent__` pointer points to a wrapper that in turn points to the original object.
Changed:
U Acquisition/trunk/CHANGES.txt
U Acquisition/trunk/src/Acquisition/_Acquisition.c
U Acquisition/trunk/src/Acquisition/tests.py
-=-
Modified: Acquisition/trunk/CHANGES.txt
===================================================================
--- Acquisition/trunk/CHANGES.txt 2011-12-13 13:42:14 UTC (rev 123799)
+++ Acquisition/trunk/CHANGES.txt 2011-12-13 14:36:35 UTC (rev 123800)
@@ -4,6 +4,10 @@
4.0 (unreleased)
----------------
+- Raise `RuntimeError: Recursion detected in acquisition wrapper` if an object
+ with a `__parent__` pointer points to a wrapper that in turn points to the
+ original object.
+
- Prevent wrappers to be created while accessing `__parent__` on types derived
from Explicit or Implicit base classes.
Modified: Acquisition/trunk/src/Acquisition/_Acquisition.c
===================================================================
--- Acquisition/trunk/src/Acquisition/_Acquisition.c 2011-12-13 13:42:14 UTC (rev 123799)
+++ Acquisition/trunk/src/Acquisition/_Acquisition.c 2011-12-13 14:36:35 UTC (rev 123800)
@@ -545,7 +545,15 @@
Py_XDECREF(r); Py_XDECREF(v); Py_XDECREF(tb);
r=NULL;
}
- /* normal attribute lookup */
+ /* Deal with mixed __parent__ / aq_parent circles */
+ else if (self->container && isWrapper(self->container) &&
+ WRAPPER(self->container)->container &&
+ self == WRAPPER(WRAPPER(self->container)->container)) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "Recursion detected in acquisition wrapper");
+ return NULL;
+ }
+ /* normal attribute lookup */
else if ((r=PyObject_GetAttr(self->obj,oname)))
{
if (r==Acquired)
Modified: Acquisition/trunk/src/Acquisition/tests.py
===================================================================
--- Acquisition/trunk/src/Acquisition/tests.py 2011-12-13 13:42:14 UTC (rev 123799)
+++ Acquisition/trunk/src/Acquisition/tests.py 2011-12-13 14:36:35 UTC (rev 123800)
@@ -2362,7 +2362,7 @@
>>> x.__parent__.__parent__ is x
True
-
+
>>> x.hello
'world'
>>> Acquisition.aq_acquire(x, 'hello')
@@ -2383,20 +2383,17 @@
>>> Acquisition.aq_acquire(y, 'non_existant_attr')
Traceback (most recent call last):
...
- AttributeError: non_existant_attr
+ RuntimeError: Recursion detected in acquisition wrapper
>>> x.non_existant_attr
Traceback (most recent call last):
...
AttributeError: non_existant_attr
- """
- # XXX: disabled
- """
>>> y.non_existant_attr
Traceback (most recent call last):
...
- AttributeError: non_existant_attr
+ RuntimeError: Recursion detected in acquisition wrapper
"""
def test_unwrapped_implicit_acquirer_unwraps__parent__():
More information about the checkins
mailing list