[Checkins] SVN: ExtensionClass/branches/hannosch-lp-143657/ Avoid defining ``__getnewargs__`` as not to defeat the ZODB persistent reference optimization. Refs https://bugs.launchpad.net/zope2/+bug/143657.
Hanno Schlichting
hannosch at hannosch.eu
Sun Feb 21 18:18:03 EST 2010
Log message for revision 109235:
Avoid defining ``__getnewargs__`` as not to defeat the ZODB persistent reference optimization. Refs https://bugs.launchpad.net/zope2/+bug/143657.
Changed:
U ExtensionClass/branches/hannosch-lp-143657/CHANGES.txt
U ExtensionClass/branches/hannosch-lp-143657/setup.py
U ExtensionClass/branches/hannosch-lp-143657/src/ExtensionClass/pickle/pickle.c
U ExtensionClass/branches/hannosch-lp-143657/src/ExtensionClass/tests.py
-=-
Modified: ExtensionClass/branches/hannosch-lp-143657/CHANGES.txt
===================================================================
--- ExtensionClass/branches/hannosch-lp-143657/CHANGES.txt 2010-02-21 23:16:29 UTC (rev 109234)
+++ ExtensionClass/branches/hannosch-lp-143657/CHANGES.txt 2010-02-21 23:18:03 UTC (rev 109235)
@@ -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/branches/hannosch-lp-143657/setup.py
===================================================================
--- ExtensionClass/branches/hannosch-lp-143657/setup.py 2010-02-21 23:16:29 UTC (rev 109234)
+++ ExtensionClass/branches/hannosch-lp-143657/setup.py 2010-02-21 23:18:03 UTC (rev 109235)
@@ -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/branches/hannosch-lp-143657/src/ExtensionClass/pickle/pickle.c
===================================================================
--- ExtensionClass/branches/hannosch-lp-143657/src/ExtensionClass/pickle/pickle.c 2010-02-21 23:16:29 UTC (rev 109234)
+++ ExtensionClass/branches/hannosch-lp-143657/src/ExtensionClass/pickle/pickle.c 2010-02-21 23:18:03 UTC (rev 109235)
@@ -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/branches/hannosch-lp-143657/src/ExtensionClass/tests.py
===================================================================
--- ExtensionClass/branches/hannosch-lp-143657/src/ExtensionClass/tests.py 2010-02-21 23:16:29 UTC (rev 109234)
+++ ExtensionClass/branches/hannosch-lp-143657/src/ExtensionClass/tests.py 2010-02-21 23:18:03 UTC (rev 109235)
@@ -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