summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Modules/cPickle.c54
1 files changed, 41 insertions, 13 deletions
diff --git a/Modules/cPickle.c b/Modules/cPickle.c
index a661c66..6cea899 100644
--- a/Modules/cPickle.c
+++ b/Modules/cPickle.c
@@ -1,5 +1,5 @@
/*
- * cPickle.c,v 1.63 1999/02/05 01:40:06 jim Exp
+ * cPickle.c,v 1.66 1999/04/13 17:23:48 jim Exp
*
* Copyright (c) 1996-1998, Digital Creations, Fredericksburg, VA, USA.
* All rights reserved.
@@ -49,7 +49,7 @@
static char cPickle_module_documentation[] =
"C implementation and optimization of the Python pickle module\n"
"\n"
-"cPickle.c,v 1.63 1999/02/05 01:40:06 jim Exp\n"
+"cPickle.c,v 1.66 1999/04/13 17:23:48 jim Exp\n"
;
#include "Python.h"
@@ -345,6 +345,7 @@ typedef struct {
int buf_size;
char *buf;
PyObject *safe_constructors;
+ PyObject *find_class;
} Unpicklerobject;
staticforward PyTypeObject Unpicklertype;
@@ -2289,9 +2290,18 @@ static PyTypeObject Picklertype = {
};
static PyObject *
-find_class(PyObject *py_module_name, PyObject *py_global_name) {
+find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc) {
PyObject *global = 0, *module;
+ if (fc) {
+ if (fc==Py_None) {
+ PyErr_SetString(UnpicklingError,
+ "Global and instance pickles are not supported.");
+ return NULL;
+ }
+ return PyObject_CallFunction(fc, "OO", py_module_name, py_global_name);
+ }
+
module = PySys_GetObject("modules");
if (module == NULL)
return NULL;
@@ -2842,7 +2852,7 @@ load_inst(Unpicklerobject *self) {
if ((len = (*self->readline_func)(self, &s)) >= 0) {
if (len < 2) return bad_readline();
if (class_name = PyString_FromStringAndSize(s, len - 1)) {
- class = find_class(module_name, class_name);
+ class = find_class(module_name, class_name, self->find_class);
Py_DECREF(class_name);
}
}
@@ -2876,7 +2886,7 @@ load_global(Unpicklerobject *self) {
if ((len = (*self->readline_func)(self, &s)) >= 0) {
if (len < 2) return bad_readline();
if (class_name = PyString_FromStringAndSize(s, len - 1)) {
- class = find_class(module_name, class_name);
+ class = find_class(module_name, class_name, self->find_class);
Py_DECREF(class_name);
}
}
@@ -3889,6 +3899,7 @@ newUnpicklerobject(PyObject *f) {
self->read = NULL;
self->readline = NULL;
self->safe_constructors = NULL;
+ self->find_class = NULL;
UNLESS (self->memo = PyDict_New()) {
Py_XDECREF((PyObject *)self);
@@ -3996,6 +4007,16 @@ Unpickler_getattr(Unpicklerobject *self, char *name) {
return self->pers_func;
}
+ if (!strcmp(name, "find_global")) {
+ if (!self->find_class) {
+ PyErr_SetString(PyExc_AttributeError, name);
+ return NULL;
+ }
+
+ Py_INCREF(self->find_class);
+ return self->find_class;
+ }
+
if (!strcmp(name, "memo")) {
if (!self->memo) {
PyErr_SetString(PyExc_AttributeError, name);
@@ -4018,19 +4039,26 @@ Unpickler_getattr(Unpicklerobject *self, char *name) {
static int
Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value) {
- if (! value) {
- PyErr_SetString(PyExc_TypeError,
- "attribute deletion is not supported");
- return -1;
- }
-
if (!strcmp(name, "persistent_load")) {
Py_XDECREF(self->pers_func);
self->pers_func = value;
- Py_INCREF(value);
+ Py_XINCREF(value);
+ return 0;
+ }
+
+ if (!strcmp(name, "find_global")) {
+ Py_XDECREF(self->find_class);
+ self->find_class = value;
+ Py_XINCREF(value);
return 0;
}
+ if (! value) {
+ PyErr_SetString(PyExc_TypeError,
+ "attribute deletion is not supported");
+ return -1;
+ }
+
if (strcmp(name, "memo") == 0) {
if (! PyDict_Check(value)) {
PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
@@ -4305,7 +4333,7 @@ init_stuff(PyObject *module, PyObject *module_dict) {
DL_EXPORT(void)
initcPickle() {
PyObject *m, *d, *v;
- char *rev="1.63";
+ char *rev="1.66";
PyObject *format_version;
PyObject *compatible_formats;