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