[Zodb-checkins] CVS: Cruft/ExtensionClass/src - Acquisition.c:1.61.4.1.32.1

Jim Fulton jim at zope.com
Tue Mar 7 17:56:26 EST 2006


Update of /cvs-repository/Cruft/ExtensionClass/src
In directory cvs.zope.org:/tmp/cvs-serv6895

Modified Files:
      Tag: zc-Zope-2-7-5
	Acquisition.c 
Log Message:
Backported fix fromn trunk.  The simplification of wrappers is not
merely an optimization. It is critical for getting correct wrapper
semantics.


=== Cruft/ExtensionClass/src/Acquisition.c 1.61.4.1 => 1.61.4.1.32.1 ===
--- Cruft/ExtensionClass/src/Acquisition.c:1.61.4.1	Tue Oct 21 08:44:39 2003
+++ Cruft/ExtensionClass/src/Acquisition.c	Tue Mar  7 17:56:25 2006
@@ -138,39 +138,6 @@
 
 /* ---------------------------------------------------------------- */
 
-static PyObject *
-__of__(PyObject *inst, PyObject *parent)
-{
-  PyObject *r, *t;
-
-  UNLESS(r=PyObject_GetAttr(inst, py__of__)) return NULL;
-  UNLESS(t=PyTuple_New(1)) goto err;
-  PyTuple_SET_ITEM(t,0,parent);
-  ASSIGN(r,PyObject_CallObject(r,t));
-  PyTuple_SET_ITEM(t,0,NULL);
-  Py_DECREF(t);
-
-  if (r 
-      && r->ob_refcnt==1
-      && isWrapper(r) 
-      && WRAPPER(r)->container && isWrapper(WRAPPER(r)->container)
-      )
-    while (WRAPPER(r)->obj && isWrapper(WRAPPER(r)->obj)
-	   && (WRAPPER(WRAPPER(r)->obj)->container == 
-	       WRAPPER(WRAPPER(r)->container)->obj)
-	   )
-      {
-	/* Simplify wrapper */
-	Py_XINCREF(WRAPPER(WRAPPER(r)->obj)->obj);
-	ASSIGN(WRAPPER(r)->obj, WRAPPER(WRAPPER(r)->obj)->obj);
-      }
-
-  return r;
-err:
-  Py_DECREF(r);
-  return NULL;
-}
-
 static Wrapper *freeWrappers=0;
 static int nWrappers=0;
 #define MAX_CACHED_WRAPPERS 200
@@ -227,6 +194,49 @@
     {
       PyObject_DEL(self);
     }
+}
+
+static PyObject *
+__of__(PyObject *inst, PyObject *parent)
+{
+  PyObject *r, *t;
+
+  UNLESS(r=PyObject_GetAttr(inst, py__of__)) return NULL;
+  UNLESS(t=PyTuple_New(1)) goto err;
+  Py_INCREF(parent);
+  PyTuple_SET_ITEM(t,0,parent);
+  ASSIGN(r,PyObject_CallObject(r,t));
+  Py_DECREF(t);
+
+  if (r != NULL
+      && isWrapper(r) 
+      && WRAPPER(r)->container && isWrapper(WRAPPER(r)->container)
+      )
+    while (WRAPPER(r)->obj && isWrapper(WRAPPER(r)->obj)
+	   && (WRAPPER(WRAPPER(r)->obj)->container == 
+	       WRAPPER(WRAPPER(r)->container)->obj)
+	   )
+      {
+        if (r->ob_refcnt !=1 )
+          {
+            t = newWrapper(WRAPPER(r)->obj, 
+                           WRAPPER(r)->container,
+                           (r->ob_type));
+            Py_DECREF(r);
+            if (t==NULL)
+              return NULL;
+            r = t;
+          }
+
+        /* Simplify wrapper */
+        Py_XINCREF(WRAPPER(WRAPPER(r)->obj)->obj);
+        ASSIGN(WRAPPER(r)->obj, WRAPPER(WRAPPER(r)->obj)->obj);
+      }
+
+  return r;
+err:
+  Py_DECREF(r);
+  return NULL;
 }
 
 static PyObject *



More information about the Zodb-checkins mailing list