blob: a6c5e9dc205fbd0e82fa7ecc0e0ad32025b63670 [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{
2123 if (!PyArg_ParseTuple(args,":clear_memo"))
2124 return NULL;
2125 if (self->memo)
2126 PyDict_Clear(self->memo);
2127 Py_INCREF(Py_None);
2128 return Py_None;
2129}
2130
2131static PyObject *
2132Pickle_getvalue(Picklerobject *self, PyObject *args)
2133{
2134 int l, i, rsize, ssize, clear=1, lm;
2135 long ik;
2136 PyObject *k, *r;
2137 char *s, *p, *have_get;
2138 Pdata *data;
2139
2140 /* Can be called by Python code or C code */
2141 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2142 return NULL;
2143
2144 /* Check to make sure we are based on a list */
2145 if (! Pdata_Check(self->file)) {
2146 PyErr_SetString(PicklingError,
2147 "Attempt to getvalue() a non-list-based pickler");
2148 return NULL;
2149 }
2150
2151 /* flush write buffer */
2152 if (write_other(self, NULL, 0) < 0) return NULL;
2153
2154 data=(Pdata*)self->file;
2155 l=data->length;
2156
2157 /* set up an array to hold get/put status */
2158 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2159 lm++;
2160 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2161 memset(have_get,0,lm);
2162
2163 /* Scan for gets. */
2164 for (rsize=0, i=l; --i >= 0; ) {
2165 k=data->data[i];
2166
2167 if (PyString_Check(k)) {
2168 rsize += PyString_GET_SIZE(k);
2169 }
2170
2171 else if (PyInt_Check(k)) { /* put */
2172 ik=PyInt_AS_LONG((PyIntObject*)k);
2173 if (ik >= lm || ik==0) {
2174 PyErr_SetString(PicklingError,
2175 "Invalid get data");
2176 return NULL;
2177 }
2178 if (have_get[ik]) { /* with matching get */
2179 if (ik < 256) rsize += 2;
2180 else rsize+=5;
2181 }
2182 }
2183
2184 else if (! (PyTuple_Check(k) &&
2185 PyTuple_GET_SIZE(k) == 2 &&
2186 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2187 ) {
2188 PyErr_SetString(PicklingError,
2189 "Unexpected data in internal list");
2190 return NULL;
2191 }
2192
2193 else { /* put */
2194 ik=PyInt_AS_LONG((PyIntObject*)k);
2195 if (ik >= lm || ik==0) {
2196 PyErr_SetString(PicklingError,
2197 "Invalid get data");
2198 return NULL;
2199 }
2200 have_get[ik]=1;
2201 if (ik < 256) rsize += 2;
2202 else rsize+=5;
2203 }
2204
2205 }
2206
2207 /* Now generate the result */
2208 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2209 s=PyString_AS_STRING((PyStringObject*)r);
2210
2211 for (i=0; i<l; i++) {
2212 k=data->data[i];
2213
2214 if (PyString_Check(k)) {
2215 ssize=PyString_GET_SIZE(k);
2216 if (ssize) {
2217 p=PyString_AS_STRING((PyStringObject*)k);
2218 while (--ssize >= 0) *s++=*p++;
2219 }
2220 }
2221
2222 else if (PyTuple_Check(k)) { /* get */
2223 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2224 if (ik < 256) {
2225 *s++ = BINGET;
2226 *s++ = (int)(ik & 0xff);
2227 }
2228 else {
2229 *s++ = LONG_BINGET;
2230 *s++ = (int)(ik & 0xff);
2231 *s++ = (int)((ik >> 8) & 0xff);
2232 *s++ = (int)((ik >> 16) & 0xff);
2233 *s++ = (int)((ik >> 24) & 0xff);
2234 }
2235 }
2236
2237 else { /* put */
2238 ik=PyInt_AS_LONG((PyIntObject*)k);
2239
2240 if (have_get[ik]) { /* with matching get */
2241 if (ik < 256) {
2242 *s++ = BINPUT;
2243 *s++ = (int)(ik & 0xff);
2244 }
2245 else {
2246 *s++ = LONG_BINPUT;
2247 *s++ = (int)(ik & 0xff);
2248 *s++ = (int)((ik >> 8) & 0xff);
2249 *s++ = (int)((ik >> 16) & 0xff);
2250 *s++ = (int)((ik >> 24) & 0xff);
2251 }
2252 }
2253 }
2254
2255 }
2256
2257 if (clear) {
2258 PyDict_Clear(self->memo);
2259 Pdata_clear(data,0);
2260 }
2261
2262 free(have_get);
2263 return r;
2264 err:
2265 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002266 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002267}
2268
2269static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002270Pickler_dump(Picklerobject *self, PyObject *args)
2271{
2272 PyObject *ob;
2273 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002275 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
2276 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002278 if (dump(self, ob) < 0)
2279 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002281 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002283 /* XXX Why does dump() return self? */
2284 Py_INCREF(self);
2285 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002286}
2287
2288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002289static struct PyMethodDef Pickler_methods[] =
2290{
Neal Norwitzb0493252002-03-31 14:44:22 +00002291 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002292 "dump(object) --"
2293 "Write an object in pickle format to the object's pickle stream\n"
2294 },
Neal Norwitzb0493252002-03-31 14:44:22 +00002295 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002296 "clear_memo() -- Clear the picklers memo"},
Neal Norwitzb0493252002-03-31 14:44:22 +00002297 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Guido van Rossum053b8df1998-11-25 16:18:00 +00002298 "getvalue() -- Finish picking a list-based pickle"},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002299 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002300};
2301
2302
2303static Picklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002304newPicklerobject(PyObject *file, int bin)
2305{
2306 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002308 if (!( self = PyObject_New(Picklerobject, &Picklertype)))
2309 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002311 self->fp = NULL;
2312 self->write = NULL;
2313 self->memo = NULL;
2314 self->arg = NULL;
2315 self->pers_func = NULL;
2316 self->inst_pers_func = NULL;
2317 self->write_buf = NULL;
2318 self->bin = bin;
2319 self->fast = 0;
2320 self->fast_container = 0;
2321 self->fast_memo = NULL;
2322 self->buf_size = 0;
2323 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002325 if (file)
2326 Py_INCREF(file);
2327 else
2328 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002330 if (!( self->file = file ))
2331 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002333 if (!( self->memo = PyDict_New()))
2334 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002336 if (PyFile_Check(file)) {
2337 self->fp = PyFile_AsFile(file);
2338 if (self->fp == NULL) {
2339 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2340 goto err;
2341 }
2342 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002343 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002344 else if (PycStringIO_OutputCheck(file)) {
2345 self->write_func = write_cStringIO;
2346 }
2347 else if (file == Py_None) {
2348 self->write_func = write_none;
2349 }
2350 else {
2351 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002353 if (! Pdata_Check(file)) {
2354 self->write = PyObject_GetAttr(file, write_str);
2355 if (!self->write) {
2356 PyErr_Clear();
2357 PyErr_SetString(PyExc_TypeError,
2358 "argument must have 'write' "
2359 "attribute");
2360 goto err;
2361 }
2362 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002364 if (!( self->write_buf =
2365 (char *)malloc(WRITE_BUF_SIZE * sizeof(char)))) {
2366 PyErr_NoMemory();
2367 goto err;
2368 }
2369 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002371 if (PyEval_GetRestricted()) {
2372 /* Restricted execution, get private tables */
2373 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002375 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2376 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2377 Py_DECREF(m);
2378 if (!( self->dispatch_table )) goto err;
2379 }
2380 else {
2381 self->dispatch_table=dispatch_table;
2382 Py_INCREF(dispatch_table);
2383 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002385 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002387 err:
2388 Py_DECREF((PyObject *)self);
2389 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002390}
2391
2392
2393static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002394get_Pickler(PyObject *self, PyObject *args)
2395{
2396 PyObject *file = NULL;
2397 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002399 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
2400 PyErr_Clear();
2401 bin = 0;
2402 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2403 return NULL;
2404 }
2405 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002406}
2407
2408
2409static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002410Pickler_dealloc(Picklerobject *self)
2411{
2412 Py_XDECREF(self->write);
2413 Py_XDECREF(self->memo);
2414 Py_XDECREF(self->fast_memo);
2415 Py_XDECREF(self->arg);
2416 Py_XDECREF(self->file);
2417 Py_XDECREF(self->pers_func);
2418 Py_XDECREF(self->inst_pers_func);
2419 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002421 if (self->write_buf) {
2422 free(self->write_buf);
2423 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002425 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002426}
2427
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002428static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002429Pickler_get_pers_func(Picklerobject *p)
2430{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002431 if (p->pers_func == NULL)
2432 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2433 else
2434 Py_INCREF(p->pers_func);
2435 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002436}
2437
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002438static int
2439Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2440{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002441 if (v == NULL) {
2442 PyErr_SetString(PyExc_TypeError,
2443 "attribute deletion is not supported");
2444 return -1;
2445 }
2446 Py_XDECREF(p->pers_func);
2447 Py_INCREF(v);
2448 p->pers_func = v;
2449 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002450}
2451
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002452static int
2453Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2454{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002455 if (v == NULL) {
2456 PyErr_SetString(PyExc_TypeError,
2457 "attribute deletion is not supported");
2458 return -1;
2459 }
2460 Py_XDECREF(p->inst_pers_func);
2461 Py_INCREF(v);
2462 p->inst_pers_func = v;
2463 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002464}
2465
2466static PyObject *
2467Pickler_get_memo(Picklerobject *p)
2468{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002469 if (p->memo == NULL)
2470 PyErr_SetString(PyExc_AttributeError, "memo");
2471 else
2472 Py_INCREF(p->memo);
2473 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002474}
2475
2476static int
2477Pickler_set_memo(Picklerobject *p, PyObject *v)
2478{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002479 if (v == NULL) {
2480 PyErr_SetString(PyExc_TypeError,
2481 "attribute deletion is not supported");
2482 return -1;
2483 }
2484 if (!PyDict_Check(v)) {
2485 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2486 return -1;
2487 }
2488 Py_XDECREF(p->memo);
2489 Py_INCREF(v);
2490 p->memo = v;
2491 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002492}
2493
2494static PyObject *
2495Pickler_get_error(Picklerobject *p)
2496{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002497 /* why is this an attribute on the Pickler? */
2498 Py_INCREF(PicklingError);
2499 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002500}
2501
2502static PyMemberDef Pickler_members[] = {
2503 {"binary", T_INT, offsetof(Picklerobject, bin)},
2504 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002505 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002506};
2507
2508static PyGetSetDef Pickler_getsets[] = {
2509 {"persistent_id", (getter)Pickler_get_pers_func,
2510 (setter)Pickler_set_pers_func},
2511 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2512 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002513 {"PicklingError", (getter)Pickler_get_error, NULL},
2514 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002515};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002516
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002517static char Picklertype__doc__[] =
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002518"Objects that know how to pickle objects\n";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002519
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002520static PyTypeObject Picklertype = {
2521 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002522 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002523 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002524 sizeof(Picklerobject), /*tp_basicsize*/
2525 0,
2526 (destructor)Pickler_dealloc, /* tp_dealloc */
2527 0, /* tp_print */
2528 0, /* tp_getattr */
2529 0, /* tp_setattr */
2530 0, /* tp_compare */
2531 0, /* tp_repr */
2532 0, /* tp_as_number */
2533 0, /* tp_as_sequence */
2534 0, /* tp_as_mapping */
2535 0, /* tp_hash */
2536 0, /* tp_call */
2537 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002538 0, /* set below */ /* tp_getattro */
2539 0, /* set below */ /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002540 0, /* tp_as_buffer */
2541 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2542 Picklertype__doc__, /* tp_doc */
2543 0, /* tp_traverse */
2544 0, /* tp_clear */
2545 0, /* tp_richcompare */
2546 0, /* tp_weaklistoffset */
2547 0, /* tp_iter */
2548 0, /* tp_iternext */
2549 Pickler_methods, /* tp_methods */
2550 Pickler_members, /* tp_members */
2551 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002552};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002553
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002554static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002555find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
2556{
2557 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002559 if (fc) {
2560 if (fc==Py_None) {
2561 PyErr_SetString(UnpicklingError,
2562 "Global and instance pickles are not supported.");
2563 return NULL;
2564 }
2565 return PyObject_CallFunction(fc, "OO", py_module_name,
2566 py_global_name);
2567 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002569 module = PySys_GetObject("modules");
2570 if (module == NULL)
2571 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002573 module = PyDict_GetItem(module, py_module_name);
2574 if (module == NULL) {
2575 module = PyImport_Import(py_module_name);
2576 if (!module)
2577 return NULL;
2578 global = PyObject_GetAttr(module, py_global_name);
2579 Py_DECREF(module);
2580 }
2581 else
2582 global = PyObject_GetAttr(module, py_global_name);
2583 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002584}
2585
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002586static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002587marker(Unpicklerobject *self)
2588{
2589 if (self->num_marks < 1) {
2590 PyErr_SetString(UnpicklingError, "could not find MARK");
2591 return -1;
2592 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002594 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002595}
2596
Tim Peters84e87f32001-03-17 04:50:51 +00002597
Guido van Rossum60456fd1997-04-09 17:36:32 +00002598static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002599load_none(Unpicklerobject *self)
2600{
2601 PDATA_APPEND(self->stack, Py_None, -1);
2602 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002603}
2604
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002605static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002606bad_readline(void)
2607{
2608 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2609 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002610}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002611
2612static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002613load_int(Unpicklerobject *self)
2614{
2615 PyObject *py_int = 0;
2616 char *endptr, *s;
2617 int len, res = -1;
2618 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002619
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002620 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2621 if (len < 2) return bad_readline();
2622 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002624 errno = 0;
2625 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002627 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2628 /* Hm, maybe we've got something long. Let's try reading
2629 it as a Python long object. */
2630 errno = 0;
2631 py_int = PyLong_FromString(s, NULL, 0);
2632 if (py_int == NULL) {
2633 PyErr_SetString(PyExc_ValueError,
2634 "could not convert string to int");
2635 goto finally;
2636 }
2637 }
2638 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002639 if (len == 3 && (l == 0 || l == 1)) {
2640 if (!( py_int = PyBool_FromLong(l))) goto finally;
2641 }
2642 else {
2643 if (!( py_int = PyInt_FromLong(l))) goto finally;
2644 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002645 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002647 free(s);
2648 PDATA_PUSH(self->stack, py_int, -1);
2649 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002651 finally:
2652 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002654 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002655}
2656
2657
Tim Peters84e87f32001-03-17 04:50:51 +00002658static long
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002659calc_binint(char *s, int x)
2660{
2661 unsigned char c;
2662 int i;
2663 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002665 for (i = 0, l = 0L; i < x; i++) {
2666 c = (unsigned char)s[i];
2667 l |= (long)c << (i * 8);
2668 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002669#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002670 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2671 * is signed, so on a box with longs bigger than 4 bytes we need
2672 * to extend a BININT's sign bit to the full width.
2673 */
2674 if (x == 4 && l & (1L << 31))
2675 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002676#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002677 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002678}
2679
2680
2681static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002682load_binintx(Unpicklerobject *self, char *s, int x)
2683{
2684 PyObject *py_int = 0;
2685 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002687 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002689 if (!( py_int = PyInt_FromLong(l)))
2690 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002692 PDATA_PUSH(self->stack, py_int, -1);
2693 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002694}
2695
2696
2697static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002698load_binint(Unpicklerobject *self)
2699{
2700 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002702 if ((*self->read_func)(self, &s, 4) < 0)
2703 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002705 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002706}
2707
2708
2709static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002710load_binint1(Unpicklerobject *self)
2711{
2712 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002714 if ((*self->read_func)(self, &s, 1) < 0)
2715 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002717 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002718}
2719
2720
2721static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002722load_binint2(Unpicklerobject *self)
2723{
2724 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002726 if ((*self->read_func)(self, &s, 2) < 0)
2727 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002728
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002729 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002730}
Tim Peters84e87f32001-03-17 04:50:51 +00002731
Guido van Rossum60456fd1997-04-09 17:36:32 +00002732static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002733load_long(Unpicklerobject *self)
2734{
2735 PyObject *l = 0;
2736 char *end, *s;
2737 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002739 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2740 if (len < 2) return bad_readline();
2741 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002743 if (!( l = PyLong_FromString(s, &end, 0)))
2744 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002746 free(s);
2747 PDATA_PUSH(self->stack, l, -1);
2748 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002750 finally:
2751 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002753 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002754}
2755
Tim Peters84e87f32001-03-17 04:50:51 +00002756
Guido van Rossum60456fd1997-04-09 17:36:32 +00002757static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002758load_float(Unpicklerobject *self)
2759{
2760 PyObject *py_float = 0;
2761 char *endptr, *s;
2762 int len, res = -1;
2763 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002765 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2766 if (len < 2) return bad_readline();
2767 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002769 errno = 0;
2770 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002772 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2773 PyErr_SetString(PyExc_ValueError,
2774 "could not convert string to float");
2775 goto finally;
2776 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002778 if (!( py_float = PyFloat_FromDouble(d)))
2779 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002781 free(s);
2782 PDATA_PUSH(self->stack, py_float, -1);
2783 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002785 finally:
2786 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002788 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002789}
2790
Guido van Rossum60456fd1997-04-09 17:36:32 +00002791static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002792load_binfloat(Unpicklerobject *self)
2793{
2794 PyObject *py_float = 0;
2795 int s, e;
2796 long fhi, flo;
2797 double x;
2798 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002800 if ((*self->read_func)(self, &p, 8) < 0)
2801 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002803 /* First byte */
2804 s = (*p>>7) & 1;
2805 e = (*p & 0x7F) << 4;
2806 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002808 /* Second byte */
2809 e |= (*p>>4) & 0xF;
2810 fhi = (*p & 0xF) << 24;
2811 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002813 /* Third byte */
2814 fhi |= (*p & 0xFF) << 16;
2815 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002817 /* Fourth byte */
2818 fhi |= (*p & 0xFF) << 8;
2819 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002821 /* Fifth byte */
2822 fhi |= *p & 0xFF;
2823 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002825 /* Sixth byte */
2826 flo = (*p & 0xFF) << 16;
2827 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002829 /* Seventh byte */
2830 flo |= (*p & 0xFF) << 8;
2831 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002833 /* Eighth byte */
2834 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002836 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2837 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002839 /* XXX This sadly ignores Inf/NaN */
2840 if (e == 0)
2841 e = -1022;
2842 else {
2843 x += 1.0;
2844 e -= 1023;
2845 }
2846 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002848 if (s)
2849 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002851 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002853 PDATA_PUSH(self->stack, py_float, -1);
2854 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002855}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002856
2857static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002858load_string(Unpicklerobject *self)
2859{
2860 PyObject *str = 0;
2861 int len, res = -1, nslash;
2862 char *s, q, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002864 static PyObject *eval_dict = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002866 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2867 if (len < 2) return bad_readline();
2868 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002870 /* Check for unquoted quotes (evil strings) */
2871 q=*s;
2872 if (q != '"' && q != '\'') goto insecure;
2873 for (p=s+1, nslash=0; *p; p++) {
2874 if (*p==q && nslash%2==0) break;
2875 if (*p=='\\') nslash++;
2876 else nslash=0;
2877 }
2878 if (*p == q) {
2879 for (p++; *p; p++)
2880 if (*(unsigned char *)p > ' ')
2881 goto insecure;
2882 }
2883 else
2884 goto insecure;
2885 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002887 if (!( eval_dict ))
2888 if (!( eval_dict = Py_BuildValue("{s{}}", "__builtins__")))
2889 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002891 if (!( str = PyRun_String(s, Py_eval_input, eval_dict, eval_dict)))
2892 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002894 free(s);
2895 PDATA_PUSH(self->stack, str, -1);
2896 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002898 finally:
2899 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002901 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002902
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002903 insecure:
2904 free(s);
2905 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2906 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002907}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002908
2909
2910static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002911load_binstring(Unpicklerobject *self)
2912{
2913 PyObject *py_string = 0;
2914 long l;
2915 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002916
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002917 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002919 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002921 if ((*self->read_func)(self, &s, l) < 0)
2922 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002924 if (!( py_string = PyString_FromStringAndSize(s, l)))
2925 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002926
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002927 PDATA_PUSH(self->stack, py_string, -1);
2928 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002929}
2930
2931
2932static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002933load_short_binstring(Unpicklerobject *self)
2934{
2935 PyObject *py_string = 0;
2936 unsigned char l;
2937 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002939 if ((*self->read_func)(self, &s, 1) < 0)
2940 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002942 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002944 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002946 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002948 PDATA_PUSH(self->stack, py_string, -1);
2949 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002950}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002951
2952
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002953#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002954static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002955load_unicode(Unpicklerobject *self)
2956{
2957 PyObject *str = 0;
2958 int len, res = -1;
2959 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002961 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2962 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002964 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
2965 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002967 PDATA_PUSH(self->stack, str, -1);
2968 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002970 finally:
2971 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002972}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002973#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002974
2975
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002976#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002977static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002978load_binunicode(Unpicklerobject *self)
2979{
2980 PyObject *unicode;
2981 long l;
2982 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002984 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002986 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002988 if ((*self->read_func)(self, &s, l) < 0)
2989 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002991 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
2992 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002994 PDATA_PUSH(self->stack, unicode, -1);
2995 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002996}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002997#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002998
2999
3000static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003001load_tuple(Unpicklerobject *self)
3002{
3003 PyObject *tup;
3004 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003005
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003006 if ((i = marker(self)) < 0) return -1;
3007 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3008 PDATA_PUSH(self->stack, tup, -1);
3009 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003010}
3011
3012static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003013load_empty_tuple(Unpicklerobject *self)
3014{
3015 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003017 if (!( tup=PyTuple_New(0))) return -1;
3018 PDATA_PUSH(self->stack, tup, -1);
3019 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003020}
3021
3022static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003023load_empty_list(Unpicklerobject *self)
3024{
3025 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003027 if (!( list=PyList_New(0))) return -1;
3028 PDATA_PUSH(self->stack, list, -1);
3029 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003030}
3031
3032static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003033load_empty_dict(Unpicklerobject *self)
3034{
3035 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003036
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003037 if (!( dict=PyDict_New())) return -1;
3038 PDATA_PUSH(self->stack, dict, -1);
3039 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003040}
3041
3042
3043static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003044load_list(Unpicklerobject *self)
3045{
3046 PyObject *list = 0;
3047 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003049 if ((i = marker(self)) < 0) return -1;
3050 if (!( list=Pdata_popList(self->stack, i))) return -1;
3051 PDATA_PUSH(self->stack, list, -1);
3052 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003053}
3054
3055static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003056load_dict(Unpicklerobject *self)
3057{
3058 PyObject *dict, *key, *value;
3059 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003061 if ((i = marker(self)) < 0) return -1;
3062 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003064 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003066 for (k = i+1; k < j; k += 2) {
3067 key =self->stack->data[k-1];
3068 value=self->stack->data[k ];
3069 if (PyDict_SetItem(dict, key, value) < 0) {
3070 Py_DECREF(dict);
3071 return -1;
3072 }
3073 }
3074 Pdata_clear(self->stack, i);
3075 PDATA_PUSH(self->stack, dict, -1);
3076 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003077}
3078
3079static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003080Instance_New(PyObject *cls, PyObject *args)
3081{
3082 int has_key;
3083 PyObject *safe=0, *r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003085 if (PyClass_Check(cls)) {
3086 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003088 if ((l=PyObject_Size(args)) < 0) goto err;
3089 if (!( l )) {
3090 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003092 __getinitargs__ = PyObject_GetAttr(cls,
3093 __getinitargs___str);
3094 if (!__getinitargs__) {
3095 /* We have a class with no __getinitargs__,
3096 so bypass usual construction */
3097 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003099 PyErr_Clear();
3100 if (!( inst=PyInstance_NewRaw(cls, NULL)))
3101 goto err;
3102 return inst;
3103 }
3104 Py_DECREF(__getinitargs__);
3105 }
Tim Peters84e87f32001-03-17 04:50:51 +00003106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003107 if ((r=PyInstance_New(cls, args, NULL))) return r;
3108 else goto err;
3109 }
Tim Peters84e87f32001-03-17 04:50:51 +00003110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003111 /* Is safe_constructors always a dict? */
3112 has_key = cPickle_PyMapping_HasKey(safe_constructors, cls);
3113 if (!has_key) {
3114 safe = PyObject_GetAttr(cls, __safe_for_unpickling___str);
3115 if (!safe ||
3116 !PyObject_IsTrue(safe)) {
3117 cPickle_ErrFormat(UnpicklingError,
3118 "%s is not safe for unpickling",
3119 "O", cls);
3120 Py_XDECREF(safe);
3121 return NULL;
3122 }
3123 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003125 if (args==Py_None) {
3126 /* Special case, call cls.__basicnew__() */
3127 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003129 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3130 if (!basicnew) return NULL;
3131 r=PyObject_CallObject(basicnew, NULL);
3132 Py_DECREF(basicnew);
3133 if (r) return r;
3134 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003136 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003138 err:
3139 {
3140 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003142 PyErr_Fetch(&tp, &v, &tb);
3143 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3144 Py_XDECREF(v);
3145 v=r;
3146 }
3147 PyErr_Restore(tp,v,tb);
3148 }
3149 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003150}
Tim Peters84e87f32001-03-17 04:50:51 +00003151
Guido van Rossum60456fd1997-04-09 17:36:32 +00003152
3153static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003154load_obj(Unpicklerobject *self)
3155{
3156 PyObject *class, *tup, *obj=0;
3157 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003159 if ((i = marker(self)) < 0) return -1;
3160 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3161 PDATA_POP(self->stack, class);
3162 if (class) {
3163 obj = Instance_New(class, tup);
3164 Py_DECREF(class);
3165 }
3166 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003168 if (! obj) return -1;
3169 PDATA_PUSH(self->stack, obj, -1);
3170 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003171}
3172
3173
3174static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003175load_inst(Unpicklerobject *self)
3176{
3177 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3178 int i, len;
3179 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003181 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003183 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3184 if (len < 2) return bad_readline();
3185 module_name = PyString_FromStringAndSize(s, len - 1);
3186 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003188 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3189 if (len < 2) return bad_readline();
3190 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3191 class = find_class(module_name, class_name,
3192 self->find_class);
3193 Py_DECREF(class_name);
3194 }
3195 }
3196 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003198 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003200 if ((tup=Pdata_popTuple(self->stack, i))) {
3201 obj = Instance_New(class, tup);
3202 Py_DECREF(tup);
3203 }
3204 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003206 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003208 PDATA_PUSH(self->stack, obj, -1);
3209 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003210}
3211
3212
3213static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003214load_global(Unpicklerobject *self)
3215{
3216 PyObject *class = 0, *module_name = 0, *class_name = 0;
3217 int len;
3218 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003220 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3221 if (len < 2) return bad_readline();
3222 module_name = PyString_FromStringAndSize(s, len - 1);
3223 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003225 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3226 if (len < 2) return bad_readline();
3227 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3228 class = find_class(module_name, class_name,
3229 self->find_class);
3230 Py_DECREF(class_name);
3231 }
3232 }
3233 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003235 if (! class) return -1;
3236 PDATA_PUSH(self->stack, class, -1);
3237 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003238}
3239
3240
3241static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003242load_persid(Unpicklerobject *self)
3243{
3244 PyObject *pid = 0;
3245 int len;
3246 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003248 if (self->pers_func) {
3249 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3250 if (len < 2) return bad_readline();
3251
3252 pid = PyString_FromStringAndSize(s, len - 1);
3253 if (!pid) return -1;
3254
3255 if (PyList_Check(self->pers_func)) {
3256 if (PyList_Append(self->pers_func, pid) < 0) {
3257 Py_DECREF(pid);
3258 return -1;
3259 }
3260 }
3261 else {
3262 ARG_TUP(self, pid);
3263 if (self->arg) {
3264 pid = PyObject_Call(self->pers_func, self->arg,
3265 NULL);
3266 FREE_ARG_TUP(self);
3267 }
3268 }
3269
3270 if (! pid) return -1;
3271
3272 PDATA_PUSH(self->stack, pid, -1);
3273 return 0;
3274 }
3275 else {
3276 PyErr_SetString(UnpicklingError,
3277 "A load persistent id instruction was encountered,\n"
3278 "but no persistent_load function was specified.");
3279 return -1;
3280 }
3281}
3282
3283static int
3284load_binpersid(Unpicklerobject *self)
3285{
3286 PyObject *pid = 0;
3287
3288 if (self->pers_func) {
3289 PDATA_POP(self->stack, pid);
3290 if (! pid) return -1;
3291
3292 if (PyList_Check(self->pers_func)) {
3293 if (PyList_Append(self->pers_func, pid) < 0) {
3294 Py_DECREF(pid);
3295 return -1;
3296 }
3297 }
3298 else {
3299 ARG_TUP(self, pid);
3300 if (self->arg) {
3301 pid = PyObject_Call(self->pers_func, self->arg,
3302 NULL);
3303 FREE_ARG_TUP(self);
3304 }
3305 if (! pid) return -1;
3306 }
3307
3308 PDATA_PUSH(self->stack, pid, -1);
3309 return 0;
3310 }
3311 else {
3312 PyErr_SetString(UnpicklingError,
3313 "A load persistent id instruction was encountered,\n"
3314 "but no persistent_load function was specified.");
3315 return -1;
3316 }
3317}
3318
3319
3320static int
3321load_pop(Unpicklerobject *self)
3322{
3323 int len;
3324
3325 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3326
3327 /* Note that we split the (pickle.py) stack into two stacks,
3328 an object stack and a mark stack. We have to be clever and
3329 pop the right one. We do this by looking at the top of the
3330 mark stack.
3331 */
3332
3333 if ((self->num_marks > 0) &&
3334 (self->marks[self->num_marks - 1] == len))
3335 self->num_marks--;
3336 else {
3337 len--;
3338 Py_DECREF(self->stack->data[len]);
3339 self->stack->length=len;
3340 }
3341
3342 return 0;
3343}
3344
3345
3346static int
3347load_pop_mark(Unpicklerobject *self)
3348{
3349 int i;
3350
3351 if ((i = marker(self)) < 0)
3352 return -1;
3353
3354 Pdata_clear(self->stack, i);
3355
3356 return 0;
3357}
3358
3359
3360static int
3361load_dup(Unpicklerobject *self)
3362{
3363 PyObject *last;
3364 int len;
3365
3366 if ((len = self->stack->length) <= 0) return stackUnderflow();
3367 last=self->stack->data[len-1];
3368 Py_INCREF(last);
3369 PDATA_PUSH(self->stack, last, -1);
3370 return 0;
3371}
3372
3373
3374static int
3375load_get(Unpicklerobject *self)
3376{
3377 PyObject *py_str = 0, *value = 0;
3378 int len;
3379 char *s;
3380 int rc;
3381
3382 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003383 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003385 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003387 value = PyDict_GetItem(self->memo, py_str);
3388 if (! value) {
3389 PyErr_SetObject(BadPickleGet, py_str);
3390 rc = -1;
3391 } else {
3392 PDATA_APPEND(self->stack, value, -1);
3393 rc = 0;
3394 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003396 Py_DECREF(py_str);
3397 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003398}
3399
3400
3401static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003402load_binget(Unpicklerobject *self)
3403{
3404 PyObject *py_key = 0, *value = 0;
3405 unsigned char key;
3406 char *s;
3407 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003409 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003411 key = (unsigned char)s[0];
3412 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003413
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003414 value = PyDict_GetItem(self->memo, py_key);
3415 if (! value) {
3416 PyErr_SetObject(BadPickleGet, py_key);
3417 rc = -1;
3418 } else {
3419 PDATA_APPEND(self->stack, value, -1);
3420 rc = 0;
3421 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003423 Py_DECREF(py_key);
3424 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003425}
3426
3427
3428static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003429load_long_binget(Unpicklerobject *self)
3430{
3431 PyObject *py_key = 0, *value = 0;
3432 unsigned char c;
3433 char *s;
3434 long key;
3435 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003437 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003439 c = (unsigned char)s[0];
3440 key = (long)c;
3441 c = (unsigned char)s[1];
3442 key |= (long)c << 8;
3443 c = (unsigned char)s[2];
3444 key |= (long)c << 16;
3445 c = (unsigned char)s[3];
3446 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003448 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3449
3450 value = PyDict_GetItem(self->memo, py_key);
3451 if (! value) {
3452 PyErr_SetObject(BadPickleGet, py_key);
3453 rc = -1;
3454 } else {
3455 PDATA_APPEND(self->stack, value, -1);
3456 rc = 0;
3457 }
3458
3459 Py_DECREF(py_key);
3460 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003461}
3462
3463
3464static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003465load_put(Unpicklerobject *self)
3466{
3467 PyObject *py_str = 0, *value = 0;
3468 int len, l;
3469 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003471 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3472 if (l < 2) return bad_readline();
3473 if (!( len=self->stack->length )) return stackUnderflow();
3474 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3475 value=self->stack->data[len-1];
3476 l=PyDict_SetItem(self->memo, py_str, value);
3477 Py_DECREF(py_str);
3478 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003479}
3480
3481
3482static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003483load_binput(Unpicklerobject *self)
3484{
3485 PyObject *py_key = 0, *value = 0;
3486 unsigned char key;
3487 char *s;
3488 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003490 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3491 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003493 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003495 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3496 value=self->stack->data[len-1];
3497 len=PyDict_SetItem(self->memo, py_key, value);
3498 Py_DECREF(py_key);
3499 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003500}
3501
3502
3503static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003504load_long_binput(Unpicklerobject *self)
3505{
3506 PyObject *py_key = 0, *value = 0;
3507 long key;
3508 unsigned char c;
3509 char *s;
3510 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003512 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3513 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003515 c = (unsigned char)s[0];
3516 key = (long)c;
3517 c = (unsigned char)s[1];
3518 key |= (long)c << 8;
3519 c = (unsigned char)s[2];
3520 key |= (long)c << 16;
3521 c = (unsigned char)s[3];
3522 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003524 if (!( py_key = PyInt_FromLong(key))) return -1;
3525 value=self->stack->data[len-1];
3526 len=PyDict_SetItem(self->memo, py_key, value);
3527 Py_DECREF(py_key);
3528 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003529}
3530
3531
3532static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003533do_append(Unpicklerobject *self, int x)
3534{
3535 PyObject *value = 0, *list = 0, *append_method = 0;
3536 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003538 len=self->stack->length;
3539 if (!( len >= x && x > 0 )) return stackUnderflow();
3540 /* nothing to do */
3541 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003543 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003545 if (PyList_Check(list)) {
3546 PyObject *slice;
3547 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003549 slice=Pdata_popList(self->stack, x);
3550 list_len = PyList_GET_SIZE(list);
3551 i=PyList_SetSlice(list, list_len, list_len, slice);
3552 Py_DECREF(slice);
3553 return i;
3554 }
3555 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003557 if (!( append_method = PyObject_GetAttr(list, append_str)))
3558 return -1;
3559
3560 for (i = x; i < len; i++) {
3561 PyObject *junk;
3562
3563 value=self->stack->data[i];
3564 junk=0;
3565 ARG_TUP(self, value);
3566 if (self->arg) {
3567 junk = PyObject_Call(append_method, self->arg,
3568 NULL);
3569 FREE_ARG_TUP(self);
3570 }
3571 if (! junk) {
3572 Pdata_clear(self->stack, i+1);
3573 self->stack->length=x;
3574 Py_DECREF(append_method);
3575 return -1;
3576 }
3577 Py_DECREF(junk);
3578 }
3579 self->stack->length=x;
3580 Py_DECREF(append_method);
3581 }
3582
3583 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003584}
3585
3586
3587static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003588load_append(Unpicklerobject *self)
3589{
3590 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003591}
3592
3593
3594static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003595load_appends(Unpicklerobject *self)
3596{
3597 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003598}
3599
3600
3601static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003602do_setitems(Unpicklerobject *self, int x)
3603{
3604 PyObject *value = 0, *key = 0, *dict = 0;
3605 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003607 if (!( (len=self->stack->length) >= x
3608 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003610 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003612 for (i = x+1; i < len; i += 2) {
3613 key =self->stack->data[i-1];
3614 value=self->stack->data[i ];
3615 if (PyObject_SetItem(dict, key, value) < 0) {
3616 r=-1;
3617 break;
3618 }
3619 }
3620
3621 Pdata_clear(self->stack, x);
3622
3623 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003624}
3625
3626
Tim Peters84e87f32001-03-17 04:50:51 +00003627static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003628load_setitem(Unpicklerobject *self)
3629{
3630 return do_setitems(self, self->stack->length - 2);
3631}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003633static int
3634load_setitems(Unpicklerobject *self)
3635{
3636 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003637}
3638
Tim Peters84e87f32001-03-17 04:50:51 +00003639
Guido van Rossum60456fd1997-04-09 17:36:32 +00003640static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003641load_build(Unpicklerobject *self)
3642{
3643 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3644 *junk = 0, *__setstate__ = 0;
3645 int i, r = 0;
3646
3647 if (self->stack->length < 2) return stackUnderflow();
3648 PDATA_POP(self->stack, value);
3649 if (! value) return -1;
3650 inst=self->stack->data[self->stack->length-1];
3651
3652 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3653 ARG_TUP(self, value);
3654 if (self->arg) {
3655 junk = PyObject_Call(__setstate__, self->arg, NULL);
3656 FREE_ARG_TUP(self);
3657 }
3658 Py_DECREF(__setstate__);
3659 if (! junk) return -1;
3660 Py_DECREF(junk);
3661 return 0;
3662 }
3663
3664 PyErr_Clear();
3665 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3666 i = 0;
3667 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3668 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3669 r=-1;
3670 break;
3671 }
3672 }
3673 Py_DECREF(instdict);
3674 }
3675 else r=-1;
3676
3677 Py_XDECREF(value);
3678
3679 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003680}
3681
3682
3683static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003684load_mark(Unpicklerobject *self)
3685{
3686 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003687
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003688 /* Note that we split the (pickle.py) stack into two stacks, an
3689 object stack and a mark stack. Here we push a mark onto the
3690 mark stack.
3691 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003693 if ((self->num_marks + 1) >= self->marks_size) {
3694 s=self->marks_size+20;
3695 if (s <= self->num_marks) s=self->num_marks + 1;
3696 if (self->marks == NULL)
3697 self->marks=(int *)malloc(s * sizeof(int));
3698 else
3699 self->marks=(int *)realloc(self->marks,
3700 s * sizeof(int));
3701 if (! self->marks) {
3702 PyErr_NoMemory();
3703 return -1;
3704 }
3705 self->marks_size = s;
3706 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003708 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003710 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003711}
3712
Guido van Rossum60456fd1997-04-09 17:36:32 +00003713static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003714load_reduce(Unpicklerobject *self)
3715{
3716 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003718 PDATA_POP(self->stack, arg_tup);
3719 if (! arg_tup) return -1;
3720 PDATA_POP(self->stack, callable);
3721 if (callable) {
3722 ob = Instance_New(callable, arg_tup);
3723 Py_DECREF(callable);
3724 }
3725 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003727 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003728
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003729 PDATA_PUSH(self->stack, ob, -1);
3730 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003731}
Tim Peters84e87f32001-03-17 04:50:51 +00003732
Guido van Rossum60456fd1997-04-09 17:36:32 +00003733static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003734load(Unpicklerobject *self)
3735{
3736 PyObject *err = 0, *val = 0;
3737 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003739 self->num_marks = 0;
3740 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003742 while (1) {
3743 if ((*self->read_func)(self, &s, 1) < 0)
3744 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003746 switch (s[0]) {
3747 case NONE:
3748 if (load_none(self) < 0)
3749 break;
3750 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003752 case BININT:
3753 if (load_binint(self) < 0)
3754 break;
3755 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003757 case BININT1:
3758 if (load_binint1(self) < 0)
3759 break;
3760 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762 case BININT2:
3763 if (load_binint2(self) < 0)
3764 break;
3765 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003767 case INT:
3768 if (load_int(self) < 0)
3769 break;
3770 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003772 case LONG:
3773 if (load_long(self) < 0)
3774 break;
3775 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003777 case FLOAT:
3778 if (load_float(self) < 0)
3779 break;
3780 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003782 case BINFLOAT:
3783 if (load_binfloat(self) < 0)
3784 break;
3785 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003787 case BINSTRING:
3788 if (load_binstring(self) < 0)
3789 break;
3790 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003792 case SHORT_BINSTRING:
3793 if (load_short_binstring(self) < 0)
3794 break;
3795 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003797 case STRING:
3798 if (load_string(self) < 0)
3799 break;
3800 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003801
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003802#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003803 case UNICODE:
3804 if (load_unicode(self) < 0)
3805 break;
3806 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003808 case BINUNICODE:
3809 if (load_binunicode(self) < 0)
3810 break;
3811 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003812#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003814 case EMPTY_TUPLE:
3815 if (load_empty_tuple(self) < 0)
3816 break;
3817 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003819 case TUPLE:
3820 if (load_tuple(self) < 0)
3821 break;
3822 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003824 case EMPTY_LIST:
3825 if (load_empty_list(self) < 0)
3826 break;
3827 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003829 case LIST:
3830 if (load_list(self) < 0)
3831 break;
3832 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003834 case EMPTY_DICT:
3835 if (load_empty_dict(self) < 0)
3836 break;
3837 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003839 case DICT:
3840 if (load_dict(self) < 0)
3841 break;
3842 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003844 case OBJ:
3845 if (load_obj(self) < 0)
3846 break;
3847 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003849 case INST:
3850 if (load_inst(self) < 0)
3851 break;
3852 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003854 case GLOBAL:
3855 if (load_global(self) < 0)
3856 break;
3857 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003859 case APPEND:
3860 if (load_append(self) < 0)
3861 break;
3862 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003864 case APPENDS:
3865 if (load_appends(self) < 0)
3866 break;
3867 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003869 case BUILD:
3870 if (load_build(self) < 0)
3871 break;
3872 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003874 case DUP:
3875 if (load_dup(self) < 0)
3876 break;
3877 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003879 case BINGET:
3880 if (load_binget(self) < 0)
3881 break;
3882 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003884 case LONG_BINGET:
3885 if (load_long_binget(self) < 0)
3886 break;
3887 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003889 case GET:
3890 if (load_get(self) < 0)
3891 break;
3892 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003894 case MARK:
3895 if (load_mark(self) < 0)
3896 break;
3897 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003898
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003899 case BINPUT:
3900 if (load_binput(self) < 0)
3901 break;
3902 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003904 case LONG_BINPUT:
3905 if (load_long_binput(self) < 0)
3906 break;
3907 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003908
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003909 case PUT:
3910 if (load_put(self) < 0)
3911 break;
3912 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003914 case POP:
3915 if (load_pop(self) < 0)
3916 break;
3917 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003919 case POP_MARK:
3920 if (load_pop_mark(self) < 0)
3921 break;
3922 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003924 case SETITEM:
3925 if (load_setitem(self) < 0)
3926 break;
3927 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003929 case SETITEMS:
3930 if (load_setitems(self) < 0)
3931 break;
3932 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003934 case STOP:
3935 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003937 case PERSID:
3938 if (load_persid(self) < 0)
3939 break;
3940 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003942 case BINPERSID:
3943 if (load_binpersid(self) < 0)
3944 break;
3945 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003947 case REDUCE:
3948 if (load_reduce(self) < 0)
3949 break;
3950 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003952 case '\0':
3953 /* end of file */
3954 PyErr_SetNone(PyExc_EOFError);
3955 break;
Neil Schemenauerfa79c652002-03-22 23:02:53 +00003956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003957 default:
3958 cPickle_ErrFormat(UnpicklingError,
3959 "invalid load key, '%s'.",
3960 "c", s[0]);
3961 return NULL;
3962 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003964 break;
3965 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003967 if ((err = PyErr_Occurred())) {
3968 if (err == PyExc_EOFError) {
3969 PyErr_SetNone(PyExc_EOFError);
3970 }
3971 return NULL;
3972 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003973
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003974 PDATA_POP(self->stack, val);
3975 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003976}
Tim Peters84e87f32001-03-17 04:50:51 +00003977
Guido van Rossum60456fd1997-04-09 17:36:32 +00003978
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003979/* No-load functions to support noload, which is used to
3980 find persistent references. */
3981
3982static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003983noload_obj(Unpicklerobject *self)
3984{
3985 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003987 if ((i = marker(self)) < 0) return -1;
3988 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003989}
3990
3991
3992static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003993noload_inst(Unpicklerobject *self)
3994{
3995 int i;
3996 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003998 if ((i = marker(self)) < 0) return -1;
3999 Pdata_clear(self->stack, i);
4000 if ((*self->readline_func)(self, &s) < 0) return -1;
4001 if ((*self->readline_func)(self, &s) < 0) return -1;
4002 PDATA_APPEND(self->stack, Py_None,-1);
4003 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004004}
4005
4006static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004007noload_global(Unpicklerobject *self)
4008{
4009 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004011 if ((*self->readline_func)(self, &s) < 0) return -1;
4012 if ((*self->readline_func)(self, &s) < 0) return -1;
4013 PDATA_APPEND(self->stack, Py_None,-1);
4014 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004015}
4016
4017static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004018noload_reduce(Unpicklerobject *self)
4019{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004021 if (self->stack->length < 2) return stackUnderflow();
4022 Pdata_clear(self->stack, self->stack->length-2);
4023 PDATA_APPEND(self->stack, Py_None,-1);
4024 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004025}
4026
4027static int
4028noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004029
Guido van Rossum053b8df1998-11-25 16:18:00 +00004030 if (self->stack->length < 1) return stackUnderflow();
4031 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004032 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004033}
4034
4035
4036static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004037noload(Unpicklerobject *self)
4038{
4039 PyObject *err = 0, *val = 0;
4040 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004042 self->num_marks = 0;
4043 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004045 while (1) {
4046 if ((*self->read_func)(self, &s, 1) < 0)
4047 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004049 switch (s[0]) {
4050 case NONE:
4051 if (load_none(self) < 0)
4052 break;
4053 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004055 case BININT:
4056 if (load_binint(self) < 0)
4057 break;
4058 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004060 case BININT1:
4061 if (load_binint1(self) < 0)
4062 break;
4063 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004065 case BININT2:
4066 if (load_binint2(self) < 0)
4067 break;
4068 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004070 case INT:
4071 if (load_int(self) < 0)
4072 break;
4073 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004075 case LONG:
4076 if (load_long(self) < 0)
4077 break;
4078 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004080 case FLOAT:
4081 if (load_float(self) < 0)
4082 break;
4083 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004085 case BINFLOAT:
4086 if (load_binfloat(self) < 0)
4087 break;
4088 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004089
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004090 case BINSTRING:
4091 if (load_binstring(self) < 0)
4092 break;
4093 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004095 case SHORT_BINSTRING:
4096 if (load_short_binstring(self) < 0)
4097 break;
4098 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004100 case STRING:
4101 if (load_string(self) < 0)
4102 break;
4103 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004104
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004105#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004106 case UNICODE:
4107 if (load_unicode(self) < 0)
4108 break;
4109 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004111 case BINUNICODE:
4112 if (load_binunicode(self) < 0)
4113 break;
4114 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004115#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004117 case EMPTY_TUPLE:
4118 if (load_empty_tuple(self) < 0)
4119 break;
4120 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004122 case TUPLE:
4123 if (load_tuple(self) < 0)
4124 break;
4125 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004127 case EMPTY_LIST:
4128 if (load_empty_list(self) < 0)
4129 break;
4130 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004132 case LIST:
4133 if (load_list(self) < 0)
4134 break;
4135 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004137 case EMPTY_DICT:
4138 if (load_empty_dict(self) < 0)
4139 break;
4140 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004142 case DICT:
4143 if (load_dict(self) < 0)
4144 break;
4145 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004147 case OBJ:
4148 if (noload_obj(self) < 0)
4149 break;
4150 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004152 case INST:
4153 if (noload_inst(self) < 0)
4154 break;
4155 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004157 case GLOBAL:
4158 if (noload_global(self) < 0)
4159 break;
4160 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004162 case APPEND:
4163 if (load_append(self) < 0)
4164 break;
4165 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004167 case APPENDS:
4168 if (load_appends(self) < 0)
4169 break;
4170 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004172 case BUILD:
4173 if (noload_build(self) < 0)
4174 break;
4175 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004177 case DUP:
4178 if (load_dup(self) < 0)
4179 break;
4180 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004182 case BINGET:
4183 if (load_binget(self) < 0)
4184 break;
4185 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004187 case LONG_BINGET:
4188 if (load_long_binget(self) < 0)
4189 break;
4190 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004192 case GET:
4193 if (load_get(self) < 0)
4194 break;
4195 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004197 case MARK:
4198 if (load_mark(self) < 0)
4199 break;
4200 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004202 case BINPUT:
4203 if (load_binput(self) < 0)
4204 break;
4205 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004207 case LONG_BINPUT:
4208 if (load_long_binput(self) < 0)
4209 break;
4210 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004212 case PUT:
4213 if (load_put(self) < 0)
4214 break;
4215 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004217 case POP:
4218 if (load_pop(self) < 0)
4219 break;
4220 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004222 case POP_MARK:
4223 if (load_pop_mark(self) < 0)
4224 break;
4225 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004226
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004227 case SETITEM:
4228 if (load_setitem(self) < 0)
4229 break;
4230 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004232 case SETITEMS:
4233 if (load_setitems(self) < 0)
4234 break;
4235 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004237 case STOP:
4238 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004240 case PERSID:
4241 if (load_persid(self) < 0)
4242 break;
4243 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004245 case BINPERSID:
4246 if (load_binpersid(self) < 0)
4247 break;
4248 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004250 case REDUCE:
4251 if (noload_reduce(self) < 0)
4252 break;
4253 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004255 default:
4256 cPickle_ErrFormat(UnpicklingError,
4257 "invalid load key, '%s'.",
4258 "c", s[0]);
4259 return NULL;
4260 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004261
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004262 break;
4263 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004265 if ((err = PyErr_Occurred())) {
4266 if (err == PyExc_EOFError) {
4267 PyErr_SetNone(PyExc_EOFError);
4268 }
4269 return NULL;
4270 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004272 PDATA_POP(self->stack, val);
4273 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004274}
Tim Peters84e87f32001-03-17 04:50:51 +00004275
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004276
Guido van Rossum60456fd1997-04-09 17:36:32 +00004277static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004278Unpickler_load(Unpicklerobject *self, PyObject *args)
4279{
4280 if (!( PyArg_ParseTuple(args, ":load")))
4281 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004283 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004284}
4285
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004286static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004287Unpickler_noload(Unpicklerobject *self, PyObject *args)
4288{
4289 if (!( PyArg_ParseTuple(args, ":noload")))
4290 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004292 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004293}
4294
Guido van Rossum60456fd1997-04-09 17:36:32 +00004295
4296static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004297 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004298 "load() -- Load a pickle"
4299 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004300 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004301 "noload() -- not load a pickle, but go through most of the motions\n"
4302 "\n"
4303 "This function can be used to read past a pickle without instantiating\n"
4304 "any objects or importing any modules. It can also be used to find all\n"
4305 "persistent references without instantiating any objects or importing\n"
4306 "any modules.\n"
4307 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004308 {NULL, NULL} /* sentinel */
4309};
4310
4311
4312static Unpicklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004313newUnpicklerobject(PyObject *f)
4314{
4315 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004317 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
4318 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004319
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004320 self->file = NULL;
4321 self->arg = NULL;
4322 self->stack = (Pdata*)Pdata_New();
4323 self->pers_func = NULL;
4324 self->last_string = NULL;
4325 self->marks = NULL;
4326 self->num_marks = 0;
4327 self->marks_size = 0;
4328 self->buf_size = 0;
4329 self->read = NULL;
4330 self->readline = NULL;
4331 self->safe_constructors = NULL;
4332 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004334 if (!( self->memo = PyDict_New()))
4335 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004337 Py_INCREF(f);
4338 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004340 /* Set read, readline based on type of f */
4341 if (PyFile_Check(f)) {
4342 self->fp = PyFile_AsFile(f);
4343 if (self->fp == NULL) {
4344 PyErr_SetString(PyExc_ValueError,
4345 "I/O operation on closed file");
4346 goto err;
4347 }
4348 self->read_func = read_file;
4349 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004350 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004351 else if (PycStringIO_InputCheck(f)) {
4352 self->fp = NULL;
4353 self->read_func = read_cStringIO;
4354 self->readline_func = readline_cStringIO;
4355 }
4356 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004358 self->fp = NULL;
4359 self->read_func = read_other;
4360 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004362 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4363 (self->read = PyObject_GetAttr(f, read_str)))) {
4364 PyErr_Clear();
4365 PyErr_SetString( PyExc_TypeError,
4366 "argument must have 'read' and "
4367 "'readline' attributes" );
4368 goto err;
4369 }
4370 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004372 if (PyEval_GetRestricted()) {
4373 /* Restricted execution, get private tables */
4374 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004376 if (!( m=PyImport_Import(copy_reg_str))) goto err;
4377 self->safe_constructors=PyObject_GetAttr(m,
4378 safe_constructors_str);
4379 Py_DECREF(m);
4380 if (!( self->safe_constructors )) goto err;
4381 }
4382 else {
4383 self->safe_constructors=safe_constructors;
4384 Py_INCREF(safe_constructors);
4385 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004387 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004389 err:
4390 Py_DECREF((PyObject *)self);
4391 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004392}
4393
4394
4395static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004396get_Unpickler(PyObject *self, PyObject *args)
4397{
4398 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004400 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
4401 return NULL;
4402 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004403}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004404
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004405
Guido van Rossum60456fd1997-04-09 17:36:32 +00004406static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004407Unpickler_dealloc(Unpicklerobject *self)
4408{
4409 Py_XDECREF(self->readline);
4410 Py_XDECREF(self->read);
4411 Py_XDECREF(self->file);
4412 Py_XDECREF(self->memo);
4413 Py_XDECREF(self->stack);
4414 Py_XDECREF(self->pers_func);
4415 Py_XDECREF(self->arg);
4416 Py_XDECREF(self->last_string);
4417 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004419 if (self->marks) {
4420 free(self->marks);
4421 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004423 if (self->buf_size) {
4424 free(self->buf);
4425 }
Tim Peters84e87f32001-03-17 04:50:51 +00004426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004427 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004428}
4429
4430
4431static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004432Unpickler_getattr(Unpicklerobject *self, char *name)
4433{
4434 if (!strcmp(name, "persistent_load")) {
4435 if (!self->pers_func) {
4436 PyErr_SetString(PyExc_AttributeError, name);
4437 return NULL;
4438 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004440 Py_INCREF(self->pers_func);
4441 return self->pers_func;
4442 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004444 if (!strcmp(name, "find_global")) {
4445 if (!self->find_class) {
4446 PyErr_SetString(PyExc_AttributeError, name);
4447 return NULL;
4448 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004450 Py_INCREF(self->find_class);
4451 return self->find_class;
4452 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004454 if (!strcmp(name, "memo")) {
4455 if (!self->memo) {
4456 PyErr_SetString(PyExc_AttributeError, name);
4457 return NULL;
4458 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004460 Py_INCREF(self->memo);
4461 return self->memo;
4462 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004464 if (!strcmp(name, "UnpicklingError")) {
4465 Py_INCREF(UnpicklingError);
4466 return UnpicklingError;
4467 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004469 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004470}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004471
Guido van Rossum60456fd1997-04-09 17:36:32 +00004472
4473static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004474Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
4475{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004477 if (!strcmp(name, "persistent_load")) {
4478 Py_XDECREF(self->pers_func);
4479 self->pers_func = value;
4480 Py_XINCREF(value);
4481 return 0;
4482 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004484 if (!strcmp(name, "find_global")) {
4485 Py_XDECREF(self->find_class);
4486 self->find_class = value;
4487 Py_XINCREF(value);
4488 return 0;
4489 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004491 if (! value) {
4492 PyErr_SetString(PyExc_TypeError,
4493 "attribute deletion is not supported");
4494 return -1;
4495 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004497 if (strcmp(name, "memo") == 0) {
4498 if (!PyDict_Check(value)) {
4499 PyErr_SetString(PyExc_TypeError,
4500 "memo must be a dictionary");
4501 return -1;
4502 }
4503 Py_XDECREF(self->memo);
4504 self->memo = value;
4505 Py_INCREF(value);
4506 return 0;
4507 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004509 PyErr_SetString(PyExc_AttributeError, name);
4510 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004511}
4512
4513
4514static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004515cpm_dump(PyObject *self, PyObject *args)
4516{
4517 PyObject *ob, *file, *res = NULL;
4518 Picklerobject *pickler = 0;
4519 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004521 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &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 (!( pickler = newPicklerobject(file, bin)))
4525 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004527 if (dump(pickler, ob) < 0)
4528 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004530 Py_INCREF(Py_None);
4531 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004533 finally:
4534 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004536 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004537}
4538
4539
4540static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004541cpm_dumps(PyObject *self, PyObject *args)
4542{
4543 PyObject *ob, *file = 0, *res = NULL;
4544 Picklerobject *pickler = 0;
4545 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004546
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004547 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin)))
4548 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004550 if (!( file = PycStringIO->NewOutput(128)))
4551 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004553 if (!( pickler = newPicklerobject(file, bin)))
4554 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004556 if (dump(pickler, ob) < 0)
4557 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004559 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004561 finally:
4562 Py_XDECREF(pickler);
4563 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004565 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004566}
4567
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004568
4569static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004570cpm_load(PyObject *self, PyObject *args)
4571{
4572 Unpicklerobject *unpickler = 0;
4573 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004575 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
4576 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004578 if (!( unpickler = newUnpicklerobject(ob)))
4579 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004581 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004583 finally:
4584 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004586 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004587}
4588
4589
4590static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004591cpm_loads(PyObject *self, PyObject *args)
4592{
4593 PyObject *ob, *file = 0, *res = NULL;
4594 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004596 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
4597 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004598
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004599 if (!( file = PycStringIO->NewInput(ob)))
4600 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004602 if (!( unpickler = newUnpicklerobject(file)))
4603 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004605 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004607 finally:
4608 Py_XDECREF(file);
4609 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004611 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004612}
4613
4614
Tim Peters84e87f32001-03-17 04:50:51 +00004615static char Unpicklertype__doc__[] =
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004616"Objects that know how to unpickle";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004617
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004618static PyTypeObject Unpicklertype = {
4619 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004620 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004621 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004622 sizeof(Unpicklerobject), /*tp_basicsize*/
4623 0, /*tp_itemsize*/
4624 /* methods */
4625 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4626 (printfunc)0, /*tp_print*/
4627 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4628 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4629 (cmpfunc)0, /*tp_compare*/
4630 (reprfunc)0, /*tp_repr*/
4631 0, /*tp_as_number*/
4632 0, /*tp_as_sequence*/
4633 0, /*tp_as_mapping*/
4634 (hashfunc)0, /*tp_hash*/
4635 (ternaryfunc)0, /*tp_call*/
4636 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004637
Guido van Rossum60456fd1997-04-09 17:36:32 +00004638 /* Space for future expansion */
4639 0L,0L,0L,0L,
4640 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004641};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004642
Guido van Rossum60456fd1997-04-09 17:36:32 +00004643static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004644 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004645 "dump(object, file, [binary]) --"
4646 "Write an object in pickle format to the given file\n"
4647 "\n"
4648 "If the optional argument, binary, is provided and is true, then the\n"
4649 "pickle will be written in binary format, which is more space and\n"
4650 "computationally efficient. \n"
4651 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004652 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004653 "dumps(object, [binary]) --"
4654 "Return a string containing an object in pickle format\n"
4655 "\n"
4656 "If the optional argument, binary, is provided and is true, then the\n"
4657 "pickle will be written in binary format, which is more space and\n"
4658 "computationally efficient. \n"
4659 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004660 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004661 "load(file) -- Load a pickle from the given file"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004662 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004663 "loads(string) -- Load a pickle from the given string"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004664 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004665 "Pickler(file, [binary]) -- Create a pickler\n"
4666 "\n"
4667 "If the optional argument, binary, is provided and is true, then\n"
4668 "pickles will be written in binary format, which is more space and\n"
4669 "computationally efficient. \n"
4670 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004671 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004672 "Unpickler(file) -- Create an unpickler"},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004673 { NULL, NULL }
4674};
4675
Guido van Rossum60456fd1997-04-09 17:36:32 +00004676static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004677init_stuff(PyObject *module_dict)
4678{
4679 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004680
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004681#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004683 INIT_STR(__class__);
4684 INIT_STR(__getinitargs__);
4685 INIT_STR(__dict__);
4686 INIT_STR(__getstate__);
4687 INIT_STR(__setstate__);
4688 INIT_STR(__name__);
4689 INIT_STR(__main__);
4690 INIT_STR(__reduce__);
4691 INIT_STR(write);
4692 INIT_STR(__safe_for_unpickling__);
4693 INIT_STR(append);
4694 INIT_STR(read);
4695 INIT_STR(readline);
4696 INIT_STR(copy_reg);
4697 INIT_STR(dispatch_table);
4698 INIT_STR(safe_constructors);
4699 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004701 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
4702 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004704 /* These next few are special because we want to use different
4705 ones in restricted mode. */
4706 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
4707 if (!dispatch_table)
4708 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004710 if (!( safe_constructors = PyObject_GetAttr(copy_reg,
4711 safe_constructors_str)))
4712 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004714 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004716 /* Down to here ********************************** */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004718 if (!( empty_tuple = PyTuple_New(0)))
4719 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004721 /* Ugh */
4722 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4723 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4724 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004726 if (!( t=PyDict_New())) return -1;
4727 if (!( r=PyRun_String(
4728 "def __init__(self, *args): self.args=args\n\n"
4729 "def __str__(self):\n"
4730 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4731 Py_file_input,
4732 module_dict, t) )) return -1;
4733 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004735 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
4736 if (!PickleError)
4737 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004739 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004741 PicklingError = PyErr_NewException("cPickle.PicklingError",
4742 PickleError, NULL);
4743 if (!PicklingError)
4744 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004746 if (!( t=PyDict_New())) return -1;
4747 if (!( r=PyRun_String(
4748 "def __init__(self, *args): self.args=args\n\n"
4749 "def __str__(self):\n"
4750 " a=self.args\n"
4751 " a=a and type(a[0]) or '(what)'\n"
4752 " return 'Cannot pickle %s objects' % a\n"
4753 , Py_file_input,
4754 module_dict, t) )) return -1;
4755 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004757 if (!( UnpickleableError = PyErr_NewException(
4758 "cPickle.UnpickleableError", PicklingError, t)))
4759 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004761 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004763 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
4764 PickleError, NULL)))
4765 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004767 if (PyDict_SetItemString(module_dict, "PickleError",
4768 PickleError) < 0)
4769 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004771 if (PyDict_SetItemString(module_dict, "PicklingError",
4772 PicklingError) < 0)
4773 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004775 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4776 UnpicklingError) < 0)
4777 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004779 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4780 UnpickleableError) < 0)
4781 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004783 if (!( BadPickleGet = PyString_FromString("cPickle.BadPickleGet")))
4784 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004786 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4787 BadPickleGet) < 0)
4788 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004789
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004790 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004792 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004793}
4794
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004795#ifndef DL_EXPORT /* declarations for DLL import/export */
4796#define DL_EXPORT(RTYPE) RTYPE
4797#endif
Guido van Rossum50f385c1998-12-04 18:48:44 +00004798DL_EXPORT(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004799initcPickle(void)
4800{
4801 PyObject *m, *d, *di, *v, *k;
4802 int i;
4803 char *rev="1.71";
4804 PyObject *format_version;
4805 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004807 Picklertype.ob_type = &PyType_Type;
4808 Picklertype.tp_getattro = PyObject_GenericGetAttr;
4809 Picklertype.tp_setattro = PyObject_GenericSetAttr;
4810 Unpicklertype.ob_type = &PyType_Type;
4811 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004813 /* Initialize some pieces. We need to do this before module creation,
4814 so we're forced to use a temporary dictionary. :(
4815 */
4816 di=PyDict_New();
4817 if (!di) return;
4818 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004820 /* Create the module and add the functions */
4821 m = Py_InitModule4("cPickle", cPickle_methods,
4822 cPickle_module_documentation,
4823 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004825 /* Add some symbolic constants to the module */
4826 d = PyModule_GetDict(m);
4827 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4828 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004830 /* Copy data from di. Waaa. */
4831 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4832 if (PyObject_SetItem(d, k, v) < 0) {
4833 Py_DECREF(di);
4834 return;
4835 }
4836 }
4837 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004839 format_version = PyString_FromString("1.3");
4840 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004842 PyDict_SetItemString(d, "format_version", format_version);
4843 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4844 Py_XDECREF(format_version);
4845 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004846}