blob: a99d69f31c1ac9f34592e3c2050a0c8834328e8b [file] [log] [blame]
Tim Peters84e87f32001-03-17 04:50:51 +00001static char cPickle_module_documentation[] =
Guido van Rossum142eeb81997-08-13 03:14:41 +00002"C implementation and optimization of the Python pickle module\n"
3"\n"
Guido van Rossum2f80d961999-07-13 15:18:58 +00004"cPickle.c,v 1.71 1999/07/11 13:30:34 jim Exp\n"
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005;
6
7#include "Python.h"
8#include "cStringIO.h"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00009#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +000010
Guido van Rossum142eeb81997-08-13 03:14:41 +000011#ifndef Py_eval_input
12#include <graminit.h>
13#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000014#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000015
Guido van Rossum2f4caa41997-01-06 22:59:08 +000016#include <errno.h>
17
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +000018
Guido van Rossum2f4caa41997-01-06 22:59:08 +000019
Guido van Rossum60456fd1997-04-09 17:36:32 +000020#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000021
Guido van Rossum60456fd1997-04-09 17:36:32 +000022#define WRITE_BUF_SIZE 256
23
Tim Peters3906eb82001-04-10 04:22:00 +000024/* --------------------------------------------------------------------------
25NOTES on format codes.
26XXX much more is needed here
27
28Integer types
Tim Petersd8ae7c22001-04-10 04:35:28 +000029BININT1 8-bit unsigned integer; followed by 1 byte.
Tim Peters3906eb82001-04-10 04:22:00 +000030BININT2 16-bit unsigned integer; followed by 2 bytes, little-endian.
Tim Petersd8ae7c22001-04-10 04:35:28 +000031BININT 32-bit signed integer; followed by 4 bytes, little-endian.
32INT Integer; natural decimal string conversion, then newline.
Tim Peters3906eb82001-04-10 04:22:00 +000033 CAUTION: INT-reading code can't assume that what follows
34 fits in a Python int, because the size of Python ints varies
35 across platforms.
Tim Petersd8ae7c22001-04-10 04:35:28 +000036LONG Long (unbounded) integer; repr(i), then newline.
Tim Peters3906eb82001-04-10 04:22:00 +000037-------------------------------------------------------------------------- */
Guido van Rossum60456fd1997-04-09 17:36:32 +000038
39#define MARK '('
40#define STOP '.'
41#define POP '0'
42#define POP_MARK '1'
43#define DUP '2'
44#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000045#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000046#define INT 'I'
47#define BININT 'J'
48#define BININT1 'K'
49#define LONG 'L'
50#define BININT2 'M'
51#define NONE 'N'
52#define PERSID 'P'
53#define BINPERSID 'Q'
54#define REDUCE 'R'
55#define STRING 'S'
56#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000057#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000058#define UNICODE 'V'
59#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000060#define APPEND 'a'
61#define BUILD 'b'
62#define GLOBAL 'c'
63#define DICT 'd'
64#define EMPTY_DICT '}'
65#define APPENDS 'e'
66#define GET 'g'
67#define BINGET 'h'
68#define INST 'i'
69#define LONG_BINGET 'j'
70#define LIST 'l'
71#define EMPTY_LIST ']'
72#define OBJ 'o'
73#define PUT 'p'
74#define BINPUT 'q'
75#define LONG_BINPUT 'r'
76#define SETITEM 's'
77#define TUPLE 't'
78#define EMPTY_TUPLE ')'
79#define SETITEMS 'u'
Guido van Rossume2763392002-04-05 19:30:08 +000080#define TRUE "I01\n"
81#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000082
Guido van Rossum2f4caa41997-01-06 22:59:08 +000083
Guido van Rossum60456fd1997-04-09 17:36:32 +000084static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000085
Guido van Rossumc03158b1999-06-09 15:23:31 +000086static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000087static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +000088static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000089static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +000090static PyObject *BadPickleGet;
91
Guido van Rossum2f4caa41997-01-06 22:59:08 +000092
Guido van Rossum60456fd1997-04-09 17:36:32 +000093static PyObject *dispatch_table;
94static PyObject *safe_constructors;
Guido van Rossum60456fd1997-04-09 17:36:32 +000095static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000096
Guido van Rossum60456fd1997-04-09 17:36:32 +000097static PyObject *__class___str, *__getinitargs___str, *__dict___str,
98 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
99 *write_str, *__safe_for_unpickling___str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000100 *read_str, *readline_str, *__main___str, *__basicnew___str,
Fred Drake2c7a6852001-07-17 18:34:03 +0000101 *copy_reg_str, *dispatch_table_str, *safe_constructors_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000102
Guido van Rossum053b8df1998-11-25 16:18:00 +0000103/*************************************************************************
104 Internal Data type for pickle data. */
105
106typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000107 PyObject_HEAD
108 int length, size;
109 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000110} Pdata;
111
Tim Peters84e87f32001-03-17 04:50:51 +0000112static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000113Pdata_dealloc(Pdata *self)
114{
115 int i;
116 PyObject **p;
117
118 for (i=self->length, p=self->data; --i >= 0; p++) Py_DECREF(*p);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000120 if (self->data) free(self->data);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000122 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000123}
124
125static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000126 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
127 (destructor)Pdata_dealloc,
128 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000129};
130
131#define Pdata_Check(O) ((O)->ob_type == &PdataType)
132
133static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000134Pdata_New(void)
135{
136 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000138 if (!( self = PyObject_New(Pdata, &PdataType))) return NULL;
139 self->size=8;
140 self->length=0;
141 self->data=malloc(self->size * sizeof(PyObject*));
142 if (self->data) return (PyObject*)self;
143 Py_DECREF(self);
144 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000145}
146
Tim Peters84e87f32001-03-17 04:50:51 +0000147static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000148stackUnderflow(void)
149{
150 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
151 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000152}
153
154static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000155Pdata_clear(Pdata *self, int clearto)
156{
157 int i;
158 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000160 if (clearto < 0) return stackUnderflow();
161 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000163 for (i=self->length, p=self->data+clearto; --i >= clearto; p++)
164 Py_DECREF(*p);
165 self->length=clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000167 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000168}
169
170
Tim Peters84e87f32001-03-17 04:50:51 +0000171static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000172Pdata_grow(Pdata *self)
173{
174 if (! self->size) {
175 PyErr_NoMemory();
176 return -1;
177 }
178 self->size *= 2;
179 self->data = realloc(self->data, self->size*sizeof(PyObject*));
180 if (! self->data) {
181 self->size = 0;
182 PyErr_NoMemory();
183 return -1;
184 }
185 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000186}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000187
188#define PDATA_POP(D,V) { \
189 if ((D)->length) V=D->data[--((D)->length)]; \
190 else { \
191 PyErr_SetString(UnpicklingError, "bad pickle data"); \
192 V=NULL; \
193 } \
194}
195
196
197static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000198Pdata_popTuple(Pdata *self, int start)
199{
200 PyObject *r;
201 int i, j, l;
202
203 l=self->length-start;
204 if (!( r=PyTuple_New(l))) return NULL;
205 for (i=start, j=0 ; j < l; i++, j++)
206 PyTuple_SET_ITEM(r, j, self->data[i]);
207
208 self->length=start;
209 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000210}
211
212static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000213Pdata_popList(Pdata *self, int start)
214{
215 PyObject *r;
216 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000218 l=self->length-start;
219 if (!( r=PyList_New(l))) return NULL;
220 for (i=start, j=0 ; j < l; i++, j++)
221 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000223 self->length=start;
224 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000225}
226
227#define PDATA_APPEND_(D,O,ER) { \
228 if (Pdata_Append(((Pdata*)(D)), O) < 0) return ER; \
229}
230
231#define PDATA_APPEND(D,O,ER) { \
232 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
233 Pdata_grow((Pdata*)(D)) < 0) \
234 return ER; \
235 Py_INCREF(O); \
236 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
237}
238
239#define PDATA_PUSH(D,O,ER) { \
240 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
241 Pdata_grow((Pdata*)(D)) < 0) { \
242 Py_DECREF(O); \
243 return ER; \
244 } \
245 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
246}
247
248/*************************************************************************/
249
250#define ARG_TUP(self, o) { \
251 if (self->arg || (self->arg=PyTuple_New(1))) { \
252 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
253 PyTuple_SET_ITEM(self->arg,0,o); \
254 } \
255 else { \
256 Py_DECREF(o); \
257 } \
258}
259
260#define FREE_ARG_TUP(self) { \
261 if (self->arg->ob_refcnt > 1) { \
262 Py_DECREF(self->arg); \
263 self->arg=NULL; \
264 } \
265 }
266
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000267typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000268 PyObject_HEAD
269 FILE *fp;
270 PyObject *write;
271 PyObject *file;
272 PyObject *memo;
273 PyObject *arg;
274 PyObject *pers_func;
275 PyObject *inst_pers_func;
276 int bin;
277 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
278 int (*write_func)(struct Picklerobject *, char *, int);
279 char *write_buf;
280 int buf_size;
281 PyObject *dispatch_table;
282 int fast_container; /* count nested container dumps */
283 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000284} Picklerobject;
285
Barry Warsaw52acb492001-12-21 20:04:22 +0000286#ifndef PY_CPICKLE_FAST_LIMIT
287#define PY_CPICKLE_FAST_LIMIT 50
288#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000289
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000290staticforward PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000291
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000292typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000293 PyObject_HEAD
294 FILE *fp;
295 PyObject *file;
296 PyObject *readline;
297 PyObject *read;
298 PyObject *memo;
299 PyObject *arg;
300 Pdata *stack;
301 PyObject *mark;
302 PyObject *pers_func;
303 PyObject *last_string;
304 int *marks;
305 int num_marks;
306 int marks_size;
307 int (*read_func)(struct Unpicklerobject *, char **, int);
308 int (*readline_func)(struct Unpicklerobject *, char **);
309 int buf_size;
310 char *buf;
311 PyObject *safe_constructors;
312 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000313} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000314
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000315staticforward PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000316
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000317/* Forward decls that need the above structs */
318static int save(Picklerobject *, PyObject *, int);
319static int put2(Picklerobject *, PyObject *);
320
Tim Peters84e87f32001-03-17 04:50:51 +0000321int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000322cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
323{
324 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000326 if ((v = PyObject_GetItem(o,key))) {
327 Py_DECREF(v);
328 return 1;
329 }
330
331 PyErr_Clear();
332 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000333}
334
Guido van Rossumd385d591997-04-09 17:47:47 +0000335static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000336PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000337cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
338{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000339 va_list va;
340 PyObject *args=0, *retval=0;
341 va_start(va, format);
342
343 if (format) args = Py_VaBuildValue(format, va);
344 va_end(va);
345 if (format && ! args) return NULL;
346 if (stringformat && !(retval=PyString_FromString(stringformat)))
347 return NULL;
348
349 if (retval) {
350 if (args) {
351 PyObject *v;
352 v=PyString_Format(retval, args);
353 Py_DECREF(retval);
354 Py_DECREF(args);
355 if (! v) return NULL;
356 retval=v;
357 }
358 }
359 else
360 if (args) retval=args;
361 else {
362 PyErr_SetObject(ErrType,Py_None);
363 return NULL;
364 }
365 PyErr_SetObject(ErrType,retval);
366 Py_DECREF(retval);
367 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000368}
369
Tim Peters84e87f32001-03-17 04:50:51 +0000370static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000371write_file(Picklerobject *self, char *s, int n)
372{
373 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000375 if (s == NULL) {
376 return 0;
377 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000379 Py_BEGIN_ALLOW_THREADS
380 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
381 Py_END_ALLOW_THREADS
382 if (nbyteswritten != (size_t)n) {
383 PyErr_SetFromErrno(PyExc_IOError);
384 return -1;
385 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000387 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000388}
389
Tim Peters84e87f32001-03-17 04:50:51 +0000390static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000391write_cStringIO(Picklerobject *self, char *s, int n)
392{
393 if (s == NULL) {
394 return 0;
395 }
396
397 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
398 return -1;
399 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000401 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000402}
403
Tim Peters84e87f32001-03-17 04:50:51 +0000404static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000405write_none(Picklerobject *self, char *s, int n)
406{
407 if (s == NULL) return 0;
408 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000409}
410
Tim Peters84e87f32001-03-17 04:50:51 +0000411static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000412write_other(Picklerobject *self, char *s, int n)
413{
414 PyObject *py_str = 0, *junk = 0;
415
416 if (s == NULL) {
417 if (!( self->buf_size )) return 0;
418 py_str = PyString_FromStringAndSize(self->write_buf,
419 self->buf_size);
420 if (!py_str)
421 return -1;
422 }
423 else {
424 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
425 if (write_other(self, NULL, 0) < 0)
426 return -1;
427 }
428
429 if (n > WRITE_BUF_SIZE) {
430 if (!( py_str =
431 PyString_FromStringAndSize(s, n)))
432 return -1;
433 }
434 else {
435 memcpy(self->write_buf + self->buf_size, s, n);
436 self->buf_size += n;
437 return n;
438 }
439 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000441 if (self->write) {
442 /* object with write method */
443 ARG_TUP(self, py_str);
444 if (self->arg) {
445 junk = PyObject_Call(self->write, self->arg, NULL);
446 FREE_ARG_TUP(self);
447 }
448 if (junk) Py_DECREF(junk);
449 else return -1;
450 }
451 else
452 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000454 self->buf_size = 0;
455 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000456}
457
458
Tim Peters84e87f32001-03-17 04:50:51 +0000459static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000460read_file(Unpicklerobject *self, char **s, int n)
461{
462 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000464 if (self->buf_size == 0) {
465 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000467 size = ((n < 32) ? 32 : n);
468 if (!( self->buf = (char *)malloc(size * sizeof(char)))) {
469 PyErr_NoMemory();
470 return -1;
471 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000473 self->buf_size = size;
474 }
475 else if (n > self->buf_size) {
476 self->buf = (char *)realloc(self->buf, n * sizeof(char));
477 if (!self->buf) {
478 PyErr_NoMemory();
479 return -1;
480 }
Tim Peters84e87f32001-03-17 04:50:51 +0000481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000482 self->buf_size = n;
483 }
Tim Peters84e87f32001-03-17 04:50:51 +0000484
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000485 Py_BEGIN_ALLOW_THREADS
486 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
487 Py_END_ALLOW_THREADS
488 if (nbytesread != (size_t)n) {
489 if (feof(self->fp)) {
490 PyErr_SetNone(PyExc_EOFError);
491 return -1;
492 }
493
494 PyErr_SetFromErrno(PyExc_IOError);
495 return -1;
496 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000498 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000500 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000501}
502
503
Tim Peters84e87f32001-03-17 04:50:51 +0000504static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000505readline_file(Unpicklerobject *self, char **s)
506{
507 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000509 if (self->buf_size == 0) {
510 if (!( self->buf = (char *)malloc(40 * sizeof(char)))) {
511 PyErr_NoMemory();
512 return -1;
513 }
Tim Peters84e87f32001-03-17 04:50:51 +0000514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000515 self->buf_size = 40;
516 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000518 i = 0;
519 while (1) {
520 for (; i < (self->buf_size - 1); i++) {
521 if (feof(self->fp) ||
522 (self->buf[i] = getc(self->fp)) == '\n') {
523 self->buf[i + 1] = '\0';
524 *s = self->buf;
525 return i + 1;
526 }
527 }
528 self->buf = (char *)realloc(self->buf,
529 (self->buf_size * 2) * sizeof(char));
530 if (!self->buf) {
531 PyErr_NoMemory();
532 return -1;
533 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000535 self->buf_size *= 2;
536 }
Tim Peters84e87f32001-03-17 04:50:51 +0000537}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000538
539
Tim Peters84e87f32001-03-17 04:50:51 +0000540static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000541read_cStringIO(Unpicklerobject *self, char **s, int n)
542{
543 char *ptr;
544
545 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
546 PyErr_SetNone(PyExc_EOFError);
547 return -1;
548 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000550 *s = ptr;
551
552 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000553}
554
555
Tim Peters84e87f32001-03-17 04:50:51 +0000556static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000557readline_cStringIO(Unpicklerobject *self, char **s)
558{
559 int n;
560 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000562 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
563 return -1;
564 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000566 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000568 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000569}
570
571
Tim Peters84e87f32001-03-17 04:50:51 +0000572static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000573read_other(Unpicklerobject *self, char **s, int n)
574{
575 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000577 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000579 ARG_TUP(self, bytes);
580 if (self->arg) {
581 str = PyObject_Call(self->read, self->arg, NULL);
582 FREE_ARG_TUP(self);
583 }
584 if (! str) return -1;
585
586 Py_XDECREF(self->last_string);
587 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000589 if (! (*s = PyString_AsString(str))) return -1;
590 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000591}
592
593
Tim Peters84e87f32001-03-17 04:50:51 +0000594static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000595readline_other(Unpicklerobject *self, char **s)
596{
597 PyObject *str;
598 int str_size;
599
600 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
601 return -1;
602 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000603
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000604 if ((str_size = PyString_Size(str)) < 0)
605 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000607 Py_XDECREF(self->last_string);
608 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000610 if (! (*s = PyString_AsString(str)))
611 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000613 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000614}
615
616
617static char *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000618pystrndup(char *s, int l)
619{
620 char *r;
621 if (!( r=malloc((l+1)*sizeof(char)))) return (char*)PyErr_NoMemory();
622 memcpy(r,s,l);
623 r[l]=0;
624 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000625}
626
627
628static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000629get(Picklerobject *self, PyObject *id)
630{
631 PyObject *value, *mv;
632 long c_value;
633 char s[30];
634 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000636 if (!( mv = PyDict_GetItem(self->memo, id))) {
637 PyErr_SetObject(PyExc_KeyError, id);
638 return -1;
639 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000641 if (!( value = PyTuple_GetItem(mv, 0)))
642 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000644 if (!( PyInt_Check(value))) {
645 PyErr_SetString(PicklingError, "no int where int expected in memo");
646 return -1;
647 }
648 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000649
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000650 if (!self->bin) {
651 s[0] = GET;
652 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
653 len = strlen(s);
654 }
655 else if (Pdata_Check(self->file)) {
656 if (write_other(self, NULL, 0) < 0) return -1;
657 PDATA_APPEND(self->file, mv, -1);
658 return 0;
659 }
660 else {
661 if (c_value < 256) {
662 s[0] = BINGET;
663 s[1] = (int)(c_value & 0xff);
664 len = 2;
665 }
666 else {
667 s[0] = LONG_BINGET;
668 s[1] = (int)(c_value & 0xff);
669 s[2] = (int)((c_value >> 8) & 0xff);
670 s[3] = (int)((c_value >> 16) & 0xff);
671 s[4] = (int)((c_value >> 24) & 0xff);
672 len = 5;
673 }
674 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000676 if ((*self->write_func)(self, s, len) < 0)
677 return -1;
678
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000679 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000680}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000681
Guido van Rossum60456fd1997-04-09 17:36:32 +0000682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000683static int
684put(Picklerobject *self, PyObject *ob)
685{
686 if (ob->ob_refcnt < 2 || self->fast)
687 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000689 return put2(self, ob);
690}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000691
Guido van Rossum053b8df1998-11-25 16:18:00 +0000692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000693static int
694put2(Picklerobject *self, PyObject *ob)
695{
696 char c_str[30];
697 int p;
698 size_t len;
699 int res = -1;
700 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000702 if (self->fast)
703 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000705 if ((p = PyDict_Size(self->memo)) < 0)
706 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000708 /* Make sure memo keys are positive! */
709 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000711 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
712 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000714 if (!( memo_len = PyInt_FromLong(p)))
715 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000717 if (!( t = PyTuple_New(2)))
718 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000720 PyTuple_SET_ITEM(t, 0, memo_len);
721 Py_INCREF(memo_len);
722 PyTuple_SET_ITEM(t, 1, ob);
723 Py_INCREF(ob);
724
725 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
726 goto finally;
727
728 if (!self->bin) {
729 c_str[0] = PUT;
730 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
731 len = strlen(c_str);
732 }
733 else if (Pdata_Check(self->file)) {
734 if (write_other(self, NULL, 0) < 0) return -1;
735 PDATA_APPEND(self->file, memo_len, -1);
736 res=0; /* Job well done ;) */
737 goto finally;
738 }
739 else {
740 if (p >= 256) {
741 c_str[0] = LONG_BINPUT;
742 c_str[1] = (int)(p & 0xff);
743 c_str[2] = (int)((p >> 8) & 0xff);
744 c_str[3] = (int)((p >> 16) & 0xff);
745 c_str[4] = (int)((p >> 24) & 0xff);
746 len = 5;
747 }
748 else {
749 c_str[0] = BINPUT;
750 c_str[1] = p;
751 len = 2;
752 }
753 }
754
755 if ((*self->write_func)(self, c_str, len) < 0)
756 goto finally;
757
758 res = 0;
759
760 finally:
761 Py_XDECREF(py_ob_id);
762 Py_XDECREF(memo_len);
763 Py_XDECREF(t);
764
765 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000766}
767
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000768#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000769
770static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000771PyImport_Import(PyObject *module_name)
772{
773 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
774 static PyObject *standard_builtins=0;
775 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000777 if (!( silly_list )) {
778 if (!( __import___str=PyString_FromString("__import__")))
779 return NULL;
780 if (!( __builtins___str=PyString_FromString("__builtins__")))
781 return NULL;
782 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
783 return NULL;
784 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000786 if ((globals=PyEval_GetGlobals())) {
787 Py_INCREF(globals);
788 __builtins__=PyObject_GetItem(globals,__builtins___str);
789 if (!__builtins__)
790 goto err;
791 }
792 else {
793 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000795 if (!(standard_builtins ||
796 (standard_builtins=PyImport_ImportModule("__builtin__"))))
797 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000799 __builtins__=standard_builtins;
800 Py_INCREF(__builtins__);
801 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
802 if (!globals)
803 goto err;
804 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000806 if (PyDict_Check(__builtins__)) {
807 __import__=PyObject_GetItem(__builtins__,__import___str);
808 if (!__import__) goto err;
809 }
810 else {
811 __import__=PyObject_GetAttr(__builtins__,__import___str);
812 if (!__import__) goto err;
813 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000815 r=PyObject_CallFunction(__import__,"OOOO",
816 module_name, globals, globals, silly_list);
817 if (!r)
818 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000820 Py_DECREF(globals);
821 Py_DECREF(__builtins__);
822 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000824 return r;
825 err:
826 Py_XDECREF(globals);
827 Py_XDECREF(__builtins__);
828 Py_XDECREF(__import__);
829 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000830}
831
832static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000833whichmodule(PyObject *global, PyObject *global_name)
834{
835 int i, j;
836 PyObject *module = 0, *modules_dict = 0,
837 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000839 module = PyObject_GetAttrString(global, "__module__");
840 if (module) return module;
841 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000843 if (!( modules_dict = PySys_GetObject("modules")))
844 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000846 i = 0;
847 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000849 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000851 global_name_attr = PyObject_GetAttr(module, global_name);
852 if (!global_name_attr) {
853 PyErr_Clear();
854 continue;
855 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000857 if (global_name_attr != global) {
858 Py_DECREF(global_name_attr);
859 continue;
860 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000864 break;
865 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000867 /* The following implements the rule in pickle.py added in 1.5
868 that used __main__ if no module is found. I don't actually
869 like this rule. jlf
870 */
871 if (!j) {
872 j=1;
873 name=__main___str;
874 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000876 Py_INCREF(name);
877 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000878}
879
880
Guido van Rossum60456fd1997-04-09 17:36:32 +0000881static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000882fast_save_enter(Picklerobject *self, PyObject *obj)
883{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000884 /* if fast_container < 0, we're doing an error exit. */
885 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
886 PyObject *key = NULL;
887 if (self->fast_memo == NULL) {
888 self->fast_memo = PyDict_New();
889 if (self->fast_memo == NULL) {
890 self->fast_container = -1;
891 return 0;
892 }
893 }
894 key = PyLong_FromVoidPtr(obj);
895 if (key == NULL)
896 return 0;
897 if (PyDict_GetItem(self->fast_memo, key)) {
898 PyErr_Format(PyExc_ValueError,
899 "fast mode: can't pickle cyclic objects including object type %s at %p",
900 obj->ob_type->tp_name, obj);
901 self->fast_container = -1;
902 return 0;
903 }
904 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
905 self->fast_container = -1;
906 return 0;
907 }
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000908 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000909 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000910}
911
912int
913fast_save_leave(Picklerobject *self, PyObject *obj)
914{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000915 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
916 PyObject *key = PyLong_FromVoidPtr(obj);
917 if (key == NULL)
918 return 0;
919 if (PyDict_DelItem(self->fast_memo, key) < 0) {
920 return 0;
921 }
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000922 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000923 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000924}
925
926static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000927save_none(Picklerobject *self, PyObject *args)
928{
929 static char none = NONE;
930 if ((*self->write_func)(self, &none, 1) < 0)
931 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000932
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000933 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000934}
935
Guido van Rossum77f6a652002-04-03 22:41:51 +0000936static int
937save_bool(Picklerobject *self, PyObject *args)
938{
Guido van Rossume2763392002-04-05 19:30:08 +0000939 static char *buf[2] = {FALSE, TRUE};
940 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000941 long l = PyInt_AS_LONG((PyIntObject *)args);
942
Guido van Rossume2763392002-04-05 19:30:08 +0000943 if ((*self->write_func)(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000944 return -1;
945
946 return 0;
947}
Tim Peters84e87f32001-03-17 04:50:51 +0000948
Guido van Rossum60456fd1997-04-09 17:36:32 +0000949static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000950save_int(Picklerobject *self, PyObject *args)
951{
952 char c_str[32];
953 long l = PyInt_AS_LONG((PyIntObject *)args);
954 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000956 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000957#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000958 || l > 0x7fffffffL
959 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000960#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000961 ) {
962 /* Text-mode pickle, or long too big to fit in the 4-byte
963 * signed BININT format: store as a string.
964 */
965 c_str[0] = INT;
966 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
967 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
968 return -1;
969 }
970 else {
971 /* Binary pickle and l fits in a signed 4-byte int. */
972 c_str[1] = (int)( l & 0xff);
973 c_str[2] = (int)((l >> 8) & 0xff);
974 c_str[3] = (int)((l >> 16) & 0xff);
975 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000976
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000977 if ((c_str[4] == 0) && (c_str[3] == 0)) {
978 if (c_str[2] == 0) {
979 c_str[0] = BININT1;
980 len = 2;
981 }
982 else {
983 c_str[0] = BININT2;
984 len = 3;
985 }
986 }
987 else {
988 c_str[0] = BININT;
989 len = 5;
990 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000991
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000992 if ((*self->write_func)(self, c_str, len) < 0)
993 return -1;
994 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000996 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000997}
998
999
1000static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001001save_long(Picklerobject *self, PyObject *args)
1002{
1003 int size, res = -1;
1004 PyObject *repr = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001005
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001006 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001008 if (!( repr = PyObject_Repr(args)))
1009 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001011 if ((size = PyString_Size(repr)) < 0)
1012 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001014 if ((*self->write_func)(self, &l, 1) < 0)
1015 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001017 if ((*self->write_func)(self,
1018 PyString_AS_STRING((PyStringObject *)repr),
1019 size) < 0)
1020 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001021
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001022 if ((*self->write_func)(self, "\n", 1) < 0)
1023 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001025 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001027 finally:
1028 Py_XDECREF(repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001030 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001031}
1032
1033
1034static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001035save_float(Picklerobject *self, PyObject *args)
1036{
1037 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001039 if (self->bin) {
1040 int s, e;
1041 double f;
1042 long fhi, flo;
1043 char str[9];
1044 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001046 *p = BINFLOAT;
1047 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001049 if (x < 0) {
1050 s = 1;
1051 x = -x;
1052 }
1053 else
1054 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001056 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001058 /* Normalize f to be in the range [1.0, 2.0) */
1059 if (0.5 <= f && f < 1.0) {
1060 f *= 2.0;
1061 e--;
1062 }
1063 else if (f == 0.0) {
1064 e = 0;
1065 }
1066 else {
1067 PyErr_SetString(PyExc_SystemError,
1068 "frexp() result out of range");
1069 return -1;
1070 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001072 if (e >= 1024) {
1073 /* XXX 1024 itself is reserved for Inf/NaN */
1074 PyErr_SetString(PyExc_OverflowError,
1075 "float too large to pack with d format");
1076 return -1;
1077 }
1078 else if (e < -1022) {
1079 /* Gradual underflow */
1080 f = ldexp(f, 1022 + e);
1081 e = 0;
1082 }
1083 else if (!(e == 0 && f == 0.0)) {
1084 e += 1023;
1085 f -= 1.0; /* Get rid of leading 1 */
1086 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001088 /* fhi receives the high 28 bits;
1089 flo the low 24 bits (== 52 bits) */
1090 f *= 268435456.0; /* 2**28 */
1091 fhi = (long) floor(f); /* Truncate */
1092 f -= (double)fhi;
1093 f *= 16777216.0; /* 2**24 */
1094 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001096 /* First byte */
1097 *p = (s<<7) | (e>>4);
1098 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001100 /* Second byte */
1101 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1102 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001103
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001104 /* Third byte */
1105 *p = (unsigned char) ((fhi>>16) & 0xFF);
1106 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001108 /* Fourth byte */
1109 *p = (unsigned char) ((fhi>>8) & 0xFF);
1110 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001112 /* Fifth byte */
1113 *p = (unsigned char) (fhi & 0xFF);
1114 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001116 /* Sixth byte */
1117 *p = (unsigned char) ((flo>>16) & 0xFF);
1118 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001120 /* Seventh byte */
1121 *p = (unsigned char) ((flo>>8) & 0xFF);
1122 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001124 /* Eighth byte */
1125 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001127 if ((*self->write_func)(self, str, 9) < 0)
1128 return -1;
1129 }
1130 else {
1131 char c_str[250];
1132 c_str[0] = FLOAT;
1133 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001135 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1136 return -1;
1137 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001139 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001140}
1141
1142
1143static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001144save_string(Picklerobject *self, PyObject *args, int doput)
1145{
1146 int size, len;
1147 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001148
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001149 if ((size = PyString_Size(args)) < 0)
1150 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001152 if (!self->bin) {
1153 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001155 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001157 if (!( repr = PyObject_Repr(args)))
1158 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001160 if ((len = PyString_Size(repr)) < 0)
1161 goto err;
1162 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001164 if ((*self->write_func)(self, &string, 1) < 0)
1165 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001167 if ((*self->write_func)(self, repr_str, len) < 0)
1168 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001170 if ((*self->write_func)(self, "\n", 1) < 0)
1171 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001173 Py_XDECREF(repr);
1174 }
1175 else {
1176 int i;
1177 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001179 if ((size = PyString_Size(args)) < 0)
1180 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001182 if (size < 256) {
1183 c_str[0] = SHORT_BINSTRING;
1184 c_str[1] = size;
1185 len = 2;
1186 }
1187 else {
1188 c_str[0] = BINSTRING;
1189 for (i = 1; i < 5; i++)
1190 c_str[i] = (int)(size >> ((i - 1) * 8));
1191 len = 5;
1192 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001194 if ((*self->write_func)(self, c_str, len) < 0)
1195 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 if (size > 128 && Pdata_Check(self->file)) {
1198 if (write_other(self, NULL, 0) < 0) return -1;
1199 PDATA_APPEND(self->file, args, -1);
1200 }
1201 else {
1202 if ((*self->write_func)(self,
1203 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1204 return -1;
1205 }
1206 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001208 if (doput)
1209 if (put(self, args) < 0)
1210 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001212 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001214 err:
1215 Py_XDECREF(repr);
1216 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001217}
1218
1219
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001220#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001221/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1222 backslash and newline characters to \uXXXX escapes. */
1223static PyObject *
1224modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1225{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001226 PyObject *repr;
1227 char *p;
1228 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001230 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001232 repr = PyString_FromStringAndSize(NULL, 6 * size);
1233 if (repr == NULL)
1234 return NULL;
1235 if (size == 0)
1236 return repr;
1237
1238 p = q = PyString_AS_STRING(repr);
1239 while (size-- > 0) {
1240 Py_UNICODE ch = *s++;
1241 /* Map 16-bit characters to '\uxxxx' */
1242 if (ch >= 256 || ch == '\\' || ch == '\n') {
1243 *p++ = '\\';
1244 *p++ = 'u';
1245 *p++ = hexdigit[(ch >> 12) & 0xf];
1246 *p++ = hexdigit[(ch >> 8) & 0xf];
1247 *p++ = hexdigit[(ch >> 4) & 0xf];
1248 *p++ = hexdigit[ch & 15];
1249 }
1250 /* Copy everything else as-is */
1251 else
1252 *p++ = (char) ch;
1253 }
1254 *p = '\0';
1255 if (_PyString_Resize(&repr, p - q))
1256 goto onError;
1257
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001258 return repr;
1259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001260 onError:
1261 Py_DECREF(repr);
1262 return NULL;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001263}
1264
1265
Guido van Rossum60456fd1997-04-09 17:36:32 +00001266static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001267save_unicode(Picklerobject *self, PyObject *args, int doput)
1268{
1269 int size, len;
1270 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001272 if (!PyUnicode_Check(args))
1273 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001275 if (!self->bin) {
1276 char *repr_str;
1277 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001279 repr = modified_EncodeRawUnicodeEscape(
1280 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
1281 if (!repr)
1282 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001284 if ((len = PyString_Size(repr)) < 0)
1285 goto err;
1286 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001288 if ((*self->write_func)(self, &string, 1) < 0)
1289 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001291 if ((*self->write_func)(self, repr_str, len) < 0)
1292 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001294 if ((*self->write_func)(self, "\n", 1) < 0)
1295 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001297 Py_XDECREF(repr);
1298 }
1299 else {
1300 int i;
1301 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001303 if (!( repr = PyUnicode_AsUTF8String(args)))
1304 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001306 if ((size = PyString_Size(repr)) < 0)
1307 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001309 c_str[0] = BINUNICODE;
1310 for (i = 1; i < 5; i++)
1311 c_str[i] = (int)(size >> ((i - 1) * 8));
1312 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001314 if ((*self->write_func)(self, c_str, len) < 0)
1315 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001317 if (size > 128 && Pdata_Check(self->file)) {
1318 if (write_other(self, NULL, 0) < 0)
1319 goto err;
1320 PDATA_APPEND(self->file, repr, -1);
1321 }
1322 else {
1323 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1324 size) < 0)
1325 goto err;
1326 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001327
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001328 Py_DECREF(repr);
1329 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001331 if (doput)
1332 if (put(self, args) < 0)
1333 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001335 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001337 err:
1338 Py_XDECREF(repr);
1339 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001340}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001341#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001342
1343
1344static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001345save_tuple(Picklerobject *self, PyObject *args)
1346{
1347 PyObject *element = 0, *py_tuple_id = 0;
1348 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001350 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001352 if ((*self->write_func)(self, &MARKv, 1) < 0)
1353 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001355 if ((len = PyTuple_Size(args)) < 0)
1356 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001358 for (i = 0; i < len; i++) {
1359 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
1360 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001362 if (save(self, element, 0) < 0)
1363 goto finally;
1364 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001366 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
1367 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001369 if (len) {
1370 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1371 if (self->bin) {
1372 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001374 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1375 goto finally;
1376 }
1377 else {
1378 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001380 for (i = 0; i <= len; i++) {
1381 if ((*self->write_func)(self, &pop, 1) < 0)
1382 goto finally;
1383 }
1384 }
Tim Peters84e87f32001-03-17 04:50:51 +00001385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001386 if (get(self, py_tuple_id) < 0)
1387 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001389 res = 0;
1390 goto finally;
1391 }
1392 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001394 if ((*self->write_func)(self, &tuple, 1) < 0) {
1395 goto finally;
1396 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001398 if (put(self, args) < 0)
1399 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001401 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001403 finally:
1404 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001406 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001407}
1408
1409static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001410save_empty_tuple(Picklerobject *self, PyObject *args)
1411{
1412 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001413
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001414 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001415}
1416
1417
1418static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001419save_list(Picklerobject *self, PyObject *args)
1420{
1421 PyObject *element = 0;
1422 int s_len, len, i, using_appends, res = -1;
1423 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001425 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001427 if (self->fast && !fast_save_enter(self, args))
1428 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001429
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001430 if (self->bin) {
1431 s[0] = EMPTY_LIST;
1432 s_len = 1;
1433 }
1434 else {
1435 s[0] = MARK;
1436 s[1] = LIST;
1437 s_len = 2;
1438 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001440 if ((len = PyList_Size(args)) < 0)
1441 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001443 if ((*self->write_func)(self, s, s_len) < 0)
1444 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001446 if (len == 0) {
1447 if (put(self, args) < 0)
1448 goto finally;
1449 }
1450 else {
1451 if (put2(self, args) < 0)
1452 goto finally;
1453 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001454
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001455 if ((using_appends = (self->bin && (len > 1))))
1456 if ((*self->write_func)(self, &MARKv, 1) < 0)
1457 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001458
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001459 for (i = 0; i < len; i++) {
1460 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
1461 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001462
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001463 if (save(self, element, 0) < 0)
1464 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001466 if (!using_appends) {
1467 if ((*self->write_func)(self, &append, 1) < 0)
1468 goto finally;
1469 }
1470 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001472 if (using_appends) {
1473 if ((*self->write_func)(self, &appends, 1) < 0)
1474 goto finally;
1475 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001477 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001479 finally:
1480 if (self->fast && !fast_save_leave(self, args))
1481 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001483 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001484}
1485
1486
Guido van Rossum60456fd1997-04-09 17:36:32 +00001487static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001488save_dict(Picklerobject *self, PyObject *args)
1489{
1490 PyObject *key = 0, *value = 0;
1491 int i, len, res = -1, using_setitems;
1492 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001494 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001496 if (self->fast && !fast_save_enter(self, args))
1497 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001499 if (self->bin) {
1500 s[0] = EMPTY_DICT;
1501 len = 1;
1502 }
1503 else {
1504 s[0] = MARK;
1505 s[1] = DICT;
1506 len = 2;
1507 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001509 if ((*self->write_func)(self, s, len) < 0)
1510 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001512 if ((len = PyDict_Size(args)) < 0)
1513 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001515 if (len == 0) {
1516 if (put(self, args) < 0)
1517 goto finally;
1518 }
1519 else {
1520 if (put2(self, args) < 0)
1521 goto finally;
1522 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001524 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1525 if ((*self->write_func)(self, &MARKv, 1) < 0)
1526 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001528 i = 0;
1529 while (PyDict_Next(args, &i, &key, &value)) {
1530 if (save(self, key, 0) < 0)
1531 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001533 if (save(self, value, 0) < 0)
1534 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001536 if (!using_setitems) {
1537 if ((*self->write_func)(self, &setitem, 1) < 0)
1538 goto finally;
1539 }
1540 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001542 if (using_setitems) {
1543 if ((*self->write_func)(self, &setitems, 1) < 0)
1544 goto finally;
1545 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001546
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001547 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001549 finally:
1550 if (self->fast && !fast_save_leave(self, args))
1551 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001553 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001554}
1555
1556
Tim Peters84e87f32001-03-17 04:50:51 +00001557static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001558save_inst(Picklerobject *self, PyObject *args)
1559{
1560 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1561 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1562 char *module_str, *name_str;
1563 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001565 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001567 if (self->fast && !fast_save_enter(self, args))
1568 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001570 if ((*self->write_func)(self, &MARKv, 1) < 0)
1571 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001573 if (!( class = PyObject_GetAttr(args, __class___str)))
1574 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001576 if (self->bin) {
1577 if (save(self, class, 0) < 0)
1578 goto finally;
1579 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001581 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1582 PyObject *element = 0;
1583 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001585 if (!( class_args =
1586 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
1587 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001589 if ((len = PyObject_Size(class_args)) < 0)
1590 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001592 for (i = 0; i < len; i++) {
1593 if (!( element = PySequence_GetItem(class_args, i)))
1594 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001596 if (save(self, element, 0) < 0) {
1597 Py_DECREF(element);
1598 goto finally;
1599 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001601 Py_DECREF(element);
1602 }
1603 }
1604 else {
1605 PyErr_Clear();
1606 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001608 if (!self->bin) {
1609 if (!( name = ((PyClassObject *)class)->cl_name )) {
1610 PyErr_SetString(PicklingError, "class has no name");
1611 goto finally;
1612 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001614 if (!( module = whichmodule(class, name)))
1615 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001616
Tim Peters84e87f32001-03-17 04:50:51 +00001617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001618 if ((module_size = PyString_Size(module)) < 0 ||
1619 (name_size = PyString_Size(name)) < 0)
1620 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001622 module_str = PyString_AS_STRING((PyStringObject *)module);
1623 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001625 if ((*self->write_func)(self, &inst, 1) < 0)
1626 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001628 if ((*self->write_func)(self, module_str, module_size) < 0)
1629 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001631 if ((*self->write_func)(self, "\n", 1) < 0)
1632 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001634 if ((*self->write_func)(self, name_str, name_size) < 0)
1635 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001637 if ((*self->write_func)(self, "\n", 1) < 0)
1638 goto finally;
1639 }
1640 else if ((*self->write_func)(self, &obj, 1) < 0) {
1641 goto finally;
1642 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001644 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1645 state = PyObject_Call(getstate_func, empty_tuple, NULL);
1646 if (!state)
1647 goto finally;
1648 }
1649 else {
1650 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001652 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1653 PyErr_Clear();
1654 res = 0;
1655 goto finally;
1656 }
1657 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001658
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001659 if (!PyDict_Check(state)) {
1660 if (put2(self, args) < 0)
1661 goto finally;
1662 }
1663 else {
1664 if (put(self, args) < 0)
1665 goto finally;
1666 }
Tim Peters84e87f32001-03-17 04:50:51 +00001667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001668 if (save(self, state, 0) < 0)
1669 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001671 if ((*self->write_func)(self, &build, 1) < 0)
1672 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001674 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001676 finally:
1677 if (self->fast && !fast_save_leave(self, args))
1678 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001680 Py_XDECREF(module);
1681 Py_XDECREF(class);
1682 Py_XDECREF(state);
1683 Py_XDECREF(getinitargs_func);
1684 Py_XDECREF(getstate_func);
1685 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001687 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001688}
1689
1690
Guido van Rossum60456fd1997-04-09 17:36:32 +00001691static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001692save_global(Picklerobject *self, PyObject *args, PyObject *name)
1693{
1694 PyObject *global_name = 0, *module = 0, *mod = 0, *moddict = 0, *klass = 0;
1695 char *name_str, *module_str;
1696 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001698 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001700 if (name) {
1701 global_name = name;
1702 Py_INCREF(global_name);
1703 }
1704 else {
1705 if (!( global_name = PyObject_GetAttr(args, __name___str)))
1706 goto finally;
1707 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001709 if (!( module = whichmodule(args, global_name)))
1710 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001712 if ((module_size = PyString_Size(module)) < 0 ||
1713 (name_size = PyString_Size(global_name)) < 0)
1714 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001716 module_str = PyString_AS_STRING((PyStringObject *)module);
1717 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001719 mod = PyImport_ImportModule(module_str);
1720 if (mod == NULL) {
1721 /* Py_ErrClear(); ?? */
1722 cPickle_ErrFormat(PicklingError,
1723 "Can't pickle %s: it's not found as %s.%s",
1724 "OSS", args, module, global_name);
1725 goto finally;
1726 }
1727 /* borrowed ref */
1728 moddict = PyModule_GetDict(mod);
1729 /* borrowed ref */
1730 klass = PyDict_GetItemString(moddict, name_str);
1731 if (klass == NULL) {
1732 cPickle_ErrFormat(PicklingError,
1733 "Can't pickle %s: it's not found as %s.%s",
1734 "OSS", args, module, global_name);
1735 goto finally;
1736 }
1737 if (klass != args) {
1738 cPickle_ErrFormat(PicklingError,
1739 "Can't pickle %s: it's not the same object as %s.%s",
1740 "OSS", args, module, global_name);
1741 goto finally;
1742 }
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001743
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001744 if ((*self->write_func)(self, &global, 1) < 0)
1745 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001747 if ((*self->write_func)(self, module_str, module_size) < 0)
1748 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001750 if ((*self->write_func)(self, "\n", 1) < 0)
1751 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001753 if ((*self->write_func)(self, name_str, name_size) < 0)
1754 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001756 if ((*self->write_func)(self, "\n", 1) < 0)
1757 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001759 if (put(self, args) < 0)
1760 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001762 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001764 finally:
1765 Py_XDECREF(module);
1766 Py_XDECREF(global_name);
1767 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001769 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001770}
1771
Guido van Rossum60456fd1997-04-09 17:36:32 +00001772static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001773save_pers(Picklerobject *self, PyObject *args, PyObject *f)
1774{
1775 PyObject *pid = 0;
1776 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001778 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001780 Py_INCREF(args);
1781 ARG_TUP(self, args);
1782 if (self->arg) {
1783 pid = PyObject_Call(f, self->arg, NULL);
1784 FREE_ARG_TUP(self);
1785 }
1786 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001788 if (pid != Py_None) {
1789 if (!self->bin) {
1790 if (!PyString_Check(pid)) {
1791 PyErr_SetString(PicklingError,
1792 "persistent id must be string");
1793 goto finally;
1794 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001796 if ((*self->write_func)(self, &persid, 1) < 0)
1797 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001799 if ((size = PyString_Size(pid)) < 0)
1800 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001802 if ((*self->write_func)(self,
1803 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1804 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001806 if ((*self->write_func)(self, "\n", 1) < 0)
1807 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001809 res = 1;
1810 goto finally;
1811 }
1812 else if (save(self, pid, 1) >= 0) {
1813 if ((*self->write_func)(self, &binpersid, 1) < 0)
1814 res = -1;
1815 else
1816 res = 1;
1817 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001819 goto finally;
1820 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001822 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001824 finally:
1825 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001827 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001828}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001829
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001830
Tim Peters84e87f32001-03-17 04:50:51 +00001831static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001832save_reduce(Picklerobject *self, PyObject *callable,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001833 PyObject *tup, PyObject *state, PyObject *ob)
1834{
1835 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001837 if (save(self, callable, 0) < 0)
1838 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001840 if (save(self, tup, 0) < 0)
1841 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001843 if ((*self->write_func)(self, &reduce, 1) < 0)
1844 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001846 if (ob != NULL) {
1847 if (state && !PyDict_Check(state)) {
1848 if (put2(self, ob) < 0)
1849 return -1;
1850 }
1851 else {
1852 if (put(self, ob) < 0)
1853 return -1;
1854 }
1855 }
Tim Peters84e87f32001-03-17 04:50:51 +00001856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001857 if (state) {
1858 if (save(self, state, 0) < 0)
1859 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001861 if ((*self->write_func)(self, &build, 1) < 0)
1862 return -1;
1863 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001865 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001866}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001867
Guido van Rossum60456fd1997-04-09 17:36:32 +00001868static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001869save(Picklerobject *self, PyObject *args, int pers_save)
1870{
1871 PyTypeObject *type;
1872 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1873 *callable = 0, *state = 0;
1874 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001876 if (!pers_save && self->pers_func) {
1877 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1878 res = tmp;
1879 goto finally;
1880 }
1881 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001883 if (args == Py_None) {
1884 res = save_none(self, args);
1885 goto finally;
1886 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001888 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001890 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001891 case 'b':
1892 if (args == Py_False || args == Py_True) {
1893 res = save_bool(self, args);
1894 goto finally;
1895 }
1896 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001897 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001898 if (type == &PyInt_Type) {
1899 res = save_int(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 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001905 if (type == &PyLong_Type) {
1906 res = save_long(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 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001912 if (type == &PyFloat_Type) {
1913 res = save_float(self, args);
1914 goto finally;
1915 }
1916 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001917
Guido van Rossum60456fd1997-04-09 17:36:32 +00001918 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001919 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
1920 if (self->bin) res = save_empty_tuple(self, args);
1921 else res = save_tuple(self, args);
1922 goto finally;
1923 }
1924 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001925
Guido van Rossum60456fd1997-04-09 17:36:32 +00001926 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001927 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
1928 res = save_string(self, args, 0);
1929 goto finally;
1930 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001931
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001932#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001933 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001934 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1935 res = save_unicode(self, args, 0);
1936 goto finally;
1937 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001938#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001939 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001941 if (args->ob_refcnt > 1) {
1942 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
1943 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001945 if (PyDict_GetItem(self->memo, py_ob_id)) {
1946 if (get(self, py_ob_id) < 0)
1947 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001949 res = 0;
1950 goto finally;
1951 }
1952 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001954 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001955 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001956 if (type == &PyString_Type) {
1957 res = save_string(self, args, 1);
1958 goto finally;
1959 }
1960 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001961
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001962#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001963 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001964 if (type == &PyUnicode_Type) {
1965 res = save_unicode(self, args, 1);
1966 goto finally;
1967 }
1968 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001969#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001970
Guido van Rossum60456fd1997-04-09 17:36:32 +00001971 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001972 if (type == &PyTuple_Type) {
1973 res = save_tuple(self, args);
1974 goto finally;
1975 }
1976 if (type == &PyType_Type) {
1977 res = save_global(self, args, NULL);
1978 goto finally;
1979 }
1980 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001981
Guido van Rossum60456fd1997-04-09 17:36:32 +00001982 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001983 if (type == &PyList_Type) {
1984 res = save_list(self, args);
1985 goto finally;
1986 }
1987 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001988
1989 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001990 if (type == &PyDict_Type) {
1991 res = save_dict(self, args);
1992 goto finally;
1993 }
1994 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001995
1996 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001997 if (type == &PyInstance_Type) {
1998 res = save_inst(self, args);
1999 goto finally;
2000 }
2001 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002002
2003 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002004 if (type == &PyClass_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 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002011 if (type == &PyFunction_Type) {
2012 res = save_global(self, args, NULL);
2013 goto finally;
2014 }
2015 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002016
2017 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002018 if (type == &PyCFunction_Type) {
2019 res = save_global(self, args, NULL);
2020 goto finally;
2021 }
2022 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002024 if (PyType_IsSubtype(type, &PyType_Type)) {
2025 res = save_global(self, args, NULL);
2026 goto finally;
2027 }
Guido van Rossum950dce62001-12-19 16:56:54 +00002028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002029 if (!pers_save && self->inst_pers_func) {
2030 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2031 res = tmp;
2032 goto finally;
2033 }
2034 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002036 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2037 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002039 Py_INCREF(args);
2040 ARG_TUP(self, args);
2041 if (self->arg) {
2042 t = PyObject_Call(__reduce__, self->arg, NULL);
2043 FREE_ARG_TUP(self);
2044 }
2045 if (! t) goto finally;
2046 }
2047 else {
2048 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002050 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2051 t = PyObject_Call(__reduce__, empty_tuple, NULL);
2052 if (!t)
2053 goto finally;
2054 }
2055 else {
2056 PyErr_Clear();
2057 }
2058 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002060 if (t) {
2061 if (PyString_Check(t)) {
2062 res = save_global(self, args, t);
2063 goto finally;
2064 }
Tim Peters84e87f32001-03-17 04:50:51 +00002065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002066 if (!PyTuple_Check(t)) {
2067 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2068 "be a tuple", "O", __reduce__);
2069 goto finally;
2070 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002072 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002074 if ((size != 3) && (size != 2)) {
2075 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2076 "contain only two or three elements", "O", __reduce__);
2077 goto finally;
2078 }
Tim Peters84e87f32001-03-17 04:50:51 +00002079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002080 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002082 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002084 if (size > 2) {
2085 state = PyTuple_GET_ITEM(t, 2);
2086 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002088 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2089 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2090 "returned by %s must be a tuple", "O", __reduce__);
2091 goto finally;
2092 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002094 res = save_reduce(self, callable, arg_tup, state, args);
2095 goto finally;
2096 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002098 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002100 finally:
2101 Py_XDECREF(py_ob_id);
2102 Py_XDECREF(__reduce__);
2103 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002105 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002106}
2107
2108
2109static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002110dump(Picklerobject *self, PyObject *args)
2111{
2112 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002114 if (save(self, args, 0) < 0)
2115 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002117 if ((*self->write_func)(self, &stop, 1) < 0)
2118 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002120 if ((*self->write_func)(self, NULL, 0) < 0)
2121 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002123 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002124}
2125
2126static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002127Pickle_clear_memo(Picklerobject *self, PyObject *args)
2128{
2129 if (!PyArg_ParseTuple(args,":clear_memo"))
2130 return NULL;
2131 if (self->memo)
2132 PyDict_Clear(self->memo);
2133 Py_INCREF(Py_None);
2134 return Py_None;
2135}
2136
2137static PyObject *
2138Pickle_getvalue(Picklerobject *self, PyObject *args)
2139{
2140 int l, i, rsize, ssize, clear=1, lm;
2141 long ik;
2142 PyObject *k, *r;
2143 char *s, *p, *have_get;
2144 Pdata *data;
2145
2146 /* Can be called by Python code or C code */
2147 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2148 return NULL;
2149
2150 /* Check to make sure we are based on a list */
2151 if (! Pdata_Check(self->file)) {
2152 PyErr_SetString(PicklingError,
2153 "Attempt to getvalue() a non-list-based pickler");
2154 return NULL;
2155 }
2156
2157 /* flush write buffer */
2158 if (write_other(self, NULL, 0) < 0) return NULL;
2159
2160 data=(Pdata*)self->file;
2161 l=data->length;
2162
2163 /* set up an array to hold get/put status */
2164 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2165 lm++;
2166 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2167 memset(have_get,0,lm);
2168
2169 /* Scan for gets. */
2170 for (rsize=0, i=l; --i >= 0; ) {
2171 k=data->data[i];
2172
2173 if (PyString_Check(k)) {
2174 rsize += PyString_GET_SIZE(k);
2175 }
2176
2177 else if (PyInt_Check(k)) { /* put */
2178 ik=PyInt_AS_LONG((PyIntObject*)k);
2179 if (ik >= lm || ik==0) {
2180 PyErr_SetString(PicklingError,
2181 "Invalid get data");
2182 return NULL;
2183 }
2184 if (have_get[ik]) { /* with matching get */
2185 if (ik < 256) rsize += 2;
2186 else rsize+=5;
2187 }
2188 }
2189
2190 else if (! (PyTuple_Check(k) &&
2191 PyTuple_GET_SIZE(k) == 2 &&
2192 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2193 ) {
2194 PyErr_SetString(PicklingError,
2195 "Unexpected data in internal list");
2196 return NULL;
2197 }
2198
2199 else { /* put */
2200 ik=PyInt_AS_LONG((PyIntObject*)k);
2201 if (ik >= lm || ik==0) {
2202 PyErr_SetString(PicklingError,
2203 "Invalid get data");
2204 return NULL;
2205 }
2206 have_get[ik]=1;
2207 if (ik < 256) rsize += 2;
2208 else rsize+=5;
2209 }
2210
2211 }
2212
2213 /* Now generate the result */
2214 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2215 s=PyString_AS_STRING((PyStringObject*)r);
2216
2217 for (i=0; i<l; i++) {
2218 k=data->data[i];
2219
2220 if (PyString_Check(k)) {
2221 ssize=PyString_GET_SIZE(k);
2222 if (ssize) {
2223 p=PyString_AS_STRING((PyStringObject*)k);
2224 while (--ssize >= 0) *s++=*p++;
2225 }
2226 }
2227
2228 else if (PyTuple_Check(k)) { /* get */
2229 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2230 if (ik < 256) {
2231 *s++ = BINGET;
2232 *s++ = (int)(ik & 0xff);
2233 }
2234 else {
2235 *s++ = LONG_BINGET;
2236 *s++ = (int)(ik & 0xff);
2237 *s++ = (int)((ik >> 8) & 0xff);
2238 *s++ = (int)((ik >> 16) & 0xff);
2239 *s++ = (int)((ik >> 24) & 0xff);
2240 }
2241 }
2242
2243 else { /* put */
2244 ik=PyInt_AS_LONG((PyIntObject*)k);
2245
2246 if (have_get[ik]) { /* with matching get */
2247 if (ik < 256) {
2248 *s++ = BINPUT;
2249 *s++ = (int)(ik & 0xff);
2250 }
2251 else {
2252 *s++ = LONG_BINPUT;
2253 *s++ = (int)(ik & 0xff);
2254 *s++ = (int)((ik >> 8) & 0xff);
2255 *s++ = (int)((ik >> 16) & 0xff);
2256 *s++ = (int)((ik >> 24) & 0xff);
2257 }
2258 }
2259 }
2260
2261 }
2262
2263 if (clear) {
2264 PyDict_Clear(self->memo);
2265 Pdata_clear(data,0);
2266 }
2267
2268 free(have_get);
2269 return r;
2270 err:
2271 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002272 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002273}
2274
2275static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002276Pickler_dump(Picklerobject *self, PyObject *args)
2277{
2278 PyObject *ob;
2279 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002281 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
2282 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002284 if (dump(self, ob) < 0)
2285 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002287 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002289 /* XXX Why does dump() return self? */
2290 Py_INCREF(self);
2291 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002292}
2293
2294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002295static struct PyMethodDef Pickler_methods[] =
2296{
Neal Norwitzb0493252002-03-31 14:44:22 +00002297 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002298 "dump(object) --"
2299 "Write an object in pickle format to the object's pickle stream\n"
2300 },
Neal Norwitzb0493252002-03-31 14:44:22 +00002301 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002302 "clear_memo() -- Clear the picklers memo"},
Neal Norwitzb0493252002-03-31 14:44:22 +00002303 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Guido van Rossum053b8df1998-11-25 16:18:00 +00002304 "getvalue() -- Finish picking a list-based pickle"},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002305 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002306};
2307
2308
2309static Picklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002310newPicklerobject(PyObject *file, int bin)
2311{
2312 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002314 if (!( self = PyObject_New(Picklerobject, &Picklertype)))
2315 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002317 self->fp = NULL;
2318 self->write = NULL;
2319 self->memo = NULL;
2320 self->arg = NULL;
2321 self->pers_func = NULL;
2322 self->inst_pers_func = NULL;
2323 self->write_buf = NULL;
2324 self->bin = bin;
2325 self->fast = 0;
2326 self->fast_container = 0;
2327 self->fast_memo = NULL;
2328 self->buf_size = 0;
2329 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002331 if (file)
2332 Py_INCREF(file);
2333 else
2334 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002336 if (!( self->file = file ))
2337 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002339 if (!( self->memo = PyDict_New()))
2340 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002342 if (PyFile_Check(file)) {
2343 self->fp = PyFile_AsFile(file);
2344 if (self->fp == NULL) {
2345 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2346 goto err;
2347 }
2348 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002349 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002350 else if (PycStringIO_OutputCheck(file)) {
2351 self->write_func = write_cStringIO;
2352 }
2353 else if (file == Py_None) {
2354 self->write_func = write_none;
2355 }
2356 else {
2357 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002359 if (! Pdata_Check(file)) {
2360 self->write = PyObject_GetAttr(file, write_str);
2361 if (!self->write) {
2362 PyErr_Clear();
2363 PyErr_SetString(PyExc_TypeError,
2364 "argument must have 'write' "
2365 "attribute");
2366 goto err;
2367 }
2368 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002370 if (!( self->write_buf =
2371 (char *)malloc(WRITE_BUF_SIZE * sizeof(char)))) {
2372 PyErr_NoMemory();
2373 goto err;
2374 }
2375 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002377 if (PyEval_GetRestricted()) {
2378 /* Restricted execution, get private tables */
2379 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002381 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2382 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2383 Py_DECREF(m);
2384 if (!( self->dispatch_table )) goto err;
2385 }
2386 else {
2387 self->dispatch_table=dispatch_table;
2388 Py_INCREF(dispatch_table);
2389 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002391 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002393 err:
2394 Py_DECREF((PyObject *)self);
2395 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002396}
2397
2398
2399static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002400get_Pickler(PyObject *self, PyObject *args)
2401{
2402 PyObject *file = NULL;
2403 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002405 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
2406 PyErr_Clear();
2407 bin = 0;
2408 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2409 return NULL;
2410 }
2411 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002412}
2413
2414
2415static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002416Pickler_dealloc(Picklerobject *self)
2417{
2418 Py_XDECREF(self->write);
2419 Py_XDECREF(self->memo);
2420 Py_XDECREF(self->fast_memo);
2421 Py_XDECREF(self->arg);
2422 Py_XDECREF(self->file);
2423 Py_XDECREF(self->pers_func);
2424 Py_XDECREF(self->inst_pers_func);
2425 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002427 if (self->write_buf) {
2428 free(self->write_buf);
2429 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002431 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002432}
2433
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002434static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002435Pickler_get_pers_func(Picklerobject *p)
2436{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002437 if (p->pers_func == NULL)
2438 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2439 else
2440 Py_INCREF(p->pers_func);
2441 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002442}
2443
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002444static int
2445Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2446{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002447 if (v == NULL) {
2448 PyErr_SetString(PyExc_TypeError,
2449 "attribute deletion is not supported");
2450 return -1;
2451 }
2452 Py_XDECREF(p->pers_func);
2453 Py_INCREF(v);
2454 p->pers_func = v;
2455 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002456}
2457
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002458static int
2459Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2460{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002461 if (v == NULL) {
2462 PyErr_SetString(PyExc_TypeError,
2463 "attribute deletion is not supported");
2464 return -1;
2465 }
2466 Py_XDECREF(p->inst_pers_func);
2467 Py_INCREF(v);
2468 p->inst_pers_func = v;
2469 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002470}
2471
2472static PyObject *
2473Pickler_get_memo(Picklerobject *p)
2474{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002475 if (p->memo == NULL)
2476 PyErr_SetString(PyExc_AttributeError, "memo");
2477 else
2478 Py_INCREF(p->memo);
2479 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002480}
2481
2482static int
2483Pickler_set_memo(Picklerobject *p, PyObject *v)
2484{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002485 if (v == NULL) {
2486 PyErr_SetString(PyExc_TypeError,
2487 "attribute deletion is not supported");
2488 return -1;
2489 }
2490 if (!PyDict_Check(v)) {
2491 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2492 return -1;
2493 }
2494 Py_XDECREF(p->memo);
2495 Py_INCREF(v);
2496 p->memo = v;
2497 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002498}
2499
2500static PyObject *
2501Pickler_get_error(Picklerobject *p)
2502{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002503 /* why is this an attribute on the Pickler? */
2504 Py_INCREF(PicklingError);
2505 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002506}
2507
2508static PyMemberDef Pickler_members[] = {
2509 {"binary", T_INT, offsetof(Picklerobject, bin)},
2510 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002511 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002512};
2513
2514static PyGetSetDef Pickler_getsets[] = {
2515 {"persistent_id", (getter)Pickler_get_pers_func,
2516 (setter)Pickler_set_pers_func},
2517 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2518 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002519 {"PicklingError", (getter)Pickler_get_error, NULL},
2520 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002521};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002522
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002523static char Picklertype__doc__[] =
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002524"Objects that know how to pickle objects\n";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002525
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002526static PyTypeObject Picklertype = {
2527 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002528 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002529 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002530 sizeof(Picklerobject), /*tp_basicsize*/
2531 0,
2532 (destructor)Pickler_dealloc, /* tp_dealloc */
2533 0, /* tp_print */
2534 0, /* tp_getattr */
2535 0, /* tp_setattr */
2536 0, /* tp_compare */
2537 0, /* tp_repr */
2538 0, /* tp_as_number */
2539 0, /* tp_as_sequence */
2540 0, /* tp_as_mapping */
2541 0, /* tp_hash */
2542 0, /* tp_call */
2543 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002544 0, /* set below */ /* tp_getattro */
2545 0, /* set below */ /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002546 0, /* tp_as_buffer */
2547 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2548 Picklertype__doc__, /* tp_doc */
2549 0, /* tp_traverse */
2550 0, /* tp_clear */
2551 0, /* tp_richcompare */
2552 0, /* tp_weaklistoffset */
2553 0, /* tp_iter */
2554 0, /* tp_iternext */
2555 Pickler_methods, /* tp_methods */
2556 Pickler_members, /* tp_members */
2557 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002558};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002559
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002560static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002561find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
2562{
2563 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002565 if (fc) {
2566 if (fc==Py_None) {
2567 PyErr_SetString(UnpicklingError,
2568 "Global and instance pickles are not supported.");
2569 return NULL;
2570 }
2571 return PyObject_CallFunction(fc, "OO", py_module_name,
2572 py_global_name);
2573 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002575 module = PySys_GetObject("modules");
2576 if (module == NULL)
2577 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002579 module = PyDict_GetItem(module, py_module_name);
2580 if (module == NULL) {
2581 module = PyImport_Import(py_module_name);
2582 if (!module)
2583 return NULL;
2584 global = PyObject_GetAttr(module, py_global_name);
2585 Py_DECREF(module);
2586 }
2587 else
2588 global = PyObject_GetAttr(module, py_global_name);
2589 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002590}
2591
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002592static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002593marker(Unpicklerobject *self)
2594{
2595 if (self->num_marks < 1) {
2596 PyErr_SetString(UnpicklingError, "could not find MARK");
2597 return -1;
2598 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002600 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002601}
2602
Tim Peters84e87f32001-03-17 04:50:51 +00002603
Guido van Rossum60456fd1997-04-09 17:36:32 +00002604static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002605load_none(Unpicklerobject *self)
2606{
2607 PDATA_APPEND(self->stack, Py_None, -1);
2608 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002609}
2610
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002611static int
Guido van Rossum77f6a652002-04-03 22:41:51 +00002612load_false(Unpicklerobject *self)
2613{
2614 PDATA_APPEND(self->stack, Py_False, -1);
2615 return 0;
2616}
2617
2618static int
2619load_true(Unpicklerobject *self)
2620{
2621 PDATA_APPEND(self->stack, Py_True, -1);
2622 return 0;
2623}
2624
2625static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002626bad_readline(void)
2627{
2628 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2629 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002630}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002631
2632static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002633load_int(Unpicklerobject *self)
2634{
2635 PyObject *py_int = 0;
2636 char *endptr, *s;
2637 int len, res = -1;
2638 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002640 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2641 if (len < 2) return bad_readline();
2642 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002644 errno = 0;
2645 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002647 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2648 /* Hm, maybe we've got something long. Let's try reading
2649 it as a Python long object. */
2650 errno = 0;
2651 py_int = PyLong_FromString(s, NULL, 0);
2652 if (py_int == NULL) {
2653 PyErr_SetString(PyExc_ValueError,
2654 "could not convert string to int");
2655 goto finally;
2656 }
2657 }
2658 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002659 if (len == 3 && (l == 0 || l == 1)) {
2660 if (!( py_int = PyBool_FromLong(l))) goto finally;
2661 }
2662 else {
2663 if (!( py_int = PyInt_FromLong(l))) goto finally;
2664 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002665 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002667 free(s);
2668 PDATA_PUSH(self->stack, py_int, -1);
2669 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002671 finally:
2672 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002674 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002675}
2676
2677
Tim Peters84e87f32001-03-17 04:50:51 +00002678static long
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002679calc_binint(char *s, int x)
2680{
2681 unsigned char c;
2682 int i;
2683 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002685 for (i = 0, l = 0L; i < x; i++) {
2686 c = (unsigned char)s[i];
2687 l |= (long)c << (i * 8);
2688 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002689#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002690 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2691 * is signed, so on a box with longs bigger than 4 bytes we need
2692 * to extend a BININT's sign bit to the full width.
2693 */
2694 if (x == 4 && l & (1L << 31))
2695 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002696#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002697 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002698}
2699
2700
2701static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002702load_binintx(Unpicklerobject *self, char *s, int x)
2703{
2704 PyObject *py_int = 0;
2705 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002707 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002709 if (!( py_int = PyInt_FromLong(l)))
2710 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002712 PDATA_PUSH(self->stack, py_int, -1);
2713 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002714}
2715
2716
2717static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002718load_binint(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, 4) < 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, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002726}
2727
2728
2729static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002730load_binint1(Unpicklerobject *self)
2731{
2732 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002734 if ((*self->read_func)(self, &s, 1) < 0)
2735 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002737 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002738}
2739
2740
2741static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002742load_binint2(Unpicklerobject *self)
2743{
2744 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002746 if ((*self->read_func)(self, &s, 2) < 0)
2747 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002749 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002750}
Tim Peters84e87f32001-03-17 04:50:51 +00002751
Guido van Rossum60456fd1997-04-09 17:36:32 +00002752static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002753load_long(Unpicklerobject *self)
2754{
2755 PyObject *l = 0;
2756 char *end, *s;
2757 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002759 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2760 if (len < 2) return bad_readline();
2761 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002763 if (!( l = PyLong_FromString(s, &end, 0)))
2764 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002766 free(s);
2767 PDATA_PUSH(self->stack, l, -1);
2768 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002770 finally:
2771 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002773 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002774}
2775
Tim Peters84e87f32001-03-17 04:50:51 +00002776
Guido van Rossum60456fd1997-04-09 17:36:32 +00002777static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002778load_float(Unpicklerobject *self)
2779{
2780 PyObject *py_float = 0;
2781 char *endptr, *s;
2782 int len, res = -1;
2783 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002785 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2786 if (len < 2) return bad_readline();
2787 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002789 errno = 0;
2790 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002792 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2793 PyErr_SetString(PyExc_ValueError,
2794 "could not convert string to float");
2795 goto finally;
2796 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002798 if (!( py_float = PyFloat_FromDouble(d)))
2799 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002801 free(s);
2802 PDATA_PUSH(self->stack, py_float, -1);
2803 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002805 finally:
2806 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002808 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002809}
2810
Guido van Rossum60456fd1997-04-09 17:36:32 +00002811static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002812load_binfloat(Unpicklerobject *self)
2813{
2814 PyObject *py_float = 0;
2815 int s, e;
2816 long fhi, flo;
2817 double x;
2818 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002820 if ((*self->read_func)(self, &p, 8) < 0)
2821 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002823 /* First byte */
2824 s = (*p>>7) & 1;
2825 e = (*p & 0x7F) << 4;
2826 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002828 /* Second byte */
2829 e |= (*p>>4) & 0xF;
2830 fhi = (*p & 0xF) << 24;
2831 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002833 /* Third byte */
2834 fhi |= (*p & 0xFF) << 16;
2835 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002837 /* Fourth byte */
2838 fhi |= (*p & 0xFF) << 8;
2839 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002841 /* Fifth byte */
2842 fhi |= *p & 0xFF;
2843 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002845 /* Sixth byte */
2846 flo = (*p & 0xFF) << 16;
2847 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002849 /* Seventh byte */
2850 flo |= (*p & 0xFF) << 8;
2851 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002853 /* Eighth byte */
2854 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002856 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2857 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002859 /* XXX This sadly ignores Inf/NaN */
2860 if (e == 0)
2861 e = -1022;
2862 else {
2863 x += 1.0;
2864 e -= 1023;
2865 }
2866 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002868 if (s)
2869 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002871 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002873 PDATA_PUSH(self->stack, py_float, -1);
2874 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002875}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002876
2877static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002878load_string(Unpicklerobject *self)
2879{
2880 PyObject *str = 0;
2881 int len, res = -1, nslash;
2882 char *s, q, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002884 static PyObject *eval_dict = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002886 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2887 if (len < 2) return bad_readline();
2888 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002890 /* Check for unquoted quotes (evil strings) */
2891 q=*s;
2892 if (q != '"' && q != '\'') goto insecure;
2893 for (p=s+1, nslash=0; *p; p++) {
2894 if (*p==q && nslash%2==0) break;
2895 if (*p=='\\') nslash++;
2896 else nslash=0;
2897 }
2898 if (*p == q) {
2899 for (p++; *p; p++)
2900 if (*(unsigned char *)p > ' ')
2901 goto insecure;
2902 }
2903 else
2904 goto insecure;
2905 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002907 if (!( eval_dict ))
2908 if (!( eval_dict = Py_BuildValue("{s{}}", "__builtins__")))
2909 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002911 if (!( str = PyRun_String(s, Py_eval_input, eval_dict, eval_dict)))
2912 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002914 free(s);
2915 PDATA_PUSH(self->stack, str, -1);
2916 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002917
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002918 finally:
2919 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002921 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002922
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002923 insecure:
2924 free(s);
2925 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2926 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002927}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002928
2929
2930static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002931load_binstring(Unpicklerobject *self)
2932{
2933 PyObject *py_string = 0;
2934 long l;
2935 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002937 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002939 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002941 if ((*self->read_func)(self, &s, l) < 0)
2942 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002944 if (!( py_string = PyString_FromStringAndSize(s, l)))
2945 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002947 PDATA_PUSH(self->stack, py_string, -1);
2948 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002949}
2950
2951
2952static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002953load_short_binstring(Unpicklerobject *self)
2954{
2955 PyObject *py_string = 0;
2956 unsigned char l;
2957 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002959 if ((*self->read_func)(self, &s, 1) < 0)
2960 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002962 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002964 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002966 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002967
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002968 PDATA_PUSH(self->stack, py_string, -1);
2969 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002970}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002971
2972
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002973#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002974static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002975load_unicode(Unpicklerobject *self)
2976{
2977 PyObject *str = 0;
2978 int len, res = -1;
2979 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002981 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2982 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002984 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
2985 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002987 PDATA_PUSH(self->stack, str, -1);
2988 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002990 finally:
2991 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002992}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002993#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002994
2995
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002996#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002997static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002998load_binunicode(Unpicklerobject *self)
2999{
3000 PyObject *unicode;
3001 long l;
3002 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003004 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003005
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003006 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003008 if ((*self->read_func)(self, &s, l) < 0)
3009 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003011 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
3012 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003014 PDATA_PUSH(self->stack, unicode, -1);
3015 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003016}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003017#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003018
3019
3020static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003021load_tuple(Unpicklerobject *self)
3022{
3023 PyObject *tup;
3024 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003026 if ((i = marker(self)) < 0) return -1;
3027 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3028 PDATA_PUSH(self->stack, tup, -1);
3029 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003030}
3031
3032static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003033load_empty_tuple(Unpicklerobject *self)
3034{
3035 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003036
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003037 if (!( tup=PyTuple_New(0))) return -1;
3038 PDATA_PUSH(self->stack, tup, -1);
3039 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003040}
3041
3042static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003043load_empty_list(Unpicklerobject *self)
3044{
3045 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003046
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003047 if (!( list=PyList_New(0))) return -1;
3048 PDATA_PUSH(self->stack, list, -1);
3049 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003050}
3051
3052static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003053load_empty_dict(Unpicklerobject *self)
3054{
3055 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003057 if (!( dict=PyDict_New())) return -1;
3058 PDATA_PUSH(self->stack, dict, -1);
3059 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003060}
3061
3062
3063static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003064load_list(Unpicklerobject *self)
3065{
3066 PyObject *list = 0;
3067 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003069 if ((i = marker(self)) < 0) return -1;
3070 if (!( list=Pdata_popList(self->stack, i))) return -1;
3071 PDATA_PUSH(self->stack, list, -1);
3072 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003073}
3074
3075static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003076load_dict(Unpicklerobject *self)
3077{
3078 PyObject *dict, *key, *value;
3079 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003081 if ((i = marker(self)) < 0) return -1;
3082 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003084 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003086 for (k = i+1; k < j; k += 2) {
3087 key =self->stack->data[k-1];
3088 value=self->stack->data[k ];
3089 if (PyDict_SetItem(dict, key, value) < 0) {
3090 Py_DECREF(dict);
3091 return -1;
3092 }
3093 }
3094 Pdata_clear(self->stack, i);
3095 PDATA_PUSH(self->stack, dict, -1);
3096 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003097}
3098
3099static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003100Instance_New(PyObject *cls, PyObject *args)
3101{
3102 int has_key;
3103 PyObject *safe=0, *r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003105 if (PyClass_Check(cls)) {
3106 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003108 if ((l=PyObject_Size(args)) < 0) goto err;
3109 if (!( l )) {
3110 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003112 __getinitargs__ = PyObject_GetAttr(cls,
3113 __getinitargs___str);
3114 if (!__getinitargs__) {
3115 /* We have a class with no __getinitargs__,
3116 so bypass usual construction */
3117 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003119 PyErr_Clear();
3120 if (!( inst=PyInstance_NewRaw(cls, NULL)))
3121 goto err;
3122 return inst;
3123 }
3124 Py_DECREF(__getinitargs__);
3125 }
Tim Peters84e87f32001-03-17 04:50:51 +00003126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003127 if ((r=PyInstance_New(cls, args, NULL))) return r;
3128 else goto err;
3129 }
Tim Peters84e87f32001-03-17 04:50:51 +00003130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003131 /* Is safe_constructors always a dict? */
3132 has_key = cPickle_PyMapping_HasKey(safe_constructors, cls);
3133 if (!has_key) {
3134 safe = PyObject_GetAttr(cls, __safe_for_unpickling___str);
3135 if (!safe ||
3136 !PyObject_IsTrue(safe)) {
3137 cPickle_ErrFormat(UnpicklingError,
3138 "%s is not safe for unpickling",
3139 "O", cls);
3140 Py_XDECREF(safe);
3141 return NULL;
3142 }
3143 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003145 if (args==Py_None) {
3146 /* Special case, call cls.__basicnew__() */
3147 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003148
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003149 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3150 if (!basicnew) return NULL;
3151 r=PyObject_CallObject(basicnew, NULL);
3152 Py_DECREF(basicnew);
3153 if (r) return r;
3154 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003156 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003158 err:
3159 {
3160 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003162 PyErr_Fetch(&tp, &v, &tb);
3163 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3164 Py_XDECREF(v);
3165 v=r;
3166 }
3167 PyErr_Restore(tp,v,tb);
3168 }
3169 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003170}
Tim Peters84e87f32001-03-17 04:50:51 +00003171
Guido van Rossum60456fd1997-04-09 17:36:32 +00003172
3173static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003174load_obj(Unpicklerobject *self)
3175{
3176 PyObject *class, *tup, *obj=0;
3177 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003179 if ((i = marker(self)) < 0) return -1;
3180 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3181 PDATA_POP(self->stack, class);
3182 if (class) {
3183 obj = Instance_New(class, tup);
3184 Py_DECREF(class);
3185 }
3186 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003188 if (! obj) return -1;
3189 PDATA_PUSH(self->stack, obj, -1);
3190 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003191}
3192
3193
3194static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003195load_inst(Unpicklerobject *self)
3196{
3197 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3198 int i, len;
3199 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003200
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003201 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003203 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3204 if (len < 2) return bad_readline();
3205 module_name = PyString_FromStringAndSize(s, len - 1);
3206 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003208 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3209 if (len < 2) return bad_readline();
3210 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3211 class = find_class(module_name, class_name,
3212 self->find_class);
3213 Py_DECREF(class_name);
3214 }
3215 }
3216 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003218 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003220 if ((tup=Pdata_popTuple(self->stack, i))) {
3221 obj = Instance_New(class, tup);
3222 Py_DECREF(tup);
3223 }
3224 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003226 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003228 PDATA_PUSH(self->stack, obj, -1);
3229 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003230}
3231
3232
3233static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003234load_global(Unpicklerobject *self)
3235{
3236 PyObject *class = 0, *module_name = 0, *class_name = 0;
3237 int len;
3238 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003240 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3241 if (len < 2) return bad_readline();
3242 module_name = PyString_FromStringAndSize(s, len - 1);
3243 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003245 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3246 if (len < 2) return bad_readline();
3247 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3248 class = find_class(module_name, class_name,
3249 self->find_class);
3250 Py_DECREF(class_name);
3251 }
3252 }
3253 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003255 if (! class) return -1;
3256 PDATA_PUSH(self->stack, class, -1);
3257 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003258}
3259
3260
3261static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003262load_persid(Unpicklerobject *self)
3263{
3264 PyObject *pid = 0;
3265 int len;
3266 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003268 if (self->pers_func) {
3269 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3270 if (len < 2) return bad_readline();
3271
3272 pid = PyString_FromStringAndSize(s, len - 1);
3273 if (!pid) return -1;
3274
3275 if (PyList_Check(self->pers_func)) {
3276 if (PyList_Append(self->pers_func, pid) < 0) {
3277 Py_DECREF(pid);
3278 return -1;
3279 }
3280 }
3281 else {
3282 ARG_TUP(self, pid);
3283 if (self->arg) {
3284 pid = PyObject_Call(self->pers_func, self->arg,
3285 NULL);
3286 FREE_ARG_TUP(self);
3287 }
3288 }
3289
3290 if (! pid) return -1;
3291
3292 PDATA_PUSH(self->stack, pid, -1);
3293 return 0;
3294 }
3295 else {
3296 PyErr_SetString(UnpicklingError,
3297 "A load persistent id instruction was encountered,\n"
3298 "but no persistent_load function was specified.");
3299 return -1;
3300 }
3301}
3302
3303static int
3304load_binpersid(Unpicklerobject *self)
3305{
3306 PyObject *pid = 0;
3307
3308 if (self->pers_func) {
3309 PDATA_POP(self->stack, pid);
3310 if (! pid) return -1;
3311
3312 if (PyList_Check(self->pers_func)) {
3313 if (PyList_Append(self->pers_func, pid) < 0) {
3314 Py_DECREF(pid);
3315 return -1;
3316 }
3317 }
3318 else {
3319 ARG_TUP(self, pid);
3320 if (self->arg) {
3321 pid = PyObject_Call(self->pers_func, self->arg,
3322 NULL);
3323 FREE_ARG_TUP(self);
3324 }
3325 if (! pid) return -1;
3326 }
3327
3328 PDATA_PUSH(self->stack, pid, -1);
3329 return 0;
3330 }
3331 else {
3332 PyErr_SetString(UnpicklingError,
3333 "A load persistent id instruction was encountered,\n"
3334 "but no persistent_load function was specified.");
3335 return -1;
3336 }
3337}
3338
3339
3340static int
3341load_pop(Unpicklerobject *self)
3342{
3343 int len;
3344
3345 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3346
3347 /* Note that we split the (pickle.py) stack into two stacks,
3348 an object stack and a mark stack. We have to be clever and
3349 pop the right one. We do this by looking at the top of the
3350 mark stack.
3351 */
3352
3353 if ((self->num_marks > 0) &&
3354 (self->marks[self->num_marks - 1] == len))
3355 self->num_marks--;
3356 else {
3357 len--;
3358 Py_DECREF(self->stack->data[len]);
3359 self->stack->length=len;
3360 }
3361
3362 return 0;
3363}
3364
3365
3366static int
3367load_pop_mark(Unpicklerobject *self)
3368{
3369 int i;
3370
3371 if ((i = marker(self)) < 0)
3372 return -1;
3373
3374 Pdata_clear(self->stack, i);
3375
3376 return 0;
3377}
3378
3379
3380static int
3381load_dup(Unpicklerobject *self)
3382{
3383 PyObject *last;
3384 int len;
3385
3386 if ((len = self->stack->length) <= 0) return stackUnderflow();
3387 last=self->stack->data[len-1];
3388 Py_INCREF(last);
3389 PDATA_PUSH(self->stack, last, -1);
3390 return 0;
3391}
3392
3393
3394static int
3395load_get(Unpicklerobject *self)
3396{
3397 PyObject *py_str = 0, *value = 0;
3398 int len;
3399 char *s;
3400 int rc;
3401
3402 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003403 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003405 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003407 value = PyDict_GetItem(self->memo, py_str);
3408 if (! value) {
3409 PyErr_SetObject(BadPickleGet, py_str);
3410 rc = -1;
3411 } else {
3412 PDATA_APPEND(self->stack, value, -1);
3413 rc = 0;
3414 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003416 Py_DECREF(py_str);
3417 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003418}
3419
3420
3421static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003422load_binget(Unpicklerobject *self)
3423{
3424 PyObject *py_key = 0, *value = 0;
3425 unsigned char key;
3426 char *s;
3427 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003429 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003431 key = (unsigned char)s[0];
3432 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003434 value = PyDict_GetItem(self->memo, py_key);
3435 if (! value) {
3436 PyErr_SetObject(BadPickleGet, py_key);
3437 rc = -1;
3438 } else {
3439 PDATA_APPEND(self->stack, value, -1);
3440 rc = 0;
3441 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003443 Py_DECREF(py_key);
3444 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003445}
3446
3447
3448static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003449load_long_binget(Unpicklerobject *self)
3450{
3451 PyObject *py_key = 0, *value = 0;
3452 unsigned char c;
3453 char *s;
3454 long key;
3455 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003456
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003457 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003458
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003459 c = (unsigned char)s[0];
3460 key = (long)c;
3461 c = (unsigned char)s[1];
3462 key |= (long)c << 8;
3463 c = (unsigned char)s[2];
3464 key |= (long)c << 16;
3465 c = (unsigned char)s[3];
3466 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003468 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3469
3470 value = PyDict_GetItem(self->memo, py_key);
3471 if (! value) {
3472 PyErr_SetObject(BadPickleGet, py_key);
3473 rc = -1;
3474 } else {
3475 PDATA_APPEND(self->stack, value, -1);
3476 rc = 0;
3477 }
3478
3479 Py_DECREF(py_key);
3480 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003481}
3482
3483
3484static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003485load_put(Unpicklerobject *self)
3486{
3487 PyObject *py_str = 0, *value = 0;
3488 int len, l;
3489 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003491 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3492 if (l < 2) return bad_readline();
3493 if (!( len=self->stack->length )) return stackUnderflow();
3494 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3495 value=self->stack->data[len-1];
3496 l=PyDict_SetItem(self->memo, py_str, value);
3497 Py_DECREF(py_str);
3498 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003499}
3500
3501
3502static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003503load_binput(Unpicklerobject *self)
3504{
3505 PyObject *py_key = 0, *value = 0;
3506 unsigned char key;
3507 char *s;
3508 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003510 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3511 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003513 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003515 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3516 value=self->stack->data[len-1];
3517 len=PyDict_SetItem(self->memo, py_key, value);
3518 Py_DECREF(py_key);
3519 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003520}
3521
3522
3523static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003524load_long_binput(Unpicklerobject *self)
3525{
3526 PyObject *py_key = 0, *value = 0;
3527 long key;
3528 unsigned char c;
3529 char *s;
3530 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003532 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3533 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003535 c = (unsigned char)s[0];
3536 key = (long)c;
3537 c = (unsigned char)s[1];
3538 key |= (long)c << 8;
3539 c = (unsigned char)s[2];
3540 key |= (long)c << 16;
3541 c = (unsigned char)s[3];
3542 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003544 if (!( py_key = PyInt_FromLong(key))) return -1;
3545 value=self->stack->data[len-1];
3546 len=PyDict_SetItem(self->memo, py_key, value);
3547 Py_DECREF(py_key);
3548 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003549}
3550
3551
3552static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003553do_append(Unpicklerobject *self, int x)
3554{
3555 PyObject *value = 0, *list = 0, *append_method = 0;
3556 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003558 len=self->stack->length;
3559 if (!( len >= x && x > 0 )) return stackUnderflow();
3560 /* nothing to do */
3561 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003563 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003565 if (PyList_Check(list)) {
3566 PyObject *slice;
3567 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003569 slice=Pdata_popList(self->stack, x);
3570 list_len = PyList_GET_SIZE(list);
3571 i=PyList_SetSlice(list, list_len, list_len, slice);
3572 Py_DECREF(slice);
3573 return i;
3574 }
3575 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003577 if (!( append_method = PyObject_GetAttr(list, append_str)))
3578 return -1;
3579
3580 for (i = x; i < len; i++) {
3581 PyObject *junk;
3582
3583 value=self->stack->data[i];
3584 junk=0;
3585 ARG_TUP(self, value);
3586 if (self->arg) {
3587 junk = PyObject_Call(append_method, self->arg,
3588 NULL);
3589 FREE_ARG_TUP(self);
3590 }
3591 if (! junk) {
3592 Pdata_clear(self->stack, i+1);
3593 self->stack->length=x;
3594 Py_DECREF(append_method);
3595 return -1;
3596 }
3597 Py_DECREF(junk);
3598 }
3599 self->stack->length=x;
3600 Py_DECREF(append_method);
3601 }
3602
3603 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003604}
3605
3606
3607static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003608load_append(Unpicklerobject *self)
3609{
3610 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003611}
3612
3613
3614static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003615load_appends(Unpicklerobject *self)
3616{
3617 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003618}
3619
3620
3621static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003622do_setitems(Unpicklerobject *self, int x)
3623{
3624 PyObject *value = 0, *key = 0, *dict = 0;
3625 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003627 if (!( (len=self->stack->length) >= x
3628 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003630 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003632 for (i = x+1; i < len; i += 2) {
3633 key =self->stack->data[i-1];
3634 value=self->stack->data[i ];
3635 if (PyObject_SetItem(dict, key, value) < 0) {
3636 r=-1;
3637 break;
3638 }
3639 }
3640
3641 Pdata_clear(self->stack, x);
3642
3643 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003644}
3645
3646
Tim Peters84e87f32001-03-17 04:50:51 +00003647static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003648load_setitem(Unpicklerobject *self)
3649{
3650 return do_setitems(self, self->stack->length - 2);
3651}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003653static int
3654load_setitems(Unpicklerobject *self)
3655{
3656 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003657}
3658
Tim Peters84e87f32001-03-17 04:50:51 +00003659
Guido van Rossum60456fd1997-04-09 17:36:32 +00003660static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003661load_build(Unpicklerobject *self)
3662{
3663 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3664 *junk = 0, *__setstate__ = 0;
3665 int i, r = 0;
3666
3667 if (self->stack->length < 2) return stackUnderflow();
3668 PDATA_POP(self->stack, value);
3669 if (! value) return -1;
3670 inst=self->stack->data[self->stack->length-1];
3671
3672 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3673 ARG_TUP(self, value);
3674 if (self->arg) {
3675 junk = PyObject_Call(__setstate__, self->arg, NULL);
3676 FREE_ARG_TUP(self);
3677 }
3678 Py_DECREF(__setstate__);
3679 if (! junk) return -1;
3680 Py_DECREF(junk);
3681 return 0;
3682 }
3683
3684 PyErr_Clear();
3685 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3686 i = 0;
3687 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3688 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3689 r=-1;
3690 break;
3691 }
3692 }
3693 Py_DECREF(instdict);
3694 }
3695 else r=-1;
3696
3697 Py_XDECREF(value);
3698
3699 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003700}
3701
3702
3703static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003704load_mark(Unpicklerobject *self)
3705{
3706 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003708 /* Note that we split the (pickle.py) stack into two stacks, an
3709 object stack and a mark stack. Here we push a mark onto the
3710 mark stack.
3711 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003713 if ((self->num_marks + 1) >= self->marks_size) {
3714 s=self->marks_size+20;
3715 if (s <= self->num_marks) s=self->num_marks + 1;
3716 if (self->marks == NULL)
3717 self->marks=(int *)malloc(s * sizeof(int));
3718 else
3719 self->marks=(int *)realloc(self->marks,
3720 s * sizeof(int));
3721 if (! self->marks) {
3722 PyErr_NoMemory();
3723 return -1;
3724 }
3725 self->marks_size = s;
3726 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003728 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003730 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003731}
3732
Guido van Rossum60456fd1997-04-09 17:36:32 +00003733static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003734load_reduce(Unpicklerobject *self)
3735{
3736 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003738 PDATA_POP(self->stack, arg_tup);
3739 if (! arg_tup) return -1;
3740 PDATA_POP(self->stack, callable);
3741 if (callable) {
3742 ob = Instance_New(callable, arg_tup);
3743 Py_DECREF(callable);
3744 }
3745 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003747 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003749 PDATA_PUSH(self->stack, ob, -1);
3750 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003751}
Tim Peters84e87f32001-03-17 04:50:51 +00003752
Guido van Rossum60456fd1997-04-09 17:36:32 +00003753static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003754load(Unpicklerobject *self)
3755{
3756 PyObject *err = 0, *val = 0;
3757 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003759 self->num_marks = 0;
3760 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762 while (1) {
3763 if ((*self->read_func)(self, &s, 1) < 0)
3764 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003766 switch (s[0]) {
3767 case NONE:
3768 if (load_none(self) < 0)
3769 break;
3770 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003772 case BININT:
3773 if (load_binint(self) < 0)
3774 break;
3775 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003777 case BININT1:
3778 if (load_binint1(self) < 0)
3779 break;
3780 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003782 case BININT2:
3783 if (load_binint2(self) < 0)
3784 break;
3785 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003787 case INT:
3788 if (load_int(self) < 0)
3789 break;
3790 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003792 case LONG:
3793 if (load_long(self) < 0)
3794 break;
3795 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003797 case FLOAT:
3798 if (load_float(self) < 0)
3799 break;
3800 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003802 case BINFLOAT:
3803 if (load_binfloat(self) < 0)
3804 break;
3805 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003807 case BINSTRING:
3808 if (load_binstring(self) < 0)
3809 break;
3810 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003812 case SHORT_BINSTRING:
3813 if (load_short_binstring(self) < 0)
3814 break;
3815 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003817 case STRING:
3818 if (load_string(self) < 0)
3819 break;
3820 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003821
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003822#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003823 case UNICODE:
3824 if (load_unicode(self) < 0)
3825 break;
3826 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003828 case BINUNICODE:
3829 if (load_binunicode(self) < 0)
3830 break;
3831 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003832#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003834 case EMPTY_TUPLE:
3835 if (load_empty_tuple(self) < 0)
3836 break;
3837 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003839 case TUPLE:
3840 if (load_tuple(self) < 0)
3841 break;
3842 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003844 case EMPTY_LIST:
3845 if (load_empty_list(self) < 0)
3846 break;
3847 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003849 case LIST:
3850 if (load_list(self) < 0)
3851 break;
3852 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003854 case EMPTY_DICT:
3855 if (load_empty_dict(self) < 0)
3856 break;
3857 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003859 case DICT:
3860 if (load_dict(self) < 0)
3861 break;
3862 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003864 case OBJ:
3865 if (load_obj(self) < 0)
3866 break;
3867 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003869 case INST:
3870 if (load_inst(self) < 0)
3871 break;
3872 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003874 case GLOBAL:
3875 if (load_global(self) < 0)
3876 break;
3877 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003879 case APPEND:
3880 if (load_append(self) < 0)
3881 break;
3882 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003884 case APPENDS:
3885 if (load_appends(self) < 0)
3886 break;
3887 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003889 case BUILD:
3890 if (load_build(self) < 0)
3891 break;
3892 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003894 case DUP:
3895 if (load_dup(self) < 0)
3896 break;
3897 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003898
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003899 case BINGET:
3900 if (load_binget(self) < 0)
3901 break;
3902 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003904 case LONG_BINGET:
3905 if (load_long_binget(self) < 0)
3906 break;
3907 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003908
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003909 case GET:
3910 if (load_get(self) < 0)
3911 break;
3912 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003914 case MARK:
3915 if (load_mark(self) < 0)
3916 break;
3917 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003919 case BINPUT:
3920 if (load_binput(self) < 0)
3921 break;
3922 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003924 case LONG_BINPUT:
3925 if (load_long_binput(self) < 0)
3926 break;
3927 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003929 case PUT:
3930 if (load_put(self) < 0)
3931 break;
3932 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003934 case POP:
3935 if (load_pop(self) < 0)
3936 break;
3937 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003939 case POP_MARK:
3940 if (load_pop_mark(self) < 0)
3941 break;
3942 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003944 case SETITEM:
3945 if (load_setitem(self) < 0)
3946 break;
3947 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003949 case SETITEMS:
3950 if (load_setitems(self) < 0)
3951 break;
3952 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003954 case STOP:
3955 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003957 case PERSID:
3958 if (load_persid(self) < 0)
3959 break;
3960 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003962 case BINPERSID:
3963 if (load_binpersid(self) < 0)
3964 break;
3965 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003967 case REDUCE:
3968 if (load_reduce(self) < 0)
3969 break;
3970 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003971
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003972 case '\0':
3973 /* end of file */
3974 PyErr_SetNone(PyExc_EOFError);
3975 break;
Neil Schemenauerfa79c652002-03-22 23:02:53 +00003976
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003977 default:
3978 cPickle_ErrFormat(UnpicklingError,
3979 "invalid load key, '%s'.",
3980 "c", s[0]);
3981 return NULL;
3982 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003984 break;
3985 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003987 if ((err = PyErr_Occurred())) {
3988 if (err == PyExc_EOFError) {
3989 PyErr_SetNone(PyExc_EOFError);
3990 }
3991 return NULL;
3992 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003994 PDATA_POP(self->stack, val);
3995 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003996}
Tim Peters84e87f32001-03-17 04:50:51 +00003997
Guido van Rossum60456fd1997-04-09 17:36:32 +00003998
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003999/* No-load functions to support noload, which is used to
4000 find persistent references. */
4001
4002static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004003noload_obj(Unpicklerobject *self)
4004{
4005 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004007 if ((i = marker(self)) < 0) return -1;
4008 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004009}
4010
4011
4012static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004013noload_inst(Unpicklerobject *self)
4014{
4015 int i;
4016 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004018 if ((i = marker(self)) < 0) return -1;
4019 Pdata_clear(self->stack, i);
4020 if ((*self->readline_func)(self, &s) < 0) return -1;
4021 if ((*self->readline_func)(self, &s) < 0) return -1;
4022 PDATA_APPEND(self->stack, Py_None,-1);
4023 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004024}
4025
4026static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004027noload_global(Unpicklerobject *self)
4028{
4029 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004031 if ((*self->readline_func)(self, &s) < 0) return -1;
4032 if ((*self->readline_func)(self, &s) < 0) return -1;
4033 PDATA_APPEND(self->stack, Py_None,-1);
4034 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004035}
4036
4037static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004038noload_reduce(Unpicklerobject *self)
4039{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004040
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004041 if (self->stack->length < 2) return stackUnderflow();
4042 Pdata_clear(self->stack, self->stack->length-2);
4043 PDATA_APPEND(self->stack, Py_None,-1);
4044 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004045}
4046
4047static int
4048noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004049
Guido van Rossum053b8df1998-11-25 16:18:00 +00004050 if (self->stack->length < 1) return stackUnderflow();
4051 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004052 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004053}
4054
4055
4056static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004057noload(Unpicklerobject *self)
4058{
4059 PyObject *err = 0, *val = 0;
4060 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004062 self->num_marks = 0;
4063 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004065 while (1) {
4066 if ((*self->read_func)(self, &s, 1) < 0)
4067 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004069 switch (s[0]) {
4070 case NONE:
4071 if (load_none(self) < 0)
4072 break;
4073 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004075 case BININT:
4076 if (load_binint(self) < 0)
4077 break;
4078 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004080 case BININT1:
4081 if (load_binint1(self) < 0)
4082 break;
4083 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004085 case BININT2:
4086 if (load_binint2(self) < 0)
4087 break;
4088 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004089
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004090 case INT:
4091 if (load_int(self) < 0)
4092 break;
4093 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004095 case LONG:
4096 if (load_long(self) < 0)
4097 break;
4098 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004100 case FLOAT:
4101 if (load_float(self) < 0)
4102 break;
4103 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004105 case BINFLOAT:
4106 if (load_binfloat(self) < 0)
4107 break;
4108 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004110 case BINSTRING:
4111 if (load_binstring(self) < 0)
4112 break;
4113 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004115 case SHORT_BINSTRING:
4116 if (load_short_binstring(self) < 0)
4117 break;
4118 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004120 case STRING:
4121 if (load_string(self) < 0)
4122 break;
4123 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004124
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004125#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004126 case UNICODE:
4127 if (load_unicode(self) < 0)
4128 break;
4129 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004131 case BINUNICODE:
4132 if (load_binunicode(self) < 0)
4133 break;
4134 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004135#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004137 case EMPTY_TUPLE:
4138 if (load_empty_tuple(self) < 0)
4139 break;
4140 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004142 case TUPLE:
4143 if (load_tuple(self) < 0)
4144 break;
4145 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004147 case EMPTY_LIST:
4148 if (load_empty_list(self) < 0)
4149 break;
4150 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004152 case LIST:
4153 if (load_list(self) < 0)
4154 break;
4155 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004157 case EMPTY_DICT:
4158 if (load_empty_dict(self) < 0)
4159 break;
4160 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004162 case DICT:
4163 if (load_dict(self) < 0)
4164 break;
4165 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004167 case OBJ:
4168 if (noload_obj(self) < 0)
4169 break;
4170 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004172 case INST:
4173 if (noload_inst(self) < 0)
4174 break;
4175 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004177 case GLOBAL:
4178 if (noload_global(self) < 0)
4179 break;
4180 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004182 case APPEND:
4183 if (load_append(self) < 0)
4184 break;
4185 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004187 case APPENDS:
4188 if (load_appends(self) < 0)
4189 break;
4190 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004192 case BUILD:
4193 if (noload_build(self) < 0)
4194 break;
4195 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004197 case DUP:
4198 if (load_dup(self) < 0)
4199 break;
4200 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004202 case BINGET:
4203 if (load_binget(self) < 0)
4204 break;
4205 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004207 case LONG_BINGET:
4208 if (load_long_binget(self) < 0)
4209 break;
4210 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004212 case GET:
4213 if (load_get(self) < 0)
4214 break;
4215 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004217 case MARK:
4218 if (load_mark(self) < 0)
4219 break;
4220 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004222 case BINPUT:
4223 if (load_binput(self) < 0)
4224 break;
4225 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004226
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004227 case LONG_BINPUT:
4228 if (load_long_binput(self) < 0)
4229 break;
4230 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004232 case PUT:
4233 if (load_put(self) < 0)
4234 break;
4235 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004237 case POP:
4238 if (load_pop(self) < 0)
4239 break;
4240 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004242 case POP_MARK:
4243 if (load_pop_mark(self) < 0)
4244 break;
4245 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004247 case SETITEM:
4248 if (load_setitem(self) < 0)
4249 break;
4250 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004251
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004252 case SETITEMS:
4253 if (load_setitems(self) < 0)
4254 break;
4255 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004257 case STOP:
4258 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004260 case PERSID:
4261 if (load_persid(self) < 0)
4262 break;
4263 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004265 case BINPERSID:
4266 if (load_binpersid(self) < 0)
4267 break;
4268 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004270 case REDUCE:
4271 if (noload_reduce(self) < 0)
4272 break;
4273 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004275 default:
4276 cPickle_ErrFormat(UnpicklingError,
4277 "invalid load key, '%s'.",
4278 "c", s[0]);
4279 return NULL;
4280 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004282 break;
4283 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004285 if ((err = PyErr_Occurred())) {
4286 if (err == PyExc_EOFError) {
4287 PyErr_SetNone(PyExc_EOFError);
4288 }
4289 return NULL;
4290 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004292 PDATA_POP(self->stack, val);
4293 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004294}
Tim Peters84e87f32001-03-17 04:50:51 +00004295
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004296
Guido van Rossum60456fd1997-04-09 17:36:32 +00004297static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004298Unpickler_load(Unpicklerobject *self, PyObject *args)
4299{
4300 if (!( PyArg_ParseTuple(args, ":load")))
4301 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004303 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004304}
4305
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004306static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004307Unpickler_noload(Unpicklerobject *self, PyObject *args)
4308{
4309 if (!( PyArg_ParseTuple(args, ":noload")))
4310 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004312 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004313}
4314
Guido van Rossum60456fd1997-04-09 17:36:32 +00004315
4316static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004317 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004318 "load() -- Load a pickle"
4319 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004320 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004321 "noload() -- not load a pickle, but go through most of the motions\n"
4322 "\n"
4323 "This function can be used to read past a pickle without instantiating\n"
4324 "any objects or importing any modules. It can also be used to find all\n"
4325 "persistent references without instantiating any objects or importing\n"
4326 "any modules.\n"
4327 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004328 {NULL, NULL} /* sentinel */
4329};
4330
4331
4332static Unpicklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004333newUnpicklerobject(PyObject *f)
4334{
4335 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004337 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
4338 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004340 self->file = NULL;
4341 self->arg = NULL;
4342 self->stack = (Pdata*)Pdata_New();
4343 self->pers_func = NULL;
4344 self->last_string = NULL;
4345 self->marks = NULL;
4346 self->num_marks = 0;
4347 self->marks_size = 0;
4348 self->buf_size = 0;
4349 self->read = NULL;
4350 self->readline = NULL;
4351 self->safe_constructors = NULL;
4352 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004353
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004354 if (!( self->memo = PyDict_New()))
4355 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004357 Py_INCREF(f);
4358 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004359
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004360 /* Set read, readline based on type of f */
4361 if (PyFile_Check(f)) {
4362 self->fp = PyFile_AsFile(f);
4363 if (self->fp == NULL) {
4364 PyErr_SetString(PyExc_ValueError,
4365 "I/O operation on closed file");
4366 goto err;
4367 }
4368 self->read_func = read_file;
4369 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004370 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004371 else if (PycStringIO_InputCheck(f)) {
4372 self->fp = NULL;
4373 self->read_func = read_cStringIO;
4374 self->readline_func = readline_cStringIO;
4375 }
4376 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004377
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004378 self->fp = NULL;
4379 self->read_func = read_other;
4380 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004382 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4383 (self->read = PyObject_GetAttr(f, read_str)))) {
4384 PyErr_Clear();
4385 PyErr_SetString( PyExc_TypeError,
4386 "argument must have 'read' and "
4387 "'readline' attributes" );
4388 goto err;
4389 }
4390 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004392 if (PyEval_GetRestricted()) {
4393 /* Restricted execution, get private tables */
4394 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004396 if (!( m=PyImport_Import(copy_reg_str))) goto err;
4397 self->safe_constructors=PyObject_GetAttr(m,
4398 safe_constructors_str);
4399 Py_DECREF(m);
4400 if (!( self->safe_constructors )) goto err;
4401 }
4402 else {
4403 self->safe_constructors=safe_constructors;
4404 Py_INCREF(safe_constructors);
4405 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004407 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004409 err:
4410 Py_DECREF((PyObject *)self);
4411 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004412}
4413
4414
4415static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004416get_Unpickler(PyObject *self, PyObject *args)
4417{
4418 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004420 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
4421 return NULL;
4422 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004423}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004424
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004425
Guido van Rossum60456fd1997-04-09 17:36:32 +00004426static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004427Unpickler_dealloc(Unpicklerobject *self)
4428{
4429 Py_XDECREF(self->readline);
4430 Py_XDECREF(self->read);
4431 Py_XDECREF(self->file);
4432 Py_XDECREF(self->memo);
4433 Py_XDECREF(self->stack);
4434 Py_XDECREF(self->pers_func);
4435 Py_XDECREF(self->arg);
4436 Py_XDECREF(self->last_string);
4437 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004439 if (self->marks) {
4440 free(self->marks);
4441 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004443 if (self->buf_size) {
4444 free(self->buf);
4445 }
Tim Peters84e87f32001-03-17 04:50:51 +00004446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004447 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004448}
4449
4450
4451static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004452Unpickler_getattr(Unpicklerobject *self, char *name)
4453{
4454 if (!strcmp(name, "persistent_load")) {
4455 if (!self->pers_func) {
4456 PyErr_SetString(PyExc_AttributeError, name);
4457 return NULL;
4458 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004460 Py_INCREF(self->pers_func);
4461 return self->pers_func;
4462 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004464 if (!strcmp(name, "find_global")) {
4465 if (!self->find_class) {
4466 PyErr_SetString(PyExc_AttributeError, name);
4467 return NULL;
4468 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004470 Py_INCREF(self->find_class);
4471 return self->find_class;
4472 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004474 if (!strcmp(name, "memo")) {
4475 if (!self->memo) {
4476 PyErr_SetString(PyExc_AttributeError, name);
4477 return NULL;
4478 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004480 Py_INCREF(self->memo);
4481 return self->memo;
4482 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004484 if (!strcmp(name, "UnpicklingError")) {
4485 Py_INCREF(UnpicklingError);
4486 return UnpicklingError;
4487 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004489 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004490}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004491
Guido van Rossum60456fd1997-04-09 17:36:32 +00004492
4493static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004494Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
4495{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004497 if (!strcmp(name, "persistent_load")) {
4498 Py_XDECREF(self->pers_func);
4499 self->pers_func = value;
4500 Py_XINCREF(value);
4501 return 0;
4502 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004504 if (!strcmp(name, "find_global")) {
4505 Py_XDECREF(self->find_class);
4506 self->find_class = value;
4507 Py_XINCREF(value);
4508 return 0;
4509 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004511 if (! value) {
4512 PyErr_SetString(PyExc_TypeError,
4513 "attribute deletion is not supported");
4514 return -1;
4515 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004516
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004517 if (strcmp(name, "memo") == 0) {
4518 if (!PyDict_Check(value)) {
4519 PyErr_SetString(PyExc_TypeError,
4520 "memo must be a dictionary");
4521 return -1;
4522 }
4523 Py_XDECREF(self->memo);
4524 self->memo = value;
4525 Py_INCREF(value);
4526 return 0;
4527 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004529 PyErr_SetString(PyExc_AttributeError, name);
4530 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004531}
4532
4533
4534static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004535cpm_dump(PyObject *self, PyObject *args)
4536{
4537 PyObject *ob, *file, *res = NULL;
4538 Picklerobject *pickler = 0;
4539 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004541 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin)))
4542 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004544 if (!( pickler = newPicklerobject(file, bin)))
4545 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004546
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004547 if (dump(pickler, ob) < 0)
4548 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004550 Py_INCREF(Py_None);
4551 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004553 finally:
4554 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004556 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004557}
4558
4559
4560static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004561cpm_dumps(PyObject *self, PyObject *args)
4562{
4563 PyObject *ob, *file = 0, *res = NULL;
4564 Picklerobject *pickler = 0;
4565 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004567 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin)))
4568 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004570 if (!( file = PycStringIO->NewOutput(128)))
4571 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004573 if (!( pickler = newPicklerobject(file, bin)))
4574 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004576 if (dump(pickler, ob) < 0)
4577 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004579 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004581 finally:
4582 Py_XDECREF(pickler);
4583 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004585 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004586}
4587
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004588
4589static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004590cpm_load(PyObject *self, PyObject *args)
4591{
4592 Unpicklerobject *unpickler = 0;
4593 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004595 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
4596 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004598 if (!( unpickler = newUnpicklerobject(ob)))
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(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004606 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004607}
4608
4609
4610static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004611cpm_loads(PyObject *self, PyObject *args)
4612{
4613 PyObject *ob, *file = 0, *res = NULL;
4614 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004616 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
4617 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004619 if (!( file = PycStringIO->NewInput(ob)))
4620 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004622 if (!( unpickler = newUnpicklerobject(file)))
4623 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004625 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004627 finally:
4628 Py_XDECREF(file);
4629 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004631 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004632}
4633
4634
Tim Peters84e87f32001-03-17 04:50:51 +00004635static char Unpicklertype__doc__[] =
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004636"Objects that know how to unpickle";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004637
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004638static PyTypeObject Unpicklertype = {
4639 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004640 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004641 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004642 sizeof(Unpicklerobject), /*tp_basicsize*/
4643 0, /*tp_itemsize*/
4644 /* methods */
4645 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4646 (printfunc)0, /*tp_print*/
4647 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4648 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4649 (cmpfunc)0, /*tp_compare*/
4650 (reprfunc)0, /*tp_repr*/
4651 0, /*tp_as_number*/
4652 0, /*tp_as_sequence*/
4653 0, /*tp_as_mapping*/
4654 (hashfunc)0, /*tp_hash*/
4655 (ternaryfunc)0, /*tp_call*/
4656 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004657
Guido van Rossum60456fd1997-04-09 17:36:32 +00004658 /* Space for future expansion */
4659 0L,0L,0L,0L,
4660 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004661};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004662
Guido van Rossum60456fd1997-04-09 17:36:32 +00004663static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004664 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004665 "dump(object, file, [binary]) --"
4666 "Write an object in pickle format to the given file\n"
4667 "\n"
4668 "If the optional argument, binary, is provided and is true, then the\n"
4669 "pickle will be written in binary format, which is more space and\n"
4670 "computationally efficient. \n"
4671 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004672 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004673 "dumps(object, [binary]) --"
4674 "Return a string containing an object in pickle format\n"
4675 "\n"
4676 "If the optional argument, binary, is provided and is true, then the\n"
4677 "pickle will be written in binary format, which is more space and\n"
4678 "computationally efficient. \n"
4679 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004680 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004681 "load(file) -- Load a pickle from the given file"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004682 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004683 "loads(string) -- Load a pickle from the given string"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004684 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004685 "Pickler(file, [binary]) -- Create a pickler\n"
4686 "\n"
4687 "If the optional argument, binary, is provided and is true, then\n"
4688 "pickles will be written in binary format, which is more space and\n"
4689 "computationally efficient. \n"
4690 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004691 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004692 "Unpickler(file) -- Create an unpickler"},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004693 { NULL, NULL }
4694};
4695
Guido van Rossum60456fd1997-04-09 17:36:32 +00004696static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004697init_stuff(PyObject *module_dict)
4698{
4699 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004700
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004701#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004703 INIT_STR(__class__);
4704 INIT_STR(__getinitargs__);
4705 INIT_STR(__dict__);
4706 INIT_STR(__getstate__);
4707 INIT_STR(__setstate__);
4708 INIT_STR(__name__);
4709 INIT_STR(__main__);
4710 INIT_STR(__reduce__);
4711 INIT_STR(write);
4712 INIT_STR(__safe_for_unpickling__);
4713 INIT_STR(append);
4714 INIT_STR(read);
4715 INIT_STR(readline);
4716 INIT_STR(copy_reg);
4717 INIT_STR(dispatch_table);
4718 INIT_STR(safe_constructors);
4719 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004721 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
4722 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004724 /* These next few are special because we want to use different
4725 ones in restricted mode. */
4726 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
4727 if (!dispatch_table)
4728 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004730 if (!( safe_constructors = PyObject_GetAttr(copy_reg,
4731 safe_constructors_str)))
4732 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004734 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004736 /* Down to here ********************************** */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004738 if (!( empty_tuple = PyTuple_New(0)))
4739 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004741 /* Ugh */
4742 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4743 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4744 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004746 if (!( t=PyDict_New())) return -1;
4747 if (!( r=PyRun_String(
4748 "def __init__(self, *args): self.args=args\n\n"
4749 "def __str__(self):\n"
4750 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4751 Py_file_input,
4752 module_dict, t) )) return -1;
4753 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004755 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
4756 if (!PickleError)
4757 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004759 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004761 PicklingError = PyErr_NewException("cPickle.PicklingError",
4762 PickleError, NULL);
4763 if (!PicklingError)
4764 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004766 if (!( t=PyDict_New())) return -1;
4767 if (!( r=PyRun_String(
4768 "def __init__(self, *args): self.args=args\n\n"
4769 "def __str__(self):\n"
4770 " a=self.args\n"
4771 " a=a and type(a[0]) or '(what)'\n"
4772 " return 'Cannot pickle %s objects' % a\n"
4773 , Py_file_input,
4774 module_dict, t) )) return -1;
4775 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004777 if (!( UnpickleableError = PyErr_NewException(
4778 "cPickle.UnpickleableError", PicklingError, t)))
4779 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004781 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004783 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
4784 PickleError, NULL)))
4785 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004787 if (PyDict_SetItemString(module_dict, "PickleError",
4788 PickleError) < 0)
4789 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004791 if (PyDict_SetItemString(module_dict, "PicklingError",
4792 PicklingError) < 0)
4793 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004795 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4796 UnpicklingError) < 0)
4797 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004799 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4800 UnpickleableError) < 0)
4801 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004803 if (!( BadPickleGet = PyString_FromString("cPickle.BadPickleGet")))
4804 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004806 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4807 BadPickleGet) < 0)
4808 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004810 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004812 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004813}
4814
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004815#ifndef DL_EXPORT /* declarations for DLL import/export */
4816#define DL_EXPORT(RTYPE) RTYPE
4817#endif
Guido van Rossum50f385c1998-12-04 18:48:44 +00004818DL_EXPORT(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004819initcPickle(void)
4820{
4821 PyObject *m, *d, *di, *v, *k;
4822 int i;
4823 char *rev="1.71";
4824 PyObject *format_version;
4825 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004827 Picklertype.ob_type = &PyType_Type;
4828 Picklertype.tp_getattro = PyObject_GenericGetAttr;
4829 Picklertype.tp_setattro = PyObject_GenericSetAttr;
4830 Unpicklertype.ob_type = &PyType_Type;
4831 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004833 /* Initialize some pieces. We need to do this before module creation,
4834 so we're forced to use a temporary dictionary. :(
4835 */
4836 di=PyDict_New();
4837 if (!di) return;
4838 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004840 /* Create the module and add the functions */
4841 m = Py_InitModule4("cPickle", cPickle_methods,
4842 cPickle_module_documentation,
4843 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004845 /* Add some symbolic constants to the module */
4846 d = PyModule_GetDict(m);
4847 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4848 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004850 /* Copy data from di. Waaa. */
4851 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4852 if (PyObject_SetItem(d, k, v) < 0) {
4853 Py_DECREF(di);
4854 return;
4855 }
4856 }
4857 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004859 format_version = PyString_FromString("1.3");
4860 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004862 PyDict_SetItemString(d, "format_version", format_version);
4863 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4864 Py_XDECREF(format_version);
4865 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004866}