Commit adf4a294 authored by Jeremy Hylton's avatar Jeremy Hylton

Reformat recent code for consistency with rest of file.

parent ac99a73f
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
static char cPersistence_doc_string[] = static char cPersistence_doc_string[] =
"Defines Persistent mixin class for persistent objects.\n" "Defines Persistent mixin class for persistent objects.\n"
"\n" "\n"
"$Id: cPersistence.c,v 1.77 2004/02/19 18:13:35 jeremy Exp $\n"; "$Id: cPersistence.c,v 1.78 2004/02/20 17:20:16 jeremy Exp $\n";
#include "cPersistence.h" #include "cPersistence.h"
#include "structmember.h" #include "structmember.h"
...@@ -31,6 +31,9 @@ static PyObject *py_keys, *py_setstate, *py___dict__, *py_timeTime; ...@@ -31,6 +31,9 @@ static PyObject *py_keys, *py_setstate, *py___dict__, *py_timeTime;
static PyObject *py__p_changed, *py__p_deactivate; static PyObject *py__p_changed, *py__p_deactivate;
static PyObject *py___getattr__, *py___setattr__, *py___delattr__; static PyObject *py___getattr__, *py___setattr__, *py___delattr__;
static PyObject *py___getstate__; static PyObject *py___getstate__;
static PyObject *py___slotnames__, *copy_reg_slotnames, *__newobj__;
static PyObject *py___getnewargs__, *py___getstate__;
static int static int
init_strings(void) init_strings(void)
...@@ -48,6 +51,9 @@ init_strings(void) ...@@ -48,6 +51,9 @@ init_strings(void)
INIT_STRING(__setattr__); INIT_STRING(__setattr__);
INIT_STRING(__delattr__); INIT_STRING(__delattr__);
INIT_STRING(__getstate__); INIT_STRING(__getstate__);
INIT_STRING(__slotnames__);
INIT_STRING(__getnewargs__);
INIT_STRING(__getstate__);
#undef INIT_STRING #undef INIT_STRING
return 0; return 0;
} }
...@@ -232,65 +238,24 @@ Per__p_invalidate(cPersistentObject *self) ...@@ -232,65 +238,24 @@ Per__p_invalidate(cPersistentObject *self)
} }
/* It's a dang shame we can't inherit __get/setstate__ from object :( */
static PyObject *str__slotnames__, *copy_reg_slotnames, *__newobj__;
static PyObject *str__getnewargs__, *str__getstate__;
static int
pickle_setup(void)
{
PyObject *copy_reg;
int r = -1;
#define DEFINE_STRING(S) \
if(! (str ## S = PyString_FromString(# S))) return -1
DEFINE_STRING(__slotnames__);
DEFINE_STRING(__getnewargs__);
DEFINE_STRING(__getstate__);
#undef DEFINE_STRING
copy_reg = PyImport_ImportModule("copy_reg");
if (copy_reg == NULL)
return -1;
copy_reg_slotnames = PyObject_GetAttrString(copy_reg, "_slotnames");
if (copy_reg_slotnames == NULL)
goto end;
__newobj__ = PyObject_GetAttrString(copy_reg, "__newobj__");
if (__newobj__ == NULL)
goto end;
r = 0;
end:
Py_DECREF(copy_reg);
return r;
}
static PyObject * static PyObject *
pickle_slotnames(PyTypeObject *cls) pickle_slotnames(PyTypeObject *cls)
{ {
PyObject *slotnames; PyObject *slotnames;
slotnames = PyDict_GetItem(cls->tp_dict, str__slotnames__); slotnames = PyDict_GetItem(cls->tp_dict, py___slotnames__);
if (slotnames != NULL) if (slotnames) {
{
Py_INCREF(slotnames); Py_INCREF(slotnames);
return slotnames; return slotnames;
} }
slotnames = PyObject_CallFunctionObjArgs(copy_reg_slotnames, (PyObject*)cls, slotnames = PyObject_CallFunctionObjArgs(copy_reg_slotnames,
NULL); (PyObject*)cls, NULL);
if (slotnames != NULL && if (slotnames && !(slotnames == Py_None || PyList_Check(slotnames))) {
slotnames != Py_None &&
! PyList_Check(slotnames))
{
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"copy_reg._slotnames didn't return a list or None"); "copy_reg._slotnames didn't return a list or None");
Py_DECREF(slotnames); Py_DECREF(slotnames);
slotnames = NULL; return NULL;
} }
return slotnames; return slotnames;
...@@ -304,16 +269,14 @@ pickle_copy_dict(PyObject *state) ...@@ -304,16 +269,14 @@ pickle_copy_dict(PyObject *state)
int pos = 0; int pos = 0;
copy = PyDict_New(); copy = PyDict_New();
if (copy == NULL) if (!copy)
return NULL; return NULL;
if (state == NULL) if (!state)
return copy; return copy;
while (PyDict_Next(state, &pos, &key, &value)) while (PyDict_Next(state, &pos, &key, &value)) {
{ if (key && PyString_Check(key)) {
if (key && PyString_Check(key))
{
ckey = PyString_AS_STRING(key); ckey = PyString_AS_STRING(key);
if (*ckey == '_' && if (*ckey == '_' &&
(ckey[1] == 'v' || ckey[1] == 'p') && (ckey[1] == 'v' || ckey[1] == 'p') &&
...@@ -357,34 +320,30 @@ pickle___getstate__(PyObject *self) ...@@ -357,34 +320,30 @@ pickle___getstate__(PyObject *self)
int n=0; int n=0;
slotnames = pickle_slotnames(self->ob_type); slotnames = pickle_slotnames(self->ob_type);
if (slotnames == NULL) if (!slotnames)
return NULL; return NULL;
dictp = _PyObject_GetDictPtr(self); dictp = _PyObject_GetDictPtr(self);
if (dictp) if (dictp)
state = pickle_copy_dict(*dictp); state = pickle_copy_dict(*dictp);
else else {
{
state = Py_None; state = Py_None;
Py_INCREF(state); Py_INCREF(state);
} }
if (slotnames != Py_None) if (slotnames != Py_None) {
{
int i; int i;
slots = PyDict_New(); slots = PyDict_New();
if (slots == NULL) if (!slots)
goto end; goto end;
for (i = 0; i < PyList_GET_SIZE(slotnames); i++) for (i = 0; i < PyList_GET_SIZE(slotnames); i++) {
{
PyObject *name, *value; PyObject *name, *value;
char *cname; char *cname;
name = PyList_GET_ITEM(slotnames, i); name = PyList_GET_ITEM(slotnames, i);
if (PyString_Check(name)) if (PyString_Check(name)) {
{
cname = PyString_AS_STRING(name); cname = PyString_AS_STRING(name);
if (*cname == '_' && if (*cname == '_' &&
(cname[1] == 'v' || cname[1] == 'p') && (cname[1] == 'v' || cname[1] == 'p') &&
...@@ -397,8 +356,7 @@ pickle___getstate__(PyObject *self) ...@@ -397,8 +356,7 @@ pickle___getstate__(PyObject *self)
value = PyObject_GetAttr(self, name); value = PyObject_GetAttr(self, name);
if (value == NULL) if (value == NULL)
PyErr_Clear(); PyErr_Clear();
else else {
{
int err = PyDict_SetItem(slots, name, value); int err = PyDict_SetItem(slots, name, value);
Py_DECREF(value); Py_DECREF(value);
if (err < 0) if (err < 0)
...@@ -424,14 +382,12 @@ pickle_setattrs_from_dict(PyObject *self, PyObject *dict) ...@@ -424,14 +382,12 @@ pickle_setattrs_from_dict(PyObject *self, PyObject *dict)
PyObject *key, *value; PyObject *key, *value;
int pos = 0; int pos = 0;
if (! PyDict_Check(dict)) if (!PyDict_Check(dict)) {
{
PyErr_SetString(PyExc_TypeError, "Expected dictionary"); PyErr_SetString(PyExc_TypeError, "Expected dictionary");
return -1; return -1;
} }
while (PyDict_Next(dict, &pos, &key, &value)) while (PyDict_Next(dict, &pos, &key, &value)) {
{
if (PyObject_SetAttr(self, key, value) < 0) if (PyObject_SetAttr(self, key, value) < 0)
return -1; return -1;
} }
...@@ -439,32 +395,21 @@ pickle_setattrs_from_dict(PyObject *self, PyObject *dict) ...@@ -439,32 +395,21 @@ pickle_setattrs_from_dict(PyObject *self, PyObject *dict)
} }
static char pickle___setstate__doc[] = static char pickle___setstate__doc[] =
"Set the object serialization state\n" "Set the object serialization state\n\n"
"\n" "The state should be in one of 3 forms:\n\n"
"The state should be in one of 3 forms:\n" "- None\n\n"
"\n" " Ignored\n\n"
"- None\n" "- A dictionary\n\n"
"\n"
" Ignored\n"
"\n"
"- A dictionary\n"
"\n"
" In this case, the object's instance dictionary will be cleared and \n" " In this case, the object's instance dictionary will be cleared and \n"
" updated with the new state.\n" " updated with the new state.\n\n"
"\n" "- A two-tuple with a string as the first element. \n\n"
"- A two-tuple with a string as the first element. \n"
"\n"
" In this case, the method named by the string in the first element will be\n" " In this case, the method named by the string in the first element will be\n"
" called with the second element.\n" " called with the second element.\n\n"
"\n" " This form supports migration of data formats.\n\n"
" This form supports migration of data formats.\n"
"\n"
"- A two-tuple with None or a Dictionary as the first element and\n" "- A two-tuple with None or a Dictionary as the first element and\n"
" with a dictionary as the second element.\n" " with a dictionary as the second element.\n\n"
"\n"
" If the first element is not None, then the object's instance dictionary \n" " If the first element is not None, then the object's instance dictionary \n"
" will be cleared and updated with the value.\n" " will be cleared and updated with the value.\n\n"
"\n"
" The items in the second element will be assigned as attributes.\n" " The items in the second element will be assigned as attributes.\n"
; ;
...@@ -473,29 +418,24 @@ pickle___setstate__(PyObject *self, PyObject *state) ...@@ -473,29 +418,24 @@ pickle___setstate__(PyObject *self, PyObject *state)
{ {
PyObject *slots=NULL; PyObject *slots=NULL;
if (PyTuple_Check(state)) if (PyTuple_Check(state)) {
{ if (!PyArg_ParseTuple(state, "OO:__setstate__", &state, &slots))
if (! PyArg_ParseTuple(state, "OO", &state, &slots))
return NULL; return NULL;
} }
if (state != Py_None) if (state != Py_None) {
{
PyObject **dict; PyObject **dict;
dict = _PyObject_GetDictPtr(self); dict = _PyObject_GetDictPtr(self);
if (dict) if (dict) {
{ if (!*dict) {
if (*dict == NULL)
{
*dict = PyDict_New(); *dict = PyDict_New();
if (*dict == NULL) if (!*dict)
return NULL; return NULL;
} }
} }
if (*dict != NULL) if (*dict) {
{
PyDict_Clear(*dict); PyDict_Clear(*dict);
if (PyDict_Update(*dict, state) < 0) if (PyDict_Update(*dict, state) < 0)
return NULL; return NULL;
...@@ -504,7 +444,7 @@ pickle___setstate__(PyObject *self, PyObject *state) ...@@ -504,7 +444,7 @@ pickle___setstate__(PyObject *self, PyObject *state)
return NULL; return NULL;
} }
if (slots != NULL && pickle_setattrs_from_dict(self, slots) < 0) if (slots && pickle_setattrs_from_dict(self, slots) < 0)
return NULL; return NULL;
Py_INCREF(Py_None); Py_INCREF(Py_None);
...@@ -521,11 +461,11 @@ pickle___reduce__(PyObject *self) ...@@ -521,11 +461,11 @@ pickle___reduce__(PyObject *self)
PyObject *args=NULL, *bargs=NULL, *state=NULL, *getnewargs=NULL; PyObject *args=NULL, *bargs=NULL, *state=NULL, *getnewargs=NULL;
int l, i; int l, i;
getnewargs = PyObject_GetAttr(self, str__getnewargs__); getnewargs = PyObject_GetAttr(self, py___getnewargs__);
if (getnewargs != NULL) { if (getnewargs) {
bargs = PyObject_CallFunctionObjArgs(getnewargs, NULL); bargs = PyObject_CallFunctionObjArgs(getnewargs, NULL);
Py_DECREF(getnewargs); Py_DECREF(getnewargs);
if (bargs == NULL) if (!bargs)
return NULL; return NULL;
l = PyTuple_Size(bargs); l = PyTuple_Size(bargs);
if (l < 0) if (l < 0)
...@@ -542,14 +482,13 @@ pickle___reduce__(PyObject *self) ...@@ -542,14 +482,13 @@ pickle___reduce__(PyObject *self)
Py_INCREF(self->ob_type); Py_INCREF(self->ob_type);
PyTuple_SET_ITEM(args, 0, (PyObject*)(self->ob_type)); PyTuple_SET_ITEM(args, 0, (PyObject*)(self->ob_type));
for (i = 0; i < l; i++) for (i = 0; i < l; i++) {
{
Py_INCREF(PyTuple_GET_ITEM(bargs, i)); Py_INCREF(PyTuple_GET_ITEM(bargs, i));
PyTuple_SET_ITEM(args, i+1, PyTuple_GET_ITEM(bargs, i)); PyTuple_SET_ITEM(args, i+1, PyTuple_GET_ITEM(bargs, i));
} }
state = PyObject_CallMethodObjArgs(self, str__getstate__, NULL); state = PyObject_CallMethodObjArgs(self, py___getstate__, NULL);
if (state == NULL) if (!state)
goto end; goto end;
state = Py_BuildValue("(OON)", __newobj__, args, state); state = Py_BuildValue("(OON)", __newobj__, args, state);
...@@ -562,8 +501,6 @@ pickle___reduce__(PyObject *self) ...@@ -562,8 +501,6 @@ pickle___reduce__(PyObject *self)
} }
/* Return the object's state, a dict or None. /* Return the object's state, a dict or None.
If the object has no dict, it's state is None. If the object has no dict, it's state is None.
...@@ -1176,9 +1113,7 @@ void ...@@ -1176,9 +1113,7 @@ void
initcPersistence(void) initcPersistence(void)
{ {
PyObject *m, *s; PyObject *m, *s;
PyObject *copy_reg;
if (pickle_setup() < 0)
return;
if (init_strings() < 0) if (init_strings() < 0)
return; return;
...@@ -1216,7 +1151,23 @@ initcPersistence(void) ...@@ -1216,7 +1151,23 @@ initcPersistence(void)
if (!py_simple_new) if (!py_simple_new)
return; return;
if (TimeStamp == NULL) { copy_reg = PyImport_ImportModule("copy_reg");
if (!copy_reg)
return;
copy_reg_slotnames = PyObject_GetAttrString(copy_reg, "_slotnames");
if (!copy_reg_slotnames) {
Py_DECREF(copy_reg);
return;
}
__newobj__ = PyObject_GetAttrString(copy_reg, "__newobj__");
if (!__newobj__) {
Py_DECREF(copy_reg);
return;
}
if (!TimeStamp) {
m = PyImport_ImportModule("persistent.TimeStamp"); m = PyImport_ImportModule("persistent.TimeStamp");
if (!m) if (!m)
return; return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment