source: python/trunk/Modules/cPickle.c@ 1253

Last change on this file since 1253 was 391, checked in by dmik, 11 years ago

python: Merge vendor 2.7.6 to trunk.

  • Property svn:eol-style set to native
File size: 150.3 KB
Line 
1#include "Python.h"
2#include "cStringIO.h"
3#include "structmember.h"
4
5PyDoc_STRVAR(cPickle_module_documentation,
6"C implementation and optimization of the Python pickle module.");
7
8#ifndef Py_eval_input
9#include <graminit.h>
10#define Py_eval_input eval_input
11#endif /* Py_eval_input */
12
13#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
14
15#define WRITE_BUF_SIZE 256
16
17/* Bump this when new opcodes are added to the pickle protocol. */
18#define HIGHEST_PROTOCOL 2
19
20/*
21 * Note: The UNICODE macro controls the TCHAR meaning of the win32 API. Since
22 * all headers have already been included here, we can safely redefine it.
23 */
24#ifdef UNICODE
25# undef UNICODE
26#endif
27
28/*
29 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
30 * docs are in pickletools.py.
31 */
32#define MARK '('
33#define STOP '.'
34#define POP '0'
35#define POP_MARK '1'
36#define DUP '2'
37#define FLOAT 'F'
38#define BINFLOAT 'G'
39#define INT 'I'
40#define BININT 'J'
41#define BININT1 'K'
42#define LONG 'L'
43#define BININT2 'M'
44#define NONE 'N'
45#define PERSID 'P'
46#define BINPERSID 'Q'
47#define REDUCE 'R'
48#define STRING 'S'
49#define BINSTRING 'T'
50#define SHORT_BINSTRING 'U'
51#define UNICODE 'V'
52#define BINUNICODE 'X'
53#define APPEND 'a'
54#define BUILD 'b'
55#define GLOBAL 'c'
56#define DICT 'd'
57#define EMPTY_DICT '}'
58#define APPENDS 'e'
59#define GET 'g'
60#define BINGET 'h'
61#define INST 'i'
62#define LONG_BINGET 'j'
63#define LIST 'l'
64#define EMPTY_LIST ']'
65#define OBJ 'o'
66#define PUT 'p'
67#define BINPUT 'q'
68#define LONG_BINPUT 'r'
69#define SETITEM 's'
70#define TUPLE 't'
71#define EMPTY_TUPLE ')'
72#define SETITEMS 'u'
73
74/* Protocol 2. */
75#define PROTO '\x80' /* identify pickle protocol */
76#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
77#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
78#define EXT2 '\x83' /* ditto, but 2-byte index */
79#define EXT4 '\x84' /* ditto, but 4-byte index */
80#define TUPLE1 '\x85' /* build 1-tuple from stack top */
81#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
82#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
83#define NEWTRUE '\x88' /* push True */
84#define NEWFALSE '\x89' /* push False */
85#define LONG1 '\x8a' /* push long from < 256 bytes */
86#define LONG4 '\x8b' /* push really big long */
87
88/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
89 * so that unpicklers written before bools were introduced unpickle them
90 * as ints, but unpicklers after can recognize that bools were intended.
91 * Note that protocol 2 added direct ways to pickle bools.
92 */
93#undef TRUE
94#define TRUE "I01\n"
95#undef FALSE
96#define FALSE "I00\n"
97
98/* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
99 * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
100 * break if this gets out of synch with pickle.py, but it's unclear that
101 * would help anything either.
102 */
103#define BATCHSIZE 1000
104
105static char MARKv = MARK;
106
107static PyObject *PickleError;
108static PyObject *PicklingError;
109static PyObject *UnpickleableError;
110static PyObject *UnpicklingError;
111static PyObject *BadPickleGet;
112
113/* As the name says, an empty tuple. */
114static PyObject *empty_tuple;
115
116/* copy_reg.dispatch_table, {type_object: pickling_function} */
117static PyObject *dispatch_table;
118
119/* For EXT[124] opcodes. */
120/* copy_reg._extension_registry, {(module_name, function_name): code} */
121static PyObject *extension_registry;
122/* copy_reg._inverted_registry, {code: (module_name, function_name)} */
123static PyObject *inverted_registry;
124/* copy_reg._extension_cache, {code: object} */
125static PyObject *extension_cache;
126
127/* For looking up name pairs in copy_reg._extension_registry. */
128static PyObject *two_tuple;
129
130static PyObject *__class___str, *__getinitargs___str, *__dict___str,
131 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
132 *__reduce_ex___str,
133 *write_str, *append_str,
134 *read_str, *readline_str, *__main___str,
135 *dispatch_table_str;
136
137/*************************************************************************
138 Internal Data type for pickle data. */
139
140typedef struct {
141 PyObject_HEAD
142 Py_ssize_t length; /* number of initial slots in data currently used */
143 Py_ssize_t size; /* number of slots in data allocated */
144 PyObject **data;
145} Pdata;
146
147static void
148Pdata_dealloc(Pdata *self)
149{
150 Py_ssize_t i;
151 PyObject **p;
152
153 for (i = self->length, p = self->data; --i >= 0; p++) {
154 Py_DECREF(*p);
155 }
156 if (self->data)
157 free(self->data);
158 PyObject_Del(self);
159}
160
161static PyTypeObject PdataType = {
162 PyVarObject_HEAD_INIT(NULL, 0) "cPickle.Pdata", sizeof(Pdata), 0,
163 (destructor)Pdata_dealloc,
164 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
165};
166
167#define Pdata_Check(O) (Py_TYPE(O) == &PdataType)
168
169static PyObject *
170Pdata_New(void)
171{
172 Pdata *self;
173
174 if (!(self = PyObject_New(Pdata, &PdataType)))
175 return NULL;
176 self->size = 8;
177 self->length = 0;
178 self->data = malloc(self->size * sizeof(PyObject*));
179 if (self->data)
180 return (PyObject*)self;
181 Py_DECREF(self);
182 return PyErr_NoMemory();
183}
184
185static int
186stackUnderflow(void)
187{
188 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
189 return -1;
190}
191
192/* Retain only the initial clearto items. If clearto >= the current
193 * number of items, this is a (non-erroneous) NOP.
194 */
195static int
196Pdata_clear(Pdata *self, Py_ssize_t clearto)
197{
198 Py_ssize_t i;
199 PyObject **p;
200
201 if (clearto < 0) return stackUnderflow();
202 if (clearto >= self->length) return 0;
203
204 for (i = self->length, p = self->data + clearto;
205 --i >= clearto;
206 p++) {
207 Py_CLEAR(*p);
208 }
209 self->length = clearto;
210
211 return 0;
212}
213
214static int
215Pdata_grow(Pdata *self)
216{
217 Py_ssize_t bigger;
218 Py_ssize_t nbytes;
219
220 PyObject **tmp;
221
222 if (self->size > (PY_SSIZE_T_MAX >> 1))
223 goto nomemory;
224 bigger = self->size << 1;
225 if (bigger > (PY_SSIZE_T_MAX / sizeof(PyObject *)))
226 goto nomemory;
227 nbytes = bigger * sizeof(PyObject *);
228 tmp = realloc(self->data, nbytes);
229 if (tmp == NULL)
230 goto nomemory;
231 self->data = tmp;
232 self->size = bigger;
233 return 0;
234
235 nomemory:
236 PyErr_NoMemory();
237 return -1;
238}
239
240/* D is a Pdata*. Pop the topmost element and store it into V, which
241 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
242 * is raised and V is set to NULL. D and V may be evaluated several times.
243 */
244#define PDATA_POP(D, V) { \
245 if ((D)->length) \
246 (V) = (D)->data[--((D)->length)]; \
247 else { \
248 PyErr_SetString(UnpicklingError, "bad pickle data"); \
249 (V) = NULL; \
250 } \
251}
252
253/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
254 * D. If the Pdata stack can't be grown to hold the new value, both
255 * raise MemoryError and execute "return ER". The difference is in ownership
256 * of O after: _PUSH transfers ownership of O from the caller to the stack
257 * (no incref of O is done, and in case of error O is decrefed), while
258 * _APPEND pushes a new reference.
259 */
260
261/* Push O on stack D, giving ownership of O to the stack. */
262#define PDATA_PUSH(D, O, ER) { \
263 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
264 Pdata_grow((Pdata*)(D)) < 0) { \
265 Py_DECREF(O); \
266 return ER; \
267 } \
268 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
269}
270
271/* Push O on stack D, pushing a new reference. */
272#define PDATA_APPEND(D, O, ER) { \
273 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
274 Pdata_grow((Pdata*)(D)) < 0) \
275 return ER; \
276 Py_INCREF(O); \
277 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
278}
279
280
281static PyObject *
282Pdata_popTuple(Pdata *self, Py_ssize_t start)
283{
284 PyObject *r;
285 Py_ssize_t i, j, l;
286
287 l = self->length-start;
288 r = PyTuple_New(l);
289 if (r == NULL)
290 return NULL;
291 for (i = start, j = 0 ; j < l; i++, j++)
292 PyTuple_SET_ITEM(r, j, self->data[i]);
293
294 self->length = start;
295 return r;
296}
297
298static PyObject *
299Pdata_popList(Pdata *self, Py_ssize_t start)
300{
301 PyObject *r;
302 Py_ssize_t i, j, l;
303
304 l=self->length-start;
305 if (!( r=PyList_New(l))) return NULL;
306 for (i=start, j=0 ; j < l; i++, j++)
307 PyList_SET_ITEM(r, j, self->data[i]);
308
309 self->length=start;
310 return r;
311}
312
313/*************************************************************************/
314
315#define ARG_TUP(self, o) { \
316 if (self->arg || (self->arg=PyTuple_New(1))) { \
317 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
318 PyTuple_SET_ITEM(self->arg,0,o); \
319 } \
320 else { \
321 Py_DECREF(o); \
322 } \
323}
324
325#define FREE_ARG_TUP(self) { \
326 if (Py_REFCNT(self->arg) > 1) { \
327 Py_DECREF(self->arg); \
328 self->arg=NULL; \
329 } \
330 }
331
332typedef struct Picklerobject {
333 PyObject_HEAD
334 FILE *fp;
335 PyObject *write;
336 PyObject *file;
337 PyObject *memo;
338 PyObject *arg;
339 PyObject *pers_func;
340 PyObject *inst_pers_func;
341
342 /* pickle protocol number, >= 0 */
343 int proto;
344
345 /* bool, true if proto > 0 */
346 int bin;
347
348 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
349 Py_ssize_t (*write_func)(struct Picklerobject *, const char *, Py_ssize_t);
350 char *write_buf;
351 Py_ssize_t buf_size;
352 PyObject *dispatch_table;
353 int fast_container; /* count nested container dumps */
354 PyObject *fast_memo;
355} Picklerobject;
356
357#ifndef PY_CPICKLE_FAST_LIMIT
358#define PY_CPICKLE_FAST_LIMIT 50
359#endif
360
361static PyTypeObject Picklertype;
362
363typedef struct Unpicklerobject {
364 PyObject_HEAD
365 FILE *fp;
366 PyObject *file;
367 PyObject *readline;
368 PyObject *read;
369 PyObject *memo;
370 PyObject *arg;
371 Pdata *stack;
372 PyObject *mark;
373 PyObject *pers_func;
374 PyObject *last_string;
375 Py_ssize_t *marks;
376 Py_ssize_t num_marks;
377 Py_ssize_t marks_size;
378 Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t);
379 Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **);
380 Py_ssize_t buf_size;
381 char *buf;
382 PyObject *find_class;
383} Unpicklerobject;
384
385static PyTypeObject Unpicklertype;
386
387/* Forward decls that need the above structs */
388static int save(Picklerobject *, PyObject *, int);
389static int put2(Picklerobject *, PyObject *);
390
391static
392PyObject *
393cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
394{
395 va_list va;
396 PyObject *args=0, *retval=0;
397 va_start(va, format);
398
399 if (format) args = Py_VaBuildValue(format, va);
400 va_end(va);
401 if (format && ! args) return NULL;
402 if (stringformat && !(retval=PyString_FromString(stringformat)))
403 return NULL;
404
405 if (retval) {
406 if (args) {
407 PyObject *v;
408 v=PyString_Format(retval, args);
409 Py_DECREF(retval);
410 Py_DECREF(args);
411 if (! v) return NULL;
412 retval=v;
413 }
414 }
415 else
416 if (args) retval=args;
417 else {
418 PyErr_SetObject(ErrType,Py_None);
419 return NULL;
420 }
421 PyErr_SetObject(ErrType,retval);
422 Py_DECREF(retval);
423 return NULL;
424}
425
426static Py_ssize_t
427write_file(Picklerobject *self, const char *s, Py_ssize_t n)
428{
429 size_t nbyteswritten;
430
431 if (s == NULL) {
432 return 0;
433 }
434
435 PyFile_IncUseCount((PyFileObject *)self->file);
436 Py_BEGIN_ALLOW_THREADS
437 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
438 Py_END_ALLOW_THREADS
439 PyFile_DecUseCount((PyFileObject *)self->file);
440 if (nbyteswritten != (size_t)n) {
441 PyErr_SetFromErrno(PyExc_IOError);
442 return -1;
443 }
444
445 return n;
446}
447
448static Py_ssize_t
449write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n)
450{
451 Py_ssize_t len = n;
452
453 if (s == NULL) {
454 return 0;
455 }
456
457 while (n > INT_MAX) {
458 if (PycStringIO->cwrite((PyObject *)self->file, s, INT_MAX) != INT_MAX) {
459 return -1;
460 }
461 n -= INT_MAX;
462 }
463
464 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
465 return -1;
466 }
467
468 return len;
469}
470
471static Py_ssize_t
472write_none(Picklerobject *self, const char *s, Py_ssize_t n)
473{
474 if (s == NULL) return 0;
475 return n;
476}
477
478static Py_ssize_t
479write_other(Picklerobject *self, const char *s, Py_ssize_t n)
480{
481 PyObject *py_str = 0, *junk = 0;
482
483 if (s == NULL) {
484 if (!( self->buf_size )) return 0;
485 py_str = PyString_FromStringAndSize(self->write_buf,
486 self->buf_size);
487 if (!py_str)
488 return -1;
489 }
490 else {
491 if (self->buf_size && n > WRITE_BUF_SIZE - self->buf_size) {
492 if (write_other(self, NULL, 0) < 0)
493 return -1;
494 }
495
496 if (n > WRITE_BUF_SIZE) {
497 if (!( py_str =
498 PyString_FromStringAndSize(s, n)))
499 return -1;
500 }
501 else {
502 memcpy(self->write_buf + self->buf_size, s, n);
503 self->buf_size += n;
504 return n;
505 }
506 }
507
508 if (self->write) {
509 /* object with write method */
510 ARG_TUP(self, py_str);
511 if (self->arg) {
512 junk = PyObject_Call(self->write, self->arg, NULL);
513 FREE_ARG_TUP(self);
514 }
515 if (junk) Py_DECREF(junk);
516 else return -1;
517 }
518 else
519 PDATA_PUSH(self->file, py_str, -1);
520
521 self->buf_size = 0;
522 return n;
523}
524
525
526static Py_ssize_t
527read_file(Unpicklerobject *self, char **s, Py_ssize_t n)
528{
529 size_t nbytesread;
530
531 if (self->buf_size == 0) {
532 Py_ssize_t size;
533
534 size = ((n < 32) ? 32 : n);
535 if (!( self->buf = (char *)malloc(size))) {
536 PyErr_NoMemory();
537 return -1;
538 }
539
540 self->buf_size = size;
541 }
542 else if (n > self->buf_size) {
543 char *newbuf = (char *)realloc(self->buf, n);
544 if (!newbuf) {
545 PyErr_NoMemory();
546 return -1;
547 }
548 self->buf = newbuf;
549 self->buf_size = n;
550 }
551
552 PyFile_IncUseCount((PyFileObject *)self->file);
553 Py_BEGIN_ALLOW_THREADS
554 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
555 Py_END_ALLOW_THREADS
556 PyFile_DecUseCount((PyFileObject *)self->file);
557 if (nbytesread != (size_t)n) {
558 if (feof(self->fp)) {
559 PyErr_SetNone(PyExc_EOFError);
560 return -1;
561 }
562
563 PyErr_SetFromErrno(PyExc_IOError);
564 return -1;
565 }
566
567 *s = self->buf;
568
569 return n;
570}
571
572
573static Py_ssize_t
574readline_file(Unpicklerobject *self, char **s)
575{
576 Py_ssize_t i;
577
578 if (self->buf_size == 0) {
579 if (!( self->buf = (char *)malloc(40))) {
580 PyErr_NoMemory();
581 return -1;
582 }
583 self->buf_size = 40;
584 }
585
586 i = 0;
587 while (1) {
588 Py_ssize_t bigger;
589 char *newbuf;
590 for (; i < (self->buf_size - 1); i++) {
591 if (feof(self->fp) ||
592 (self->buf[i] = getc(self->fp)) == '\n') {
593 self->buf[i + 1] = '\0';
594 *s = self->buf;
595 return i + 1;
596 }
597 }
598 if (self->buf_size > (PY_SSIZE_T_MAX >> 1)) {
599 PyErr_NoMemory();
600 return -1;
601 }
602 bigger = self->buf_size << 1;
603 newbuf = (char *)realloc(self->buf, bigger);
604 if (newbuf == NULL) {
605 PyErr_NoMemory();
606 return -1;
607 }
608 self->buf = newbuf;
609 self->buf_size = bigger;
610 }
611}
612
613
614static Py_ssize_t
615read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n)
616{
617 Py_ssize_t len = n;
618 char *start, *end = NULL;
619
620 while (1) {
621 int k;
622 char *ptr;
623 if (n > INT_MAX)
624 k = INT_MAX;
625 else
626 k = (int)n;
627 if (PycStringIO->cread((PyObject *)self->file, &ptr, k) != k) {
628 PyErr_SetNone(PyExc_EOFError);
629 return -1;
630 }
631 if (end == NULL)
632 start = ptr;
633 else if (ptr != end) {
634 /* non-continuous area */
635 return -1;
636 }
637 if (n <= INT_MAX)
638 break;
639 end = ptr + INT_MAX;
640 n -= INT_MAX;
641 }
642
643 *s = start;
644
645 return len;
646}
647
648
649static Py_ssize_t
650readline_cStringIO(Unpicklerobject *self, char **s)
651{
652 Py_ssize_t n = 0;
653 char *start = NULL, *end = NULL;
654
655 while (1) {
656 int k;
657 char *ptr;
658 if ((k = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
659 return -1;
660 }
661 n += k;
662 if (end == NULL)
663 start = ptr;
664 else if (ptr != end) {
665 /* non-continuous area */
666 return -1;
667 }
668 if (k == 0 || ptr[k - 1] == '\n')
669 break;
670 end = ptr + k;
671 }
672
673 *s = start;
674
675 return n;
676}
677
678
679static Py_ssize_t
680read_other(Unpicklerobject *self, char **s, Py_ssize_t n)
681{
682 PyObject *bytes, *str=0;
683
684 if (!( bytes = PyInt_FromSsize_t(n))) return -1;
685
686 ARG_TUP(self, bytes);
687 if (self->arg) {
688 str = PyObject_Call(self->read, self->arg, NULL);
689 FREE_ARG_TUP(self);
690 }
691 if (! str) return -1;
692
693 Py_XDECREF(self->last_string);
694 self->last_string = str;
695
696 if (! (*s = PyString_AsString(str))) return -1;
697
698 if (PyString_GET_SIZE(str) != n) {
699 PyErr_SetNone(PyExc_EOFError);
700 return -1;
701 }
702
703 return n;
704}
705
706
707static Py_ssize_t
708readline_other(Unpicklerobject *self, char **s)
709{
710 PyObject *str;
711 Py_ssize_t str_size;
712
713 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
714 return -1;
715 }
716
717 if ((str_size = PyString_Size(str)) < 0)
718 return -1;
719
720 Py_XDECREF(self->last_string);
721 self->last_string = str;
722
723 if (! (*s = PyString_AsString(str)))
724 return -1;
725
726 return str_size;
727}
728
729/* Copy the first n bytes from s into newly malloc'ed memory, plus a
730 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
731 * The caller is responsible for free()'ing the return value.
732 */
733static char *
734pystrndup(const char *s, Py_ssize_t n)
735{
736 char *r = (char *)malloc(n+1);
737 if (r == NULL)
738 return (char*)PyErr_NoMemory();
739 memcpy(r, s, n);
740 r[n] = 0;
741 return r;
742}
743
744
745static int
746get(Picklerobject *self, PyObject *id)
747{
748 PyObject *value, *mv;
749 Py_ssize_t c_value;
750 char s[30];
751 size_t len;
752
753 if (!( mv = PyDict_GetItem(self->memo, id))) {
754 PyErr_SetObject(PyExc_KeyError, id);
755 return -1;
756 }
757
758 if (!( value = PyTuple_GetItem(mv, 0)))
759 return -1;
760
761 if (!( PyInt_Check(value))) {
762 PyErr_SetString(PicklingError, "no int where int expected in memo");
763 return -1;
764 }
765 c_value = PyInt_AS_LONG((PyIntObject*)value);
766
767 if (!self->bin) {
768 s[0] = GET;
769 PyOS_snprintf(s + 1, sizeof(s) - 1,
770 "%" PY_FORMAT_SIZE_T "d\n", c_value);
771 len = strlen(s);
772 }
773 else if (Pdata_Check(self->file)) {
774 if (write_other(self, NULL, 0) < 0) return -1;
775 PDATA_APPEND(self->file, mv, -1);
776 return 0;
777 }
778 else {
779 if (c_value < 256) {
780 s[0] = BINGET;
781 s[1] = (int)(c_value & 0xff);
782 len = 2;
783 }
784 else {
785 s[0] = LONG_BINGET;
786 s[1] = (int)(c_value & 0xff);
787 s[2] = (int)((c_value >> 8) & 0xff);
788 s[3] = (int)((c_value >> 16) & 0xff);
789 s[4] = (int)((c_value >> 24) & 0xff);
790 len = 5;
791 }
792 }
793
794 if (self->write_func(self, s, len) < 0)
795 return -1;
796
797 return 0;
798}
799
800
801static int
802put(Picklerobject *self, PyObject *ob)
803{
804 if (Py_REFCNT(ob) < 2 || self->fast)
805 return 0;
806
807 return put2(self, ob);
808}
809
810
811static int
812put2(Picklerobject *self, PyObject *ob)
813{
814 char c_str[30];
815 Py_ssize_t len, p;
816 int res = -1;
817 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
818
819 if (self->fast)
820 return 0;
821
822 if ((p = PyDict_Size(self->memo)) < 0)
823 goto finally;
824
825 /* Make sure memo keys are positive! */
826 /* XXX Why?
827 * XXX And does "positive" really mean non-negative?
828 * XXX pickle.py starts with PUT index 0, not 1. This makes for
829 * XXX gratuitous differences between the pickling modules.
830 */
831 p++;
832
833 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
834 goto finally;
835
836 if (!( memo_len = PyInt_FromLong(p)))
837 goto finally;
838
839 if (!( t = PyTuple_New(2)))
840 goto finally;
841
842 PyTuple_SET_ITEM(t, 0, memo_len);
843 Py_INCREF(memo_len);
844 PyTuple_SET_ITEM(t, 1, ob);
845 Py_INCREF(ob);
846
847 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
848 goto finally;
849
850 if (!self->bin) {
851 c_str[0] = PUT;
852 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1,
853 "%" PY_FORMAT_SIZE_T "d\n", p);
854 len = strlen(c_str);
855 }
856 else if (Pdata_Check(self->file)) {
857 if (write_other(self, NULL, 0) < 0) return -1;
858 PDATA_APPEND(self->file, memo_len, -1);
859 res=0; /* Job well done ;) */
860 goto finally;
861 }
862 else {
863 if (p >= 256) {
864 c_str[0] = LONG_BINPUT;
865 c_str[1] = (int)(p & 0xff);
866 c_str[2] = (int)((p >> 8) & 0xff);
867 c_str[3] = (int)((p >> 16) & 0xff);
868 c_str[4] = (int)((p >> 24) & 0xff);
869 len = 5;
870 }
871 else {
872 c_str[0] = BINPUT;
873 c_str[1] = p;
874 len = 2;
875 }
876 }
877
878 if (self->write_func(self, c_str, len) < 0)
879 goto finally;
880
881 res = 0;
882
883 finally:
884 Py_XDECREF(py_ob_id);
885 Py_XDECREF(memo_len);
886 Py_XDECREF(t);
887
888 return res;
889}
890
891static PyObject *
892whichmodule(PyObject *global, PyObject *global_name)
893{
894 Py_ssize_t i, j;
895 PyObject *module = 0, *modules_dict = 0,
896 *global_name_attr = 0, *name = 0;
897
898 module = PyObject_GetAttrString(global, "__module__");
899 if (module)
900 return module;
901 if (PyErr_ExceptionMatches(PyExc_AttributeError))
902 PyErr_Clear();
903 else
904 return NULL;
905
906 if (!( modules_dict = PySys_GetObject("modules")))
907 return NULL;
908
909 i = 0;
910 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
911
912 if (PyObject_Compare(name, __main___str)==0) continue;
913
914 global_name_attr = PyObject_GetAttr(module, global_name);
915 if (!global_name_attr) {
916 if (PyErr_ExceptionMatches(PyExc_AttributeError))
917 PyErr_Clear();
918 else
919 return NULL;
920 continue;
921 }
922
923 if (global_name_attr != global) {
924 Py_DECREF(global_name_attr);
925 continue;
926 }
927
928 Py_DECREF(global_name_attr);
929
930 break;
931 }
932
933 /* The following implements the rule in pickle.py added in 1.5
934 that used __main__ if no module is found. I don't actually
935 like this rule. jlf
936 */
937 if (!j) {
938 name=__main___str;
939 }
940
941 Py_INCREF(name);
942 return name;
943}
944
945
946static int
947fast_save_enter(Picklerobject *self, PyObject *obj)
948{
949 /* if fast_container < 0, we're doing an error exit. */
950 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
951 PyObject *key = NULL;
952 if (self->fast_memo == NULL) {
953 self->fast_memo = PyDict_New();
954 if (self->fast_memo == NULL) {
955 self->fast_container = -1;
956 return 0;
957 }
958 }
959 key = PyLong_FromVoidPtr(obj);
960 if (key == NULL)
961 return 0;
962 if (PyDict_GetItem(self->fast_memo, key)) {
963 Py_DECREF(key);
964 PyErr_Format(PyExc_ValueError,
965 "fast mode: can't pickle cyclic objects "
966 "including object type %s at %p",
967 Py_TYPE(obj)->tp_name, obj);
968 self->fast_container = -1;
969 return 0;
970 }
971 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
972 Py_DECREF(key);
973 self->fast_container = -1;
974 return 0;
975 }
976 Py_DECREF(key);
977 }
978 return 1;
979}
980
981int
982fast_save_leave(Picklerobject *self, PyObject *obj)
983{
984 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
985 PyObject *key = PyLong_FromVoidPtr(obj);
986 if (key == NULL)
987 return 0;
988 if (PyDict_DelItem(self->fast_memo, key) < 0) {
989 Py_DECREF(key);
990 return 0;
991 }
992 Py_DECREF(key);
993 }
994 return 1;
995}
996
997static int
998save_none(Picklerobject *self, PyObject *args)
999{
1000 static char none = NONE;
1001 if (self->write_func(self, &none, 1) < 0)
1002 return -1;
1003
1004 return 0;
1005}
1006
1007static int
1008save_bool(Picklerobject *self, PyObject *args)
1009{
1010 static const char *buf[2] = {FALSE, TRUE};
1011 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
1012 long l = PyInt_AS_LONG((PyIntObject *)args);
1013
1014 if (self->proto >= 2) {
1015 char opcode = l ? NEWTRUE : NEWFALSE;
1016 if (self->write_func(self, &opcode, 1) < 0)
1017 return -1;
1018 }
1019 else if (self->write_func(self, buf[l], len[l]) < 0)
1020 return -1;
1021 return 0;
1022}
1023
1024static int
1025save_int(Picklerobject *self, PyObject *args)
1026{
1027 char c_str[32];
1028 long l = PyInt_AS_LONG((PyIntObject *)args);
1029 Py_ssize_t len = 0;
1030
1031 if (!self->bin
1032#if SIZEOF_LONG > 4
1033 || l > 0x7fffffffL
1034 || l < -0x80000000L
1035#endif
1036 ) {
1037 /* Text-mode pickle, or long too big to fit in the 4-byte
1038 * signed BININT format: store as a string.
1039 */
1040 c_str[0] = INT;
1041 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
1042 if (self->write_func(self, c_str, strlen(c_str)) < 0)
1043 return -1;
1044 }
1045 else {
1046 /* Binary pickle and l fits in a signed 4-byte int. */
1047 c_str[1] = (int)( l & 0xff);
1048 c_str[2] = (int)((l >> 8) & 0xff);
1049 c_str[3] = (int)((l >> 16) & 0xff);
1050 c_str[4] = (int)((l >> 24) & 0xff);
1051
1052 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1053 if (c_str[2] == 0) {
1054 c_str[0] = BININT1;
1055 len = 2;
1056 }
1057 else {
1058 c_str[0] = BININT2;
1059 len = 3;
1060 }
1061 }
1062 else {
1063 c_str[0] = BININT;
1064 len = 5;
1065 }
1066
1067 if (self->write_func(self, c_str, len) < 0)
1068 return -1;
1069 }
1070
1071 return 0;
1072}
1073
1074
1075static int
1076save_long(Picklerobject *self, PyObject *args)
1077{
1078 Py_ssize_t size;
1079 int res = -1;
1080 PyObject *repr = NULL;
1081
1082 static char l = LONG;
1083
1084 if (self->proto >= 2) {
1085 /* Linear-time pickling. */
1086 size_t nbits;
1087 size_t nbytes;
1088 unsigned char *pdata;
1089 char c_str[5];
1090 int i;
1091 int sign = _PyLong_Sign(args);
1092
1093 if (sign == 0) {
1094 /* It's 0 -- an empty bytestring. */
1095 c_str[0] = LONG1;
1096 c_str[1] = 0;
1097 i = self->write_func(self, c_str, 2);
1098 if (i < 0) goto finally;
1099 res = 0;
1100 goto finally;
1101 }
1102 nbits = _PyLong_NumBits(args);
1103 if (nbits == (size_t)-1 && PyErr_Occurred())
1104 goto finally;
1105 /* How many bytes do we need? There are nbits >> 3 full
1106 * bytes of data, and nbits & 7 leftover bits. If there
1107 * are any leftover bits, then we clearly need another
1108 * byte. Wnat's not so obvious is that we *probably*
1109 * need another byte even if there aren't any leftovers:
1110 * the most-significant bit of the most-significant byte
1111 * acts like a sign bit, and it's usually got a sense
1112 * opposite of the one we need. The exception is longs
1113 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1114 * its own 256's-complement, so has the right sign bit
1115 * even without the extra byte. That's a pain to check
1116 * for in advance, though, so we always grab an extra
1117 * byte at the start, and cut it back later if possible.
1118 */
1119 nbytes = (nbits >> 3) + 1;
1120 if (nbytes > INT_MAX) {
1121 PyErr_SetString(PyExc_OverflowError, "long too large "
1122 "to pickle");
1123 goto finally;
1124 }
1125 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1126 if (repr == NULL) goto finally;
1127 pdata = (unsigned char *)PyString_AS_STRING(repr);
1128 i = _PyLong_AsByteArray((PyLongObject *)args,
1129 pdata, nbytes,
1130 1 /* little endian */, 1 /* signed */);
1131 if (i < 0) goto finally;
1132 /* If the long is negative, this may be a byte more than
1133 * needed. This is so iff the MSB is all redundant sign
1134 * bits.
1135 */
1136 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1137 (pdata[nbytes - 2] & 0x80) != 0)
1138 --nbytes;
1139
1140 if (nbytes < 256) {
1141 c_str[0] = LONG1;
1142 c_str[1] = (char)nbytes;
1143 size = 2;
1144 }
1145 else {
1146 c_str[0] = LONG4;
1147 size = (int)nbytes;
1148 for (i = 1; i < 5; i++) {
1149 c_str[i] = (char)(size & 0xff);
1150 size >>= 8;
1151 }
1152 size = 5;
1153 }
1154 i = self->write_func(self, c_str, size);
1155 if (i < 0) goto finally;
1156 i = self->write_func(self, (char *)pdata, (int)nbytes);
1157 if (i < 0) goto finally;
1158 res = 0;
1159 goto finally;
1160 }
1161
1162 /* proto < 2: write the repr and newline. This is quadratic-time
1163 * (in the number of digits), in both directions.
1164 */
1165 if (!( repr = PyObject_Repr(args)))
1166 goto finally;
1167
1168 if ((size = PyString_Size(repr)) < 0)
1169 goto finally;
1170
1171 if (self->write_func(self, &l, 1) < 0)
1172 goto finally;
1173
1174 if (self->write_func(self,
1175 PyString_AS_STRING((PyStringObject *)repr),
1176 size) < 0)
1177 goto finally;
1178
1179 if (self->write_func(self, "\n", 1) < 0)
1180 goto finally;
1181
1182 res = 0;
1183
1184 finally:
1185 Py_XDECREF(repr);
1186 return res;
1187}
1188
1189
1190static int
1191save_float(Picklerobject *self, PyObject *args)
1192{
1193 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
1194
1195 if (self->bin) {
1196 char str[9];
1197 str[0] = BINFLOAT;
1198 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
1199 return -1;
1200 if (self->write_func(self, str, 9) < 0)
1201 return -1;
1202 }
1203 else {
1204 int result = -1;
1205 char *buf = NULL;
1206 char op = FLOAT;
1207
1208 if (self->write_func(self, &op, 1) < 0)
1209 goto done;
1210
1211 buf = PyOS_double_to_string(x, 'g', 17, 0, NULL);
1212 if (!buf) {
1213 PyErr_NoMemory();
1214 goto done;
1215 }
1216
1217 if (self->write_func(self, buf, strlen(buf)) < 0)
1218 goto done;
1219
1220 if (self->write_func(self, "\n", 1) < 0)
1221 goto done;
1222
1223 result = 0;
1224done:
1225 PyMem_Free(buf);
1226 return result;
1227 }
1228
1229 return 0;
1230}
1231
1232
1233static int
1234save_string(Picklerobject *self, PyObject *args, int doput)
1235{
1236 Py_ssize_t size, len;
1237 PyObject *repr=0;
1238
1239 if ((size = PyString_Size(args)) < 0)
1240 return -1;
1241
1242 if (!self->bin) {
1243 char *repr_str;
1244
1245 static char string = STRING;
1246
1247 if (!( repr = PyObject_Repr(args)))
1248 return -1;
1249
1250 if ((len = PyString_Size(repr)) < 0)
1251 goto err;
1252 repr_str = PyString_AS_STRING((PyStringObject *)repr);
1253
1254 if (self->write_func(self, &string, 1) < 0)
1255 goto err;
1256
1257 if (self->write_func(self, repr_str, len) < 0)
1258 goto err;
1259
1260 if (self->write_func(self, "\n", 1) < 0)
1261 goto err;
1262
1263 Py_XDECREF(repr);
1264 }
1265 else {
1266 int i;
1267 char c_str[5];
1268
1269 if (size < 256) {
1270 c_str[0] = SHORT_BINSTRING;
1271 c_str[1] = size;
1272 len = 2;
1273 }
1274 else if (size <= INT_MAX) {
1275 c_str[0] = BINSTRING;
1276 for (i = 1; i < 5; i++)
1277 c_str[i] = (int)(size >> ((i - 1) * 8));
1278 len = 5;
1279 }
1280 else
1281 return -1; /* string too large */
1282
1283 if (self->write_func(self, c_str, len) < 0)
1284 return -1;
1285
1286 if (size > 128 && Pdata_Check(self->file)) {
1287 if (write_other(self, NULL, 0) < 0) return -1;
1288 PDATA_APPEND(self->file, args, -1);
1289 }
1290 else {
1291 if (self->write_func(self,
1292 PyString_AS_STRING(
1293 (PyStringObject *)args),
1294 size) < 0)
1295 return -1;
1296 }
1297 }
1298
1299 if (doput)
1300 if (put(self, args) < 0)
1301 return -1;
1302
1303 return 0;
1304
1305 err:
1306 Py_XDECREF(repr);
1307 return -1;
1308}
1309
1310
1311#ifdef Py_USING_UNICODE
1312/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1313 backslash and newline characters to \uXXXX escapes. */
1314static PyObject *
1315modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size)
1316{
1317 PyObject *repr;
1318 char *p;
1319 char *q;
1320
1321 static const char *hexdigit = "0123456789abcdef";
1322#ifdef Py_UNICODE_WIDE
1323 const Py_ssize_t expandsize = 10;
1324#else
1325 const Py_ssize_t expandsize = 6;
1326#endif
1327
1328 if (size > PY_SSIZE_T_MAX / expandsize)
1329 return PyErr_NoMemory();
1330
1331 repr = PyString_FromStringAndSize(NULL, expandsize * size);
1332 if (repr == NULL)
1333 return NULL;
1334 if (size == 0)
1335 return repr;
1336
1337 p = q = PyString_AS_STRING(repr);
1338 while (size-- > 0) {
1339 Py_UNICODE ch = *s++;
1340#ifdef Py_UNICODE_WIDE
1341 /* Map 32-bit characters to '\Uxxxxxxxx' */
1342 if (ch >= 0x10000) {
1343 *p++ = '\\';
1344 *p++ = 'U';
1345 *p++ = hexdigit[(ch >> 28) & 0xf];
1346 *p++ = hexdigit[(ch >> 24) & 0xf];
1347 *p++ = hexdigit[(ch >> 20) & 0xf];
1348 *p++ = hexdigit[(ch >> 16) & 0xf];
1349 *p++ = hexdigit[(ch >> 12) & 0xf];
1350 *p++ = hexdigit[(ch >> 8) & 0xf];
1351 *p++ = hexdigit[(ch >> 4) & 0xf];
1352 *p++ = hexdigit[ch & 15];
1353 }
1354 else
1355#else
1356 /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */
1357 if (ch >= 0xD800 && ch < 0xDC00) {
1358 Py_UNICODE ch2;
1359 Py_UCS4 ucs;
1360
1361 ch2 = *s++;
1362 size--;
1363 if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {
1364 ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000;
1365 *p++ = '\\';
1366 *p++ = 'U';
1367 *p++ = hexdigit[(ucs >> 28) & 0xf];
1368 *p++ = hexdigit[(ucs >> 24) & 0xf];
1369 *p++ = hexdigit[(ucs >> 20) & 0xf];
1370 *p++ = hexdigit[(ucs >> 16) & 0xf];
1371 *p++ = hexdigit[(ucs >> 12) & 0xf];
1372 *p++ = hexdigit[(ucs >> 8) & 0xf];
1373 *p++ = hexdigit[(ucs >> 4) & 0xf];
1374 *p++ = hexdigit[ucs & 0xf];
1375 continue;
1376 }
1377 /* Fall through: isolated surrogates are copied as-is */
1378 s--;
1379 size++;
1380 }
1381#endif
1382 /* Map 16-bit characters to '\uxxxx' */
1383 if (ch >= 256 || ch == '\\' || ch == '\n') {
1384 *p++ = '\\';
1385 *p++ = 'u';
1386 *p++ = hexdigit[(ch >> 12) & 0xf];
1387 *p++ = hexdigit[(ch >> 8) & 0xf];
1388 *p++ = hexdigit[(ch >> 4) & 0xf];
1389 *p++ = hexdigit[ch & 15];
1390 }
1391 /* Copy everything else as-is */
1392 else
1393 *p++ = (char) ch;
1394 }
1395 *p = '\0';
1396 _PyString_Resize(&repr, p - q);
1397 return repr;
1398}
1399
1400static int
1401save_unicode(Picklerobject *self, PyObject *args, int doput)
1402{
1403 Py_ssize_t size, len;
1404 PyObject *repr=0;
1405
1406 if (!PyUnicode_Check(args))
1407 return -1;
1408
1409 if (!self->bin) {
1410 char *repr_str;
1411 static char string = UNICODE;
1412
1413 repr = modified_EncodeRawUnicodeEscape(
1414 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
1415 if (!repr)
1416 return -1;
1417
1418 if ((len = PyString_Size(repr)) < 0)
1419 goto err;
1420 repr_str = PyString_AS_STRING((PyStringObject *)repr);
1421
1422 if (self->write_func(self, &string, 1) < 0)
1423 goto err;
1424
1425 if (self->write_func(self, repr_str, len) < 0)
1426 goto err;
1427
1428 if (self->write_func(self, "\n", 1) < 0)
1429 goto err;
1430
1431 Py_XDECREF(repr);
1432 }
1433 else {
1434 int i;
1435 char c_str[5];
1436
1437 if (!( repr = PyUnicode_AsUTF8String(args)))
1438 return -1;
1439
1440 if ((size = PyString_Size(repr)) < 0)
1441 goto err;
1442 if (size > INT_MAX)
1443 return -1; /* string too large */
1444
1445 c_str[0] = BINUNICODE;
1446 for (i = 1; i < 5; i++)
1447 c_str[i] = (int)(size >> ((i - 1) * 8));
1448 len = 5;
1449
1450 if (self->write_func(self, c_str, len) < 0)
1451 goto err;
1452
1453 if (size > 128 && Pdata_Check(self->file)) {
1454 if (write_other(self, NULL, 0) < 0)
1455 goto err;
1456 PDATA_APPEND(self->file, repr, -1);
1457 }
1458 else {
1459 if (self->write_func(self, PyString_AS_STRING(repr),
1460 size) < 0)
1461 goto err;
1462 }
1463
1464 Py_DECREF(repr);
1465 }
1466
1467 if (doput)
1468 if (put(self, args) < 0)
1469 return -1;
1470
1471 return 0;
1472
1473 err:
1474 Py_XDECREF(repr);
1475 return -1;
1476}
1477#endif
1478
1479/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1480static int
1481store_tuple_elements(Picklerobject *self, PyObject *t, int len)
1482{
1483 Py_ssize_t i;
1484 int res = -1; /* guilty until proved innocent */
1485
1486 assert(PyTuple_Size(t) == len);
1487
1488 for (i = 0; i < len; i++) {
1489 PyObject *element = PyTuple_GET_ITEM(t, i);
1490
1491 if (element == NULL)
1492 goto finally;
1493 if (save(self, element, 0) < 0)
1494 goto finally;
1495 }
1496 res = 0;
1497
1498 finally:
1499 return res;
1500}
1501
1502/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1503 * used across protocols to minimize the space needed to pickle them.
1504 * Tuples are also the only builtin immutable type that can be recursive
1505 * (a tuple can be reached from itself), and that requires some subtle
1506 * magic so that it works in all cases. IOW, this is a long routine.
1507 */
1508static int
1509save_tuple(Picklerobject *self, PyObject *args)
1510{
1511 PyObject *py_tuple_id = NULL;
1512 Py_ssize_t len, i;
1513 int res = -1;
1514
1515 static char tuple = TUPLE;
1516 static char pop = POP;
1517 static char pop_mark = POP_MARK;
1518 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
1519
1520 if ((len = PyTuple_Size(args)) < 0)
1521 goto finally;
1522
1523 if (len == 0) {
1524 char c_str[2];
1525
1526 if (self->proto) {
1527 c_str[0] = EMPTY_TUPLE;
1528 len = 1;
1529 }
1530 else {
1531 c_str[0] = MARK;
1532 c_str[1] = TUPLE;
1533 len = 2;
1534 }
1535 if (self->write_func(self, c_str, len) >= 0)
1536 res = 0;
1537 /* Don't memoize an empty tuple. */
1538 goto finally;
1539 }
1540
1541 /* A non-empty tuple. */
1542
1543 /* id(tuple) isn't in the memo now. If it shows up there after
1544 * saving the tuple elements, the tuple must be recursive, in
1545 * which case we'll pop everything we put on the stack, and fetch
1546 * its value from the memo.
1547 */
1548 py_tuple_id = PyLong_FromVoidPtr(args);
1549 if (py_tuple_id == NULL)
1550 goto finally;
1551
1552 if (len <= 3 && self->proto >= 2) {
1553 /* Use TUPLE{1,2,3} opcodes. */
1554 if (store_tuple_elements(self, args, len) < 0)
1555 goto finally;
1556 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1557 /* pop the len elements */
1558 for (i = 0; i < len; ++i)
1559 if (self->write_func(self, &pop, 1) < 0)
1560 goto finally;
1561 /* fetch from memo */
1562 if (get(self, py_tuple_id) < 0)
1563 goto finally;
1564 res = 0;
1565 goto finally;
1566 }
1567 /* Not recursive. */
1568 if (self->write_func(self, len2opcode + len, 1) < 0)
1569 goto finally;
1570 goto memoize;
1571 }
1572
1573 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1574 * Generate MARK elt1 elt2 ... TUPLE
1575 */
1576 if (self->write_func(self, &MARKv, 1) < 0)
1577 goto finally;
1578
1579 if (store_tuple_elements(self, args, len) < 0)
1580 goto finally;
1581
1582 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1583 /* pop the stack stuff we pushed */
1584 if (self->bin) {
1585 if (self->write_func(self, &pop_mark, 1) < 0)
1586 goto finally;
1587 }
1588 else {
1589 /* Note that we pop one more than len, to remove
1590 * the MARK too.
1591 */
1592 for (i = 0; i <= len; i++)
1593 if (self->write_func(self, &pop, 1) < 0)
1594 goto finally;
1595 }
1596 /* fetch from memo */
1597 if (get(self, py_tuple_id) >= 0)
1598 res = 0;
1599 goto finally;
1600 }
1601
1602 /* Not recursive. */
1603 if (self->write_func(self, &tuple, 1) < 0)
1604 goto finally;
1605
1606 memoize:
1607 if (put(self, args) >= 0)
1608 res = 0;
1609
1610 finally:
1611 Py_XDECREF(py_tuple_id);
1612 return res;
1613}
1614
1615/* iter is an iterator giving items, and we batch up chunks of
1616 * MARK item item ... item APPENDS
1617 * opcode sequences. Calling code should have arranged to first create an
1618 * empty list, or list-like object, for the APPENDS to operate on.
1619 * Returns 0 on success, <0 on error.
1620 */
1621static int
1622batch_list(Picklerobject *self, PyObject *iter)
1623{
1624 PyObject *obj = NULL;
1625 PyObject *firstitem = NULL;
1626 int i, n;
1627
1628 static char append = APPEND;
1629 static char appends = APPENDS;
1630
1631 assert(iter != NULL);
1632
1633 if (self->proto == 0) {
1634 /* APPENDS isn't available; do one at a time. */
1635 for (;;) {
1636 obj = PyIter_Next(iter);
1637 if (obj == NULL) {
1638 if (PyErr_Occurred())
1639 return -1;
1640 break;
1641 }
1642 i = save(self, obj, 0);
1643 Py_DECREF(obj);
1644 if (i < 0)
1645 return -1;
1646 if (self->write_func(self, &append, 1) < 0)
1647 return -1;
1648 }
1649 return 0;
1650 }
1651
1652 /* proto > 0: write in batches of BATCHSIZE. */
1653 do {
1654 /* Get first item */
1655 firstitem = PyIter_Next(iter);
1656 if (firstitem == NULL) {
1657 if (PyErr_Occurred())
1658 goto BatchFailed;
1659
1660 /* nothing more to add */
1661 break;
1662 }
1663
1664 /* Try to get a second item */
1665 obj = PyIter_Next(iter);
1666 if (obj == NULL) {
1667 if (PyErr_Occurred())
1668 goto BatchFailed;
1669
1670 /* Only one item to write */
1671 if (save(self, firstitem, 0) < 0)
1672 goto BatchFailed;
1673 if (self->write_func(self, &append, 1) < 0)
1674 goto BatchFailed;
1675 Py_CLEAR(firstitem);
1676 break;
1677 }
1678
1679 /* More than one item to write */
1680
1681 /* Pump out MARK, items, APPENDS. */
1682 if (self->write_func(self, &MARKv, 1) < 0)
1683 goto BatchFailed;
1684
1685 if (save(self, firstitem, 0) < 0)
1686 goto BatchFailed;
1687 Py_CLEAR(firstitem);
1688 n = 1;
1689
1690 /* Fetch and save up to BATCHSIZE items */
1691 while (obj) {
1692 if (save(self, obj, 0) < 0)
1693 goto BatchFailed;
1694 Py_CLEAR(obj);
1695 n += 1;
1696
1697 if (n == BATCHSIZE)
1698 break;
1699
1700 obj = PyIter_Next(iter);
1701 if (obj == NULL) {
1702 if (PyErr_Occurred())
1703 goto BatchFailed;
1704 break;
1705 }
1706 }
1707
1708 if (self->write_func(self, &appends, 1) < 0)
1709 goto BatchFailed;
1710
1711 } while (n == BATCHSIZE);
1712 return 0;
1713
1714BatchFailed:
1715 Py_XDECREF(firstitem);
1716 Py_XDECREF(obj);
1717 return -1;
1718}
1719
1720static int
1721save_list(Picklerobject *self, PyObject *args)
1722{
1723 int res = -1;
1724 char s[3];
1725 Py_ssize_t len;
1726 PyObject *iter;
1727
1728 if (self->fast && !fast_save_enter(self, args))
1729 goto finally;
1730
1731 /* Create an empty list. */
1732 if (self->bin) {
1733 s[0] = EMPTY_LIST;
1734 len = 1;
1735 }
1736 else {
1737 s[0] = MARK;
1738 s[1] = LIST;
1739 len = 2;
1740 }
1741
1742 if (self->write_func(self, s, len) < 0)
1743 goto finally;
1744
1745 /* Get list length, and bow out early if empty. */
1746 if ((len = PyList_Size(args)) < 0)
1747 goto finally;
1748
1749 /* Memoize. */
1750 if (len == 0) {
1751 if (put(self, args) >= 0)
1752 res = 0;
1753 goto finally;
1754 }
1755 if (put2(self, args) < 0)
1756 goto finally;
1757
1758 /* Materialize the list elements. */
1759 iter = PyObject_GetIter(args);
1760 if (iter == NULL)
1761 goto finally;
1762
1763 if (Py_EnterRecursiveCall(" while pickling an object") == 0)
1764 {
1765 res = batch_list(self, iter);
1766 Py_LeaveRecursiveCall();
1767 }
1768 Py_DECREF(iter);
1769
1770 finally:
1771 if (self->fast && !fast_save_leave(self, args))
1772 res = -1;
1773
1774 return res;
1775}
1776
1777
1778/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1779 * MARK key value ... key value SETITEMS
1780 * opcode sequences. Calling code should have arranged to first create an
1781 * empty dict, or dict-like object, for the SETITEMS to operate on.
1782 * Returns 0 on success, <0 on error.
1783 *
1784 * This is very much like batch_list(). The difference between saving
1785 * elements directly, and picking apart two-tuples, is so long-winded at
1786 * the C level, though, that attempts to combine these routines were too
1787 * ugly to bear.
1788 */
1789static int
1790batch_dict(Picklerobject *self, PyObject *iter)
1791{
1792 PyObject *p = NULL;
1793 PyObject *firstitem = NULL;
1794 int i, n;
1795
1796 static char setitem = SETITEM;
1797 static char setitems = SETITEMS;
1798
1799 assert(iter != NULL);
1800
1801 if (self->proto == 0) {
1802 /* SETITEMS isn't available; do one at a time. */
1803 for (;;) {
1804 p = PyIter_Next(iter);
1805 if (p == NULL) {
1806 if (PyErr_Occurred())
1807 return -1;
1808 break;
1809 }
1810 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1811 PyErr_SetString(PyExc_TypeError, "dict items "
1812 "iterator must return 2-tuples");
1813 return -1;
1814 }
1815 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1816 if (i >= 0)
1817 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1818 Py_DECREF(p);
1819 if (i < 0)
1820 return -1;
1821 if (self->write_func(self, &setitem, 1) < 0)
1822 return -1;
1823 }
1824 return 0;
1825 }
1826
1827 /* proto > 0: write in batches of BATCHSIZE. */
1828 do {
1829 /* Get first item */
1830 firstitem = PyIter_Next(iter);
1831 if (firstitem == NULL) {
1832 if (PyErr_Occurred())
1833 goto BatchFailed;
1834
1835 /* nothing more to add */
1836 break;
1837 }
1838 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
1839 PyErr_SetString(PyExc_TypeError, "dict items "
1840 "iterator must return 2-tuples");
1841 goto BatchFailed;
1842 }
1843
1844 /* Try to get a second item */
1845 p = PyIter_Next(iter);
1846 if (p == NULL) {
1847 if (PyErr_Occurred())
1848 goto BatchFailed;
1849
1850 /* Only one item to write */
1851 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
1852 goto BatchFailed;
1853 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
1854 goto BatchFailed;
1855 if (self->write_func(self, &setitem, 1) < 0)
1856 goto BatchFailed;
1857 Py_CLEAR(firstitem);
1858 break;
1859 }
1860
1861 /* More than one item to write */
1862
1863 /* Pump out MARK, items, SETITEMS. */
1864 if (self->write_func(self, &MARKv, 1) < 0)
1865 goto BatchFailed;
1866
1867 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
1868 goto BatchFailed;
1869 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
1870 goto BatchFailed;
1871 Py_CLEAR(firstitem);
1872 n = 1;
1873
1874 /* Fetch and save up to BATCHSIZE items */
1875 while (p) {
1876 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1877 PyErr_SetString(PyExc_TypeError, "dict items "
1878 "iterator must return 2-tuples");
1879 goto BatchFailed;
1880 }
1881 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1882 goto BatchFailed;
1883 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1884 goto BatchFailed;
1885 Py_CLEAR(p);
1886 n += 1;
1887
1888 if (n == BATCHSIZE)
1889 break;
1890
1891 p = PyIter_Next(iter);
1892 if (p == NULL) {
1893 if (PyErr_Occurred())
1894 goto BatchFailed;
1895 break;
1896 }
1897 }
1898
1899 if (self->write_func(self, &setitems, 1) < 0)
1900 goto BatchFailed;
1901
1902 } while (n == BATCHSIZE);
1903 return 0;
1904
1905BatchFailed:
1906 Py_XDECREF(firstitem);
1907 Py_XDECREF(p);
1908 return -1;
1909}
1910
1911/* This is a variant of batch_dict() above that specializes for dicts, with no
1912 * support for dict subclasses. Like batch_dict(), we batch up chunks of
1913 * MARK key value ... key value SETITEMS
1914 * opcode sequences. Calling code should have arranged to first create an
1915 * empty dict, or dict-like object, for the SETITEMS to operate on.
1916 * Returns 0 on success, -1 on error.
1917 *
1918 * Note that this currently doesn't work for protocol 0.
1919 */
1920static int
1921batch_dict_exact(Picklerobject *self, PyObject *obj)
1922{
1923 PyObject *key = NULL, *value = NULL;
1924 int i;
1925 Py_ssize_t dict_size, ppos = 0;
1926
1927 static char setitem = SETITEM;
1928 static char setitems = SETITEMS;
1929
1930 assert(obj != NULL);
1931 assert(self->proto > 0);
1932
1933 dict_size = PyDict_Size(obj);
1934
1935 /* Special-case len(d) == 1 to save space. */
1936 if (dict_size == 1) {
1937 PyDict_Next(obj, &ppos, &key, &value);
1938 if (save(self, key, 0) < 0)
1939 return -1;
1940 if (save(self, value, 0) < 0)
1941 return -1;
1942 if (self->write_func(self, &setitem, 1) < 0)
1943 return -1;
1944 return 0;
1945 }
1946
1947 /* Write in batches of BATCHSIZE. */
1948 do {
1949 i = 0;
1950 if (self->write_func(self, &MARKv, 1) < 0)
1951 return -1;
1952 while (PyDict_Next(obj, &ppos, &key, &value)) {
1953 if (save(self, key, 0) < 0)
1954 return -1;
1955 if (save(self, value, 0) < 0)
1956 return -1;
1957 if (++i == BATCHSIZE)
1958 break;
1959 }
1960 if (self->write_func(self, &setitems, 1) < 0)
1961 return -1;
1962 if (PyDict_Size(obj) != dict_size) {
1963 PyErr_Format(
1964 PyExc_RuntimeError,
1965 "dictionary changed size during iteration");
1966 return -1;
1967 }
1968
1969 } while (i == BATCHSIZE);
1970 return 0;
1971}
1972
1973static int
1974save_dict(Picklerobject *self, PyObject *args)
1975{
1976 int res = -1;
1977 char s[3];
1978 Py_ssize_t len;
1979
1980 if (self->fast && !fast_save_enter(self, args))
1981 goto finally;
1982
1983 /* Create an empty dict. */
1984 if (self->bin) {
1985 s[0] = EMPTY_DICT;
1986 len = 1;
1987 }
1988 else {
1989 s[0] = MARK;
1990 s[1] = DICT;
1991 len = 2;
1992 }
1993
1994 if (self->write_func(self, s, len) < 0)
1995 goto finally;
1996
1997 /* Get dict size, and bow out early if empty. */
1998 if ((len = PyDict_Size(args)) < 0)
1999 goto finally;
2000
2001 if (len == 0) {
2002 if (put(self, args) >= 0)
2003 res = 0;
2004 goto finally;
2005 }
2006 if (put2(self, args) < 0)
2007 goto finally;
2008
2009 /* Materialize the dict items. */
2010 if (PyDict_CheckExact(args) && self->proto > 0) {
2011 /* We can take certain shortcuts if we know this is a dict and
2012 not a dict subclass. */
2013 if (Py_EnterRecursiveCall(" while pickling an object") == 0) {
2014 res = batch_dict_exact(self, args);
2015 Py_LeaveRecursiveCall();
2016 }
2017 } else {
2018 PyObject *iter = PyObject_CallMethod(args, "iteritems", "()");
2019 if (iter == NULL)
2020 goto finally;
2021 if (Py_EnterRecursiveCall(" while pickling an object") == 0) {
2022 res = batch_dict(self, iter);
2023 Py_LeaveRecursiveCall();
2024 }
2025 Py_DECREF(iter);
2026 }
2027
2028 finally:
2029 if (self->fast && !fast_save_leave(self, args))
2030 res = -1;
2031
2032 return res;
2033}
2034
2035
2036static int
2037save_inst(Picklerobject *self, PyObject *args)
2038{
2039 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
2040 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
2041 char *module_str, *name_str;
2042 int module_size, name_size, res = -1;
2043
2044 static char inst = INST, obj = OBJ, build = BUILD;
2045
2046 if (self->fast && !fast_save_enter(self, args))
2047 goto finally;
2048
2049 if (self->write_func(self, &MARKv, 1) < 0)
2050 goto finally;
2051
2052 if (!( class = PyObject_GetAttr(args, __class___str)))
2053 goto finally;
2054
2055 if (self->bin) {
2056 if (save(self, class, 0) < 0)
2057 goto finally;
2058 }
2059
2060 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
2061 PyObject *element = 0;
2062 Py_ssize_t i, len;
2063
2064 if (!( class_args =
2065 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
2066 goto finally;
2067
2068 if ((len = PyObject_Size(class_args)) < 0)
2069 goto finally;
2070
2071 for (i = 0; i < len; i++) {
2072 if (!( element = PySequence_GetItem(class_args, i)))
2073 goto finally;
2074
2075 if (save(self, element, 0) < 0) {
2076 Py_DECREF(element);
2077 goto finally;
2078 }
2079
2080 Py_DECREF(element);
2081 }
2082 }
2083 else {
2084 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2085 PyErr_Clear();
2086 else
2087 goto finally;
2088 }
2089
2090 if (!self->bin) {
2091 if (!( name = ((PyClassObject *)class)->cl_name )) {
2092 PyErr_SetString(PicklingError, "class has no name");
2093 goto finally;
2094 }
2095
2096 if (!( module = whichmodule(class, name)))
2097 goto finally;
2098
2099
2100 if ((module_size = PyString_Size(module)) < 0 ||
2101 (name_size = PyString_Size(name)) < 0)
2102 goto finally;
2103
2104 module_str = PyString_AS_STRING((PyStringObject *)module);
2105 name_str = PyString_AS_STRING((PyStringObject *)name);
2106
2107 if (self->write_func(self, &inst, 1) < 0)
2108 goto finally;
2109
2110 if (self->write_func(self, module_str, module_size) < 0)
2111 goto finally;
2112
2113 if (self->write_func(self, "\n", 1) < 0)
2114 goto finally;
2115
2116 if (self->write_func(self, name_str, name_size) < 0)
2117 goto finally;
2118
2119 if (self->write_func(self, "\n", 1) < 0)
2120 goto finally;
2121 }
2122 else if (self->write_func(self, &obj, 1) < 0) {
2123 goto finally;
2124 }
2125
2126 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
2127 state = PyObject_Call(getstate_func, empty_tuple, NULL);
2128 if (!state)
2129 goto finally;
2130 }
2131 else {
2132 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2133 PyErr_Clear();
2134 else
2135 goto finally;
2136
2137 if (!( state = PyObject_GetAttr(args, __dict___str))) {
2138 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2139 PyErr_Clear();
2140 else
2141 goto finally;
2142 res = 0;
2143 goto finally;
2144 }
2145 }
2146
2147 if (!PyDict_Check(state)) {
2148 if (put2(self, args) < 0)
2149 goto finally;
2150 }
2151 else {
2152 if (put(self, args) < 0)
2153 goto finally;
2154 }
2155
2156 if (save(self, state, 0) < 0)
2157 goto finally;
2158
2159 if (self->write_func(self, &build, 1) < 0)
2160 goto finally;
2161
2162 res = 0;
2163
2164 finally:
2165 if (self->fast && !fast_save_leave(self, args))
2166 res = -1;
2167
2168 Py_XDECREF(module);
2169 Py_XDECREF(class);
2170 Py_XDECREF(state);
2171 Py_XDECREF(getinitargs_func);
2172 Py_XDECREF(getstate_func);
2173 Py_XDECREF(class_args);
2174
2175 return res;
2176}
2177
2178
2179static int
2180save_global(Picklerobject *self, PyObject *args, PyObject *name)
2181{
2182 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
2183 char *name_str, *module_str;
2184 int module_size, name_size, res = -1;
2185
2186 static char global = GLOBAL;
2187
2188 if (name) {
2189 global_name = name;
2190 Py_INCREF(global_name);
2191 }
2192 else {
2193 if (!( global_name = PyObject_GetAttr(args, __name___str)))
2194 goto finally;
2195 }
2196
2197 if (!( module = whichmodule(args, global_name)))
2198 goto finally;
2199
2200 if ((module_size = PyString_Size(module)) < 0 ||
2201 (name_size = PyString_Size(global_name)) < 0)
2202 goto finally;
2203
2204 module_str = PyString_AS_STRING((PyStringObject *)module);
2205 name_str = PyString_AS_STRING((PyStringObject *)global_name);
2206
2207 /* XXX This can be doing a relative import. Clearly it shouldn't,
2208 but I don't know how to stop it. :-( */
2209 mod = PyImport_ImportModule(module_str);
2210 if (mod == NULL) {
2211 cPickle_ErrFormat(PicklingError,
2212 "Can't pickle %s: import of module %s "
2213 "failed",
2214 "OS", args, module);
2215 goto finally;
2216 }
2217 klass = PyObject_GetAttrString(mod, name_str);
2218 if (klass == NULL) {
2219 cPickle_ErrFormat(PicklingError,
2220 "Can't pickle %s: attribute lookup %s.%s "
2221 "failed",
2222 "OSS", args, module, global_name);
2223 goto finally;
2224 }
2225 if (klass != args) {
2226 Py_DECREF(klass);
2227 cPickle_ErrFormat(PicklingError,
2228 "Can't pickle %s: it's not the same object "
2229 "as %s.%s",
2230 "OSS", args, module, global_name);
2231 goto finally;
2232 }
2233 Py_DECREF(klass);
2234
2235 if (self->proto >= 2) {
2236 /* See whether this is in the extension registry, and if
2237 * so generate an EXT opcode.
2238 */
2239 PyObject *py_code; /* extension code as Python object */
2240 long code; /* extension code as C value */
2241 char c_str[5];
2242 int n;
2243
2244 PyTuple_SET_ITEM(two_tuple, 0, module);
2245 PyTuple_SET_ITEM(two_tuple, 1, global_name);
2246 py_code = PyDict_GetItem(extension_registry, two_tuple);
2247 if (py_code == NULL)
2248 goto gen_global; /* not registered */
2249
2250 /* Verify py_code has the right type and value. */
2251 if (!PyInt_Check(py_code)) {
2252 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
2253 "extension code %s isn't an integer",
2254 "OO", args, py_code);
2255 goto finally;
2256 }
2257 code = PyInt_AS_LONG(py_code);
2258 if (code <= 0 || code > 0x7fffffffL) {
2259 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
2260 "extension code %ld is out of range",
2261 "Ol", args, code);
2262 goto finally;
2263 }
2264
2265 /* Generate an EXT opcode. */
2266 if (code <= 0xff) {
2267 c_str[0] = EXT1;
2268 c_str[1] = (char)code;
2269 n = 2;
2270 }
2271 else if (code <= 0xffff) {
2272 c_str[0] = EXT2;
2273 c_str[1] = (char)(code & 0xff);
2274 c_str[2] = (char)((code >> 8) & 0xff);
2275 n = 3;
2276 }
2277 else {
2278 c_str[0] = EXT4;
2279 c_str[1] = (char)(code & 0xff);
2280 c_str[2] = (char)((code >> 8) & 0xff);
2281 c_str[3] = (char)((code >> 16) & 0xff);
2282 c_str[4] = (char)((code >> 24) & 0xff);
2283 n = 5;
2284 }
2285
2286 if (self->write_func(self, c_str, n) >= 0)
2287 res = 0;
2288 goto finally; /* and don't memoize */
2289 }
2290
2291 gen_global:
2292 if (self->write_func(self, &global, 1) < 0)
2293 goto finally;
2294
2295 if (self->write_func(self, module_str, module_size) < 0)
2296 goto finally;
2297
2298 if (self->write_func(self, "\n", 1) < 0)
2299 goto finally;
2300
2301 if (self->write_func(self, name_str, name_size) < 0)
2302 goto finally;
2303
2304 if (self->write_func(self, "\n", 1) < 0)
2305 goto finally;
2306
2307 if (put(self, args) < 0)
2308 goto finally;
2309
2310 res = 0;
2311
2312 finally:
2313 Py_XDECREF(module);
2314 Py_XDECREF(global_name);
2315 Py_XDECREF(mod);
2316
2317 return res;
2318}
2319
2320static int
2321save_pers(Picklerobject *self, PyObject *args, PyObject *f)
2322{
2323 PyObject *pid = 0;
2324 Py_ssize_t size;
2325 int res = -1;
2326
2327 static char persid = PERSID, binpersid = BINPERSID;
2328
2329 Py_INCREF(args);
2330 ARG_TUP(self, args);
2331 if (self->arg) {
2332 pid = PyObject_Call(f, self->arg, NULL);
2333 FREE_ARG_TUP(self);
2334 }
2335 if (! pid) return -1;
2336
2337 if (pid != Py_None) {
2338 if (!self->bin) {
2339 if (!PyString_Check(pid)) {
2340 PyErr_SetString(PicklingError,
2341 "persistent id must be string");
2342 goto finally;
2343 }
2344
2345 if (self->write_func(self, &persid, 1) < 0)
2346 goto finally;
2347
2348 if ((size = PyString_Size(pid)) < 0)
2349 goto finally;
2350
2351 if (self->write_func(self,
2352 PyString_AS_STRING(
2353 (PyStringObject *)pid),
2354 size) < 0)
2355 goto finally;
2356
2357 if (self->write_func(self, "\n", 1) < 0)
2358 goto finally;
2359
2360 res = 1;
2361 goto finally;
2362 }
2363 else if (save(self, pid, 1) >= 0) {
2364 if (self->write_func(self, &binpersid, 1) < 0)
2365 res = -1;
2366 else
2367 res = 1;
2368 }
2369
2370 goto finally;
2371 }
2372
2373 res = 0;
2374
2375 finally:
2376 Py_XDECREF(pid);
2377
2378 return res;
2379}
2380
2381/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2382 * appropriate __reduce__ method for ob.
2383 */
2384static int
2385save_reduce(Picklerobject *self, PyObject *args, PyObject *fn, PyObject *ob)
2386{
2387 PyObject *callable;
2388 PyObject *argtup;
2389 PyObject *state = NULL;
2390 PyObject *listitems = Py_None;
2391 PyObject *dictitems = Py_None;
2392 Py_ssize_t size;
2393
2394 int use_newobj = self->proto >= 2;
2395
2396 static char reduce = REDUCE;
2397 static char build = BUILD;
2398 static char newobj = NEWOBJ;
2399
2400 size = PyTuple_Size(args);
2401 if (size < 2 || size > 5) {
2402 cPickle_ErrFormat(PicklingError, "tuple returned by "
2403 "%s must contain 2 through 5 elements",
2404 "O", fn);
2405 return -1;
2406 }
2407
2408 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2409 &callable,
2410 &argtup,
2411 &state,
2412 &listitems,
2413 &dictitems))
2414 return -1;
2415
2416 if (!PyTuple_Check(argtup)) {
2417 cPickle_ErrFormat(PicklingError, "Second element of "
2418 "tuple returned by %s must be a tuple",
2419 "O", fn);
2420 return -1;
2421 }
2422
2423 if (state == Py_None)
2424 state = NULL;
2425
2426 if (listitems == Py_None)
2427 listitems = NULL;
2428 else if (!PyIter_Check(listitems)) {
2429 cPickle_ErrFormat(PicklingError, "Fourth element of "
2430 "tuple returned by %s must be an iterator, not %s",
2431 "Os", fn, Py_TYPE(listitems)->tp_name);
2432 return -1;
2433 }
2434
2435 if (dictitems == Py_None)
2436 dictitems = NULL;
2437 else if (!PyIter_Check(dictitems)) {
2438 cPickle_ErrFormat(PicklingError, "Fifth element of "
2439 "tuple returned by %s must be an iterator, not %s",
2440 "Os", fn, Py_TYPE(dictitems)->tp_name);
2441 return -1;
2442 }
2443
2444 /* Protocol 2 special case: if callable's name is __newobj__, use
2445 * NEWOBJ. This consumes a lot of code.
2446 */
2447 if (use_newobj) {
2448 PyObject *temp = PyObject_GetAttr(callable, __name___str);
2449
2450 if (temp == NULL) {
2451 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2452 PyErr_Clear();
2453 else
2454 return -1;
2455 use_newobj = 0;
2456 }
2457 else {
2458 use_newobj = PyString_Check(temp) &&
2459 strcmp(PyString_AS_STRING(temp),
2460 "__newobj__") == 0;
2461 Py_DECREF(temp);
2462 }
2463 }
2464 if (use_newobj) {
2465 PyObject *cls;
2466 PyObject *newargtup;
2467 Py_ssize_t n, i;
2468
2469 /* Sanity checks. */
2470 n = PyTuple_Size(argtup);
2471 if (n < 1) {
2472 PyErr_SetString(PicklingError, "__newobj__ arglist "
2473 "is empty");
2474 return -1;
2475 }
2476
2477 cls = PyTuple_GET_ITEM(argtup, 0);
2478 if (! PyObject_HasAttrString(cls, "__new__")) {
2479 PyErr_SetString(PicklingError, "args[0] from "
2480 "__newobj__ args has no __new__");
2481 return -1;
2482 }
2483
2484 /* XXX How could ob be NULL? */
2485 if (ob != NULL) {
2486 PyObject *ob_dot_class;
2487
2488 ob_dot_class = PyObject_GetAttr(ob, __class___str);
2489 if (ob_dot_class == NULL) {
2490 if (PyErr_ExceptionMatches(
2491 PyExc_AttributeError))
2492 PyErr_Clear();
2493 else
2494 return -1;
2495 }
2496 i = ob_dot_class != cls; /* true iff a problem */
2497 Py_XDECREF(ob_dot_class);
2498 if (i) {
2499 PyErr_SetString(PicklingError, "args[0] from "
2500 "__newobj__ args has the wrong class");
2501 return -1;
2502 }
2503 }
2504
2505 /* Save the class and its __new__ arguments. */
2506 if (save(self, cls, 0) < 0)
2507 return -1;
2508
2509 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2510 if (newargtup == NULL)
2511 return -1;
2512 for (i = 1; i < n; ++i) {
2513 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2514 Py_INCREF(temp);
2515 PyTuple_SET_ITEM(newargtup, i-1, temp);
2516 }
2517 i = save(self, newargtup, 0);
2518 Py_DECREF(newargtup);
2519 if (i < 0)
2520 return -1;
2521
2522 /* Add NEWOBJ opcode. */
2523 if (self->write_func(self, &newobj, 1) < 0)
2524 return -1;
2525 }
2526 else {
2527 /* Not using NEWOBJ. */
2528 if (save(self, callable, 0) < 0 ||
2529 save(self, argtup, 0) < 0 ||
2530 self->write_func(self, &reduce, 1) < 0)
2531 return -1;
2532 }
2533
2534 /* Memoize. */
2535 /* XXX How can ob be NULL? */
2536 if (ob != NULL) {
2537 if (state && !PyDict_Check(state)) {
2538 if (put2(self, ob) < 0)
2539 return -1;
2540 }
2541 else if (put(self, ob) < 0)
2542 return -1;
2543 }
2544
2545
2546 if (listitems && batch_list(self, listitems) < 0)
2547 return -1;
2548
2549 if (dictitems && batch_dict(self, dictitems) < 0)
2550 return -1;
2551
2552 if (state) {
2553 if (save(self, state, 0) < 0 ||
2554 self->write_func(self, &build, 1) < 0)
2555 return -1;
2556 }
2557
2558 return 0;
2559}
2560
2561static int
2562save(Picklerobject *self, PyObject *args, int pers_save)
2563{
2564 PyTypeObject *type;
2565 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2566 int res = -1;
2567 int tmp;
2568
2569 if (Py_EnterRecursiveCall(" while pickling an object"))
2570 return -1;
2571
2572 if (!pers_save && self->pers_func) {
2573 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2574 res = tmp;
2575 goto finally;
2576 }
2577 }
2578
2579 if (args == Py_None) {
2580 res = save_none(self, args);
2581 goto finally;
2582 }
2583
2584 type = Py_TYPE(args);
2585
2586 switch (type->tp_name[0]) {
2587 case 'b':
2588 if (args == Py_False || args == Py_True) {
2589 res = save_bool(self, args);
2590 goto finally;
2591 }
2592 break;
2593 case 'i':
2594 if (type == &PyInt_Type) {
2595 res = save_int(self, args);
2596 goto finally;
2597 }
2598 break;
2599
2600 case 'l':
2601 if (type == &PyLong_Type) {
2602 res = save_long(self, args);
2603 goto finally;
2604 }
2605 break;
2606
2607 case 'f':
2608 if (type == &PyFloat_Type) {
2609 res = save_float(self, args);
2610 goto finally;
2611 }
2612 break;
2613
2614 case 't':
2615 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2616 res = save_tuple(self, args);
2617 goto finally;
2618 }
2619 break;
2620
2621 case 's':
2622 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2623 res = save_string(self, args, 0);
2624 goto finally;
2625 }
2626 break;
2627
2628#ifdef Py_USING_UNICODE
2629 case 'u':
2630 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2631 res = save_unicode(self, args, 0);
2632 goto finally;
2633 }
2634 break;
2635#endif
2636 }
2637
2638 if (Py_REFCNT(args) > 1) {
2639 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
2640 goto finally;
2641
2642 if (PyDict_GetItem(self->memo, py_ob_id)) {
2643 if (get(self, py_ob_id) < 0)
2644 goto finally;
2645
2646 res = 0;
2647 goto finally;
2648 }
2649 }
2650
2651 switch (type->tp_name[0]) {
2652 case 's':
2653 if (type == &PyString_Type) {
2654 res = save_string(self, args, 1);
2655 goto finally;
2656 }
2657 break;
2658
2659#ifdef Py_USING_UNICODE
2660 case 'u':
2661 if (type == &PyUnicode_Type) {
2662 res = save_unicode(self, args, 1);
2663 goto finally;
2664 }
2665 break;
2666#endif
2667
2668 case 't':
2669 if (type == &PyTuple_Type) {
2670 res = save_tuple(self, args);
2671 goto finally;
2672 }
2673 if (type == &PyType_Type) {
2674 res = save_global(self, args, NULL);
2675 goto finally;
2676 }
2677 break;
2678
2679 case 'l':
2680 if (type == &PyList_Type) {
2681 res = save_list(self, args);
2682 goto finally;
2683 }
2684 break;
2685
2686 case 'd':
2687 if (type == &PyDict_Type) {
2688 res = save_dict(self, args);
2689 goto finally;
2690 }
2691 break;
2692
2693 case 'i':
2694 if (type == &PyInstance_Type) {
2695 res = save_inst(self, args);
2696 goto finally;
2697 }
2698 break;
2699
2700 case 'c':
2701 if (type == &PyClass_Type) {
2702 res = save_global(self, args, NULL);
2703 goto finally;
2704 }
2705 break;
2706
2707 case 'f':
2708 if (type == &PyFunction_Type) {
2709 res = save_global(self, args, NULL);
2710 if (res && PyErr_ExceptionMatches(PickleError)) {
2711 /* fall back to reduce */
2712 PyErr_Clear();
2713 break;
2714 }
2715 goto finally;
2716 }
2717 break;
2718
2719 case 'b':
2720 if (type == &PyCFunction_Type) {
2721 res = save_global(self, args, NULL);
2722 goto finally;
2723 }
2724 }
2725
2726 if (!pers_save && self->inst_pers_func) {
2727 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2728 res = tmp;
2729 goto finally;
2730 }
2731 }
2732
2733 /* Get a reduction callable, and call it. This may come from
2734 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2735 * or the object's __reduce__ method.
2736 */
2737 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2738 if (__reduce__ != NULL) {
2739 Py_INCREF(__reduce__);
2740 Py_INCREF(args);
2741 ARG_TUP(self, args);
2742 if (self->arg) {
2743 t = PyObject_Call(__reduce__, self->arg, NULL);
2744 FREE_ARG_TUP(self);
2745 }
2746 }
2747 else {
2748 if (PyType_IsSubtype(type, &PyType_Type)) {
2749 res = save_global(self, args, NULL);
2750 goto finally;
2751 }
2752
2753 /* Check for a __reduce_ex__ method. */
2754 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2755 if (__reduce__ != NULL) {
2756 t = PyInt_FromLong(self->proto);
2757 if (t != NULL) {
2758 ARG_TUP(self, t);
2759 t = NULL;
2760 if (self->arg) {
2761 t = PyObject_Call(__reduce__,
2762 self->arg, NULL);
2763 FREE_ARG_TUP(self);
2764 }
2765 }
2766 }
2767 else {
2768 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2769 PyErr_Clear();
2770 else
2771 goto finally;
2772 /* Check for a __reduce__ method. */
2773 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2774 if (__reduce__ != NULL) {
2775 t = PyObject_Call(__reduce__,
2776 empty_tuple, NULL);
2777 }
2778 else {
2779 PyErr_SetObject(UnpickleableError, args);
2780 goto finally;
2781 }
2782 }
2783 }
2784
2785 if (t == NULL)
2786 goto finally;
2787
2788 if (PyString_Check(t)) {
2789 res = save_global(self, args, t);
2790 goto finally;
2791 }
2792
2793 if (!PyTuple_Check(t)) {
2794 cPickle_ErrFormat(PicklingError, "Value returned by "
2795 "%s must be string or tuple",
2796 "O", __reduce__);
2797 goto finally;
2798 }
2799
2800 res = save_reduce(self, t, __reduce__, args);
2801
2802 finally:
2803 Py_LeaveRecursiveCall();
2804 Py_XDECREF(py_ob_id);
2805 Py_XDECREF(__reduce__);
2806 Py_XDECREF(t);
2807
2808 return res;
2809}
2810
2811
2812static int
2813dump(Picklerobject *self, PyObject *args)
2814{
2815 static char stop = STOP;
2816
2817 if (self->proto >= 2) {
2818 char bytes[2];
2819
2820 bytes[0] = PROTO;
2821 assert(self->proto >= 0 && self->proto < 256);
2822 bytes[1] = (char)self->proto;
2823 if (self->write_func(self, bytes, 2) < 0)
2824 return -1;
2825 }
2826
2827 if (save(self, args, 0) < 0)
2828 return -1;
2829
2830 if (self->write_func(self, &stop, 1) < 0)
2831 return -1;
2832
2833 if (self->write_func(self, NULL, 0) < 0)
2834 return -1;
2835
2836 return 0;
2837}
2838
2839static PyObject *
2840Pickle_clear_memo(Picklerobject *self, PyObject *args)
2841{
2842 if (self->memo)
2843 PyDict_Clear(self->memo);
2844 Py_INCREF(Py_None);
2845 return Py_None;
2846}
2847
2848static PyObject *
2849Pickle_getvalue(Picklerobject *self, PyObject *args)
2850{
2851 Py_ssize_t l, i, rsize, ssize, clear=1, lm;
2852 long ik;
2853 PyObject *k, *r;
2854 char *s, *p, *have_get;
2855 Pdata *data;
2856
2857 /* Can be called by Python code or C code */
2858 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2859 return NULL;
2860
2861 /* Check to make sure we are based on a list */
2862 if (! Pdata_Check(self->file)) {
2863 PyErr_SetString(PicklingError,
2864 "Attempt to getvalue() a non-list-based pickler");
2865 return NULL;
2866 }
2867
2868 /* flush write buffer */
2869 if (write_other(self, NULL, 0) < 0) return NULL;
2870
2871 data=(Pdata*)self->file;
2872 l=data->length;
2873
2874 /* set up an array to hold get/put status */
2875 lm = PyDict_Size(self->memo);
2876 if (lm < 0) return NULL;
2877 lm++;
2878 have_get = malloc(lm);
2879 if (have_get == NULL) return PyErr_NoMemory();
2880 memset(have_get, 0, lm);
2881
2882 /* Scan for gets. */
2883 for (rsize = 0, i = l; --i >= 0; ) {
2884 k = data->data[i];
2885
2886 if (PyString_Check(k))
2887 rsize += PyString_GET_SIZE(k);
2888
2889 else if (PyInt_Check(k)) { /* put */
2890 ik = PyInt_AS_LONG((PyIntObject*)k);
2891 if (ik >= lm || ik == 0) {
2892 PyErr_SetString(PicklingError,
2893 "Invalid get data");
2894 goto err;
2895 }
2896 if (have_get[ik]) /* with matching get */
2897 rsize += ik < 256 ? 2 : 5;
2898 }
2899
2900 else if (! (PyTuple_Check(k) &&
2901 PyTuple_GET_SIZE(k) == 2 &&
2902 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
2903 ) {
2904 PyErr_SetString(PicklingError,
2905 "Unexpected data in internal list");
2906 goto err;
2907 }
2908
2909 else { /* put */
2910 ik = PyInt_AS_LONG((PyIntObject *)k);
2911 if (ik >= lm || ik == 0) {
2912 PyErr_SetString(PicklingError,
2913 "Invalid get data");
2914 return NULL;
2915 }
2916 have_get[ik] = 1;
2917 rsize += ik < 256 ? 2 : 5;
2918 }
2919 }
2920
2921 /* Now generate the result */
2922 r = PyString_FromStringAndSize(NULL, rsize);
2923 if (r == NULL) goto err;
2924 s = PyString_AS_STRING((PyStringObject *)r);
2925
2926 for (i = 0; i < l; i++) {
2927 k = data->data[i];
2928
2929 if (PyString_Check(k)) {
2930 ssize = PyString_GET_SIZE(k);
2931 if (ssize) {
2932 p=PyString_AS_STRING((PyStringObject *)k);
2933 while (--ssize >= 0)
2934 *s++ = *p++;
2935 }
2936 }
2937
2938 else if (PyTuple_Check(k)) { /* get */
2939 ik = PyInt_AS_LONG((PyIntObject *)
2940 PyTuple_GET_ITEM(k, 0));
2941 if (ik < 256) {
2942 *s++ = BINGET;
2943 *s++ = (int)(ik & 0xff);
2944 }
2945 else {
2946 *s++ = LONG_BINGET;
2947 *s++ = (int)(ik & 0xff);
2948 *s++ = (int)((ik >> 8) & 0xff);
2949 *s++ = (int)((ik >> 16) & 0xff);
2950 *s++ = (int)((ik >> 24) & 0xff);
2951 }
2952 }
2953
2954 else { /* put */
2955 ik = PyInt_AS_LONG((PyIntObject*)k);
2956
2957 if (have_get[ik]) { /* with matching get */
2958 if (ik < 256) {
2959 *s++ = BINPUT;
2960 *s++ = (int)(ik & 0xff);
2961 }
2962 else {
2963 *s++ = LONG_BINPUT;
2964 *s++ = (int)(ik & 0xff);
2965 *s++ = (int)((ik >> 8) & 0xff);
2966 *s++ = (int)((ik >> 16) & 0xff);
2967 *s++ = (int)((ik >> 24) & 0xff);
2968 }
2969 }
2970 }
2971 }
2972
2973 if (clear) {
2974 PyDict_Clear(self->memo);
2975 Pdata_clear(data, 0);
2976 }
2977
2978 free(have_get);
2979 return r;
2980 err:
2981 free(have_get);
2982 return NULL;
2983}
2984
2985static PyObject *
2986Pickler_dump(Picklerobject *self, PyObject *args)
2987{
2988 PyObject *ob;
2989 int get=0;
2990
2991 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
2992 return NULL;
2993
2994 if (dump(self, ob) < 0)
2995 return NULL;
2996
2997 if (get) return Pickle_getvalue(self, NULL);
2998
2999 /* XXX Why does dump() return self? */
3000 Py_INCREF(self);
3001 return (PyObject*)self;
3002}
3003
3004
3005static struct PyMethodDef Pickler_methods[] =
3006{
3007 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
3008 PyDoc_STR("dump(object) -- "
3009 "Write an object in pickle format to the object's pickle stream")},
3010 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
3011 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
3012 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
3013 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
3014 {NULL, NULL} /* sentinel */
3015};
3016
3017
3018static Picklerobject *
3019newPicklerobject(PyObject *file, int proto)
3020{
3021 Picklerobject *self;
3022
3023 if (proto < 0)
3024 proto = HIGHEST_PROTOCOL;
3025 if (proto > HIGHEST_PROTOCOL) {
3026 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
3027 "the highest available protocol is %d",
3028 proto, HIGHEST_PROTOCOL);
3029 return NULL;
3030 }
3031
3032 self = PyObject_GC_New(Picklerobject, &Picklertype);
3033 if (self == NULL)
3034 return NULL;
3035 self->proto = proto;
3036 self->bin = proto > 0;
3037 self->fp = NULL;
3038 self->write = NULL;
3039 self->memo = NULL;
3040 self->arg = NULL;
3041 self->pers_func = NULL;
3042 self->inst_pers_func = NULL;
3043 self->write_buf = NULL;
3044 self->fast = 0;
3045 self->fast_container = 0;
3046 self->fast_memo = NULL;
3047 self->buf_size = 0;
3048 self->dispatch_table = NULL;
3049
3050 self->file = NULL;
3051 if (file)
3052 Py_INCREF(file);
3053 else {
3054 file = Pdata_New();
3055 if (file == NULL)
3056 goto err;
3057 }
3058 self->file = file;
3059
3060 if (!( self->memo = PyDict_New()))
3061 goto err;
3062
3063 if (PyFile_Check(file)) {
3064 self->fp = PyFile_AsFile(file);
3065 if (self->fp == NULL) {
3066 PyErr_SetString(PyExc_ValueError,
3067 "I/O operation on closed file");
3068 goto err;
3069 }
3070 self->write_func = write_file;
3071 }
3072 else if (PycStringIO_OutputCheck(file)) {
3073 self->write_func = write_cStringIO;
3074 }
3075 else if (file == Py_None) {
3076 self->write_func = write_none;
3077 }
3078 else {
3079 self->write_func = write_other;
3080
3081 if (! Pdata_Check(file)) {
3082 self->write = PyObject_GetAttr(file, write_str);
3083 if (!self->write) {
3084 PyErr_Clear();
3085 PyErr_SetString(PyExc_TypeError,
3086 "argument must have 'write' "
3087 "attribute");
3088 goto err;
3089 }
3090 }
3091
3092 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
3093 if (self->write_buf == NULL) {
3094 PyErr_NoMemory();
3095 goto err;
3096 }
3097 }
3098
3099 if (PyEval_GetRestricted()) {
3100 /* Restricted execution, get private tables */
3101 PyObject *m = PyImport_ImportModule("copy_reg");
3102
3103 if (m == NULL)
3104 goto err;
3105 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
3106 Py_DECREF(m);
3107 if (self->dispatch_table == NULL)
3108 goto err;
3109 }
3110 else {
3111 self->dispatch_table = dispatch_table;
3112 Py_INCREF(dispatch_table);
3113 }
3114 PyObject_GC_Track(self);
3115
3116 return self;
3117
3118 err:
3119 Py_DECREF(self);
3120 return NULL;
3121}
3122
3123
3124static PyObject *
3125get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
3126{
3127 static char *kwlist[] = {"file", "protocol", NULL};
3128 PyObject *file = NULL;
3129 int proto = 0;
3130
3131 /* XXX
3132 * The documented signature is Pickler(file, protocol=0), but this
3133 * accepts Pickler() and Pickler(integer) too. The meaning then
3134 * is clear as mud, undocumented, and not supported by pickle.py.
3135 * I'm told Zope uses this, but I haven't traced into this code
3136 * far enough to figure out what it means.
3137 */
3138 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
3139 PyErr_Clear();
3140 proto = 0;
3141 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
3142 kwlist, &file, &proto))
3143 return NULL;
3144 }
3145 return (PyObject *)newPicklerobject(file, proto);
3146}
3147
3148
3149static void
3150Pickler_dealloc(Picklerobject *self)
3151{
3152 PyObject_GC_UnTrack(self);
3153 Py_XDECREF(self->write);
3154 Py_XDECREF(self->memo);
3155 Py_XDECREF(self->fast_memo);
3156 Py_XDECREF(self->arg);
3157 Py_XDECREF(self->file);
3158 Py_XDECREF(self->pers_func);
3159 Py_XDECREF(self->inst_pers_func);
3160 Py_XDECREF(self->dispatch_table);
3161 PyMem_Free(self->write_buf);
3162 Py_TYPE(self)->tp_free((PyObject *)self);
3163}
3164
3165static int
3166Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
3167{
3168 Py_VISIT(self->write);
3169 Py_VISIT(self->memo);
3170 Py_VISIT(self->fast_memo);
3171 Py_VISIT(self->arg);
3172 Py_VISIT(self->file);
3173 Py_VISIT(self->pers_func);
3174 Py_VISIT(self->inst_pers_func);
3175 Py_VISIT(self->dispatch_table);
3176 return 0;
3177}
3178
3179static int
3180Pickler_clear(Picklerobject *self)
3181{
3182 Py_CLEAR(self->write);
3183 Py_CLEAR(self->memo);
3184 Py_CLEAR(self->fast_memo);
3185 Py_CLEAR(self->arg);
3186 Py_CLEAR(self->file);
3187 Py_CLEAR(self->pers_func);
3188 Py_CLEAR(self->inst_pers_func);
3189 Py_CLEAR(self->dispatch_table);
3190 return 0;
3191}
3192
3193static PyObject *
3194Pickler_get_pers_func(Picklerobject *p)
3195{
3196 if (p->pers_func == NULL)
3197 PyErr_SetString(PyExc_AttributeError, "persistent_id");
3198 else
3199 Py_INCREF(p->pers_func);
3200 return p->pers_func;
3201}
3202
3203static int
3204Pickler_set_pers_func(Picklerobject *p, PyObject *v)
3205{
3206 if (v == NULL) {
3207 PyErr_SetString(PyExc_TypeError,
3208 "attribute deletion is not supported");
3209 return -1;
3210 }
3211 Py_XDECREF(p->pers_func);
3212 Py_INCREF(v);
3213 p->pers_func = v;
3214 return 0;
3215}
3216
3217static int
3218Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
3219{
3220 if (v == NULL) {
3221 PyErr_SetString(PyExc_TypeError,
3222 "attribute deletion is not supported");
3223 return -1;
3224 }
3225 Py_XDECREF(p->inst_pers_func);
3226 Py_INCREF(v);
3227 p->inst_pers_func = v;
3228 return 0;
3229}
3230
3231static PyObject *
3232Pickler_get_memo(Picklerobject *p)
3233{
3234 if (p->memo == NULL)
3235 PyErr_SetString(PyExc_AttributeError, "memo");
3236 else
3237 Py_INCREF(p->memo);
3238 return p->memo;
3239}
3240
3241static int
3242Pickler_set_memo(Picklerobject *p, PyObject *v)
3243{
3244 if (v == NULL) {
3245 PyErr_SetString(PyExc_TypeError,
3246 "attribute deletion is not supported");
3247 return -1;
3248 }
3249 if (!PyDict_Check(v)) {
3250 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
3251 return -1;
3252 }
3253 Py_XDECREF(p->memo);
3254 Py_INCREF(v);
3255 p->memo = v;
3256 return 0;
3257}
3258
3259static PyObject *
3260Pickler_get_error(Picklerobject *p)
3261{
3262 /* why is this an attribute on the Pickler? */
3263 Py_INCREF(PicklingError);
3264 return PicklingError;
3265}
3266
3267static PyMemberDef Pickler_members[] = {
3268 {"binary", T_INT, offsetof(Picklerobject, bin)},
3269 {"fast", T_INT, offsetof(Picklerobject, fast)},
3270 {NULL}
3271};
3272
3273static PyGetSetDef Pickler_getsets[] = {
3274 {"persistent_id", (getter)Pickler_get_pers_func,
3275 (setter)Pickler_set_pers_func},
3276 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
3277 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
3278 {"PicklingError", (getter)Pickler_get_error, NULL},
3279 {NULL}
3280};
3281
3282PyDoc_STRVAR(Picklertype__doc__,
3283"Objects that know how to pickle objects\n");
3284
3285static PyTypeObject Picklertype = {
3286 PyVarObject_HEAD_INIT(NULL, 0)
3287 "cPickle.Pickler", /*tp_name*/
3288 sizeof(Picklerobject), /*tp_basicsize*/
3289 0,
3290 (destructor)Pickler_dealloc, /* tp_dealloc */
3291 0, /* tp_print */
3292 0, /* tp_getattr */
3293 0, /* tp_setattr */
3294 0, /* tp_compare */
3295 0, /* tp_repr */
3296 0, /* tp_as_number */
3297 0, /* tp_as_sequence */
3298 0, /* tp_as_mapping */
3299 0, /* tp_hash */
3300 0, /* tp_call */
3301 0, /* tp_str */
3302 PyObject_GenericGetAttr, /* tp_getattro */
3303 PyObject_GenericSetAttr, /* tp_setattro */
3304 0, /* tp_as_buffer */
3305 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
3306 Picklertype__doc__, /* tp_doc */
3307 (traverseproc)Pickler_traverse, /* tp_traverse */
3308 (inquiry)Pickler_clear, /* tp_clear */
3309 0, /* tp_richcompare */
3310 0, /* tp_weaklistoffset */
3311 0, /* tp_iter */
3312 0, /* tp_iternext */
3313 Pickler_methods, /* tp_methods */
3314 Pickler_members, /* tp_members */
3315 Pickler_getsets, /* tp_getset */
3316};
3317
3318static PyObject *
3319find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
3320{
3321 PyObject *global = 0, *module;
3322
3323 if (fc) {
3324 if (fc==Py_None) {
3325 PyErr_SetString(UnpicklingError, "Global and instance "
3326 "pickles are not supported.");
3327 return NULL;
3328 }
3329 return PyObject_CallFunctionObjArgs(fc, py_module_name,
3330 py_global_name, NULL);
3331 }
3332
3333 module = PySys_GetObject("modules");
3334 if (module == NULL)
3335 return NULL;
3336
3337 module = PyDict_GetItem(module, py_module_name);
3338 if (module == NULL) {
3339 module = PyImport_Import(py_module_name);
3340 if (!module)
3341 return NULL;
3342 global = PyObject_GetAttr(module, py_global_name);
3343 Py_DECREF(module);
3344 }
3345 else
3346 global = PyObject_GetAttr(module, py_global_name);
3347 return global;
3348}
3349
3350static Py_ssize_t
3351marker(Unpicklerobject *self)
3352{
3353 if (self->num_marks < 1) {
3354 PyErr_SetString(UnpicklingError, "could not find MARK");
3355 return -1;
3356 }
3357
3358 return self->marks[--self->num_marks];
3359}
3360
3361
3362static int
3363load_none(Unpicklerobject *self)
3364{
3365 PDATA_APPEND(self->stack, Py_None, -1);
3366 return 0;
3367}
3368
3369static int
3370bad_readline(void)
3371{
3372 PyErr_SetString(UnpicklingError, "pickle data was truncated");
3373 return -1;
3374}
3375
3376static int
3377load_int(Unpicklerobject *self)
3378{
3379 PyObject *py_int = 0;
3380 char *endptr, *s;
3381 Py_ssize_t len;
3382 int res = -1;
3383 long l;
3384
3385 if ((len = self->readline_func(self, &s)) < 0) return -1;
3386 if (len < 2) return bad_readline();
3387 if (!( s=pystrndup(s,len))) return -1;
3388
3389 errno = 0;
3390 l = strtol(s, &endptr, 0);
3391
3392 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3393 /* Hm, maybe we've got something long. Let's try reading
3394 it as a Python long object. */
3395 errno = 0;
3396 py_int = PyLong_FromString(s, NULL, 0);
3397 if (py_int == NULL) {
3398 PyErr_SetString(PyExc_ValueError,
3399 "could not convert string to int");
3400 goto finally;
3401 }
3402 }
3403 else {
3404 if (len == 3 && (l == 0 || l == 1)) {
3405 if (!( py_int = PyBool_FromLong(l))) goto finally;
3406 }
3407 else {
3408 if (!( py_int = PyInt_FromLong(l))) goto finally;
3409 }
3410 }
3411
3412 free(s);
3413 PDATA_PUSH(self->stack, py_int, -1);
3414 return 0;
3415
3416 finally:
3417 free(s);
3418
3419 return res;
3420}
3421
3422static int
3423load_bool(Unpicklerobject *self, PyObject *boolean)
3424{
3425 assert(boolean == Py_True || boolean == Py_False);
3426 PDATA_APPEND(self->stack, boolean, -1);
3427 return 0;
3428}
3429
3430/* s contains x bytes of a little-endian integer. Return its value as a
3431 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3432 * int, but when x is 4 it's a signed one. This is an historical source
3433 * of x-platform bugs.
3434 */
3435static long
3436calc_binint(char *s, int x)
3437{
3438 unsigned char c;
3439 int i;
3440 long l;
3441
3442 for (i = 0, l = 0L; i < x; i++) {
3443 c = (unsigned char)s[i];
3444 l |= (long)c << (i * 8);
3445 }
3446#if SIZEOF_LONG > 4
3447 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3448 * is signed, so on a box with longs bigger than 4 bytes we need
3449 * to extend a BININT's sign bit to the full width.
3450 */
3451 if (x == 4 && l & (1L << 31))
3452 l |= (~0L) << 32;
3453#endif
3454 return l;
3455}
3456
3457
3458static int
3459load_binintx(Unpicklerobject *self, char *s, int x)
3460{
3461 PyObject *py_int = 0;
3462 long l;
3463
3464 l = calc_binint(s, x);
3465
3466 if (!( py_int = PyInt_FromLong(l)))
3467 return -1;
3468
3469 PDATA_PUSH(self->stack, py_int, -1);
3470 return 0;
3471}
3472
3473
3474static int
3475load_binint(Unpicklerobject *self)
3476{
3477 char *s;
3478
3479 if (self->read_func(self, &s, 4) < 0)
3480 return -1;
3481
3482 return load_binintx(self, s, 4);
3483}
3484
3485
3486static int
3487load_binint1(Unpicklerobject *self)
3488{
3489 char *s;
3490
3491 if (self->read_func(self, &s, 1) < 0)
3492 return -1;
3493
3494 return load_binintx(self, s, 1);
3495}
3496
3497
3498static int
3499load_binint2(Unpicklerobject *self)
3500{
3501 char *s;
3502
3503 if (self->read_func(self, &s, 2) < 0)
3504 return -1;
3505
3506 return load_binintx(self, s, 2);
3507}
3508
3509static int
3510load_long(Unpicklerobject *self)
3511{
3512 PyObject *l = 0;
3513 char *end, *s;
3514 Py_ssize_t len;
3515 int res = -1;
3516
3517 if ((len = self->readline_func(self, &s)) < 0) return -1;
3518 if (len < 2) return bad_readline();
3519 if (!( s=pystrndup(s,len))) return -1;
3520
3521 if (!( l = PyLong_FromString(s, &end, 0)))
3522 goto finally;
3523
3524 free(s);
3525 PDATA_PUSH(self->stack, l, -1);
3526 return 0;
3527
3528 finally:
3529 free(s);
3530
3531 return res;
3532}
3533
3534/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3535 * data following.
3536 */
3537static int
3538load_counted_long(Unpicklerobject *self, int size)
3539{
3540 Py_ssize_t i;
3541 char *nbytes;
3542 unsigned char *pdata;
3543 PyObject *along;
3544
3545 assert(size == 1 || size == 4);
3546 i = self->read_func(self, &nbytes, size);
3547 if (i < 0) return -1;
3548
3549 size = calc_binint(nbytes, size);
3550 if (size < 0) {
3551 /* Corrupt or hostile pickle -- we never write one like
3552 * this.
3553 */
3554 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
3555 "byte count");
3556 return -1;
3557 }
3558
3559 if (size == 0)
3560 along = PyLong_FromLong(0L);
3561 else {
3562 /* Read the raw little-endian bytes & convert. */
3563 i = self->read_func(self, (char **)&pdata, size);
3564 if (i < 0) return -1;
3565 along = _PyLong_FromByteArray(pdata, (size_t)size,
3566 1 /* little endian */, 1 /* signed */);
3567 }
3568 if (along == NULL)
3569 return -1;
3570 PDATA_PUSH(self->stack, along, -1);
3571 return 0;
3572}
3573
3574static int
3575load_float(Unpicklerobject *self)
3576{
3577 PyObject *py_float = 0;
3578 char *endptr, *s;
3579 Py_ssize_t len;
3580 int res = -1;
3581 double d;
3582
3583 if ((len = self->readline_func(self, &s)) < 0) return -1;
3584 if (len < 2) return bad_readline();
3585 if (!( s=pystrndup(s,len))) return -1;
3586
3587 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
3588
3589 if (d == -1.0 && PyErr_Occurred()) {
3590 goto finally;
3591 } else if ((endptr[0] != '\n') || (endptr[1] != '\0')) {
3592 PyErr_SetString(PyExc_ValueError,
3593 "could not convert string to float");
3594 goto finally;
3595 }
3596
3597 if (!( py_float = PyFloat_FromDouble(d)))
3598 goto finally;
3599
3600 free(s);
3601 PDATA_PUSH(self->stack, py_float, -1);
3602 return 0;
3603
3604 finally:
3605 free(s);
3606
3607 return res;
3608}
3609
3610static int
3611load_binfloat(Unpicklerobject *self)
3612{
3613 PyObject *py_float;
3614 double x;
3615 char *p;
3616
3617 if (self->read_func(self, &p, 8) < 0)
3618 return -1;
3619
3620 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3621 if (x == -1.0 && PyErr_Occurred())
3622 return -1;
3623
3624 py_float = PyFloat_FromDouble(x);
3625 if (py_float == NULL)
3626 return -1;
3627
3628 PDATA_PUSH(self->stack, py_float, -1);
3629 return 0;
3630}
3631
3632static int
3633load_string(Unpicklerobject *self)
3634{
3635 PyObject *str = 0;
3636 Py_ssize_t len;
3637 int res = -1;
3638 char *s, *p;
3639
3640 if ((len = self->readline_func(self, &s)) < 0) return -1;
3641 if (len < 2) return bad_readline();
3642 if (!( s=pystrndup(s,len))) return -1;
3643
3644
3645 /* Strip outermost quotes */
3646 while (len > 0 && s[len-1] <= ' ')
3647 len--;
3648 if (len > 1 && s[0]=='"' && s[len-1]=='"') {
3649 s[len-1] = '\0';
3650 p = s + 1 ;
3651 len -= 2;
3652 }
3653 else if (len > 1 && s[0]=='\'' && s[len-1]=='\'') {
3654 s[len-1] = '\0';
3655 p = s + 1 ;
3656 len -= 2;
3657 }
3658 else
3659 goto insecure;
3660 /********************************************/
3661
3662 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
3663 free(s);
3664 if (str) {
3665 PDATA_PUSH(self->stack, str, -1);
3666 res = 0;
3667 }
3668 return res;
3669
3670 insecure:
3671 free(s);
3672 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3673 return -1;
3674}
3675
3676
3677static int
3678load_binstring(Unpicklerobject *self)
3679{
3680 PyObject *py_string = 0;
3681 Py_ssize_t l;
3682 char *s;
3683
3684 if (self->read_func(self, &s, 4) < 0) return -1;
3685
3686 l = calc_binint(s, 4);
3687 if (l < 0) {
3688 /* Corrupt or hostile pickle -- we never write one like
3689 * this.
3690 */
3691 PyErr_SetString(UnpicklingError,
3692 "BINSTRING pickle has negative byte count");
3693 return -1;
3694 }
3695
3696 if (self->read_func(self, &s, l) < 0)
3697 return -1;
3698
3699 if (!( py_string = PyString_FromStringAndSize(s, l)))
3700 return -1;
3701
3702 PDATA_PUSH(self->stack, py_string, -1);
3703 return 0;
3704}
3705
3706
3707static int
3708load_short_binstring(Unpicklerobject *self)
3709{
3710 PyObject *py_string = 0;
3711 unsigned char l;
3712 char *s;
3713
3714 if (self->read_func(self, &s, 1) < 0)
3715 return -1;
3716
3717 l = (unsigned char)s[0];
3718
3719 if (self->read_func(self, &s, l) < 0) return -1;
3720
3721 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
3722
3723 PDATA_PUSH(self->stack, py_string, -1);
3724 return 0;
3725}
3726
3727
3728#ifdef Py_USING_UNICODE
3729static int
3730load_unicode(Unpicklerobject *self)
3731{
3732 PyObject *str = 0;
3733 Py_ssize_t len;
3734 char *s;
3735
3736 if ((len = self->readline_func(self, &s)) < 0) return -1;
3737 if (len < 1) return bad_readline();
3738
3739 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
3740 return -1;
3741
3742 PDATA_PUSH(self->stack, str, -1);
3743 return 0;
3744}
3745#endif
3746
3747
3748#ifdef Py_USING_UNICODE
3749static int
3750load_binunicode(Unpicklerobject *self)
3751{
3752 PyObject *unicode;
3753 Py_ssize_t l;
3754 char *s;
3755
3756 if (self->read_func(self, &s, 4) < 0) return -1;
3757
3758 l = calc_binint(s, 4);
3759 if (l < 0) {
3760 /* Corrupt or hostile pickle -- we never write one like
3761 * this.
3762 */
3763 PyErr_SetString(UnpicklingError,
3764 "BINUNICODE pickle has negative byte count");
3765 return -1;
3766 }
3767
3768 if (self->read_func(self, &s, l) < 0)
3769 return -1;
3770
3771 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
3772 return -1;
3773
3774 PDATA_PUSH(self->stack, unicode, -1);
3775 return 0;
3776}
3777#endif
3778
3779
3780static int
3781load_tuple(Unpicklerobject *self)
3782{
3783 PyObject *tup;
3784 Py_ssize_t i;
3785
3786 if ((i = marker(self)) < 0) return -1;
3787 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3788 PDATA_PUSH(self->stack, tup, -1);
3789 return 0;
3790}
3791
3792static int
3793load_counted_tuple(Unpicklerobject *self, int len)
3794{
3795 PyObject *tup = PyTuple_New(len);
3796
3797 if (tup == NULL)
3798 return -1;
3799
3800 while (--len >= 0) {
3801 PyObject *element;
3802
3803 PDATA_POP(self->stack, element);
3804 if (element == NULL)
3805 return -1;
3806 PyTuple_SET_ITEM(tup, len, element);
3807 }
3808 PDATA_PUSH(self->stack, tup, -1);
3809 return 0;
3810}
3811
3812static int
3813load_empty_list(Unpicklerobject *self)
3814{
3815 PyObject *list;
3816
3817 if (!( list=PyList_New(0))) return -1;
3818 PDATA_PUSH(self->stack, list, -1);
3819 return 0;
3820}
3821
3822static int
3823load_empty_dict(Unpicklerobject *self)
3824{
3825 PyObject *dict;
3826
3827 if (!( dict=PyDict_New())) return -1;
3828 PDATA_PUSH(self->stack, dict, -1);
3829 return 0;
3830}
3831
3832
3833static int
3834load_list(Unpicklerobject *self)
3835{
3836 PyObject *list = 0;
3837 Py_ssize_t i;
3838
3839 if ((i = marker(self)) < 0) return -1;
3840 if (!( list=Pdata_popList(self->stack, i))) return -1;
3841 PDATA_PUSH(self->stack, list, -1);
3842 return 0;
3843}
3844
3845static int
3846load_dict(Unpicklerobject *self)
3847{
3848 PyObject *dict, *key, *value;
3849 Py_ssize_t i, j, k;
3850
3851 if ((i = marker(self)) < 0) return -1;
3852 j=self->stack->length;
3853
3854 if (!( dict = PyDict_New())) return -1;
3855
3856 for (k = i+1; k < j; k += 2) {
3857 key =self->stack->data[k-1];
3858 value=self->stack->data[k ];
3859 if (PyDict_SetItem(dict, key, value) < 0) {
3860 Py_DECREF(dict);
3861 return -1;
3862 }
3863 }
3864 Pdata_clear(self->stack, i);
3865 PDATA_PUSH(self->stack, dict, -1);
3866 return 0;
3867}
3868
3869static PyObject *
3870Instance_New(PyObject *cls, PyObject *args)
3871{
3872 PyObject *r = 0;
3873
3874 if (PyClass_Check(cls)) {
3875 int l;
3876
3877 if ((l=PyObject_Size(args)) < 0) goto err;
3878 if (!( l )) {
3879 PyObject *__getinitargs__;
3880
3881 __getinitargs__ = PyObject_GetAttr(cls,
3882 __getinitargs___str);
3883 if (!__getinitargs__) {
3884 /* We have a class with no __getinitargs__,
3885 so bypass usual construction */
3886 PyObject *inst;
3887
3888 PyErr_Clear();
3889 if (!( inst=PyInstance_NewRaw(cls, NULL)))
3890 goto err;
3891 return inst;
3892 }
3893 Py_DECREF(__getinitargs__);
3894 }
3895
3896 if ((r=PyInstance_New(cls, args, NULL))) return r;
3897 else goto err;
3898 }
3899
3900 if ((r=PyObject_CallObject(cls, args))) return r;
3901
3902 err:
3903 {
3904 PyObject *tp, *v, *tb, *tmp_value;
3905
3906 PyErr_Fetch(&tp, &v, &tb);
3907 tmp_value = v;
3908 /* NULL occurs when there was a KeyboardInterrupt */
3909 if (tmp_value == NULL)
3910 tmp_value = Py_None;
3911 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
3912 Py_XDECREF(v);
3913 v=r;
3914 }
3915 PyErr_Restore(tp,v,tb);
3916 }
3917 return NULL;
3918}
3919
3920
3921static int
3922load_obj(Unpicklerobject *self)
3923{
3924 PyObject *class, *tup, *obj=0;
3925 Py_ssize_t i;
3926
3927 if ((i = marker(self)) < 0) return -1;
3928 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3929 PDATA_POP(self->stack, class);
3930 if (class) {
3931 obj = Instance_New(class, tup);
3932 Py_DECREF(class);
3933 }
3934 Py_DECREF(tup);
3935
3936 if (! obj) return -1;
3937 PDATA_PUSH(self->stack, obj, -1);
3938 return 0;
3939}
3940
3941
3942static int
3943load_inst(Unpicklerobject *self)
3944{
3945 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3946 Py_ssize_t i, len;
3947 char *s;
3948
3949 if ((i = marker(self)) < 0) return -1;
3950
3951 if ((len = self->readline_func(self, &s)) < 0) return -1;
3952 if (len < 2) return bad_readline();
3953 module_name = PyString_FromStringAndSize(s, len - 1);
3954 if (!module_name) return -1;
3955
3956 if ((len = self->readline_func(self, &s)) >= 0) {
3957 if (len < 2) return bad_readline();
3958 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3959 class = find_class(module_name, class_name,
3960 self->find_class);
3961 Py_DECREF(class_name);
3962 }
3963 }
3964 Py_DECREF(module_name);
3965
3966 if (! class) return -1;
3967
3968 if ((tup=Pdata_popTuple(self->stack, i))) {
3969 obj = Instance_New(class, tup);
3970 Py_DECREF(tup);
3971 }
3972 Py_DECREF(class);
3973
3974 if (! obj) return -1;
3975
3976 PDATA_PUSH(self->stack, obj, -1);
3977 return 0;
3978}
3979
3980static int
3981load_newobj(Unpicklerobject *self)
3982{
3983 PyObject *args = NULL;
3984 PyObject *clsraw = NULL;
3985 PyTypeObject *cls; /* clsraw cast to its true type */
3986 PyObject *obj;
3987
3988 /* Stack is ... cls argtuple, and we want to call
3989 * cls.__new__(cls, *argtuple).
3990 */
3991 PDATA_POP(self->stack, args);
3992 if (args == NULL) goto Fail;
3993 if (! PyTuple_Check(args)) {
3994 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3995 "tuple.");
3996 goto Fail;
3997 }
3998
3999 PDATA_POP(self->stack, clsraw);
4000 cls = (PyTypeObject *)clsraw;
4001 if (cls == NULL) goto Fail;
4002 if (! PyType_Check(cls)) {
4003 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
4004 "isn't a type object");
4005 goto Fail;
4006 }
4007 if (cls->tp_new == NULL) {
4008 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
4009 "has NULL tp_new");
4010 goto Fail;
4011 }
4012
4013 /* Call __new__. */
4014 obj = cls->tp_new(cls, args, NULL);
4015 if (obj == NULL) goto Fail;
4016
4017 Py_DECREF(args);
4018 Py_DECREF(clsraw);
4019 PDATA_PUSH(self->stack, obj, -1);
4020 return 0;
4021
4022 Fail:
4023 Py_XDECREF(args);
4024 Py_XDECREF(clsraw);
4025 return -1;
4026}
4027
4028static int
4029load_global(Unpicklerobject *self)
4030{
4031 PyObject *class = 0, *module_name = 0, *class_name = 0;
4032 Py_ssize_t len;
4033 char *s;
4034
4035 if ((len = self->readline_func(self, &s)) < 0) return -1;
4036 if (len < 2) return bad_readline();
4037 module_name = PyString_FromStringAndSize(s, len - 1);
4038 if (!module_name) return -1;
4039
4040 if ((len = self->readline_func(self, &s)) >= 0) {
4041 if (len < 2) {
4042 Py_DECREF(module_name);
4043 return bad_readline();
4044 }
4045 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
4046 class = find_class(module_name, class_name,
4047 self->find_class);
4048 Py_DECREF(class_name);
4049 }
4050 }
4051 Py_DECREF(module_name);
4052
4053 if (! class) return -1;
4054 PDATA_PUSH(self->stack, class, -1);
4055 return 0;
4056}
4057
4058
4059static int
4060load_persid(Unpicklerobject *self)
4061{
4062 PyObject *pid = 0;
4063 Py_ssize_t len;
4064 char *s;
4065
4066 if (self->pers_func) {
4067 if ((len = self->readline_func(self, &s)) < 0) return -1;
4068 if (len < 2) return bad_readline();
4069
4070 pid = PyString_FromStringAndSize(s, len - 1);
4071 if (!pid) return -1;
4072
4073 if (PyList_Check(self->pers_func)) {
4074 if (PyList_Append(self->pers_func, pid) < 0) {
4075 Py_DECREF(pid);
4076 return -1;
4077 }
4078 }
4079 else {
4080 ARG_TUP(self, pid);
4081 if (self->arg) {
4082 pid = PyObject_Call(self->pers_func, self->arg,
4083 NULL);
4084 FREE_ARG_TUP(self);
4085 }
4086 }
4087
4088 if (! pid) return -1;
4089
4090 PDATA_PUSH(self->stack, pid, -1);
4091 return 0;
4092 }
4093 else {
4094 PyErr_SetString(UnpicklingError,
4095 "A load persistent id instruction was encountered,\n"
4096 "but no persistent_load function was specified.");
4097 return -1;
4098 }
4099}
4100
4101static int
4102load_binpersid(Unpicklerobject *self)
4103{
4104 PyObject *pid = 0;
4105
4106 if (self->pers_func) {
4107 PDATA_POP(self->stack, pid);
4108 if (! pid) return -1;
4109
4110 if (PyList_Check(self->pers_func)) {
4111 if (PyList_Append(self->pers_func, pid) < 0) {
4112 Py_DECREF(pid);
4113 return -1;
4114 }
4115 }
4116 else {
4117 ARG_TUP(self, pid);
4118 if (self->arg) {
4119 pid = PyObject_Call(self->pers_func, self->arg,
4120 NULL);
4121 FREE_ARG_TUP(self);
4122 }
4123 if (! pid) return -1;
4124 }
4125
4126 PDATA_PUSH(self->stack, pid, -1);
4127 return 0;
4128 }
4129 else {
4130 PyErr_SetString(UnpicklingError,
4131 "A load persistent id instruction was encountered,\n"
4132 "but no persistent_load function was specified.");
4133 return -1;
4134 }
4135}
4136
4137
4138static int
4139load_pop(Unpicklerobject *self)
4140{
4141 Py_ssize_t len = self->stack->length;
4142
4143 /* Note that we split the (pickle.py) stack into two stacks,
4144 an object stack and a mark stack. We have to be clever and
4145 pop the right one. We do this by looking at the top of the
4146 mark stack first, and only signalling a stack underflow if
4147 the object stack is empty and the mark stack doesn't match
4148 our expectations.
4149 */
4150 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
4151 self->num_marks--;
4152 } else if (len > 0) {
4153 len--;
4154 Py_DECREF(self->stack->data[len]);
4155 self->stack->length = len;
4156 } else {
4157 return stackUnderflow();
4158 }
4159 return 0;
4160}
4161
4162
4163static int
4164load_pop_mark(Unpicklerobject *self)
4165{
4166 Py_ssize_t i;
4167
4168 if ((i = marker(self)) < 0)
4169 return -1;
4170
4171 Pdata_clear(self->stack, i);
4172
4173 return 0;
4174}
4175
4176
4177static int
4178load_dup(Unpicklerobject *self)
4179{
4180 PyObject *last;
4181 Py_ssize_t len;
4182
4183 if ((len = self->stack->length) <= 0) return stackUnderflow();
4184 last=self->stack->data[len-1];
4185 Py_INCREF(last);
4186 PDATA_PUSH(self->stack, last, -1);
4187 return 0;
4188}
4189
4190
4191static int
4192load_get(Unpicklerobject *self)
4193{
4194 PyObject *py_str = 0, *value = 0;
4195 Py_ssize_t len;
4196 char *s;
4197 int rc;
4198
4199 if ((len = self->readline_func(self, &s)) < 0) return -1;
4200 if (len < 2) return bad_readline();
4201
4202 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
4203
4204 value = PyDict_GetItem(self->memo, py_str);
4205 if (! value) {
4206 PyErr_SetObject(BadPickleGet, py_str);
4207 rc = -1;
4208 }
4209 else {
4210 PDATA_APPEND(self->stack, value, -1);
4211 rc = 0;
4212 }
4213
4214 Py_DECREF(py_str);
4215 return rc;
4216}
4217
4218
4219static int
4220load_binget(Unpicklerobject *self)
4221{
4222 PyObject *py_key = 0, *value = 0;
4223 unsigned char key;
4224 char *s;
4225 int rc;
4226
4227 if (self->read_func(self, &s, 1) < 0) return -1;
4228
4229 key = (unsigned char)s[0];
4230 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4231
4232 value = PyDict_GetItem(self->memo, py_key);
4233 if (! value) {
4234 PyErr_SetObject(BadPickleGet, py_key);
4235 rc = -1;
4236 }
4237 else {
4238 PDATA_APPEND(self->stack, value, -1);
4239 rc = 0;
4240 }
4241
4242 Py_DECREF(py_key);
4243 return rc;
4244}
4245
4246
4247static int
4248load_long_binget(Unpicklerobject *self)
4249{
4250 PyObject *py_key = 0, *value = 0;
4251 unsigned char c;
4252 char *s;
4253 Py_ssize_t key;
4254 int rc;
4255
4256 if (self->read_func(self, &s, 4) < 0) return -1;
4257
4258 c = (unsigned char)s[0];
4259 key = (long)c;
4260 c = (unsigned char)s[1];
4261 key |= (long)c << 8;
4262 c = (unsigned char)s[2];
4263 key |= (long)c << 16;
4264 c = (unsigned char)s[3];
4265 key |= (long)c << 24;
4266
4267 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4268
4269 value = PyDict_GetItem(self->memo, py_key);
4270 if (! value) {
4271 PyErr_SetObject(BadPickleGet, py_key);
4272 rc = -1;
4273 }
4274 else {
4275 PDATA_APPEND(self->stack, value, -1);
4276 rc = 0;
4277 }
4278
4279 Py_DECREF(py_key);
4280 return rc;
4281}
4282
4283/* Push an object from the extension registry (EXT[124]). nbytes is
4284 * the number of bytes following the opcode, holding the index (code) value.
4285 */
4286static int
4287load_extension(Unpicklerobject *self, int nbytes)
4288{
4289 char *codebytes; /* the nbytes bytes after the opcode */
4290 long code; /* calc_binint returns long */
4291 PyObject *py_code; /* code as a Python int */
4292 PyObject *obj; /* the object to push */
4293 PyObject *pair; /* (module_name, class_name) */
4294 PyObject *module_name, *class_name;
4295
4296 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4297 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4298 code = calc_binint(codebytes, nbytes);
4299 if (code <= 0) { /* note that 0 is forbidden */
4300 /* Corrupt or hostile pickle. */
4301 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
4302 return -1;
4303 }
4304
4305 /* Look for the code in the cache. */
4306 py_code = PyInt_FromLong(code);
4307 if (py_code == NULL) return -1;
4308 obj = PyDict_GetItem(extension_cache, py_code);
4309 if (obj != NULL) {
4310 /* Bingo. */
4311 Py_DECREF(py_code);
4312 PDATA_APPEND(self->stack, obj, -1);
4313 return 0;
4314 }
4315
4316 /* Look up the (module_name, class_name) pair. */
4317 pair = PyDict_GetItem(inverted_registry, py_code);
4318 if (pair == NULL) {
4319 Py_DECREF(py_code);
4320 PyErr_Format(PyExc_ValueError, "unregistered extension "
4321 "code %ld", code);
4322 return -1;
4323 }
4324 /* Since the extension registry is manipulable via Python code,
4325 * confirm that pair is really a 2-tuple of strings.
4326 */
4327 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
4328 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
4329 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
4330 Py_DECREF(py_code);
4331 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
4332 "isn't a 2-tuple of strings", code);
4333 return -1;
4334 }
4335 /* Load the object. */
4336 obj = find_class(module_name, class_name, self->find_class);
4337 if (obj == NULL) {
4338 Py_DECREF(py_code);
4339 return -1;
4340 }
4341 /* Cache code -> obj. */
4342 code = PyDict_SetItem(extension_cache, py_code, obj);
4343 Py_DECREF(py_code);
4344 if (code < 0) {
4345 Py_DECREF(obj);
4346 return -1;
4347 }
4348 PDATA_PUSH(self->stack, obj, -1);
4349 return 0;
4350}
4351
4352static int
4353load_put(Unpicklerobject *self)
4354{
4355 PyObject *py_str = 0, *value = 0;
4356 Py_ssize_t len, l;
4357 char *s;
4358
4359 if ((l = self->readline_func(self, &s)) < 0) return -1;
4360 if (l < 2) return bad_readline();
4361 if (!( len=self->stack->length )) return stackUnderflow();
4362 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
4363 value=self->stack->data[len-1];
4364 l=PyDict_SetItem(self->memo, py_str, value);
4365 Py_DECREF(py_str);
4366 return l;
4367}
4368
4369
4370static int
4371load_binput(Unpicklerobject *self)
4372{
4373 PyObject *py_key = 0, *value = 0;
4374 unsigned char key;
4375 char *s;
4376 Py_ssize_t len;
4377
4378 if (self->read_func(self, &s, 1) < 0) return -1;
4379 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
4380
4381 key = (unsigned char)s[0];
4382
4383 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4384 value=self->stack->data[len-1];
4385 len=PyDict_SetItem(self->memo, py_key, value);
4386 Py_DECREF(py_key);
4387 return len;
4388}
4389
4390
4391static int
4392load_long_binput(Unpicklerobject *self)
4393{
4394 PyObject *py_key = 0, *value = 0;
4395 Py_ssize_t key;
4396 unsigned char c;
4397 char *s;
4398 Py_ssize_t len;
4399
4400 if (self->read_func(self, &s, 4) < 0) return -1;
4401 if (!( len=self->stack->length )) return stackUnderflow();
4402
4403 c = (unsigned char)s[0];
4404 key = (long)c;
4405 c = (unsigned char)s[1];
4406 key |= (long)c << 8;
4407 c = (unsigned char)s[2];
4408 key |= (long)c << 16;
4409 c = (unsigned char)s[3];
4410 key |= (long)c << 24;
4411
4412 if (!( py_key = PyInt_FromLong(key))) return -1;
4413 value=self->stack->data[len-1];
4414 len=PyDict_SetItem(self->memo, py_key, value);
4415 Py_DECREF(py_key);
4416 return len;
4417}
4418
4419
4420static int
4421do_append(Unpicklerobject *self, Py_ssize_t x)
4422{
4423 PyObject *value = 0, *list = 0, *append_method = 0;
4424 Py_ssize_t len, i;
4425
4426 len=self->stack->length;
4427 if (!( len >= x && x > 0 )) return stackUnderflow();
4428 /* nothing to do */
4429 if (len==x) return 0;
4430
4431 list=self->stack->data[x-1];
4432
4433 if (PyList_Check(list)) {
4434 PyObject *slice;
4435 int list_len;
4436
4437 slice=Pdata_popList(self->stack, x);
4438 if (! slice) return -1;
4439 list_len = PyList_GET_SIZE(list);
4440 i=PyList_SetSlice(list, list_len, list_len, slice);
4441 Py_DECREF(slice);
4442 return i;
4443 }
4444 else {
4445
4446 if (!( append_method = PyObject_GetAttr(list, append_str)))
4447 return -1;
4448
4449 for (i = x; i < len; i++) {
4450 PyObject *junk;
4451
4452 value=self->stack->data[i];
4453 junk=0;
4454 ARG_TUP(self, value);
4455 if (self->arg) {
4456 junk = PyObject_Call(append_method, self->arg,
4457 NULL);
4458 FREE_ARG_TUP(self);
4459 }
4460 if (! junk) {
4461 Pdata_clear(self->stack, i+1);
4462 self->stack->length=x;
4463 Py_DECREF(append_method);
4464 return -1;
4465 }
4466 Py_DECREF(junk);
4467 }
4468 self->stack->length=x;
4469 Py_DECREF(append_method);
4470 }
4471
4472 return 0;
4473}
4474
4475
4476static int
4477load_append(Unpicklerobject *self)
4478{
4479 return do_append(self, self->stack->length - 1);
4480}
4481
4482
4483static int
4484load_appends(Unpicklerobject *self)
4485{
4486 return do_append(self, marker(self));
4487}
4488
4489
4490static Py_ssize_t
4491do_setitems(Unpicklerobject *self, Py_ssize_t x)
4492{
4493 PyObject *value = 0, *key = 0, *dict = 0;
4494 Py_ssize_t len, i, r=0;
4495
4496 if (!( (len=self->stack->length) >= x
4497 && x > 0 )) return stackUnderflow();
4498
4499 dict=self->stack->data[x-1];
4500
4501 for (i = x+1; i < len; i += 2) {
4502 key =self->stack->data[i-1];
4503 value=self->stack->data[i ];
4504 if (PyObject_SetItem(dict, key, value) < 0) {
4505 r=-1;
4506 break;
4507 }
4508 }
4509
4510 Pdata_clear(self->stack, x);
4511
4512 return r;
4513}
4514
4515
4516static int
4517load_setitem(Unpicklerobject *self)
4518{
4519 return do_setitems(self, self->stack->length - 2);
4520}
4521
4522static int
4523load_setitems(Unpicklerobject *self)
4524{
4525 return do_setitems(self, marker(self));
4526}
4527
4528
4529static int
4530load_build(Unpicklerobject *self)
4531{
4532 PyObject *state, *inst, *slotstate;
4533 PyObject *__setstate__;
4534 PyObject *d_key, *d_value;
4535 int res = -1;
4536 Py_ssize_t i;
4537
4538 /* Stack is ... instance, state. We want to leave instance at
4539 * the stack top, possibly mutated via instance.__setstate__(state).
4540 */
4541 if (self->stack->length < 2)
4542 return stackUnderflow();
4543 PDATA_POP(self->stack, state);
4544 if (state == NULL)
4545 return -1;
4546 inst = self->stack->data[self->stack->length - 1];
4547
4548 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4549 if (__setstate__ != NULL) {
4550 PyObject *junk = NULL;
4551
4552 /* The explicit __setstate__ is responsible for everything. */
4553 ARG_TUP(self, state);
4554 if (self->arg) {
4555 junk = PyObject_Call(__setstate__, self->arg, NULL);
4556 FREE_ARG_TUP(self);
4557 }
4558 Py_DECREF(__setstate__);
4559 if (junk == NULL)
4560 return -1;
4561 Py_DECREF(junk);
4562 return 0;
4563 }
4564 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4565 return -1;
4566 PyErr_Clear();
4567
4568 /* A default __setstate__. First see whether state embeds a
4569 * slot state dict too (a proto 2 addition).
4570 */
4571 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4572 PyObject *temp = state;
4573 state = PyTuple_GET_ITEM(temp, 0);
4574 slotstate = PyTuple_GET_ITEM(temp, 1);
4575 Py_INCREF(state);
4576 Py_INCREF(slotstate);
4577 Py_DECREF(temp);
4578 }
4579 else
4580 slotstate = NULL;
4581
4582 /* Set inst.__dict__ from the state dict (if any). */
4583 if (state != Py_None) {
4584 PyObject *dict;
4585 if (! PyDict_Check(state)) {
4586 PyErr_SetString(UnpicklingError, "state is not a "
4587 "dictionary");
4588 goto finally;
4589 }
4590 dict = PyObject_GetAttr(inst, __dict___str);
4591 if (dict == NULL)
4592 goto finally;
4593
4594 i = 0;
4595 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4596 /* normally the keys for instance attributes are
4597 interned. we should try to do that here. */
4598 Py_INCREF(d_key);
4599 if (PyString_CheckExact(d_key))
4600 PyString_InternInPlace(&d_key);
4601 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
4602 Py_DECREF(d_key);
4603 goto finally;
4604 }
4605 Py_DECREF(d_key);
4606 }
4607 Py_DECREF(dict);
4608 }
4609
4610 /* Also set instance attributes from the slotstate dict (if any). */
4611 if (slotstate != NULL) {
4612 if (! PyDict_Check(slotstate)) {
4613 PyErr_SetString(UnpicklingError, "slot state is not "
4614 "a dictionary");
4615 goto finally;
4616 }
4617 i = 0;
4618 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4619 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4620 goto finally;
4621 }
4622 }
4623 res = 0;
4624
4625 finally:
4626 Py_DECREF(state);
4627 Py_XDECREF(slotstate);
4628 return res;
4629}
4630
4631
4632static int
4633load_mark(Unpicklerobject *self)
4634{
4635 Py_ssize_t s;
4636
4637 /* Note that we split the (pickle.py) stack into two stacks, an
4638 object stack and a mark stack. Here we push a mark onto the
4639 mark stack.
4640 */
4641
4642 if ((self->num_marks + 1) >= self->marks_size) {
4643 Py_ssize_t *marks;
4644 s=self->marks_size+20;
4645 if (s <= self->num_marks) s=self->num_marks + 1;
4646 if (self->marks == NULL)
4647 marks=(Py_ssize_t *)malloc(s * sizeof(Py_ssize_t));
4648 else
4649 marks=(Py_ssize_t *)realloc(self->marks,
4650 s * sizeof(Py_ssize_t));
4651 if (!marks) {
4652 PyErr_NoMemory();
4653 return -1;
4654 }
4655 self->marks = marks;
4656 self->marks_size = s;
4657 }
4658
4659 self->marks[self->num_marks++] = self->stack->length;
4660
4661 return 0;
4662}
4663
4664static int
4665load_reduce(Unpicklerobject *self)
4666{
4667 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
4668
4669 PDATA_POP(self->stack, arg_tup);
4670 if (! arg_tup) return -1;
4671 PDATA_POP(self->stack, callable);
4672 if (callable) {
4673 ob = Instance_New(callable, arg_tup);
4674 Py_DECREF(callable);
4675 }
4676 Py_DECREF(arg_tup);
4677
4678 if (! ob) return -1;
4679
4680 PDATA_PUSH(self->stack, ob, -1);
4681 return 0;
4682}
4683
4684/* Just raises an error if we don't know the protocol specified. PROTO
4685 * is the first opcode for protocols >= 2.
4686 */
4687static int
4688load_proto(Unpicklerobject *self)
4689{
4690 int i;
4691 char *protobyte;
4692
4693 i = self->read_func(self, &protobyte, 1);
4694 if (i < 0)
4695 return -1;
4696
4697 i = calc_binint(protobyte, 1);
4698 /* No point checking for < 0, since calc_binint returns an unsigned
4699 * int when chewing on 1 byte.
4700 */
4701 assert(i >= 0);
4702 if (i <= HIGHEST_PROTOCOL)
4703 return 0;
4704
4705 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4706 return -1;
4707}
4708
4709static PyObject *
4710load(Unpicklerobject *self)
4711{
4712 PyObject *err = 0, *val = 0;
4713 char *s;
4714
4715 self->num_marks = 0;
4716 if (self->stack->length) Pdata_clear(self->stack, 0);
4717
4718 while (1) {
4719 if (self->read_func(self, &s, 1) < 0)
4720 break;
4721
4722 switch (s[0]) {
4723 case NONE:
4724 if (load_none(self) < 0)
4725 break;
4726 continue;
4727
4728 case BININT:
4729 if (load_binint(self) < 0)
4730 break;
4731 continue;
4732
4733 case BININT1:
4734 if (load_binint1(self) < 0)
4735 break;
4736 continue;
4737
4738 case BININT2:
4739 if (load_binint2(self) < 0)
4740 break;
4741 continue;
4742
4743 case INT:
4744 if (load_int(self) < 0)
4745 break;
4746 continue;
4747
4748 case LONG:
4749 if (load_long(self) < 0)
4750 break;
4751 continue;
4752
4753 case LONG1:
4754 if (load_counted_long(self, 1) < 0)
4755 break;
4756 continue;
4757
4758 case LONG4:
4759 if (load_counted_long(self, 4) < 0)
4760 break;
4761 continue;
4762
4763 case FLOAT:
4764 if (load_float(self) < 0)
4765 break;
4766 continue;
4767
4768 case BINFLOAT:
4769 if (load_binfloat(self) < 0)
4770 break;
4771 continue;
4772
4773 case BINSTRING:
4774 if (load_binstring(self) < 0)
4775 break;
4776 continue;
4777
4778 case SHORT_BINSTRING:
4779 if (load_short_binstring(self) < 0)
4780 break;
4781 continue;
4782
4783 case STRING:
4784 if (load_string(self) < 0)
4785 break;
4786 continue;
4787
4788#ifdef Py_USING_UNICODE
4789 case UNICODE:
4790 if (load_unicode(self) < 0)
4791 break;
4792 continue;
4793
4794 case BINUNICODE:
4795 if (load_binunicode(self) < 0)
4796 break;
4797 continue;
4798#endif
4799
4800 case EMPTY_TUPLE:
4801 if (load_counted_tuple(self, 0) < 0)
4802 break;
4803 continue;
4804
4805 case TUPLE1:
4806 if (load_counted_tuple(self, 1) < 0)
4807 break;
4808 continue;
4809
4810 case TUPLE2:
4811 if (load_counted_tuple(self, 2) < 0)
4812 break;
4813 continue;
4814
4815 case TUPLE3:
4816 if (load_counted_tuple(self, 3) < 0)
4817 break;
4818 continue;
4819
4820 case TUPLE:
4821 if (load_tuple(self) < 0)
4822 break;
4823 continue;
4824
4825 case EMPTY_LIST:
4826 if (load_empty_list(self) < 0)
4827 break;
4828 continue;
4829
4830 case LIST:
4831 if (load_list(self) < 0)
4832 break;
4833 continue;
4834
4835 case EMPTY_DICT:
4836 if (load_empty_dict(self) < 0)
4837 break;
4838 continue;
4839
4840 case DICT:
4841 if (load_dict(self) < 0)
4842 break;
4843 continue;
4844
4845 case OBJ:
4846 if (load_obj(self) < 0)
4847 break;
4848 continue;
4849
4850 case INST:
4851 if (load_inst(self) < 0)
4852 break;
4853 continue;
4854
4855 case NEWOBJ:
4856 if (load_newobj(self) < 0)
4857 break;
4858 continue;
4859
4860 case GLOBAL:
4861 if (load_global(self) < 0)
4862 break;
4863 continue;
4864
4865 case APPEND:
4866 if (load_append(self) < 0)
4867 break;
4868 continue;
4869
4870 case APPENDS:
4871 if (load_appends(self) < 0)
4872 break;
4873 continue;
4874
4875 case BUILD:
4876 if (load_build(self) < 0)
4877 break;
4878 continue;
4879
4880 case DUP:
4881 if (load_dup(self) < 0)
4882 break;
4883 continue;
4884
4885 case BINGET:
4886 if (load_binget(self) < 0)
4887 break;
4888 continue;
4889
4890 case LONG_BINGET:
4891 if (load_long_binget(self) < 0)
4892 break;
4893 continue;
4894
4895 case GET:
4896 if (load_get(self) < 0)
4897 break;
4898 continue;
4899
4900 case EXT1:
4901 if (load_extension(self, 1) < 0)
4902 break;
4903 continue;
4904
4905 case EXT2:
4906 if (load_extension(self, 2) < 0)
4907 break;
4908 continue;
4909
4910 case EXT4:
4911 if (load_extension(self, 4) < 0)
4912 break;
4913 continue;
4914 case MARK:
4915 if (load_mark(self) < 0)
4916 break;
4917 continue;
4918
4919 case BINPUT:
4920 if (load_binput(self) < 0)
4921 break;
4922 continue;
4923
4924 case LONG_BINPUT:
4925 if (load_long_binput(self) < 0)
4926 break;
4927 continue;
4928
4929 case PUT:
4930 if (load_put(self) < 0)
4931 break;
4932 continue;
4933
4934 case POP:
4935 if (load_pop(self) < 0)
4936 break;
4937 continue;
4938
4939 case POP_MARK:
4940 if (load_pop_mark(self) < 0)
4941 break;
4942 continue;
4943
4944 case SETITEM:
4945 if (load_setitem(self) < 0)
4946 break;
4947 continue;
4948
4949 case SETITEMS:
4950 if (load_setitems(self) < 0)
4951 break;
4952 continue;
4953
4954 case STOP:
4955 break;
4956
4957 case PERSID:
4958 if (load_persid(self) < 0)
4959 break;
4960 continue;
4961
4962 case BINPERSID:
4963 if (load_binpersid(self) < 0)
4964 break;
4965 continue;
4966
4967 case REDUCE:
4968 if (load_reduce(self) < 0)
4969 break;
4970 continue;
4971
4972 case PROTO:
4973 if (load_proto(self) < 0)
4974 break;
4975 continue;
4976
4977 case NEWTRUE:
4978 if (load_bool(self, Py_True) < 0)
4979 break;
4980 continue;
4981
4982 case NEWFALSE:
4983 if (load_bool(self, Py_False) < 0)
4984 break;
4985 continue;
4986
4987 case '\0':
4988 /* end of file */
4989 PyErr_SetNone(PyExc_EOFError);
4990 break;
4991
4992 default:
4993 cPickle_ErrFormat(UnpicklingError,
4994 "invalid load key, '%s'.",
4995 "c", s[0]);
4996 return NULL;
4997 }
4998
4999 break;
5000 }
5001
5002 if ((err = PyErr_Occurred())) {
5003 if (err == PyExc_EOFError) {
5004 PyErr_SetNone(PyExc_EOFError);
5005 }
5006 return NULL;
5007 }
5008
5009 PDATA_POP(self->stack, val);
5010 return val;
5011}
5012
5013
5014/* No-load functions to support noload, which is used to
5015 find persistent references. */
5016
5017static int
5018noload_obj(Unpicklerobject *self)
5019{
5020 Py_ssize_t i;
5021
5022 if ((i = marker(self)) < 0) return -1;
5023 return Pdata_clear(self->stack, i+1);
5024}
5025
5026
5027static int
5028noload_inst(Unpicklerobject *self)
5029{
5030 Py_ssize_t i;
5031 char *s;
5032
5033 if ((i = marker(self)) < 0) return -1;
5034 Pdata_clear(self->stack, i);
5035 if (self->readline_func(self, &s) < 0) return -1;
5036 if (self->readline_func(self, &s) < 0) return -1;
5037 PDATA_APPEND(self->stack, Py_None, -1);
5038 return 0;
5039}
5040
5041static int
5042noload_newobj(Unpicklerobject *self)
5043{
5044 PyObject *obj;
5045
5046 PDATA_POP(self->stack, obj); /* pop argtuple */
5047 if (obj == NULL) return -1;
5048 Py_DECREF(obj);
5049
5050 PDATA_POP(self->stack, obj); /* pop cls */
5051 if (obj == NULL) return -1;
5052 Py_DECREF(obj);
5053
5054 PDATA_APPEND(self->stack, Py_None, -1);
5055 return 0;
5056}
5057
5058static int
5059noload_global(Unpicklerobject *self)
5060{
5061 char *s;
5062
5063 if (self->readline_func(self, &s) < 0) return -1;
5064 if (self->readline_func(self, &s) < 0) return -1;
5065 PDATA_APPEND(self->stack, Py_None,-1);
5066 return 0;
5067}
5068
5069static int
5070noload_reduce(Unpicklerobject *self)
5071{
5072
5073 if (self->stack->length < 2) return stackUnderflow();
5074 Pdata_clear(self->stack, self->stack->length-2);
5075 PDATA_APPEND(self->stack, Py_None,-1);
5076 return 0;
5077}
5078
5079static int
5080noload_build(Unpicklerobject *self) {
5081
5082 if (self->stack->length < 1) return stackUnderflow();
5083 Pdata_clear(self->stack, self->stack->length-1);
5084 return 0;
5085}
5086
5087static int
5088noload_extension(Unpicklerobject *self, int nbytes)
5089{
5090 char *codebytes;
5091
5092 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
5093 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
5094 PDATA_APPEND(self->stack, Py_None, -1);
5095 return 0;
5096}
5097
5098static int
5099noload_append(Unpicklerobject *self)
5100{
5101 return Pdata_clear(self->stack, self->stack->length - 1);
5102}
5103
5104static int
5105noload_appends(Unpicklerobject *self)
5106{
5107 Py_ssize_t i;
5108 if ((i = marker(self)) < 0) return -1;
5109 return Pdata_clear(self->stack, i);
5110}
5111
5112static int
5113noload_setitem(Unpicklerobject *self)
5114{
5115 return Pdata_clear(self->stack, self->stack->length - 2);
5116}
5117
5118static int
5119noload_setitems(Unpicklerobject *self)
5120{
5121 Py_ssize_t i;
5122 if ((i = marker(self)) < 0) return -1;
5123 return Pdata_clear(self->stack, i);
5124}
5125
5126static PyObject *
5127noload(Unpicklerobject *self)
5128{
5129 PyObject *err = 0, *val = 0;
5130 char *s;
5131
5132 self->num_marks = 0;
5133 Pdata_clear(self->stack, 0);
5134
5135 while (1) {
5136 if (self->read_func(self, &s, 1) < 0)
5137 break;
5138
5139 switch (s[0]) {
5140 case NONE:
5141 if (load_none(self) < 0)
5142 break;
5143 continue;
5144
5145 case BININT:
5146 if (load_binint(self) < 0)
5147 break;
5148 continue;
5149
5150 case BININT1:
5151 if (load_binint1(self) < 0)
5152 break;
5153 continue;
5154
5155 case BININT2:
5156 if (load_binint2(self) < 0)
5157 break;
5158 continue;
5159
5160 case INT:
5161 if (load_int(self) < 0)
5162 break;
5163 continue;
5164
5165 case LONG:
5166 if (load_long(self) < 0)
5167 break;
5168 continue;
5169
5170 case LONG1:
5171 if (load_counted_long(self, 1) < 0)
5172 break;
5173 continue;
5174
5175 case LONG4:
5176 if (load_counted_long(self, 4) < 0)
5177 break;
5178 continue;
5179
5180 case FLOAT:
5181 if (load_float(self) < 0)
5182 break;
5183 continue;
5184
5185 case BINFLOAT:
5186 if (load_binfloat(self) < 0)
5187 break;
5188 continue;
5189
5190 case BINSTRING:
5191 if (load_binstring(self) < 0)
5192 break;
5193 continue;
5194
5195 case SHORT_BINSTRING:
5196 if (load_short_binstring(self) < 0)
5197 break;
5198 continue;
5199
5200 case STRING:
5201 if (load_string(self) < 0)
5202 break;
5203 continue;
5204
5205#ifdef Py_USING_UNICODE
5206 case UNICODE:
5207 if (load_unicode(self) < 0)
5208 break;
5209 continue;
5210
5211 case BINUNICODE:
5212 if (load_binunicode(self) < 0)
5213 break;
5214 continue;
5215#endif
5216
5217 case EMPTY_TUPLE:
5218 if (load_counted_tuple(self, 0) < 0)
5219 break;
5220 continue;
5221
5222 case TUPLE1:
5223 if (load_counted_tuple(self, 1) < 0)
5224 break;
5225 continue;
5226
5227 case TUPLE2:
5228 if (load_counted_tuple(self, 2) < 0)
5229 break;
5230 continue;
5231
5232 case TUPLE3:
5233 if (load_counted_tuple(self, 3) < 0)
5234 break;
5235 continue;
5236
5237 case TUPLE:
5238 if (load_tuple(self) < 0)
5239 break;
5240 continue;
5241
5242 case EMPTY_LIST:
5243 if (load_empty_list(self) < 0)
5244 break;
5245 continue;
5246
5247 case LIST:
5248 if (load_list(self) < 0)
5249 break;
5250 continue;
5251
5252 case EMPTY_DICT:
5253 if (load_empty_dict(self) < 0)
5254 break;
5255 continue;
5256
5257 case DICT:
5258 if (load_dict(self) < 0)
5259 break;
5260 continue;
5261
5262 case OBJ:
5263 if (noload_obj(self) < 0)
5264 break;
5265 continue;
5266
5267 case INST:
5268 if (noload_inst(self) < 0)
5269 break;
5270 continue;
5271
5272 case NEWOBJ:
5273 if (noload_newobj(self) < 0)
5274 break;
5275 continue;
5276
5277 case GLOBAL:
5278 if (noload_global(self) < 0)
5279 break;
5280 continue;
5281
5282 case APPEND:
5283 if (noload_append(self) < 0)
5284 break;
5285 continue;
5286
5287 case APPENDS:
5288 if (noload_appends(self) < 0)
5289 break;
5290 continue;
5291
5292 case BUILD:
5293 if (noload_build(self) < 0)
5294 break;
5295 continue;
5296
5297 case DUP:
5298 if (load_dup(self) < 0)
5299 break;
5300 continue;
5301
5302 case BINGET:
5303 if (load_binget(self) < 0)
5304 break;
5305 continue;
5306
5307 case LONG_BINGET:
5308 if (load_long_binget(self) < 0)
5309 break;
5310 continue;
5311
5312 case GET:
5313 if (load_get(self) < 0)
5314 break;
5315 continue;
5316
5317 case EXT1:
5318 if (noload_extension(self, 1) < 0)
5319 break;
5320 continue;
5321
5322 case EXT2:
5323 if (noload_extension(self, 2) < 0)
5324 break;
5325 continue;
5326
5327 case EXT4:
5328 if (noload_extension(self, 4) < 0)
5329 break;
5330 continue;
5331
5332 case MARK:
5333 if (load_mark(self) < 0)
5334 break;
5335 continue;
5336
5337 case BINPUT:
5338 if (load_binput(self) < 0)
5339 break;
5340 continue;
5341
5342 case LONG_BINPUT:
5343 if (load_long_binput(self) < 0)
5344 break;
5345 continue;
5346
5347 case PUT:
5348 if (load_put(self) < 0)
5349 break;
5350 continue;
5351
5352 case POP:
5353 if (load_pop(self) < 0)
5354 break;
5355 continue;
5356
5357 case POP_MARK:
5358 if (load_pop_mark(self) < 0)
5359 break;
5360 continue;
5361
5362 case SETITEM:
5363 if (noload_setitem(self) < 0)
5364 break;
5365 continue;
5366
5367 case SETITEMS:
5368 if (noload_setitems(self) < 0)
5369 break;
5370 continue;
5371
5372 case STOP:
5373 break;
5374
5375 case PERSID:
5376 if (load_persid(self) < 0)
5377 break;
5378 continue;
5379
5380 case BINPERSID:
5381 if (load_binpersid(self) < 0)
5382 break;
5383 continue;
5384
5385 case REDUCE:
5386 if (noload_reduce(self) < 0)
5387 break;
5388 continue;
5389
5390 case PROTO:
5391 if (load_proto(self) < 0)
5392 break;
5393 continue;
5394
5395 case NEWTRUE:
5396 if (load_bool(self, Py_True) < 0)
5397 break;
5398 continue;
5399
5400 case NEWFALSE:
5401 if (load_bool(self, Py_False) < 0)
5402 break;
5403 continue;
5404 default:
5405 cPickle_ErrFormat(UnpicklingError,
5406 "invalid load key, '%s'.",
5407 "c", s[0]);
5408 return NULL;
5409 }
5410
5411 break;
5412 }
5413
5414 if ((err = PyErr_Occurred())) {
5415 if (err == PyExc_EOFError) {
5416 PyErr_SetNone(PyExc_EOFError);
5417 }
5418 return NULL;
5419 }
5420
5421 PDATA_POP(self->stack, val);
5422 return val;
5423}
5424
5425
5426static PyObject *
5427Unpickler_load(Unpicklerobject *self, PyObject *unused)
5428{
5429 return load(self);
5430}
5431
5432static PyObject *
5433Unpickler_noload(Unpicklerobject *self, PyObject *unused)
5434{
5435 return noload(self);
5436}
5437
5438
5439static struct PyMethodDef Unpickler_methods[] = {
5440 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
5441 PyDoc_STR("load() -- Load a pickle")
5442 },
5443 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
5444 PyDoc_STR(
5445 "noload() -- not load a pickle, but go through most of the motions\n"
5446 "\n"
5447 "This function can be used to read past a pickle without instantiating\n"
5448 "any objects or importing any modules. It can also be used to find all\n"
5449 "persistent references without instantiating any objects or importing\n"
5450 "any modules.\n")
5451 },
5452 {NULL, NULL} /* sentinel */
5453};
5454
5455
5456static Unpicklerobject *
5457newUnpicklerobject(PyObject *f)
5458{
5459 Unpicklerobject *self;
5460
5461 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
5462 return NULL;
5463
5464 self->file = NULL;
5465 self->arg = NULL;
5466 self->stack = (Pdata*)Pdata_New();
5467 self->pers_func = NULL;
5468 self->last_string = NULL;
5469 self->marks = NULL;
5470 self->num_marks = 0;
5471 self->marks_size = 0;
5472 self->buf_size = 0;
5473 self->read = NULL;
5474 self->readline = NULL;
5475 self->find_class = NULL;
5476
5477 if (!( self->memo = PyDict_New()))
5478 goto err;
5479
5480 if (!self->stack)
5481 goto err;
5482
5483 Py_INCREF(f);
5484 self->file = f;
5485
5486 /* Set read, readline based on type of f */
5487 if (PyFile_Check(f)) {
5488 self->fp = PyFile_AsFile(f);
5489 if (self->fp == NULL) {
5490 PyErr_SetString(PyExc_ValueError,
5491 "I/O operation on closed file");
5492 goto err;
5493 }
5494 self->read_func = read_file;
5495 self->readline_func = readline_file;
5496 }
5497 else if (PycStringIO_InputCheck(f)) {
5498 self->fp = NULL;
5499 self->read_func = read_cStringIO;
5500 self->readline_func = readline_cStringIO;
5501 }
5502 else {
5503
5504 self->fp = NULL;
5505 self->read_func = read_other;
5506 self->readline_func = readline_other;
5507
5508 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5509 (self->read = PyObject_GetAttr(f, read_str)))) {
5510 PyErr_Clear();
5511 PyErr_SetString( PyExc_TypeError,
5512 "argument must have 'read' and "
5513 "'readline' attributes" );
5514 goto err;
5515 }
5516 }
5517 PyObject_GC_Track(self);
5518
5519 return self;
5520
5521 err:
5522 Py_DECREF((PyObject *)self);
5523 return NULL;
5524}
5525
5526
5527static PyObject *
5528get_Unpickler(PyObject *self, PyObject *file)
5529{
5530 return (PyObject *)newUnpicklerobject(file);
5531}
5532
5533
5534static void
5535Unpickler_dealloc(Unpicklerobject *self)
5536{
5537 PyObject_GC_UnTrack((PyObject *)self);
5538 Py_XDECREF(self->readline);
5539 Py_XDECREF(self->read);
5540 Py_XDECREF(self->file);
5541 Py_XDECREF(self->memo);
5542 Py_XDECREF(self->stack);
5543 Py_XDECREF(self->pers_func);
5544 Py_XDECREF(self->arg);
5545 Py_XDECREF(self->last_string);
5546 Py_XDECREF(self->find_class);
5547
5548 if (self->marks) {
5549 free(self->marks);
5550 }
5551
5552 if (self->buf_size) {
5553 free(self->buf);
5554 }
5555
5556 Py_TYPE(self)->tp_free((PyObject *)self);
5557}
5558
5559static int
5560Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5561{
5562 Py_VISIT(self->readline);
5563 Py_VISIT(self->read);
5564 Py_VISIT(self->file);
5565 Py_VISIT(self->memo);
5566 Py_VISIT(self->stack);
5567 Py_VISIT(self->pers_func);
5568 Py_VISIT(self->arg);
5569 Py_VISIT(self->last_string);
5570 Py_VISIT(self->find_class);
5571 return 0;
5572}
5573
5574static int
5575Unpickler_clear(Unpicklerobject *self)
5576{
5577 Py_CLEAR(self->readline);
5578 Py_CLEAR(self->read);
5579 Py_CLEAR(self->file);
5580 Py_CLEAR(self->memo);
5581 Py_CLEAR(self->stack);
5582 Py_CLEAR(self->pers_func);
5583 Py_CLEAR(self->arg);
5584 Py_CLEAR(self->last_string);
5585 Py_CLEAR(self->find_class);
5586 return 0;
5587}
5588
5589static PyObject *
5590Unpickler_getattr(Unpicklerobject *self, char *name)
5591{
5592 if (!strcmp(name, "persistent_load")) {
5593 if (!self->pers_func) {
5594 PyErr_SetString(PyExc_AttributeError, name);
5595 return NULL;
5596 }
5597
5598 Py_INCREF(self->pers_func);
5599 return self->pers_func;
5600 }
5601
5602 if (!strcmp(name, "find_global")) {
5603 if (!self->find_class) {
5604 PyErr_SetString(PyExc_AttributeError, name);
5605 return NULL;
5606 }
5607
5608 Py_INCREF(self->find_class);
5609 return self->find_class;
5610 }
5611
5612 if (!strcmp(name, "memo")) {
5613 if (!self->memo) {
5614 PyErr_SetString(PyExc_AttributeError, name);
5615 return NULL;
5616 }
5617
5618 Py_INCREF(self->memo);
5619 return self->memo;
5620 }
5621
5622 if (!strcmp(name, "UnpicklingError")) {
5623 Py_INCREF(UnpicklingError);
5624 return UnpicklingError;
5625 }
5626
5627 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
5628}
5629
5630
5631static int
5632Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
5633{
5634
5635 if (!strcmp(name, "persistent_load")) {
5636 Py_XDECREF(self->pers_func);
5637 self->pers_func = value;
5638 Py_XINCREF(value);
5639 return 0;
5640 }
5641
5642 if (!strcmp(name, "find_global")) {
5643 Py_XDECREF(self->find_class);
5644 self->find_class = value;
5645 Py_XINCREF(value);
5646 return 0;
5647 }
5648
5649 if (! value) {
5650 PyErr_SetString(PyExc_TypeError,
5651 "attribute deletion is not supported");
5652 return -1;
5653 }
5654
5655 if (strcmp(name, "memo") == 0) {
5656 if (!PyDict_Check(value)) {
5657 PyErr_SetString(PyExc_TypeError,
5658 "memo must be a dictionary");
5659 return -1;
5660 }
5661 Py_XDECREF(self->memo);
5662 self->memo = value;
5663 Py_INCREF(value);
5664 return 0;
5665 }
5666
5667 PyErr_SetString(PyExc_AttributeError, name);
5668 return -1;
5669}
5670
5671/* ---------------------------------------------------------------------------
5672 * Module-level functions.
5673 */
5674
5675/* dump(obj, file, protocol=0). */
5676static PyObject *
5677cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
5678{
5679 static char *kwlist[] = {"obj", "file", "protocol", NULL};
5680 PyObject *ob, *file, *res = NULL;
5681 Picklerobject *pickler = 0;
5682 int proto = 0;
5683
5684 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5685 &ob, &file, &proto)))
5686 goto finally;
5687
5688 if (!( pickler = newPicklerobject(file, proto)))
5689 goto finally;
5690
5691 if (dump(pickler, ob) < 0)
5692 goto finally;
5693
5694 Py_INCREF(Py_None);
5695 res = Py_None;
5696
5697 finally:
5698 Py_XDECREF(pickler);
5699
5700 return res;
5701}
5702
5703
5704/* dumps(obj, protocol=0). */
5705static PyObject *
5706cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
5707{
5708 static char *kwlist[] = {"obj", "protocol", NULL};
5709 PyObject *ob, *file = 0, *res = NULL;
5710 Picklerobject *pickler = 0;
5711 int proto = 0;
5712
5713 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5714 &ob, &proto)))
5715 goto finally;
5716
5717 if (!( file = PycStringIO->NewOutput(128)))
5718 goto finally;
5719
5720 if (!( pickler = newPicklerobject(file, proto)))
5721 goto finally;
5722
5723 if (dump(pickler, ob) < 0)
5724 goto finally;
5725
5726 res = PycStringIO->cgetvalue(file);
5727
5728 finally:
5729 Py_XDECREF(pickler);
5730 Py_XDECREF(file);
5731
5732 return res;
5733}
5734
5735
5736/* load(fileobj). */
5737static PyObject *
5738cpm_load(PyObject *self, PyObject *ob)
5739{
5740 Unpicklerobject *unpickler = 0;
5741 PyObject *res = NULL;
5742
5743 if (!( unpickler = newUnpicklerobject(ob)))
5744 goto finally;
5745
5746 res = load(unpickler);
5747
5748 finally:
5749 Py_XDECREF(unpickler);
5750
5751 return res;
5752}
5753
5754
5755/* loads(string) */
5756static PyObject *
5757cpm_loads(PyObject *self, PyObject *args)
5758{
5759 PyObject *ob, *file = 0, *res = NULL;
5760 Unpicklerobject *unpickler = 0;
5761
5762 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
5763 goto finally;
5764
5765 if (!( file = PycStringIO->NewInput(ob)))
5766 goto finally;
5767
5768 if (!( unpickler = newUnpicklerobject(file)))
5769 goto finally;
5770
5771 res = load(unpickler);
5772
5773 finally:
5774 Py_XDECREF(file);
5775 Py_XDECREF(unpickler);
5776
5777 return res;
5778}
5779
5780
5781PyDoc_STRVAR(Unpicklertype__doc__,
5782"Objects that know how to unpickle");
5783
5784static PyTypeObject Unpicklertype = {
5785 PyVarObject_HEAD_INIT(NULL, 0)
5786 "cPickle.Unpickler", /*tp_name*/
5787 sizeof(Unpicklerobject), /*tp_basicsize*/
5788 0,
5789 (destructor)Unpickler_dealloc, /* tp_dealloc */
5790 0, /* tp_print */
5791 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5792 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5793 0, /* tp_compare */
5794 0, /* tp_repr */
5795 0, /* tp_as_number */
5796 0, /* tp_as_sequence */
5797 0, /* tp_as_mapping */
5798 0, /* tp_hash */
5799 0, /* tp_call */
5800 0, /* tp_str */
5801 0, /* tp_getattro */
5802 0, /* tp_setattro */
5803 0, /* tp_as_buffer */
5804 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5805 Unpicklertype__doc__, /* tp_doc */
5806 (traverseproc)Unpickler_traverse, /* tp_traverse */
5807 (inquiry)Unpickler_clear, /* tp_clear */
5808};
5809
5810static struct PyMethodDef cPickle_methods[] = {
5811 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5812 PyDoc_STR("dump(obj, file, protocol=0) -- "
5813 "Write an object in pickle format to the given file.\n"
5814 "\n"
5815 "See the Pickler docstring for the meaning of optional argument proto.")
5816 },
5817
5818 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5819 PyDoc_STR("dumps(obj, protocol=0) -- "
5820 "Return a string containing an object in pickle format.\n"
5821 "\n"
5822 "See the Pickler docstring for the meaning of optional argument proto.")
5823 },
5824
5825 {"load", (PyCFunction)cpm_load, METH_O,
5826 PyDoc_STR("load(file) -- Load a pickle from the given file")},
5827
5828 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
5829 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
5830
5831 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5832 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
5833 "\n"
5834 "This takes a file-like object for writing a pickle data stream.\n"
5835 "The optional proto argument tells the pickler to use the given\n"
5836 "protocol; supported protocols are 0, 1, 2. The default\n"
5837 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5838 "only protocol that can be written to a file opened in text\n"
5839 "mode and read back successfully. When using a protocol higher\n"
5840 "than 0, make sure the file is opened in binary mode, both when\n"
5841 "pickling and unpickling.)\n"
5842 "\n"
5843 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5844 "more efficient than protocol 1.\n"
5845 "\n"
5846 "Specifying a negative protocol version selects the highest\n"
5847 "protocol version supported. The higher the protocol used, the\n"
5848 "more recent the version of Python needed to read the pickle\n"
5849 "produced.\n"
5850 "\n"
5851 "The file parameter must have a write() method that accepts a single\n"
5852 "string argument. It can thus be an open file object, a StringIO\n"
5853 "object, or any other custom object that meets this interface.\n")
5854 },
5855
5856 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
5857 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5858
5859 { NULL, NULL }
5860};
5861
5862static int
5863init_stuff(PyObject *module_dict)
5864{
5865 PyObject *copyreg, *t, *r;
5866
5867#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
5868
5869 if (PyType_Ready(&Unpicklertype) < 0)
5870 return -1;
5871 if (PyType_Ready(&Picklertype) < 0)
5872 return -1;
5873
5874 INIT_STR(__class__);
5875 INIT_STR(__getinitargs__);
5876 INIT_STR(__dict__);
5877 INIT_STR(__getstate__);
5878 INIT_STR(__setstate__);
5879 INIT_STR(__name__);
5880 INIT_STR(__main__);
5881 INIT_STR(__reduce__);
5882 INIT_STR(__reduce_ex__);
5883 INIT_STR(write);
5884 INIT_STR(append);
5885 INIT_STR(read);
5886 INIT_STR(readline);
5887 INIT_STR(dispatch_table);
5888
5889 if (!( copyreg = PyImport_ImportModule("copy_reg")))
5890 return -1;
5891
5892 /* This is special because we want to use a different
5893 one in restricted mode. */
5894 dispatch_table = PyObject_GetAttr(copyreg, dispatch_table_str);
5895 if (!dispatch_table) return -1;
5896
5897 extension_registry = PyObject_GetAttrString(copyreg,
5898 "_extension_registry");
5899 if (!extension_registry) return -1;
5900
5901 inverted_registry = PyObject_GetAttrString(copyreg,
5902 "_inverted_registry");
5903 if (!inverted_registry) return -1;
5904
5905 extension_cache = PyObject_GetAttrString(copyreg,
5906 "_extension_cache");
5907 if (!extension_cache) return -1;
5908
5909 Py_DECREF(copyreg);
5910
5911 if (!(empty_tuple = PyTuple_New(0)))
5912 return -1;
5913
5914 two_tuple = PyTuple_New(2);
5915 if (two_tuple == NULL)
5916 return -1;
5917 /* We use this temp container with no regard to refcounts, or to
5918 * keeping containees alive. Exempt from GC, because we don't
5919 * want anything looking at two_tuple() by magic.
5920 */
5921 PyObject_GC_UnTrack(two_tuple);
5922
5923 /* Ugh */
5924 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5925 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5926 return -1;
5927
5928 if (!( t=PyDict_New())) return -1;
5929 if (!( r=PyRun_String(
5930 "def __str__(self):\n"
5931 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5932 Py_file_input,
5933 module_dict, t) )) return -1;
5934 Py_DECREF(r);
5935
5936 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
5937 if (!PickleError)
5938 return -1;
5939
5940 Py_DECREF(t);
5941
5942 PicklingError = PyErr_NewException("cPickle.PicklingError",
5943 PickleError, NULL);
5944 if (!PicklingError)
5945 return -1;
5946
5947 if (!( t=PyDict_New())) return -1;
5948 if (!( r=PyRun_String(
5949 "def __str__(self):\n"
5950 " a=self.args\n"
5951 " a=a and type(a[0]) or '(what)'\n"
5952 " return 'Cannot pickle %s objects' % a\n"
5953 , Py_file_input,
5954 module_dict, t) )) return -1;
5955 Py_DECREF(r);
5956
5957 if (!( UnpickleableError = PyErr_NewException(
5958 "cPickle.UnpickleableError", PicklingError, t)))
5959 return -1;
5960
5961 Py_DECREF(t);
5962
5963 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
5964 PickleError, NULL)))
5965 return -1;
5966
5967 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5968 UnpicklingError, NULL)))
5969 return -1;
5970
5971 if (PyDict_SetItemString(module_dict, "PickleError",
5972 PickleError) < 0)
5973 return -1;
5974
5975 if (PyDict_SetItemString(module_dict, "PicklingError",
5976 PicklingError) < 0)
5977 return -1;
5978
5979 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5980 UnpicklingError) < 0)
5981 return -1;
5982
5983 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5984 UnpickleableError) < 0)
5985 return -1;
5986
5987 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5988 BadPickleGet) < 0)
5989 return -1;
5990
5991 PycString_IMPORT;
5992
5993 return 0;
5994}
5995
5996#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5997#define PyMODINIT_FUNC void
5998#endif
5999PyMODINIT_FUNC
6000initcPickle(void)
6001{
6002 PyObject *m, *d, *di, *v, *k;
6003 Py_ssize_t i;
6004 char *rev = "1.71"; /* XXX when does this change? */
6005 PyObject *format_version;
6006 PyObject *compatible_formats;
6007
6008 Py_TYPE(&Picklertype) = &PyType_Type;
6009 Py_TYPE(&Unpicklertype) = &PyType_Type;
6010 Py_TYPE(&PdataType) = &PyType_Type;
6011
6012 /* Initialize some pieces. We need to do this before module creation,
6013 * so we're forced to use a temporary dictionary. :(
6014 */
6015 di = PyDict_New();
6016 if (!di) return;
6017 if (init_stuff(di) < 0) return;
6018
6019 /* Create the module and add the functions */
6020 m = Py_InitModule4("cPickle", cPickle_methods,
6021 cPickle_module_documentation,
6022 (PyObject*)NULL,PYTHON_API_VERSION);
6023 if (m == NULL)
6024 return;
6025
6026 /* Add some symbolic constants to the module */
6027 d = PyModule_GetDict(m);
6028 v = PyString_FromString(rev);
6029 PyDict_SetItemString(d, "__version__", v);
6030 Py_XDECREF(v);
6031
6032 /* Copy data from di. Waaa. */
6033 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
6034 if (PyObject_SetItem(d, k, v) < 0) {
6035 Py_DECREF(di);
6036 return;
6037 }
6038 }
6039 Py_DECREF(di);
6040
6041 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
6042 if (i < 0)
6043 return;
6044
6045 /* These are purely informational; no code uses them. */
6046 /* File format version we write. */
6047 format_version = PyString_FromString("2.0");
6048 /* Format versions we can read. */
6049 compatible_formats = Py_BuildValue("[sssss]",
6050 "1.0", /* Original protocol 0 */
6051 "1.1", /* Protocol 0 + INST */
6052 "1.2", /* Original protocol 1 */
6053 "1.3", /* Protocol 1 + BINFLOAT */
6054 "2.0"); /* Original protocol 2 */
6055 PyDict_SetItemString(d, "format_version", format_version);
6056 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
6057 Py_XDECREF(format_version);
6058 Py_XDECREF(compatible_formats);
6059}
Note: See TracBrowser for help on using the repository browser.