Documentation clarified to mention optional parameters.
[python.git] / Modules / cPickle.c
blob24c98ccb225602ff51ce27c95986a10d079137f2
1 #include "Python.h"
2 #include "cStringIO.h"
3 #include "structmember.h"
5 PyDoc_STRVAR(cPickle_module_documentation,
6 "C implementation and optimization of the Python pickle module.");
8 #ifndef Py_eval_input
9 #include <graminit.h>
10 #define Py_eval_input eval_input
11 #endif /* Py_eval_input */
13 #define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
15 #define WRITE_BUF_SIZE 256
17 /* Bump this when new opcodes are added to the pickle protocol. */
18 #define HIGHEST_PROTOCOL 2
21 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
22 * docs are in pickletools.py.
24 #define MARK '('
25 #define STOP '.'
26 #define POP '0'
27 #define POP_MARK '1'
28 #define DUP '2'
29 #define FLOAT 'F'
30 #define BINFLOAT 'G'
31 #define INT 'I'
32 #define BININT 'J'
33 #define BININT1 'K'
34 #define LONG 'L'
35 #define BININT2 'M'
36 #define NONE 'N'
37 #define PERSID 'P'
38 #define BINPERSID 'Q'
39 #define REDUCE 'R'
40 #define STRING 'S'
41 #define BINSTRING 'T'
42 #define SHORT_BINSTRING 'U'
43 #define UNICODE 'V'
44 #define BINUNICODE 'X'
45 #define APPEND 'a'
46 #define BUILD 'b'
47 #define GLOBAL 'c'
48 #define DICT 'd'
49 #define EMPTY_DICT '}'
50 #define APPENDS 'e'
51 #define GET 'g'
52 #define BINGET 'h'
53 #define INST 'i'
54 #define LONG_BINGET 'j'
55 #define LIST 'l'
56 #define EMPTY_LIST ']'
57 #define OBJ 'o'
58 #define PUT 'p'
59 #define BINPUT 'q'
60 #define LONG_BINPUT 'r'
61 #define SETITEM 's'
62 #define TUPLE 't'
63 #define EMPTY_TUPLE ')'
64 #define SETITEMS 'u'
66 /* Protocol 2. */
67 #define PROTO '\x80' /* identify pickle protocol */
68 #define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
69 #define EXT1 '\x82' /* push object from extension registry; 1-byte index */
70 #define EXT2 '\x83' /* ditto, but 2-byte index */
71 #define EXT4 '\x84' /* ditto, but 4-byte index */
72 #define TUPLE1 '\x85' /* build 1-tuple from stack top */
73 #define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
74 #define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
75 #define NEWTRUE '\x88' /* push True */
76 #define NEWFALSE '\x89' /* push False */
77 #define LONG1 '\x8a' /* push long from < 256 bytes */
78 #define LONG4 '\x8b' /* push really big long */
80 /* There aren't opcodes -- they're ways to pickle bools before protocol 2,
81 * so that unpicklers written before bools were introduced unpickle them
82 * as ints, but unpicklers after can recognize that bools were intended.
83 * Note that protocol 2 added direct ways to pickle bools.
85 #undef TRUE
86 #define TRUE "I01\n"
87 #undef FALSE
88 #define FALSE "I00\n"
90 /* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
91 * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
92 * break if this gets out of synch with pickle.py, but it's unclear that
93 * would help anything either.
95 #define BATCHSIZE 1000
97 static char MARKv = MARK;
99 static PyObject *PickleError;
100 static PyObject *PicklingError;
101 static PyObject *UnpickleableError;
102 static PyObject *UnpicklingError;
103 static PyObject *BadPickleGet;
105 /* As the name says, an empty tuple. */
106 static PyObject *empty_tuple;
108 /* copy_reg.dispatch_table, {type_object: pickling_function} */
109 static PyObject *dispatch_table;
111 /* For EXT[124] opcodes. */
112 /* copy_reg._extension_registry, {(module_name, function_name): code} */
113 static PyObject *extension_registry;
114 /* copy_reg._inverted_registry, {code: (module_name, function_name)} */
115 static PyObject *inverted_registry;
116 /* copy_reg._extension_cache, {code: object} */
117 static PyObject *extension_cache;
119 /* For looking up name pairs in copy_reg._extension_registry. */
120 static PyObject *two_tuple;
122 static PyObject *__class___str, *__getinitargs___str, *__dict___str,
123 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
124 *__reduce_ex___str,
125 *write_str, *append_str,
126 *read_str, *readline_str, *__main___str,
127 *copy_reg_str, *dispatch_table_str;
129 /*************************************************************************
130 Internal Data type for pickle data. */
132 typedef struct {
133 PyObject_HEAD
134 int length; /* number of initial slots in data currently used */
135 int size; /* number of slots in data allocated */
136 PyObject **data;
137 } Pdata;
139 static void
140 Pdata_dealloc(Pdata *self)
142 int i;
143 PyObject **p;
145 for (i = self->length, p = self->data; --i >= 0; p++) {
146 Py_DECREF(*p);
148 if (self->data)
149 free(self->data);
150 PyObject_Del(self);
153 static PyTypeObject PdataType = {
154 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
155 (destructor)Pdata_dealloc,
156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
159 #define Pdata_Check(O) ((O)->ob_type == &PdataType)
161 static PyObject *
162 Pdata_New(void)
164 Pdata *self;
166 if (!(self = PyObject_New(Pdata, &PdataType)))
167 return NULL;
168 self->size = 8;
169 self->length = 0;
170 self->data = malloc(self->size * sizeof(PyObject*));
171 if (self->data)
172 return (PyObject*)self;
173 Py_DECREF(self);
174 return PyErr_NoMemory();
177 static int
178 stackUnderflow(void)
180 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
181 return -1;
184 /* Retain only the initial clearto items. If clearto >= the current
185 * number of items, this is a (non-erroneous) NOP.
187 static int
188 Pdata_clear(Pdata *self, int clearto)
190 int i;
191 PyObject **p;
193 if (clearto < 0) return stackUnderflow();
194 if (clearto >= self->length) return 0;
196 for (i = self->length, p = self->data + clearto;
197 --i >= clearto;
198 p++) {
199 Py_CLEAR(*p);
201 self->length = clearto;
203 return 0;
206 static int
207 Pdata_grow(Pdata *self)
209 int bigger;
210 size_t nbytes;
211 PyObject **tmp;
213 bigger = self->size << 1;
214 if (bigger <= 0) /* was 0, or new value overflows */
215 goto nomemory;
216 if ((int)(size_t)bigger != bigger)
217 goto nomemory;
218 nbytes = (size_t)bigger * sizeof(PyObject *);
219 if (nbytes / sizeof(PyObject *) != (size_t)bigger)
220 goto nomemory;
221 tmp = realloc(self->data, nbytes);
222 if (tmp == NULL)
223 goto nomemory;
224 self->data = tmp;
225 self->size = bigger;
226 return 0;
228 nomemory:
229 PyErr_NoMemory();
230 return -1;
233 /* D is a Pdata*. Pop the topmost element and store it into V, which
234 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
235 * is raised and V is set to NULL. D and V may be evaluated several times.
237 #define PDATA_POP(D, V) { \
238 if ((D)->length) \
239 (V) = (D)->data[--((D)->length)]; \
240 else { \
241 PyErr_SetString(UnpicklingError, "bad pickle data"); \
242 (V) = NULL; \
246 /* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
247 * D. If the Pdata stack can't be grown to hold the new value, both
248 * raise MemoryError and execute "return ER". The difference is in ownership
249 * of O after: _PUSH transfers ownership of O from the caller to the stack
250 * (no incref of O is done, and in case of error O is decrefed), while
251 * _APPEND pushes a new reference.
254 /* Push O on stack D, giving ownership of O to the stack. */
255 #define PDATA_PUSH(D, O, ER) { \
256 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
257 Pdata_grow((Pdata*)(D)) < 0) { \
258 Py_DECREF(O); \
259 return ER; \
261 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
264 /* Push O on stack D, pushing a new reference. */
265 #define PDATA_APPEND(D, O, ER) { \
266 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
267 Pdata_grow((Pdata*)(D)) < 0) \
268 return ER; \
269 Py_INCREF(O); \
270 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
274 static PyObject *
275 Pdata_popTuple(Pdata *self, int start)
277 PyObject *r;
278 int i, j, l;
280 l = self->length-start;
281 r = PyTuple_New(l);
282 if (r == NULL)
283 return NULL;
284 for (i = start, j = 0 ; j < l; i++, j++)
285 PyTuple_SET_ITEM(r, j, self->data[i]);
287 self->length = start;
288 return r;
291 static PyObject *
292 Pdata_popList(Pdata *self, int start)
294 PyObject *r;
295 int i, j, l;
297 l=self->length-start;
298 if (!( r=PyList_New(l))) return NULL;
299 for (i=start, j=0 ; j < l; i++, j++)
300 PyList_SET_ITEM(r, j, self->data[i]);
302 self->length=start;
303 return r;
306 /*************************************************************************/
308 #define ARG_TUP(self, o) { \
309 if (self->arg || (self->arg=PyTuple_New(1))) { \
310 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
311 PyTuple_SET_ITEM(self->arg,0,o); \
313 else { \
314 Py_DECREF(o); \
318 #define FREE_ARG_TUP(self) { \
319 if (self->arg->ob_refcnt > 1) { \
320 Py_DECREF(self->arg); \
321 self->arg=NULL; \
325 typedef struct Picklerobject {
326 PyObject_HEAD
327 FILE *fp;
328 PyObject *write;
329 PyObject *file;
330 PyObject *memo;
331 PyObject *arg;
332 PyObject *pers_func;
333 PyObject *inst_pers_func;
335 /* pickle protocol number, >= 0 */
336 int proto;
338 /* bool, true if proto > 0 */
339 int bin;
341 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
342 int nesting;
343 int (*write_func)(struct Picklerobject *, const char *, Py_ssize_t);
344 char *write_buf;
345 int buf_size;
346 PyObject *dispatch_table;
347 int fast_container; /* count nested container dumps */
348 PyObject *fast_memo;
349 } Picklerobject;
351 #ifndef PY_CPICKLE_FAST_LIMIT
352 #define PY_CPICKLE_FAST_LIMIT 50
353 #endif
355 static PyTypeObject Picklertype;
357 typedef struct Unpicklerobject {
358 PyObject_HEAD
359 FILE *fp;
360 PyObject *file;
361 PyObject *readline;
362 PyObject *read;
363 PyObject *memo;
364 PyObject *arg;
365 Pdata *stack;
366 PyObject *mark;
367 PyObject *pers_func;
368 PyObject *last_string;
369 int *marks;
370 int num_marks;
371 int marks_size;
372 Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t);
373 Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **);
374 int buf_size;
375 char *buf;
376 PyObject *find_class;
377 } Unpicklerobject;
379 static PyTypeObject Unpicklertype;
381 /* Forward decls that need the above structs */
382 static int save(Picklerobject *, PyObject *, int);
383 static int put2(Picklerobject *, PyObject *);
385 static
386 PyObject *
387 cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
389 va_list va;
390 PyObject *args=0, *retval=0;
391 va_start(va, format);
393 if (format) args = Py_VaBuildValue(format, va);
394 va_end(va);
395 if (format && ! args) return NULL;
396 if (stringformat && !(retval=PyString_FromString(stringformat)))
397 return NULL;
399 if (retval) {
400 if (args) {
401 PyObject *v;
402 v=PyString_Format(retval, args);
403 Py_DECREF(retval);
404 Py_DECREF(args);
405 if (! v) return NULL;
406 retval=v;
409 else
410 if (args) retval=args;
411 else {
412 PyErr_SetObject(ErrType,Py_None);
413 return NULL;
415 PyErr_SetObject(ErrType,retval);
416 Py_DECREF(retval);
417 return NULL;
420 static int
421 write_file(Picklerobject *self, const char *s, Py_ssize_t n)
423 size_t nbyteswritten;
425 if (s == NULL) {
426 return 0;
429 if (n > INT_MAX) {
430 /* String too large */
431 return -1;
434 Py_BEGIN_ALLOW_THREADS
435 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
436 Py_END_ALLOW_THREADS
437 if (nbyteswritten != (size_t)n) {
438 PyErr_SetFromErrno(PyExc_IOError);
439 return -1;
442 return (int)n;
445 static int
446 write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n)
448 if (s == NULL) {
449 return 0;
452 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
453 return -1;
456 return (int)n;
459 static int
460 write_none(Picklerobject *self, const char *s, Py_ssize_t n)
462 if (s == NULL) return 0;
463 if (n > INT_MAX) return -1;
464 return (int)n;
467 static int
468 write_other(Picklerobject *self, const char *s, Py_ssize_t _n)
470 PyObject *py_str = 0, *junk = 0;
471 int n;
473 if (_n > INT_MAX)
474 return -1;
475 n = (int)_n;
476 if (s == NULL) {
477 if (!( self->buf_size )) return 0;
478 py_str = PyString_FromStringAndSize(self->write_buf,
479 self->buf_size);
480 if (!py_str)
481 return -1;
483 else {
484 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
485 if (write_other(self, NULL, 0) < 0)
486 return -1;
489 if (n > WRITE_BUF_SIZE) {
490 if (!( py_str =
491 PyString_FromStringAndSize(s, n)))
492 return -1;
494 else {
495 memcpy(self->write_buf + self->buf_size, s, n);
496 self->buf_size += n;
497 return n;
501 if (self->write) {
502 /* object with write method */
503 ARG_TUP(self, py_str);
504 if (self->arg) {
505 junk = PyObject_Call(self->write, self->arg, NULL);
506 FREE_ARG_TUP(self);
508 if (junk) Py_DECREF(junk);
509 else return -1;
511 else
512 PDATA_PUSH(self->file, py_str, -1);
514 self->buf_size = 0;
515 return n;
519 static Py_ssize_t
520 read_file(Unpicklerobject *self, char **s, Py_ssize_t n)
522 size_t nbytesread;
524 if (self->buf_size == 0) {
525 int size;
527 size = ((n < 32) ? 32 : n);
528 if (!( self->buf = (char *)malloc(size))) {
529 PyErr_NoMemory();
530 return -1;
533 self->buf_size = size;
535 else if (n > self->buf_size) {
536 self->buf = (char *)realloc(self->buf, n);
537 if (!self->buf) {
538 PyErr_NoMemory();
539 return -1;
541 self->buf_size = n;
544 Py_BEGIN_ALLOW_THREADS
545 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
546 Py_END_ALLOW_THREADS
547 if (nbytesread != (size_t)n) {
548 if (feof(self->fp)) {
549 PyErr_SetNone(PyExc_EOFError);
550 return -1;
553 PyErr_SetFromErrno(PyExc_IOError);
554 return -1;
557 *s = self->buf;
559 return n;
563 static Py_ssize_t
564 readline_file(Unpicklerobject *self, char **s)
566 int i;
568 if (self->buf_size == 0) {
569 if (!( self->buf = (char *)malloc(40))) {
570 PyErr_NoMemory();
571 return -1;
573 self->buf_size = 40;
576 i = 0;
577 while (1) {
578 int bigger;
579 for (; i < (self->buf_size - 1); i++) {
580 if (feof(self->fp) ||
581 (self->buf[i] = getc(self->fp)) == '\n') {
582 self->buf[i + 1] = '\0';
583 *s = self->buf;
584 return i + 1;
587 bigger = self->buf_size << 1;
588 if (bigger <= 0) { /* overflow */
589 PyErr_NoMemory();
590 return -1;
592 self->buf = (char *)realloc(self->buf, bigger);
593 if (!self->buf) {
594 PyErr_NoMemory();
595 return -1;
597 self->buf_size = bigger;
602 static Py_ssize_t
603 read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n)
605 char *ptr;
607 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
608 PyErr_SetNone(PyExc_EOFError);
609 return -1;
612 *s = ptr;
614 return n;
618 static Py_ssize_t
619 readline_cStringIO(Unpicklerobject *self, char **s)
621 Py_ssize_t n;
622 char *ptr;
624 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
625 return -1;
628 *s = ptr;
630 return n;
634 static Py_ssize_t
635 read_other(Unpicklerobject *self, char **s, Py_ssize_t n)
637 PyObject *bytes, *str=0;
639 if (!( bytes = PyInt_FromSsize_t(n))) return -1;
641 ARG_TUP(self, bytes);
642 if (self->arg) {
643 str = PyObject_Call(self->read, self->arg, NULL);
644 FREE_ARG_TUP(self);
646 if (! str) return -1;
648 Py_XDECREF(self->last_string);
649 self->last_string = str;
651 if (! (*s = PyString_AsString(str))) return -1;
652 return n;
656 static Py_ssize_t
657 readline_other(Unpicklerobject *self, char **s)
659 PyObject *str;
660 Py_ssize_t str_size;
662 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
663 return -1;
666 if ((str_size = PyString_Size(str)) < 0)
667 return -1;
669 Py_XDECREF(self->last_string);
670 self->last_string = str;
672 if (! (*s = PyString_AsString(str)))
673 return -1;
675 return str_size;
678 /* Copy the first n bytes from s into newly malloc'ed memory, plus a
679 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
680 * The caller is responsible for free()'ing the return value.
682 static char *
683 pystrndup(const char *s, int n)
685 char *r = (char *)malloc(n+1);
686 if (r == NULL)
687 return (char*)PyErr_NoMemory();
688 memcpy(r, s, n);
689 r[n] = 0;
690 return r;
694 static int
695 get(Picklerobject *self, PyObject *id)
697 PyObject *value, *mv;
698 long c_value;
699 char s[30];
700 size_t len;
702 if (!( mv = PyDict_GetItem(self->memo, id))) {
703 PyErr_SetObject(PyExc_KeyError, id);
704 return -1;
707 if (!( value = PyTuple_GetItem(mv, 0)))
708 return -1;
710 if (!( PyInt_Check(value))) {
711 PyErr_SetString(PicklingError, "no int where int expected in memo");
712 return -1;
714 c_value = PyInt_AS_LONG((PyIntObject*)value);
716 if (!self->bin) {
717 s[0] = GET;
718 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
719 len = strlen(s);
721 else if (Pdata_Check(self->file)) {
722 if (write_other(self, NULL, 0) < 0) return -1;
723 PDATA_APPEND(self->file, mv, -1);
724 return 0;
726 else {
727 if (c_value < 256) {
728 s[0] = BINGET;
729 s[1] = (int)(c_value & 0xff);
730 len = 2;
732 else {
733 s[0] = LONG_BINGET;
734 s[1] = (int)(c_value & 0xff);
735 s[2] = (int)((c_value >> 8) & 0xff);
736 s[3] = (int)((c_value >> 16) & 0xff);
737 s[4] = (int)((c_value >> 24) & 0xff);
738 len = 5;
742 if (self->write_func(self, s, len) < 0)
743 return -1;
745 return 0;
749 static int
750 put(Picklerobject *self, PyObject *ob)
752 if (ob->ob_refcnt < 2 || self->fast)
753 return 0;
755 return put2(self, ob);
759 static int
760 put2(Picklerobject *self, PyObject *ob)
762 char c_str[30];
763 int p;
764 size_t len;
765 int res = -1;
766 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
768 if (self->fast)
769 return 0;
771 if ((p = PyDict_Size(self->memo)) < 0)
772 goto finally;
774 /* Make sure memo keys are positive! */
775 /* XXX Why?
776 * XXX And does "positive" really mean non-negative?
777 * XXX pickle.py starts with PUT index 0, not 1. This makes for
778 * XXX gratuitous differences between the pickling modules.
780 p++;
782 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
783 goto finally;
785 if (!( memo_len = PyInt_FromLong(p)))
786 goto finally;
788 if (!( t = PyTuple_New(2)))
789 goto finally;
791 PyTuple_SET_ITEM(t, 0, memo_len);
792 Py_INCREF(memo_len);
793 PyTuple_SET_ITEM(t, 1, ob);
794 Py_INCREF(ob);
796 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
797 goto finally;
799 if (!self->bin) {
800 c_str[0] = PUT;
801 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
802 len = strlen(c_str);
804 else if (Pdata_Check(self->file)) {
805 if (write_other(self, NULL, 0) < 0) return -1;
806 PDATA_APPEND(self->file, memo_len, -1);
807 res=0; /* Job well done ;) */
808 goto finally;
810 else {
811 if (p >= 256) {
812 c_str[0] = LONG_BINPUT;
813 c_str[1] = (int)(p & 0xff);
814 c_str[2] = (int)((p >> 8) & 0xff);
815 c_str[3] = (int)((p >> 16) & 0xff);
816 c_str[4] = (int)((p >> 24) & 0xff);
817 len = 5;
819 else {
820 c_str[0] = BINPUT;
821 c_str[1] = p;
822 len = 2;
826 if (self->write_func(self, c_str, len) < 0)
827 goto finally;
829 res = 0;
831 finally:
832 Py_XDECREF(py_ob_id);
833 Py_XDECREF(memo_len);
834 Py_XDECREF(t);
836 return res;
839 static PyObject *
840 whichmodule(PyObject *global, PyObject *global_name)
842 Py_ssize_t i, j;
843 PyObject *module = 0, *modules_dict = 0,
844 *global_name_attr = 0, *name = 0;
846 module = PyObject_GetAttrString(global, "__module__");
847 if (module)
848 return module;
849 if (PyErr_ExceptionMatches(PyExc_AttributeError))
850 PyErr_Clear();
851 else
852 return NULL;
854 if (!( modules_dict = PySys_GetObject("modules")))
855 return NULL;
857 i = 0;
858 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
860 if (PyObject_Compare(name, __main___str)==0) continue;
862 global_name_attr = PyObject_GetAttr(module, global_name);
863 if (!global_name_attr) {
864 if (PyErr_ExceptionMatches(PyExc_AttributeError))
865 PyErr_Clear();
866 else
867 return NULL;
868 continue;
871 if (global_name_attr != global) {
872 Py_DECREF(global_name_attr);
873 continue;
876 Py_DECREF(global_name_attr);
878 break;
881 /* The following implements the rule in pickle.py added in 1.5
882 that used __main__ if no module is found. I don't actually
883 like this rule. jlf
885 if (!j) {
886 j=1;
887 name=__main___str;
890 Py_INCREF(name);
891 return name;
895 static int
896 fast_save_enter(Picklerobject *self, PyObject *obj)
898 /* if fast_container < 0, we're doing an error exit. */
899 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
900 PyObject *key = NULL;
901 if (self->fast_memo == NULL) {
902 self->fast_memo = PyDict_New();
903 if (self->fast_memo == NULL) {
904 self->fast_container = -1;
905 return 0;
908 key = PyLong_FromVoidPtr(obj);
909 if (key == NULL)
910 return 0;
911 if (PyDict_GetItem(self->fast_memo, key)) {
912 Py_DECREF(key);
913 PyErr_Format(PyExc_ValueError,
914 "fast mode: can't pickle cyclic objects "
915 "including object type %s at %p",
916 obj->ob_type->tp_name, obj);
917 self->fast_container = -1;
918 return 0;
920 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
921 Py_DECREF(key);
922 self->fast_container = -1;
923 return 0;
925 Py_DECREF(key);
927 return 1;
931 fast_save_leave(Picklerobject *self, PyObject *obj)
933 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
934 PyObject *key = PyLong_FromVoidPtr(obj);
935 if (key == NULL)
936 return 0;
937 if (PyDict_DelItem(self->fast_memo, key) < 0) {
938 Py_DECREF(key);
939 return 0;
941 Py_DECREF(key);
943 return 1;
946 static int
947 save_none(Picklerobject *self, PyObject *args)
949 static char none = NONE;
950 if (self->write_func(self, &none, 1) < 0)
951 return -1;
953 return 0;
956 static int
957 save_bool(Picklerobject *self, PyObject *args)
959 static const char *buf[2] = {FALSE, TRUE};
960 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
961 long l = PyInt_AS_LONG((PyIntObject *)args);
963 if (self->proto >= 2) {
964 char opcode = l ? NEWTRUE : NEWFALSE;
965 if (self->write_func(self, &opcode, 1) < 0)
966 return -1;
968 else if (self->write_func(self, buf[l], len[l]) < 0)
969 return -1;
970 return 0;
973 static int
974 save_int(Picklerobject *self, PyObject *args)
976 char c_str[32];
977 long l = PyInt_AS_LONG((PyIntObject *)args);
978 int len = 0;
980 if (!self->bin
981 #if SIZEOF_LONG > 4
982 || l > 0x7fffffffL
983 || l < -0x80000000L
984 #endif
986 /* Text-mode pickle, or long too big to fit in the 4-byte
987 * signed BININT format: store as a string.
989 c_str[0] = INT;
990 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
991 if (self->write_func(self, c_str, strlen(c_str)) < 0)
992 return -1;
994 else {
995 /* Binary pickle and l fits in a signed 4-byte int. */
996 c_str[1] = (int)( l & 0xff);
997 c_str[2] = (int)((l >> 8) & 0xff);
998 c_str[3] = (int)((l >> 16) & 0xff);
999 c_str[4] = (int)((l >> 24) & 0xff);
1001 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1002 if (c_str[2] == 0) {
1003 c_str[0] = BININT1;
1004 len = 2;
1006 else {
1007 c_str[0] = BININT2;
1008 len = 3;
1011 else {
1012 c_str[0] = BININT;
1013 len = 5;
1016 if (self->write_func(self, c_str, len) < 0)
1017 return -1;
1020 return 0;
1024 static int
1025 save_long(Picklerobject *self, PyObject *args)
1027 int size;
1028 int res = -1;
1029 PyObject *repr = NULL;
1031 static char l = LONG;
1033 if (self->proto >= 2) {
1034 /* Linear-time pickling. */
1035 size_t nbits;
1036 size_t nbytes;
1037 unsigned char *pdata;
1038 char c_str[5];
1039 int i;
1040 int sign = _PyLong_Sign(args);
1042 if (sign == 0) {
1043 /* It's 0 -- an empty bytestring. */
1044 c_str[0] = LONG1;
1045 c_str[1] = 0;
1046 i = self->write_func(self, c_str, 2);
1047 if (i < 0) goto finally;
1048 res = 0;
1049 goto finally;
1051 nbits = _PyLong_NumBits(args);
1052 if (nbits == (size_t)-1 && PyErr_Occurred())
1053 goto finally;
1054 /* How many bytes do we need? There are nbits >> 3 full
1055 * bytes of data, and nbits & 7 leftover bits. If there
1056 * are any leftover bits, then we clearly need another
1057 * byte. Wnat's not so obvious is that we *probably*
1058 * need another byte even if there aren't any leftovers:
1059 * the most-significant bit of the most-significant byte
1060 * acts like a sign bit, and it's usually got a sense
1061 * opposite of the one we need. The exception is longs
1062 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1063 * its own 256's-complement, so has the right sign bit
1064 * even without the extra byte. That's a pain to check
1065 * for in advance, though, so we always grab an extra
1066 * byte at the start, and cut it back later if possible.
1068 nbytes = (nbits >> 3) + 1;
1069 if ((int)nbytes < 0 || (size_t)(int)nbytes != nbytes) {
1070 PyErr_SetString(PyExc_OverflowError, "long too large "
1071 "to pickle");
1072 goto finally;
1074 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1075 if (repr == NULL) goto finally;
1076 pdata = (unsigned char *)PyString_AS_STRING(repr);
1077 i = _PyLong_AsByteArray((PyLongObject *)args,
1078 pdata, nbytes,
1079 1 /* little endian */, 1 /* signed */);
1080 if (i < 0) goto finally;
1081 /* If the long is negative, this may be a byte more than
1082 * needed. This is so iff the MSB is all redundant sign
1083 * bits.
1085 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1086 (pdata[nbytes - 2] & 0x80) != 0)
1087 --nbytes;
1089 if (nbytes < 256) {
1090 c_str[0] = LONG1;
1091 c_str[1] = (char)nbytes;
1092 size = 2;
1094 else {
1095 c_str[0] = LONG4;
1096 size = (int)nbytes;
1097 for (i = 1; i < 5; i++) {
1098 c_str[i] = (char)(size & 0xff);
1099 size >>= 8;
1101 size = 5;
1103 i = self->write_func(self, c_str, size);
1104 if (i < 0) goto finally;
1105 i = self->write_func(self, (char *)pdata, (int)nbytes);
1106 if (i < 0) goto finally;
1107 res = 0;
1108 goto finally;
1111 /* proto < 2: write the repr and newline. This is quadratic-time
1112 * (in the number of digits), in both directions.
1114 if (!( repr = PyObject_Repr(args)))
1115 goto finally;
1117 if ((size = PyString_Size(repr)) < 0)
1118 goto finally;
1120 if (self->write_func(self, &l, 1) < 0)
1121 goto finally;
1123 if (self->write_func(self,
1124 PyString_AS_STRING((PyStringObject *)repr),
1125 size) < 0)
1126 goto finally;
1128 if (self->write_func(self, "\n", 1) < 0)
1129 goto finally;
1131 res = 0;
1133 finally:
1134 Py_XDECREF(repr);
1135 return res;
1139 static int
1140 save_float(Picklerobject *self, PyObject *args)
1142 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
1144 if (self->bin) {
1145 char str[9];
1146 str[0] = BINFLOAT;
1147 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
1148 return -1;
1149 if (self->write_func(self, str, 9) < 0)
1150 return -1;
1152 else {
1153 char c_str[250];
1154 c_str[0] = FLOAT;
1155 PyOS_ascii_formatd(c_str + 1, sizeof(c_str) - 2, "%.17g", x);
1156 /* Extend the formatted string with a newline character */
1157 strcat(c_str, "\n");
1159 if (self->write_func(self, c_str, strlen(c_str)) < 0)
1160 return -1;
1163 return 0;
1167 static int
1168 save_string(Picklerobject *self, PyObject *args, int doput)
1170 int size, len;
1171 PyObject *repr=0;
1173 if ((size = PyString_Size(args)) < 0)
1174 return -1;
1176 if (!self->bin) {
1177 char *repr_str;
1179 static char string = STRING;
1181 if (!( repr = PyObject_Repr(args)))
1182 return -1;
1184 if ((len = PyString_Size(repr)) < 0)
1185 goto err;
1186 repr_str = PyString_AS_STRING((PyStringObject *)repr);
1188 if (self->write_func(self, &string, 1) < 0)
1189 goto err;
1191 if (self->write_func(self, repr_str, len) < 0)
1192 goto err;
1194 if (self->write_func(self, "\n", 1) < 0)
1195 goto err;
1197 Py_XDECREF(repr);
1199 else {
1200 int i;
1201 char c_str[5];
1203 if ((size = PyString_Size(args)) < 0)
1204 return -1;
1206 if (size < 256) {
1207 c_str[0] = SHORT_BINSTRING;
1208 c_str[1] = size;
1209 len = 2;
1211 else {
1212 c_str[0] = BINSTRING;
1213 for (i = 1; i < 5; i++)
1214 c_str[i] = (int)(size >> ((i - 1) * 8));
1215 len = 5;
1218 if (self->write_func(self, c_str, len) < 0)
1219 return -1;
1221 if (size > 128 && Pdata_Check(self->file)) {
1222 if (write_other(self, NULL, 0) < 0) return -1;
1223 PDATA_APPEND(self->file, args, -1);
1225 else {
1226 if (self->write_func(self,
1227 PyString_AS_STRING(
1228 (PyStringObject *)args),
1229 size) < 0)
1230 return -1;
1234 if (doput)
1235 if (put(self, args) < 0)
1236 return -1;
1238 return 0;
1240 err:
1241 Py_XDECREF(repr);
1242 return -1;
1246 #ifdef Py_USING_UNICODE
1247 /* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1248 backslash and newline characters to \uXXXX escapes. */
1249 static PyObject *
1250 modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1252 PyObject *repr;
1253 char *p;
1254 char *q;
1256 static const char *hexdigit = "0123456789ABCDEF";
1258 repr = PyString_FromStringAndSize(NULL, 6 * size);
1259 if (repr == NULL)
1260 return NULL;
1261 if (size == 0)
1262 return repr;
1264 p = q = PyString_AS_STRING(repr);
1265 while (size-- > 0) {
1266 Py_UNICODE ch = *s++;
1267 /* Map 16-bit characters to '\uxxxx' */
1268 if (ch >= 256 || ch == '\\' || ch == '\n') {
1269 *p++ = '\\';
1270 *p++ = 'u';
1271 *p++ = hexdigit[(ch >> 12) & 0xf];
1272 *p++ = hexdigit[(ch >> 8) & 0xf];
1273 *p++ = hexdigit[(ch >> 4) & 0xf];
1274 *p++ = hexdigit[ch & 15];
1276 /* Copy everything else as-is */
1277 else
1278 *p++ = (char) ch;
1280 *p = '\0';
1281 _PyString_Resize(&repr, p - q);
1282 return repr;
1286 static int
1287 save_unicode(Picklerobject *self, PyObject *args, int doput)
1289 int size, len;
1290 PyObject *repr=0;
1292 if (!PyUnicode_Check(args))
1293 return -1;
1295 if (!self->bin) {
1296 char *repr_str;
1297 static char string = UNICODE;
1299 repr = modified_EncodeRawUnicodeEscape(
1300 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
1301 if (!repr)
1302 return -1;
1304 if ((len = PyString_Size(repr)) < 0)
1305 goto err;
1306 repr_str = PyString_AS_STRING((PyStringObject *)repr);
1308 if (self->write_func(self, &string, 1) < 0)
1309 goto err;
1311 if (self->write_func(self, repr_str, len) < 0)
1312 goto err;
1314 if (self->write_func(self, "\n", 1) < 0)
1315 goto err;
1317 Py_XDECREF(repr);
1319 else {
1320 int i;
1321 char c_str[5];
1323 if (!( repr = PyUnicode_AsUTF8String(args)))
1324 return -1;
1326 if ((size = PyString_Size(repr)) < 0)
1327 goto err;
1329 c_str[0] = BINUNICODE;
1330 for (i = 1; i < 5; i++)
1331 c_str[i] = (int)(size >> ((i - 1) * 8));
1332 len = 5;
1334 if (self->write_func(self, c_str, len) < 0)
1335 goto err;
1337 if (size > 128 && Pdata_Check(self->file)) {
1338 if (write_other(self, NULL, 0) < 0)
1339 goto err;
1340 PDATA_APPEND(self->file, repr, -1);
1342 else {
1343 if (self->write_func(self, PyString_AS_STRING(repr),
1344 size) < 0)
1345 goto err;
1348 Py_DECREF(repr);
1351 if (doput)
1352 if (put(self, args) < 0)
1353 return -1;
1355 return 0;
1357 err:
1358 Py_XDECREF(repr);
1359 return -1;
1361 #endif
1363 /* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1364 static int
1365 store_tuple_elements(Picklerobject *self, PyObject *t, int len)
1367 int i;
1368 int res = -1; /* guilty until proved innocent */
1370 assert(PyTuple_Size(t) == len);
1372 for (i = 0; i < len; i++) {
1373 PyObject *element = PyTuple_GET_ITEM(t, i);
1375 if (element == NULL)
1376 goto finally;
1377 if (save(self, element, 0) < 0)
1378 goto finally;
1380 res = 0;
1382 finally:
1383 return res;
1386 /* Tuples are ubiquitous in the pickle protocols, so many techniques are
1387 * used across protocols to minimize the space needed to pickle them.
1388 * Tuples are also the only builtin immutable type that can be recursive
1389 * (a tuple can be reached from itself), and that requires some subtle
1390 * magic so that it works in all cases. IOW, this is a long routine.
1392 static int
1393 save_tuple(Picklerobject *self, PyObject *args)
1395 PyObject *py_tuple_id = NULL;
1396 int len, i;
1397 int res = -1;
1399 static char tuple = TUPLE;
1400 static char pop = POP;
1401 static char pop_mark = POP_MARK;
1402 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
1404 if ((len = PyTuple_Size(args)) < 0)
1405 goto finally;
1407 if (len == 0) {
1408 char c_str[2];
1410 if (self->proto) {
1411 c_str[0] = EMPTY_TUPLE;
1412 len = 1;
1414 else {
1415 c_str[0] = MARK;
1416 c_str[1] = TUPLE;
1417 len = 2;
1419 if (self->write_func(self, c_str, len) >= 0)
1420 res = 0;
1421 /* Don't memoize an empty tuple. */
1422 goto finally;
1425 /* A non-empty tuple. */
1427 /* id(tuple) isn't in the memo now. If it shows up there after
1428 * saving the tuple elements, the tuple must be recursive, in
1429 * which case we'll pop everything we put on the stack, and fetch
1430 * its value from the memo.
1432 py_tuple_id = PyLong_FromVoidPtr(args);
1433 if (py_tuple_id == NULL)
1434 goto finally;
1436 if (len <= 3 && self->proto >= 2) {
1437 /* Use TUPLE{1,2,3} opcodes. */
1438 if (store_tuple_elements(self, args, len) < 0)
1439 goto finally;
1440 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1441 /* pop the len elements */
1442 for (i = 0; i < len; ++i)
1443 if (self->write_func(self, &pop, 1) < 0)
1444 goto finally;
1445 /* fetch from memo */
1446 if (get(self, py_tuple_id) < 0)
1447 goto finally;
1448 res = 0;
1449 goto finally;
1451 /* Not recursive. */
1452 if (self->write_func(self, len2opcode + len, 1) < 0)
1453 goto finally;
1454 goto memoize;
1457 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1458 * Generate MARK elt1 elt2 ... TUPLE
1460 if (self->write_func(self, &MARKv, 1) < 0)
1461 goto finally;
1463 if (store_tuple_elements(self, args, len) < 0)
1464 goto finally;
1466 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1467 /* pop the stack stuff we pushed */
1468 if (self->bin) {
1469 if (self->write_func(self, &pop_mark, 1) < 0)
1470 goto finally;
1472 else {
1473 /* Note that we pop one more than len, to remove
1474 * the MARK too.
1476 for (i = 0; i <= len; i++)
1477 if (self->write_func(self, &pop, 1) < 0)
1478 goto finally;
1480 /* fetch from memo */
1481 if (get(self, py_tuple_id) >= 0)
1482 res = 0;
1483 goto finally;
1486 /* Not recursive. */
1487 if (self->write_func(self, &tuple, 1) < 0)
1488 goto finally;
1490 memoize:
1491 if (put(self, args) >= 0)
1492 res = 0;
1494 finally:
1495 Py_XDECREF(py_tuple_id);
1496 return res;
1499 /* iter is an iterator giving items, and we batch up chunks of
1500 * MARK item item ... item APPENDS
1501 * opcode sequences. Calling code should have arranged to first create an
1502 * empty list, or list-like object, for the APPENDS to operate on.
1503 * Returns 0 on success, <0 on error.
1505 static int
1506 batch_list(Picklerobject *self, PyObject *iter)
1508 PyObject *obj;
1509 PyObject *slice[BATCHSIZE];
1510 int i, n;
1512 static char append = APPEND;
1513 static char appends = APPENDS;
1515 assert(iter != NULL);
1517 if (self->proto == 0) {
1518 /* APPENDS isn't available; do one at a time. */
1519 for (;;) {
1520 obj = PyIter_Next(iter);
1521 if (obj == NULL) {
1522 if (PyErr_Occurred())
1523 return -1;
1524 break;
1526 i = save(self, obj, 0);
1527 Py_DECREF(obj);
1528 if (i < 0)
1529 return -1;
1530 if (self->write_func(self, &append, 1) < 0)
1531 return -1;
1533 return 0;
1536 /* proto > 0: write in batches of BATCHSIZE. */
1537 do {
1538 /* Get next group of (no more than) BATCHSIZE elements. */
1539 for (n = 0; n < BATCHSIZE; ++n) {
1540 obj = PyIter_Next(iter);
1541 if (obj == NULL) {
1542 if (PyErr_Occurred())
1543 goto BatchFailed;
1544 break;
1546 slice[n] = obj;
1549 if (n > 1) {
1550 /* Pump out MARK, slice[0:n], APPENDS. */
1551 if (self->write_func(self, &MARKv, 1) < 0)
1552 goto BatchFailed;
1553 for (i = 0; i < n; ++i) {
1554 if (save(self, slice[i], 0) < 0)
1555 goto BatchFailed;
1557 if (self->write_func(self, &appends, 1) < 0)
1558 goto BatchFailed;
1560 else if (n == 1) {
1561 if (save(self, slice[0], 0) < 0)
1562 goto BatchFailed;
1563 if (self->write_func(self, &append, 1) < 0)
1564 goto BatchFailed;
1567 for (i = 0; i < n; ++i) {
1568 Py_DECREF(slice[i]);
1570 } while (n == BATCHSIZE);
1571 return 0;
1573 BatchFailed:
1574 while (--n >= 0) {
1575 Py_DECREF(slice[n]);
1577 return -1;
1580 static int
1581 save_list(Picklerobject *self, PyObject *args)
1583 int res = -1;
1584 char s[3];
1585 int len;
1586 PyObject *iter;
1588 if (self->fast && !fast_save_enter(self, args))
1589 goto finally;
1591 /* Create an empty list. */
1592 if (self->bin) {
1593 s[0] = EMPTY_LIST;
1594 len = 1;
1596 else {
1597 s[0] = MARK;
1598 s[1] = LIST;
1599 len = 2;
1602 if (self->write_func(self, s, len) < 0)
1603 goto finally;
1605 /* Get list length, and bow out early if empty. */
1606 if ((len = PyList_Size(args)) < 0)
1607 goto finally;
1609 /* Memoize. */
1610 if (len == 0) {
1611 if (put(self, args) >= 0)
1612 res = 0;
1613 goto finally;
1615 if (put2(self, args) < 0)
1616 goto finally;
1618 /* Materialize the list elements. */
1619 iter = PyObject_GetIter(args);
1620 if (iter == NULL)
1621 goto finally;
1622 res = batch_list(self, iter);
1623 Py_DECREF(iter);
1625 finally:
1626 if (self->fast && !fast_save_leave(self, args))
1627 res = -1;
1629 return res;
1633 /* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1634 * MARK key value ... key value SETITEMS
1635 * opcode sequences. Calling code should have arranged to first create an
1636 * empty dict, or dict-like object, for the SETITEMS to operate on.
1637 * Returns 0 on success, <0 on error.
1639 * This is very much like batch_list(). The difference between saving
1640 * elements directly, and picking apart two-tuples, is so long-winded at
1641 * the C level, though, that attempts to combine these routines were too
1642 * ugly to bear.
1644 static int
1645 batch_dict(Picklerobject *self, PyObject *iter)
1647 PyObject *p;
1648 PyObject *slice[BATCHSIZE];
1649 int i, n;
1651 static char setitem = SETITEM;
1652 static char setitems = SETITEMS;
1654 assert(iter != NULL);
1656 if (self->proto == 0) {
1657 /* SETITEMS isn't available; do one at a time. */
1658 for (;;) {
1659 p = PyIter_Next(iter);
1660 if (p == NULL) {
1661 if (PyErr_Occurred())
1662 return -1;
1663 break;
1665 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1666 PyErr_SetString(PyExc_TypeError, "dict items "
1667 "iterator must return 2-tuples");
1668 return -1;
1670 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1671 if (i >= 0)
1672 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1673 Py_DECREF(p);
1674 if (i < 0)
1675 return -1;
1676 if (self->write_func(self, &setitem, 1) < 0)
1677 return -1;
1679 return 0;
1682 /* proto > 0: write in batches of BATCHSIZE. */
1683 do {
1684 /* Get next group of (no more than) BATCHSIZE elements. */
1685 for (n = 0; n < BATCHSIZE; ++n) {
1686 p = PyIter_Next(iter);
1687 if (p == NULL) {
1688 if (PyErr_Occurred())
1689 goto BatchFailed;
1690 break;
1692 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1693 PyErr_SetString(PyExc_TypeError, "dict items "
1694 "iterator must return 2-tuples");
1695 goto BatchFailed;
1697 slice[n] = p;
1700 if (n > 1) {
1701 /* Pump out MARK, slice[0:n], SETITEMS. */
1702 if (self->write_func(self, &MARKv, 1) < 0)
1703 goto BatchFailed;
1704 for (i = 0; i < n; ++i) {
1705 p = slice[i];
1706 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1707 goto BatchFailed;
1708 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1709 goto BatchFailed;
1711 if (self->write_func(self, &setitems, 1) < 0)
1712 goto BatchFailed;
1714 else if (n == 1) {
1715 p = slice[0];
1716 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1717 goto BatchFailed;
1718 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1719 goto BatchFailed;
1720 if (self->write_func(self, &setitem, 1) < 0)
1721 goto BatchFailed;
1724 for (i = 0; i < n; ++i) {
1725 Py_DECREF(slice[i]);
1727 } while (n == BATCHSIZE);
1728 return 0;
1730 BatchFailed:
1731 while (--n >= 0) {
1732 Py_DECREF(slice[n]);
1734 return -1;
1737 static int
1738 save_dict(Picklerobject *self, PyObject *args)
1740 int res = -1;
1741 char s[3];
1742 int len;
1743 PyObject *iter;
1745 if (self->fast && !fast_save_enter(self, args))
1746 goto finally;
1748 /* Create an empty dict. */
1749 if (self->bin) {
1750 s[0] = EMPTY_DICT;
1751 len = 1;
1753 else {
1754 s[0] = MARK;
1755 s[1] = DICT;
1756 len = 2;
1759 if (self->write_func(self, s, len) < 0)
1760 goto finally;
1762 /* Get dict size, and bow out early if empty. */
1763 if ((len = PyDict_Size(args)) < 0)
1764 goto finally;
1766 if (len == 0) {
1767 if (put(self, args) >= 0)
1768 res = 0;
1769 goto finally;
1771 if (put2(self, args) < 0)
1772 goto finally;
1774 /* Materialize the dict items. */
1775 iter = PyObject_CallMethod(args, "iteritems", "()");
1776 if (iter == NULL)
1777 goto finally;
1778 res = batch_dict(self, iter);
1779 Py_DECREF(iter);
1781 finally:
1782 if (self->fast && !fast_save_leave(self, args))
1783 res = -1;
1785 return res;
1789 static int
1790 save_inst(Picklerobject *self, PyObject *args)
1792 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1793 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1794 char *module_str, *name_str;
1795 int module_size, name_size, res = -1;
1797 static char inst = INST, obj = OBJ, build = BUILD;
1799 if (self->fast && !fast_save_enter(self, args))
1800 goto finally;
1802 if (self->write_func(self, &MARKv, 1) < 0)
1803 goto finally;
1805 if (!( class = PyObject_GetAttr(args, __class___str)))
1806 goto finally;
1808 if (self->bin) {
1809 if (save(self, class, 0) < 0)
1810 goto finally;
1813 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1814 PyObject *element = 0;
1815 int i, len;
1817 if (!( class_args =
1818 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
1819 goto finally;
1821 if ((len = PyObject_Size(class_args)) < 0)
1822 goto finally;
1824 for (i = 0; i < len; i++) {
1825 if (!( element = PySequence_GetItem(class_args, i)))
1826 goto finally;
1828 if (save(self, element, 0) < 0) {
1829 Py_DECREF(element);
1830 goto finally;
1833 Py_DECREF(element);
1836 else {
1837 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1838 PyErr_Clear();
1839 else
1840 goto finally;
1843 if (!self->bin) {
1844 if (!( name = ((PyClassObject *)class)->cl_name )) {
1845 PyErr_SetString(PicklingError, "class has no name");
1846 goto finally;
1849 if (!( module = whichmodule(class, name)))
1850 goto finally;
1853 if ((module_size = PyString_Size(module)) < 0 ||
1854 (name_size = PyString_Size(name)) < 0)
1855 goto finally;
1857 module_str = PyString_AS_STRING((PyStringObject *)module);
1858 name_str = PyString_AS_STRING((PyStringObject *)name);
1860 if (self->write_func(self, &inst, 1) < 0)
1861 goto finally;
1863 if (self->write_func(self, module_str, module_size) < 0)
1864 goto finally;
1866 if (self->write_func(self, "\n", 1) < 0)
1867 goto finally;
1869 if (self->write_func(self, name_str, name_size) < 0)
1870 goto finally;
1872 if (self->write_func(self, "\n", 1) < 0)
1873 goto finally;
1875 else if (self->write_func(self, &obj, 1) < 0) {
1876 goto finally;
1879 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1880 state = PyObject_Call(getstate_func, empty_tuple, NULL);
1881 if (!state)
1882 goto finally;
1884 else {
1885 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1886 PyErr_Clear();
1887 else
1888 goto finally;
1890 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1891 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1892 PyErr_Clear();
1893 else
1894 goto finally;
1895 res = 0;
1896 goto finally;
1900 if (!PyDict_Check(state)) {
1901 if (put2(self, args) < 0)
1902 goto finally;
1904 else {
1905 if (put(self, args) < 0)
1906 goto finally;
1909 if (save(self, state, 0) < 0)
1910 goto finally;
1912 if (self->write_func(self, &build, 1) < 0)
1913 goto finally;
1915 res = 0;
1917 finally:
1918 if (self->fast && !fast_save_leave(self, args))
1919 res = -1;
1921 Py_XDECREF(module);
1922 Py_XDECREF(class);
1923 Py_XDECREF(state);
1924 Py_XDECREF(getinitargs_func);
1925 Py_XDECREF(getstate_func);
1926 Py_XDECREF(class_args);
1928 return res;
1932 static int
1933 save_global(Picklerobject *self, PyObject *args, PyObject *name)
1935 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
1936 char *name_str, *module_str;
1937 int module_size, name_size, res = -1;
1939 static char global = GLOBAL;
1941 if (name) {
1942 global_name = name;
1943 Py_INCREF(global_name);
1945 else {
1946 if (!( global_name = PyObject_GetAttr(args, __name___str)))
1947 goto finally;
1950 if (!( module = whichmodule(args, global_name)))
1951 goto finally;
1953 if ((module_size = PyString_Size(module)) < 0 ||
1954 (name_size = PyString_Size(global_name)) < 0)
1955 goto finally;
1957 module_str = PyString_AS_STRING((PyStringObject *)module);
1958 name_str = PyString_AS_STRING((PyStringObject *)global_name);
1960 /* XXX This can be doing a relative import. Clearly it shouldn't,
1961 but I don't know how to stop it. :-( */
1962 mod = PyImport_ImportModule(module_str);
1963 if (mod == NULL) {
1964 cPickle_ErrFormat(PicklingError,
1965 "Can't pickle %s: import of module %s "
1966 "failed",
1967 "OS", args, module);
1968 goto finally;
1970 klass = PyObject_GetAttrString(mod, name_str);
1971 if (klass == NULL) {
1972 cPickle_ErrFormat(PicklingError,
1973 "Can't pickle %s: attribute lookup %s.%s "
1974 "failed",
1975 "OSS", args, module, global_name);
1976 goto finally;
1978 if (klass != args) {
1979 Py_DECREF(klass);
1980 cPickle_ErrFormat(PicklingError,
1981 "Can't pickle %s: it's not the same object "
1982 "as %s.%s",
1983 "OSS", args, module, global_name);
1984 goto finally;
1986 Py_DECREF(klass);
1988 if (self->proto >= 2) {
1989 /* See whether this is in the extension registry, and if
1990 * so generate an EXT opcode.
1992 PyObject *py_code; /* extension code as Python object */
1993 long code; /* extension code as C value */
1994 char c_str[5];
1995 int n;
1997 PyTuple_SET_ITEM(two_tuple, 0, module);
1998 PyTuple_SET_ITEM(two_tuple, 1, global_name);
1999 py_code = PyDict_GetItem(extension_registry, two_tuple);
2000 if (py_code == NULL)
2001 goto gen_global; /* not registered */
2003 /* Verify py_code has the right type and value. */
2004 if (!PyInt_Check(py_code)) {
2005 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
2006 "extension code %s isn't an integer",
2007 "OO", args, py_code);
2008 goto finally;
2010 code = PyInt_AS_LONG(py_code);
2011 if (code <= 0 || code > 0x7fffffffL) {
2012 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
2013 "extension code %ld is out of range",
2014 "Ol", args, code);
2015 goto finally;
2018 /* Generate an EXT opcode. */
2019 if (code <= 0xff) {
2020 c_str[0] = EXT1;
2021 c_str[1] = (char)code;
2022 n = 2;
2024 else if (code <= 0xffff) {
2025 c_str[0] = EXT2;
2026 c_str[1] = (char)(code & 0xff);
2027 c_str[2] = (char)((code >> 8) & 0xff);
2028 n = 3;
2030 else {
2031 c_str[0] = EXT4;
2032 c_str[1] = (char)(code & 0xff);
2033 c_str[2] = (char)((code >> 8) & 0xff);
2034 c_str[3] = (char)((code >> 16) & 0xff);
2035 c_str[4] = (char)((code >> 24) & 0xff);
2036 n = 5;
2039 if (self->write_func(self, c_str, n) >= 0)
2040 res = 0;
2041 goto finally; /* and don't memoize */
2044 gen_global:
2045 if (self->write_func(self, &global, 1) < 0)
2046 goto finally;
2048 if (self->write_func(self, module_str, module_size) < 0)
2049 goto finally;
2051 if (self->write_func(self, "\n", 1) < 0)
2052 goto finally;
2054 if (self->write_func(self, name_str, name_size) < 0)
2055 goto finally;
2057 if (self->write_func(self, "\n", 1) < 0)
2058 goto finally;
2060 if (put(self, args) < 0)
2061 goto finally;
2063 res = 0;
2065 finally:
2066 Py_XDECREF(module);
2067 Py_XDECREF(global_name);
2068 Py_XDECREF(mod);
2070 return res;
2073 static int
2074 save_pers(Picklerobject *self, PyObject *args, PyObject *f)
2076 PyObject *pid = 0;
2077 int size, res = -1;
2079 static char persid = PERSID, binpersid = BINPERSID;
2081 Py_INCREF(args);
2082 ARG_TUP(self, args);
2083 if (self->arg) {
2084 pid = PyObject_Call(f, self->arg, NULL);
2085 FREE_ARG_TUP(self);
2087 if (! pid) return -1;
2089 if (pid != Py_None) {
2090 if (!self->bin) {
2091 if (!PyString_Check(pid)) {
2092 PyErr_SetString(PicklingError,
2093 "persistent id must be string");
2094 goto finally;
2097 if (self->write_func(self, &persid, 1) < 0)
2098 goto finally;
2100 if ((size = PyString_Size(pid)) < 0)
2101 goto finally;
2103 if (self->write_func(self,
2104 PyString_AS_STRING(
2105 (PyStringObject *)pid),
2106 size) < 0)
2107 goto finally;
2109 if (self->write_func(self, "\n", 1) < 0)
2110 goto finally;
2112 res = 1;
2113 goto finally;
2115 else if (save(self, pid, 1) >= 0) {
2116 if (self->write_func(self, &binpersid, 1) < 0)
2117 res = -1;
2118 else
2119 res = 1;
2122 goto finally;
2125 res = 0;
2127 finally:
2128 Py_XDECREF(pid);
2130 return res;
2133 /* We're saving ob, and args is the 2-thru-5 tuple returned by the
2134 * appropriate __reduce__ method for ob.
2136 static int
2137 save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
2139 PyObject *callable;
2140 PyObject *argtup;
2141 PyObject *state = NULL;
2142 PyObject *listitems = NULL;
2143 PyObject *dictitems = NULL;
2145 int use_newobj = self->proto >= 2;
2147 static char reduce = REDUCE;
2148 static char build = BUILD;
2149 static char newobj = NEWOBJ;
2151 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2152 &callable,
2153 &argtup,
2154 &state,
2155 &listitems,
2156 &dictitems))
2157 return -1;
2159 if (!PyTuple_Check(argtup)) {
2160 PyErr_SetString(PicklingError,
2161 "args from reduce() should be a tuple");
2162 return -1;
2165 if (state == Py_None)
2166 state = NULL;
2167 if (listitems == Py_None)
2168 listitems = NULL;
2169 if (dictitems == Py_None)
2170 dictitems = NULL;
2172 /* Protocol 2 special case: if callable's name is __newobj__, use
2173 * NEWOBJ. This consumes a lot of code.
2175 if (use_newobj) {
2176 PyObject *temp = PyObject_GetAttr(callable, __name___str);
2178 if (temp == NULL) {
2179 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2180 PyErr_Clear();
2181 else
2182 return -1;
2183 use_newobj = 0;
2185 else {
2186 use_newobj = PyString_Check(temp) &&
2187 strcmp(PyString_AS_STRING(temp),
2188 "__newobj__") == 0;
2189 Py_DECREF(temp);
2192 if (use_newobj) {
2193 PyObject *cls;
2194 PyObject *newargtup;
2195 int n, i;
2197 /* Sanity checks. */
2198 n = PyTuple_Size(argtup);
2199 if (n < 1) {
2200 PyErr_SetString(PicklingError, "__newobj__ arglist "
2201 "is empty");
2202 return -1;
2205 cls = PyTuple_GET_ITEM(argtup, 0);
2206 if (! PyObject_HasAttrString(cls, "__new__")) {
2207 PyErr_SetString(PicklingError, "args[0] from "
2208 "__newobj__ args has no __new__");
2209 return -1;
2212 /* XXX How could ob be NULL? */
2213 if (ob != NULL) {
2214 PyObject *ob_dot_class;
2216 ob_dot_class = PyObject_GetAttr(ob, __class___str);
2217 if (ob_dot_class == NULL) {
2218 if (PyErr_ExceptionMatches(
2219 PyExc_AttributeError))
2220 PyErr_Clear();
2221 else
2222 return -1;
2224 i = ob_dot_class != cls; /* true iff a problem */
2225 Py_XDECREF(ob_dot_class);
2226 if (i) {
2227 PyErr_SetString(PicklingError, "args[0] from "
2228 "__newobj__ args has the wrong class");
2229 return -1;
2233 /* Save the class and its __new__ arguments. */
2234 if (save(self, cls, 0) < 0)
2235 return -1;
2237 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2238 if (newargtup == NULL)
2239 return -1;
2240 for (i = 1; i < n; ++i) {
2241 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2242 Py_INCREF(temp);
2243 PyTuple_SET_ITEM(newargtup, i-1, temp);
2245 i = save(self, newargtup, 0) < 0;
2246 Py_DECREF(newargtup);
2247 if (i < 0)
2248 return -1;
2250 /* Add NEWOBJ opcode. */
2251 if (self->write_func(self, &newobj, 1) < 0)
2252 return -1;
2254 else {
2255 /* Not using NEWOBJ. */
2256 if (save(self, callable, 0) < 0 ||
2257 save(self, argtup, 0) < 0 ||
2258 self->write_func(self, &reduce, 1) < 0)
2259 return -1;
2262 /* Memoize. */
2263 /* XXX How can ob be NULL? */
2264 if (ob != NULL) {
2265 if (state && !PyDict_Check(state)) {
2266 if (put2(self, ob) < 0)
2267 return -1;
2269 else if (put(self, ob) < 0)
2270 return -1;
2274 if (listitems && batch_list(self, listitems) < 0)
2275 return -1;
2277 if (dictitems && batch_dict(self, dictitems) < 0)
2278 return -1;
2280 if (state) {
2281 if (save(self, state, 0) < 0 ||
2282 self->write_func(self, &build, 1) < 0)
2283 return -1;
2286 return 0;
2289 static int
2290 save(Picklerobject *self, PyObject *args, int pers_save)
2292 PyTypeObject *type;
2293 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2294 PyObject *arg_tup;
2295 int res = -1;
2296 int tmp, size;
2298 if (self->nesting++ > Py_GetRecursionLimit()){
2299 PyErr_SetString(PyExc_RuntimeError,
2300 "maximum recursion depth exceeded");
2301 goto finally;
2304 if (!pers_save && self->pers_func) {
2305 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2306 res = tmp;
2307 goto finally;
2311 if (args == Py_None) {
2312 res = save_none(self, args);
2313 goto finally;
2316 type = args->ob_type;
2318 switch (type->tp_name[0]) {
2319 case 'b':
2320 if (args == Py_False || args == Py_True) {
2321 res = save_bool(self, args);
2322 goto finally;
2324 break;
2325 case 'i':
2326 if (type == &PyInt_Type) {
2327 res = save_int(self, args);
2328 goto finally;
2330 break;
2332 case 'l':
2333 if (type == &PyLong_Type) {
2334 res = save_long(self, args);
2335 goto finally;
2337 break;
2339 case 'f':
2340 if (type == &PyFloat_Type) {
2341 res = save_float(self, args);
2342 goto finally;
2344 break;
2346 case 't':
2347 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2348 res = save_tuple(self, args);
2349 goto finally;
2351 break;
2353 case 's':
2354 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2355 res = save_string(self, args, 0);
2356 goto finally;
2359 #ifdef Py_USING_UNICODE
2360 case 'u':
2361 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2362 res = save_unicode(self, args, 0);
2363 goto finally;
2365 #endif
2368 if (args->ob_refcnt > 1) {
2369 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
2370 goto finally;
2372 if (PyDict_GetItem(self->memo, py_ob_id)) {
2373 if (get(self, py_ob_id) < 0)
2374 goto finally;
2376 res = 0;
2377 goto finally;
2381 switch (type->tp_name[0]) {
2382 case 's':
2383 if (type == &PyString_Type) {
2384 res = save_string(self, args, 1);
2385 goto finally;
2387 break;
2389 #ifdef Py_USING_UNICODE
2390 case 'u':
2391 if (type == &PyUnicode_Type) {
2392 res = save_unicode(self, args, 1);
2393 goto finally;
2395 break;
2396 #endif
2398 case 't':
2399 if (type == &PyTuple_Type) {
2400 res = save_tuple(self, args);
2401 goto finally;
2403 if (type == &PyType_Type) {
2404 res = save_global(self, args, NULL);
2405 goto finally;
2407 break;
2409 case 'l':
2410 if (type == &PyList_Type) {
2411 res = save_list(self, args);
2412 goto finally;
2414 break;
2416 case 'd':
2417 if (type == &PyDict_Type) {
2418 res = save_dict(self, args);
2419 goto finally;
2421 break;
2423 case 'i':
2424 if (type == &PyInstance_Type) {
2425 res = save_inst(self, args);
2426 goto finally;
2428 break;
2430 case 'c':
2431 if (type == &PyClass_Type) {
2432 res = save_global(self, args, NULL);
2433 goto finally;
2435 break;
2437 case 'f':
2438 if (type == &PyFunction_Type) {
2439 res = save_global(self, args, NULL);
2440 if (res && PyErr_ExceptionMatches(PickleError)) {
2441 /* fall back to reduce */
2442 PyErr_Clear();
2443 break;
2445 goto finally;
2447 break;
2449 case 'b':
2450 if (type == &PyCFunction_Type) {
2451 res = save_global(self, args, NULL);
2452 goto finally;
2456 if (!pers_save && self->inst_pers_func) {
2457 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2458 res = tmp;
2459 goto finally;
2463 if (PyType_IsSubtype(type, &PyType_Type)) {
2464 res = save_global(self, args, NULL);
2465 goto finally;
2468 /* Get a reduction callable, and call it. This may come from
2469 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2470 * or the object's __reduce__ method.
2472 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2473 if (__reduce__ != NULL) {
2474 Py_INCREF(__reduce__);
2475 Py_INCREF(args);
2476 ARG_TUP(self, args);
2477 if (self->arg) {
2478 t = PyObject_Call(__reduce__, self->arg, NULL);
2479 FREE_ARG_TUP(self);
2482 else {
2483 /* Check for a __reduce_ex__ method. */
2484 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2485 if (__reduce__ != NULL) {
2486 t = PyInt_FromLong(self->proto);
2487 if (t != NULL) {
2488 ARG_TUP(self, t);
2489 t = NULL;
2490 if (self->arg) {
2491 t = PyObject_Call(__reduce__,
2492 self->arg, NULL);
2493 FREE_ARG_TUP(self);
2497 else {
2498 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2499 PyErr_Clear();
2500 else
2501 goto finally;
2502 /* Check for a __reduce__ method. */
2503 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2504 if (__reduce__ != NULL) {
2505 t = PyObject_Call(__reduce__,
2506 empty_tuple, NULL);
2508 else {
2509 PyErr_SetObject(UnpickleableError, args);
2510 goto finally;
2515 if (t == NULL)
2516 goto finally;
2518 if (PyString_Check(t)) {
2519 res = save_global(self, args, t);
2520 goto finally;
2523 if (! PyTuple_Check(t)) {
2524 cPickle_ErrFormat(PicklingError, "Value returned by "
2525 "%s must be string or tuple",
2526 "O", __reduce__);
2527 goto finally;
2530 size = PyTuple_Size(t);
2531 if (size < 2 || size > 5) {
2532 cPickle_ErrFormat(PicklingError, "tuple returned by "
2533 "%s must contain 2 through 5 elements",
2534 "O", __reduce__);
2535 goto finally;
2538 arg_tup = PyTuple_GET_ITEM(t, 1);
2539 if (!(PyTuple_Check(arg_tup) || arg_tup == Py_None)) {
2540 cPickle_ErrFormat(PicklingError, "Second element of "
2541 "tuple returned by %s must be a tuple",
2542 "O", __reduce__);
2543 goto finally;
2546 res = save_reduce(self, t, args);
2548 finally:
2549 self->nesting--;
2550 Py_XDECREF(py_ob_id);
2551 Py_XDECREF(__reduce__);
2552 Py_XDECREF(t);
2554 return res;
2558 static int
2559 dump(Picklerobject *self, PyObject *args)
2561 static char stop = STOP;
2563 if (self->proto >= 2) {
2564 char bytes[2];
2566 bytes[0] = PROTO;
2567 assert(self->proto >= 0 && self->proto < 256);
2568 bytes[1] = (char)self->proto;
2569 if (self->write_func(self, bytes, 2) < 0)
2570 return -1;
2573 if (save(self, args, 0) < 0)
2574 return -1;
2576 if (self->write_func(self, &stop, 1) < 0)
2577 return -1;
2579 if (self->write_func(self, NULL, 0) < 0)
2580 return -1;
2582 return 0;
2585 static PyObject *
2586 Pickle_clear_memo(Picklerobject *self, PyObject *args)
2588 if (self->memo)
2589 PyDict_Clear(self->memo);
2590 Py_INCREF(Py_None);
2591 return Py_None;
2594 static PyObject *
2595 Pickle_getvalue(Picklerobject *self, PyObject *args)
2597 int l, i, rsize, ssize, clear=1, lm;
2598 long ik;
2599 PyObject *k, *r;
2600 char *s, *p, *have_get;
2601 Pdata *data;
2603 /* Can be called by Python code or C code */
2604 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2605 return NULL;
2607 /* Check to make sure we are based on a list */
2608 if (! Pdata_Check(self->file)) {
2609 PyErr_SetString(PicklingError,
2610 "Attempt to getvalue() a non-list-based pickler");
2611 return NULL;
2614 /* flush write buffer */
2615 if (write_other(self, NULL, 0) < 0) return NULL;
2617 data=(Pdata*)self->file;
2618 l=data->length;
2620 /* set up an array to hold get/put status */
2621 lm = PyDict_Size(self->memo);
2622 if (lm < 0) return NULL;
2623 lm++;
2624 have_get = malloc(lm);
2625 if (have_get == NULL) return PyErr_NoMemory();
2626 memset(have_get, 0, lm);
2628 /* Scan for gets. */
2629 for (rsize = 0, i = l; --i >= 0; ) {
2630 k = data->data[i];
2632 if (PyString_Check(k))
2633 rsize += PyString_GET_SIZE(k);
2635 else if (PyInt_Check(k)) { /* put */
2636 ik = PyInt_AS_LONG((PyIntObject*)k);
2637 if (ik >= lm || ik == 0) {
2638 PyErr_SetString(PicklingError,
2639 "Invalid get data");
2640 goto err;
2642 if (have_get[ik]) /* with matching get */
2643 rsize += ik < 256 ? 2 : 5;
2646 else if (! (PyTuple_Check(k) &&
2647 PyTuple_GET_SIZE(k) == 2 &&
2648 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
2650 PyErr_SetString(PicklingError,
2651 "Unexpected data in internal list");
2652 goto err;
2655 else { /* put */
2656 ik = PyInt_AS_LONG((PyIntObject *)k);
2657 if (ik >= lm || ik == 0) {
2658 PyErr_SetString(PicklingError,
2659 "Invalid get data");
2660 return NULL;
2662 have_get[ik] = 1;
2663 rsize += ik < 256 ? 2 : 5;
2667 /* Now generate the result */
2668 r = PyString_FromStringAndSize(NULL, rsize);
2669 if (r == NULL) goto err;
2670 s = PyString_AS_STRING((PyStringObject *)r);
2672 for (i = 0; i < l; i++) {
2673 k = data->data[i];
2675 if (PyString_Check(k)) {
2676 ssize = PyString_GET_SIZE(k);
2677 if (ssize) {
2678 p=PyString_AS_STRING((PyStringObject *)k);
2679 while (--ssize >= 0)
2680 *s++ = *p++;
2684 else if (PyTuple_Check(k)) { /* get */
2685 ik = PyInt_AS_LONG((PyIntObject *)
2686 PyTuple_GET_ITEM(k, 0));
2687 if (ik < 256) {
2688 *s++ = BINGET;
2689 *s++ = (int)(ik & 0xff);
2691 else {
2692 *s++ = LONG_BINGET;
2693 *s++ = (int)(ik & 0xff);
2694 *s++ = (int)((ik >> 8) & 0xff);
2695 *s++ = (int)((ik >> 16) & 0xff);
2696 *s++ = (int)((ik >> 24) & 0xff);
2700 else { /* put */
2701 ik = PyInt_AS_LONG((PyIntObject*)k);
2703 if (have_get[ik]) { /* with matching get */
2704 if (ik < 256) {
2705 *s++ = BINPUT;
2706 *s++ = (int)(ik & 0xff);
2708 else {
2709 *s++ = LONG_BINPUT;
2710 *s++ = (int)(ik & 0xff);
2711 *s++ = (int)((ik >> 8) & 0xff);
2712 *s++ = (int)((ik >> 16) & 0xff);
2713 *s++ = (int)((ik >> 24) & 0xff);
2719 if (clear) {
2720 PyDict_Clear(self->memo);
2721 Pdata_clear(data, 0);
2724 free(have_get);
2725 return r;
2726 err:
2727 free(have_get);
2728 return NULL;
2731 static PyObject *
2732 Pickler_dump(Picklerobject *self, PyObject *args)
2734 PyObject *ob;
2735 int get=0;
2737 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
2738 return NULL;
2740 if (dump(self, ob) < 0)
2741 return NULL;
2743 if (get) return Pickle_getvalue(self, NULL);
2745 /* XXX Why does dump() return self? */
2746 Py_INCREF(self);
2747 return (PyObject*)self;
2751 static struct PyMethodDef Pickler_methods[] =
2753 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
2754 PyDoc_STR("dump(object) -- "
2755 "Write an object in pickle format to the object's pickle stream")},
2756 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
2757 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
2758 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
2759 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
2760 {NULL, NULL} /* sentinel */
2764 static Picklerobject *
2765 newPicklerobject(PyObject *file, int proto)
2767 Picklerobject *self;
2769 if (proto < 0)
2770 proto = HIGHEST_PROTOCOL;
2771 if (proto > HIGHEST_PROTOCOL) {
2772 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2773 "the highest available protocol is %d",
2774 proto, HIGHEST_PROTOCOL);
2775 return NULL;
2778 self = PyObject_GC_New(Picklerobject, &Picklertype);
2779 if (self == NULL)
2780 return NULL;
2781 self->proto = proto;
2782 self->bin = proto > 0;
2783 self->fp = NULL;
2784 self->write = NULL;
2785 self->memo = NULL;
2786 self->arg = NULL;
2787 self->pers_func = NULL;
2788 self->inst_pers_func = NULL;
2789 self->write_buf = NULL;
2790 self->fast = 0;
2791 self->nesting = 0;
2792 self->fast_container = 0;
2793 self->fast_memo = NULL;
2794 self->buf_size = 0;
2795 self->dispatch_table = NULL;
2797 self->file = NULL;
2798 if (file)
2799 Py_INCREF(file);
2800 else {
2801 file = Pdata_New();
2802 if (file == NULL)
2803 goto err;
2805 self->file = file;
2807 if (!( self->memo = PyDict_New()))
2808 goto err;
2810 if (PyFile_Check(file)) {
2811 self->fp = PyFile_AsFile(file);
2812 if (self->fp == NULL) {
2813 PyErr_SetString(PyExc_ValueError,
2814 "I/O operation on closed file");
2815 goto err;
2817 self->write_func = write_file;
2819 else if (PycStringIO_OutputCheck(file)) {
2820 self->write_func = write_cStringIO;
2822 else if (file == Py_None) {
2823 self->write_func = write_none;
2825 else {
2826 self->write_func = write_other;
2828 if (! Pdata_Check(file)) {
2829 self->write = PyObject_GetAttr(file, write_str);
2830 if (!self->write) {
2831 PyErr_Clear();
2832 PyErr_SetString(PyExc_TypeError,
2833 "argument must have 'write' "
2834 "attribute");
2835 goto err;
2839 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2840 if (self->write_buf == NULL) {
2841 PyErr_NoMemory();
2842 goto err;
2846 if (PyEval_GetRestricted()) {
2847 /* Restricted execution, get private tables */
2848 PyObject *m = PyImport_Import(copy_reg_str);
2850 if (m == NULL)
2851 goto err;
2852 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
2853 Py_DECREF(m);
2854 if (self->dispatch_table == NULL)
2855 goto err;
2857 else {
2858 self->dispatch_table = dispatch_table;
2859 Py_INCREF(dispatch_table);
2861 PyObject_GC_Track(self);
2863 return self;
2865 err:
2866 Py_DECREF(self);
2867 return NULL;
2871 static PyObject *
2872 get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
2874 static char *kwlist[] = {"file", "protocol", NULL};
2875 PyObject *file = NULL;
2876 int proto = 0;
2878 /* XXX
2879 * The documented signature is Pickler(file, protocol=0), but this
2880 * accepts Pickler() and Pickler(integer) too. The meaning then
2881 * is clear as mud, undocumented, and not supported by pickle.py.
2882 * I'm told Zope uses this, but I haven't traced into this code
2883 * far enough to figure out what it means.
2885 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
2886 PyErr_Clear();
2887 proto = 0;
2888 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2889 kwlist, &file, &proto))
2890 return NULL;
2892 return (PyObject *)newPicklerobject(file, proto);
2896 static void
2897 Pickler_dealloc(Picklerobject *self)
2899 PyObject_GC_UnTrack(self);
2900 Py_XDECREF(self->write);
2901 Py_XDECREF(self->memo);
2902 Py_XDECREF(self->fast_memo);
2903 Py_XDECREF(self->arg);
2904 Py_XDECREF(self->file);
2905 Py_XDECREF(self->pers_func);
2906 Py_XDECREF(self->inst_pers_func);
2907 Py_XDECREF(self->dispatch_table);
2908 PyMem_Free(self->write_buf);
2909 self->ob_type->tp_free((PyObject *)self);
2912 static int
2913 Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2915 Py_VISIT(self->write);
2916 Py_VISIT(self->memo);
2917 Py_VISIT(self->fast_memo);
2918 Py_VISIT(self->arg);
2919 Py_VISIT(self->file);
2920 Py_VISIT(self->pers_func);
2921 Py_VISIT(self->inst_pers_func);
2922 Py_VISIT(self->dispatch_table);
2923 return 0;
2926 static int
2927 Pickler_clear(Picklerobject *self)
2929 Py_CLEAR(self->write);
2930 Py_CLEAR(self->memo);
2931 Py_CLEAR(self->fast_memo);
2932 Py_CLEAR(self->arg);
2933 Py_CLEAR(self->file);
2934 Py_CLEAR(self->pers_func);
2935 Py_CLEAR(self->inst_pers_func);
2936 Py_CLEAR(self->dispatch_table);
2937 return 0;
2940 static PyObject *
2941 Pickler_get_pers_func(Picklerobject *p)
2943 if (p->pers_func == NULL)
2944 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2945 else
2946 Py_INCREF(p->pers_func);
2947 return p->pers_func;
2950 static int
2951 Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2953 if (v == NULL) {
2954 PyErr_SetString(PyExc_TypeError,
2955 "attribute deletion is not supported");
2956 return -1;
2958 Py_XDECREF(p->pers_func);
2959 Py_INCREF(v);
2960 p->pers_func = v;
2961 return 0;
2964 static int
2965 Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2967 if (v == NULL) {
2968 PyErr_SetString(PyExc_TypeError,
2969 "attribute deletion is not supported");
2970 return -1;
2972 Py_XDECREF(p->inst_pers_func);
2973 Py_INCREF(v);
2974 p->inst_pers_func = v;
2975 return 0;
2978 static PyObject *
2979 Pickler_get_memo(Picklerobject *p)
2981 if (p->memo == NULL)
2982 PyErr_SetString(PyExc_AttributeError, "memo");
2983 else
2984 Py_INCREF(p->memo);
2985 return p->memo;
2988 static int
2989 Pickler_set_memo(Picklerobject *p, PyObject *v)
2991 if (v == NULL) {
2992 PyErr_SetString(PyExc_TypeError,
2993 "attribute deletion is not supported");
2994 return -1;
2996 if (!PyDict_Check(v)) {
2997 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2998 return -1;
3000 Py_XDECREF(p->memo);
3001 Py_INCREF(v);
3002 p->memo = v;
3003 return 0;
3006 static PyObject *
3007 Pickler_get_error(Picklerobject *p)
3009 /* why is this an attribute on the Pickler? */
3010 Py_INCREF(PicklingError);
3011 return PicklingError;
3014 static PyMemberDef Pickler_members[] = {
3015 {"binary", T_INT, offsetof(Picklerobject, bin)},
3016 {"fast", T_INT, offsetof(Picklerobject, fast)},
3017 {NULL}
3020 static PyGetSetDef Pickler_getsets[] = {
3021 {"persistent_id", (getter)Pickler_get_pers_func,
3022 (setter)Pickler_set_pers_func},
3023 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
3024 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
3025 {"PicklingError", (getter)Pickler_get_error, NULL},
3026 {NULL}
3029 PyDoc_STRVAR(Picklertype__doc__,
3030 "Objects that know how to pickle objects\n");
3032 static PyTypeObject Picklertype = {
3033 PyObject_HEAD_INIT(NULL)
3034 0, /*ob_size*/
3035 "cPickle.Pickler", /*tp_name*/
3036 sizeof(Picklerobject), /*tp_basicsize*/
3038 (destructor)Pickler_dealloc, /* tp_dealloc */
3039 0, /* tp_print */
3040 0, /* tp_getattr */
3041 0, /* tp_setattr */
3042 0, /* tp_compare */
3043 0, /* tp_repr */
3044 0, /* tp_as_number */
3045 0, /* tp_as_sequence */
3046 0, /* tp_as_mapping */
3047 0, /* tp_hash */
3048 0, /* tp_call */
3049 0, /* tp_str */
3050 PyObject_GenericGetAttr, /* tp_getattro */
3051 PyObject_GenericSetAttr, /* tp_setattro */
3052 0, /* tp_as_buffer */
3053 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
3054 Picklertype__doc__, /* tp_doc */
3055 (traverseproc)Pickler_traverse, /* tp_traverse */
3056 (inquiry)Pickler_clear, /* tp_clear */
3057 0, /* tp_richcompare */
3058 0, /* tp_weaklistoffset */
3059 0, /* tp_iter */
3060 0, /* tp_iternext */
3061 Pickler_methods, /* tp_methods */
3062 Pickler_members, /* tp_members */
3063 Pickler_getsets, /* tp_getset */
3066 static PyObject *
3067 find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
3069 PyObject *global = 0, *module;
3071 if (fc) {
3072 if (fc==Py_None) {
3073 PyErr_SetString(UnpicklingError, "Global and instance "
3074 "pickles are not supported.");
3075 return NULL;
3077 return PyObject_CallFunctionObjArgs(fc, py_module_name,
3078 py_global_name, NULL);
3081 module = PySys_GetObject("modules");
3082 if (module == NULL)
3083 return NULL;
3085 module = PyDict_GetItem(module, py_module_name);
3086 if (module == NULL) {
3087 module = PyImport_Import(py_module_name);
3088 if (!module)
3089 return NULL;
3090 global = PyObject_GetAttr(module, py_global_name);
3091 Py_DECREF(module);
3093 else
3094 global = PyObject_GetAttr(module, py_global_name);
3095 return global;
3098 static int
3099 marker(Unpicklerobject *self)
3101 if (self->num_marks < 1) {
3102 PyErr_SetString(UnpicklingError, "could not find MARK");
3103 return -1;
3106 return self->marks[--self->num_marks];
3110 static int
3111 load_none(Unpicklerobject *self)
3113 PDATA_APPEND(self->stack, Py_None, -1);
3114 return 0;
3117 static int
3118 bad_readline(void)
3120 PyErr_SetString(UnpicklingError, "pickle data was truncated");
3121 return -1;
3124 static int
3125 load_int(Unpicklerobject *self)
3127 PyObject *py_int = 0;
3128 char *endptr, *s;
3129 int len, res = -1;
3130 long l;
3132 if ((len = self->readline_func(self, &s)) < 0) return -1;
3133 if (len < 2) return bad_readline();
3134 if (!( s=pystrndup(s,len))) return -1;
3136 errno = 0;
3137 l = strtol(s, &endptr, 0);
3139 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3140 /* Hm, maybe we've got something long. Let's try reading
3141 it as a Python long object. */
3142 errno = 0;
3143 py_int = PyLong_FromString(s, NULL, 0);
3144 if (py_int == NULL) {
3145 PyErr_SetString(PyExc_ValueError,
3146 "could not convert string to int");
3147 goto finally;
3150 else {
3151 if (len == 3 && (l == 0 || l == 1)) {
3152 if (!( py_int = PyBool_FromLong(l))) goto finally;
3154 else {
3155 if (!( py_int = PyInt_FromLong(l))) goto finally;
3159 free(s);
3160 PDATA_PUSH(self->stack, py_int, -1);
3161 return 0;
3163 finally:
3164 free(s);
3166 return res;
3169 static int
3170 load_bool(Unpicklerobject *self, PyObject *boolean)
3172 assert(boolean == Py_True || boolean == Py_False);
3173 PDATA_APPEND(self->stack, boolean, -1);
3174 return 0;
3177 /* s contains x bytes of a little-endian integer. Return its value as a
3178 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3179 * int, but when x is 4 it's a signed one. This is an historical source
3180 * of x-platform bugs.
3182 static long
3183 calc_binint(char *s, int x)
3185 unsigned char c;
3186 int i;
3187 long l;
3189 for (i = 0, l = 0L; i < x; i++) {
3190 c = (unsigned char)s[i];
3191 l |= (long)c << (i * 8);
3193 #if SIZEOF_LONG > 4
3194 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3195 * is signed, so on a box with longs bigger than 4 bytes we need
3196 * to extend a BININT's sign bit to the full width.
3198 if (x == 4 && l & (1L << 31))
3199 l |= (~0L) << 32;
3200 #endif
3201 return l;
3205 static int
3206 load_binintx(Unpicklerobject *self, char *s, int x)
3208 PyObject *py_int = 0;
3209 long l;
3211 l = calc_binint(s, x);
3213 if (!( py_int = PyInt_FromLong(l)))
3214 return -1;
3216 PDATA_PUSH(self->stack, py_int, -1);
3217 return 0;
3221 static int
3222 load_binint(Unpicklerobject *self)
3224 char *s;
3226 if (self->read_func(self, &s, 4) < 0)
3227 return -1;
3229 return load_binintx(self, s, 4);
3233 static int
3234 load_binint1(Unpicklerobject *self)
3236 char *s;
3238 if (self->read_func(self, &s, 1) < 0)
3239 return -1;
3241 return load_binintx(self, s, 1);
3245 static int
3246 load_binint2(Unpicklerobject *self)
3248 char *s;
3250 if (self->read_func(self, &s, 2) < 0)
3251 return -1;
3253 return load_binintx(self, s, 2);
3256 static int
3257 load_long(Unpicklerobject *self)
3259 PyObject *l = 0;
3260 char *end, *s;
3261 int len, res = -1;
3263 if ((len = self->readline_func(self, &s)) < 0) return -1;
3264 if (len < 2) return bad_readline();
3265 if (!( s=pystrndup(s,len))) return -1;
3267 if (!( l = PyLong_FromString(s, &end, 0)))
3268 goto finally;
3270 free(s);
3271 PDATA_PUSH(self->stack, l, -1);
3272 return 0;
3274 finally:
3275 free(s);
3277 return res;
3280 /* 'size' bytes contain the # of bytes of little-endian 256's-complement
3281 * data following.
3283 static int
3284 load_counted_long(Unpicklerobject *self, int size)
3286 Py_ssize_t i;
3287 char *nbytes;
3288 unsigned char *pdata;
3289 PyObject *along;
3291 assert(size == 1 || size == 4);
3292 i = self->read_func(self, &nbytes, size);
3293 if (i < 0) return -1;
3295 size = calc_binint(nbytes, size);
3296 if (size < 0) {
3297 /* Corrupt or hostile pickle -- we never write one like
3298 * this.
3300 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
3301 "byte count");
3302 return -1;
3305 if (size == 0)
3306 along = PyLong_FromLong(0L);
3307 else {
3308 /* Read the raw little-endian bytes & convert. */
3309 i = self->read_func(self, (char **)&pdata, size);
3310 if (i < 0) return -1;
3311 along = _PyLong_FromByteArray(pdata, (size_t)size,
3312 1 /* little endian */, 1 /* signed */);
3314 if (along == NULL)
3315 return -1;
3316 PDATA_PUSH(self->stack, along, -1);
3317 return 0;
3320 static int
3321 load_float(Unpicklerobject *self)
3323 PyObject *py_float = 0;
3324 char *endptr, *s;
3325 int len, res = -1;
3326 double d;
3328 if ((len = self->readline_func(self, &s)) < 0) return -1;
3329 if (len < 2) return bad_readline();
3330 if (!( s=pystrndup(s,len))) return -1;
3332 errno = 0;
3333 d = PyOS_ascii_strtod(s, &endptr);
3335 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3336 PyErr_SetString(PyExc_ValueError,
3337 "could not convert string to float");
3338 goto finally;
3341 if (!( py_float = PyFloat_FromDouble(d)))
3342 goto finally;
3344 free(s);
3345 PDATA_PUSH(self->stack, py_float, -1);
3346 return 0;
3348 finally:
3349 free(s);
3351 return res;
3354 static int
3355 load_binfloat(Unpicklerobject *self)
3357 PyObject *py_float;
3358 double x;
3359 char *p;
3361 if (self->read_func(self, &p, 8) < 0)
3362 return -1;
3364 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3365 if (x == -1.0 && PyErr_Occurred())
3366 return -1;
3368 py_float = PyFloat_FromDouble(x);
3369 if (py_float == NULL)
3370 return -1;
3372 PDATA_PUSH(self->stack, py_float, -1);
3373 return 0;
3376 static int
3377 load_string(Unpicklerobject *self)
3379 PyObject *str = 0;
3380 int len, res = -1;
3381 char *s, *p;
3383 if ((len = self->readline_func(self, &s)) < 0) return -1;
3384 if (len < 2) return bad_readline();
3385 if (!( s=pystrndup(s,len))) return -1;
3388 /* Strip outermost quotes */
3389 while (s[len-1] <= ' ')
3390 len--;
3391 if(s[0]=='"' && s[len-1]=='"'){
3392 s[len-1] = '\0';
3393 p = s + 1 ;
3394 len -= 2;
3395 } else if(s[0]=='\'' && s[len-1]=='\''){
3396 s[len-1] = '\0';
3397 p = s + 1 ;
3398 len -= 2;
3399 } else
3400 goto insecure;
3401 /********************************************/
3403 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
3404 free(s);
3405 if (str) {
3406 PDATA_PUSH(self->stack, str, -1);
3407 res = 0;
3409 return res;
3411 insecure:
3412 free(s);
3413 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3414 return -1;
3418 static int
3419 load_binstring(Unpicklerobject *self)
3421 PyObject *py_string = 0;
3422 long l;
3423 char *s;
3425 if (self->read_func(self, &s, 4) < 0) return -1;
3427 l = calc_binint(s, 4);
3429 if (self->read_func(self, &s, l) < 0)
3430 return -1;
3432 if (!( py_string = PyString_FromStringAndSize(s, l)))
3433 return -1;
3435 PDATA_PUSH(self->stack, py_string, -1);
3436 return 0;
3440 static int
3441 load_short_binstring(Unpicklerobject *self)
3443 PyObject *py_string = 0;
3444 unsigned char l;
3445 char *s;
3447 if (self->read_func(self, &s, 1) < 0)
3448 return -1;
3450 l = (unsigned char)s[0];
3452 if (self->read_func(self, &s, l) < 0) return -1;
3454 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
3456 PDATA_PUSH(self->stack, py_string, -1);
3457 return 0;
3461 #ifdef Py_USING_UNICODE
3462 static int
3463 load_unicode(Unpicklerobject *self)
3465 PyObject *str = 0;
3466 int len, res = -1;
3467 char *s;
3469 if ((len = self->readline_func(self, &s)) < 0) return -1;
3470 if (len < 1) return bad_readline();
3472 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
3473 goto finally;
3475 PDATA_PUSH(self->stack, str, -1);
3476 return 0;
3478 finally:
3479 return res;
3481 #endif
3484 #ifdef Py_USING_UNICODE
3485 static int
3486 load_binunicode(Unpicklerobject *self)
3488 PyObject *unicode;
3489 long l;
3490 char *s;
3492 if (self->read_func(self, &s, 4) < 0) return -1;
3494 l = calc_binint(s, 4);
3496 if (self->read_func(self, &s, l) < 0)
3497 return -1;
3499 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
3500 return -1;
3502 PDATA_PUSH(self->stack, unicode, -1);
3503 return 0;
3505 #endif
3508 static int
3509 load_tuple(Unpicklerobject *self)
3511 PyObject *tup;
3512 int i;
3514 if ((i = marker(self)) < 0) return -1;
3515 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3516 PDATA_PUSH(self->stack, tup, -1);
3517 return 0;
3520 static int
3521 load_counted_tuple(Unpicklerobject *self, int len)
3523 PyObject *tup = PyTuple_New(len);
3525 if (tup == NULL)
3526 return -1;
3528 while (--len >= 0) {
3529 PyObject *element;
3531 PDATA_POP(self->stack, element);
3532 if (element == NULL)
3533 return -1;
3534 PyTuple_SET_ITEM(tup, len, element);
3536 PDATA_PUSH(self->stack, tup, -1);
3537 return 0;
3540 static int
3541 load_empty_list(Unpicklerobject *self)
3543 PyObject *list;
3545 if (!( list=PyList_New(0))) return -1;
3546 PDATA_PUSH(self->stack, list, -1);
3547 return 0;
3550 static int
3551 load_empty_dict(Unpicklerobject *self)
3553 PyObject *dict;
3555 if (!( dict=PyDict_New())) return -1;
3556 PDATA_PUSH(self->stack, dict, -1);
3557 return 0;
3561 static int
3562 load_list(Unpicklerobject *self)
3564 PyObject *list = 0;
3565 int i;
3567 if ((i = marker(self)) < 0) return -1;
3568 if (!( list=Pdata_popList(self->stack, i))) return -1;
3569 PDATA_PUSH(self->stack, list, -1);
3570 return 0;
3573 static int
3574 load_dict(Unpicklerobject *self)
3576 PyObject *dict, *key, *value;
3577 int i, j, k;
3579 if ((i = marker(self)) < 0) return -1;
3580 j=self->stack->length;
3582 if (!( dict = PyDict_New())) return -1;
3584 for (k = i+1; k < j; k += 2) {
3585 key =self->stack->data[k-1];
3586 value=self->stack->data[k ];
3587 if (PyDict_SetItem(dict, key, value) < 0) {
3588 Py_DECREF(dict);
3589 return -1;
3592 Pdata_clear(self->stack, i);
3593 PDATA_PUSH(self->stack, dict, -1);
3594 return 0;
3597 static PyObject *
3598 Instance_New(PyObject *cls, PyObject *args)
3600 PyObject *r = 0;
3602 if (PyClass_Check(cls)) {
3603 int l;
3605 if ((l=PyObject_Size(args)) < 0) goto err;
3606 if (!( l )) {
3607 PyObject *__getinitargs__;
3609 __getinitargs__ = PyObject_GetAttr(cls,
3610 __getinitargs___str);
3611 if (!__getinitargs__) {
3612 /* We have a class with no __getinitargs__,
3613 so bypass usual construction */
3614 PyObject *inst;
3616 PyErr_Clear();
3617 if (!( inst=PyInstance_NewRaw(cls, NULL)))
3618 goto err;
3619 return inst;
3621 Py_DECREF(__getinitargs__);
3624 if ((r=PyInstance_New(cls, args, NULL))) return r;
3625 else goto err;
3628 if ((r=PyObject_CallObject(cls, args))) return r;
3630 err:
3632 PyObject *tp, *v, *tb, *tmp_value;
3634 PyErr_Fetch(&tp, &v, &tb);
3635 tmp_value = v;
3636 /* NULL occurs when there was a KeyboardInterrupt */
3637 if (tmp_value == NULL)
3638 tmp_value = Py_None;
3639 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
3640 Py_XDECREF(v);
3641 v=r;
3643 PyErr_Restore(tp,v,tb);
3645 return NULL;
3649 static int
3650 load_obj(Unpicklerobject *self)
3652 PyObject *class, *tup, *obj=0;
3653 int i;
3655 if ((i = marker(self)) < 0) return -1;
3656 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3657 PDATA_POP(self->stack, class);
3658 if (class) {
3659 obj = Instance_New(class, tup);
3660 Py_DECREF(class);
3662 Py_DECREF(tup);
3664 if (! obj) return -1;
3665 PDATA_PUSH(self->stack, obj, -1);
3666 return 0;
3670 static int
3671 load_inst(Unpicklerobject *self)
3673 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3674 int i, len;
3675 char *s;
3677 if ((i = marker(self)) < 0) return -1;
3679 if ((len = self->readline_func(self, &s)) < 0) return -1;
3680 if (len < 2) return bad_readline();
3681 module_name = PyString_FromStringAndSize(s, len - 1);
3682 if (!module_name) return -1;
3684 if ((len = self->readline_func(self, &s)) >= 0) {
3685 if (len < 2) return bad_readline();
3686 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3687 class = find_class(module_name, class_name,
3688 self->find_class);
3689 Py_DECREF(class_name);
3692 Py_DECREF(module_name);
3694 if (! class) return -1;
3696 if ((tup=Pdata_popTuple(self->stack, i))) {
3697 obj = Instance_New(class, tup);
3698 Py_DECREF(tup);
3700 Py_DECREF(class);
3702 if (! obj) return -1;
3704 PDATA_PUSH(self->stack, obj, -1);
3705 return 0;
3708 static int
3709 load_newobj(Unpicklerobject *self)
3711 PyObject *args = NULL;
3712 PyObject *clsraw = NULL;
3713 PyTypeObject *cls; /* clsraw cast to its true type */
3714 PyObject *obj;
3716 /* Stack is ... cls argtuple, and we want to call
3717 * cls.__new__(cls, *argtuple).
3719 PDATA_POP(self->stack, args);
3720 if (args == NULL) goto Fail;
3721 if (! PyTuple_Check(args)) {
3722 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3723 "tuple.");
3724 goto Fail;
3727 PDATA_POP(self->stack, clsraw);
3728 cls = (PyTypeObject *)clsraw;
3729 if (cls == NULL) goto Fail;
3730 if (! PyType_Check(cls)) {
3731 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3732 "isn't a type object");
3733 goto Fail;
3735 if (cls->tp_new == NULL) {
3736 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3737 "has NULL tp_new");
3738 goto Fail;
3741 /* Call __new__. */
3742 obj = cls->tp_new(cls, args, NULL);
3743 if (obj == NULL) goto Fail;
3745 Py_DECREF(args);
3746 Py_DECREF(clsraw);
3747 PDATA_PUSH(self->stack, obj, -1);
3748 return 0;
3750 Fail:
3751 Py_XDECREF(args);
3752 Py_XDECREF(clsraw);
3753 return -1;
3756 static int
3757 load_global(Unpicklerobject *self)
3759 PyObject *class = 0, *module_name = 0, *class_name = 0;
3760 int len;
3761 char *s;
3763 if ((len = self->readline_func(self, &s)) < 0) return -1;
3764 if (len < 2) return bad_readline();
3765 module_name = PyString_FromStringAndSize(s, len - 1);
3766 if (!module_name) return -1;
3768 if ((len = self->readline_func(self, &s)) >= 0) {
3769 if (len < 2) {
3770 Py_DECREF(module_name);
3771 return bad_readline();
3773 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3774 class = find_class(module_name, class_name,
3775 self->find_class);
3776 Py_DECREF(class_name);
3779 Py_DECREF(module_name);
3781 if (! class) return -1;
3782 PDATA_PUSH(self->stack, class, -1);
3783 return 0;
3787 static int
3788 load_persid(Unpicklerobject *self)
3790 PyObject *pid = 0;
3791 int len;
3792 char *s;
3794 if (self->pers_func) {
3795 if ((len = self->readline_func(self, &s)) < 0) return -1;
3796 if (len < 2) return bad_readline();
3798 pid = PyString_FromStringAndSize(s, len - 1);
3799 if (!pid) return -1;
3801 if (PyList_Check(self->pers_func)) {
3802 if (PyList_Append(self->pers_func, pid) < 0) {
3803 Py_DECREF(pid);
3804 return -1;
3807 else {
3808 ARG_TUP(self, pid);
3809 if (self->arg) {
3810 pid = PyObject_Call(self->pers_func, self->arg,
3811 NULL);
3812 FREE_ARG_TUP(self);
3816 if (! pid) return -1;
3818 PDATA_PUSH(self->stack, pid, -1);
3819 return 0;
3821 else {
3822 PyErr_SetString(UnpicklingError,
3823 "A load persistent id instruction was encountered,\n"
3824 "but no persistent_load function was specified.");
3825 return -1;
3829 static int
3830 load_binpersid(Unpicklerobject *self)
3832 PyObject *pid = 0;
3834 if (self->pers_func) {
3835 PDATA_POP(self->stack, pid);
3836 if (! pid) return -1;
3838 if (PyList_Check(self->pers_func)) {
3839 if (PyList_Append(self->pers_func, pid) < 0) {
3840 Py_DECREF(pid);
3841 return -1;
3844 else {
3845 ARG_TUP(self, pid);
3846 if (self->arg) {
3847 pid = PyObject_Call(self->pers_func, self->arg,
3848 NULL);
3849 FREE_ARG_TUP(self);
3851 if (! pid) return -1;
3854 PDATA_PUSH(self->stack, pid, -1);
3855 return 0;
3857 else {
3858 PyErr_SetString(UnpicklingError,
3859 "A load persistent id instruction was encountered,\n"
3860 "but no persistent_load function was specified.");
3861 return -1;
3866 static int
3867 load_pop(Unpicklerobject *self)
3869 int len;
3871 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3873 /* Note that we split the (pickle.py) stack into two stacks,
3874 an object stack and a mark stack. We have to be clever and
3875 pop the right one. We do this by looking at the top of the
3876 mark stack.
3879 if ((self->num_marks > 0) &&
3880 (self->marks[self->num_marks - 1] == len))
3881 self->num_marks--;
3882 else {
3883 len--;
3884 Py_DECREF(self->stack->data[len]);
3885 self->stack->length=len;
3888 return 0;
3892 static int
3893 load_pop_mark(Unpicklerobject *self)
3895 int i;
3897 if ((i = marker(self)) < 0)
3898 return -1;
3900 Pdata_clear(self->stack, i);
3902 return 0;
3906 static int
3907 load_dup(Unpicklerobject *self)
3909 PyObject *last;
3910 int len;
3912 if ((len = self->stack->length) <= 0) return stackUnderflow();
3913 last=self->stack->data[len-1];
3914 Py_INCREF(last);
3915 PDATA_PUSH(self->stack, last, -1);
3916 return 0;
3920 static int
3921 load_get(Unpicklerobject *self)
3923 PyObject *py_str = 0, *value = 0;
3924 int len;
3925 char *s;
3926 int rc;
3928 if ((len = self->readline_func(self, &s)) < 0) return -1;
3929 if (len < 2) return bad_readline();
3931 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
3933 value = PyDict_GetItem(self->memo, py_str);
3934 if (! value) {
3935 PyErr_SetObject(BadPickleGet, py_str);
3936 rc = -1;
3938 else {
3939 PDATA_APPEND(self->stack, value, -1);
3940 rc = 0;
3943 Py_DECREF(py_str);
3944 return rc;
3948 static int
3949 load_binget(Unpicklerobject *self)
3951 PyObject *py_key = 0, *value = 0;
3952 unsigned char key;
3953 char *s;
3954 int rc;
3956 if (self->read_func(self, &s, 1) < 0) return -1;
3958 key = (unsigned char)s[0];
3959 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3961 value = PyDict_GetItem(self->memo, py_key);
3962 if (! value) {
3963 PyErr_SetObject(BadPickleGet, py_key);
3964 rc = -1;
3966 else {
3967 PDATA_APPEND(self->stack, value, -1);
3968 rc = 0;
3971 Py_DECREF(py_key);
3972 return rc;
3976 static int
3977 load_long_binget(Unpicklerobject *self)
3979 PyObject *py_key = 0, *value = 0;
3980 unsigned char c;
3981 char *s;
3982 long key;
3983 int rc;
3985 if (self->read_func(self, &s, 4) < 0) return -1;
3987 c = (unsigned char)s[0];
3988 key = (long)c;
3989 c = (unsigned char)s[1];
3990 key |= (long)c << 8;
3991 c = (unsigned char)s[2];
3992 key |= (long)c << 16;
3993 c = (unsigned char)s[3];
3994 key |= (long)c << 24;
3996 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3998 value = PyDict_GetItem(self->memo, py_key);
3999 if (! value) {
4000 PyErr_SetObject(BadPickleGet, py_key);
4001 rc = -1;
4003 else {
4004 PDATA_APPEND(self->stack, value, -1);
4005 rc = 0;
4008 Py_DECREF(py_key);
4009 return rc;
4012 /* Push an object from the extension registry (EXT[124]). nbytes is
4013 * the number of bytes following the opcode, holding the index (code) value.
4015 static int
4016 load_extension(Unpicklerobject *self, int nbytes)
4018 char *codebytes; /* the nbytes bytes after the opcode */
4019 long code; /* calc_binint returns long */
4020 PyObject *py_code; /* code as a Python int */
4021 PyObject *obj; /* the object to push */
4022 PyObject *pair; /* (module_name, class_name) */
4023 PyObject *module_name, *class_name;
4025 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4026 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4027 code = calc_binint(codebytes, nbytes);
4028 if (code <= 0) { /* note that 0 is forbidden */
4029 /* Corrupt or hostile pickle. */
4030 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
4031 return -1;
4034 /* Look for the code in the cache. */
4035 py_code = PyInt_FromLong(code);
4036 if (py_code == NULL) return -1;
4037 obj = PyDict_GetItem(extension_cache, py_code);
4038 if (obj != NULL) {
4039 /* Bingo. */
4040 Py_DECREF(py_code);
4041 PDATA_APPEND(self->stack, obj, -1);
4042 return 0;
4045 /* Look up the (module_name, class_name) pair. */
4046 pair = PyDict_GetItem(inverted_registry, py_code);
4047 if (pair == NULL) {
4048 Py_DECREF(py_code);
4049 PyErr_Format(PyExc_ValueError, "unregistered extension "
4050 "code %ld", code);
4051 return -1;
4053 /* Since the extension registry is manipulable via Python code,
4054 * confirm that pair is really a 2-tuple of strings.
4056 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
4057 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
4058 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
4059 Py_DECREF(py_code);
4060 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
4061 "isn't a 2-tuple of strings", code);
4062 return -1;
4064 /* Load the object. */
4065 obj = find_class(module_name, class_name, self->find_class);
4066 if (obj == NULL) {
4067 Py_DECREF(py_code);
4068 return -1;
4070 /* Cache code -> obj. */
4071 code = PyDict_SetItem(extension_cache, py_code, obj);
4072 Py_DECREF(py_code);
4073 if (code < 0) {
4074 Py_DECREF(obj);
4075 return -1;
4077 PDATA_PUSH(self->stack, obj, -1);
4078 return 0;
4081 static int
4082 load_put(Unpicklerobject *self)
4084 PyObject *py_str = 0, *value = 0;
4085 int len, l;
4086 char *s;
4088 if ((l = self->readline_func(self, &s)) < 0) return -1;
4089 if (l < 2) return bad_readline();
4090 if (!( len=self->stack->length )) return stackUnderflow();
4091 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
4092 value=self->stack->data[len-1];
4093 l=PyDict_SetItem(self->memo, py_str, value);
4094 Py_DECREF(py_str);
4095 return l;
4099 static int
4100 load_binput(Unpicklerobject *self)
4102 PyObject *py_key = 0, *value = 0;
4103 unsigned char key;
4104 char *s;
4105 int len;
4107 if (self->read_func(self, &s, 1) < 0) return -1;
4108 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
4110 key = (unsigned char)s[0];
4112 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4113 value=self->stack->data[len-1];
4114 len=PyDict_SetItem(self->memo, py_key, value);
4115 Py_DECREF(py_key);
4116 return len;
4120 static int
4121 load_long_binput(Unpicklerobject *self)
4123 PyObject *py_key = 0, *value = 0;
4124 long key;
4125 unsigned char c;
4126 char *s;
4127 int len;
4129 if (self->read_func(self, &s, 4) < 0) return -1;
4130 if (!( len=self->stack->length )) return stackUnderflow();
4132 c = (unsigned char)s[0];
4133 key = (long)c;
4134 c = (unsigned char)s[1];
4135 key |= (long)c << 8;
4136 c = (unsigned char)s[2];
4137 key |= (long)c << 16;
4138 c = (unsigned char)s[3];
4139 key |= (long)c << 24;
4141 if (!( py_key = PyInt_FromLong(key))) return -1;
4142 value=self->stack->data[len-1];
4143 len=PyDict_SetItem(self->memo, py_key, value);
4144 Py_DECREF(py_key);
4145 return len;
4149 static int
4150 do_append(Unpicklerobject *self, int x)
4152 PyObject *value = 0, *list = 0, *append_method = 0;
4153 int len, i;
4155 len=self->stack->length;
4156 if (!( len >= x && x > 0 )) return stackUnderflow();
4157 /* nothing to do */
4158 if (len==x) return 0;
4160 list=self->stack->data[x-1];
4162 if (PyList_Check(list)) {
4163 PyObject *slice;
4164 int list_len;
4166 slice=Pdata_popList(self->stack, x);
4167 if (! slice) return -1;
4168 list_len = PyList_GET_SIZE(list);
4169 i=PyList_SetSlice(list, list_len, list_len, slice);
4170 Py_DECREF(slice);
4171 return i;
4173 else {
4175 if (!( append_method = PyObject_GetAttr(list, append_str)))
4176 return -1;
4178 for (i = x; i < len; i++) {
4179 PyObject *junk;
4181 value=self->stack->data[i];
4182 junk=0;
4183 ARG_TUP(self, value);
4184 if (self->arg) {
4185 junk = PyObject_Call(append_method, self->arg,
4186 NULL);
4187 FREE_ARG_TUP(self);
4189 if (! junk) {
4190 Pdata_clear(self->stack, i+1);
4191 self->stack->length=x;
4192 Py_DECREF(append_method);
4193 return -1;
4195 Py_DECREF(junk);
4197 self->stack->length=x;
4198 Py_DECREF(append_method);
4201 return 0;
4205 static int
4206 load_append(Unpicklerobject *self)
4208 return do_append(self, self->stack->length - 1);
4212 static int
4213 load_appends(Unpicklerobject *self)
4215 return do_append(self, marker(self));
4219 static int
4220 do_setitems(Unpicklerobject *self, int x)
4222 PyObject *value = 0, *key = 0, *dict = 0;
4223 int len, i, r=0;
4225 if (!( (len=self->stack->length) >= x
4226 && x > 0 )) return stackUnderflow();
4228 dict=self->stack->data[x-1];
4230 for (i = x+1; i < len; i += 2) {
4231 key =self->stack->data[i-1];
4232 value=self->stack->data[i ];
4233 if (PyObject_SetItem(dict, key, value) < 0) {
4234 r=-1;
4235 break;
4239 Pdata_clear(self->stack, x);
4241 return r;
4245 static int
4246 load_setitem(Unpicklerobject *self)
4248 return do_setitems(self, self->stack->length - 2);
4251 static int
4252 load_setitems(Unpicklerobject *self)
4254 return do_setitems(self, marker(self));
4258 static int
4259 load_build(Unpicklerobject *self)
4261 PyObject *state, *inst, *slotstate;
4262 PyObject *__setstate__;
4263 PyObject *d_key, *d_value;
4264 Py_ssize_t i;
4265 int res = -1;
4267 /* Stack is ... instance, state. We want to leave instance at
4268 * the stack top, possibly mutated via instance.__setstate__(state).
4270 if (self->stack->length < 2)
4271 return stackUnderflow();
4272 PDATA_POP(self->stack, state);
4273 if (state == NULL)
4274 return -1;
4275 inst = self->stack->data[self->stack->length - 1];
4277 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4278 if (__setstate__ != NULL) {
4279 PyObject *junk = NULL;
4281 /* The explicit __setstate__ is responsible for everything. */
4282 ARG_TUP(self, state);
4283 if (self->arg) {
4284 junk = PyObject_Call(__setstate__, self->arg, NULL);
4285 FREE_ARG_TUP(self);
4287 Py_DECREF(__setstate__);
4288 if (junk == NULL)
4289 return -1;
4290 Py_DECREF(junk);
4291 return 0;
4293 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4294 return -1;
4295 PyErr_Clear();
4297 /* A default __setstate__. First see whether state embeds a
4298 * slot state dict too (a proto 2 addition).
4300 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4301 PyObject *temp = state;
4302 state = PyTuple_GET_ITEM(temp, 0);
4303 slotstate = PyTuple_GET_ITEM(temp, 1);
4304 Py_INCREF(state);
4305 Py_INCREF(slotstate);
4306 Py_DECREF(temp);
4308 else
4309 slotstate = NULL;
4311 /* Set inst.__dict__ from the state dict (if any). */
4312 if (state != Py_None) {
4313 PyObject *dict;
4314 if (! PyDict_Check(state)) {
4315 PyErr_SetString(UnpicklingError, "state is not a "
4316 "dictionary");
4317 goto finally;
4319 dict = PyObject_GetAttr(inst, __dict___str);
4320 if (dict == NULL)
4321 goto finally;
4323 i = 0;
4324 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4325 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4326 goto finally;
4328 Py_DECREF(dict);
4331 /* Also set instance attributes from the slotstate dict (if any). */
4332 if (slotstate != NULL) {
4333 if (! PyDict_Check(slotstate)) {
4334 PyErr_SetString(UnpicklingError, "slot state is not "
4335 "a dictionary");
4336 goto finally;
4338 i = 0;
4339 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4340 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4341 goto finally;
4344 res = 0;
4346 finally:
4347 Py_DECREF(state);
4348 Py_XDECREF(slotstate);
4349 return res;
4353 static int
4354 load_mark(Unpicklerobject *self)
4356 int s;
4358 /* Note that we split the (pickle.py) stack into two stacks, an
4359 object stack and a mark stack. Here we push a mark onto the
4360 mark stack.
4363 if ((self->num_marks + 1) >= self->marks_size) {
4364 s=self->marks_size+20;
4365 if (s <= self->num_marks) s=self->num_marks + 1;
4366 if (self->marks == NULL)
4367 self->marks=(int *)malloc(s * sizeof(int));
4368 else
4369 self->marks=(int *)realloc(self->marks,
4370 s * sizeof(int));
4371 if (! self->marks) {
4372 PyErr_NoMemory();
4373 return -1;
4375 self->marks_size = s;
4378 self->marks[self->num_marks++] = self->stack->length;
4380 return 0;
4383 static int
4384 load_reduce(Unpicklerobject *self)
4386 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
4388 PDATA_POP(self->stack, arg_tup);
4389 if (! arg_tup) return -1;
4390 PDATA_POP(self->stack, callable);
4391 if (callable) {
4392 ob = Instance_New(callable, arg_tup);
4393 Py_DECREF(callable);
4395 Py_DECREF(arg_tup);
4397 if (! ob) return -1;
4399 PDATA_PUSH(self->stack, ob, -1);
4400 return 0;
4403 /* Just raises an error if we don't know the protocol specified. PROTO
4404 * is the first opcode for protocols >= 2.
4406 static int
4407 load_proto(Unpicklerobject *self)
4409 int i;
4410 char *protobyte;
4412 i = self->read_func(self, &protobyte, 1);
4413 if (i < 0)
4414 return -1;
4416 i = calc_binint(protobyte, 1);
4417 /* No point checking for < 0, since calc_binint returns an unsigned
4418 * int when chewing on 1 byte.
4420 assert(i >= 0);
4421 if (i <= HIGHEST_PROTOCOL)
4422 return 0;
4424 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4425 return -1;
4428 static PyObject *
4429 load(Unpicklerobject *self)
4431 PyObject *err = 0, *val = 0;
4432 char *s;
4434 self->num_marks = 0;
4435 if (self->stack->length) Pdata_clear(self->stack, 0);
4437 while (1) {
4438 if (self->read_func(self, &s, 1) < 0)
4439 break;
4441 switch (s[0]) {
4442 case NONE:
4443 if (load_none(self) < 0)
4444 break;
4445 continue;
4447 case BININT:
4448 if (load_binint(self) < 0)
4449 break;
4450 continue;
4452 case BININT1:
4453 if (load_binint1(self) < 0)
4454 break;
4455 continue;
4457 case BININT2:
4458 if (load_binint2(self) < 0)
4459 break;
4460 continue;
4462 case INT:
4463 if (load_int(self) < 0)
4464 break;
4465 continue;
4467 case LONG:
4468 if (load_long(self) < 0)
4469 break;
4470 continue;
4472 case LONG1:
4473 if (load_counted_long(self, 1) < 0)
4474 break;
4475 continue;
4477 case LONG4:
4478 if (load_counted_long(self, 4) < 0)
4479 break;
4480 continue;
4482 case FLOAT:
4483 if (load_float(self) < 0)
4484 break;
4485 continue;
4487 case BINFLOAT:
4488 if (load_binfloat(self) < 0)
4489 break;
4490 continue;
4492 case BINSTRING:
4493 if (load_binstring(self) < 0)
4494 break;
4495 continue;
4497 case SHORT_BINSTRING:
4498 if (load_short_binstring(self) < 0)
4499 break;
4500 continue;
4502 case STRING:
4503 if (load_string(self) < 0)
4504 break;
4505 continue;
4507 #ifdef Py_USING_UNICODE
4508 case UNICODE:
4509 if (load_unicode(self) < 0)
4510 break;
4511 continue;
4513 case BINUNICODE:
4514 if (load_binunicode(self) < 0)
4515 break;
4516 continue;
4517 #endif
4519 case EMPTY_TUPLE:
4520 if (load_counted_tuple(self, 0) < 0)
4521 break;
4522 continue;
4524 case TUPLE1:
4525 if (load_counted_tuple(self, 1) < 0)
4526 break;
4527 continue;
4529 case TUPLE2:
4530 if (load_counted_tuple(self, 2) < 0)
4531 break;
4532 continue;
4534 case TUPLE3:
4535 if (load_counted_tuple(self, 3) < 0)
4536 break;
4537 continue;
4539 case TUPLE:
4540 if (load_tuple(self) < 0)
4541 break;
4542 continue;
4544 case EMPTY_LIST:
4545 if (load_empty_list(self) < 0)
4546 break;
4547 continue;
4549 case LIST:
4550 if (load_list(self) < 0)
4551 break;
4552 continue;
4554 case EMPTY_DICT:
4555 if (load_empty_dict(self) < 0)
4556 break;
4557 continue;
4559 case DICT:
4560 if (load_dict(self) < 0)
4561 break;
4562 continue;
4564 case OBJ:
4565 if (load_obj(self) < 0)
4566 break;
4567 continue;
4569 case INST:
4570 if (load_inst(self) < 0)
4571 break;
4572 continue;
4574 case NEWOBJ:
4575 if (load_newobj(self) < 0)
4576 break;
4577 continue;
4579 case GLOBAL:
4580 if (load_global(self) < 0)
4581 break;
4582 continue;
4584 case APPEND:
4585 if (load_append(self) < 0)
4586 break;
4587 continue;
4589 case APPENDS:
4590 if (load_appends(self) < 0)
4591 break;
4592 continue;
4594 case BUILD:
4595 if (load_build(self) < 0)
4596 break;
4597 continue;
4599 case DUP:
4600 if (load_dup(self) < 0)
4601 break;
4602 continue;
4604 case BINGET:
4605 if (load_binget(self) < 0)
4606 break;
4607 continue;
4609 case LONG_BINGET:
4610 if (load_long_binget(self) < 0)
4611 break;
4612 continue;
4614 case GET:
4615 if (load_get(self) < 0)
4616 break;
4617 continue;
4619 case EXT1:
4620 if (load_extension(self, 1) < 0)
4621 break;
4622 continue;
4624 case EXT2:
4625 if (load_extension(self, 2) < 0)
4626 break;
4627 continue;
4629 case EXT4:
4630 if (load_extension(self, 4) < 0)
4631 break;
4632 continue;
4633 case MARK:
4634 if (load_mark(self) < 0)
4635 break;
4636 continue;
4638 case BINPUT:
4639 if (load_binput(self) < 0)
4640 break;
4641 continue;
4643 case LONG_BINPUT:
4644 if (load_long_binput(self) < 0)
4645 break;
4646 continue;
4648 case PUT:
4649 if (load_put(self) < 0)
4650 break;
4651 continue;
4653 case POP:
4654 if (load_pop(self) < 0)
4655 break;
4656 continue;
4658 case POP_MARK:
4659 if (load_pop_mark(self) < 0)
4660 break;
4661 continue;
4663 case SETITEM:
4664 if (load_setitem(self) < 0)
4665 break;
4666 continue;
4668 case SETITEMS:
4669 if (load_setitems(self) < 0)
4670 break;
4671 continue;
4673 case STOP:
4674 break;
4676 case PERSID:
4677 if (load_persid(self) < 0)
4678 break;
4679 continue;
4681 case BINPERSID:
4682 if (load_binpersid(self) < 0)
4683 break;
4684 continue;
4686 case REDUCE:
4687 if (load_reduce(self) < 0)
4688 break;
4689 continue;
4691 case PROTO:
4692 if (load_proto(self) < 0)
4693 break;
4694 continue;
4696 case NEWTRUE:
4697 if (load_bool(self, Py_True) < 0)
4698 break;
4699 continue;
4701 case NEWFALSE:
4702 if (load_bool(self, Py_False) < 0)
4703 break;
4704 continue;
4706 case '\0':
4707 /* end of file */
4708 PyErr_SetNone(PyExc_EOFError);
4709 break;
4711 default:
4712 cPickle_ErrFormat(UnpicklingError,
4713 "invalid load key, '%s'.",
4714 "c", s[0]);
4715 return NULL;
4718 break;
4721 if ((err = PyErr_Occurred())) {
4722 if (err == PyExc_EOFError) {
4723 PyErr_SetNone(PyExc_EOFError);
4725 return NULL;
4728 PDATA_POP(self->stack, val);
4729 return val;
4733 /* No-load functions to support noload, which is used to
4734 find persistent references. */
4736 static int
4737 noload_obj(Unpicklerobject *self)
4739 int i;
4741 if ((i = marker(self)) < 0) return -1;
4742 return Pdata_clear(self->stack, i+1);
4746 static int
4747 noload_inst(Unpicklerobject *self)
4749 int i;
4750 char *s;
4752 if ((i = marker(self)) < 0) return -1;
4753 Pdata_clear(self->stack, i);
4754 if (self->readline_func(self, &s) < 0) return -1;
4755 if (self->readline_func(self, &s) < 0) return -1;
4756 PDATA_APPEND(self->stack, Py_None, -1);
4757 return 0;
4760 static int
4761 noload_newobj(Unpicklerobject *self)
4763 PyObject *obj;
4765 PDATA_POP(self->stack, obj); /* pop argtuple */
4766 if (obj == NULL) return -1;
4767 Py_DECREF(obj);
4769 PDATA_POP(self->stack, obj); /* pop cls */
4770 if (obj == NULL) return -1;
4771 Py_DECREF(obj);
4773 PDATA_APPEND(self->stack, Py_None, -1);
4774 return 0;
4777 static int
4778 noload_global(Unpicklerobject *self)
4780 char *s;
4782 if (self->readline_func(self, &s) < 0) return -1;
4783 if (self->readline_func(self, &s) < 0) return -1;
4784 PDATA_APPEND(self->stack, Py_None,-1);
4785 return 0;
4788 static int
4789 noload_reduce(Unpicklerobject *self)
4792 if (self->stack->length < 2) return stackUnderflow();
4793 Pdata_clear(self->stack, self->stack->length-2);
4794 PDATA_APPEND(self->stack, Py_None,-1);
4795 return 0;
4798 static int
4799 noload_build(Unpicklerobject *self) {
4801 if (self->stack->length < 1) return stackUnderflow();
4802 Pdata_clear(self->stack, self->stack->length-1);
4803 return 0;
4806 static int
4807 noload_extension(Unpicklerobject *self, int nbytes)
4809 char *codebytes;
4811 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4812 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4813 PDATA_APPEND(self->stack, Py_None, -1);
4814 return 0;
4818 static PyObject *
4819 noload(Unpicklerobject *self)
4821 PyObject *err = 0, *val = 0;
4822 char *s;
4824 self->num_marks = 0;
4825 Pdata_clear(self->stack, 0);
4827 while (1) {
4828 if (self->read_func(self, &s, 1) < 0)
4829 break;
4831 switch (s[0]) {
4832 case NONE:
4833 if (load_none(self) < 0)
4834 break;
4835 continue;
4837 case BININT:
4838 if (load_binint(self) < 0)
4839 break;
4840 continue;
4842 case BININT1:
4843 if (load_binint1(self) < 0)
4844 break;
4845 continue;
4847 case BININT2:
4848 if (load_binint2(self) < 0)
4849 break;
4850 continue;
4852 case INT:
4853 if (load_int(self) < 0)
4854 break;
4855 continue;
4857 case LONG:
4858 if (load_long(self) < 0)
4859 break;
4860 continue;
4862 case LONG1:
4863 if (load_counted_long(self, 1) < 0)
4864 break;
4865 continue;
4867 case LONG4:
4868 if (load_counted_long(self, 4) < 0)
4869 break;
4870 continue;
4872 case FLOAT:
4873 if (load_float(self) < 0)
4874 break;
4875 continue;
4877 case BINFLOAT:
4878 if (load_binfloat(self) < 0)
4879 break;
4880 continue;
4882 case BINSTRING:
4883 if (load_binstring(self) < 0)
4884 break;
4885 continue;
4887 case SHORT_BINSTRING:
4888 if (load_short_binstring(self) < 0)
4889 break;
4890 continue;
4892 case STRING:
4893 if (load_string(self) < 0)
4894 break;
4895 continue;
4897 #ifdef Py_USING_UNICODE
4898 case UNICODE:
4899 if (load_unicode(self) < 0)
4900 break;
4901 continue;
4903 case BINUNICODE:
4904 if (load_binunicode(self) < 0)
4905 break;
4906 continue;
4907 #endif
4909 case EMPTY_TUPLE:
4910 if (load_counted_tuple(self, 0) < 0)
4911 break;
4912 continue;
4914 case TUPLE1:
4915 if (load_counted_tuple(self, 1) < 0)
4916 break;
4917 continue;
4919 case TUPLE2:
4920 if (load_counted_tuple(self, 2) < 0)
4921 break;
4922 continue;
4924 case TUPLE3:
4925 if (load_counted_tuple(self, 3) < 0)
4926 break;
4927 continue;
4929 case TUPLE:
4930 if (load_tuple(self) < 0)
4931 break;
4932 continue;
4934 case EMPTY_LIST:
4935 if (load_empty_list(self) < 0)
4936 break;
4937 continue;
4939 case LIST:
4940 if (load_list(self) < 0)
4941 break;
4942 continue;
4944 case EMPTY_DICT:
4945 if (load_empty_dict(self) < 0)
4946 break;
4947 continue;
4949 case DICT:
4950 if (load_dict(self) < 0)
4951 break;
4952 continue;
4954 case OBJ:
4955 if (noload_obj(self) < 0)
4956 break;
4957 continue;
4959 case INST:
4960 if (noload_inst(self) < 0)
4961 break;
4962 continue;
4964 case NEWOBJ:
4965 if (noload_newobj(self) < 0)
4966 break;
4967 continue;
4969 case GLOBAL:
4970 if (noload_global(self) < 0)
4971 break;
4972 continue;
4974 case APPEND:
4975 if (load_append(self) < 0)
4976 break;
4977 continue;
4979 case APPENDS:
4980 if (load_appends(self) < 0)
4981 break;
4982 continue;
4984 case BUILD:
4985 if (noload_build(self) < 0)
4986 break;
4987 continue;
4989 case DUP:
4990 if (load_dup(self) < 0)
4991 break;
4992 continue;
4994 case BINGET:
4995 if (load_binget(self) < 0)
4996 break;
4997 continue;
4999 case LONG_BINGET:
5000 if (load_long_binget(self) < 0)
5001 break;
5002 continue;
5004 case GET:
5005 if (load_get(self) < 0)
5006 break;
5007 continue;
5009 case EXT1:
5010 if (noload_extension(self, 1) < 0)
5011 break;
5012 continue;
5014 case EXT2:
5015 if (noload_extension(self, 2) < 0)
5016 break;
5017 continue;
5019 case EXT4:
5020 if (noload_extension(self, 4) < 0)
5021 break;
5022 continue;
5024 case MARK:
5025 if (load_mark(self) < 0)
5026 break;
5027 continue;
5029 case BINPUT:
5030 if (load_binput(self) < 0)
5031 break;
5032 continue;
5034 case LONG_BINPUT:
5035 if (load_long_binput(self) < 0)
5036 break;
5037 continue;
5039 case PUT:
5040 if (load_put(self) < 0)
5041 break;
5042 continue;
5044 case POP:
5045 if (load_pop(self) < 0)
5046 break;
5047 continue;
5049 case POP_MARK:
5050 if (load_pop_mark(self) < 0)
5051 break;
5052 continue;
5054 case SETITEM:
5055 if (load_setitem(self) < 0)
5056 break;
5057 continue;
5059 case SETITEMS:
5060 if (load_setitems(self) < 0)
5061 break;
5062 continue;
5064 case STOP:
5065 break;
5067 case PERSID:
5068 if (load_persid(self) < 0)
5069 break;
5070 continue;
5072 case BINPERSID:
5073 if (load_binpersid(self) < 0)
5074 break;
5075 continue;
5077 case REDUCE:
5078 if (noload_reduce(self) < 0)
5079 break;
5080 continue;
5082 case PROTO:
5083 if (load_proto(self) < 0)
5084 break;
5085 continue;
5087 case NEWTRUE:
5088 if (load_bool(self, Py_True) < 0)
5089 break;
5090 continue;
5092 case NEWFALSE:
5093 if (load_bool(self, Py_False) < 0)
5094 break;
5095 continue;
5096 default:
5097 cPickle_ErrFormat(UnpicklingError,
5098 "invalid load key, '%s'.",
5099 "c", s[0]);
5100 return NULL;
5103 break;
5106 if ((err = PyErr_Occurred())) {
5107 if (err == PyExc_EOFError) {
5108 PyErr_SetNone(PyExc_EOFError);
5110 return NULL;
5113 PDATA_POP(self->stack, val);
5114 return val;
5118 static PyObject *
5119 Unpickler_load(Unpicklerobject *self, PyObject *unused)
5121 return load(self);
5124 static PyObject *
5125 Unpickler_noload(Unpicklerobject *self, PyObject *unused)
5127 return noload(self);
5131 static struct PyMethodDef Unpickler_methods[] = {
5132 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
5133 PyDoc_STR("load() -- Load a pickle")
5135 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
5136 PyDoc_STR(
5137 "noload() -- not load a pickle, but go through most of the motions\n"
5138 "\n"
5139 "This function can be used to read past a pickle without instantiating\n"
5140 "any objects or importing any modules. It can also be used to find all\n"
5141 "persistent references without instantiating any objects or importing\n"
5142 "any modules.\n")
5144 {NULL, NULL} /* sentinel */
5148 static Unpicklerobject *
5149 newUnpicklerobject(PyObject *f)
5151 Unpicklerobject *self;
5153 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
5154 return NULL;
5156 self->file = NULL;
5157 self->arg = NULL;
5158 self->stack = (Pdata*)Pdata_New();
5159 self->pers_func = NULL;
5160 self->last_string = NULL;
5161 self->marks = NULL;
5162 self->num_marks = 0;
5163 self->marks_size = 0;
5164 self->buf_size = 0;
5165 self->read = NULL;
5166 self->readline = NULL;
5167 self->find_class = NULL;
5169 if (!( self->memo = PyDict_New()))
5170 goto err;
5172 if (!self->stack)
5173 goto err;
5175 Py_INCREF(f);
5176 self->file = f;
5178 /* Set read, readline based on type of f */
5179 if (PyFile_Check(f)) {
5180 self->fp = PyFile_AsFile(f);
5181 if (self->fp == NULL) {
5182 PyErr_SetString(PyExc_ValueError,
5183 "I/O operation on closed file");
5184 goto err;
5186 self->read_func = read_file;
5187 self->readline_func = readline_file;
5189 else if (PycStringIO_InputCheck(f)) {
5190 self->fp = NULL;
5191 self->read_func = read_cStringIO;
5192 self->readline_func = readline_cStringIO;
5194 else {
5196 self->fp = NULL;
5197 self->read_func = read_other;
5198 self->readline_func = readline_other;
5200 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5201 (self->read = PyObject_GetAttr(f, read_str)))) {
5202 PyErr_Clear();
5203 PyErr_SetString( PyExc_TypeError,
5204 "argument must have 'read' and "
5205 "'readline' attributes" );
5206 goto err;
5209 PyObject_GC_Track(self);
5211 return self;
5213 err:
5214 Py_DECREF((PyObject *)self);
5215 return NULL;
5219 static PyObject *
5220 get_Unpickler(PyObject *self, PyObject *file)
5222 return (PyObject *)newUnpicklerobject(file);
5226 static void
5227 Unpickler_dealloc(Unpicklerobject *self)
5229 PyObject_GC_UnTrack((PyObject *)self);
5230 Py_XDECREF(self->readline);
5231 Py_XDECREF(self->read);
5232 Py_XDECREF(self->file);
5233 Py_XDECREF(self->memo);
5234 Py_XDECREF(self->stack);
5235 Py_XDECREF(self->pers_func);
5236 Py_XDECREF(self->arg);
5237 Py_XDECREF(self->last_string);
5238 Py_XDECREF(self->find_class);
5240 if (self->marks) {
5241 free(self->marks);
5244 if (self->buf_size) {
5245 free(self->buf);
5248 self->ob_type->tp_free((PyObject *)self);
5251 static int
5252 Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5254 Py_VISIT(self->readline);
5255 Py_VISIT(self->read);
5256 Py_VISIT(self->file);
5257 Py_VISIT(self->memo);
5258 Py_VISIT(self->stack);
5259 Py_VISIT(self->pers_func);
5260 Py_VISIT(self->arg);
5261 Py_VISIT(self->last_string);
5262 Py_VISIT(self->find_class);
5263 return 0;
5266 static int
5267 Unpickler_clear(Unpicklerobject *self)
5269 Py_CLEAR(self->readline);
5270 Py_CLEAR(self->read);
5271 Py_CLEAR(self->file);
5272 Py_CLEAR(self->memo);
5273 Py_CLEAR(self->stack);
5274 Py_CLEAR(self->pers_func);
5275 Py_CLEAR(self->arg);
5276 Py_CLEAR(self->last_string);
5277 Py_CLEAR(self->find_class);
5278 return 0;
5281 static PyObject *
5282 Unpickler_getattr(Unpicklerobject *self, char *name)
5284 if (!strcmp(name, "persistent_load")) {
5285 if (!self->pers_func) {
5286 PyErr_SetString(PyExc_AttributeError, name);
5287 return NULL;
5290 Py_INCREF(self->pers_func);
5291 return self->pers_func;
5294 if (!strcmp(name, "find_global")) {
5295 if (!self->find_class) {
5296 PyErr_SetString(PyExc_AttributeError, name);
5297 return NULL;
5300 Py_INCREF(self->find_class);
5301 return self->find_class;
5304 if (!strcmp(name, "memo")) {
5305 if (!self->memo) {
5306 PyErr_SetString(PyExc_AttributeError, name);
5307 return NULL;
5310 Py_INCREF(self->memo);
5311 return self->memo;
5314 if (!strcmp(name, "UnpicklingError")) {
5315 Py_INCREF(UnpicklingError);
5316 return UnpicklingError;
5319 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
5323 static int
5324 Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
5327 if (!strcmp(name, "persistent_load")) {
5328 Py_XDECREF(self->pers_func);
5329 self->pers_func = value;
5330 Py_XINCREF(value);
5331 return 0;
5334 if (!strcmp(name, "find_global")) {
5335 Py_XDECREF(self->find_class);
5336 self->find_class = value;
5337 Py_XINCREF(value);
5338 return 0;
5341 if (! value) {
5342 PyErr_SetString(PyExc_TypeError,
5343 "attribute deletion is not supported");
5344 return -1;
5347 if (strcmp(name, "memo") == 0) {
5348 if (!PyDict_Check(value)) {
5349 PyErr_SetString(PyExc_TypeError,
5350 "memo must be a dictionary");
5351 return -1;
5353 Py_XDECREF(self->memo);
5354 self->memo = value;
5355 Py_INCREF(value);
5356 return 0;
5359 PyErr_SetString(PyExc_AttributeError, name);
5360 return -1;
5363 /* ---------------------------------------------------------------------------
5364 * Module-level functions.
5367 /* dump(obj, file, protocol=0). */
5368 static PyObject *
5369 cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
5371 static char *kwlist[] = {"obj", "file", "protocol", NULL};
5372 PyObject *ob, *file, *res = NULL;
5373 Picklerobject *pickler = 0;
5374 int proto = 0;
5376 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5377 &ob, &file, &proto)))
5378 goto finally;
5380 if (!( pickler = newPicklerobject(file, proto)))
5381 goto finally;
5383 if (dump(pickler, ob) < 0)
5384 goto finally;
5386 Py_INCREF(Py_None);
5387 res = Py_None;
5389 finally:
5390 Py_XDECREF(pickler);
5392 return res;
5396 /* dumps(obj, protocol=0). */
5397 static PyObject *
5398 cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
5400 static char *kwlist[] = {"obj", "protocol", NULL};
5401 PyObject *ob, *file = 0, *res = NULL;
5402 Picklerobject *pickler = 0;
5403 int proto = 0;
5405 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5406 &ob, &proto)))
5407 goto finally;
5409 if (!( file = PycStringIO->NewOutput(128)))
5410 goto finally;
5412 if (!( pickler = newPicklerobject(file, proto)))
5413 goto finally;
5415 if (dump(pickler, ob) < 0)
5416 goto finally;
5418 res = PycStringIO->cgetvalue(file);
5420 finally:
5421 Py_XDECREF(pickler);
5422 Py_XDECREF(file);
5424 return res;
5428 /* load(fileobj). */
5429 static PyObject *
5430 cpm_load(PyObject *self, PyObject *ob)
5432 Unpicklerobject *unpickler = 0;
5433 PyObject *res = NULL;
5435 if (!( unpickler = newUnpicklerobject(ob)))
5436 goto finally;
5438 res = load(unpickler);
5440 finally:
5441 Py_XDECREF(unpickler);
5443 return res;
5447 /* loads(string) */
5448 static PyObject *
5449 cpm_loads(PyObject *self, PyObject *args)
5451 PyObject *ob, *file = 0, *res = NULL;
5452 Unpicklerobject *unpickler = 0;
5454 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
5455 goto finally;
5457 if (!( file = PycStringIO->NewInput(ob)))
5458 goto finally;
5460 if (!( unpickler = newUnpicklerobject(file)))
5461 goto finally;
5463 res = load(unpickler);
5465 finally:
5466 Py_XDECREF(file);
5467 Py_XDECREF(unpickler);
5469 return res;
5473 PyDoc_STRVAR(Unpicklertype__doc__,
5474 "Objects that know how to unpickle");
5476 static PyTypeObject Unpicklertype = {
5477 PyObject_HEAD_INIT(NULL)
5478 0, /*ob_size*/
5479 "cPickle.Unpickler", /*tp_name*/
5480 sizeof(Unpicklerobject), /*tp_basicsize*/
5482 (destructor)Unpickler_dealloc, /* tp_dealloc */
5483 0, /* tp_print */
5484 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5485 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5486 0, /* tp_compare */
5487 0, /* tp_repr */
5488 0, /* tp_as_number */
5489 0, /* tp_as_sequence */
5490 0, /* tp_as_mapping */
5491 0, /* tp_hash */
5492 0, /* tp_call */
5493 0, /* tp_str */
5494 0, /* tp_getattro */
5495 0, /* tp_setattro */
5496 0, /* tp_as_buffer */
5497 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5498 Unpicklertype__doc__, /* tp_doc */
5499 (traverseproc)Unpickler_traverse, /* tp_traverse */
5500 (inquiry)Unpickler_clear, /* tp_clear */
5503 static struct PyMethodDef cPickle_methods[] = {
5504 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5505 PyDoc_STR("dump(obj, file, protocol=0) -- "
5506 "Write an object in pickle format to the given file.\n"
5507 "\n"
5508 "See the Pickler docstring for the meaning of optional argument proto.")
5511 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5512 PyDoc_STR("dumps(obj, protocol=0) -- "
5513 "Return a string containing an object in pickle format.\n"
5514 "\n"
5515 "See the Pickler docstring for the meaning of optional argument proto.")
5518 {"load", (PyCFunction)cpm_load, METH_O,
5519 PyDoc_STR("load(file) -- Load a pickle from the given file")},
5521 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
5522 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
5524 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5525 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
5526 "\n"
5527 "This takes a file-like object for writing a pickle data stream.\n"
5528 "The optional proto argument tells the pickler to use the given\n"
5529 "protocol; supported protocols are 0, 1, 2. The default\n"
5530 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5531 "only protocol that can be written to a file opened in text\n"
5532 "mode and read back successfully. When using a protocol higher\n"
5533 "than 0, make sure the file is opened in binary mode, both when\n"
5534 "pickling and unpickling.)\n"
5535 "\n"
5536 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5537 "more efficient than protocol 1.\n"
5538 "\n"
5539 "Specifying a negative protocol version selects the highest\n"
5540 "protocol version supported. The higher the protocol used, the\n"
5541 "more recent the version of Python needed to read the pickle\n"
5542 "produced.\n"
5543 "\n"
5544 "The file parameter must have a write() method that accepts a single\n"
5545 "string argument. It can thus be an open file object, a StringIO\n"
5546 "object, or any other custom object that meets this interface.\n")
5549 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
5550 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5552 { NULL, NULL }
5555 static int
5556 init_stuff(PyObject *module_dict)
5558 PyObject *copy_reg, *t, *r;
5560 #define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
5562 if (PyType_Ready(&Unpicklertype) < 0)
5563 return -1;
5564 if (PyType_Ready(&Picklertype) < 0)
5565 return -1;
5567 INIT_STR(__class__);
5568 INIT_STR(__getinitargs__);
5569 INIT_STR(__dict__);
5570 INIT_STR(__getstate__);
5571 INIT_STR(__setstate__);
5572 INIT_STR(__name__);
5573 INIT_STR(__main__);
5574 INIT_STR(__reduce__);
5575 INIT_STR(__reduce_ex__);
5576 INIT_STR(write);
5577 INIT_STR(append);
5578 INIT_STR(read);
5579 INIT_STR(readline);
5580 INIT_STR(copy_reg);
5581 INIT_STR(dispatch_table);
5583 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
5584 return -1;
5586 /* This is special because we want to use a different
5587 one in restricted mode. */
5588 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
5589 if (!dispatch_table) return -1;
5591 extension_registry = PyObject_GetAttrString(copy_reg,
5592 "_extension_registry");
5593 if (!extension_registry) return -1;
5595 inverted_registry = PyObject_GetAttrString(copy_reg,
5596 "_inverted_registry");
5597 if (!inverted_registry) return -1;
5599 extension_cache = PyObject_GetAttrString(copy_reg,
5600 "_extension_cache");
5601 if (!extension_cache) return -1;
5603 Py_DECREF(copy_reg);
5605 if (!(empty_tuple = PyTuple_New(0)))
5606 return -1;
5608 two_tuple = PyTuple_New(2);
5609 if (two_tuple == NULL)
5610 return -1;
5611 /* We use this temp container with no regard to refcounts, or to
5612 * keeping containees alive. Exempt from GC, because we don't
5613 * want anything looking at two_tuple() by magic.
5615 PyObject_GC_UnTrack(two_tuple);
5617 /* Ugh */
5618 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5619 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5620 return -1;
5622 if (!( t=PyDict_New())) return -1;
5623 if (!( r=PyRun_String(
5624 "def __str__(self):\n"
5625 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5626 Py_file_input,
5627 module_dict, t) )) return -1;
5628 Py_DECREF(r);
5630 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
5631 if (!PickleError)
5632 return -1;
5634 Py_DECREF(t);
5636 PicklingError = PyErr_NewException("cPickle.PicklingError",
5637 PickleError, NULL);
5638 if (!PicklingError)
5639 return -1;
5641 if (!( t=PyDict_New())) return -1;
5642 if (!( r=PyRun_String(
5643 "def __str__(self):\n"
5644 " a=self.args\n"
5645 " a=a and type(a[0]) or '(what)'\n"
5646 " return 'Cannot pickle %s objects' % a\n"
5647 , Py_file_input,
5648 module_dict, t) )) return -1;
5649 Py_DECREF(r);
5651 if (!( UnpickleableError = PyErr_NewException(
5652 "cPickle.UnpickleableError", PicklingError, t)))
5653 return -1;
5655 Py_DECREF(t);
5657 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
5658 PickleError, NULL)))
5659 return -1;
5661 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5662 UnpicklingError, NULL)))
5663 return -1;
5665 if (PyDict_SetItemString(module_dict, "PickleError",
5666 PickleError) < 0)
5667 return -1;
5669 if (PyDict_SetItemString(module_dict, "PicklingError",
5670 PicklingError) < 0)
5671 return -1;
5673 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5674 UnpicklingError) < 0)
5675 return -1;
5677 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5678 UnpickleableError) < 0)
5679 return -1;
5681 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5682 BadPickleGet) < 0)
5683 return -1;
5685 PycString_IMPORT;
5687 return 0;
5690 #ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5691 #define PyMODINIT_FUNC void
5692 #endif
5693 PyMODINIT_FUNC
5694 initcPickle(void)
5696 PyObject *m, *d, *di, *v, *k;
5697 Py_ssize_t i;
5698 char *rev = "1.71"; /* XXX when does this change? */
5699 PyObject *format_version;
5700 PyObject *compatible_formats;
5702 Picklertype.ob_type = &PyType_Type;
5703 Unpicklertype.ob_type = &PyType_Type;
5704 PdataType.ob_type = &PyType_Type;
5706 /* Initialize some pieces. We need to do this before module creation,
5707 * so we're forced to use a temporary dictionary. :(
5709 di = PyDict_New();
5710 if (!di) return;
5711 if (init_stuff(di) < 0) return;
5713 /* Create the module and add the functions */
5714 m = Py_InitModule4("cPickle", cPickle_methods,
5715 cPickle_module_documentation,
5716 (PyObject*)NULL,PYTHON_API_VERSION);
5717 if (m == NULL)
5718 return;
5720 /* Add some symbolic constants to the module */
5721 d = PyModule_GetDict(m);
5722 v = PyString_FromString(rev);
5723 PyDict_SetItemString(d, "__version__", v);
5724 Py_XDECREF(v);
5726 /* Copy data from di. Waaa. */
5727 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5728 if (PyObject_SetItem(d, k, v) < 0) {
5729 Py_DECREF(di);
5730 return;
5733 Py_DECREF(di);
5735 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5736 if (i < 0)
5737 return;
5739 /* These are purely informational; no code uses them. */
5740 /* File format version we write. */
5741 format_version = PyString_FromString("2.0");
5742 /* Format versions we can read. */
5743 compatible_formats = Py_BuildValue("[sssss]",
5744 "1.0", /* Original protocol 0 */
5745 "1.1", /* Protocol 0 + INST */
5746 "1.2", /* Original protocol 1 */
5747 "1.3", /* Protocol 1 + BINFLOAT */
5748 "2.0"); /* Original protocol 2 */
5749 PyDict_SetItemString(d, "format_version", format_version);
5750 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5751 Py_XDECREF(format_version);
5752 Py_XDECREF(compatible_formats);