blob: 70ead4849a44cbc52992e52e8f8ea52ef90e1bf4 [file] [log] [blame]
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001#include "Python.h"
2#include "cStringIO.h"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005PyDoc_STRVAR(cPickle_module_documentation,
6"C implementation and optimization of the Python pickle module\n"
7"\n"
8"cPickle.c,v 1.71 1999/07/11 13:30:34 jim Exp\n");
9
Guido van Rossum142eeb81997-08-13 03:14:41 +000010#ifndef Py_eval_input
11#include <graminit.h>
12#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000013#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000014
Guido van Rossum2f4caa41997-01-06 22:59:08 +000015#include <errno.h>
16
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +000017
Guido van Rossum2f4caa41997-01-06 22:59:08 +000018
Guido van Rossum60456fd1997-04-09 17:36:32 +000019#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000020
Guido van Rossum60456fd1997-04-09 17:36:32 +000021#define WRITE_BUF_SIZE 256
22
Tim Peters3906eb82001-04-10 04:22:00 +000023/* --------------------------------------------------------------------------
24NOTES on format codes.
25XXX much more is needed here
26
27Integer types
Tim Petersd8ae7c22001-04-10 04:35:28 +000028BININT1 8-bit unsigned integer; followed by 1 byte.
Tim Peters3906eb82001-04-10 04:22:00 +000029BININT2 16-bit unsigned integer; followed by 2 bytes, little-endian.
Tim Petersd8ae7c22001-04-10 04:35:28 +000030BININT 32-bit signed integer; followed by 4 bytes, little-endian.
31INT Integer; natural decimal string conversion, then newline.
Tim Peters3906eb82001-04-10 04:22:00 +000032 CAUTION: INT-reading code can't assume that what follows
33 fits in a Python int, because the size of Python ints varies
34 across platforms.
Tim Petersd8ae7c22001-04-10 04:35:28 +000035LONG Long (unbounded) integer; repr(i), then newline.
Tim Peters3906eb82001-04-10 04:22:00 +000036-------------------------------------------------------------------------- */
Guido van Rossum60456fd1997-04-09 17:36:32 +000037
38#define MARK '('
39#define STOP '.'
40#define POP '0'
41#define POP_MARK '1'
42#define DUP '2'
43#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000044#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000045#define INT 'I'
46#define BININT 'J'
47#define BININT1 'K'
48#define LONG 'L'
49#define BININT2 'M'
50#define NONE 'N'
51#define PERSID 'P'
52#define BINPERSID 'Q'
53#define REDUCE 'R'
54#define STRING 'S'
55#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000056#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000057#define UNICODE 'V'
58#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000059#define APPEND 'a'
60#define BUILD 'b'
61#define GLOBAL 'c'
62#define DICT 'd'
63#define EMPTY_DICT '}'
64#define APPENDS 'e'
65#define GET 'g'
66#define BINGET 'h'
67#define INST 'i'
68#define LONG_BINGET 'j'
69#define LIST 'l'
70#define EMPTY_LIST ']'
71#define OBJ 'o'
72#define PUT 'p'
73#define BINPUT 'q'
74#define LONG_BINPUT 'r'
75#define SETITEM 's'
76#define TUPLE 't'
77#define EMPTY_TUPLE ')'
78#define SETITEMS 'u'
Guido van Rossume2763392002-04-05 19:30:08 +000079#define TRUE "I01\n"
80#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000081
Guido van Rossum2f4caa41997-01-06 22:59:08 +000082
Guido van Rossum60456fd1997-04-09 17:36:32 +000083static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000084
Guido van Rossumc03158b1999-06-09 15:23:31 +000085static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000086static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +000087static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000088static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +000089static PyObject *BadPickleGet;
90
Guido van Rossum2f4caa41997-01-06 22:59:08 +000091
Guido van Rossum60456fd1997-04-09 17:36:32 +000092static PyObject *dispatch_table;
93static PyObject *safe_constructors;
Guido van Rossum60456fd1997-04-09 17:36:32 +000094static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000095
Guido van Rossum60456fd1997-04-09 17:36:32 +000096static PyObject *__class___str, *__getinitargs___str, *__dict___str,
97 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
98 *write_str, *__safe_for_unpickling___str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +000099 *read_str, *readline_str, *__main___str, *__basicnew___str,
Fred Drake2c7a6852001-07-17 18:34:03 +0000100 *copy_reg_str, *dispatch_table_str, *safe_constructors_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000101
Guido van Rossum053b8df1998-11-25 16:18:00 +0000102/*************************************************************************
103 Internal Data type for pickle data. */
104
105typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000106 PyObject_HEAD
107 int length, size;
108 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000109} Pdata;
110
Tim Peters84e87f32001-03-17 04:50:51 +0000111static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000112Pdata_dealloc(Pdata *self)
113{
114 int i;
115 PyObject **p;
116
117 for (i=self->length, p=self->data; --i >= 0; p++) Py_DECREF(*p);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000119 if (self->data) free(self->data);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000121 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000122}
123
124static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000125 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
126 (destructor)Pdata_dealloc,
127 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000128};
129
130#define Pdata_Check(O) ((O)->ob_type == &PdataType)
131
132static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000133Pdata_New(void)
134{
135 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000137 if (!( self = PyObject_New(Pdata, &PdataType))) return NULL;
138 self->size=8;
139 self->length=0;
140 self->data=malloc(self->size * sizeof(PyObject*));
141 if (self->data) return (PyObject*)self;
142 Py_DECREF(self);
143 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000144}
145
Tim Peters84e87f32001-03-17 04:50:51 +0000146static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000147stackUnderflow(void)
148{
149 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
150 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000151}
152
153static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000154Pdata_clear(Pdata *self, int clearto)
155{
156 int i;
157 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000159 if (clearto < 0) return stackUnderflow();
160 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000162 for (i=self->length, p=self->data+clearto; --i >= clearto; p++)
163 Py_DECREF(*p);
164 self->length=clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000166 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000167}
168
169
Tim Peters84e87f32001-03-17 04:50:51 +0000170static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000171Pdata_grow(Pdata *self)
172{
173 if (! self->size) {
174 PyErr_NoMemory();
175 return -1;
176 }
177 self->size *= 2;
178 self->data = realloc(self->data, self->size*sizeof(PyObject*));
179 if (! self->data) {
180 self->size = 0;
181 PyErr_NoMemory();
182 return -1;
183 }
184 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000185}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000186
187#define PDATA_POP(D,V) { \
188 if ((D)->length) V=D->data[--((D)->length)]; \
189 else { \
190 PyErr_SetString(UnpicklingError, "bad pickle data"); \
191 V=NULL; \
192 } \
193}
194
195
196static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000197Pdata_popTuple(Pdata *self, int start)
198{
199 PyObject *r;
200 int i, j, l;
201
202 l=self->length-start;
203 if (!( r=PyTuple_New(l))) return NULL;
204 for (i=start, j=0 ; j < l; i++, j++)
205 PyTuple_SET_ITEM(r, j, self->data[i]);
206
207 self->length=start;
208 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000209}
210
211static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000212Pdata_popList(Pdata *self, int start)
213{
214 PyObject *r;
215 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000217 l=self->length-start;
218 if (!( r=PyList_New(l))) return NULL;
219 for (i=start, j=0 ; j < l; i++, j++)
220 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000222 self->length=start;
223 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000224}
225
226#define PDATA_APPEND_(D,O,ER) { \
227 if (Pdata_Append(((Pdata*)(D)), O) < 0) return ER; \
228}
229
230#define PDATA_APPEND(D,O,ER) { \
231 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
232 Pdata_grow((Pdata*)(D)) < 0) \
233 return ER; \
234 Py_INCREF(O); \
235 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
236}
237
238#define PDATA_PUSH(D,O,ER) { \
239 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
240 Pdata_grow((Pdata*)(D)) < 0) { \
241 Py_DECREF(O); \
242 return ER; \
243 } \
244 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
245}
246
247/*************************************************************************/
248
249#define ARG_TUP(self, o) { \
250 if (self->arg || (self->arg=PyTuple_New(1))) { \
251 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
252 PyTuple_SET_ITEM(self->arg,0,o); \
253 } \
254 else { \
255 Py_DECREF(o); \
256 } \
257}
258
259#define FREE_ARG_TUP(self) { \
260 if (self->arg->ob_refcnt > 1) { \
261 Py_DECREF(self->arg); \
262 self->arg=NULL; \
263 } \
264 }
265
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000266typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000267 PyObject_HEAD
268 FILE *fp;
269 PyObject *write;
270 PyObject *file;
271 PyObject *memo;
272 PyObject *arg;
273 PyObject *pers_func;
274 PyObject *inst_pers_func;
275 int bin;
276 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
277 int (*write_func)(struct Picklerobject *, char *, int);
278 char *write_buf;
279 int buf_size;
280 PyObject *dispatch_table;
281 int fast_container; /* count nested container dumps */
282 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000283} Picklerobject;
284
Barry Warsaw52acb492001-12-21 20:04:22 +0000285#ifndef PY_CPICKLE_FAST_LIMIT
286#define PY_CPICKLE_FAST_LIMIT 50
287#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000288
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000289staticforward PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000290
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000291typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000292 PyObject_HEAD
293 FILE *fp;
294 PyObject *file;
295 PyObject *readline;
296 PyObject *read;
297 PyObject *memo;
298 PyObject *arg;
299 Pdata *stack;
300 PyObject *mark;
301 PyObject *pers_func;
302 PyObject *last_string;
303 int *marks;
304 int num_marks;
305 int marks_size;
306 int (*read_func)(struct Unpicklerobject *, char **, int);
307 int (*readline_func)(struct Unpicklerobject *, char **);
308 int buf_size;
309 char *buf;
310 PyObject *safe_constructors;
311 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000312} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000313
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000314staticforward PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000315
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000316/* Forward decls that need the above structs */
317static int save(Picklerobject *, PyObject *, int);
318static int put2(Picklerobject *, PyObject *);
319
Tim Peters84e87f32001-03-17 04:50:51 +0000320int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000321cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
322{
323 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000325 if ((v = PyObject_GetItem(o,key))) {
326 Py_DECREF(v);
327 return 1;
328 }
329
330 PyErr_Clear();
331 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000332}
333
Guido van Rossumd385d591997-04-09 17:47:47 +0000334static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000335PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000336cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
337{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000338 va_list va;
339 PyObject *args=0, *retval=0;
340 va_start(va, format);
341
342 if (format) args = Py_VaBuildValue(format, va);
343 va_end(va);
344 if (format && ! args) return NULL;
345 if (stringformat && !(retval=PyString_FromString(stringformat)))
346 return NULL;
347
348 if (retval) {
349 if (args) {
350 PyObject *v;
351 v=PyString_Format(retval, args);
352 Py_DECREF(retval);
353 Py_DECREF(args);
354 if (! v) return NULL;
355 retval=v;
356 }
357 }
358 else
359 if (args) retval=args;
360 else {
361 PyErr_SetObject(ErrType,Py_None);
362 return NULL;
363 }
364 PyErr_SetObject(ErrType,retval);
365 Py_DECREF(retval);
366 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000367}
368
Tim Peters84e87f32001-03-17 04:50:51 +0000369static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000370write_file(Picklerobject *self, char *s, int n)
371{
372 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000374 if (s == NULL) {
375 return 0;
376 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000377
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000378 Py_BEGIN_ALLOW_THREADS
379 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
380 Py_END_ALLOW_THREADS
381 if (nbyteswritten != (size_t)n) {
382 PyErr_SetFromErrno(PyExc_IOError);
383 return -1;
384 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000386 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000387}
388
Tim Peters84e87f32001-03-17 04:50:51 +0000389static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000390write_cStringIO(Picklerobject *self, char *s, int n)
391{
392 if (s == NULL) {
393 return 0;
394 }
395
396 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
397 return -1;
398 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000400 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000401}
402
Tim Peters84e87f32001-03-17 04:50:51 +0000403static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000404write_none(Picklerobject *self, char *s, int n)
405{
406 if (s == NULL) return 0;
407 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000408}
409
Tim Peters84e87f32001-03-17 04:50:51 +0000410static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000411write_other(Picklerobject *self, char *s, int n)
412{
413 PyObject *py_str = 0, *junk = 0;
414
415 if (s == NULL) {
416 if (!( self->buf_size )) return 0;
417 py_str = PyString_FromStringAndSize(self->write_buf,
418 self->buf_size);
419 if (!py_str)
420 return -1;
421 }
422 else {
423 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
424 if (write_other(self, NULL, 0) < 0)
425 return -1;
426 }
427
428 if (n > WRITE_BUF_SIZE) {
429 if (!( py_str =
430 PyString_FromStringAndSize(s, n)))
431 return -1;
432 }
433 else {
434 memcpy(self->write_buf + self->buf_size, s, n);
435 self->buf_size += n;
436 return n;
437 }
438 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000440 if (self->write) {
441 /* object with write method */
442 ARG_TUP(self, py_str);
443 if (self->arg) {
444 junk = PyObject_Call(self->write, self->arg, NULL);
445 FREE_ARG_TUP(self);
446 }
447 if (junk) Py_DECREF(junk);
448 else return -1;
449 }
450 else
451 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000453 self->buf_size = 0;
454 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000455}
456
457
Tim Peters84e87f32001-03-17 04:50:51 +0000458static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000459read_file(Unpicklerobject *self, char **s, int n)
460{
461 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000462
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000463 if (self->buf_size == 0) {
464 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000466 size = ((n < 32) ? 32 : n);
467 if (!( self->buf = (char *)malloc(size * sizeof(char)))) {
468 PyErr_NoMemory();
469 return -1;
470 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000472 self->buf_size = size;
473 }
474 else if (n > self->buf_size) {
475 self->buf = (char *)realloc(self->buf, n * sizeof(char));
476 if (!self->buf) {
477 PyErr_NoMemory();
478 return -1;
479 }
Tim Peters84e87f32001-03-17 04:50:51 +0000480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000481 self->buf_size = n;
482 }
Tim Peters84e87f32001-03-17 04:50:51 +0000483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000484 Py_BEGIN_ALLOW_THREADS
485 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
486 Py_END_ALLOW_THREADS
487 if (nbytesread != (size_t)n) {
488 if (feof(self->fp)) {
489 PyErr_SetNone(PyExc_EOFError);
490 return -1;
491 }
492
493 PyErr_SetFromErrno(PyExc_IOError);
494 return -1;
495 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000497 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000499 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000500}
501
502
Tim Peters84e87f32001-03-17 04:50:51 +0000503static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000504readline_file(Unpicklerobject *self, char **s)
505{
506 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000508 if (self->buf_size == 0) {
509 if (!( self->buf = (char *)malloc(40 * sizeof(char)))) {
510 PyErr_NoMemory();
511 return -1;
512 }
Tim Peters84e87f32001-03-17 04:50:51 +0000513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000514 self->buf_size = 40;
515 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000516
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000517 i = 0;
518 while (1) {
519 for (; i < (self->buf_size - 1); i++) {
520 if (feof(self->fp) ||
521 (self->buf[i] = getc(self->fp)) == '\n') {
522 self->buf[i + 1] = '\0';
523 *s = self->buf;
524 return i + 1;
525 }
526 }
527 self->buf = (char *)realloc(self->buf,
528 (self->buf_size * 2) * sizeof(char));
529 if (!self->buf) {
530 PyErr_NoMemory();
531 return -1;
532 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000534 self->buf_size *= 2;
535 }
Tim Peters84e87f32001-03-17 04:50:51 +0000536}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000537
538
Tim Peters84e87f32001-03-17 04:50:51 +0000539static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000540read_cStringIO(Unpicklerobject *self, char **s, int n)
541{
542 char *ptr;
543
544 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
545 PyErr_SetNone(PyExc_EOFError);
546 return -1;
547 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000549 *s = ptr;
550
551 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000552}
553
554
Tim Peters84e87f32001-03-17 04:50:51 +0000555static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000556readline_cStringIO(Unpicklerobject *self, char **s)
557{
558 int n;
559 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000561 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
562 return -1;
563 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000565 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000567 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000568}
569
570
Tim Peters84e87f32001-03-17 04:50:51 +0000571static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000572read_other(Unpicklerobject *self, char **s, int n)
573{
574 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000576 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000578 ARG_TUP(self, bytes);
579 if (self->arg) {
580 str = PyObject_Call(self->read, self->arg, NULL);
581 FREE_ARG_TUP(self);
582 }
583 if (! str) return -1;
584
585 Py_XDECREF(self->last_string);
586 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000588 if (! (*s = PyString_AsString(str))) return -1;
589 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000590}
591
592
Tim Peters84e87f32001-03-17 04:50:51 +0000593static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000594readline_other(Unpicklerobject *self, char **s)
595{
596 PyObject *str;
597 int str_size;
598
599 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
600 return -1;
601 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000603 if ((str_size = PyString_Size(str)) < 0)
604 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000606 Py_XDECREF(self->last_string);
607 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000609 if (! (*s = PyString_AsString(str)))
610 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000612 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000613}
614
615
616static char *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000617pystrndup(char *s, int l)
618{
619 char *r;
620 if (!( r=malloc((l+1)*sizeof(char)))) return (char*)PyErr_NoMemory();
621 memcpy(r,s,l);
622 r[l]=0;
623 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000624}
625
626
627static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000628get(Picklerobject *self, PyObject *id)
629{
630 PyObject *value, *mv;
631 long c_value;
632 char s[30];
633 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000635 if (!( mv = PyDict_GetItem(self->memo, id))) {
636 PyErr_SetObject(PyExc_KeyError, id);
637 return -1;
638 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000640 if (!( value = PyTuple_GetItem(mv, 0)))
641 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000643 if (!( PyInt_Check(value))) {
644 PyErr_SetString(PicklingError, "no int where int expected in memo");
645 return -1;
646 }
647 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000649 if (!self->bin) {
650 s[0] = GET;
651 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
652 len = strlen(s);
653 }
654 else if (Pdata_Check(self->file)) {
655 if (write_other(self, NULL, 0) < 0) return -1;
656 PDATA_APPEND(self->file, mv, -1);
657 return 0;
658 }
659 else {
660 if (c_value < 256) {
661 s[0] = BINGET;
662 s[1] = (int)(c_value & 0xff);
663 len = 2;
664 }
665 else {
666 s[0] = LONG_BINGET;
667 s[1] = (int)(c_value & 0xff);
668 s[2] = (int)((c_value >> 8) & 0xff);
669 s[3] = (int)((c_value >> 16) & 0xff);
670 s[4] = (int)((c_value >> 24) & 0xff);
671 len = 5;
672 }
673 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000675 if ((*self->write_func)(self, s, len) < 0)
676 return -1;
677
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000678 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000679}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000680
Guido van Rossum60456fd1997-04-09 17:36:32 +0000681
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000682static int
683put(Picklerobject *self, PyObject *ob)
684{
685 if (ob->ob_refcnt < 2 || self->fast)
686 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000687
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000688 return put2(self, ob);
689}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000690
Guido van Rossum053b8df1998-11-25 16:18:00 +0000691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000692static int
693put2(Picklerobject *self, PyObject *ob)
694{
695 char c_str[30];
696 int p;
697 size_t len;
698 int res = -1;
699 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000701 if (self->fast)
702 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000704 if ((p = PyDict_Size(self->memo)) < 0)
705 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000707 /* Make sure memo keys are positive! */
708 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000710 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
711 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000713 if (!( memo_len = PyInt_FromLong(p)))
714 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000716 if (!( t = PyTuple_New(2)))
717 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000719 PyTuple_SET_ITEM(t, 0, memo_len);
720 Py_INCREF(memo_len);
721 PyTuple_SET_ITEM(t, 1, ob);
722 Py_INCREF(ob);
723
724 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
725 goto finally;
726
727 if (!self->bin) {
728 c_str[0] = PUT;
729 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
730 len = strlen(c_str);
731 }
732 else if (Pdata_Check(self->file)) {
733 if (write_other(self, NULL, 0) < 0) return -1;
734 PDATA_APPEND(self->file, memo_len, -1);
735 res=0; /* Job well done ;) */
736 goto finally;
737 }
738 else {
739 if (p >= 256) {
740 c_str[0] = LONG_BINPUT;
741 c_str[1] = (int)(p & 0xff);
742 c_str[2] = (int)((p >> 8) & 0xff);
743 c_str[3] = (int)((p >> 16) & 0xff);
744 c_str[4] = (int)((p >> 24) & 0xff);
745 len = 5;
746 }
747 else {
748 c_str[0] = BINPUT;
749 c_str[1] = p;
750 len = 2;
751 }
752 }
753
754 if ((*self->write_func)(self, c_str, len) < 0)
755 goto finally;
756
757 res = 0;
758
759 finally:
760 Py_XDECREF(py_ob_id);
761 Py_XDECREF(memo_len);
762 Py_XDECREF(t);
763
764 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000765}
766
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000767#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000768
769static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000770PyImport_Import(PyObject *module_name)
771{
772 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
773 static PyObject *standard_builtins=0;
774 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000776 if (!( silly_list )) {
777 if (!( __import___str=PyString_FromString("__import__")))
778 return NULL;
779 if (!( __builtins___str=PyString_FromString("__builtins__")))
780 return NULL;
781 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
782 return NULL;
783 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000785 if ((globals=PyEval_GetGlobals())) {
786 Py_INCREF(globals);
787 __builtins__=PyObject_GetItem(globals,__builtins___str);
788 if (!__builtins__)
789 goto err;
790 }
791 else {
792 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000794 if (!(standard_builtins ||
795 (standard_builtins=PyImport_ImportModule("__builtin__"))))
796 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000798 __builtins__=standard_builtins;
799 Py_INCREF(__builtins__);
800 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
801 if (!globals)
802 goto err;
803 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000805 if (PyDict_Check(__builtins__)) {
806 __import__=PyObject_GetItem(__builtins__,__import___str);
807 if (!__import__) goto err;
808 }
809 else {
810 __import__=PyObject_GetAttr(__builtins__,__import___str);
811 if (!__import__) goto err;
812 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000814 r=PyObject_CallFunction(__import__,"OOOO",
815 module_name, globals, globals, silly_list);
816 if (!r)
817 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000819 Py_DECREF(globals);
820 Py_DECREF(__builtins__);
821 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000823 return r;
824 err:
825 Py_XDECREF(globals);
826 Py_XDECREF(__builtins__);
827 Py_XDECREF(__import__);
828 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000829}
830
831static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000832whichmodule(PyObject *global, PyObject *global_name)
833{
834 int i, j;
835 PyObject *module = 0, *modules_dict = 0,
836 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000838 module = PyObject_GetAttrString(global, "__module__");
839 if (module) return module;
840 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000842 if (!( modules_dict = PySys_GetObject("modules")))
843 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000845 i = 0;
846 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000848 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000850 global_name_attr = PyObject_GetAttr(module, global_name);
851 if (!global_name_attr) {
852 PyErr_Clear();
853 continue;
854 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000856 if (global_name_attr != global) {
857 Py_DECREF(global_name_attr);
858 continue;
859 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000861 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000863 break;
864 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000866 /* The following implements the rule in pickle.py added in 1.5
867 that used __main__ if no module is found. I don't actually
868 like this rule. jlf
869 */
870 if (!j) {
871 j=1;
872 name=__main___str;
873 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000875 Py_INCREF(name);
876 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000877}
878
879
Guido van Rossum60456fd1997-04-09 17:36:32 +0000880static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000881fast_save_enter(Picklerobject *self, PyObject *obj)
882{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000883 /* if fast_container < 0, we're doing an error exit. */
884 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
885 PyObject *key = NULL;
886 if (self->fast_memo == NULL) {
887 self->fast_memo = PyDict_New();
888 if (self->fast_memo == NULL) {
889 self->fast_container = -1;
890 return 0;
891 }
892 }
893 key = PyLong_FromVoidPtr(obj);
894 if (key == NULL)
895 return 0;
896 if (PyDict_GetItem(self->fast_memo, key)) {
897 PyErr_Format(PyExc_ValueError,
898 "fast mode: can't pickle cyclic objects including object type %s at %p",
899 obj->ob_type->tp_name, obj);
900 self->fast_container = -1;
901 return 0;
902 }
903 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
904 self->fast_container = -1;
905 return 0;
906 }
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000907 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000908 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000909}
910
911int
912fast_save_leave(Picklerobject *self, PyObject *obj)
913{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000914 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
915 PyObject *key = PyLong_FromVoidPtr(obj);
916 if (key == NULL)
917 return 0;
918 if (PyDict_DelItem(self->fast_memo, key) < 0) {
919 return 0;
920 }
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000921 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000922 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000923}
924
925static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000926save_none(Picklerobject *self, PyObject *args)
927{
928 static char none = NONE;
929 if ((*self->write_func)(self, &none, 1) < 0)
930 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000932 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000933}
934
Guido van Rossum77f6a652002-04-03 22:41:51 +0000935static int
936save_bool(Picklerobject *self, PyObject *args)
937{
Guido van Rossume2763392002-04-05 19:30:08 +0000938 static char *buf[2] = {FALSE, TRUE};
939 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000940 long l = PyInt_AS_LONG((PyIntObject *)args);
941
Guido van Rossume2763392002-04-05 19:30:08 +0000942 if ((*self->write_func)(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000943 return -1;
944
945 return 0;
946}
Tim Peters84e87f32001-03-17 04:50:51 +0000947
Guido van Rossum60456fd1997-04-09 17:36:32 +0000948static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000949save_int(Picklerobject *self, PyObject *args)
950{
951 char c_str[32];
952 long l = PyInt_AS_LONG((PyIntObject *)args);
953 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000955 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000956#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000957 || l > 0x7fffffffL
958 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000959#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000960 ) {
961 /* Text-mode pickle, or long too big to fit in the 4-byte
962 * signed BININT format: store as a string.
963 */
964 c_str[0] = INT;
965 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
966 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
967 return -1;
968 }
969 else {
970 /* Binary pickle and l fits in a signed 4-byte int. */
971 c_str[1] = (int)( l & 0xff);
972 c_str[2] = (int)((l >> 8) & 0xff);
973 c_str[3] = (int)((l >> 16) & 0xff);
974 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000976 if ((c_str[4] == 0) && (c_str[3] == 0)) {
977 if (c_str[2] == 0) {
978 c_str[0] = BININT1;
979 len = 2;
980 }
981 else {
982 c_str[0] = BININT2;
983 len = 3;
984 }
985 }
986 else {
987 c_str[0] = BININT;
988 len = 5;
989 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000991 if ((*self->write_func)(self, c_str, len) < 0)
992 return -1;
993 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000995 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000996}
997
998
999static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001000save_long(Picklerobject *self, PyObject *args)
1001{
1002 int size, res = -1;
1003 PyObject *repr = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001004
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001005 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001007 if (!( repr = PyObject_Repr(args)))
1008 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001009
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001010 if ((size = PyString_Size(repr)) < 0)
1011 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001012
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001013 if ((*self->write_func)(self, &l, 1) < 0)
1014 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001016 if ((*self->write_func)(self,
1017 PyString_AS_STRING((PyStringObject *)repr),
1018 size) < 0)
1019 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001021 if ((*self->write_func)(self, "\n", 1) < 0)
1022 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001024 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001026 finally:
1027 Py_XDECREF(repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001029 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001030}
1031
1032
1033static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001034save_float(Picklerobject *self, PyObject *args)
1035{
1036 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001038 if (self->bin) {
1039 int s, e;
1040 double f;
1041 long fhi, flo;
1042 char str[9];
1043 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001045 *p = BINFLOAT;
1046 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001048 if (x < 0) {
1049 s = 1;
1050 x = -x;
1051 }
1052 else
1053 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001055 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001057 /* Normalize f to be in the range [1.0, 2.0) */
1058 if (0.5 <= f && f < 1.0) {
1059 f *= 2.0;
1060 e--;
1061 }
1062 else if (f == 0.0) {
1063 e = 0;
1064 }
1065 else {
1066 PyErr_SetString(PyExc_SystemError,
1067 "frexp() result out of range");
1068 return -1;
1069 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001071 if (e >= 1024) {
1072 /* XXX 1024 itself is reserved for Inf/NaN */
1073 PyErr_SetString(PyExc_OverflowError,
1074 "float too large to pack with d format");
1075 return -1;
1076 }
1077 else if (e < -1022) {
1078 /* Gradual underflow */
1079 f = ldexp(f, 1022 + e);
1080 e = 0;
1081 }
1082 else if (!(e == 0 && f == 0.0)) {
1083 e += 1023;
1084 f -= 1.0; /* Get rid of leading 1 */
1085 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001087 /* fhi receives the high 28 bits;
1088 flo the low 24 bits (== 52 bits) */
1089 f *= 268435456.0; /* 2**28 */
1090 fhi = (long) floor(f); /* Truncate */
1091 f -= (double)fhi;
1092 f *= 16777216.0; /* 2**24 */
1093 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001095 /* First byte */
1096 *p = (s<<7) | (e>>4);
1097 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001099 /* Second byte */
1100 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1101 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001103 /* Third byte */
1104 *p = (unsigned char) ((fhi>>16) & 0xFF);
1105 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001107 /* Fourth byte */
1108 *p = (unsigned char) ((fhi>>8) & 0xFF);
1109 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001111 /* Fifth byte */
1112 *p = (unsigned char) (fhi & 0xFF);
1113 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001115 /* Sixth byte */
1116 *p = (unsigned char) ((flo>>16) & 0xFF);
1117 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001119 /* Seventh byte */
1120 *p = (unsigned char) ((flo>>8) & 0xFF);
1121 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001123 /* Eighth byte */
1124 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001126 if ((*self->write_func)(self, str, 9) < 0)
1127 return -1;
1128 }
1129 else {
1130 char c_str[250];
1131 c_str[0] = FLOAT;
1132 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001134 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1135 return -1;
1136 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001138 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001139}
1140
1141
1142static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001143save_string(Picklerobject *self, PyObject *args, int doput)
1144{
1145 int size, len;
1146 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001148 if ((size = PyString_Size(args)) < 0)
1149 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001150
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001151 if (!self->bin) {
1152 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001154 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001156 if (!( repr = PyObject_Repr(args)))
1157 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001159 if ((len = PyString_Size(repr)) < 0)
1160 goto err;
1161 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001163 if ((*self->write_func)(self, &string, 1) < 0)
1164 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001166 if ((*self->write_func)(self, repr_str, len) < 0)
1167 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001169 if ((*self->write_func)(self, "\n", 1) < 0)
1170 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001172 Py_XDECREF(repr);
1173 }
1174 else {
1175 int i;
1176 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001178 if ((size = PyString_Size(args)) < 0)
1179 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001181 if (size < 256) {
1182 c_str[0] = SHORT_BINSTRING;
1183 c_str[1] = size;
1184 len = 2;
1185 }
1186 else {
1187 c_str[0] = BINSTRING;
1188 for (i = 1; i < 5; i++)
1189 c_str[i] = (int)(size >> ((i - 1) * 8));
1190 len = 5;
1191 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001193 if ((*self->write_func)(self, c_str, len) < 0)
1194 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001196 if (size > 128 && Pdata_Check(self->file)) {
1197 if (write_other(self, NULL, 0) < 0) return -1;
1198 PDATA_APPEND(self->file, args, -1);
1199 }
1200 else {
1201 if ((*self->write_func)(self,
1202 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1203 return -1;
1204 }
1205 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001207 if (doput)
1208 if (put(self, args) < 0)
1209 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001211 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001213 err:
1214 Py_XDECREF(repr);
1215 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001216}
1217
1218
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001219#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001220/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1221 backslash and newline characters to \uXXXX escapes. */
1222static PyObject *
1223modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1224{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001225 PyObject *repr;
1226 char *p;
1227 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001229 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001231 repr = PyString_FromStringAndSize(NULL, 6 * size);
1232 if (repr == NULL)
1233 return NULL;
1234 if (size == 0)
1235 return repr;
1236
1237 p = q = PyString_AS_STRING(repr);
1238 while (size-- > 0) {
1239 Py_UNICODE ch = *s++;
1240 /* Map 16-bit characters to '\uxxxx' */
1241 if (ch >= 256 || ch == '\\' || ch == '\n') {
1242 *p++ = '\\';
1243 *p++ = 'u';
1244 *p++ = hexdigit[(ch >> 12) & 0xf];
1245 *p++ = hexdigit[(ch >> 8) & 0xf];
1246 *p++ = hexdigit[(ch >> 4) & 0xf];
1247 *p++ = hexdigit[ch & 15];
1248 }
1249 /* Copy everything else as-is */
1250 else
1251 *p++ = (char) ch;
1252 }
1253 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001254 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001255 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001256}
1257
1258
Guido van Rossum60456fd1997-04-09 17:36:32 +00001259static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001260save_unicode(Picklerobject *self, PyObject *args, int doput)
1261{
1262 int size, len;
1263 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001265 if (!PyUnicode_Check(args))
1266 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001268 if (!self->bin) {
1269 char *repr_str;
1270 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001272 repr = modified_EncodeRawUnicodeEscape(
1273 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
1274 if (!repr)
1275 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001277 if ((len = PyString_Size(repr)) < 0)
1278 goto err;
1279 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001281 if ((*self->write_func)(self, &string, 1) < 0)
1282 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001284 if ((*self->write_func)(self, repr_str, len) < 0)
1285 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001287 if ((*self->write_func)(self, "\n", 1) < 0)
1288 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001290 Py_XDECREF(repr);
1291 }
1292 else {
1293 int i;
1294 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001295
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001296 if (!( repr = PyUnicode_AsUTF8String(args)))
1297 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001299 if ((size = PyString_Size(repr)) < 0)
1300 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302 c_str[0] = BINUNICODE;
1303 for (i = 1; i < 5; i++)
1304 c_str[i] = (int)(size >> ((i - 1) * 8));
1305 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001307 if ((*self->write_func)(self, c_str, len) < 0)
1308 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001309
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001310 if (size > 128 && Pdata_Check(self->file)) {
1311 if (write_other(self, NULL, 0) < 0)
1312 goto err;
1313 PDATA_APPEND(self->file, repr, -1);
1314 }
1315 else {
1316 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1317 size) < 0)
1318 goto err;
1319 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001321 Py_DECREF(repr);
1322 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001324 if (doput)
1325 if (put(self, args) < 0)
1326 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001327
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001328 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001330 err:
1331 Py_XDECREF(repr);
1332 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001333}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001334#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001335
1336
1337static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001338save_tuple(Picklerobject *self, PyObject *args)
1339{
1340 PyObject *element = 0, *py_tuple_id = 0;
1341 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001343 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001344
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001345 if ((*self->write_func)(self, &MARKv, 1) < 0)
1346 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001347
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001348 if ((len = PyTuple_Size(args)) < 0)
1349 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001351 for (i = 0; i < len; i++) {
1352 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
1353 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001355 if (save(self, element, 0) < 0)
1356 goto finally;
1357 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001359 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
1360 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001362 if (len) {
1363 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1364 if (self->bin) {
1365 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001367 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1368 goto finally;
1369 }
1370 else {
1371 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001373 for (i = 0; i <= len; i++) {
1374 if ((*self->write_func)(self, &pop, 1) < 0)
1375 goto finally;
1376 }
1377 }
Tim Peters84e87f32001-03-17 04:50:51 +00001378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001379 if (get(self, py_tuple_id) < 0)
1380 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001382 res = 0;
1383 goto finally;
1384 }
1385 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001387 if ((*self->write_func)(self, &tuple, 1) < 0) {
1388 goto finally;
1389 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001391 if (put(self, args) < 0)
1392 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001394 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001396 finally:
1397 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001399 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001400}
1401
1402static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001403save_empty_tuple(Picklerobject *self, PyObject *args)
1404{
1405 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001407 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001408}
1409
1410
1411static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001412save_list(Picklerobject *self, PyObject *args)
1413{
1414 PyObject *element = 0;
1415 int s_len, len, i, using_appends, res = -1;
1416 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001418 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001420 if (self->fast && !fast_save_enter(self, args))
1421 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001423 if (self->bin) {
1424 s[0] = EMPTY_LIST;
1425 s_len = 1;
1426 }
1427 else {
1428 s[0] = MARK;
1429 s[1] = LIST;
1430 s_len = 2;
1431 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001433 if ((len = PyList_Size(args)) < 0)
1434 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001436 if ((*self->write_func)(self, s, s_len) < 0)
1437 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001439 if (len == 0) {
1440 if (put(self, args) < 0)
1441 goto finally;
1442 }
1443 else {
1444 if (put2(self, args) < 0)
1445 goto finally;
1446 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001448 if ((using_appends = (self->bin && (len > 1))))
1449 if ((*self->write_func)(self, &MARKv, 1) < 0)
1450 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001452 for (i = 0; i < len; i++) {
1453 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
1454 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001456 if (save(self, element, 0) < 0)
1457 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001458
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001459 if (!using_appends) {
1460 if ((*self->write_func)(self, &append, 1) < 0)
1461 goto finally;
1462 }
1463 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001465 if (using_appends) {
1466 if ((*self->write_func)(self, &appends, 1) < 0)
1467 goto finally;
1468 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001470 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001472 finally:
1473 if (self->fast && !fast_save_leave(self, args))
1474 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001476 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001477}
1478
1479
Guido van Rossum60456fd1997-04-09 17:36:32 +00001480static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001481save_dict(Picklerobject *self, PyObject *args)
1482{
1483 PyObject *key = 0, *value = 0;
1484 int i, len, res = -1, using_setitems;
1485 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001487 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001489 if (self->fast && !fast_save_enter(self, args))
1490 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001492 if (self->bin) {
1493 s[0] = EMPTY_DICT;
1494 len = 1;
1495 }
1496 else {
1497 s[0] = MARK;
1498 s[1] = DICT;
1499 len = 2;
1500 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001502 if ((*self->write_func)(self, s, len) < 0)
1503 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001505 if ((len = PyDict_Size(args)) < 0)
1506 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001508 if (len == 0) {
1509 if (put(self, args) < 0)
1510 goto finally;
1511 }
1512 else {
1513 if (put2(self, args) < 0)
1514 goto finally;
1515 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001516
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001517 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1518 if ((*self->write_func)(self, &MARKv, 1) < 0)
1519 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001521 i = 0;
1522 while (PyDict_Next(args, &i, &key, &value)) {
1523 if (save(self, key, 0) < 0)
1524 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001525
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001526 if (save(self, value, 0) < 0)
1527 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001529 if (!using_setitems) {
1530 if ((*self->write_func)(self, &setitem, 1) < 0)
1531 goto finally;
1532 }
1533 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001535 if (using_setitems) {
1536 if ((*self->write_func)(self, &setitems, 1) < 0)
1537 goto finally;
1538 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001540 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001542 finally:
1543 if (self->fast && !fast_save_leave(self, args))
1544 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001546 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001547}
1548
1549
Tim Peters84e87f32001-03-17 04:50:51 +00001550static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001551save_inst(Picklerobject *self, PyObject *args)
1552{
1553 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1554 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1555 char *module_str, *name_str;
1556 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001558 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001560 if (self->fast && !fast_save_enter(self, args))
1561 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001563 if ((*self->write_func)(self, &MARKv, 1) < 0)
1564 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001566 if (!( class = PyObject_GetAttr(args, __class___str)))
1567 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001569 if (self->bin) {
1570 if (save(self, class, 0) < 0)
1571 goto finally;
1572 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001573
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001574 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1575 PyObject *element = 0;
1576 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001578 if (!( class_args =
1579 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
1580 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001582 if ((len = PyObject_Size(class_args)) < 0)
1583 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001585 for (i = 0; i < len; i++) {
1586 if (!( element = PySequence_GetItem(class_args, i)))
1587 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001589 if (save(self, element, 0) < 0) {
1590 Py_DECREF(element);
1591 goto finally;
1592 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001594 Py_DECREF(element);
1595 }
1596 }
1597 else {
1598 PyErr_Clear();
1599 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001601 if (!self->bin) {
1602 if (!( name = ((PyClassObject *)class)->cl_name )) {
1603 PyErr_SetString(PicklingError, "class has no name");
1604 goto finally;
1605 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001607 if (!( module = whichmodule(class, name)))
1608 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001609
Tim Peters84e87f32001-03-17 04:50:51 +00001610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001611 if ((module_size = PyString_Size(module)) < 0 ||
1612 (name_size = PyString_Size(name)) < 0)
1613 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001615 module_str = PyString_AS_STRING((PyStringObject *)module);
1616 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001618 if ((*self->write_func)(self, &inst, 1) < 0)
1619 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001621 if ((*self->write_func)(self, module_str, module_size) < 0)
1622 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001624 if ((*self->write_func)(self, "\n", 1) < 0)
1625 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001627 if ((*self->write_func)(self, name_str, name_size) < 0)
1628 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001630 if ((*self->write_func)(self, "\n", 1) < 0)
1631 goto finally;
1632 }
1633 else if ((*self->write_func)(self, &obj, 1) < 0) {
1634 goto finally;
1635 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001637 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1638 state = PyObject_Call(getstate_func, empty_tuple, NULL);
1639 if (!state)
1640 goto finally;
1641 }
1642 else {
1643 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001644
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001645 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1646 PyErr_Clear();
1647 res = 0;
1648 goto finally;
1649 }
1650 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001652 if (!PyDict_Check(state)) {
1653 if (put2(self, args) < 0)
1654 goto finally;
1655 }
1656 else {
1657 if (put(self, args) < 0)
1658 goto finally;
1659 }
Tim Peters84e87f32001-03-17 04:50:51 +00001660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001661 if (save(self, state, 0) < 0)
1662 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001664 if ((*self->write_func)(self, &build, 1) < 0)
1665 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001667 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001669 finally:
1670 if (self->fast && !fast_save_leave(self, args))
1671 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001673 Py_XDECREF(module);
1674 Py_XDECREF(class);
1675 Py_XDECREF(state);
1676 Py_XDECREF(getinitargs_func);
1677 Py_XDECREF(getstate_func);
1678 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001680 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001681}
1682
1683
Guido van Rossum60456fd1997-04-09 17:36:32 +00001684static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001685save_global(Picklerobject *self, PyObject *args, PyObject *name)
1686{
1687 PyObject *global_name = 0, *module = 0, *mod = 0, *moddict = 0, *klass = 0;
1688 char *name_str, *module_str;
1689 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001691 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001693 if (name) {
1694 global_name = name;
1695 Py_INCREF(global_name);
1696 }
1697 else {
1698 if (!( global_name = PyObject_GetAttr(args, __name___str)))
1699 goto finally;
1700 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001702 if (!( module = whichmodule(args, global_name)))
1703 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001705 if ((module_size = PyString_Size(module)) < 0 ||
1706 (name_size = PyString_Size(global_name)) < 0)
1707 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001709 module_str = PyString_AS_STRING((PyStringObject *)module);
1710 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001712 mod = PyImport_ImportModule(module_str);
1713 if (mod == NULL) {
1714 /* Py_ErrClear(); ?? */
1715 cPickle_ErrFormat(PicklingError,
1716 "Can't pickle %s: it's not found as %s.%s",
1717 "OSS", args, module, global_name);
1718 goto finally;
1719 }
1720 /* borrowed ref */
1721 moddict = PyModule_GetDict(mod);
1722 /* borrowed ref */
1723 klass = PyDict_GetItemString(moddict, name_str);
1724 if (klass == NULL) {
1725 cPickle_ErrFormat(PicklingError,
1726 "Can't pickle %s: it's not found as %s.%s",
1727 "OSS", args, module, global_name);
1728 goto finally;
1729 }
1730 if (klass != args) {
1731 cPickle_ErrFormat(PicklingError,
1732 "Can't pickle %s: it's not the same object as %s.%s",
1733 "OSS", args, module, global_name);
1734 goto finally;
1735 }
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001737 if ((*self->write_func)(self, &global, 1) < 0)
1738 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001740 if ((*self->write_func)(self, module_str, module_size) < 0)
1741 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001743 if ((*self->write_func)(self, "\n", 1) < 0)
1744 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001746 if ((*self->write_func)(self, name_str, name_size) < 0)
1747 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001749 if ((*self->write_func)(self, "\n", 1) < 0)
1750 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001752 if (put(self, args) < 0)
1753 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001755 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001757 finally:
1758 Py_XDECREF(module);
1759 Py_XDECREF(global_name);
1760 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001762 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001763}
1764
Guido van Rossum60456fd1997-04-09 17:36:32 +00001765static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001766save_pers(Picklerobject *self, PyObject *args, PyObject *f)
1767{
1768 PyObject *pid = 0;
1769 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001771 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001773 Py_INCREF(args);
1774 ARG_TUP(self, args);
1775 if (self->arg) {
1776 pid = PyObject_Call(f, self->arg, NULL);
1777 FREE_ARG_TUP(self);
1778 }
1779 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001781 if (pid != Py_None) {
1782 if (!self->bin) {
1783 if (!PyString_Check(pid)) {
1784 PyErr_SetString(PicklingError,
1785 "persistent id must be string");
1786 goto finally;
1787 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001789 if ((*self->write_func)(self, &persid, 1) < 0)
1790 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001792 if ((size = PyString_Size(pid)) < 0)
1793 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001795 if ((*self->write_func)(self,
1796 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1797 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001799 if ((*self->write_func)(self, "\n", 1) < 0)
1800 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001802 res = 1;
1803 goto finally;
1804 }
1805 else if (save(self, pid, 1) >= 0) {
1806 if ((*self->write_func)(self, &binpersid, 1) < 0)
1807 res = -1;
1808 else
1809 res = 1;
1810 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001812 goto finally;
1813 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001815 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001817 finally:
1818 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001820 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001821}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001822
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001823
Tim Peters84e87f32001-03-17 04:50:51 +00001824static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001825save_reduce(Picklerobject *self, PyObject *callable,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001826 PyObject *tup, PyObject *state, PyObject *ob)
1827{
1828 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001830 if (save(self, callable, 0) < 0)
1831 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001833 if (save(self, tup, 0) < 0)
1834 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001836 if ((*self->write_func)(self, &reduce, 1) < 0)
1837 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001839 if (ob != NULL) {
1840 if (state && !PyDict_Check(state)) {
1841 if (put2(self, ob) < 0)
1842 return -1;
1843 }
1844 else {
1845 if (put(self, ob) < 0)
1846 return -1;
1847 }
1848 }
Tim Peters84e87f32001-03-17 04:50:51 +00001849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001850 if (state) {
1851 if (save(self, state, 0) < 0)
1852 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001854 if ((*self->write_func)(self, &build, 1) < 0)
1855 return -1;
1856 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001858 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001859}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001860
Guido van Rossum60456fd1997-04-09 17:36:32 +00001861static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001862save(Picklerobject *self, PyObject *args, int pers_save)
1863{
1864 PyTypeObject *type;
1865 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1866 *callable = 0, *state = 0;
1867 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001869 if (!pers_save && self->pers_func) {
1870 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1871 res = tmp;
1872 goto finally;
1873 }
1874 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001876 if (args == Py_None) {
1877 res = save_none(self, args);
1878 goto finally;
1879 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001881 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001883 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001884 case 'b':
1885 if (args == Py_False || args == Py_True) {
1886 res = save_bool(self, args);
1887 goto finally;
1888 }
1889 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001890 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001891 if (type == &PyInt_Type) {
1892 res = save_int(self, args);
1893 goto finally;
1894 }
1895 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001896
Guido van Rossum60456fd1997-04-09 17:36:32 +00001897 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001898 if (type == &PyLong_Type) {
1899 res = save_long(self, args);
1900 goto finally;
1901 }
1902 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001903
Guido van Rossum60456fd1997-04-09 17:36:32 +00001904 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001905 if (type == &PyFloat_Type) {
1906 res = save_float(self, args);
1907 goto finally;
1908 }
1909 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001910
Guido van Rossum60456fd1997-04-09 17:36:32 +00001911 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001912 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
1913 if (self->bin) res = save_empty_tuple(self, args);
1914 else res = save_tuple(self, args);
1915 goto finally;
1916 }
1917 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001918
Guido van Rossum60456fd1997-04-09 17:36:32 +00001919 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001920 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
1921 res = save_string(self, args, 0);
1922 goto finally;
1923 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001924
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001925#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001926 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001927 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1928 res = save_unicode(self, args, 0);
1929 goto finally;
1930 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001931#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001932 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001934 if (args->ob_refcnt > 1) {
1935 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
1936 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001938 if (PyDict_GetItem(self->memo, py_ob_id)) {
1939 if (get(self, py_ob_id) < 0)
1940 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001942 res = 0;
1943 goto finally;
1944 }
1945 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001947 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001948 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001949 if (type == &PyString_Type) {
1950 res = save_string(self, args, 1);
1951 goto finally;
1952 }
1953 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001954
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001955#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001956 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001957 if (type == &PyUnicode_Type) {
1958 res = save_unicode(self, args, 1);
1959 goto finally;
1960 }
1961 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001962#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001963
Guido van Rossum60456fd1997-04-09 17:36:32 +00001964 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001965 if (type == &PyTuple_Type) {
1966 res = save_tuple(self, args);
1967 goto finally;
1968 }
1969 if (type == &PyType_Type) {
1970 res = save_global(self, args, NULL);
1971 goto finally;
1972 }
1973 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001974
Guido van Rossum60456fd1997-04-09 17:36:32 +00001975 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001976 if (type == &PyList_Type) {
1977 res = save_list(self, args);
1978 goto finally;
1979 }
1980 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001981
1982 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001983 if (type == &PyDict_Type) {
1984 res = save_dict(self, args);
1985 goto finally;
1986 }
1987 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001988
1989 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001990 if (type == &PyInstance_Type) {
1991 res = save_inst(self, args);
1992 goto finally;
1993 }
1994 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001995
1996 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001997 if (type == &PyClass_Type) {
1998 res = save_global(self, args, NULL);
1999 goto finally;
2000 }
2001 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002002
2003 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002004 if (type == &PyFunction_Type) {
2005 res = save_global(self, args, NULL);
2006 goto finally;
2007 }
2008 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002009
2010 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002011 if (type == &PyCFunction_Type) {
2012 res = save_global(self, args, NULL);
2013 goto finally;
2014 }
2015 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002017 if (PyType_IsSubtype(type, &PyType_Type)) {
2018 res = save_global(self, args, NULL);
2019 goto finally;
2020 }
Guido van Rossum950dce62001-12-19 16:56:54 +00002021
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002022 if (!pers_save && self->inst_pers_func) {
2023 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2024 res = tmp;
2025 goto finally;
2026 }
2027 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002029 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2030 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002031
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002032 Py_INCREF(args);
2033 ARG_TUP(self, args);
2034 if (self->arg) {
2035 t = PyObject_Call(__reduce__, self->arg, NULL);
2036 FREE_ARG_TUP(self);
2037 }
2038 if (! t) goto finally;
2039 }
2040 else {
2041 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002042
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002043 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2044 t = PyObject_Call(__reduce__, empty_tuple, NULL);
2045 if (!t)
2046 goto finally;
2047 }
2048 else {
2049 PyErr_Clear();
2050 }
2051 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002053 if (t) {
2054 if (PyString_Check(t)) {
2055 res = save_global(self, args, t);
2056 goto finally;
2057 }
Tim Peters84e87f32001-03-17 04:50:51 +00002058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002059 if (!PyTuple_Check(t)) {
2060 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2061 "be a tuple", "O", __reduce__);
2062 goto finally;
2063 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002065 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002067 if ((size != 3) && (size != 2)) {
2068 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2069 "contain only two or three elements", "O", __reduce__);
2070 goto finally;
2071 }
Tim Peters84e87f32001-03-17 04:50:51 +00002072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002073 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002075 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002077 if (size > 2) {
2078 state = PyTuple_GET_ITEM(t, 2);
2079 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002081 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2082 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2083 "returned by %s must be a tuple", "O", __reduce__);
2084 goto finally;
2085 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002087 res = save_reduce(self, callable, arg_tup, state, args);
2088 goto finally;
2089 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002091 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002093 finally:
2094 Py_XDECREF(py_ob_id);
2095 Py_XDECREF(__reduce__);
2096 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002098 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002099}
2100
2101
2102static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002103dump(Picklerobject *self, PyObject *args)
2104{
2105 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002107 if (save(self, args, 0) < 0)
2108 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002110 if ((*self->write_func)(self, &stop, 1) < 0)
2111 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002113 if ((*self->write_func)(self, NULL, 0) < 0)
2114 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002116 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002117}
2118
2119static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002120Pickle_clear_memo(Picklerobject *self, PyObject *args)
2121{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002122 if (self->memo)
2123 PyDict_Clear(self->memo);
2124 Py_INCREF(Py_None);
2125 return Py_None;
2126}
2127
2128static PyObject *
2129Pickle_getvalue(Picklerobject *self, PyObject *args)
2130{
2131 int l, i, rsize, ssize, clear=1, lm;
2132 long ik;
2133 PyObject *k, *r;
2134 char *s, *p, *have_get;
2135 Pdata *data;
2136
2137 /* Can be called by Python code or C code */
2138 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2139 return NULL;
2140
2141 /* Check to make sure we are based on a list */
2142 if (! Pdata_Check(self->file)) {
2143 PyErr_SetString(PicklingError,
2144 "Attempt to getvalue() a non-list-based pickler");
2145 return NULL;
2146 }
2147
2148 /* flush write buffer */
2149 if (write_other(self, NULL, 0) < 0) return NULL;
2150
2151 data=(Pdata*)self->file;
2152 l=data->length;
2153
2154 /* set up an array to hold get/put status */
2155 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2156 lm++;
2157 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2158 memset(have_get,0,lm);
2159
2160 /* Scan for gets. */
2161 for (rsize=0, i=l; --i >= 0; ) {
2162 k=data->data[i];
2163
2164 if (PyString_Check(k)) {
2165 rsize += PyString_GET_SIZE(k);
2166 }
2167
2168 else if (PyInt_Check(k)) { /* put */
2169 ik=PyInt_AS_LONG((PyIntObject*)k);
2170 if (ik >= lm || ik==0) {
2171 PyErr_SetString(PicklingError,
2172 "Invalid get data");
2173 return NULL;
2174 }
2175 if (have_get[ik]) { /* with matching get */
2176 if (ik < 256) rsize += 2;
2177 else rsize+=5;
2178 }
2179 }
2180
2181 else if (! (PyTuple_Check(k) &&
2182 PyTuple_GET_SIZE(k) == 2 &&
2183 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2184 ) {
2185 PyErr_SetString(PicklingError,
2186 "Unexpected data in internal list");
2187 return NULL;
2188 }
2189
2190 else { /* put */
2191 ik=PyInt_AS_LONG((PyIntObject*)k);
2192 if (ik >= lm || ik==0) {
2193 PyErr_SetString(PicklingError,
2194 "Invalid get data");
2195 return NULL;
2196 }
2197 have_get[ik]=1;
2198 if (ik < 256) rsize += 2;
2199 else rsize+=5;
2200 }
2201
2202 }
2203
2204 /* Now generate the result */
2205 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2206 s=PyString_AS_STRING((PyStringObject*)r);
2207
2208 for (i=0; i<l; i++) {
2209 k=data->data[i];
2210
2211 if (PyString_Check(k)) {
2212 ssize=PyString_GET_SIZE(k);
2213 if (ssize) {
2214 p=PyString_AS_STRING((PyStringObject*)k);
2215 while (--ssize >= 0) *s++=*p++;
2216 }
2217 }
2218
2219 else if (PyTuple_Check(k)) { /* get */
2220 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2221 if (ik < 256) {
2222 *s++ = BINGET;
2223 *s++ = (int)(ik & 0xff);
2224 }
2225 else {
2226 *s++ = LONG_BINGET;
2227 *s++ = (int)(ik & 0xff);
2228 *s++ = (int)((ik >> 8) & 0xff);
2229 *s++ = (int)((ik >> 16) & 0xff);
2230 *s++ = (int)((ik >> 24) & 0xff);
2231 }
2232 }
2233
2234 else { /* put */
2235 ik=PyInt_AS_LONG((PyIntObject*)k);
2236
2237 if (have_get[ik]) { /* with matching get */
2238 if (ik < 256) {
2239 *s++ = BINPUT;
2240 *s++ = (int)(ik & 0xff);
2241 }
2242 else {
2243 *s++ = LONG_BINPUT;
2244 *s++ = (int)(ik & 0xff);
2245 *s++ = (int)((ik >> 8) & 0xff);
2246 *s++ = (int)((ik >> 16) & 0xff);
2247 *s++ = (int)((ik >> 24) & 0xff);
2248 }
2249 }
2250 }
2251
2252 }
2253
2254 if (clear) {
2255 PyDict_Clear(self->memo);
2256 Pdata_clear(data,0);
2257 }
2258
2259 free(have_get);
2260 return r;
2261 err:
2262 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002263 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002264}
2265
2266static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002267Pickler_dump(Picklerobject *self, PyObject *args)
2268{
2269 PyObject *ob;
2270 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002272 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
2273 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002275 if (dump(self, ob) < 0)
2276 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002278 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002280 /* XXX Why does dump() return self? */
2281 Py_INCREF(self);
2282 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002283}
2284
2285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002286static struct PyMethodDef Pickler_methods[] =
2287{
Neal Norwitzb0493252002-03-31 14:44:22 +00002288 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002289 "dump(object) --"
Fred Drake0ebacc82002-05-01 20:36:39 +00002290 "Write an object in pickle format to the object's pickle stream"},
2291 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002292 "clear_memo() -- Clear the picklers memo"},
Neal Norwitzb0493252002-03-31 14:44:22 +00002293 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Guido van Rossum053b8df1998-11-25 16:18:00 +00002294 "getvalue() -- Finish picking a list-based pickle"},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002295 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002296};
2297
2298
2299static Picklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002300newPicklerobject(PyObject *file, int bin)
2301{
2302 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002304 if (!( self = PyObject_New(Picklerobject, &Picklertype)))
2305 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002307 self->fp = NULL;
2308 self->write = NULL;
2309 self->memo = NULL;
2310 self->arg = NULL;
2311 self->pers_func = NULL;
2312 self->inst_pers_func = NULL;
2313 self->write_buf = NULL;
2314 self->bin = bin;
2315 self->fast = 0;
2316 self->fast_container = 0;
2317 self->fast_memo = NULL;
2318 self->buf_size = 0;
2319 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002321 if (file)
2322 Py_INCREF(file);
2323 else
2324 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002326 if (!( self->file = file ))
2327 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002329 if (!( self->memo = PyDict_New()))
2330 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002332 if (PyFile_Check(file)) {
2333 self->fp = PyFile_AsFile(file);
2334 if (self->fp == NULL) {
2335 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2336 goto err;
2337 }
2338 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002339 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002340 else if (PycStringIO_OutputCheck(file)) {
2341 self->write_func = write_cStringIO;
2342 }
2343 else if (file == Py_None) {
2344 self->write_func = write_none;
2345 }
2346 else {
2347 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002349 if (! Pdata_Check(file)) {
2350 self->write = PyObject_GetAttr(file, write_str);
2351 if (!self->write) {
2352 PyErr_Clear();
2353 PyErr_SetString(PyExc_TypeError,
2354 "argument must have 'write' "
2355 "attribute");
2356 goto err;
2357 }
2358 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002359
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002360 if (!( self->write_buf =
2361 (char *)malloc(WRITE_BUF_SIZE * sizeof(char)))) {
2362 PyErr_NoMemory();
2363 goto err;
2364 }
2365 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002367 if (PyEval_GetRestricted()) {
2368 /* Restricted execution, get private tables */
2369 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002371 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2372 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2373 Py_DECREF(m);
2374 if (!( self->dispatch_table )) goto err;
2375 }
2376 else {
2377 self->dispatch_table=dispatch_table;
2378 Py_INCREF(dispatch_table);
2379 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002381 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002383 err:
2384 Py_DECREF((PyObject *)self);
2385 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002386}
2387
2388
2389static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002390get_Pickler(PyObject *self, PyObject *args)
2391{
2392 PyObject *file = NULL;
2393 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002395 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
2396 PyErr_Clear();
2397 bin = 0;
2398 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2399 return NULL;
2400 }
2401 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002402}
2403
2404
2405static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002406Pickler_dealloc(Picklerobject *self)
2407{
2408 Py_XDECREF(self->write);
2409 Py_XDECREF(self->memo);
2410 Py_XDECREF(self->fast_memo);
2411 Py_XDECREF(self->arg);
2412 Py_XDECREF(self->file);
2413 Py_XDECREF(self->pers_func);
2414 Py_XDECREF(self->inst_pers_func);
2415 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002417 if (self->write_buf) {
2418 free(self->write_buf);
2419 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002421 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002422}
2423
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002424static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002425Pickler_get_pers_func(Picklerobject *p)
2426{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002427 if (p->pers_func == NULL)
2428 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2429 else
2430 Py_INCREF(p->pers_func);
2431 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002432}
2433
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002434static int
2435Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2436{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002437 if (v == NULL) {
2438 PyErr_SetString(PyExc_TypeError,
2439 "attribute deletion is not supported");
2440 return -1;
2441 }
2442 Py_XDECREF(p->pers_func);
2443 Py_INCREF(v);
2444 p->pers_func = v;
2445 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002446}
2447
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002448static int
2449Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2450{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002451 if (v == NULL) {
2452 PyErr_SetString(PyExc_TypeError,
2453 "attribute deletion is not supported");
2454 return -1;
2455 }
2456 Py_XDECREF(p->inst_pers_func);
2457 Py_INCREF(v);
2458 p->inst_pers_func = v;
2459 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002460}
2461
2462static PyObject *
2463Pickler_get_memo(Picklerobject *p)
2464{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002465 if (p->memo == NULL)
2466 PyErr_SetString(PyExc_AttributeError, "memo");
2467 else
2468 Py_INCREF(p->memo);
2469 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002470}
2471
2472static int
2473Pickler_set_memo(Picklerobject *p, PyObject *v)
2474{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002475 if (v == NULL) {
2476 PyErr_SetString(PyExc_TypeError,
2477 "attribute deletion is not supported");
2478 return -1;
2479 }
2480 if (!PyDict_Check(v)) {
2481 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2482 return -1;
2483 }
2484 Py_XDECREF(p->memo);
2485 Py_INCREF(v);
2486 p->memo = v;
2487 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002488}
2489
2490static PyObject *
2491Pickler_get_error(Picklerobject *p)
2492{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002493 /* why is this an attribute on the Pickler? */
2494 Py_INCREF(PicklingError);
2495 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002496}
2497
2498static PyMemberDef Pickler_members[] = {
2499 {"binary", T_INT, offsetof(Picklerobject, bin)},
2500 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002501 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002502};
2503
2504static PyGetSetDef Pickler_getsets[] = {
2505 {"persistent_id", (getter)Pickler_get_pers_func,
2506 (setter)Pickler_set_pers_func},
2507 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2508 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002509 {"PicklingError", (getter)Pickler_get_error, NULL},
2510 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002511};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002512
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002513PyDoc_STRVAR(Picklertype__doc__,
2514"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002515
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002516static PyTypeObject Picklertype = {
2517 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002518 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002519 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002520 sizeof(Picklerobject), /*tp_basicsize*/
2521 0,
2522 (destructor)Pickler_dealloc, /* tp_dealloc */
2523 0, /* tp_print */
2524 0, /* tp_getattr */
2525 0, /* tp_setattr */
2526 0, /* tp_compare */
2527 0, /* tp_repr */
2528 0, /* tp_as_number */
2529 0, /* tp_as_sequence */
2530 0, /* tp_as_mapping */
2531 0, /* tp_hash */
2532 0, /* tp_call */
2533 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002534 0, /* set below */ /* tp_getattro */
2535 0, /* set below */ /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002536 0, /* tp_as_buffer */
2537 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2538 Picklertype__doc__, /* tp_doc */
2539 0, /* tp_traverse */
2540 0, /* tp_clear */
2541 0, /* tp_richcompare */
2542 0, /* tp_weaklistoffset */
2543 0, /* tp_iter */
2544 0, /* tp_iternext */
2545 Pickler_methods, /* tp_methods */
2546 Pickler_members, /* tp_members */
2547 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002548};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002549
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002550static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002551find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
2552{
2553 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002555 if (fc) {
2556 if (fc==Py_None) {
2557 PyErr_SetString(UnpicklingError,
2558 "Global and instance pickles are not supported.");
2559 return NULL;
2560 }
2561 return PyObject_CallFunction(fc, "OO", py_module_name,
2562 py_global_name);
2563 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002565 module = PySys_GetObject("modules");
2566 if (module == NULL)
2567 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002569 module = PyDict_GetItem(module, py_module_name);
2570 if (module == NULL) {
2571 module = PyImport_Import(py_module_name);
2572 if (!module)
2573 return NULL;
2574 global = PyObject_GetAttr(module, py_global_name);
2575 Py_DECREF(module);
2576 }
2577 else
2578 global = PyObject_GetAttr(module, py_global_name);
2579 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002580}
2581
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002582static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002583marker(Unpicklerobject *self)
2584{
2585 if (self->num_marks < 1) {
2586 PyErr_SetString(UnpicklingError, "could not find MARK");
2587 return -1;
2588 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002589
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002590 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002591}
2592
Tim Peters84e87f32001-03-17 04:50:51 +00002593
Guido van Rossum60456fd1997-04-09 17:36:32 +00002594static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002595load_none(Unpicklerobject *self)
2596{
2597 PDATA_APPEND(self->stack, Py_None, -1);
2598 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002599}
2600
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002601static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002602bad_readline(void)
2603{
2604 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2605 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002606}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002607
2608static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002609load_int(Unpicklerobject *self)
2610{
2611 PyObject *py_int = 0;
2612 char *endptr, *s;
2613 int len, res = -1;
2614 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002616 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2617 if (len < 2) return bad_readline();
2618 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002619
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002620 errno = 0;
2621 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002622
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002623 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2624 /* Hm, maybe we've got something long. Let's try reading
2625 it as a Python long object. */
2626 errno = 0;
2627 py_int = PyLong_FromString(s, NULL, 0);
2628 if (py_int == NULL) {
2629 PyErr_SetString(PyExc_ValueError,
2630 "could not convert string to int");
2631 goto finally;
2632 }
2633 }
2634 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002635 if (len == 3 && (l == 0 || l == 1)) {
2636 if (!( py_int = PyBool_FromLong(l))) goto finally;
2637 }
2638 else {
2639 if (!( py_int = PyInt_FromLong(l))) goto finally;
2640 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002641 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002643 free(s);
2644 PDATA_PUSH(self->stack, py_int, -1);
2645 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002647 finally:
2648 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002649
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002650 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002651}
2652
2653
Tim Peters84e87f32001-03-17 04:50:51 +00002654static long
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002655calc_binint(char *s, int x)
2656{
2657 unsigned char c;
2658 int i;
2659 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002661 for (i = 0, l = 0L; i < x; i++) {
2662 c = (unsigned char)s[i];
2663 l |= (long)c << (i * 8);
2664 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002665#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002666 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2667 * is signed, so on a box with longs bigger than 4 bytes we need
2668 * to extend a BININT's sign bit to the full width.
2669 */
2670 if (x == 4 && l & (1L << 31))
2671 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002672#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002673 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002674}
2675
2676
2677static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002678load_binintx(Unpicklerobject *self, char *s, int x)
2679{
2680 PyObject *py_int = 0;
2681 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002683 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002685 if (!( py_int = PyInt_FromLong(l)))
2686 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002687
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002688 PDATA_PUSH(self->stack, py_int, -1);
2689 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002690}
2691
2692
2693static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002694load_binint(Unpicklerobject *self)
2695{
2696 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002698 if ((*self->read_func)(self, &s, 4) < 0)
2699 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002701 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002702}
2703
2704
2705static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002706load_binint1(Unpicklerobject *self)
2707{
2708 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002710 if ((*self->read_func)(self, &s, 1) < 0)
2711 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002713 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002714}
2715
2716
2717static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002718load_binint2(Unpicklerobject *self)
2719{
2720 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002722 if ((*self->read_func)(self, &s, 2) < 0)
2723 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002725 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002726}
Tim Peters84e87f32001-03-17 04:50:51 +00002727
Guido van Rossum60456fd1997-04-09 17:36:32 +00002728static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002729load_long(Unpicklerobject *self)
2730{
2731 PyObject *l = 0;
2732 char *end, *s;
2733 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002735 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2736 if (len < 2) return bad_readline();
2737 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002739 if (!( l = PyLong_FromString(s, &end, 0)))
2740 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002742 free(s);
2743 PDATA_PUSH(self->stack, l, -1);
2744 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002746 finally:
2747 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002749 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002750}
2751
Tim Peters84e87f32001-03-17 04:50:51 +00002752
Guido van Rossum60456fd1997-04-09 17:36:32 +00002753static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002754load_float(Unpicklerobject *self)
2755{
2756 PyObject *py_float = 0;
2757 char *endptr, *s;
2758 int len, res = -1;
2759 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002761 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2762 if (len < 2) return bad_readline();
2763 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002765 errno = 0;
2766 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002768 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2769 PyErr_SetString(PyExc_ValueError,
2770 "could not convert string to float");
2771 goto finally;
2772 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002774 if (!( py_float = PyFloat_FromDouble(d)))
2775 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002777 free(s);
2778 PDATA_PUSH(self->stack, py_float, -1);
2779 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002781 finally:
2782 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002784 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002785}
2786
Guido van Rossum60456fd1997-04-09 17:36:32 +00002787static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002788load_binfloat(Unpicklerobject *self)
2789{
2790 PyObject *py_float = 0;
2791 int s, e;
2792 long fhi, flo;
2793 double x;
2794 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002796 if ((*self->read_func)(self, &p, 8) < 0)
2797 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002799 /* First byte */
2800 s = (*p>>7) & 1;
2801 e = (*p & 0x7F) << 4;
2802 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002804 /* Second byte */
2805 e |= (*p>>4) & 0xF;
2806 fhi = (*p & 0xF) << 24;
2807 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002809 /* Third byte */
2810 fhi |= (*p & 0xFF) << 16;
2811 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002813 /* Fourth byte */
2814 fhi |= (*p & 0xFF) << 8;
2815 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002817 /* Fifth byte */
2818 fhi |= *p & 0xFF;
2819 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002821 /* Sixth byte */
2822 flo = (*p & 0xFF) << 16;
2823 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002825 /* Seventh byte */
2826 flo |= (*p & 0xFF) << 8;
2827 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002829 /* Eighth byte */
2830 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002832 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2833 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002835 /* XXX This sadly ignores Inf/NaN */
2836 if (e == 0)
2837 e = -1022;
2838 else {
2839 x += 1.0;
2840 e -= 1023;
2841 }
2842 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002844 if (s)
2845 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002847 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002849 PDATA_PUSH(self->stack, py_float, -1);
2850 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002851}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002852
2853static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002854load_string(Unpicklerobject *self)
2855{
2856 PyObject *str = 0;
2857 int len, res = -1, nslash;
2858 char *s, q, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002860 static PyObject *eval_dict = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002862 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2863 if (len < 2) return bad_readline();
2864 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002866 /* Check for unquoted quotes (evil strings) */
2867 q=*s;
2868 if (q != '"' && q != '\'') goto insecure;
2869 for (p=s+1, nslash=0; *p; p++) {
2870 if (*p==q && nslash%2==0) break;
2871 if (*p=='\\') nslash++;
2872 else nslash=0;
2873 }
2874 if (*p == q) {
2875 for (p++; *p; p++)
2876 if (*(unsigned char *)p > ' ')
2877 goto insecure;
2878 }
2879 else
2880 goto insecure;
2881 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002883 if (!( eval_dict ))
2884 if (!( eval_dict = Py_BuildValue("{s{}}", "__builtins__")))
2885 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002887 if (!( str = PyRun_String(s, Py_eval_input, eval_dict, eval_dict)))
2888 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002890 free(s);
2891 PDATA_PUSH(self->stack, str, -1);
2892 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002894 finally:
2895 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002897 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002898
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002899 insecure:
2900 free(s);
2901 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2902 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002903}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002904
2905
2906static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002907load_binstring(Unpicklerobject *self)
2908{
2909 PyObject *py_string = 0;
2910 long l;
2911 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002912
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002913 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002915 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002916
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002917 if ((*self->read_func)(self, &s, l) < 0)
2918 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002919
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002920 if (!( py_string = PyString_FromStringAndSize(s, l)))
2921 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002922
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002923 PDATA_PUSH(self->stack, py_string, -1);
2924 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002925}
2926
2927
2928static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002929load_short_binstring(Unpicklerobject *self)
2930{
2931 PyObject *py_string = 0;
2932 unsigned char l;
2933 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002935 if ((*self->read_func)(self, &s, 1) < 0)
2936 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002938 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002940 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002942 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002944 PDATA_PUSH(self->stack, py_string, -1);
2945 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002946}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002947
2948
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002949#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002950static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002951load_unicode(Unpicklerobject *self)
2952{
2953 PyObject *str = 0;
2954 int len, res = -1;
2955 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002957 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2958 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002960 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
2961 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002963 PDATA_PUSH(self->stack, str, -1);
2964 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002966 finally:
2967 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002968}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002969#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002970
2971
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002972#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002973static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002974load_binunicode(Unpicklerobject *self)
2975{
2976 PyObject *unicode;
2977 long l;
2978 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002980 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002982 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002984 if ((*self->read_func)(self, &s, l) < 0)
2985 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002987 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
2988 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002990 PDATA_PUSH(self->stack, unicode, -1);
2991 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002992}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002993#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002994
2995
2996static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002997load_tuple(Unpicklerobject *self)
2998{
2999 PyObject *tup;
3000 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003002 if ((i = marker(self)) < 0) return -1;
3003 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3004 PDATA_PUSH(self->stack, tup, -1);
3005 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003006}
3007
3008static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003009load_empty_tuple(Unpicklerobject *self)
3010{
3011 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003012
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003013 if (!( tup=PyTuple_New(0))) return -1;
3014 PDATA_PUSH(self->stack, tup, -1);
3015 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003016}
3017
3018static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003019load_empty_list(Unpicklerobject *self)
3020{
3021 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003023 if (!( list=PyList_New(0))) return -1;
3024 PDATA_PUSH(self->stack, list, -1);
3025 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003026}
3027
3028static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003029load_empty_dict(Unpicklerobject *self)
3030{
3031 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003033 if (!( dict=PyDict_New())) return -1;
3034 PDATA_PUSH(self->stack, dict, -1);
3035 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003036}
3037
3038
3039static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003040load_list(Unpicklerobject *self)
3041{
3042 PyObject *list = 0;
3043 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003045 if ((i = marker(self)) < 0) return -1;
3046 if (!( list=Pdata_popList(self->stack, i))) return -1;
3047 PDATA_PUSH(self->stack, list, -1);
3048 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003049}
3050
3051static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003052load_dict(Unpicklerobject *self)
3053{
3054 PyObject *dict, *key, *value;
3055 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003057 if ((i = marker(self)) < 0) return -1;
3058 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003060 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003062 for (k = i+1; k < j; k += 2) {
3063 key =self->stack->data[k-1];
3064 value=self->stack->data[k ];
3065 if (PyDict_SetItem(dict, key, value) < 0) {
3066 Py_DECREF(dict);
3067 return -1;
3068 }
3069 }
3070 Pdata_clear(self->stack, i);
3071 PDATA_PUSH(self->stack, dict, -1);
3072 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003073}
3074
3075static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003076Instance_New(PyObject *cls, PyObject *args)
3077{
3078 int has_key;
3079 PyObject *safe=0, *r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003081 if (PyClass_Check(cls)) {
3082 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003084 if ((l=PyObject_Size(args)) < 0) goto err;
3085 if (!( l )) {
3086 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003088 __getinitargs__ = PyObject_GetAttr(cls,
3089 __getinitargs___str);
3090 if (!__getinitargs__) {
3091 /* We have a class with no __getinitargs__,
3092 so bypass usual construction */
3093 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003095 PyErr_Clear();
3096 if (!( inst=PyInstance_NewRaw(cls, NULL)))
3097 goto err;
3098 return inst;
3099 }
3100 Py_DECREF(__getinitargs__);
3101 }
Tim Peters84e87f32001-03-17 04:50:51 +00003102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003103 if ((r=PyInstance_New(cls, args, NULL))) return r;
3104 else goto err;
3105 }
Tim Peters84e87f32001-03-17 04:50:51 +00003106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003107 /* Is safe_constructors always a dict? */
3108 has_key = cPickle_PyMapping_HasKey(safe_constructors, cls);
3109 if (!has_key) {
3110 safe = PyObject_GetAttr(cls, __safe_for_unpickling___str);
3111 if (!safe ||
3112 !PyObject_IsTrue(safe)) {
3113 cPickle_ErrFormat(UnpicklingError,
3114 "%s is not safe for unpickling",
3115 "O", cls);
3116 Py_XDECREF(safe);
3117 return NULL;
3118 }
3119 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003121 if (args==Py_None) {
3122 /* Special case, call cls.__basicnew__() */
3123 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003125 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3126 if (!basicnew) return NULL;
3127 r=PyObject_CallObject(basicnew, NULL);
3128 Py_DECREF(basicnew);
3129 if (r) return r;
3130 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003132 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003134 err:
3135 {
3136 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003138 PyErr_Fetch(&tp, &v, &tb);
3139 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3140 Py_XDECREF(v);
3141 v=r;
3142 }
3143 PyErr_Restore(tp,v,tb);
3144 }
3145 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003146}
Tim Peters84e87f32001-03-17 04:50:51 +00003147
Guido van Rossum60456fd1997-04-09 17:36:32 +00003148
3149static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003150load_obj(Unpicklerobject *self)
3151{
3152 PyObject *class, *tup, *obj=0;
3153 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003155 if ((i = marker(self)) < 0) return -1;
3156 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3157 PDATA_POP(self->stack, class);
3158 if (class) {
3159 obj = Instance_New(class, tup);
3160 Py_DECREF(class);
3161 }
3162 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003164 if (! obj) return -1;
3165 PDATA_PUSH(self->stack, obj, -1);
3166 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003167}
3168
3169
3170static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003171load_inst(Unpicklerobject *self)
3172{
3173 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3174 int i, len;
3175 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003177 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003179 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3180 if (len < 2) return bad_readline();
3181 module_name = PyString_FromStringAndSize(s, len - 1);
3182 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003184 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3185 if (len < 2) return bad_readline();
3186 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3187 class = find_class(module_name, class_name,
3188 self->find_class);
3189 Py_DECREF(class_name);
3190 }
3191 }
3192 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003194 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003196 if ((tup=Pdata_popTuple(self->stack, i))) {
3197 obj = Instance_New(class, tup);
3198 Py_DECREF(tup);
3199 }
3200 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003202 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003204 PDATA_PUSH(self->stack, obj, -1);
3205 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003206}
3207
3208
3209static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003210load_global(Unpicklerobject *self)
3211{
3212 PyObject *class = 0, *module_name = 0, *class_name = 0;
3213 int len;
3214 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003216 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3217 if (len < 2) return bad_readline();
3218 module_name = PyString_FromStringAndSize(s, len - 1);
3219 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003221 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3222 if (len < 2) return bad_readline();
3223 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3224 class = find_class(module_name, class_name,
3225 self->find_class);
3226 Py_DECREF(class_name);
3227 }
3228 }
3229 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003231 if (! class) return -1;
3232 PDATA_PUSH(self->stack, class, -1);
3233 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003234}
3235
3236
3237static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003238load_persid(Unpicklerobject *self)
3239{
3240 PyObject *pid = 0;
3241 int len;
3242 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003244 if (self->pers_func) {
3245 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3246 if (len < 2) return bad_readline();
3247
3248 pid = PyString_FromStringAndSize(s, len - 1);
3249 if (!pid) return -1;
3250
3251 if (PyList_Check(self->pers_func)) {
3252 if (PyList_Append(self->pers_func, pid) < 0) {
3253 Py_DECREF(pid);
3254 return -1;
3255 }
3256 }
3257 else {
3258 ARG_TUP(self, pid);
3259 if (self->arg) {
3260 pid = PyObject_Call(self->pers_func, self->arg,
3261 NULL);
3262 FREE_ARG_TUP(self);
3263 }
3264 }
3265
3266 if (! pid) return -1;
3267
3268 PDATA_PUSH(self->stack, pid, -1);
3269 return 0;
3270 }
3271 else {
3272 PyErr_SetString(UnpicklingError,
3273 "A load persistent id instruction was encountered,\n"
3274 "but no persistent_load function was specified.");
3275 return -1;
3276 }
3277}
3278
3279static int
3280load_binpersid(Unpicklerobject *self)
3281{
3282 PyObject *pid = 0;
3283
3284 if (self->pers_func) {
3285 PDATA_POP(self->stack, pid);
3286 if (! pid) return -1;
3287
3288 if (PyList_Check(self->pers_func)) {
3289 if (PyList_Append(self->pers_func, pid) < 0) {
3290 Py_DECREF(pid);
3291 return -1;
3292 }
3293 }
3294 else {
3295 ARG_TUP(self, pid);
3296 if (self->arg) {
3297 pid = PyObject_Call(self->pers_func, self->arg,
3298 NULL);
3299 FREE_ARG_TUP(self);
3300 }
3301 if (! pid) return -1;
3302 }
3303
3304 PDATA_PUSH(self->stack, pid, -1);
3305 return 0;
3306 }
3307 else {
3308 PyErr_SetString(UnpicklingError,
3309 "A load persistent id instruction was encountered,\n"
3310 "but no persistent_load function was specified.");
3311 return -1;
3312 }
3313}
3314
3315
3316static int
3317load_pop(Unpicklerobject *self)
3318{
3319 int len;
3320
3321 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3322
3323 /* Note that we split the (pickle.py) stack into two stacks,
3324 an object stack and a mark stack. We have to be clever and
3325 pop the right one. We do this by looking at the top of the
3326 mark stack.
3327 */
3328
3329 if ((self->num_marks > 0) &&
3330 (self->marks[self->num_marks - 1] == len))
3331 self->num_marks--;
3332 else {
3333 len--;
3334 Py_DECREF(self->stack->data[len]);
3335 self->stack->length=len;
3336 }
3337
3338 return 0;
3339}
3340
3341
3342static int
3343load_pop_mark(Unpicklerobject *self)
3344{
3345 int i;
3346
3347 if ((i = marker(self)) < 0)
3348 return -1;
3349
3350 Pdata_clear(self->stack, i);
3351
3352 return 0;
3353}
3354
3355
3356static int
3357load_dup(Unpicklerobject *self)
3358{
3359 PyObject *last;
3360 int len;
3361
3362 if ((len = self->stack->length) <= 0) return stackUnderflow();
3363 last=self->stack->data[len-1];
3364 Py_INCREF(last);
3365 PDATA_PUSH(self->stack, last, -1);
3366 return 0;
3367}
3368
3369
3370static int
3371load_get(Unpicklerobject *self)
3372{
3373 PyObject *py_str = 0, *value = 0;
3374 int len;
3375 char *s;
3376 int rc;
3377
3378 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003379 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003381 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003383 value = PyDict_GetItem(self->memo, py_str);
3384 if (! value) {
3385 PyErr_SetObject(BadPickleGet, py_str);
3386 rc = -1;
3387 } else {
3388 PDATA_APPEND(self->stack, value, -1);
3389 rc = 0;
3390 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003392 Py_DECREF(py_str);
3393 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003394}
3395
3396
3397static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003398load_binget(Unpicklerobject *self)
3399{
3400 PyObject *py_key = 0, *value = 0;
3401 unsigned char key;
3402 char *s;
3403 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003405 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003407 key = (unsigned char)s[0];
3408 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003410 value = PyDict_GetItem(self->memo, py_key);
3411 if (! value) {
3412 PyErr_SetObject(BadPickleGet, py_key);
3413 rc = -1;
3414 } else {
3415 PDATA_APPEND(self->stack, value, -1);
3416 rc = 0;
3417 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003419 Py_DECREF(py_key);
3420 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003421}
3422
3423
3424static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003425load_long_binget(Unpicklerobject *self)
3426{
3427 PyObject *py_key = 0, *value = 0;
3428 unsigned char c;
3429 char *s;
3430 long key;
3431 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003433 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003435 c = (unsigned char)s[0];
3436 key = (long)c;
3437 c = (unsigned char)s[1];
3438 key |= (long)c << 8;
3439 c = (unsigned char)s[2];
3440 key |= (long)c << 16;
3441 c = (unsigned char)s[3];
3442 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003444 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3445
3446 value = PyDict_GetItem(self->memo, py_key);
3447 if (! value) {
3448 PyErr_SetObject(BadPickleGet, py_key);
3449 rc = -1;
3450 } else {
3451 PDATA_APPEND(self->stack, value, -1);
3452 rc = 0;
3453 }
3454
3455 Py_DECREF(py_key);
3456 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003457}
3458
3459
3460static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003461load_put(Unpicklerobject *self)
3462{
3463 PyObject *py_str = 0, *value = 0;
3464 int len, l;
3465 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003467 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3468 if (l < 2) return bad_readline();
3469 if (!( len=self->stack->length )) return stackUnderflow();
3470 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3471 value=self->stack->data[len-1];
3472 l=PyDict_SetItem(self->memo, py_str, value);
3473 Py_DECREF(py_str);
3474 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003475}
3476
3477
3478static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003479load_binput(Unpicklerobject *self)
3480{
3481 PyObject *py_key = 0, *value = 0;
3482 unsigned char key;
3483 char *s;
3484 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003486 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3487 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003489 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003491 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3492 value=self->stack->data[len-1];
3493 len=PyDict_SetItem(self->memo, py_key, value);
3494 Py_DECREF(py_key);
3495 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003496}
3497
3498
3499static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003500load_long_binput(Unpicklerobject *self)
3501{
3502 PyObject *py_key = 0, *value = 0;
3503 long key;
3504 unsigned char c;
3505 char *s;
3506 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003508 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3509 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003511 c = (unsigned char)s[0];
3512 key = (long)c;
3513 c = (unsigned char)s[1];
3514 key |= (long)c << 8;
3515 c = (unsigned char)s[2];
3516 key |= (long)c << 16;
3517 c = (unsigned char)s[3];
3518 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003519
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003520 if (!( py_key = PyInt_FromLong(key))) return -1;
3521 value=self->stack->data[len-1];
3522 len=PyDict_SetItem(self->memo, py_key, value);
3523 Py_DECREF(py_key);
3524 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003525}
3526
3527
3528static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003529do_append(Unpicklerobject *self, int x)
3530{
3531 PyObject *value = 0, *list = 0, *append_method = 0;
3532 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003534 len=self->stack->length;
3535 if (!( len >= x && x > 0 )) return stackUnderflow();
3536 /* nothing to do */
3537 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003538
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003539 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003541 if (PyList_Check(list)) {
3542 PyObject *slice;
3543 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003545 slice=Pdata_popList(self->stack, x);
3546 list_len = PyList_GET_SIZE(list);
3547 i=PyList_SetSlice(list, list_len, list_len, slice);
3548 Py_DECREF(slice);
3549 return i;
3550 }
3551 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003553 if (!( append_method = PyObject_GetAttr(list, append_str)))
3554 return -1;
3555
3556 for (i = x; i < len; i++) {
3557 PyObject *junk;
3558
3559 value=self->stack->data[i];
3560 junk=0;
3561 ARG_TUP(self, value);
3562 if (self->arg) {
3563 junk = PyObject_Call(append_method, self->arg,
3564 NULL);
3565 FREE_ARG_TUP(self);
3566 }
3567 if (! junk) {
3568 Pdata_clear(self->stack, i+1);
3569 self->stack->length=x;
3570 Py_DECREF(append_method);
3571 return -1;
3572 }
3573 Py_DECREF(junk);
3574 }
3575 self->stack->length=x;
3576 Py_DECREF(append_method);
3577 }
3578
3579 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003580}
3581
3582
3583static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003584load_append(Unpicklerobject *self)
3585{
3586 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003587}
3588
3589
3590static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003591load_appends(Unpicklerobject *self)
3592{
3593 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003594}
3595
3596
3597static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003598do_setitems(Unpicklerobject *self, int x)
3599{
3600 PyObject *value = 0, *key = 0, *dict = 0;
3601 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003603 if (!( (len=self->stack->length) >= x
3604 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003606 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003608 for (i = x+1; i < len; i += 2) {
3609 key =self->stack->data[i-1];
3610 value=self->stack->data[i ];
3611 if (PyObject_SetItem(dict, key, value) < 0) {
3612 r=-1;
3613 break;
3614 }
3615 }
3616
3617 Pdata_clear(self->stack, x);
3618
3619 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003620}
3621
3622
Tim Peters84e87f32001-03-17 04:50:51 +00003623static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003624load_setitem(Unpicklerobject *self)
3625{
3626 return do_setitems(self, self->stack->length - 2);
3627}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003629static int
3630load_setitems(Unpicklerobject *self)
3631{
3632 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003633}
3634
Tim Peters84e87f32001-03-17 04:50:51 +00003635
Guido van Rossum60456fd1997-04-09 17:36:32 +00003636static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003637load_build(Unpicklerobject *self)
3638{
3639 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3640 *junk = 0, *__setstate__ = 0;
3641 int i, r = 0;
3642
3643 if (self->stack->length < 2) return stackUnderflow();
3644 PDATA_POP(self->stack, value);
3645 if (! value) return -1;
3646 inst=self->stack->data[self->stack->length-1];
3647
3648 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3649 ARG_TUP(self, value);
3650 if (self->arg) {
3651 junk = PyObject_Call(__setstate__, self->arg, NULL);
3652 FREE_ARG_TUP(self);
3653 }
3654 Py_DECREF(__setstate__);
3655 if (! junk) return -1;
3656 Py_DECREF(junk);
3657 return 0;
3658 }
3659
3660 PyErr_Clear();
3661 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3662 i = 0;
3663 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3664 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3665 r=-1;
3666 break;
3667 }
3668 }
3669 Py_DECREF(instdict);
3670 }
3671 else r=-1;
3672
3673 Py_XDECREF(value);
3674
3675 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003676}
3677
3678
3679static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003680load_mark(Unpicklerobject *self)
3681{
3682 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003684 /* Note that we split the (pickle.py) stack into two stacks, an
3685 object stack and a mark stack. Here we push a mark onto the
3686 mark stack.
3687 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003689 if ((self->num_marks + 1) >= self->marks_size) {
3690 s=self->marks_size+20;
3691 if (s <= self->num_marks) s=self->num_marks + 1;
3692 if (self->marks == NULL)
3693 self->marks=(int *)malloc(s * sizeof(int));
3694 else
3695 self->marks=(int *)realloc(self->marks,
3696 s * sizeof(int));
3697 if (! self->marks) {
3698 PyErr_NoMemory();
3699 return -1;
3700 }
3701 self->marks_size = s;
3702 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003704 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003706 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003707}
3708
Guido van Rossum60456fd1997-04-09 17:36:32 +00003709static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003710load_reduce(Unpicklerobject *self)
3711{
3712 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003714 PDATA_POP(self->stack, arg_tup);
3715 if (! arg_tup) return -1;
3716 PDATA_POP(self->stack, callable);
3717 if (callable) {
3718 ob = Instance_New(callable, arg_tup);
3719 Py_DECREF(callable);
3720 }
3721 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003723 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003725 PDATA_PUSH(self->stack, ob, -1);
3726 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003727}
Tim Peters84e87f32001-03-17 04:50:51 +00003728
Guido van Rossum60456fd1997-04-09 17:36:32 +00003729static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003730load(Unpicklerobject *self)
3731{
3732 PyObject *err = 0, *val = 0;
3733 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003735 self->num_marks = 0;
3736 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003738 while (1) {
3739 if ((*self->read_func)(self, &s, 1) < 0)
3740 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003742 switch (s[0]) {
3743 case NONE:
3744 if (load_none(self) < 0)
3745 break;
3746 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003747
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003748 case BININT:
3749 if (load_binint(self) < 0)
3750 break;
3751 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003753 case BININT1:
3754 if (load_binint1(self) < 0)
3755 break;
3756 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003758 case BININT2:
3759 if (load_binint2(self) < 0)
3760 break;
3761 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003763 case INT:
3764 if (load_int(self) < 0)
3765 break;
3766 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003768 case LONG:
3769 if (load_long(self) < 0)
3770 break;
3771 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003773 case FLOAT:
3774 if (load_float(self) < 0)
3775 break;
3776 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003778 case BINFLOAT:
3779 if (load_binfloat(self) < 0)
3780 break;
3781 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003783 case BINSTRING:
3784 if (load_binstring(self) < 0)
3785 break;
3786 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003788 case SHORT_BINSTRING:
3789 if (load_short_binstring(self) < 0)
3790 break;
3791 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003793 case STRING:
3794 if (load_string(self) < 0)
3795 break;
3796 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003797
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003798#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003799 case UNICODE:
3800 if (load_unicode(self) < 0)
3801 break;
3802 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003804 case BINUNICODE:
3805 if (load_binunicode(self) < 0)
3806 break;
3807 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003808#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003810 case EMPTY_TUPLE:
3811 if (load_empty_tuple(self) < 0)
3812 break;
3813 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003815 case TUPLE:
3816 if (load_tuple(self) < 0)
3817 break;
3818 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003820 case EMPTY_LIST:
3821 if (load_empty_list(self) < 0)
3822 break;
3823 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003825 case LIST:
3826 if (load_list(self) < 0)
3827 break;
3828 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003830 case EMPTY_DICT:
3831 if (load_empty_dict(self) < 0)
3832 break;
3833 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003835 case DICT:
3836 if (load_dict(self) < 0)
3837 break;
3838 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003840 case OBJ:
3841 if (load_obj(self) < 0)
3842 break;
3843 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003845 case INST:
3846 if (load_inst(self) < 0)
3847 break;
3848 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003850 case GLOBAL:
3851 if (load_global(self) < 0)
3852 break;
3853 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003855 case APPEND:
3856 if (load_append(self) < 0)
3857 break;
3858 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003860 case APPENDS:
3861 if (load_appends(self) < 0)
3862 break;
3863 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003865 case BUILD:
3866 if (load_build(self) < 0)
3867 break;
3868 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003870 case DUP:
3871 if (load_dup(self) < 0)
3872 break;
3873 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003875 case BINGET:
3876 if (load_binget(self) < 0)
3877 break;
3878 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003880 case LONG_BINGET:
3881 if (load_long_binget(self) < 0)
3882 break;
3883 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003885 case GET:
3886 if (load_get(self) < 0)
3887 break;
3888 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003890 case MARK:
3891 if (load_mark(self) < 0)
3892 break;
3893 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003895 case BINPUT:
3896 if (load_binput(self) < 0)
3897 break;
3898 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003900 case LONG_BINPUT:
3901 if (load_long_binput(self) < 0)
3902 break;
3903 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003904
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003905 case PUT:
3906 if (load_put(self) < 0)
3907 break;
3908 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003909
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003910 case POP:
3911 if (load_pop(self) < 0)
3912 break;
3913 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003915 case POP_MARK:
3916 if (load_pop_mark(self) < 0)
3917 break;
3918 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003919
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003920 case SETITEM:
3921 if (load_setitem(self) < 0)
3922 break;
3923 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003925 case SETITEMS:
3926 if (load_setitems(self) < 0)
3927 break;
3928 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003930 case STOP:
3931 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003932
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003933 case PERSID:
3934 if (load_persid(self) < 0)
3935 break;
3936 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003938 case BINPERSID:
3939 if (load_binpersid(self) < 0)
3940 break;
3941 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003943 case REDUCE:
3944 if (load_reduce(self) < 0)
3945 break;
3946 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003948 case '\0':
3949 /* end of file */
3950 PyErr_SetNone(PyExc_EOFError);
3951 break;
Neil Schemenauerfa79c652002-03-22 23:02:53 +00003952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003953 default:
3954 cPickle_ErrFormat(UnpicklingError,
3955 "invalid load key, '%s'.",
3956 "c", s[0]);
3957 return NULL;
3958 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003960 break;
3961 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003963 if ((err = PyErr_Occurred())) {
3964 if (err == PyExc_EOFError) {
3965 PyErr_SetNone(PyExc_EOFError);
3966 }
3967 return NULL;
3968 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003970 PDATA_POP(self->stack, val);
3971 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003972}
Tim Peters84e87f32001-03-17 04:50:51 +00003973
Guido van Rossum60456fd1997-04-09 17:36:32 +00003974
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003975/* No-load functions to support noload, which is used to
3976 find persistent references. */
3977
3978static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003979noload_obj(Unpicklerobject *self)
3980{
3981 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003983 if ((i = marker(self)) < 0) return -1;
3984 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003985}
3986
3987
3988static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003989noload_inst(Unpicklerobject *self)
3990{
3991 int i;
3992 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003994 if ((i = marker(self)) < 0) return -1;
3995 Pdata_clear(self->stack, i);
3996 if ((*self->readline_func)(self, &s) < 0) return -1;
3997 if ((*self->readline_func)(self, &s) < 0) return -1;
3998 PDATA_APPEND(self->stack, Py_None,-1);
3999 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004000}
4001
4002static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004003noload_global(Unpicklerobject *self)
4004{
4005 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004007 if ((*self->readline_func)(self, &s) < 0) return -1;
4008 if ((*self->readline_func)(self, &s) < 0) return -1;
4009 PDATA_APPEND(self->stack, Py_None,-1);
4010 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004011}
4012
4013static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004014noload_reduce(Unpicklerobject *self)
4015{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004017 if (self->stack->length < 2) return stackUnderflow();
4018 Pdata_clear(self->stack, self->stack->length-2);
4019 PDATA_APPEND(self->stack, Py_None,-1);
4020 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004021}
4022
4023static int
4024noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004025
Guido van Rossum053b8df1998-11-25 16:18:00 +00004026 if (self->stack->length < 1) return stackUnderflow();
4027 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004028 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004029}
4030
4031
4032static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004033noload(Unpicklerobject *self)
4034{
4035 PyObject *err = 0, *val = 0;
4036 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004038 self->num_marks = 0;
4039 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004040
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004041 while (1) {
4042 if ((*self->read_func)(self, &s, 1) < 0)
4043 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004045 switch (s[0]) {
4046 case NONE:
4047 if (load_none(self) < 0)
4048 break;
4049 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004050
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004051 case BININT:
4052 if (load_binint(self) < 0)
4053 break;
4054 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004056 case BININT1:
4057 if (load_binint1(self) < 0)
4058 break;
4059 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004061 case BININT2:
4062 if (load_binint2(self) < 0)
4063 break;
4064 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004066 case INT:
4067 if (load_int(self) < 0)
4068 break;
4069 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004071 case LONG:
4072 if (load_long(self) < 0)
4073 break;
4074 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004076 case FLOAT:
4077 if (load_float(self) < 0)
4078 break;
4079 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004081 case BINFLOAT:
4082 if (load_binfloat(self) < 0)
4083 break;
4084 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004086 case BINSTRING:
4087 if (load_binstring(self) < 0)
4088 break;
4089 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004091 case SHORT_BINSTRING:
4092 if (load_short_binstring(self) < 0)
4093 break;
4094 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004096 case STRING:
4097 if (load_string(self) < 0)
4098 break;
4099 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004100
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004101#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004102 case UNICODE:
4103 if (load_unicode(self) < 0)
4104 break;
4105 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004107 case BINUNICODE:
4108 if (load_binunicode(self) < 0)
4109 break;
4110 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004111#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004113 case EMPTY_TUPLE:
4114 if (load_empty_tuple(self) < 0)
4115 break;
4116 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004117
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004118 case TUPLE:
4119 if (load_tuple(self) < 0)
4120 break;
4121 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004123 case EMPTY_LIST:
4124 if (load_empty_list(self) < 0)
4125 break;
4126 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004128 case LIST:
4129 if (load_list(self) < 0)
4130 break;
4131 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004133 case EMPTY_DICT:
4134 if (load_empty_dict(self) < 0)
4135 break;
4136 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004138 case DICT:
4139 if (load_dict(self) < 0)
4140 break;
4141 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004143 case OBJ:
4144 if (noload_obj(self) < 0)
4145 break;
4146 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004148 case INST:
4149 if (noload_inst(self) < 0)
4150 break;
4151 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004153 case GLOBAL:
4154 if (noload_global(self) < 0)
4155 break;
4156 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004158 case APPEND:
4159 if (load_append(self) < 0)
4160 break;
4161 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004163 case APPENDS:
4164 if (load_appends(self) < 0)
4165 break;
4166 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004168 case BUILD:
4169 if (noload_build(self) < 0)
4170 break;
4171 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004173 case DUP:
4174 if (load_dup(self) < 0)
4175 break;
4176 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004178 case BINGET:
4179 if (load_binget(self) < 0)
4180 break;
4181 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004183 case LONG_BINGET:
4184 if (load_long_binget(self) < 0)
4185 break;
4186 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004188 case GET:
4189 if (load_get(self) < 0)
4190 break;
4191 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004193 case MARK:
4194 if (load_mark(self) < 0)
4195 break;
4196 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004198 case BINPUT:
4199 if (load_binput(self) < 0)
4200 break;
4201 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004203 case LONG_BINPUT:
4204 if (load_long_binput(self) < 0)
4205 break;
4206 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004208 case PUT:
4209 if (load_put(self) < 0)
4210 break;
4211 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004213 case POP:
4214 if (load_pop(self) < 0)
4215 break;
4216 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004218 case POP_MARK:
4219 if (load_pop_mark(self) < 0)
4220 break;
4221 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004223 case SETITEM:
4224 if (load_setitem(self) < 0)
4225 break;
4226 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004228 case SETITEMS:
4229 if (load_setitems(self) < 0)
4230 break;
4231 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004233 case STOP:
4234 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004235
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004236 case PERSID:
4237 if (load_persid(self) < 0)
4238 break;
4239 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004241 case BINPERSID:
4242 if (load_binpersid(self) < 0)
4243 break;
4244 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004245
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004246 case REDUCE:
4247 if (noload_reduce(self) < 0)
4248 break;
4249 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004251 default:
4252 cPickle_ErrFormat(UnpicklingError,
4253 "invalid load key, '%s'.",
4254 "c", s[0]);
4255 return NULL;
4256 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004258 break;
4259 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004260
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004261 if ((err = PyErr_Occurred())) {
4262 if (err == PyExc_EOFError) {
4263 PyErr_SetNone(PyExc_EOFError);
4264 }
4265 return NULL;
4266 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004268 PDATA_POP(self->stack, val);
4269 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004270}
Tim Peters84e87f32001-03-17 04:50:51 +00004271
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004272
Guido van Rossum60456fd1997-04-09 17:36:32 +00004273static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004274Unpickler_load(Unpicklerobject *self, PyObject *args)
4275{
4276 if (!( PyArg_ParseTuple(args, ":load")))
4277 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004279 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004280}
4281
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004282static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004283Unpickler_noload(Unpicklerobject *self, PyObject *args)
4284{
4285 if (!( PyArg_ParseTuple(args, ":noload")))
4286 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004288 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004289}
4290
Guido van Rossum60456fd1997-04-09 17:36:32 +00004291
4292static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004293 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004294 "load() -- Load a pickle"
4295 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004296 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004297 "noload() -- not load a pickle, but go through most of the motions\n"
4298 "\n"
4299 "This function can be used to read past a pickle without instantiating\n"
4300 "any objects or importing any modules. It can also be used to find all\n"
4301 "persistent references without instantiating any objects or importing\n"
4302 "any modules.\n"
4303 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004304 {NULL, NULL} /* sentinel */
4305};
4306
4307
4308static Unpicklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004309newUnpicklerobject(PyObject *f)
4310{
4311 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004313 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
4314 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004316 self->file = NULL;
4317 self->arg = NULL;
4318 self->stack = (Pdata*)Pdata_New();
4319 self->pers_func = NULL;
4320 self->last_string = NULL;
4321 self->marks = NULL;
4322 self->num_marks = 0;
4323 self->marks_size = 0;
4324 self->buf_size = 0;
4325 self->read = NULL;
4326 self->readline = NULL;
4327 self->safe_constructors = NULL;
4328 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004330 if (!( self->memo = PyDict_New()))
4331 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004333 Py_INCREF(f);
4334 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004336 /* Set read, readline based on type of f */
4337 if (PyFile_Check(f)) {
4338 self->fp = PyFile_AsFile(f);
4339 if (self->fp == NULL) {
4340 PyErr_SetString(PyExc_ValueError,
4341 "I/O operation on closed file");
4342 goto err;
4343 }
4344 self->read_func = read_file;
4345 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004346 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004347 else if (PycStringIO_InputCheck(f)) {
4348 self->fp = NULL;
4349 self->read_func = read_cStringIO;
4350 self->readline_func = readline_cStringIO;
4351 }
4352 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004353
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004354 self->fp = NULL;
4355 self->read_func = read_other;
4356 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004358 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4359 (self->read = PyObject_GetAttr(f, read_str)))) {
4360 PyErr_Clear();
4361 PyErr_SetString( PyExc_TypeError,
4362 "argument must have 'read' and "
4363 "'readline' attributes" );
4364 goto err;
4365 }
4366 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004368 if (PyEval_GetRestricted()) {
4369 /* Restricted execution, get private tables */
4370 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004372 if (!( m=PyImport_Import(copy_reg_str))) goto err;
4373 self->safe_constructors=PyObject_GetAttr(m,
4374 safe_constructors_str);
4375 Py_DECREF(m);
4376 if (!( self->safe_constructors )) goto err;
4377 }
4378 else {
4379 self->safe_constructors=safe_constructors;
4380 Py_INCREF(safe_constructors);
4381 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004383 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004385 err:
4386 Py_DECREF((PyObject *)self);
4387 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004388}
4389
4390
4391static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004392get_Unpickler(PyObject *self, PyObject *args)
4393{
4394 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004396 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
4397 return NULL;
4398 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004399}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004400
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004401
Guido van Rossum60456fd1997-04-09 17:36:32 +00004402static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004403Unpickler_dealloc(Unpicklerobject *self)
4404{
4405 Py_XDECREF(self->readline);
4406 Py_XDECREF(self->read);
4407 Py_XDECREF(self->file);
4408 Py_XDECREF(self->memo);
4409 Py_XDECREF(self->stack);
4410 Py_XDECREF(self->pers_func);
4411 Py_XDECREF(self->arg);
4412 Py_XDECREF(self->last_string);
4413 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004415 if (self->marks) {
4416 free(self->marks);
4417 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004419 if (self->buf_size) {
4420 free(self->buf);
4421 }
Tim Peters84e87f32001-03-17 04:50:51 +00004422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004423 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004424}
4425
4426
4427static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004428Unpickler_getattr(Unpicklerobject *self, char *name)
4429{
4430 if (!strcmp(name, "persistent_load")) {
4431 if (!self->pers_func) {
4432 PyErr_SetString(PyExc_AttributeError, name);
4433 return NULL;
4434 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004436 Py_INCREF(self->pers_func);
4437 return self->pers_func;
4438 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004440 if (!strcmp(name, "find_global")) {
4441 if (!self->find_class) {
4442 PyErr_SetString(PyExc_AttributeError, name);
4443 return NULL;
4444 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004446 Py_INCREF(self->find_class);
4447 return self->find_class;
4448 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004450 if (!strcmp(name, "memo")) {
4451 if (!self->memo) {
4452 PyErr_SetString(PyExc_AttributeError, name);
4453 return NULL;
4454 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004456 Py_INCREF(self->memo);
4457 return self->memo;
4458 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004460 if (!strcmp(name, "UnpicklingError")) {
4461 Py_INCREF(UnpicklingError);
4462 return UnpicklingError;
4463 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004465 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004466}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004467
Guido van Rossum60456fd1997-04-09 17:36:32 +00004468
4469static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004470Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
4471{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004473 if (!strcmp(name, "persistent_load")) {
4474 Py_XDECREF(self->pers_func);
4475 self->pers_func = value;
4476 Py_XINCREF(value);
4477 return 0;
4478 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004480 if (!strcmp(name, "find_global")) {
4481 Py_XDECREF(self->find_class);
4482 self->find_class = value;
4483 Py_XINCREF(value);
4484 return 0;
4485 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004487 if (! value) {
4488 PyErr_SetString(PyExc_TypeError,
4489 "attribute deletion is not supported");
4490 return -1;
4491 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004493 if (strcmp(name, "memo") == 0) {
4494 if (!PyDict_Check(value)) {
4495 PyErr_SetString(PyExc_TypeError,
4496 "memo must be a dictionary");
4497 return -1;
4498 }
4499 Py_XDECREF(self->memo);
4500 self->memo = value;
4501 Py_INCREF(value);
4502 return 0;
4503 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004505 PyErr_SetString(PyExc_AttributeError, name);
4506 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004507}
4508
4509
4510static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004511cpm_dump(PyObject *self, PyObject *args)
4512{
4513 PyObject *ob, *file, *res = NULL;
4514 Picklerobject *pickler = 0;
4515 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004516
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004517 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin)))
4518 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004519
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004520 if (!( pickler = newPicklerobject(file, bin)))
4521 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004523 if (dump(pickler, ob) < 0)
4524 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004525
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004526 Py_INCREF(Py_None);
4527 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004529 finally:
4530 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004532 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004533}
4534
4535
4536static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004537cpm_dumps(PyObject *self, PyObject *args)
4538{
4539 PyObject *ob, *file = 0, *res = NULL;
4540 Picklerobject *pickler = 0;
4541 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004543 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin)))
4544 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004546 if (!( file = PycStringIO->NewOutput(128)))
4547 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004549 if (!( pickler = newPicklerobject(file, bin)))
4550 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004552 if (dump(pickler, ob) < 0)
4553 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004555 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004557 finally:
4558 Py_XDECREF(pickler);
4559 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004561 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004562}
4563
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004564
4565static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004566cpm_load(PyObject *self, PyObject *args)
4567{
4568 Unpicklerobject *unpickler = 0;
4569 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004571 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
4572 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004573
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004574 if (!( unpickler = newUnpicklerobject(ob)))
4575 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004577 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004579 finally:
4580 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004582 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004583}
4584
4585
4586static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004587cpm_loads(PyObject *self, PyObject *args)
4588{
4589 PyObject *ob, *file = 0, *res = NULL;
4590 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004592 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
4593 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004595 if (!( file = PycStringIO->NewInput(ob)))
4596 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004598 if (!( unpickler = newUnpicklerobject(file)))
4599 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004601 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004603 finally:
4604 Py_XDECREF(file);
4605 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004607 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004608}
4609
4610
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004611PyDoc_STRVAR(Unpicklertype__doc__,
4612"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004613
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004614static PyTypeObject Unpicklertype = {
4615 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004616 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004617 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004618 sizeof(Unpicklerobject), /*tp_basicsize*/
4619 0, /*tp_itemsize*/
4620 /* methods */
4621 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4622 (printfunc)0, /*tp_print*/
4623 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4624 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4625 (cmpfunc)0, /*tp_compare*/
4626 (reprfunc)0, /*tp_repr*/
4627 0, /*tp_as_number*/
4628 0, /*tp_as_sequence*/
4629 0, /*tp_as_mapping*/
4630 (hashfunc)0, /*tp_hash*/
4631 (ternaryfunc)0, /*tp_call*/
4632 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004633
Guido van Rossum60456fd1997-04-09 17:36:32 +00004634 /* Space for future expansion */
4635 0L,0L,0L,0L,
4636 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004637};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004638
Guido van Rossum60456fd1997-04-09 17:36:32 +00004639static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004640 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004641 "dump(object, file, [binary]) --"
4642 "Write an object in pickle format to the given file\n"
4643 "\n"
4644 "If the optional argument, binary, is provided and is true, then the\n"
4645 "pickle will be written in binary format, which is more space and\n"
4646 "computationally efficient. \n"
4647 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004648 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004649 "dumps(object, [binary]) --"
4650 "Return a string containing an object in pickle format\n"
4651 "\n"
4652 "If the optional argument, binary, is provided and is true, then the\n"
4653 "pickle will be written in binary format, which is more space and\n"
4654 "computationally efficient. \n"
4655 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004656 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004657 "load(file) -- Load a pickle from the given file"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004658 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004659 "loads(string) -- Load a pickle from the given string"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004660 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004661 "Pickler(file, [binary]) -- Create a pickler\n"
4662 "\n"
4663 "If the optional argument, binary, is provided and is true, then\n"
4664 "pickles will be written in binary format, which is more space and\n"
4665 "computationally efficient. \n"
4666 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004667 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004668 "Unpickler(file) -- Create an unpickler"},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004669 { NULL, NULL }
4670};
4671
Guido van Rossum60456fd1997-04-09 17:36:32 +00004672static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004673init_stuff(PyObject *module_dict)
4674{
4675 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004676
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004677#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004679 INIT_STR(__class__);
4680 INIT_STR(__getinitargs__);
4681 INIT_STR(__dict__);
4682 INIT_STR(__getstate__);
4683 INIT_STR(__setstate__);
4684 INIT_STR(__name__);
4685 INIT_STR(__main__);
4686 INIT_STR(__reduce__);
4687 INIT_STR(write);
4688 INIT_STR(__safe_for_unpickling__);
4689 INIT_STR(append);
4690 INIT_STR(read);
4691 INIT_STR(readline);
4692 INIT_STR(copy_reg);
4693 INIT_STR(dispatch_table);
4694 INIT_STR(safe_constructors);
4695 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004697 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
4698 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004700 /* These next few are special because we want to use different
4701 ones in restricted mode. */
4702 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
4703 if (!dispatch_table)
4704 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004706 if (!( safe_constructors = PyObject_GetAttr(copy_reg,
4707 safe_constructors_str)))
4708 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004710 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004712 /* Down to here ********************************** */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004714 if (!( empty_tuple = PyTuple_New(0)))
4715 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004717 /* Ugh */
4718 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4719 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4720 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004722 if (!( t=PyDict_New())) return -1;
4723 if (!( r=PyRun_String(
4724 "def __init__(self, *args): self.args=args\n\n"
4725 "def __str__(self):\n"
4726 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4727 Py_file_input,
4728 module_dict, t) )) return -1;
4729 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004730
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004731 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
4732 if (!PickleError)
4733 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004735 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004737 PicklingError = PyErr_NewException("cPickle.PicklingError",
4738 PickleError, NULL);
4739 if (!PicklingError)
4740 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004742 if (!( t=PyDict_New())) return -1;
4743 if (!( r=PyRun_String(
4744 "def __init__(self, *args): self.args=args\n\n"
4745 "def __str__(self):\n"
4746 " a=self.args\n"
4747 " a=a and type(a[0]) or '(what)'\n"
4748 " return 'Cannot pickle %s objects' % a\n"
4749 , Py_file_input,
4750 module_dict, t) )) return -1;
4751 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004753 if (!( UnpickleableError = PyErr_NewException(
4754 "cPickle.UnpickleableError", PicklingError, t)))
4755 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004757 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004759 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
4760 PickleError, NULL)))
4761 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004763 if (PyDict_SetItemString(module_dict, "PickleError",
4764 PickleError) < 0)
4765 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004767 if (PyDict_SetItemString(module_dict, "PicklingError",
4768 PicklingError) < 0)
4769 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004771 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4772 UnpicklingError) < 0)
4773 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004775 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4776 UnpickleableError) < 0)
4777 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004779 if (!( BadPickleGet = PyString_FromString("cPickle.BadPickleGet")))
4780 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004782 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4783 BadPickleGet) < 0)
4784 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004786 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004788 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004789}
4790
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004791#ifndef DL_EXPORT /* declarations for DLL import/export */
4792#define DL_EXPORT(RTYPE) RTYPE
4793#endif
Guido van Rossum50f385c1998-12-04 18:48:44 +00004794DL_EXPORT(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004795initcPickle(void)
4796{
4797 PyObject *m, *d, *di, *v, *k;
4798 int i;
4799 char *rev="1.71";
4800 PyObject *format_version;
4801 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004803 Picklertype.ob_type = &PyType_Type;
4804 Picklertype.tp_getattro = PyObject_GenericGetAttr;
4805 Picklertype.tp_setattro = PyObject_GenericSetAttr;
4806 Unpicklertype.ob_type = &PyType_Type;
4807 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004809 /* Initialize some pieces. We need to do this before module creation,
4810 so we're forced to use a temporary dictionary. :(
4811 */
4812 di=PyDict_New();
4813 if (!di) return;
4814 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004816 /* Create the module and add the functions */
4817 m = Py_InitModule4("cPickle", cPickle_methods,
4818 cPickle_module_documentation,
4819 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004821 /* Add some symbolic constants to the module */
4822 d = PyModule_GetDict(m);
4823 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4824 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004825
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004826 /* Copy data from di. Waaa. */
4827 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4828 if (PyObject_SetItem(d, k, v) < 0) {
4829 Py_DECREF(di);
4830 return;
4831 }
4832 }
4833 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004835 format_version = PyString_FromString("1.3");
4836 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004838 PyDict_SetItemString(d, "format_version", format_version);
4839 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4840 Py_XDECREF(format_version);
4841 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004842}