[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