blob: 8ba423ed7e1598782201d6e829d00f2b14cbe8be [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';
Tim Peters5de98422002-04-27 18:44:32 +00001255 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001256 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001257}
1258
1259
Guido van Rossum60456fd1997-04-09 17:36:32 +00001260static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001261save_unicode(Picklerobject *self, PyObject *args, int doput)
1262{
1263 int size, len;
1264 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001265
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001266 if (!PyUnicode_Check(args))
1267 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001269 if (!self->bin) {
1270 char *repr_str;
1271 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001273 repr = modified_EncodeRawUnicodeEscape(
1274 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
1275 if (!repr)
1276 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001278 if ((len = PyString_Size(repr)) < 0)
1279 goto err;
1280 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001282 if ((*self->write_func)(self, &string, 1) < 0)
1283 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001285 if ((*self->write_func)(self, repr_str, len) < 0)
1286 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001288 if ((*self->write_func)(self, "\n", 1) < 0)
1289 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001291 Py_XDECREF(repr);
1292 }
1293 else {
1294 int i;
1295 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001297 if (!( repr = PyUnicode_AsUTF8String(args)))
1298 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300 if ((size = PyString_Size(repr)) < 0)
1301 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001303 c_str[0] = BINUNICODE;
1304 for (i = 1; i < 5; i++)
1305 c_str[i] = (int)(size >> ((i - 1) * 8));
1306 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001308 if ((*self->write_func)(self, c_str, len) < 0)
1309 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001311 if (size > 128 && Pdata_Check(self->file)) {
1312 if (write_other(self, NULL, 0) < 0)
1313 goto err;
1314 PDATA_APPEND(self->file, repr, -1);
1315 }
1316 else {
1317 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1318 size) < 0)
1319 goto err;
1320 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001322 Py_DECREF(repr);
1323 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001325 if (doput)
1326 if (put(self, args) < 0)
1327 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001329 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001331 err:
1332 Py_XDECREF(repr);
1333 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001334}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001335#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001336
1337
1338static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001339save_tuple(Picklerobject *self, PyObject *args)
1340{
1341 PyObject *element = 0, *py_tuple_id = 0;
1342 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001344 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001346 if ((*self->write_func)(self, &MARKv, 1) < 0)
1347 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001349 if ((len = PyTuple_Size(args)) < 0)
1350 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001352 for (i = 0; i < len; i++) {
1353 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
1354 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001355
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001356 if (save(self, element, 0) < 0)
1357 goto finally;
1358 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001359
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001360 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
1361 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001363 if (len) {
1364 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1365 if (self->bin) {
1366 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001368 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1369 goto finally;
1370 }
1371 else {
1372 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001374 for (i = 0; i <= len; i++) {
1375 if ((*self->write_func)(self, &pop, 1) < 0)
1376 goto finally;
1377 }
1378 }
Tim Peters84e87f32001-03-17 04:50:51 +00001379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001380 if (get(self, py_tuple_id) < 0)
1381 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001383 res = 0;
1384 goto finally;
1385 }
1386 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001387
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001388 if ((*self->write_func)(self, &tuple, 1) < 0) {
1389 goto finally;
1390 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001392 if (put(self, args) < 0)
1393 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001395 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001397 finally:
1398 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001400 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001401}
1402
1403static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001404save_empty_tuple(Picklerobject *self, PyObject *args)
1405{
1406 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001408 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001409}
1410
1411
1412static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001413save_list(Picklerobject *self, PyObject *args)
1414{
1415 PyObject *element = 0;
1416 int s_len, len, i, using_appends, res = -1;
1417 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001419 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001421 if (self->fast && !fast_save_enter(self, args))
1422 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001424 if (self->bin) {
1425 s[0] = EMPTY_LIST;
1426 s_len = 1;
1427 }
1428 else {
1429 s[0] = MARK;
1430 s[1] = LIST;
1431 s_len = 2;
1432 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001434 if ((len = PyList_Size(args)) < 0)
1435 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001437 if ((*self->write_func)(self, s, s_len) < 0)
1438 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001440 if (len == 0) {
1441 if (put(self, args) < 0)
1442 goto finally;
1443 }
1444 else {
1445 if (put2(self, args) < 0)
1446 goto finally;
1447 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001449 if ((using_appends = (self->bin && (len > 1))))
1450 if ((*self->write_func)(self, &MARKv, 1) < 0)
1451 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001453 for (i = 0; i < len; i++) {
1454 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
1455 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001456
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001457 if (save(self, element, 0) < 0)
1458 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001460 if (!using_appends) {
1461 if ((*self->write_func)(self, &append, 1) < 0)
1462 goto finally;
1463 }
1464 }
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, &appends, 1) < 0)
1468 goto finally;
1469 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001471 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001473 finally:
1474 if (self->fast && !fast_save_leave(self, args))
1475 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001477 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001478}
1479
1480
Guido van Rossum60456fd1997-04-09 17:36:32 +00001481static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001482save_dict(Picklerobject *self, PyObject *args)
1483{
1484 PyObject *key = 0, *value = 0;
1485 int i, len, res = -1, using_setitems;
1486 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001488 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001490 if (self->fast && !fast_save_enter(self, args))
1491 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001493 if (self->bin) {
1494 s[0] = EMPTY_DICT;
1495 len = 1;
1496 }
1497 else {
1498 s[0] = MARK;
1499 s[1] = DICT;
1500 len = 2;
1501 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001503 if ((*self->write_func)(self, s, len) < 0)
1504 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001506 if ((len = PyDict_Size(args)) < 0)
1507 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001509 if (len == 0) {
1510 if (put(self, args) < 0)
1511 goto finally;
1512 }
1513 else {
1514 if (put2(self, args) < 0)
1515 goto finally;
1516 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001518 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1519 if ((*self->write_func)(self, &MARKv, 1) < 0)
1520 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001522 i = 0;
1523 while (PyDict_Next(args, &i, &key, &value)) {
1524 if (save(self, key, 0) < 0)
1525 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001527 if (save(self, value, 0) < 0)
1528 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001530 if (!using_setitems) {
1531 if ((*self->write_func)(self, &setitem, 1) < 0)
1532 goto finally;
1533 }
1534 }
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, &setitems, 1) < 0)
1538 goto finally;
1539 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001541 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001543 finally:
1544 if (self->fast && !fast_save_leave(self, args))
1545 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001546
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001547 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001548}
1549
1550
Tim Peters84e87f32001-03-17 04:50:51 +00001551static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001552save_inst(Picklerobject *self, PyObject *args)
1553{
1554 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1555 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1556 char *module_str, *name_str;
1557 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001559 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001561 if (self->fast && !fast_save_enter(self, args))
1562 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001564 if ((*self->write_func)(self, &MARKv, 1) < 0)
1565 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001567 if (!( class = PyObject_GetAttr(args, __class___str)))
1568 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001570 if (self->bin) {
1571 if (save(self, class, 0) < 0)
1572 goto finally;
1573 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001575 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1576 PyObject *element = 0;
1577 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001579 if (!( class_args =
1580 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
1581 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001583 if ((len = PyObject_Size(class_args)) < 0)
1584 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001586 for (i = 0; i < len; i++) {
1587 if (!( element = PySequence_GetItem(class_args, i)))
1588 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001589
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001590 if (save(self, element, 0) < 0) {
1591 Py_DECREF(element);
1592 goto finally;
1593 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001595 Py_DECREF(element);
1596 }
1597 }
1598 else {
1599 PyErr_Clear();
1600 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001602 if (!self->bin) {
1603 if (!( name = ((PyClassObject *)class)->cl_name )) {
1604 PyErr_SetString(PicklingError, "class has no name");
1605 goto finally;
1606 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001608 if (!( module = whichmodule(class, name)))
1609 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001610
Tim Peters84e87f32001-03-17 04:50:51 +00001611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001612 if ((module_size = PyString_Size(module)) < 0 ||
1613 (name_size = PyString_Size(name)) < 0)
1614 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001616 module_str = PyString_AS_STRING((PyStringObject *)module);
1617 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001619 if ((*self->write_func)(self, &inst, 1) < 0)
1620 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001622 if ((*self->write_func)(self, module_str, module_size) < 0)
1623 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001625 if ((*self->write_func)(self, "\n", 1) < 0)
1626 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001628 if ((*self->write_func)(self, name_str, name_size) < 0)
1629 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001631 if ((*self->write_func)(self, "\n", 1) < 0)
1632 goto finally;
1633 }
1634 else if ((*self->write_func)(self, &obj, 1) < 0) {
1635 goto finally;
1636 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001637
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001638 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1639 state = PyObject_Call(getstate_func, empty_tuple, NULL);
1640 if (!state)
1641 goto finally;
1642 }
1643 else {
1644 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001646 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1647 PyErr_Clear();
1648 res = 0;
1649 goto finally;
1650 }
1651 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001653 if (!PyDict_Check(state)) {
1654 if (put2(self, args) < 0)
1655 goto finally;
1656 }
1657 else {
1658 if (put(self, args) < 0)
1659 goto finally;
1660 }
Tim Peters84e87f32001-03-17 04:50:51 +00001661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001662 if (save(self, state, 0) < 0)
1663 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001665 if ((*self->write_func)(self, &build, 1) < 0)
1666 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001668 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001670 finally:
1671 if (self->fast && !fast_save_leave(self, args))
1672 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001674 Py_XDECREF(module);
1675 Py_XDECREF(class);
1676 Py_XDECREF(state);
1677 Py_XDECREF(getinitargs_func);
1678 Py_XDECREF(getstate_func);
1679 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001681 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001682}
1683
1684
Guido van Rossum60456fd1997-04-09 17:36:32 +00001685static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001686save_global(Picklerobject *self, PyObject *args, PyObject *name)
1687{
1688 PyObject *global_name = 0, *module = 0, *mod = 0, *moddict = 0, *klass = 0;
1689 char *name_str, *module_str;
1690 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001692 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001694 if (name) {
1695 global_name = name;
1696 Py_INCREF(global_name);
1697 }
1698 else {
1699 if (!( global_name = PyObject_GetAttr(args, __name___str)))
1700 goto finally;
1701 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001703 if (!( module = whichmodule(args, global_name)))
1704 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001706 if ((module_size = PyString_Size(module)) < 0 ||
1707 (name_size = PyString_Size(global_name)) < 0)
1708 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001710 module_str = PyString_AS_STRING((PyStringObject *)module);
1711 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001713 mod = PyImport_ImportModule(module_str);
1714 if (mod == NULL) {
1715 /* Py_ErrClear(); ?? */
1716 cPickle_ErrFormat(PicklingError,
1717 "Can't pickle %s: it's not found as %s.%s",
1718 "OSS", args, module, global_name);
1719 goto finally;
1720 }
1721 /* borrowed ref */
1722 moddict = PyModule_GetDict(mod);
1723 /* borrowed ref */
1724 klass = PyDict_GetItemString(moddict, name_str);
1725 if (klass == NULL) {
1726 cPickle_ErrFormat(PicklingError,
1727 "Can't pickle %s: it's not found as %s.%s",
1728 "OSS", args, module, global_name);
1729 goto finally;
1730 }
1731 if (klass != args) {
1732 cPickle_ErrFormat(PicklingError,
1733 "Can't pickle %s: it's not the same object as %s.%s",
1734 "OSS", args, module, global_name);
1735 goto finally;
1736 }
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001738 if ((*self->write_func)(self, &global, 1) < 0)
1739 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001741 if ((*self->write_func)(self, module_str, module_size) < 0)
1742 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001743
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001744 if ((*self->write_func)(self, "\n", 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, name_str, name_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 (put(self, args) < 0)
1754 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001756 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001758 finally:
1759 Py_XDECREF(module);
1760 Py_XDECREF(global_name);
1761 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001763 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001764}
1765
Guido van Rossum60456fd1997-04-09 17:36:32 +00001766static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001767save_pers(Picklerobject *self, PyObject *args, PyObject *f)
1768{
1769 PyObject *pid = 0;
1770 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001772 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001774 Py_INCREF(args);
1775 ARG_TUP(self, args);
1776 if (self->arg) {
1777 pid = PyObject_Call(f, self->arg, NULL);
1778 FREE_ARG_TUP(self);
1779 }
1780 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001782 if (pid != Py_None) {
1783 if (!self->bin) {
1784 if (!PyString_Check(pid)) {
1785 PyErr_SetString(PicklingError,
1786 "persistent id must be string");
1787 goto finally;
1788 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001789
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001790 if ((*self->write_func)(self, &persid, 1) < 0)
1791 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001793 if ((size = PyString_Size(pid)) < 0)
1794 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001796 if ((*self->write_func)(self,
1797 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1798 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001800 if ((*self->write_func)(self, "\n", 1) < 0)
1801 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001803 res = 1;
1804 goto finally;
1805 }
1806 else if (save(self, pid, 1) >= 0) {
1807 if ((*self->write_func)(self, &binpersid, 1) < 0)
1808 res = -1;
1809 else
1810 res = 1;
1811 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001813 goto finally;
1814 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001816 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001818 finally:
1819 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001821 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001822}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001823
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001824
Tim Peters84e87f32001-03-17 04:50:51 +00001825static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001826save_reduce(Picklerobject *self, PyObject *callable,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001827 PyObject *tup, PyObject *state, PyObject *ob)
1828{
1829 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001831 if (save(self, callable, 0) < 0)
1832 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001834 if (save(self, tup, 0) < 0)
1835 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001837 if ((*self->write_func)(self, &reduce, 1) < 0)
1838 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001840 if (ob != NULL) {
1841 if (state && !PyDict_Check(state)) {
1842 if (put2(self, ob) < 0)
1843 return -1;
1844 }
1845 else {
1846 if (put(self, ob) < 0)
1847 return -1;
1848 }
1849 }
Tim Peters84e87f32001-03-17 04:50:51 +00001850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001851 if (state) {
1852 if (save(self, state, 0) < 0)
1853 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001855 if ((*self->write_func)(self, &build, 1) < 0)
1856 return -1;
1857 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001859 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001860}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001861
Guido van Rossum60456fd1997-04-09 17:36:32 +00001862static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001863save(Picklerobject *self, PyObject *args, int pers_save)
1864{
1865 PyTypeObject *type;
1866 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1867 *callable = 0, *state = 0;
1868 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001870 if (!pers_save && self->pers_func) {
1871 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1872 res = tmp;
1873 goto finally;
1874 }
1875 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001877 if (args == Py_None) {
1878 res = save_none(self, args);
1879 goto finally;
1880 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001882 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001884 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001885 case 'b':
1886 if (args == Py_False || args == Py_True) {
1887 res = save_bool(self, args);
1888 goto finally;
1889 }
1890 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001891 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001892 if (type == &PyInt_Type) {
1893 res = save_int(self, args);
1894 goto finally;
1895 }
1896 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001897
Guido van Rossum60456fd1997-04-09 17:36:32 +00001898 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001899 if (type == &PyLong_Type) {
1900 res = save_long(self, args);
1901 goto finally;
1902 }
1903 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001904
Guido van Rossum60456fd1997-04-09 17:36:32 +00001905 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001906 if (type == &PyFloat_Type) {
1907 res = save_float(self, args);
1908 goto finally;
1909 }
1910 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001911
Guido van Rossum60456fd1997-04-09 17:36:32 +00001912 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001913 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
1914 if (self->bin) res = save_empty_tuple(self, args);
1915 else res = save_tuple(self, args);
1916 goto finally;
1917 }
1918 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001919
Guido van Rossum60456fd1997-04-09 17:36:32 +00001920 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001921 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
1922 res = save_string(self, args, 0);
1923 goto finally;
1924 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001925
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001926#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001927 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001928 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1929 res = save_unicode(self, args, 0);
1930 goto finally;
1931 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001932#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001933 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001935 if (args->ob_refcnt > 1) {
1936 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
1937 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001939 if (PyDict_GetItem(self->memo, py_ob_id)) {
1940 if (get(self, py_ob_id) < 0)
1941 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001943 res = 0;
1944 goto finally;
1945 }
1946 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001948 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001949 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001950 if (type == &PyString_Type) {
1951 res = save_string(self, args, 1);
1952 goto finally;
1953 }
1954 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001955
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001956#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001957 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001958 if (type == &PyUnicode_Type) {
1959 res = save_unicode(self, args, 1);
1960 goto finally;
1961 }
1962 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001963#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001964
Guido van Rossum60456fd1997-04-09 17:36:32 +00001965 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001966 if (type == &PyTuple_Type) {
1967 res = save_tuple(self, args);
1968 goto finally;
1969 }
1970 if (type == &PyType_Type) {
1971 res = save_global(self, args, NULL);
1972 goto finally;
1973 }
1974 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001975
Guido van Rossum60456fd1997-04-09 17:36:32 +00001976 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001977 if (type == &PyList_Type) {
1978 res = save_list(self, args);
1979 goto finally;
1980 }
1981 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001982
1983 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001984 if (type == &PyDict_Type) {
1985 res = save_dict(self, args);
1986 goto finally;
1987 }
1988 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001989
1990 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001991 if (type == &PyInstance_Type) {
1992 res = save_inst(self, args);
1993 goto finally;
1994 }
1995 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001996
1997 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001998 if (type == &PyClass_Type) {
1999 res = save_global(self, args, NULL);
2000 goto finally;
2001 }
2002 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002003
2004 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002005 if (type == &PyFunction_Type) {
2006 res = save_global(self, args, NULL);
2007 goto finally;
2008 }
2009 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002010
2011 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002012 if (type == &PyCFunction_Type) {
2013 res = save_global(self, args, NULL);
2014 goto finally;
2015 }
2016 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002018 if (PyType_IsSubtype(type, &PyType_Type)) {
2019 res = save_global(self, args, NULL);
2020 goto finally;
2021 }
Guido van Rossum950dce62001-12-19 16:56:54 +00002022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002023 if (!pers_save && self->inst_pers_func) {
2024 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2025 res = tmp;
2026 goto finally;
2027 }
2028 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002030 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2031 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002033 Py_INCREF(args);
2034 ARG_TUP(self, args);
2035 if (self->arg) {
2036 t = PyObject_Call(__reduce__, self->arg, NULL);
2037 FREE_ARG_TUP(self);
2038 }
2039 if (! t) goto finally;
2040 }
2041 else {
2042 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002044 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2045 t = PyObject_Call(__reduce__, empty_tuple, NULL);
2046 if (!t)
2047 goto finally;
2048 }
2049 else {
2050 PyErr_Clear();
2051 }
2052 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002054 if (t) {
2055 if (PyString_Check(t)) {
2056 res = save_global(self, args, t);
2057 goto finally;
2058 }
Tim Peters84e87f32001-03-17 04:50:51 +00002059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002060 if (!PyTuple_Check(t)) {
2061 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2062 "be a tuple", "O", __reduce__);
2063 goto finally;
2064 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002066 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002068 if ((size != 3) && (size != 2)) {
2069 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2070 "contain only two or three elements", "O", __reduce__);
2071 goto finally;
2072 }
Tim Peters84e87f32001-03-17 04:50:51 +00002073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002074 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002076 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002078 if (size > 2) {
2079 state = PyTuple_GET_ITEM(t, 2);
2080 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002082 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2083 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2084 "returned by %s must be a tuple", "O", __reduce__);
2085 goto finally;
2086 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002088 res = save_reduce(self, callable, arg_tup, state, args);
2089 goto finally;
2090 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002092 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002094 finally:
2095 Py_XDECREF(py_ob_id);
2096 Py_XDECREF(__reduce__);
2097 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002099 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002100}
2101
2102
2103static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002104dump(Picklerobject *self, PyObject *args)
2105{
2106 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002108 if (save(self, args, 0) < 0)
2109 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002111 if ((*self->write_func)(self, &stop, 1) < 0)
2112 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002114 if ((*self->write_func)(self, NULL, 0) < 0)
2115 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002117 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002118}
2119
2120static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002121Pickle_clear_memo(Picklerobject *self, PyObject *args)
2122{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002123 if (self->memo)
2124 PyDict_Clear(self->memo);
2125 Py_INCREF(Py_None);
2126 return Py_None;
2127}
2128
2129static PyObject *
2130Pickle_getvalue(Picklerobject *self, PyObject *args)
2131{
2132 int l, i, rsize, ssize, clear=1, lm;
2133 long ik;
2134 PyObject *k, *r;
2135 char *s, *p, *have_get;
2136 Pdata *data;
2137
2138 /* Can be called by Python code or C code */
2139 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2140 return NULL;
2141
2142 /* Check to make sure we are based on a list */
2143 if (! Pdata_Check(self->file)) {
2144 PyErr_SetString(PicklingError,
2145 "Attempt to getvalue() a non-list-based pickler");
2146 return NULL;
2147 }
2148
2149 /* flush write buffer */
2150 if (write_other(self, NULL, 0) < 0) return NULL;
2151
2152 data=(Pdata*)self->file;
2153 l=data->length;
2154
2155 /* set up an array to hold get/put status */
2156 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2157 lm++;
2158 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2159 memset(have_get,0,lm);
2160
2161 /* Scan for gets. */
2162 for (rsize=0, i=l; --i >= 0; ) {
2163 k=data->data[i];
2164
2165 if (PyString_Check(k)) {
2166 rsize += PyString_GET_SIZE(k);
2167 }
2168
2169 else if (PyInt_Check(k)) { /* put */
2170 ik=PyInt_AS_LONG((PyIntObject*)k);
2171 if (ik >= lm || ik==0) {
2172 PyErr_SetString(PicklingError,
2173 "Invalid get data");
2174 return NULL;
2175 }
2176 if (have_get[ik]) { /* with matching get */
2177 if (ik < 256) rsize += 2;
2178 else rsize+=5;
2179 }
2180 }
2181
2182 else if (! (PyTuple_Check(k) &&
2183 PyTuple_GET_SIZE(k) == 2 &&
2184 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2185 ) {
2186 PyErr_SetString(PicklingError,
2187 "Unexpected data in internal list");
2188 return NULL;
2189 }
2190
2191 else { /* put */
2192 ik=PyInt_AS_LONG((PyIntObject*)k);
2193 if (ik >= lm || ik==0) {
2194 PyErr_SetString(PicklingError,
2195 "Invalid get data");
2196 return NULL;
2197 }
2198 have_get[ik]=1;
2199 if (ik < 256) rsize += 2;
2200 else rsize+=5;
2201 }
2202
2203 }
2204
2205 /* Now generate the result */
2206 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2207 s=PyString_AS_STRING((PyStringObject*)r);
2208
2209 for (i=0; i<l; i++) {
2210 k=data->data[i];
2211
2212 if (PyString_Check(k)) {
2213 ssize=PyString_GET_SIZE(k);
2214 if (ssize) {
2215 p=PyString_AS_STRING((PyStringObject*)k);
2216 while (--ssize >= 0) *s++=*p++;
2217 }
2218 }
2219
2220 else if (PyTuple_Check(k)) { /* get */
2221 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2222 if (ik < 256) {
2223 *s++ = BINGET;
2224 *s++ = (int)(ik & 0xff);
2225 }
2226 else {
2227 *s++ = LONG_BINGET;
2228 *s++ = (int)(ik & 0xff);
2229 *s++ = (int)((ik >> 8) & 0xff);
2230 *s++ = (int)((ik >> 16) & 0xff);
2231 *s++ = (int)((ik >> 24) & 0xff);
2232 }
2233 }
2234
2235 else { /* put */
2236 ik=PyInt_AS_LONG((PyIntObject*)k);
2237
2238 if (have_get[ik]) { /* with matching get */
2239 if (ik < 256) {
2240 *s++ = BINPUT;
2241 *s++ = (int)(ik & 0xff);
2242 }
2243 else {
2244 *s++ = LONG_BINPUT;
2245 *s++ = (int)(ik & 0xff);
2246 *s++ = (int)((ik >> 8) & 0xff);
2247 *s++ = (int)((ik >> 16) & 0xff);
2248 *s++ = (int)((ik >> 24) & 0xff);
2249 }
2250 }
2251 }
2252
2253 }
2254
2255 if (clear) {
2256 PyDict_Clear(self->memo);
2257 Pdata_clear(data,0);
2258 }
2259
2260 free(have_get);
2261 return r;
2262 err:
2263 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002264 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002265}
2266
2267static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002268Pickler_dump(Picklerobject *self, PyObject *args)
2269{
2270 PyObject *ob;
2271 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002273 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
2274 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002275
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002276 if (dump(self, ob) < 0)
2277 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002279 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002281 /* XXX Why does dump() return self? */
2282 Py_INCREF(self);
2283 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002284}
2285
2286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002287static struct PyMethodDef Pickler_methods[] =
2288{
Neal Norwitzb0493252002-03-31 14:44:22 +00002289 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002290 "dump(object) --"
Fred Drake0ebacc82002-05-01 20:36:39 +00002291 "Write an object in pickle format to the object's pickle stream"},
2292 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002293 "clear_memo() -- Clear the picklers memo"},
Neal Norwitzb0493252002-03-31 14:44:22 +00002294 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Guido van Rossum053b8df1998-11-25 16:18:00 +00002295 "getvalue() -- Finish picking a list-based pickle"},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002296 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002297};
2298
2299
2300static Picklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002301newPicklerobject(PyObject *file, int bin)
2302{
2303 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002305 if (!( self = PyObject_New(Picklerobject, &Picklertype)))
2306 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002308 self->fp = NULL;
2309 self->write = NULL;
2310 self->memo = NULL;
2311 self->arg = NULL;
2312 self->pers_func = NULL;
2313 self->inst_pers_func = NULL;
2314 self->write_buf = NULL;
2315 self->bin = bin;
2316 self->fast = 0;
2317 self->fast_container = 0;
2318 self->fast_memo = NULL;
2319 self->buf_size = 0;
2320 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002322 if (file)
2323 Py_INCREF(file);
2324 else
2325 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002327 if (!( self->file = file ))
2328 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002330 if (!( self->memo = PyDict_New()))
2331 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002333 if (PyFile_Check(file)) {
2334 self->fp = PyFile_AsFile(file);
2335 if (self->fp == NULL) {
2336 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2337 goto err;
2338 }
2339 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002340 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002341 else if (PycStringIO_OutputCheck(file)) {
2342 self->write_func = write_cStringIO;
2343 }
2344 else if (file == Py_None) {
2345 self->write_func = write_none;
2346 }
2347 else {
2348 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002350 if (! Pdata_Check(file)) {
2351 self->write = PyObject_GetAttr(file, write_str);
2352 if (!self->write) {
2353 PyErr_Clear();
2354 PyErr_SetString(PyExc_TypeError,
2355 "argument must have 'write' "
2356 "attribute");
2357 goto err;
2358 }
2359 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002361 if (!( self->write_buf =
2362 (char *)malloc(WRITE_BUF_SIZE * sizeof(char)))) {
2363 PyErr_NoMemory();
2364 goto err;
2365 }
2366 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002368 if (PyEval_GetRestricted()) {
2369 /* Restricted execution, get private tables */
2370 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002372 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2373 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2374 Py_DECREF(m);
2375 if (!( self->dispatch_table )) goto err;
2376 }
2377 else {
2378 self->dispatch_table=dispatch_table;
2379 Py_INCREF(dispatch_table);
2380 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002382 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002384 err:
2385 Py_DECREF((PyObject *)self);
2386 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002387}
2388
2389
2390static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002391get_Pickler(PyObject *self, PyObject *args)
2392{
2393 PyObject *file = NULL;
2394 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002396 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
2397 PyErr_Clear();
2398 bin = 0;
2399 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2400 return NULL;
2401 }
2402 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002403}
2404
2405
2406static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002407Pickler_dealloc(Picklerobject *self)
2408{
2409 Py_XDECREF(self->write);
2410 Py_XDECREF(self->memo);
2411 Py_XDECREF(self->fast_memo);
2412 Py_XDECREF(self->arg);
2413 Py_XDECREF(self->file);
2414 Py_XDECREF(self->pers_func);
2415 Py_XDECREF(self->inst_pers_func);
2416 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002418 if (self->write_buf) {
2419 free(self->write_buf);
2420 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002422 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002423}
2424
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002425static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002426Pickler_get_pers_func(Picklerobject *p)
2427{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002428 if (p->pers_func == NULL)
2429 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2430 else
2431 Py_INCREF(p->pers_func);
2432 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002433}
2434
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002435static int
2436Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2437{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002438 if (v == NULL) {
2439 PyErr_SetString(PyExc_TypeError,
2440 "attribute deletion is not supported");
2441 return -1;
2442 }
2443 Py_XDECREF(p->pers_func);
2444 Py_INCREF(v);
2445 p->pers_func = v;
2446 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002447}
2448
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002449static int
2450Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2451{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002452 if (v == NULL) {
2453 PyErr_SetString(PyExc_TypeError,
2454 "attribute deletion is not supported");
2455 return -1;
2456 }
2457 Py_XDECREF(p->inst_pers_func);
2458 Py_INCREF(v);
2459 p->inst_pers_func = v;
2460 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002461}
2462
2463static PyObject *
2464Pickler_get_memo(Picklerobject *p)
2465{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002466 if (p->memo == NULL)
2467 PyErr_SetString(PyExc_AttributeError, "memo");
2468 else
2469 Py_INCREF(p->memo);
2470 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002471}
2472
2473static int
2474Pickler_set_memo(Picklerobject *p, PyObject *v)
2475{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002476 if (v == NULL) {
2477 PyErr_SetString(PyExc_TypeError,
2478 "attribute deletion is not supported");
2479 return -1;
2480 }
2481 if (!PyDict_Check(v)) {
2482 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2483 return -1;
2484 }
2485 Py_XDECREF(p->memo);
2486 Py_INCREF(v);
2487 p->memo = v;
2488 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002489}
2490
2491static PyObject *
2492Pickler_get_error(Picklerobject *p)
2493{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002494 /* why is this an attribute on the Pickler? */
2495 Py_INCREF(PicklingError);
2496 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002497}
2498
2499static PyMemberDef Pickler_members[] = {
2500 {"binary", T_INT, offsetof(Picklerobject, bin)},
2501 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002502 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002503};
2504
2505static PyGetSetDef Pickler_getsets[] = {
2506 {"persistent_id", (getter)Pickler_get_pers_func,
2507 (setter)Pickler_set_pers_func},
2508 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2509 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002510 {"PicklingError", (getter)Pickler_get_error, NULL},
2511 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002512};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002513
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002514static char Picklertype__doc__[] =
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002515"Objects that know how to pickle objects\n";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002516
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002517static PyTypeObject Picklertype = {
2518 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002519 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002520 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002521 sizeof(Picklerobject), /*tp_basicsize*/
2522 0,
2523 (destructor)Pickler_dealloc, /* tp_dealloc */
2524 0, /* tp_print */
2525 0, /* tp_getattr */
2526 0, /* tp_setattr */
2527 0, /* tp_compare */
2528 0, /* tp_repr */
2529 0, /* tp_as_number */
2530 0, /* tp_as_sequence */
2531 0, /* tp_as_mapping */
2532 0, /* tp_hash */
2533 0, /* tp_call */
2534 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002535 0, /* set below */ /* tp_getattro */
2536 0, /* set below */ /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002537 0, /* tp_as_buffer */
2538 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2539 Picklertype__doc__, /* tp_doc */
2540 0, /* tp_traverse */
2541 0, /* tp_clear */
2542 0, /* tp_richcompare */
2543 0, /* tp_weaklistoffset */
2544 0, /* tp_iter */
2545 0, /* tp_iternext */
2546 Pickler_methods, /* tp_methods */
2547 Pickler_members, /* tp_members */
2548 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002549};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002550
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002551static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002552find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
2553{
2554 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002556 if (fc) {
2557 if (fc==Py_None) {
2558 PyErr_SetString(UnpicklingError,
2559 "Global and instance pickles are not supported.");
2560 return NULL;
2561 }
2562 return PyObject_CallFunction(fc, "OO", py_module_name,
2563 py_global_name);
2564 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002566 module = PySys_GetObject("modules");
2567 if (module == NULL)
2568 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002570 module = PyDict_GetItem(module, py_module_name);
2571 if (module == NULL) {
2572 module = PyImport_Import(py_module_name);
2573 if (!module)
2574 return NULL;
2575 global = PyObject_GetAttr(module, py_global_name);
2576 Py_DECREF(module);
2577 }
2578 else
2579 global = PyObject_GetAttr(module, py_global_name);
2580 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002581}
2582
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002583static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002584marker(Unpicklerobject *self)
2585{
2586 if (self->num_marks < 1) {
2587 PyErr_SetString(UnpicklingError, "could not find MARK");
2588 return -1;
2589 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002591 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002592}
2593
Tim Peters84e87f32001-03-17 04:50:51 +00002594
Guido van Rossum60456fd1997-04-09 17:36:32 +00002595static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002596load_none(Unpicklerobject *self)
2597{
2598 PDATA_APPEND(self->stack, Py_None, -1);
2599 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002600}
2601
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002602static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002603bad_readline(void)
2604{
2605 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2606 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002607}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002608
2609static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002610load_int(Unpicklerobject *self)
2611{
2612 PyObject *py_int = 0;
2613 char *endptr, *s;
2614 int len, res = -1;
2615 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002617 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2618 if (len < 2) return bad_readline();
2619 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002621 errno = 0;
2622 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002624 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2625 /* Hm, maybe we've got something long. Let's try reading
2626 it as a Python long object. */
2627 errno = 0;
2628 py_int = PyLong_FromString(s, NULL, 0);
2629 if (py_int == NULL) {
2630 PyErr_SetString(PyExc_ValueError,
2631 "could not convert string to int");
2632 goto finally;
2633 }
2634 }
2635 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002636 if (len == 3 && (l == 0 || l == 1)) {
2637 if (!( py_int = PyBool_FromLong(l))) goto finally;
2638 }
2639 else {
2640 if (!( py_int = PyInt_FromLong(l))) goto finally;
2641 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002642 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002644 free(s);
2645 PDATA_PUSH(self->stack, py_int, -1);
2646 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002648 finally:
2649 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002651 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002652}
2653
2654
Tim Peters84e87f32001-03-17 04:50:51 +00002655static long
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002656calc_binint(char *s, int x)
2657{
2658 unsigned char c;
2659 int i;
2660 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002662 for (i = 0, l = 0L; i < x; i++) {
2663 c = (unsigned char)s[i];
2664 l |= (long)c << (i * 8);
2665 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002666#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002667 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2668 * is signed, so on a box with longs bigger than 4 bytes we need
2669 * to extend a BININT's sign bit to the full width.
2670 */
2671 if (x == 4 && l & (1L << 31))
2672 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002673#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002674 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002675}
2676
2677
2678static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002679load_binintx(Unpicklerobject *self, char *s, int x)
2680{
2681 PyObject *py_int = 0;
2682 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002684 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002686 if (!( py_int = PyInt_FromLong(l)))
2687 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002689 PDATA_PUSH(self->stack, py_int, -1);
2690 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002691}
2692
2693
2694static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002695load_binint(Unpicklerobject *self)
2696{
2697 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002699 if ((*self->read_func)(self, &s, 4) < 0)
2700 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002702 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002703}
2704
2705
2706static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002707load_binint1(Unpicklerobject *self)
2708{
2709 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002711 if ((*self->read_func)(self, &s, 1) < 0)
2712 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002714 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002715}
2716
2717
2718static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002719load_binint2(Unpicklerobject *self)
2720{
2721 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002723 if ((*self->read_func)(self, &s, 2) < 0)
2724 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002726 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002727}
Tim Peters84e87f32001-03-17 04:50:51 +00002728
Guido van Rossum60456fd1997-04-09 17:36:32 +00002729static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002730load_long(Unpicklerobject *self)
2731{
2732 PyObject *l = 0;
2733 char *end, *s;
2734 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002736 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2737 if (len < 2) return bad_readline();
2738 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002740 if (!( l = PyLong_FromString(s, &end, 0)))
2741 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002743 free(s);
2744 PDATA_PUSH(self->stack, l, -1);
2745 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002747 finally:
2748 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002750 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002751}
2752
Tim Peters84e87f32001-03-17 04:50:51 +00002753
Guido van Rossum60456fd1997-04-09 17:36:32 +00002754static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002755load_float(Unpicklerobject *self)
2756{
2757 PyObject *py_float = 0;
2758 char *endptr, *s;
2759 int len, res = -1;
2760 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002762 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2763 if (len < 2) return bad_readline();
2764 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002766 errno = 0;
2767 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002769 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2770 PyErr_SetString(PyExc_ValueError,
2771 "could not convert string to float");
2772 goto finally;
2773 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002775 if (!( py_float = PyFloat_FromDouble(d)))
2776 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002778 free(s);
2779 PDATA_PUSH(self->stack, py_float, -1);
2780 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002782 finally:
2783 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002785 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002786}
2787
Guido van Rossum60456fd1997-04-09 17:36:32 +00002788static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002789load_binfloat(Unpicklerobject *self)
2790{
2791 PyObject *py_float = 0;
2792 int s, e;
2793 long fhi, flo;
2794 double x;
2795 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002797 if ((*self->read_func)(self, &p, 8) < 0)
2798 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002800 /* First byte */
2801 s = (*p>>7) & 1;
2802 e = (*p & 0x7F) << 4;
2803 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002805 /* Second byte */
2806 e |= (*p>>4) & 0xF;
2807 fhi = (*p & 0xF) << 24;
2808 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002810 /* Third byte */
2811 fhi |= (*p & 0xFF) << 16;
2812 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002814 /* Fourth byte */
2815 fhi |= (*p & 0xFF) << 8;
2816 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002818 /* Fifth byte */
2819 fhi |= *p & 0xFF;
2820 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002822 /* Sixth byte */
2823 flo = (*p & 0xFF) << 16;
2824 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002825
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002826 /* Seventh byte */
2827 flo |= (*p & 0xFF) << 8;
2828 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002830 /* Eighth byte */
2831 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002833 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2834 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002836 /* XXX This sadly ignores Inf/NaN */
2837 if (e == 0)
2838 e = -1022;
2839 else {
2840 x += 1.0;
2841 e -= 1023;
2842 }
2843 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002845 if (s)
2846 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002848 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002850 PDATA_PUSH(self->stack, py_float, -1);
2851 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002852}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002853
2854static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002855load_string(Unpicklerobject *self)
2856{
2857 PyObject *str = 0;
2858 int len, res = -1, nslash;
2859 char *s, q, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002861 static PyObject *eval_dict = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002863 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2864 if (len < 2) return bad_readline();
2865 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002867 /* Check for unquoted quotes (evil strings) */
2868 q=*s;
2869 if (q != '"' && q != '\'') goto insecure;
2870 for (p=s+1, nslash=0; *p; p++) {
2871 if (*p==q && nslash%2==0) break;
2872 if (*p=='\\') nslash++;
2873 else nslash=0;
2874 }
2875 if (*p == q) {
2876 for (p++; *p; p++)
2877 if (*(unsigned char *)p > ' ')
2878 goto insecure;
2879 }
2880 else
2881 goto insecure;
2882 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002884 if (!( eval_dict ))
2885 if (!( eval_dict = Py_BuildValue("{s{}}", "__builtins__")))
2886 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002888 if (!( str = PyRun_String(s, Py_eval_input, eval_dict, eval_dict)))
2889 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002891 free(s);
2892 PDATA_PUSH(self->stack, str, -1);
2893 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002895 finally:
2896 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002898 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002900 insecure:
2901 free(s);
2902 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2903 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002904}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002905
2906
2907static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002908load_binstring(Unpicklerobject *self)
2909{
2910 PyObject *py_string = 0;
2911 long l;
2912 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002914 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002916 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002917
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002918 if ((*self->read_func)(self, &s, l) < 0)
2919 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002921 if (!( py_string = PyString_FromStringAndSize(s, l)))
2922 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002924 PDATA_PUSH(self->stack, py_string, -1);
2925 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002926}
2927
2928
2929static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002930load_short_binstring(Unpicklerobject *self)
2931{
2932 PyObject *py_string = 0;
2933 unsigned char l;
2934 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002936 if ((*self->read_func)(self, &s, 1) < 0)
2937 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002939 l = (unsigned char)s[0];
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) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002945 PDATA_PUSH(self->stack, py_string, -1);
2946 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002947}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002948
2949
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002950#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002951static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002952load_unicode(Unpicklerobject *self)
2953{
2954 PyObject *str = 0;
2955 int len, res = -1;
2956 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002958 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2959 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002961 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
2962 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002964 PDATA_PUSH(self->stack, str, -1);
2965 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002967 finally:
2968 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002969}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002970#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002971
2972
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002973#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002974static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002975load_binunicode(Unpicklerobject *self)
2976{
2977 PyObject *unicode;
2978 long l;
2979 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002981 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002983 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002985 if ((*self->read_func)(self, &s, l) < 0)
2986 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002988 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
2989 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002991 PDATA_PUSH(self->stack, unicode, -1);
2992 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002993}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002994#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002995
2996
2997static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002998load_tuple(Unpicklerobject *self)
2999{
3000 PyObject *tup;
3001 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003003 if ((i = marker(self)) < 0) return -1;
3004 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3005 PDATA_PUSH(self->stack, tup, -1);
3006 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003007}
3008
3009static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003010load_empty_tuple(Unpicklerobject *self)
3011{
3012 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003014 if (!( tup=PyTuple_New(0))) return -1;
3015 PDATA_PUSH(self->stack, tup, -1);
3016 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003017}
3018
3019static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003020load_empty_list(Unpicklerobject *self)
3021{
3022 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003024 if (!( list=PyList_New(0))) return -1;
3025 PDATA_PUSH(self->stack, list, -1);
3026 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003027}
3028
3029static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003030load_empty_dict(Unpicklerobject *self)
3031{
3032 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003034 if (!( dict=PyDict_New())) return -1;
3035 PDATA_PUSH(self->stack, dict, -1);
3036 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003037}
3038
3039
3040static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003041load_list(Unpicklerobject *self)
3042{
3043 PyObject *list = 0;
3044 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003046 if ((i = marker(self)) < 0) return -1;
3047 if (!( list=Pdata_popList(self->stack, i))) 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_dict(Unpicklerobject *self)
3054{
3055 PyObject *dict, *key, *value;
3056 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003058 if ((i = marker(self)) < 0) return -1;
3059 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003061 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003063 for (k = i+1; k < j; k += 2) {
3064 key =self->stack->data[k-1];
3065 value=self->stack->data[k ];
3066 if (PyDict_SetItem(dict, key, value) < 0) {
3067 Py_DECREF(dict);
3068 return -1;
3069 }
3070 }
3071 Pdata_clear(self->stack, i);
3072 PDATA_PUSH(self->stack, dict, -1);
3073 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003074}
3075
3076static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003077Instance_New(PyObject *cls, PyObject *args)
3078{
3079 int has_key;
3080 PyObject *safe=0, *r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003082 if (PyClass_Check(cls)) {
3083 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003085 if ((l=PyObject_Size(args)) < 0) goto err;
3086 if (!( l )) {
3087 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003089 __getinitargs__ = PyObject_GetAttr(cls,
3090 __getinitargs___str);
3091 if (!__getinitargs__) {
3092 /* We have a class with no __getinitargs__,
3093 so bypass usual construction */
3094 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003096 PyErr_Clear();
3097 if (!( inst=PyInstance_NewRaw(cls, NULL)))
3098 goto err;
3099 return inst;
3100 }
3101 Py_DECREF(__getinitargs__);
3102 }
Tim Peters84e87f32001-03-17 04:50:51 +00003103
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003104 if ((r=PyInstance_New(cls, args, NULL))) return r;
3105 else goto err;
3106 }
Tim Peters84e87f32001-03-17 04:50:51 +00003107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003108 /* Is safe_constructors always a dict? */
3109 has_key = cPickle_PyMapping_HasKey(safe_constructors, cls);
3110 if (!has_key) {
3111 safe = PyObject_GetAttr(cls, __safe_for_unpickling___str);
3112 if (!safe ||
3113 !PyObject_IsTrue(safe)) {
3114 cPickle_ErrFormat(UnpicklingError,
3115 "%s is not safe for unpickling",
3116 "O", cls);
3117 Py_XDECREF(safe);
3118 return NULL;
3119 }
3120 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003122 if (args==Py_None) {
3123 /* Special case, call cls.__basicnew__() */
3124 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003126 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3127 if (!basicnew) return NULL;
3128 r=PyObject_CallObject(basicnew, NULL);
3129 Py_DECREF(basicnew);
3130 if (r) return r;
3131 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003133 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003135 err:
3136 {
3137 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003139 PyErr_Fetch(&tp, &v, &tb);
3140 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3141 Py_XDECREF(v);
3142 v=r;
3143 }
3144 PyErr_Restore(tp,v,tb);
3145 }
3146 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003147}
Tim Peters84e87f32001-03-17 04:50:51 +00003148
Guido van Rossum60456fd1997-04-09 17:36:32 +00003149
3150static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003151load_obj(Unpicklerobject *self)
3152{
3153 PyObject *class, *tup, *obj=0;
3154 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003156 if ((i = marker(self)) < 0) return -1;
3157 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3158 PDATA_POP(self->stack, class);
3159 if (class) {
3160 obj = Instance_New(class, tup);
3161 Py_DECREF(class);
3162 }
3163 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003165 if (! obj) return -1;
3166 PDATA_PUSH(self->stack, obj, -1);
3167 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003168}
3169
3170
3171static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003172load_inst(Unpicklerobject *self)
3173{
3174 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3175 int i, len;
3176 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003178 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003180 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3181 if (len < 2) return bad_readline();
3182 module_name = PyString_FromStringAndSize(s, len - 1);
3183 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003185 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3186 if (len < 2) return bad_readline();
3187 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3188 class = find_class(module_name, class_name,
3189 self->find_class);
3190 Py_DECREF(class_name);
3191 }
3192 }
3193 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003195 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003197 if ((tup=Pdata_popTuple(self->stack, i))) {
3198 obj = Instance_New(class, tup);
3199 Py_DECREF(tup);
3200 }
3201 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003203 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003205 PDATA_PUSH(self->stack, obj, -1);
3206 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003207}
3208
3209
3210static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003211load_global(Unpicklerobject *self)
3212{
3213 PyObject *class = 0, *module_name = 0, *class_name = 0;
3214 int len;
3215 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003217 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3218 if (len < 2) return bad_readline();
3219 module_name = PyString_FromStringAndSize(s, len - 1);
3220 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003222 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3223 if (len < 2) return bad_readline();
3224 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3225 class = find_class(module_name, class_name,
3226 self->find_class);
3227 Py_DECREF(class_name);
3228 }
3229 }
3230 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003232 if (! class) return -1;
3233 PDATA_PUSH(self->stack, class, -1);
3234 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003235}
3236
3237
3238static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003239load_persid(Unpicklerobject *self)
3240{
3241 PyObject *pid = 0;
3242 int len;
3243 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003245 if (self->pers_func) {
3246 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3247 if (len < 2) return bad_readline();
3248
3249 pid = PyString_FromStringAndSize(s, len - 1);
3250 if (!pid) return -1;
3251
3252 if (PyList_Check(self->pers_func)) {
3253 if (PyList_Append(self->pers_func, pid) < 0) {
3254 Py_DECREF(pid);
3255 return -1;
3256 }
3257 }
3258 else {
3259 ARG_TUP(self, pid);
3260 if (self->arg) {
3261 pid = PyObject_Call(self->pers_func, self->arg,
3262 NULL);
3263 FREE_ARG_TUP(self);
3264 }
3265 }
3266
3267 if (! pid) return -1;
3268
3269 PDATA_PUSH(self->stack, pid, -1);
3270 return 0;
3271 }
3272 else {
3273 PyErr_SetString(UnpicklingError,
3274 "A load persistent id instruction was encountered,\n"
3275 "but no persistent_load function was specified.");
3276 return -1;
3277 }
3278}
3279
3280static int
3281load_binpersid(Unpicklerobject *self)
3282{
3283 PyObject *pid = 0;
3284
3285 if (self->pers_func) {
3286 PDATA_POP(self->stack, pid);
3287 if (! pid) return -1;
3288
3289 if (PyList_Check(self->pers_func)) {
3290 if (PyList_Append(self->pers_func, pid) < 0) {
3291 Py_DECREF(pid);
3292 return -1;
3293 }
3294 }
3295 else {
3296 ARG_TUP(self, pid);
3297 if (self->arg) {
3298 pid = PyObject_Call(self->pers_func, self->arg,
3299 NULL);
3300 FREE_ARG_TUP(self);
3301 }
3302 if (! pid) return -1;
3303 }
3304
3305 PDATA_PUSH(self->stack, pid, -1);
3306 return 0;
3307 }
3308 else {
3309 PyErr_SetString(UnpicklingError,
3310 "A load persistent id instruction was encountered,\n"
3311 "but no persistent_load function was specified.");
3312 return -1;
3313 }
3314}
3315
3316
3317static int
3318load_pop(Unpicklerobject *self)
3319{
3320 int len;
3321
3322 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3323
3324 /* Note that we split the (pickle.py) stack into two stacks,
3325 an object stack and a mark stack. We have to be clever and
3326 pop the right one. We do this by looking at the top of the
3327 mark stack.
3328 */
3329
3330 if ((self->num_marks > 0) &&
3331 (self->marks[self->num_marks - 1] == len))
3332 self->num_marks--;
3333 else {
3334 len--;
3335 Py_DECREF(self->stack->data[len]);
3336 self->stack->length=len;
3337 }
3338
3339 return 0;
3340}
3341
3342
3343static int
3344load_pop_mark(Unpicklerobject *self)
3345{
3346 int i;
3347
3348 if ((i = marker(self)) < 0)
3349 return -1;
3350
3351 Pdata_clear(self->stack, i);
3352
3353 return 0;
3354}
3355
3356
3357static int
3358load_dup(Unpicklerobject *self)
3359{
3360 PyObject *last;
3361 int len;
3362
3363 if ((len = self->stack->length) <= 0) return stackUnderflow();
3364 last=self->stack->data[len-1];
3365 Py_INCREF(last);
3366 PDATA_PUSH(self->stack, last, -1);
3367 return 0;
3368}
3369
3370
3371static int
3372load_get(Unpicklerobject *self)
3373{
3374 PyObject *py_str = 0, *value = 0;
3375 int len;
3376 char *s;
3377 int rc;
3378
3379 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003380 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003382 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003384 value = PyDict_GetItem(self->memo, py_str);
3385 if (! value) {
3386 PyErr_SetObject(BadPickleGet, py_str);
3387 rc = -1;
3388 } else {
3389 PDATA_APPEND(self->stack, value, -1);
3390 rc = 0;
3391 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003393 Py_DECREF(py_str);
3394 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003395}
3396
3397
3398static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003399load_binget(Unpicklerobject *self)
3400{
3401 PyObject *py_key = 0, *value = 0;
3402 unsigned char key;
3403 char *s;
3404 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003406 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003408 key = (unsigned char)s[0];
3409 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003411 value = PyDict_GetItem(self->memo, py_key);
3412 if (! value) {
3413 PyErr_SetObject(BadPickleGet, py_key);
3414 rc = -1;
3415 } else {
3416 PDATA_APPEND(self->stack, value, -1);
3417 rc = 0;
3418 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003420 Py_DECREF(py_key);
3421 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003422}
3423
3424
3425static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003426load_long_binget(Unpicklerobject *self)
3427{
3428 PyObject *py_key = 0, *value = 0;
3429 unsigned char c;
3430 char *s;
3431 long key;
3432 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003434 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003436 c = (unsigned char)s[0];
3437 key = (long)c;
3438 c = (unsigned char)s[1];
3439 key |= (long)c << 8;
3440 c = (unsigned char)s[2];
3441 key |= (long)c << 16;
3442 c = (unsigned char)s[3];
3443 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003445 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3446
3447 value = PyDict_GetItem(self->memo, py_key);
3448 if (! value) {
3449 PyErr_SetObject(BadPickleGet, py_key);
3450 rc = -1;
3451 } else {
3452 PDATA_APPEND(self->stack, value, -1);
3453 rc = 0;
3454 }
3455
3456 Py_DECREF(py_key);
3457 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003458}
3459
3460
3461static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003462load_put(Unpicklerobject *self)
3463{
3464 PyObject *py_str = 0, *value = 0;
3465 int len, l;
3466 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003468 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3469 if (l < 2) return bad_readline();
3470 if (!( len=self->stack->length )) return stackUnderflow();
3471 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3472 value=self->stack->data[len-1];
3473 l=PyDict_SetItem(self->memo, py_str, value);
3474 Py_DECREF(py_str);
3475 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003476}
3477
3478
3479static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003480load_binput(Unpicklerobject *self)
3481{
3482 PyObject *py_key = 0, *value = 0;
3483 unsigned char key;
3484 char *s;
3485 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003487 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3488 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003490 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003492 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3493 value=self->stack->data[len-1];
3494 len=PyDict_SetItem(self->memo, py_key, value);
3495 Py_DECREF(py_key);
3496 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003497}
3498
3499
3500static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003501load_long_binput(Unpicklerobject *self)
3502{
3503 PyObject *py_key = 0, *value = 0;
3504 long key;
3505 unsigned char c;
3506 char *s;
3507 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003509 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3510 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003512 c = (unsigned char)s[0];
3513 key = (long)c;
3514 c = (unsigned char)s[1];
3515 key |= (long)c << 8;
3516 c = (unsigned char)s[2];
3517 key |= (long)c << 16;
3518 c = (unsigned char)s[3];
3519 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003521 if (!( py_key = PyInt_FromLong(key))) return -1;
3522 value=self->stack->data[len-1];
3523 len=PyDict_SetItem(self->memo, py_key, value);
3524 Py_DECREF(py_key);
3525 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003526}
3527
3528
3529static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003530do_append(Unpicklerobject *self, int x)
3531{
3532 PyObject *value = 0, *list = 0, *append_method = 0;
3533 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003535 len=self->stack->length;
3536 if (!( len >= x && x > 0 )) return stackUnderflow();
3537 /* nothing to do */
3538 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003540 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003542 if (PyList_Check(list)) {
3543 PyObject *slice;
3544 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003546 slice=Pdata_popList(self->stack, x);
3547 list_len = PyList_GET_SIZE(list);
3548 i=PyList_SetSlice(list, list_len, list_len, slice);
3549 Py_DECREF(slice);
3550 return i;
3551 }
3552 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003554 if (!( append_method = PyObject_GetAttr(list, append_str)))
3555 return -1;
3556
3557 for (i = x; i < len; i++) {
3558 PyObject *junk;
3559
3560 value=self->stack->data[i];
3561 junk=0;
3562 ARG_TUP(self, value);
3563 if (self->arg) {
3564 junk = PyObject_Call(append_method, self->arg,
3565 NULL);
3566 FREE_ARG_TUP(self);
3567 }
3568 if (! junk) {
3569 Pdata_clear(self->stack, i+1);
3570 self->stack->length=x;
3571 Py_DECREF(append_method);
3572 return -1;
3573 }
3574 Py_DECREF(junk);
3575 }
3576 self->stack->length=x;
3577 Py_DECREF(append_method);
3578 }
3579
3580 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003581}
3582
3583
3584static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003585load_append(Unpicklerobject *self)
3586{
3587 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003588}
3589
3590
3591static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003592load_appends(Unpicklerobject *self)
3593{
3594 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003595}
3596
3597
3598static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003599do_setitems(Unpicklerobject *self, int x)
3600{
3601 PyObject *value = 0, *key = 0, *dict = 0;
3602 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003603
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003604 if (!( (len=self->stack->length) >= x
3605 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003607 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003609 for (i = x+1; i < len; i += 2) {
3610 key =self->stack->data[i-1];
3611 value=self->stack->data[i ];
3612 if (PyObject_SetItem(dict, key, value) < 0) {
3613 r=-1;
3614 break;
3615 }
3616 }
3617
3618 Pdata_clear(self->stack, x);
3619
3620 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003621}
3622
3623
Tim Peters84e87f32001-03-17 04:50:51 +00003624static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003625load_setitem(Unpicklerobject *self)
3626{
3627 return do_setitems(self, self->stack->length - 2);
3628}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003630static int
3631load_setitems(Unpicklerobject *self)
3632{
3633 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003634}
3635
Tim Peters84e87f32001-03-17 04:50:51 +00003636
Guido van Rossum60456fd1997-04-09 17:36:32 +00003637static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003638load_build(Unpicklerobject *self)
3639{
3640 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3641 *junk = 0, *__setstate__ = 0;
3642 int i, r = 0;
3643
3644 if (self->stack->length < 2) return stackUnderflow();
3645 PDATA_POP(self->stack, value);
3646 if (! value) return -1;
3647 inst=self->stack->data[self->stack->length-1];
3648
3649 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3650 ARG_TUP(self, value);
3651 if (self->arg) {
3652 junk = PyObject_Call(__setstate__, self->arg, NULL);
3653 FREE_ARG_TUP(self);
3654 }
3655 Py_DECREF(__setstate__);
3656 if (! junk) return -1;
3657 Py_DECREF(junk);
3658 return 0;
3659 }
3660
3661 PyErr_Clear();
3662 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3663 i = 0;
3664 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3665 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3666 r=-1;
3667 break;
3668 }
3669 }
3670 Py_DECREF(instdict);
3671 }
3672 else r=-1;
3673
3674 Py_XDECREF(value);
3675
3676 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003677}
3678
3679
3680static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003681load_mark(Unpicklerobject *self)
3682{
3683 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003685 /* Note that we split the (pickle.py) stack into two stacks, an
3686 object stack and a mark stack. Here we push a mark onto the
3687 mark stack.
3688 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003690 if ((self->num_marks + 1) >= self->marks_size) {
3691 s=self->marks_size+20;
3692 if (s <= self->num_marks) s=self->num_marks + 1;
3693 if (self->marks == NULL)
3694 self->marks=(int *)malloc(s * sizeof(int));
3695 else
3696 self->marks=(int *)realloc(self->marks,
3697 s * sizeof(int));
3698 if (! self->marks) {
3699 PyErr_NoMemory();
3700 return -1;
3701 }
3702 self->marks_size = s;
3703 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003705 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003707 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003708}
3709
Guido van Rossum60456fd1997-04-09 17:36:32 +00003710static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003711load_reduce(Unpicklerobject *self)
3712{
3713 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003715 PDATA_POP(self->stack, arg_tup);
3716 if (! arg_tup) return -1;
3717 PDATA_POP(self->stack, callable);
3718 if (callable) {
3719 ob = Instance_New(callable, arg_tup);
3720 Py_DECREF(callable);
3721 }
3722 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003724 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003726 PDATA_PUSH(self->stack, ob, -1);
3727 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003728}
Tim Peters84e87f32001-03-17 04:50:51 +00003729
Guido van Rossum60456fd1997-04-09 17:36:32 +00003730static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003731load(Unpicklerobject *self)
3732{
3733 PyObject *err = 0, *val = 0;
3734 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003736 self->num_marks = 0;
3737 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003739 while (1) {
3740 if ((*self->read_func)(self, &s, 1) < 0)
3741 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003743 switch (s[0]) {
3744 case NONE:
3745 if (load_none(self) < 0)
3746 break;
3747 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003749 case BININT:
3750 if (load_binint(self) < 0)
3751 break;
3752 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003754 case BININT1:
3755 if (load_binint1(self) < 0)
3756 break;
3757 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003759 case BININT2:
3760 if (load_binint2(self) < 0)
3761 break;
3762 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003764 case INT:
3765 if (load_int(self) < 0)
3766 break;
3767 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003769 case LONG:
3770 if (load_long(self) < 0)
3771 break;
3772 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003774 case FLOAT:
3775 if (load_float(self) < 0)
3776 break;
3777 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003779 case BINFLOAT:
3780 if (load_binfloat(self) < 0)
3781 break;
3782 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003784 case BINSTRING:
3785 if (load_binstring(self) < 0)
3786 break;
3787 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003789 case SHORT_BINSTRING:
3790 if (load_short_binstring(self) < 0)
3791 break;
3792 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003794 case STRING:
3795 if (load_string(self) < 0)
3796 break;
3797 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003798
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003799#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003800 case UNICODE:
3801 if (load_unicode(self) < 0)
3802 break;
3803 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003805 case BINUNICODE:
3806 if (load_binunicode(self) < 0)
3807 break;
3808 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003809#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003811 case EMPTY_TUPLE:
3812 if (load_empty_tuple(self) < 0)
3813 break;
3814 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003816 case TUPLE:
3817 if (load_tuple(self) < 0)
3818 break;
3819 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003821 case EMPTY_LIST:
3822 if (load_empty_list(self) < 0)
3823 break;
3824 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003825
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003826 case LIST:
3827 if (load_list(self) < 0)
3828 break;
3829 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003831 case EMPTY_DICT:
3832 if (load_empty_dict(self) < 0)
3833 break;
3834 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003836 case DICT:
3837 if (load_dict(self) < 0)
3838 break;
3839 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003841 case OBJ:
3842 if (load_obj(self) < 0)
3843 break;
3844 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003846 case INST:
3847 if (load_inst(self) < 0)
3848 break;
3849 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003851 case GLOBAL:
3852 if (load_global(self) < 0)
3853 break;
3854 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003856 case APPEND:
3857 if (load_append(self) < 0)
3858 break;
3859 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003861 case APPENDS:
3862 if (load_appends(self) < 0)
3863 break;
3864 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003866 case BUILD:
3867 if (load_build(self) < 0)
3868 break;
3869 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003871 case DUP:
3872 if (load_dup(self) < 0)
3873 break;
3874 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003876 case BINGET:
3877 if (load_binget(self) < 0)
3878 break;
3879 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003881 case LONG_BINGET:
3882 if (load_long_binget(self) < 0)
3883 break;
3884 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003886 case GET:
3887 if (load_get(self) < 0)
3888 break;
3889 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003891 case MARK:
3892 if (load_mark(self) < 0)
3893 break;
3894 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003896 case BINPUT:
3897 if (load_binput(self) < 0)
3898 break;
3899 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003901 case LONG_BINPUT:
3902 if (load_long_binput(self) < 0)
3903 break;
3904 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003905
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003906 case PUT:
3907 if (load_put(self) < 0)
3908 break;
3909 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003911 case POP:
3912 if (load_pop(self) < 0)
3913 break;
3914 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003916 case POP_MARK:
3917 if (load_pop_mark(self) < 0)
3918 break;
3919 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003921 case SETITEM:
3922 if (load_setitem(self) < 0)
3923 break;
3924 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003926 case SETITEMS:
3927 if (load_setitems(self) < 0)
3928 break;
3929 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003930
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003931 case STOP:
3932 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003934 case PERSID:
3935 if (load_persid(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 BINPERSID:
3940 if (load_binpersid(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 REDUCE:
3945 if (load_reduce(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 '\0':
3950 /* end of file */
3951 PyErr_SetNone(PyExc_EOFError);
3952 break;
Neil Schemenauerfa79c652002-03-22 23:02:53 +00003953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003954 default:
3955 cPickle_ErrFormat(UnpicklingError,
3956 "invalid load key, '%s'.",
3957 "c", s[0]);
3958 return NULL;
3959 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003961 break;
3962 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003964 if ((err = PyErr_Occurred())) {
3965 if (err == PyExc_EOFError) {
3966 PyErr_SetNone(PyExc_EOFError);
3967 }
3968 return NULL;
3969 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003970
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003971 PDATA_POP(self->stack, val);
3972 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003973}
Tim Peters84e87f32001-03-17 04:50:51 +00003974
Guido van Rossum60456fd1997-04-09 17:36:32 +00003975
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003976/* No-load functions to support noload, which is used to
3977 find persistent references. */
3978
3979static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003980noload_obj(Unpicklerobject *self)
3981{
3982 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003984 if ((i = marker(self)) < 0) return -1;
3985 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003986}
3987
3988
3989static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003990noload_inst(Unpicklerobject *self)
3991{
3992 int i;
3993 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003995 if ((i = marker(self)) < 0) return -1;
3996 Pdata_clear(self->stack, i);
3997 if ((*self->readline_func)(self, &s) < 0) return -1;
3998 if ((*self->readline_func)(self, &s) < 0) return -1;
3999 PDATA_APPEND(self->stack, Py_None,-1);
4000 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004001}
4002
4003static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004004noload_global(Unpicklerobject *self)
4005{
4006 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004008 if ((*self->readline_func)(self, &s) < 0) return -1;
4009 if ((*self->readline_func)(self, &s) < 0) return -1;
4010 PDATA_APPEND(self->stack, Py_None,-1);
4011 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004012}
4013
4014static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004015noload_reduce(Unpicklerobject *self)
4016{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004018 if (self->stack->length < 2) return stackUnderflow();
4019 Pdata_clear(self->stack, self->stack->length-2);
4020 PDATA_APPEND(self->stack, Py_None,-1);
4021 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004022}
4023
4024static int
4025noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004026
Guido van Rossum053b8df1998-11-25 16:18:00 +00004027 if (self->stack->length < 1) return stackUnderflow();
4028 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004029 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004030}
4031
4032
4033static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004034noload(Unpicklerobject *self)
4035{
4036 PyObject *err = 0, *val = 0;
4037 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004039 self->num_marks = 0;
4040 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004042 while (1) {
4043 if ((*self->read_func)(self, &s, 1) < 0)
4044 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004046 switch (s[0]) {
4047 case NONE:
4048 if (load_none(self) < 0)
4049 break;
4050 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004052 case BININT:
4053 if (load_binint(self) < 0)
4054 break;
4055 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004057 case BININT1:
4058 if (load_binint1(self) < 0)
4059 break;
4060 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004062 case BININT2:
4063 if (load_binint2(self) < 0)
4064 break;
4065 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004067 case INT:
4068 if (load_int(self) < 0)
4069 break;
4070 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004072 case LONG:
4073 if (load_long(self) < 0)
4074 break;
4075 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004077 case FLOAT:
4078 if (load_float(self) < 0)
4079 break;
4080 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004082 case BINFLOAT:
4083 if (load_binfloat(self) < 0)
4084 break;
4085 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004087 case BINSTRING:
4088 if (load_binstring(self) < 0)
4089 break;
4090 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004092 case SHORT_BINSTRING:
4093 if (load_short_binstring(self) < 0)
4094 break;
4095 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004097 case STRING:
4098 if (load_string(self) < 0)
4099 break;
4100 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004101
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004102#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004103 case UNICODE:
4104 if (load_unicode(self) < 0)
4105 break;
4106 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004108 case BINUNICODE:
4109 if (load_binunicode(self) < 0)
4110 break;
4111 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004112#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004114 case EMPTY_TUPLE:
4115 if (load_empty_tuple(self) < 0)
4116 break;
4117 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004119 case TUPLE:
4120 if (load_tuple(self) < 0)
4121 break;
4122 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004124 case EMPTY_LIST:
4125 if (load_empty_list(self) < 0)
4126 break;
4127 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004129 case LIST:
4130 if (load_list(self) < 0)
4131 break;
4132 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004134 case EMPTY_DICT:
4135 if (load_empty_dict(self) < 0)
4136 break;
4137 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004139 case DICT:
4140 if (load_dict(self) < 0)
4141 break;
4142 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004144 case OBJ:
4145 if (noload_obj(self) < 0)
4146 break;
4147 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004148
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004149 case INST:
4150 if (noload_inst(self) < 0)
4151 break;
4152 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004154 case GLOBAL:
4155 if (noload_global(self) < 0)
4156 break;
4157 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004159 case APPEND:
4160 if (load_append(self) < 0)
4161 break;
4162 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004164 case APPENDS:
4165 if (load_appends(self) < 0)
4166 break;
4167 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004169 case BUILD:
4170 if (noload_build(self) < 0)
4171 break;
4172 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004174 case DUP:
4175 if (load_dup(self) < 0)
4176 break;
4177 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004179 case BINGET:
4180 if (load_binget(self) < 0)
4181 break;
4182 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004184 case LONG_BINGET:
4185 if (load_long_binget(self) < 0)
4186 break;
4187 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004189 case GET:
4190 if (load_get(self) < 0)
4191 break;
4192 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004194 case MARK:
4195 if (load_mark(self) < 0)
4196 break;
4197 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004199 case BINPUT:
4200 if (load_binput(self) < 0)
4201 break;
4202 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004204 case LONG_BINPUT:
4205 if (load_long_binput(self) < 0)
4206 break;
4207 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004209 case PUT:
4210 if (load_put(self) < 0)
4211 break;
4212 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004214 case POP:
4215 if (load_pop(self) < 0)
4216 break;
4217 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004219 case POP_MARK:
4220 if (load_pop_mark(self) < 0)
4221 break;
4222 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004224 case SETITEM:
4225 if (load_setitem(self) < 0)
4226 break;
4227 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004229 case SETITEMS:
4230 if (load_setitems(self) < 0)
4231 break;
4232 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004234 case STOP:
4235 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004237 case PERSID:
4238 if (load_persid(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 BINPERSID:
4243 if (load_binpersid(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 REDUCE:
4248 if (noload_reduce(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 default:
4253 cPickle_ErrFormat(UnpicklingError,
4254 "invalid load key, '%s'.",
4255 "c", s[0]);
4256 return NULL;
4257 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004259 break;
4260 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004261
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004262 if ((err = PyErr_Occurred())) {
4263 if (err == PyExc_EOFError) {
4264 PyErr_SetNone(PyExc_EOFError);
4265 }
4266 return NULL;
4267 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004269 PDATA_POP(self->stack, val);
4270 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004271}
Tim Peters84e87f32001-03-17 04:50:51 +00004272
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004273
Guido van Rossum60456fd1997-04-09 17:36:32 +00004274static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004275Unpickler_load(Unpicklerobject *self, PyObject *args)
4276{
4277 if (!( PyArg_ParseTuple(args, ":load")))
4278 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004280 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004281}
4282
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004283static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004284Unpickler_noload(Unpicklerobject *self, PyObject *args)
4285{
4286 if (!( PyArg_ParseTuple(args, ":noload")))
4287 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004289 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004290}
4291
Guido van Rossum60456fd1997-04-09 17:36:32 +00004292
4293static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004294 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004295 "load() -- Load a pickle"
4296 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004297 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004298 "noload() -- not load a pickle, but go through most of the motions\n"
4299 "\n"
4300 "This function can be used to read past a pickle without instantiating\n"
4301 "any objects or importing any modules. It can also be used to find all\n"
4302 "persistent references without instantiating any objects or importing\n"
4303 "any modules.\n"
4304 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004305 {NULL, NULL} /* sentinel */
4306};
4307
4308
4309static Unpicklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004310newUnpicklerobject(PyObject *f)
4311{
4312 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004314 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
4315 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004317 self->file = NULL;
4318 self->arg = NULL;
4319 self->stack = (Pdata*)Pdata_New();
4320 self->pers_func = NULL;
4321 self->last_string = NULL;
4322 self->marks = NULL;
4323 self->num_marks = 0;
4324 self->marks_size = 0;
4325 self->buf_size = 0;
4326 self->read = NULL;
4327 self->readline = NULL;
4328 self->safe_constructors = NULL;
4329 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004331 if (!( self->memo = PyDict_New()))
4332 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004334 Py_INCREF(f);
4335 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004337 /* Set read, readline based on type of f */
4338 if (PyFile_Check(f)) {
4339 self->fp = PyFile_AsFile(f);
4340 if (self->fp == NULL) {
4341 PyErr_SetString(PyExc_ValueError,
4342 "I/O operation on closed file");
4343 goto err;
4344 }
4345 self->read_func = read_file;
4346 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004347 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004348 else if (PycStringIO_InputCheck(f)) {
4349 self->fp = NULL;
4350 self->read_func = read_cStringIO;
4351 self->readline_func = readline_cStringIO;
4352 }
4353 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004355 self->fp = NULL;
4356 self->read_func = read_other;
4357 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004359 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4360 (self->read = PyObject_GetAttr(f, read_str)))) {
4361 PyErr_Clear();
4362 PyErr_SetString( PyExc_TypeError,
4363 "argument must have 'read' and "
4364 "'readline' attributes" );
4365 goto err;
4366 }
4367 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004369 if (PyEval_GetRestricted()) {
4370 /* Restricted execution, get private tables */
4371 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004373 if (!( m=PyImport_Import(copy_reg_str))) goto err;
4374 self->safe_constructors=PyObject_GetAttr(m,
4375 safe_constructors_str);
4376 Py_DECREF(m);
4377 if (!( self->safe_constructors )) goto err;
4378 }
4379 else {
4380 self->safe_constructors=safe_constructors;
4381 Py_INCREF(safe_constructors);
4382 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004384 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004386 err:
4387 Py_DECREF((PyObject *)self);
4388 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004389}
4390
4391
4392static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004393get_Unpickler(PyObject *self, PyObject *args)
4394{
4395 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004397 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
4398 return NULL;
4399 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004400}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004401
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004402
Guido van Rossum60456fd1997-04-09 17:36:32 +00004403static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004404Unpickler_dealloc(Unpicklerobject *self)
4405{
4406 Py_XDECREF(self->readline);
4407 Py_XDECREF(self->read);
4408 Py_XDECREF(self->file);
4409 Py_XDECREF(self->memo);
4410 Py_XDECREF(self->stack);
4411 Py_XDECREF(self->pers_func);
4412 Py_XDECREF(self->arg);
4413 Py_XDECREF(self->last_string);
4414 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004416 if (self->marks) {
4417 free(self->marks);
4418 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004420 if (self->buf_size) {
4421 free(self->buf);
4422 }
Tim Peters84e87f32001-03-17 04:50:51 +00004423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004424 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004425}
4426
4427
4428static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004429Unpickler_getattr(Unpicklerobject *self, char *name)
4430{
4431 if (!strcmp(name, "persistent_load")) {
4432 if (!self->pers_func) {
4433 PyErr_SetString(PyExc_AttributeError, name);
4434 return NULL;
4435 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004437 Py_INCREF(self->pers_func);
4438 return self->pers_func;
4439 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004441 if (!strcmp(name, "find_global")) {
4442 if (!self->find_class) {
4443 PyErr_SetString(PyExc_AttributeError, name);
4444 return NULL;
4445 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004447 Py_INCREF(self->find_class);
4448 return self->find_class;
4449 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004451 if (!strcmp(name, "memo")) {
4452 if (!self->memo) {
4453 PyErr_SetString(PyExc_AttributeError, name);
4454 return NULL;
4455 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004456
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004457 Py_INCREF(self->memo);
4458 return self->memo;
4459 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004461 if (!strcmp(name, "UnpicklingError")) {
4462 Py_INCREF(UnpicklingError);
4463 return UnpicklingError;
4464 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004466 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004467}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004468
Guido van Rossum60456fd1997-04-09 17:36:32 +00004469
4470static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004471Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
4472{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004474 if (!strcmp(name, "persistent_load")) {
4475 Py_XDECREF(self->pers_func);
4476 self->pers_func = value;
4477 Py_XINCREF(value);
4478 return 0;
4479 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004481 if (!strcmp(name, "find_global")) {
4482 Py_XDECREF(self->find_class);
4483 self->find_class = value;
4484 Py_XINCREF(value);
4485 return 0;
4486 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004488 if (! value) {
4489 PyErr_SetString(PyExc_TypeError,
4490 "attribute deletion is not supported");
4491 return -1;
4492 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004494 if (strcmp(name, "memo") == 0) {
4495 if (!PyDict_Check(value)) {
4496 PyErr_SetString(PyExc_TypeError,
4497 "memo must be a dictionary");
4498 return -1;
4499 }
4500 Py_XDECREF(self->memo);
4501 self->memo = value;
4502 Py_INCREF(value);
4503 return 0;
4504 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004506 PyErr_SetString(PyExc_AttributeError, name);
4507 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004508}
4509
4510
4511static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004512cpm_dump(PyObject *self, PyObject *args)
4513{
4514 PyObject *ob, *file, *res = NULL;
4515 Picklerobject *pickler = 0;
4516 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004518 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin)))
4519 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004521 if (!( pickler = newPicklerobject(file, bin)))
4522 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004524 if (dump(pickler, ob) < 0)
4525 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004527 Py_INCREF(Py_None);
4528 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004530 finally:
4531 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004533 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004534}
4535
4536
4537static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004538cpm_dumps(PyObject *self, PyObject *args)
4539{
4540 PyObject *ob, *file = 0, *res = NULL;
4541 Picklerobject *pickler = 0;
4542 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004544 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin)))
4545 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004546
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004547 if (!( file = PycStringIO->NewOutput(128)))
4548 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004550 if (!( pickler = newPicklerobject(file, bin)))
4551 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004553 if (dump(pickler, ob) < 0)
4554 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004556 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004558 finally:
4559 Py_XDECREF(pickler);
4560 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004562 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004563}
4564
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004565
4566static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004567cpm_load(PyObject *self, PyObject *args)
4568{
4569 Unpicklerobject *unpickler = 0;
4570 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004571
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004572 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
4573 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004575 if (!( unpickler = newUnpicklerobject(ob)))
4576 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004578 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004580 finally:
4581 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004583 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004584}
4585
4586
4587static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004588cpm_loads(PyObject *self, PyObject *args)
4589{
4590 PyObject *ob, *file = 0, *res = NULL;
4591 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004592
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004593 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
4594 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004596 if (!( file = PycStringIO->NewInput(ob)))
4597 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004598
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004599 if (!( unpickler = newUnpicklerobject(file)))
4600 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004602 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004603
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004604 finally:
4605 Py_XDECREF(file);
4606 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004608 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004609}
4610
4611
Tim Peters84e87f32001-03-17 04:50:51 +00004612static char Unpicklertype__doc__[] =
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004613"Objects that know how to unpickle";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004614
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004615static PyTypeObject Unpicklertype = {
4616 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004617 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004618 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004619 sizeof(Unpicklerobject), /*tp_basicsize*/
4620 0, /*tp_itemsize*/
4621 /* methods */
4622 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4623 (printfunc)0, /*tp_print*/
4624 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4625 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4626 (cmpfunc)0, /*tp_compare*/
4627 (reprfunc)0, /*tp_repr*/
4628 0, /*tp_as_number*/
4629 0, /*tp_as_sequence*/
4630 0, /*tp_as_mapping*/
4631 (hashfunc)0, /*tp_hash*/
4632 (ternaryfunc)0, /*tp_call*/
4633 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004634
Guido van Rossum60456fd1997-04-09 17:36:32 +00004635 /* Space for future expansion */
4636 0L,0L,0L,0L,
4637 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004638};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004639
Guido van Rossum60456fd1997-04-09 17:36:32 +00004640static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004641 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004642 "dump(object, file, [binary]) --"
4643 "Write an object in pickle format to the given file\n"
4644 "\n"
4645 "If the optional argument, binary, is provided and is true, then the\n"
4646 "pickle will be written in binary format, which is more space and\n"
4647 "computationally efficient. \n"
4648 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004649 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004650 "dumps(object, [binary]) --"
4651 "Return a string containing an object in pickle format\n"
4652 "\n"
4653 "If the optional argument, binary, is provided and is true, then the\n"
4654 "pickle will be written in binary format, which is more space and\n"
4655 "computationally efficient. \n"
4656 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004657 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004658 "load(file) -- Load a pickle from the given file"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004659 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004660 "loads(string) -- Load a pickle from the given string"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004661 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004662 "Pickler(file, [binary]) -- Create a pickler\n"
4663 "\n"
4664 "If the optional argument, binary, is provided and is true, then\n"
4665 "pickles will be written in binary format, which is more space and\n"
4666 "computationally efficient. \n"
4667 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004668 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004669 "Unpickler(file) -- Create an unpickler"},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004670 { NULL, NULL }
4671};
4672
Guido van Rossum60456fd1997-04-09 17:36:32 +00004673static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004674init_stuff(PyObject *module_dict)
4675{
4676 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004677
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004678#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004680 INIT_STR(__class__);
4681 INIT_STR(__getinitargs__);
4682 INIT_STR(__dict__);
4683 INIT_STR(__getstate__);
4684 INIT_STR(__setstate__);
4685 INIT_STR(__name__);
4686 INIT_STR(__main__);
4687 INIT_STR(__reduce__);
4688 INIT_STR(write);
4689 INIT_STR(__safe_for_unpickling__);
4690 INIT_STR(append);
4691 INIT_STR(read);
4692 INIT_STR(readline);
4693 INIT_STR(copy_reg);
4694 INIT_STR(dispatch_table);
4695 INIT_STR(safe_constructors);
4696 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004698 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
4699 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004701 /* These next few are special because we want to use different
4702 ones in restricted mode. */
4703 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
4704 if (!dispatch_table)
4705 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004707 if (!( safe_constructors = PyObject_GetAttr(copy_reg,
4708 safe_constructors_str)))
4709 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004711 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004713 /* Down to here ********************************** */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004715 if (!( empty_tuple = PyTuple_New(0)))
4716 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004718 /* Ugh */
4719 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4720 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4721 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004723 if (!( t=PyDict_New())) return -1;
4724 if (!( r=PyRun_String(
4725 "def __init__(self, *args): self.args=args\n\n"
4726 "def __str__(self):\n"
4727 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4728 Py_file_input,
4729 module_dict, t) )) return -1;
4730 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004732 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
4733 if (!PickleError)
4734 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004736 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004738 PicklingError = PyErr_NewException("cPickle.PicklingError",
4739 PickleError, NULL);
4740 if (!PicklingError)
4741 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004743 if (!( t=PyDict_New())) return -1;
4744 if (!( r=PyRun_String(
4745 "def __init__(self, *args): self.args=args\n\n"
4746 "def __str__(self):\n"
4747 " a=self.args\n"
4748 " a=a and type(a[0]) or '(what)'\n"
4749 " return 'Cannot pickle %s objects' % a\n"
4750 , Py_file_input,
4751 module_dict, t) )) return -1;
4752 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004754 if (!( UnpickleableError = PyErr_NewException(
4755 "cPickle.UnpickleableError", PicklingError, t)))
4756 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004758 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004760 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
4761 PickleError, NULL)))
4762 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004764 if (PyDict_SetItemString(module_dict, "PickleError",
4765 PickleError) < 0)
4766 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004768 if (PyDict_SetItemString(module_dict, "PicklingError",
4769 PicklingError) < 0)
4770 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004772 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4773 UnpicklingError) < 0)
4774 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004776 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4777 UnpickleableError) < 0)
4778 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004780 if (!( BadPickleGet = PyString_FromString("cPickle.BadPickleGet")))
4781 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004783 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4784 BadPickleGet) < 0)
4785 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004787 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004789 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004790}
4791
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004792#ifndef DL_EXPORT /* declarations for DLL import/export */
4793#define DL_EXPORT(RTYPE) RTYPE
4794#endif
Guido van Rossum50f385c1998-12-04 18:48:44 +00004795DL_EXPORT(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004796initcPickle(void)
4797{
4798 PyObject *m, *d, *di, *v, *k;
4799 int i;
4800 char *rev="1.71";
4801 PyObject *format_version;
4802 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004804 Picklertype.ob_type = &PyType_Type;
4805 Picklertype.tp_getattro = PyObject_GenericGetAttr;
4806 Picklertype.tp_setattro = PyObject_GenericSetAttr;
4807 Unpicklertype.ob_type = &PyType_Type;
4808 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004810 /* Initialize some pieces. We need to do this before module creation,
4811 so we're forced to use a temporary dictionary. :(
4812 */
4813 di=PyDict_New();
4814 if (!di) return;
4815 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004817 /* Create the module and add the functions */
4818 m = Py_InitModule4("cPickle", cPickle_methods,
4819 cPickle_module_documentation,
4820 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004822 /* Add some symbolic constants to the module */
4823 d = PyModule_GetDict(m);
4824 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4825 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004827 /* Copy data from di. Waaa. */
4828 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4829 if (PyObject_SetItem(d, k, v) < 0) {
4830 Py_DECREF(di);
4831 return;
4832 }
4833 }
4834 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004836 format_version = PyString_FromString("1.3");
4837 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004839 PyDict_SetItemString(d, "format_version", format_version);
4840 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4841 Py_XDECREF(format_version);
4842 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004843}