[Checkins] SVN: ExtensionClass/trunk/ Merged hannosch-lp-143657 branch

Hanno Schlichting hannosch at hannosch.eu
Mon Feb 22 12:30:42 EST 2010


Log message for revision 109298:
  Merged hannosch-lp-143657 branch
  

Changed:
  U   ExtensionClass/trunk/CHANGES.txt
  U   ExtensionClass/trunk/setup.py
  U   ExtensionClass/trunk/src/ExtensionClass/pickle/pickle.c
  U   ExtensionClass/trunk/src/ExtensionClass/tests.py

-=-
Modified: ExtensionClass/trunk/CHANGES.txt
===================================================================
--- ExtensionClass/trunk/CHANGES.txt	2010-02-22 17:24:07 UTC (rev 109297)
+++ ExtensionClass/trunk/CHANGES.txt	2010-02-22 17:30:41 UTC (rev 109298)
@@ -1,9 +1,11 @@
 Changelog
 =========
 
-2.12.1 (unreleased)
+2.13.0 (unreleased)
 -------------------
 
+- Avoid defining ``__getnewargs__`` as not to defeat the ZODB persistent
+  reference optimization. Refs https://bugs.launchpad.net/zope2/+bug/143657.
 
 2.12.0 (2010-02-14)
 -------------------

Modified: ExtensionClass/trunk/setup.py
===================================================================
--- ExtensionClass/trunk/setup.py	2010-02-22 17:24:07 UTC (rev 109297)
+++ ExtensionClass/trunk/setup.py	2010-02-22 17:30:41 UTC (rev 109298)
@@ -20,7 +20,7 @@
 CHANGES = open('CHANGES.txt').read()
 
 setup(name='ExtensionClass',
-      version = '2.12.1dev',
+      version = '2.13.0dev',
       url='http://pypi.python.org/pypi/ExtensionClass',
       license='ZPL 2.1',
       description='Metaclass for subclassable extension types',

Modified: ExtensionClass/trunk/src/ExtensionClass/pickle/pickle.c
===================================================================
--- ExtensionClass/trunk/src/ExtensionClass/pickle/pickle.c	2010-02-22 17:24:07 UTC (rev 109297)
+++ ExtensionClass/trunk/src/ExtensionClass/pickle/pickle.c	2010-02-22 17:30:41 UTC (rev 109298)
@@ -329,11 +329,18 @@
 {
   PyObject *args=NULL, *bargs=0, *state=NULL;
   int l, i;
-  
-  bargs = PyObject_CallMethodObjArgs(self, str__getnewargs__, NULL);
-  if (bargs == NULL)
-    return NULL;
 
+  /* we no longer require '__getnewargs__' to be defined but use it if it is */
+  PyObject *getnewargs=NULL;
+
+  getnewargs = PyObject_GetAttr(self, str__getnewargs__);
+  if (getnewargs)
+    bargs = PyEval_CallObject(getnewargs, (PyObject *)NULL);
+  else {
+    PyErr_Clear();
+    bargs = PyTuple_New(0);
+  }
+
   l = PyTuple_Size(bargs);
   if (l < 0)
     goto end;
@@ -359,6 +366,7 @@
  end:
   Py_XDECREF(bargs);
   Py_XDECREF(args);
+  Py_XDECREF(getnewargs);
 
   return state;
 }
@@ -371,9 +379,7 @@
 {"__setstate__", (PyCFunction)pickle___setstate__, METH_O,           \
    pickle___setstate__doc},                                          
 
-#define PICKLE_GETNEWARGS_DEF \
-{"__getnewargs__", (PyCFunction)pickle___getnewargs__, METH_NOARGS,  \
-   pickle___getnewargs__doc},                                        
+#define PICKLE_GETNEWARGS_DEF
 
 #define PICKLE_REDUCE_DEF \
 {"__reduce__", (PyCFunction)pickle___reduce__, METH_NOARGS,          \

Modified: ExtensionClass/trunk/src/ExtensionClass/tests.py
===================================================================
--- ExtensionClass/trunk/src/ExtensionClass/tests.py	2010-02-22 17:24:07 UTC (rev 109297)
+++ ExtensionClass/trunk/src/ExtensionClass/tests.py	2010-02-22 17:30:41 UTC (rev 109298)
@@ -196,7 +196,9 @@
     >>> x = Simple('x', aaa=1, bbb='foo')
 
     >>> x.__getnewargs__()
-    ()
+    Traceback (most recent call last):
+    ...
+    AttributeError: __getnewargs__
 
     >>> print_dict(x.__getstate__())
     {'__name__': 'x', 'aaa': 1, 'bbb': 'foo'}
@@ -296,7 +298,9 @@
     >>> x = SubSlotted('x', 'y', 'z')
 
     >>> x.__getnewargs__()
-    ()
+    Traceback (most recent call last):
+    ...
+    AttributeError: __getnewargs__
 
     >>> d, s = x.__getstate__()
     >>> d
@@ -348,7 +352,9 @@
     >>> x = SubSubSlotted('x', 'y', 'z', aaa=1, bbb='foo')
 
     >>> x.__getnewargs__()
-    ()
+    Traceback (most recent call last):
+    ...
+    AttributeError: __getnewargs__
 
     >>> d, s = x.__getstate__()
     >>> print_dict(d)
@@ -389,7 +395,9 @@
     >>> x = SubSubSlotted('x', 'y', 'z')
 
     >>> x.__getnewargs__()
-    ()
+    Traceback (most recent call last):
+    ...
+    AttributeError: __getnewargs__
 
     >>> d, s = x.__getstate__()
     >>> print_dict(d)



More information about the checkins mailing list