blob: 2ffba48e0ebc086d41232f9cb16adc6a4a76da64 [file] [log] [blame]
Tim Peters84e87f32001-03-17 04:50:51 +00001static char cPickle_module_documentation[] =
Guido van Rossum142eeb81997-08-13 03:14:41 +00002"C implementation and optimization of the Python pickle module\n"
3"\n"
Guido van Rossum2f80d961999-07-13 15:18:58 +00004"cPickle.c,v 1.71 1999/07/11 13:30:34 jim Exp\n"
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005;
6
7#include "Python.h"
8#include "cStringIO.h"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00009#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +000010
Guido van Rossum142eeb81997-08-13 03:14:41 +000011#ifndef Py_eval_input
12#include <graminit.h>
13#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000014#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000015
Guido van Rossum2f4caa41997-01-06 22:59:08 +000016#include <errno.h>
17
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +000018
Guido van Rossum2f4caa41997-01-06 22:59:08 +000019
Guido van Rossum60456fd1997-04-09 17:36:32 +000020#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000021
Guido van Rossum60456fd1997-04-09 17:36:32 +000022#define WRITE_BUF_SIZE 256
23
Tim Peters3906eb82001-04-10 04:22:00 +000024/* --------------------------------------------------------------------------
25NOTES on format codes.
26XXX much more is needed here
27
28Integer types
Tim Petersd8ae7c22001-04-10 04:35:28 +000029BININT1 8-bit unsigned integer; followed by 1 byte.
Tim Peters3906eb82001-04-10 04:22:00 +000030BININT2 16-bit unsigned integer; followed by 2 bytes, little-endian.
Tim Petersd8ae7c22001-04-10 04:35:28 +000031BININT 32-bit signed integer; followed by 4 bytes, little-endian.
32INT Integer; natural decimal string conversion, then newline.
Tim Peters3906eb82001-04-10 04:22:00 +000033 CAUTION: INT-reading code can't assume that what follows
34 fits in a Python int, because the size of Python ints varies
35 across platforms.
Tim Petersd8ae7c22001-04-10 04:35:28 +000036LONG Long (unbounded) integer; repr(i), then newline.
Tim Peters3906eb82001-04-10 04:22:00 +000037-------------------------------------------------------------------------- */
Guido van Rossum60456fd1997-04-09 17:36:32 +000038
39#define MARK '('
40#define STOP '.'
41#define POP '0'
42#define POP_MARK '1'
43#define DUP '2'
44#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000045#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000046#define INT 'I'
47#define BININT 'J'
48#define BININT1 'K'
49#define LONG 'L'
50#define BININT2 'M'
51#define NONE 'N'
52#define PERSID 'P'
53#define BINPERSID 'Q'
54#define REDUCE 'R'
55#define STRING 'S'
56#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000057#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000058#define UNICODE 'V'
59#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000060#define APPEND 'a'
61#define BUILD 'b'
62#define GLOBAL 'c'
63#define DICT 'd'
64#define EMPTY_DICT '}'
65#define APPENDS 'e'
66#define GET 'g'
67#define BINGET 'h'
68#define INST 'i'
69#define LONG_BINGET 'j'
70#define LIST 'l'
71#define EMPTY_LIST ']'
72#define OBJ 'o'
73#define PUT 'p'
74#define BINPUT 'q'
75#define LONG_BINPUT 'r'
76#define SETITEM 's'
77#define TUPLE 't'
78#define EMPTY_TUPLE ')'
79#define SETITEMS 'u'
Guido van Rossume2763392002-04-05 19:30:08 +000080#define TRUE "I01\n"
81#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000082
Guido van Rossum2f4caa41997-01-06 22:59:08 +000083
Guido van Rossum60456fd1997-04-09 17:36:32 +000084static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000085
Guido van Rossumc03158b1999-06-09 15:23:31 +000086static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000087static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +000088static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000089static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +000090static PyObject *BadPickleGet;
91
Guido van Rossum2f4caa41997-01-06 22:59:08 +000092
Guido van Rossum60456fd1997-04-09 17:36:32 +000093static PyObject *dispatch_table;
94static PyObject *safe_constructors;
Guido van Rossum60456fd1997-04-09 17:36:32 +000095static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000096
Guido van Rossum60456fd1997-04-09 17:36:32 +000097static PyObject *__class___str, *__getinitargs___str, *__dict___str,
98 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
99 *write_str, *__safe_for_unpickling___str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000100 *read_str, *readline_str, *__main___str, *__basicnew___str,
Fred Drake2c7a6852001-07-17 18:34:03 +0000101 *copy_reg_str, *dispatch_table_str, *safe_constructors_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000102
Guido van Rossum053b8df1998-11-25 16:18:00 +0000103/*************************************************************************
104 Internal Data type for pickle data. */
105
106typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000107 PyObject_HEAD
108 int length, size;
109 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000110} Pdata;
111
Tim Peters84e87f32001-03-17 04:50:51 +0000112static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000113Pdata_dealloc(Pdata *self)
114{
115 int i;
116 PyObject **p;
117
118 for (i=self->length, p=self->data; --i >= 0; p++) Py_DECREF(*p);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000120 if (self->data) free(self->data);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000122 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000123}
124
125static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000126 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
127 (destructor)Pdata_dealloc,
128 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000129};
130
131#define Pdata_Check(O) ((O)->ob_type == &PdataType)
132
133static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000134Pdata_New(void)
135{
136 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000138 if (!( self = PyObject_New(Pdata, &PdataType))) return NULL;
139 self->size=8;
140 self->length=0;
141 self->data=malloc(self->size * sizeof(PyObject*));
142 if (self->data) return (PyObject*)self;
143 Py_DECREF(self);
144 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000145}
146
Tim Peters84e87f32001-03-17 04:50:51 +0000147static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000148stackUnderflow(void)
149{
150 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
151 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000152}
153
154static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000155Pdata_clear(Pdata *self, int clearto)
156{
157 int i;
158 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000160 if (clearto < 0) return stackUnderflow();
161 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000163 for (i=self->length, p=self->data+clearto; --i >= clearto; p++)
164 Py_DECREF(*p);
165 self->length=clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000167 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000168}
169
170
Tim Peters84e87f32001-03-17 04:50:51 +0000171static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000172Pdata_grow(Pdata *self)
173{
174 if (! self->size) {
175 PyErr_NoMemory();
176 return -1;
177 }
178 self->size *= 2;
179 self->data = realloc(self->data, self->size*sizeof(PyObject*));
180 if (! self->data) {
181 self->size = 0;
182 PyErr_NoMemory();
183 return -1;
184 }
185 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000186}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000187
188#define PDATA_POP(D,V) { \
189 if ((D)->length) V=D->data[--((D)->length)]; \
190 else { \
191 PyErr_SetString(UnpicklingError, "bad pickle data"); \
192 V=NULL; \
193 } \
194}
195
196
197static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000198Pdata_popTuple(Pdata *self, int start)
199{
200 PyObject *r;
201 int i, j, l;
202
203 l=self->length-start;
204 if (!( r=PyTuple_New(l))) return NULL;
205 for (i=start, j=0 ; j < l; i++, j++)
206 PyTuple_SET_ITEM(r, j, self->data[i]);
207
208 self->length=start;
209 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000210}
211
212static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000213Pdata_popList(Pdata *self, int start)
214{
215 PyObject *r;
216 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000218 l=self->length-start;
219 if (!( r=PyList_New(l))) return NULL;
220 for (i=start, j=0 ; j < l; i++, j++)
221 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000223 self->length=start;
224 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000225}
226
227#define PDATA_APPEND_(D,O,ER) { \
228 if (Pdata_Append(((Pdata*)(D)), O) < 0) return ER; \
229}
230
231#define PDATA_APPEND(D,O,ER) { \
232 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
233 Pdata_grow((Pdata*)(D)) < 0) \
234 return ER; \
235 Py_INCREF(O); \
236 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
237}
238
239#define PDATA_PUSH(D,O,ER) { \
240 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
241 Pdata_grow((Pdata*)(D)) < 0) { \
242 Py_DECREF(O); \
243 return ER; \
244 } \
245 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
246}
247
248/*************************************************************************/
249
250#define ARG_TUP(self, o) { \
251 if (self->arg || (self->arg=PyTuple_New(1))) { \
252 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
253 PyTuple_SET_ITEM(self->arg,0,o); \
254 } \
255 else { \
256 Py_DECREF(o); \
257 } \
258}
259
260#define FREE_ARG_TUP(self) { \
261 if (self->arg->ob_refcnt > 1) { \
262 Py_DECREF(self->arg); \
263 self->arg=NULL; \
264 } \
265 }
266
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000267typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000268 PyObject_HEAD
269 FILE *fp;
270 PyObject *write;
271 PyObject *file;
272 PyObject *memo;
273 PyObject *arg;
274 PyObject *pers_func;
275 PyObject *inst_pers_func;
276 int bin;
277 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
278 int (*write_func)(struct Picklerobject *, char *, int);
279 char *write_buf;
280 int buf_size;
281 PyObject *dispatch_table;
282 int fast_container; /* count nested container dumps */
283 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000284} Picklerobject;
285
Barry Warsaw52acb492001-12-21 20:04:22 +0000286#ifndef PY_CPICKLE_FAST_LIMIT
287#define PY_CPICKLE_FAST_LIMIT 50
288#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000289
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000290staticforward PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000291
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000292typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000293 PyObject_HEAD
294 FILE *fp;
295 PyObject *file;
296 PyObject *readline;
297 PyObject *read;
298 PyObject *memo;
299 PyObject *arg;
300 Pdata *stack;
301 PyObject *mark;
302 PyObject *pers_func;
303 PyObject *last_string;
304 int *marks;
305 int num_marks;
306 int marks_size;
307 int (*read_func)(struct Unpicklerobject *, char **, int);
308 int (*readline_func)(struct Unpicklerobject *, char **);
309 int buf_size;
310 char *buf;
311 PyObject *safe_constructors;
312 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000313} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000314
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000315staticforward PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000316
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000317/* Forward decls that need the above structs */
318static int save(Picklerobject *, PyObject *, int);
319static int put2(Picklerobject *, PyObject *);
320
Tim Peters84e87f32001-03-17 04:50:51 +0000321int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000322cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
323{
324 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000326 if ((v = PyObject_GetItem(o,key))) {
327 Py_DECREF(v);
328 return 1;
329 }
330
331 PyErr_Clear();
332 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000333}
334
Guido van Rossumd385d591997-04-09 17:47:47 +0000335static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000336PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000337cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
338{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000339 va_list va;
340 PyObject *args=0, *retval=0;
341 va_start(va, format);
342
343 if (format) args = Py_VaBuildValue(format, va);
344 va_end(va);
345 if (format && ! args) return NULL;
346 if (stringformat && !(retval=PyString_FromString(stringformat)))
347 return NULL;
348
349 if (retval) {
350 if (args) {
351 PyObject *v;
352 v=PyString_Format(retval, args);
353 Py_DECREF(retval);
354 Py_DECREF(args);
355 if (! v) return NULL;
356 retval=v;
357 }
358 }
359 else
360 if (args) retval=args;
361 else {
362 PyErr_SetObject(ErrType,Py_None);
363 return NULL;
364 }
365 PyErr_SetObject(ErrType,retval);
366 Py_DECREF(retval);
367 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000368}
369
Tim Peters84e87f32001-03-17 04:50:51 +0000370static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000371write_file(Picklerobject *self, char *s, int n)
372{
373 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000375 if (s == NULL) {
376 return 0;
377 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000379 Py_BEGIN_ALLOW_THREADS
380 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
381 Py_END_ALLOW_THREADS
382 if (nbyteswritten != (size_t)n) {
383 PyErr_SetFromErrno(PyExc_IOError);
384 return -1;
385 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000387 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000388}
389
Tim Peters84e87f32001-03-17 04:50:51 +0000390static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000391write_cStringIO(Picklerobject *self, char *s, int n)
392{
393 if (s == NULL) {
394 return 0;
395 }
396
397 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
398 return -1;
399 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000401 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000402}
403
Tim Peters84e87f32001-03-17 04:50:51 +0000404static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000405write_none(Picklerobject *self, char *s, int n)
406{
407 if (s == NULL) return 0;
408 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000409}
410
Tim Peters84e87f32001-03-17 04:50:51 +0000411static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000412write_other(Picklerobject *self, char *s, int n)
413{
414 PyObject *py_str = 0, *junk = 0;
415
416 if (s == NULL) {
417 if (!( self->buf_size )) return 0;
418 py_str = PyString_FromStringAndSize(self->write_buf,
419 self->buf_size);
420 if (!py_str)
421 return -1;
422 }
423 else {
424 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
425 if (write_other(self, NULL, 0) < 0)
426 return -1;
427 }
428
429 if (n > WRITE_BUF_SIZE) {
430 if (!( py_str =
431 PyString_FromStringAndSize(s, n)))
432 return -1;
433 }
434 else {
435 memcpy(self->write_buf + self->buf_size, s, n);
436 self->buf_size += n;
437 return n;
438 }
439 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000441 if (self->write) {
442 /* object with write method */
443 ARG_TUP(self, py_str);
444 if (self->arg) {
445 junk = PyObject_Call(self->write, self->arg, NULL);
446 FREE_ARG_TUP(self);
447 }
448 if (junk) Py_DECREF(junk);
449 else return -1;
450 }
451 else
452 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000454 self->buf_size = 0;
455 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000456}
457
458
Tim Peters84e87f32001-03-17 04:50:51 +0000459static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000460read_file(Unpicklerobject *self, char **s, int n)
461{
462 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000464 if (self->buf_size == 0) {
465 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000467 size = ((n < 32) ? 32 : n);
468 if (!( self->buf = (char *)malloc(size * sizeof(char)))) {
469 PyErr_NoMemory();
470 return -1;
471 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000473 self->buf_size = size;
474 }
475 else if (n > self->buf_size) {
476 self->buf = (char *)realloc(self->buf, n * sizeof(char));
477 if (!self->buf) {
478 PyErr_NoMemory();
479 return -1;
480 }
Tim Peters84e87f32001-03-17 04:50:51 +0000481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000482 self->buf_size = n;
483 }
Tim Peters84e87f32001-03-17 04:50:51 +0000484
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000485 Py_BEGIN_ALLOW_THREADS
486 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
487 Py_END_ALLOW_THREADS
488 if (nbytesread != (size_t)n) {
489 if (feof(self->fp)) {
490 PyErr_SetNone(PyExc_EOFError);
491 return -1;
492 }
493
494 PyErr_SetFromErrno(PyExc_IOError);
495 return -1;
496 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000498 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000500 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000501}
502
503
Tim Peters84e87f32001-03-17 04:50:51 +0000504static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000505readline_file(Unpicklerobject *self, char **s)
506{
507 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000509 if (self->buf_size == 0) {
510 if (!( self->buf = (char *)malloc(40 * sizeof(char)))) {
511 PyErr_NoMemory();
512 return -1;
513 }
Tim Peters84e87f32001-03-17 04:50:51 +0000514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000515 self->buf_size = 40;
516 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000518 i = 0;
519 while (1) {
520 for (; i < (self->buf_size - 1); i++) {
521 if (feof(self->fp) ||
522 (self->buf[i] = getc(self->fp)) == '\n') {
523 self->buf[i + 1] = '\0';
524 *s = self->buf;
525 return i + 1;
526 }
527 }
528 self->buf = (char *)realloc(self->buf,
529 (self->buf_size * 2) * sizeof(char));
530 if (!self->buf) {
531 PyErr_NoMemory();
532 return -1;
533 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000535 self->buf_size *= 2;
536 }
Tim Peters84e87f32001-03-17 04:50:51 +0000537}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000538
539
Tim Peters84e87f32001-03-17 04:50:51 +0000540static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000541read_cStringIO(Unpicklerobject *self, char **s, int n)
542{
543 char *ptr;
544
545 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
546 PyErr_SetNone(PyExc_EOFError);
547 return -1;
548 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000550 *s = ptr;
551
552 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000553}
554
555
Tim Peters84e87f32001-03-17 04:50:51 +0000556static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000557readline_cStringIO(Unpicklerobject *self, char **s)
558{
559 int n;
560 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000562 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
563 return -1;
564 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000566 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000568 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000569}
570
571
Tim Peters84e87f32001-03-17 04:50:51 +0000572static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000573read_other(Unpicklerobject *self, char **s, int n)
574{
575 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000577 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000579 ARG_TUP(self, bytes);
580 if (self->arg) {
581 str = PyObject_Call(self->read, self->arg, NULL);
582 FREE_ARG_TUP(self);
583 }
584 if (! str) return -1;
585
586 Py_XDECREF(self->last_string);
587 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000589 if (! (*s = PyString_AsString(str))) return -1;
590 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000591}
592
593
Tim Peters84e87f32001-03-17 04:50:51 +0000594static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000595readline_other(Unpicklerobject *self, char **s)
596{
597 PyObject *str;
598 int str_size;
599
600 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
601 return -1;
602 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000603
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000604 if ((str_size = PyString_Size(str)) < 0)
605 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000607 Py_XDECREF(self->last_string);
608 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000610 if (! (*s = PyString_AsString(str)))
611 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000613 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000614}
615
616
617static char *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000618pystrndup(char *s, int l)
619{
620 char *r;
621 if (!( r=malloc((l+1)*sizeof(char)))) return (char*)PyErr_NoMemory();
622 memcpy(r,s,l);
623 r[l]=0;
624 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000625}
626
627
628static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000629get(Picklerobject *self, PyObject *id)
630{
631 PyObject *value, *mv;
632 long c_value;
633 char s[30];
634 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000636 if (!( mv = PyDict_GetItem(self->memo, id))) {
637 PyErr_SetObject(PyExc_KeyError, id);
638 return -1;
639 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000641 if (!( value = PyTuple_GetItem(mv, 0)))
642 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000644 if (!( PyInt_Check(value))) {
645 PyErr_SetString(PicklingError, "no int where int expected in memo");
646 return -1;
647 }
648 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000649
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000650 if (!self->bin) {
651 s[0] = GET;
652 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
653 len = strlen(s);
654 }
655 else if (Pdata_Check(self->file)) {
656 if (write_other(self, NULL, 0) < 0) return -1;
657 PDATA_APPEND(self->file, mv, -1);
658 return 0;
659 }
660 else {
661 if (c_value < 256) {
662 s[0] = BINGET;
663 s[1] = (int)(c_value & 0xff);
664 len = 2;
665 }
666 else {
667 s[0] = LONG_BINGET;
668 s[1] = (int)(c_value & 0xff);
669 s[2] = (int)((c_value >> 8) & 0xff);
670 s[3] = (int)((c_value >> 16) & 0xff);
671 s[4] = (int)((c_value >> 24) & 0xff);
672 len = 5;
673 }
674 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000676 if ((*self->write_func)(self, s, len) < 0)
677 return -1;
678
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000679 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000680}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000681
Guido van Rossum60456fd1997-04-09 17:36:32 +0000682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000683static int
684put(Picklerobject *self, PyObject *ob)
685{
686 if (ob->ob_refcnt < 2 || self->fast)
687 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000689 return put2(self, ob);
690}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000691
Guido van Rossum053b8df1998-11-25 16:18:00 +0000692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000693static int
694put2(Picklerobject *self, PyObject *ob)
695{
696 char c_str[30];
697 int p;
698 size_t len;
699 int res = -1;
700 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000702 if (self->fast)
703 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000705 if ((p = PyDict_Size(self->memo)) < 0)
706 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000708 /* Make sure memo keys are positive! */
709 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000711 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
712 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000714 if (!( memo_len = PyInt_FromLong(p)))
715 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000717 if (!( t = PyTuple_New(2)))
718 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000720 PyTuple_SET_ITEM(t, 0, memo_len);
721 Py_INCREF(memo_len);
722 PyTuple_SET_ITEM(t, 1, ob);
723 Py_INCREF(ob);
724
725 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
726 goto finally;
727
728 if (!self->bin) {
729 c_str[0] = PUT;
730 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
731 len = strlen(c_str);
732 }
733 else if (Pdata_Check(self->file)) {
734 if (write_other(self, NULL, 0) < 0) return -1;
735 PDATA_APPEND(self->file, memo_len, -1);
736 res=0; /* Job well done ;) */
737 goto finally;
738 }
739 else {
740 if (p >= 256) {
741 c_str[0] = LONG_BINPUT;
742 c_str[1] = (int)(p & 0xff);
743 c_str[2] = (int)((p >> 8) & 0xff);
744 c_str[3] = (int)((p >> 16) & 0xff);
745 c_str[4] = (int)((p >> 24) & 0xff);
746 len = 5;
747 }
748 else {
749 c_str[0] = BINPUT;
750 c_str[1] = p;
751 len = 2;
752 }
753 }
754
755 if ((*self->write_func)(self, c_str, len) < 0)
756 goto finally;
757
758 res = 0;
759
760 finally:
761 Py_XDECREF(py_ob_id);
762 Py_XDECREF(memo_len);
763 Py_XDECREF(t);
764
765 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000766}
767
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000768#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000769
770static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000771PyImport_Import(PyObject *module_name)
772{
773 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
774 static PyObject *standard_builtins=0;
775 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000777 if (!( silly_list )) {
778 if (!( __import___str=PyString_FromString("__import__")))
779 return NULL;
780 if (!( __builtins___str=PyString_FromString("__builtins__")))
781 return NULL;
782 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
783 return NULL;
784 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000786 if ((globals=PyEval_GetGlobals())) {
787 Py_INCREF(globals);
788 __builtins__=PyObject_GetItem(globals,__builtins___str);
789 if (!__builtins__)
790 goto err;
791 }
792 else {
793 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000795 if (!(standard_builtins ||
796 (standard_builtins=PyImport_ImportModule("__builtin__"))))
797 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000799 __builtins__=standard_builtins;
800 Py_INCREF(__builtins__);
801 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
802 if (!globals)
803 goto err;
804 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000806 if (PyDict_Check(__builtins__)) {
807 __import__=PyObject_GetItem(__builtins__,__import___str);
808 if (!__import__) goto err;
809 }
810 else {
811 __import__=PyObject_GetAttr(__builtins__,__import___str);
812 if (!__import__) goto err;
813 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000815 r=PyObject_CallFunction(__import__,"OOOO",
816 module_name, globals, globals, silly_list);
817 if (!r)
818 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000820 Py_DECREF(globals);
821 Py_DECREF(__builtins__);
822 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000824 return r;
825 err:
826 Py_XDECREF(globals);
827 Py_XDECREF(__builtins__);
828 Py_XDECREF(__import__);
829 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000830}
831
832static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000833whichmodule(PyObject *global, PyObject *global_name)
834{
835 int i, j;
836 PyObject *module = 0, *modules_dict = 0,
837 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000839 module = PyObject_GetAttrString(global, "__module__");
840 if (module) return module;
841 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000843 if (!( modules_dict = PySys_GetObject("modules")))
844 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000846 i = 0;
847 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000849 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000851 global_name_attr = PyObject_GetAttr(module, global_name);
852 if (!global_name_attr) {
853 PyErr_Clear();
854 continue;
855 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000857 if (global_name_attr != global) {
858 Py_DECREF(global_name_attr);
859 continue;
860 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000864 break;
865 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000867 /* The following implements the rule in pickle.py added in 1.5
868 that used __main__ if no module is found. I don't actually
869 like this rule. jlf
870 */
871 if (!j) {
872 j=1;
873 name=__main___str;
874 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000876 Py_INCREF(name);
877 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000878}
879
880
Guido van Rossum60456fd1997-04-09 17:36:32 +0000881static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000882fast_save_enter(Picklerobject *self, PyObject *obj)
883{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000884 /* if fast_container < 0, we're doing an error exit. */
885 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
886 PyObject *key = NULL;
887 if (self->fast_memo == NULL) {
888 self->fast_memo = PyDict_New();
889 if (self->fast_memo == NULL) {
890 self->fast_container = -1;
891 return 0;
892 }
893 }
894 key = PyLong_FromVoidPtr(obj);
895 if (key == NULL)
896 return 0;
897 if (PyDict_GetItem(self->fast_memo, key)) {
898 PyErr_Format(PyExc_ValueError,
899 "fast mode: can't pickle cyclic objects including object type %s at %p",
900 obj->ob_type->tp_name, obj);
901 self->fast_container = -1;
902 return 0;
903 }
904 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
905 self->fast_container = -1;
906 return 0;
907 }
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000908 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000909 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000910}
911
912int
913fast_save_leave(Picklerobject *self, PyObject *obj)
914{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000915 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
916 PyObject *key = PyLong_FromVoidPtr(obj);
917 if (key == NULL)
918 return 0;
919 if (PyDict_DelItem(self->fast_memo, key) < 0) {
920 return 0;
921 }
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000922 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000923 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000924}
925
926static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000927save_none(Picklerobject *self, PyObject *args)
928{
929 static char none = NONE;
930 if ((*self->write_func)(self, &none, 1) < 0)
931 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000932
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000933 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000934}
935
Guido van Rossum77f6a652002-04-03 22:41:51 +0000936static int
937save_bool(Picklerobject *self, PyObject *args)
938{
Guido van Rossume2763392002-04-05 19:30:08 +0000939 static char *buf[2] = {FALSE, TRUE};
940 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000941 long l = PyInt_AS_LONG((PyIntObject *)args);
942
Guido van Rossume2763392002-04-05 19:30:08 +0000943 if ((*self->write_func)(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000944 return -1;
945
946 return 0;
947}
Tim Peters84e87f32001-03-17 04:50:51 +0000948
Guido van Rossum60456fd1997-04-09 17:36:32 +0000949static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000950save_int(Picklerobject *self, PyObject *args)
951{
952 char c_str[32];
953 long l = PyInt_AS_LONG((PyIntObject *)args);
954 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000956 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000957#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000958 || l > 0x7fffffffL
959 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000960#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000961 ) {
962 /* Text-mode pickle, or long too big to fit in the 4-byte
963 * signed BININT format: store as a string.
964 */
965 c_str[0] = INT;
966 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
967 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
968 return -1;
969 }
970 else {
971 /* Binary pickle and l fits in a signed 4-byte int. */
972 c_str[1] = (int)( l & 0xff);
973 c_str[2] = (int)((l >> 8) & 0xff);
974 c_str[3] = (int)((l >> 16) & 0xff);
975 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000976
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000977 if ((c_str[4] == 0) && (c_str[3] == 0)) {
978 if (c_str[2] == 0) {
979 c_str[0] = BININT1;
980 len = 2;
981 }
982 else {
983 c_str[0] = BININT2;
984 len = 3;
985 }
986 }
987 else {
988 c_str[0] = BININT;
989 len = 5;
990 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000991
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000992 if ((*self->write_func)(self, c_str, len) < 0)
993 return -1;
994 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000996 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000997}
998
999
1000static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001001save_long(Picklerobject *self, PyObject *args)
1002{
1003 int size, res = -1;
1004 PyObject *repr = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001005
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001006 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001008 if (!( repr = PyObject_Repr(args)))
1009 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001011 if ((size = PyString_Size(repr)) < 0)
1012 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001014 if ((*self->write_func)(self, &l, 1) < 0)
1015 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001017 if ((*self->write_func)(self,
1018 PyString_AS_STRING((PyStringObject *)repr),
1019 size) < 0)
1020 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001021
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001022 if ((*self->write_func)(self, "\n", 1) < 0)
1023 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001025 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001027 finally:
1028 Py_XDECREF(repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001030 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001031}
1032
1033
1034static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001035save_float(Picklerobject *self, PyObject *args)
1036{
1037 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001039 if (self->bin) {
1040 int s, e;
1041 double f;
1042 long fhi, flo;
1043 char str[9];
1044 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001046 *p = BINFLOAT;
1047 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001049 if (x < 0) {
1050 s = 1;
1051 x = -x;
1052 }
1053 else
1054 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001056 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001058 /* Normalize f to be in the range [1.0, 2.0) */
1059 if (0.5 <= f && f < 1.0) {
1060 f *= 2.0;
1061 e--;
1062 }
1063 else if (f == 0.0) {
1064 e = 0;
1065 }
1066 else {
1067 PyErr_SetString(PyExc_SystemError,
1068 "frexp() result out of range");
1069 return -1;
1070 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001072 if (e >= 1024) {
1073 /* XXX 1024 itself is reserved for Inf/NaN */
1074 PyErr_SetString(PyExc_OverflowError,
1075 "float too large to pack with d format");
1076 return -1;
1077 }
1078 else if (e < -1022) {
1079 /* Gradual underflow */
1080 f = ldexp(f, 1022 + e);
1081 e = 0;
1082 }
1083 else if (!(e == 0 && f == 0.0)) {
1084 e += 1023;
1085 f -= 1.0; /* Get rid of leading 1 */
1086 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001088 /* fhi receives the high 28 bits;
1089 flo the low 24 bits (== 52 bits) */
1090 f *= 268435456.0; /* 2**28 */
1091 fhi = (long) floor(f); /* Truncate */
1092 f -= (double)fhi;
1093 f *= 16777216.0; /* 2**24 */
1094 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001096 /* First byte */
1097 *p = (s<<7) | (e>>4);
1098 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001100 /* Second byte */
1101 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1102 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001103
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001104 /* Third byte */
1105 *p = (unsigned char) ((fhi>>16) & 0xFF);
1106 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001108 /* Fourth byte */
1109 *p = (unsigned char) ((fhi>>8) & 0xFF);
1110 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001112 /* Fifth byte */
1113 *p = (unsigned char) (fhi & 0xFF);
1114 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001116 /* Sixth byte */
1117 *p = (unsigned char) ((flo>>16) & 0xFF);
1118 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001120 /* Seventh byte */
1121 *p = (unsigned char) ((flo>>8) & 0xFF);
1122 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001124 /* Eighth byte */
1125 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001127 if ((*self->write_func)(self, str, 9) < 0)
1128 return -1;
1129 }
1130 else {
1131 char c_str[250];
1132 c_str[0] = FLOAT;
1133 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001135 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1136 return -1;
1137 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001139 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001140}
1141
1142
1143static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001144save_string(Picklerobject *self, PyObject *args, int doput)
1145{
1146 int size, len;
1147 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001148
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001149 if ((size = PyString_Size(args)) < 0)
1150 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001152 if (!self->bin) {
1153 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001155 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001157 if (!( repr = PyObject_Repr(args)))
1158 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001160 if ((len = PyString_Size(repr)) < 0)
1161 goto err;
1162 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001164 if ((*self->write_func)(self, &string, 1) < 0)
1165 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001167 if ((*self->write_func)(self, repr_str, len) < 0)
1168 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001170 if ((*self->write_func)(self, "\n", 1) < 0)
1171 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001173 Py_XDECREF(repr);
1174 }
1175 else {
1176 int i;
1177 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001179 if ((size = PyString_Size(args)) < 0)
1180 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001182 if (size < 256) {
1183 c_str[0] = SHORT_BINSTRING;
1184 c_str[1] = size;
1185 len = 2;
1186 }
1187 else {
1188 c_str[0] = BINSTRING;
1189 for (i = 1; i < 5; i++)
1190 c_str[i] = (int)(size >> ((i - 1) * 8));
1191 len = 5;
1192 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001194 if ((*self->write_func)(self, c_str, len) < 0)
1195 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 if (size > 128 && Pdata_Check(self->file)) {
1198 if (write_other(self, NULL, 0) < 0) return -1;
1199 PDATA_APPEND(self->file, args, -1);
1200 }
1201 else {
1202 if ((*self->write_func)(self,
1203 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1204 return -1;
1205 }
1206 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001208 if (doput)
1209 if (put(self, args) < 0)
1210 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001212 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001214 err:
1215 Py_XDECREF(repr);
1216 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001217}
1218
1219
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001220#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001221/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1222 backslash and newline characters to \uXXXX escapes. */
1223static PyObject *
1224modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1225{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001226 PyObject *repr;
1227 char *p;
1228 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001230 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001232 repr = PyString_FromStringAndSize(NULL, 6 * size);
1233 if (repr == NULL)
1234 return NULL;
1235 if (size == 0)
1236 return repr;
1237
1238 p = q = PyString_AS_STRING(repr);
1239 while (size-- > 0) {
1240 Py_UNICODE ch = *s++;
1241 /* Map 16-bit characters to '\uxxxx' */
1242 if (ch >= 256 || ch == '\\' || ch == '\n') {
1243 *p++ = '\\';
1244 *p++ = 'u';
1245 *p++ = hexdigit[(ch >> 12) & 0xf];
1246 *p++ = hexdigit[(ch >> 8) & 0xf];
1247 *p++ = hexdigit[(ch >> 4) & 0xf];
1248 *p++ = hexdigit[ch & 15];
1249 }
1250 /* Copy everything else as-is */
1251 else
1252 *p++ = (char) ch;
1253 }
1254 *p = '\0';
1255 if (_PyString_Resize(&repr, p - q))
1256 goto onError;
1257
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001258 return repr;
1259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001260 onError:
1261 Py_DECREF(repr);
1262 return NULL;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001263}
1264
1265
Guido van Rossum60456fd1997-04-09 17:36:32 +00001266static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001267save_unicode(Picklerobject *self, PyObject *args, int doput)
1268{
1269 int size, len;
1270 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001272 if (!PyUnicode_Check(args))
1273 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001275 if (!self->bin) {
1276 char *repr_str;
1277 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001279 repr = modified_EncodeRawUnicodeEscape(
1280 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
1281 if (!repr)
1282 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001284 if ((len = PyString_Size(repr)) < 0)
1285 goto err;
1286 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001288 if ((*self->write_func)(self, &string, 1) < 0)
1289 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001291 if ((*self->write_func)(self, repr_str, len) < 0)
1292 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001294 if ((*self->write_func)(self, "\n", 1) < 0)
1295 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001297 Py_XDECREF(repr);
1298 }
1299 else {
1300 int i;
1301 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001303 if (!( repr = PyUnicode_AsUTF8String(args)))
1304 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001306 if ((size = PyString_Size(repr)) < 0)
1307 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001309 c_str[0] = BINUNICODE;
1310 for (i = 1; i < 5; i++)
1311 c_str[i] = (int)(size >> ((i - 1) * 8));
1312 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001314 if ((*self->write_func)(self, c_str, len) < 0)
1315 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001317 if (size > 128 && Pdata_Check(self->file)) {
1318 if (write_other(self, NULL, 0) < 0)
1319 goto err;
1320 PDATA_APPEND(self->file, repr, -1);
1321 }
1322 else {
1323 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1324 size) < 0)
1325 goto err;
1326 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001327
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001328 Py_DECREF(repr);
1329 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001331 if (doput)
1332 if (put(self, args) < 0)
1333 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001335 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001337 err:
1338 Py_XDECREF(repr);
1339 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001340}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001341#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001342
1343
1344static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001345save_tuple(Picklerobject *self, PyObject *args)
1346{
1347 PyObject *element = 0, *py_tuple_id = 0;
1348 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001350 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001352 if ((*self->write_func)(self, &MARKv, 1) < 0)
1353 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001355 if ((len = PyTuple_Size(args)) < 0)
1356 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001358 for (i = 0; i < len; i++) {
1359 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
1360 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001362 if (save(self, element, 0) < 0)
1363 goto finally;
1364 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001366 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
1367 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001369 if (len) {
1370 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1371 if (self->bin) {
1372 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001374 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1375 goto finally;
1376 }
1377 else {
1378 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001380 for (i = 0; i <= len; i++) {
1381 if ((*self->write_func)(self, &pop, 1) < 0)
1382 goto finally;
1383 }
1384 }
Tim Peters84e87f32001-03-17 04:50:51 +00001385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001386 if (get(self, py_tuple_id) < 0)
1387 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001389 res = 0;
1390 goto finally;
1391 }
1392 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001394 if ((*self->write_func)(self, &tuple, 1) < 0) {
1395 goto finally;
1396 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001398 if (put(self, args) < 0)
1399 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001401 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001403 finally:
1404 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001406 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001407}
1408
1409static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001410save_empty_tuple(Picklerobject *self, PyObject *args)
1411{
1412 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001413
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001414 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001415}
1416
1417
1418static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001419save_list(Picklerobject *self, PyObject *args)
1420{
1421 PyObject *element = 0;
1422 int s_len, len, i, using_appends, res = -1;
1423 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001425 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001427 if (self->fast && !fast_save_enter(self, args))
1428 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001429
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001430 if (self->bin) {
1431 s[0] = EMPTY_LIST;
1432 s_len = 1;
1433 }
1434 else {
1435 s[0] = MARK;
1436 s[1] = LIST;
1437 s_len = 2;
1438 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001440 if ((len = PyList_Size(args)) < 0)
1441 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001443 if ((*self->write_func)(self, s, s_len) < 0)
1444 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001446 if (len == 0) {
1447 if (put(self, args) < 0)
1448 goto finally;
1449 }
1450 else {
1451 if (put2(self, args) < 0)
1452 goto finally;
1453 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001454
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001455 if ((using_appends = (self->bin && (len > 1))))
1456 if ((*self->write_func)(self, &MARKv, 1) < 0)
1457 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001458
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001459 for (i = 0; i < len; i++) {
1460 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
1461 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001462
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001463 if (save(self, element, 0) < 0)
1464 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001466 if (!using_appends) {
1467 if ((*self->write_func)(self, &append, 1) < 0)
1468 goto finally;
1469 }
1470 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001472 if (using_appends) {
1473 if ((*self->write_func)(self, &appends, 1) < 0)
1474 goto finally;
1475 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001477 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001479 finally:
1480 if (self->fast && !fast_save_leave(self, args))
1481 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001483 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001484}
1485
1486
Guido van Rossum60456fd1997-04-09 17:36:32 +00001487static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001488save_dict(Picklerobject *self, PyObject *args)
1489{
1490 PyObject *key = 0, *value = 0;
1491 int i, len, res = -1, using_setitems;
1492 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001494 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001496 if (self->fast && !fast_save_enter(self, args))
1497 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001499 if (self->bin) {
1500 s[0] = EMPTY_DICT;
1501 len = 1;
1502 }
1503 else {
1504 s[0] = MARK;
1505 s[1] = DICT;
1506 len = 2;
1507 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001509 if ((*self->write_func)(self, s, len) < 0)
1510 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001512 if ((len = PyDict_Size(args)) < 0)
1513 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001515 if (len == 0) {
1516 if (put(self, args) < 0)
1517 goto finally;
1518 }
1519 else {
1520 if (put2(self, args) < 0)
1521 goto finally;
1522 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001524 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1525 if ((*self->write_func)(self, &MARKv, 1) < 0)
1526 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001528 i = 0;
1529 while (PyDict_Next(args, &i, &key, &value)) {
1530 if (save(self, key, 0) < 0)
1531 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001533 if (save(self, value, 0) < 0)
1534 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001536 if (!using_setitems) {
1537 if ((*self->write_func)(self, &setitem, 1) < 0)
1538 goto finally;
1539 }
1540 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001542 if (using_setitems) {
1543 if ((*self->write_func)(self, &setitems, 1) < 0)
1544 goto finally;
1545 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001546
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001547 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001549 finally:
1550 if (self->fast && !fast_save_leave(self, args))
1551 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001553 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001554}
1555
1556
Tim Peters84e87f32001-03-17 04:50:51 +00001557static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001558save_inst(Picklerobject *self, PyObject *args)
1559{
1560 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1561 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1562 char *module_str, *name_str;
1563 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001565 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001567 if (self->fast && !fast_save_enter(self, args))
1568 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001570 if ((*self->write_func)(self, &MARKv, 1) < 0)
1571 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001573 if (!( class = PyObject_GetAttr(args, __class___str)))
1574 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001576 if (self->bin) {
1577 if (save(self, class, 0) < 0)
1578 goto finally;
1579 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001581 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1582 PyObject *element = 0;
1583 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001585 if (!( class_args =
1586 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
1587 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001589 if ((len = PyObject_Size(class_args)) < 0)
1590 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001592 for (i = 0; i < len; i++) {
1593 if (!( element = PySequence_GetItem(class_args, i)))
1594 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001596 if (save(self, element, 0) < 0) {
1597 Py_DECREF(element);
1598 goto finally;
1599 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001601 Py_DECREF(element);
1602 }
1603 }
1604 else {
1605 PyErr_Clear();
1606 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001608 if (!self->bin) {
1609 if (!( name = ((PyClassObject *)class)->cl_name )) {
1610 PyErr_SetString(PicklingError, "class has no name");
1611 goto finally;
1612 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001614 if (!( module = whichmodule(class, name)))
1615 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001616
Tim Peters84e87f32001-03-17 04:50:51 +00001617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001618 if ((module_size = PyString_Size(module)) < 0 ||
1619 (name_size = PyString_Size(name)) < 0)
1620 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001622 module_str = PyString_AS_STRING((PyStringObject *)module);
1623 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001625 if ((*self->write_func)(self, &inst, 1) < 0)
1626 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001628 if ((*self->write_func)(self, module_str, module_size) < 0)
1629 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001631 if ((*self->write_func)(self, "\n", 1) < 0)
1632 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001634 if ((*self->write_func)(self, name_str, name_size) < 0)
1635 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001637 if ((*self->write_func)(self, "\n", 1) < 0)
1638 goto finally;
1639 }
1640 else if ((*self->write_func)(self, &obj, 1) < 0) {
1641 goto finally;
1642 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001644 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1645 state = PyObject_Call(getstate_func, empty_tuple, NULL);
1646 if (!state)
1647 goto finally;
1648 }
1649 else {
1650 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001652 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1653 PyErr_Clear();
1654 res = 0;
1655 goto finally;
1656 }
1657 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001658
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001659 if (!PyDict_Check(state)) {
1660 if (put2(self, args) < 0)
1661 goto finally;
1662 }
1663 else {
1664 if (put(self, args) < 0)
1665 goto finally;
1666 }
Tim Peters84e87f32001-03-17 04:50:51 +00001667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001668 if (save(self, state, 0) < 0)
1669 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001671 if ((*self->write_func)(self, &build, 1) < 0)
1672 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001674 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001676 finally:
1677 if (self->fast && !fast_save_leave(self, args))
1678 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001680 Py_XDECREF(module);
1681 Py_XDECREF(class);
1682 Py_XDECREF(state);
1683 Py_XDECREF(getinitargs_func);
1684 Py_XDECREF(getstate_func);
1685 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001687 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001688}
1689
1690
Guido van Rossum60456fd1997-04-09 17:36:32 +00001691static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001692save_global(Picklerobject *self, PyObject *args, PyObject *name)
1693{
1694 PyObject *global_name = 0, *module = 0, *mod = 0, *moddict = 0, *klass = 0;
1695 char *name_str, *module_str;
1696 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001698 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001700 if (name) {
1701 global_name = name;
1702 Py_INCREF(global_name);
1703 }
1704 else {
1705 if (!( global_name = PyObject_GetAttr(args, __name___str)))
1706 goto finally;
1707 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001709 if (!( module = whichmodule(args, global_name)))
1710 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001712 if ((module_size = PyString_Size(module)) < 0 ||
1713 (name_size = PyString_Size(global_name)) < 0)
1714 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001716 module_str = PyString_AS_STRING((PyStringObject *)module);
1717 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001719 mod = PyImport_ImportModule(module_str);
1720 if (mod == NULL) {
1721 /* Py_ErrClear(); ?? */
1722 cPickle_ErrFormat(PicklingError,
1723 "Can't pickle %s: it's not found as %s.%s",
1724 "OSS", args, module, global_name);
1725 goto finally;
1726 }
1727 /* borrowed ref */
1728 moddict = PyModule_GetDict(mod);
1729 /* borrowed ref */
1730 klass = PyDict_GetItemString(moddict, name_str);
1731 if (klass == NULL) {
1732 cPickle_ErrFormat(PicklingError,
1733 "Can't pickle %s: it's not found as %s.%s",
1734 "OSS", args, module, global_name);
1735 goto finally;
1736 }
1737 if (klass != args) {
1738 cPickle_ErrFormat(PicklingError,
1739 "Can't pickle %s: it's not the same object as %s.%s",
1740 "OSS", args, module, global_name);
1741 goto finally;
1742 }
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001743
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001744 if ((*self->write_func)(self, &global, 1) < 0)
1745 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001747 if ((*self->write_func)(self, module_str, module_size) < 0)
1748 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001750 if ((*self->write_func)(self, "\n", 1) < 0)
1751 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001753 if ((*self->write_func)(self, name_str, name_size) < 0)
1754 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001756 if ((*self->write_func)(self, "\n", 1) < 0)
1757 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001759 if (put(self, args) < 0)
1760 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001762 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001764 finally:
1765 Py_XDECREF(module);
1766 Py_XDECREF(global_name);
1767 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001769 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001770}
1771
Guido van Rossum60456fd1997-04-09 17:36:32 +00001772static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001773save_pers(Picklerobject *self, PyObject *args, PyObject *f)
1774{
1775 PyObject *pid = 0;
1776 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001778 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001780 Py_INCREF(args);
1781 ARG_TUP(self, args);
1782 if (self->arg) {
1783 pid = PyObject_Call(f, self->arg, NULL);
1784 FREE_ARG_TUP(self);
1785 }
1786 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001788 if (pid != Py_None) {
1789 if (!self->bin) {
1790 if (!PyString_Check(pid)) {
1791 PyErr_SetString(PicklingError,
1792 "persistent id must be string");
1793 goto finally;
1794 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001796 if ((*self->write_func)(self, &persid, 1) < 0)
1797 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001799 if ((size = PyString_Size(pid)) < 0)
1800 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001802 if ((*self->write_func)(self,
1803 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1804 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001806 if ((*self->write_func)(self, "\n", 1) < 0)
1807 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001809 res = 1;
1810 goto finally;
1811 }
1812 else if (save(self, pid, 1) >= 0) {
1813 if ((*self->write_func)(self, &binpersid, 1) < 0)
1814 res = -1;
1815 else
1816 res = 1;
1817 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001819 goto finally;
1820 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001822 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001824 finally:
1825 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001827 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001828}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001829
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001830
Tim Peters84e87f32001-03-17 04:50:51 +00001831static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001832save_reduce(Picklerobject *self, PyObject *callable,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001833 PyObject *tup, PyObject *state, PyObject *ob)
1834{
1835 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001837 if (save(self, callable, 0) < 0)
1838 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001840 if (save(self, tup, 0) < 0)
1841 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001843 if ((*self->write_func)(self, &reduce, 1) < 0)
1844 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001846 if (ob != NULL) {
1847 if (state && !PyDict_Check(state)) {
1848 if (put2(self, ob) < 0)
1849 return -1;
1850 }
1851 else {
1852 if (put(self, ob) < 0)
1853 return -1;
1854 }
1855 }
Tim Peters84e87f32001-03-17 04:50:51 +00001856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001857 if (state) {
1858 if (save(self, state, 0) < 0)
1859 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001861 if ((*self->write_func)(self, &build, 1) < 0)
1862 return -1;
1863 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001865 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001866}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001867
Guido van Rossum60456fd1997-04-09 17:36:32 +00001868static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001869save(Picklerobject *self, PyObject *args, int pers_save)
1870{
1871 PyTypeObject *type;
1872 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1873 *callable = 0, *state = 0;
1874 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001876 if (!pers_save && self->pers_func) {
1877 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1878 res = tmp;
1879 goto finally;
1880 }
1881 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001883 if (args == Py_None) {
1884 res = save_none(self, args);
1885 goto finally;
1886 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001888 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001890 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001891 case 'b':
1892 if (args == Py_False || args == Py_True) {
1893 res = save_bool(self, args);
1894 goto finally;
1895 }
1896 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001897 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001898 if (type == &PyInt_Type) {
1899 res = save_int(self, args);
1900 goto finally;
1901 }
1902 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001903
Guido van Rossum60456fd1997-04-09 17:36:32 +00001904 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001905 if (type == &PyLong_Type) {
1906 res = save_long(self, args);
1907 goto finally;
1908 }
1909 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001910
Guido van Rossum60456fd1997-04-09 17:36:32 +00001911 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001912 if (type == &PyFloat_Type) {
1913 res = save_float(self, args);
1914 goto finally;
1915 }
1916 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001917
Guido van Rossum60456fd1997-04-09 17:36:32 +00001918 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001919 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
1920 if (self->bin) res = save_empty_tuple(self, args);
1921 else res = save_tuple(self, args);
1922 goto finally;
1923 }
1924 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001925
Guido van Rossum60456fd1997-04-09 17:36:32 +00001926 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001927 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
1928 res = save_string(self, args, 0);
1929 goto finally;
1930 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001931
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001932#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001933 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001934 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1935 res = save_unicode(self, args, 0);
1936 goto finally;
1937 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001938#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001939 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001941 if (args->ob_refcnt > 1) {
1942 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
1943 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001945 if (PyDict_GetItem(self->memo, py_ob_id)) {
1946 if (get(self, py_ob_id) < 0)
1947 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001949 res = 0;
1950 goto finally;
1951 }
1952 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001954 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001955 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001956 if (type == &PyString_Type) {
1957 res = save_string(self, args, 1);
1958 goto finally;
1959 }
1960 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001961
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001962#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001963 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001964 if (type == &PyUnicode_Type) {
1965 res = save_unicode(self, args, 1);
1966 goto finally;
1967 }
1968 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001969#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001970
Guido van Rossum60456fd1997-04-09 17:36:32 +00001971 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001972 if (type == &PyTuple_Type) {
1973 res = save_tuple(self, args);
1974 goto finally;
1975 }
1976 if (type == &PyType_Type) {
1977 res = save_global(self, args, NULL);
1978 goto finally;
1979 }
1980 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001981
Guido van Rossum60456fd1997-04-09 17:36:32 +00001982 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001983 if (type == &PyList_Type) {
1984 res = save_list(self, args);
1985 goto finally;
1986 }
1987 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001988
1989 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001990 if (type == &PyDict_Type) {
1991 res = save_dict(self, args);
1992 goto finally;
1993 }
1994 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001995
1996 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001997 if (type == &PyInstance_Type) {
1998 res = save_inst(self, args);
1999 goto finally;
2000 }
2001 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002002
2003 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002004 if (type == &PyClass_Type) {
2005 res = save_global(self, args, NULL);
2006 goto finally;
2007 }
2008 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002009
2010 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002011 if (type == &PyFunction_Type) {
2012 res = save_global(self, args, NULL);
2013 goto finally;
2014 }
2015 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002016
2017 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002018 if (type == &PyCFunction_Type) {
2019 res = save_global(self, args, NULL);
2020 goto finally;
2021 }
2022 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002024 if (PyType_IsSubtype(type, &PyType_Type)) {
2025 res = save_global(self, args, NULL);
2026 goto finally;
2027 }
Guido van Rossum950dce62001-12-19 16:56:54 +00002028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002029 if (!pers_save && self->inst_pers_func) {
2030 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2031 res = tmp;
2032 goto finally;
2033 }
2034 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002036 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2037 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002039 Py_INCREF(args);
2040 ARG_TUP(self, args);
2041 if (self->arg) {
2042 t = PyObject_Call(__reduce__, self->arg, NULL);
2043 FREE_ARG_TUP(self);
2044 }
2045 if (! t) goto finally;
2046 }
2047 else {
2048 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002050 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2051 t = PyObject_Call(__reduce__, empty_tuple, NULL);
2052 if (!t)
2053 goto finally;
2054 }
2055 else {
2056 PyErr_Clear();
2057 }
2058 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002060 if (t) {
2061 if (PyString_Check(t)) {
2062 res = save_global(self, args, t);
2063 goto finally;
2064 }
Tim Peters84e87f32001-03-17 04:50:51 +00002065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002066 if (!PyTuple_Check(t)) {
2067 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2068 "be a tuple", "O", __reduce__);
2069 goto finally;
2070 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002072 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002074 if ((size != 3) && (size != 2)) {
2075 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2076 "contain only two or three elements", "O", __reduce__);
2077 goto finally;
2078 }
Tim Peters84e87f32001-03-17 04:50:51 +00002079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002080 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002082 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002084 if (size > 2) {
2085 state = PyTuple_GET_ITEM(t, 2);
2086 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002088 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2089 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2090 "returned by %s must be a tuple", "O", __reduce__);
2091 goto finally;
2092 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002094 res = save_reduce(self, callable, arg_tup, state, args);
2095 goto finally;
2096 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002098 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002100 finally:
2101 Py_XDECREF(py_ob_id);
2102 Py_XDECREF(__reduce__);
2103 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002105 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002106}
2107
2108
2109static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002110dump(Picklerobject *self, PyObject *args)
2111{
2112 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002114 if (save(self, args, 0) < 0)
2115 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002117 if ((*self->write_func)(self, &stop, 1) < 0)
2118 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002120 if ((*self->write_func)(self, NULL, 0) < 0)
2121 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002123 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002124}
2125
2126static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002127Pickle_clear_memo(Picklerobject *self, PyObject *args)
2128{
2129 if (!PyArg_ParseTuple(args,":clear_memo"))
2130 return NULL;
2131 if (self->memo)
2132 PyDict_Clear(self->memo);
2133 Py_INCREF(Py_None);
2134 return Py_None;
2135}
2136
2137static PyObject *
2138Pickle_getvalue(Picklerobject *self, PyObject *args)
2139{
2140 int l, i, rsize, ssize, clear=1, lm;
2141 long ik;
2142 PyObject *k, *r;
2143 char *s, *p, *have_get;
2144 Pdata *data;
2145
2146 /* Can be called by Python code or C code */
2147 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2148 return NULL;
2149
2150 /* Check to make sure we are based on a list */
2151 if (! Pdata_Check(self->file)) {
2152 PyErr_SetString(PicklingError,
2153 "Attempt to getvalue() a non-list-based pickler");
2154 return NULL;
2155 }
2156
2157 /* flush write buffer */
2158 if (write_other(self, NULL, 0) < 0) return NULL;
2159
2160 data=(Pdata*)self->file;
2161 l=data->length;
2162
2163 /* set up an array to hold get/put status */
2164 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2165 lm++;
2166 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2167 memset(have_get,0,lm);
2168
2169 /* Scan for gets. */
2170 for (rsize=0, i=l; --i >= 0; ) {
2171 k=data->data[i];
2172
2173 if (PyString_Check(k)) {
2174 rsize += PyString_GET_SIZE(k);
2175 }
2176
2177 else if (PyInt_Check(k)) { /* put */
2178 ik=PyInt_AS_LONG((PyIntObject*)k);
2179 if (ik >= lm || ik==0) {
2180 PyErr_SetString(PicklingError,
2181 "Invalid get data");
2182 return NULL;
2183 }
2184 if (have_get[ik]) { /* with matching get */
2185 if (ik < 256) rsize += 2;
2186 else rsize+=5;
2187 }
2188 }
2189
2190 else if (! (PyTuple_Check(k) &&
2191 PyTuple_GET_SIZE(k) == 2 &&
2192 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2193 ) {
2194 PyErr_SetString(PicklingError,
2195 "Unexpected data in internal list");
2196 return NULL;
2197 }
2198
2199 else { /* put */
2200 ik=PyInt_AS_LONG((PyIntObject*)k);
2201 if (ik >= lm || ik==0) {
2202 PyErr_SetString(PicklingError,
2203 "Invalid get data");
2204 return NULL;
2205 }
2206 have_get[ik]=1;
2207 if (ik < 256) rsize += 2;
2208 else rsize+=5;
2209 }
2210
2211 }
2212
2213 /* Now generate the result */
2214 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2215 s=PyString_AS_STRING((PyStringObject*)r);
2216
2217 for (i=0; i<l; i++) {
2218 k=data->data[i];
2219
2220 if (PyString_Check(k)) {
2221 ssize=PyString_GET_SIZE(k);
2222 if (ssize) {
2223 p=PyString_AS_STRING((PyStringObject*)k);
2224 while (--ssize >= 0) *s++=*p++;
2225 }
2226 }
2227
2228 else if (PyTuple_Check(k)) { /* get */
2229 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2230 if (ik < 256) {
2231 *s++ = BINGET;
2232 *s++ = (int)(ik & 0xff);
2233 }
2234 else {
2235 *s++ = LONG_BINGET;
2236 *s++ = (int)(ik & 0xff);
2237 *s++ = (int)((ik >> 8) & 0xff);
2238 *s++ = (int)((ik >> 16) & 0xff);
2239 *s++ = (int)((ik >> 24) & 0xff);
2240 }
2241 }
2242
2243 else { /* put */
2244 ik=PyInt_AS_LONG((PyIntObject*)k);
2245
2246 if (have_get[ik]) { /* with matching get */
2247 if (ik < 256) {
2248 *s++ = BINPUT;
2249 *s++ = (int)(ik & 0xff);
2250 }
2251 else {
2252 *s++ = LONG_BINPUT;
2253 *s++ = (int)(ik & 0xff);
2254 *s++ = (int)((ik >> 8) & 0xff);
2255 *s++ = (int)((ik >> 16) & 0xff);
2256 *s++ = (int)((ik >> 24) & 0xff);
2257 }
2258 }
2259 }
2260
2261 }
2262
2263 if (clear) {
2264 PyDict_Clear(self->memo);
2265 Pdata_clear(data,0);
2266 }
2267
2268 free(have_get);
2269 return r;
2270 err:
2271 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002272 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002273}
2274
2275static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002276Pickler_dump(Picklerobject *self, PyObject *args)
2277{
2278 PyObject *ob;
2279 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002281 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
2282 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002284 if (dump(self, ob) < 0)
2285 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002287 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002289 /* XXX Why does dump() return self? */
2290 Py_INCREF(self);
2291 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002292}
2293
2294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002295static struct PyMethodDef Pickler_methods[] =
2296{
Neal Norwitzb0493252002-03-31 14:44:22 +00002297 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002298 "dump(object) --"
2299 "Write an object in pickle format to the object's pickle stream\n"
2300 },
Neal Norwitzb0493252002-03-31 14:44:22 +00002301 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002302 "clear_memo() -- Clear the picklers memo"},
Neal Norwitzb0493252002-03-31 14:44:22 +00002303 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Guido van Rossum053b8df1998-11-25 16:18:00 +00002304 "getvalue() -- Finish picking a list-based pickle"},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002305 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002306};
2307
2308
2309static Picklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002310newPicklerobject(PyObject *file, int bin)
2311{
2312 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002314 if (!( self = PyObject_New(Picklerobject, &Picklertype)))
2315 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002317 self->fp = NULL;
2318 self->write = NULL;
2319 self->memo = NULL;
2320 self->arg = NULL;
2321 self->pers_func = NULL;
2322 self->inst_pers_func = NULL;
2323 self->write_buf = NULL;
2324 self->bin = bin;
2325 self->fast = 0;
2326 self->fast_container = 0;
2327 self->fast_memo = NULL;
2328 self->buf_size = 0;
2329 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002331 if (file)
2332 Py_INCREF(file);
2333 else
2334 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002336 if (!( self->file = file ))
2337 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002339 if (!( self->memo = PyDict_New()))
2340 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002342 if (PyFile_Check(file)) {
2343 self->fp = PyFile_AsFile(file);
2344 if (self->fp == NULL) {
2345 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2346 goto err;
2347 }
2348 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002349 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002350 else if (PycStringIO_OutputCheck(file)) {
2351 self->write_func = write_cStringIO;
2352 }
2353 else if (file == Py_None) {
2354 self->write_func = write_none;
2355 }
2356 else {
2357 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002359 if (! Pdata_Check(file)) {
2360 self->write = PyObject_GetAttr(file, write_str);
2361 if (!self->write) {
2362 PyErr_Clear();
2363 PyErr_SetString(PyExc_TypeError,
2364 "argument must have 'write' "
2365 "attribute");
2366 goto err;
2367 }
2368 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002370 if (!( self->write_buf =
2371 (char *)malloc(WRITE_BUF_SIZE * sizeof(char)))) {
2372 PyErr_NoMemory();
2373 goto err;
2374 }
2375 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002377 if (PyEval_GetRestricted()) {
2378 /* Restricted execution, get private tables */
2379 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002381 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2382 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2383 Py_DECREF(m);
2384 if (!( self->dispatch_table )) goto err;
2385 }
2386 else {
2387 self->dispatch_table=dispatch_table;
2388 Py_INCREF(dispatch_table);
2389 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002391 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002393 err:
2394 Py_DECREF((PyObject *)self);
2395 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002396}
2397
2398
2399static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002400get_Pickler(PyObject *self, PyObject *args)
2401{
2402 PyObject *file = NULL;
2403 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002405 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
2406 PyErr_Clear();
2407 bin = 0;
2408 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2409 return NULL;
2410 }
2411 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002412}
2413
2414
2415static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002416Pickler_dealloc(Picklerobject *self)
2417{
2418 Py_XDECREF(self->write);
2419 Py_XDECREF(self->memo);
2420 Py_XDECREF(self->fast_memo);
2421 Py_XDECREF(self->arg);
2422 Py_XDECREF(self->file);
2423 Py_XDECREF(self->pers_func);
2424 Py_XDECREF(self->inst_pers_func);
2425 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002427 if (self->write_buf) {
2428 free(self->write_buf);
2429 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002431 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002432}
2433
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002434static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002435Pickler_get_pers_func(Picklerobject *p)
2436{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002437 if (p->pers_func == NULL)
2438 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2439 else
2440 Py_INCREF(p->pers_func);
2441 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002442}
2443
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002444static int
2445Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2446{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002447 if (v == NULL) {
2448 PyErr_SetString(PyExc_TypeError,
2449 "attribute deletion is not supported");
2450 return -1;
2451 }
2452 Py_XDECREF(p->pers_func);
2453 Py_INCREF(v);
2454 p->pers_func = v;
2455 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002456}
2457
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002458static int
2459Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2460{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002461 if (v == NULL) {
2462 PyErr_SetString(PyExc_TypeError,
2463 "attribute deletion is not supported");
2464 return -1;
2465 }
2466 Py_XDECREF(p->inst_pers_func);
2467 Py_INCREF(v);
2468 p->inst_pers_func = v;
2469 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002470}
2471
2472static PyObject *
2473Pickler_get_memo(Picklerobject *p)
2474{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002475 if (p->memo == NULL)
2476 PyErr_SetString(PyExc_AttributeError, "memo");
2477 else
2478 Py_INCREF(p->memo);
2479 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002480}
2481
2482static int
2483Pickler_set_memo(Picklerobject *p, PyObject *v)
2484{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002485 if (v == NULL) {
2486 PyErr_SetString(PyExc_TypeError,
2487 "attribute deletion is not supported");
2488 return -1;
2489 }
2490 if (!PyDict_Check(v)) {
2491 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2492 return -1;
2493 }
2494 Py_XDECREF(p->memo);
2495 Py_INCREF(v);
2496 p->memo = v;
2497 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002498}
2499
2500static PyObject *
2501Pickler_get_error(Picklerobject *p)
2502{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002503 /* why is this an attribute on the Pickler? */
2504 Py_INCREF(PicklingError);
2505 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002506}
2507
2508static PyMemberDef Pickler_members[] = {
2509 {"binary", T_INT, offsetof(Picklerobject, bin)},
2510 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002511 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002512};
2513
2514static PyGetSetDef Pickler_getsets[] = {
2515 {"persistent_id", (getter)Pickler_get_pers_func,
2516 (setter)Pickler_set_pers_func},
2517 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2518 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002519 {"PicklingError", (getter)Pickler_get_error, NULL},
2520 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002521};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002522
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002523static char Picklertype__doc__[] =
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002524"Objects that know how to pickle objects\n";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002525
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002526static PyTypeObject Picklertype = {
2527 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002528 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002529 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002530 sizeof(Picklerobject), /*tp_basicsize*/
2531 0,
2532 (destructor)Pickler_dealloc, /* tp_dealloc */
2533 0, /* tp_print */
2534 0, /* tp_getattr */
2535 0, /* tp_setattr */
2536 0, /* tp_compare */
2537 0, /* tp_repr */
2538 0, /* tp_as_number */
2539 0, /* tp_as_sequence */
2540 0, /* tp_as_mapping */
2541 0, /* tp_hash */
2542 0, /* tp_call */
2543 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002544 0, /* set below */ /* tp_getattro */
2545 0, /* set below */ /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002546 0, /* tp_as_buffer */
2547 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2548 Picklertype__doc__, /* tp_doc */
2549 0, /* tp_traverse */
2550 0, /* tp_clear */
2551 0, /* tp_richcompare */
2552 0, /* tp_weaklistoffset */
2553 0, /* tp_iter */
2554 0, /* tp_iternext */
2555 Pickler_methods, /* tp_methods */
2556 Pickler_members, /* tp_members */
2557 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002558};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002559
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002560static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002561find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
2562{
2563 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002565 if (fc) {
2566 if (fc==Py_None) {
2567 PyErr_SetString(UnpicklingError,
2568 "Global and instance pickles are not supported.");
2569 return NULL;
2570 }
2571 return PyObject_CallFunction(fc, "OO", py_module_name,
2572 py_global_name);
2573 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002575 module = PySys_GetObject("modules");
2576 if (module == NULL)
2577 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002579 module = PyDict_GetItem(module, py_module_name);
2580 if (module == NULL) {
2581 module = PyImport_Import(py_module_name);
2582 if (!module)
2583 return NULL;
2584 global = PyObject_GetAttr(module, py_global_name);
2585 Py_DECREF(module);
2586 }
2587 else
2588 global = PyObject_GetAttr(module, py_global_name);
2589 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002590}
2591
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002592static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002593marker(Unpicklerobject *self)
2594{
2595 if (self->num_marks < 1) {
2596 PyErr_SetString(UnpicklingError, "could not find MARK");
2597 return -1;
2598 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002600 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002601}
2602
Tim Peters84e87f32001-03-17 04:50:51 +00002603
Guido van Rossum60456fd1997-04-09 17:36:32 +00002604static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002605load_none(Unpicklerobject *self)
2606{
2607 PDATA_APPEND(self->stack, Py_None, -1);
2608 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002609}
2610
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002611static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002612bad_readline(void)
2613{
2614 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2615 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002616}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002617
2618static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002619load_int(Unpicklerobject *self)
2620{
2621 PyObject *py_int = 0;
2622 char *endptr, *s;
2623 int len, res = -1;
2624 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002626 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2627 if (len < 2) return bad_readline();
2628 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002630 errno = 0;
2631 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002633 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2634 /* Hm, maybe we've got something long. Let's try reading
2635 it as a Python long object. */
2636 errno = 0;
2637 py_int = PyLong_FromString(s, NULL, 0);
2638 if (py_int == NULL) {
2639 PyErr_SetString(PyExc_ValueError,
2640 "could not convert string to int");
2641 goto finally;
2642 }
2643 }
2644 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002645 if (len == 3 && (l == 0 || l == 1)) {
2646 if (!( py_int = PyBool_FromLong(l))) goto finally;
2647 }
2648 else {
2649 if (!( py_int = PyInt_FromLong(l))) goto finally;
2650 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002651 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002653 free(s);
2654 PDATA_PUSH(self->stack, py_int, -1);
2655 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002657 finally:
2658 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002659
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002660 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002661}
2662
2663
Tim Peters84e87f32001-03-17 04:50:51 +00002664static long
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002665calc_binint(char *s, int x)
2666{
2667 unsigned char c;
2668 int i;
2669 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002671 for (i = 0, l = 0L; i < x; i++) {
2672 c = (unsigned char)s[i];
2673 l |= (long)c << (i * 8);
2674 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002675#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002676 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2677 * is signed, so on a box with longs bigger than 4 bytes we need
2678 * to extend a BININT's sign bit to the full width.
2679 */
2680 if (x == 4 && l & (1L << 31))
2681 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002682#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002683 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002684}
2685
2686
2687static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002688load_binintx(Unpicklerobject *self, char *s, int x)
2689{
2690 PyObject *py_int = 0;
2691 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002693 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002695 if (!( py_int = PyInt_FromLong(l)))
2696 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002698 PDATA_PUSH(self->stack, py_int, -1);
2699 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002700}
2701
2702
2703static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002704load_binint(Unpicklerobject *self)
2705{
2706 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002708 if ((*self->read_func)(self, &s, 4) < 0)
2709 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002711 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002712}
2713
2714
2715static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002716load_binint1(Unpicklerobject *self)
2717{
2718 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002720 if ((*self->read_func)(self, &s, 1) < 0)
2721 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002723 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002724}
2725
2726
2727static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002728load_binint2(Unpicklerobject *self)
2729{
2730 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002732 if ((*self->read_func)(self, &s, 2) < 0)
2733 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002735 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002736}
Tim Peters84e87f32001-03-17 04:50:51 +00002737
Guido van Rossum60456fd1997-04-09 17:36:32 +00002738static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002739load_long(Unpicklerobject *self)
2740{
2741 PyObject *l = 0;
2742 char *end, *s;
2743 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002745 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2746 if (len < 2) return bad_readline();
2747 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002749 if (!( l = PyLong_FromString(s, &end, 0)))
2750 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002752 free(s);
2753 PDATA_PUSH(self->stack, l, -1);
2754 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002756 finally:
2757 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002759 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002760}
2761
Tim Peters84e87f32001-03-17 04:50:51 +00002762
Guido van Rossum60456fd1997-04-09 17:36:32 +00002763static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002764load_float(Unpicklerobject *self)
2765{
2766 PyObject *py_float = 0;
2767 char *endptr, *s;
2768 int len, res = -1;
2769 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002771 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2772 if (len < 2) return bad_readline();
2773 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002775 errno = 0;
2776 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002778 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2779 PyErr_SetString(PyExc_ValueError,
2780 "could not convert string to float");
2781 goto finally;
2782 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002784 if (!( py_float = PyFloat_FromDouble(d)))
2785 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002787 free(s);
2788 PDATA_PUSH(self->stack, py_float, -1);
2789 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002791 finally:
2792 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002794 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002795}
2796
Guido van Rossum60456fd1997-04-09 17:36:32 +00002797static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002798load_binfloat(Unpicklerobject *self)
2799{
2800 PyObject *py_float = 0;
2801 int s, e;
2802 long fhi, flo;
2803 double x;
2804 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002806 if ((*self->read_func)(self, &p, 8) < 0)
2807 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002809 /* First byte */
2810 s = (*p>>7) & 1;
2811 e = (*p & 0x7F) << 4;
2812 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002814 /* Second byte */
2815 e |= (*p>>4) & 0xF;
2816 fhi = (*p & 0xF) << 24;
2817 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002819 /* Third byte */
2820 fhi |= (*p & 0xFF) << 16;
2821 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002823 /* Fourth byte */
2824 fhi |= (*p & 0xFF) << 8;
2825 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002827 /* Fifth byte */
2828 fhi |= *p & 0xFF;
2829 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002831 /* Sixth byte */
2832 flo = (*p & 0xFF) << 16;
2833 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002835 /* Seventh byte */
2836 flo |= (*p & 0xFF) << 8;
2837 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002839 /* Eighth byte */
2840 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002842 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2843 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002845 /* XXX This sadly ignores Inf/NaN */
2846 if (e == 0)
2847 e = -1022;
2848 else {
2849 x += 1.0;
2850 e -= 1023;
2851 }
2852 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002854 if (s)
2855 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002857 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002859 PDATA_PUSH(self->stack, py_float, -1);
2860 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002861}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002862
2863static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002864load_string(Unpicklerobject *self)
2865{
2866 PyObject *str = 0;
2867 int len, res = -1, nslash;
2868 char *s, q, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002870 static PyObject *eval_dict = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002872 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2873 if (len < 2) return bad_readline();
2874 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002876 /* Check for unquoted quotes (evil strings) */
2877 q=*s;
2878 if (q != '"' && q != '\'') goto insecure;
2879 for (p=s+1, nslash=0; *p; p++) {
2880 if (*p==q && nslash%2==0) break;
2881 if (*p=='\\') nslash++;
2882 else nslash=0;
2883 }
2884 if (*p == q) {
2885 for (p++; *p; p++)
2886 if (*(unsigned char *)p > ' ')
2887 goto insecure;
2888 }
2889 else
2890 goto insecure;
2891 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002892
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002893 if (!( eval_dict ))
2894 if (!( eval_dict = Py_BuildValue("{s{}}", "__builtins__")))
2895 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002897 if (!( str = PyRun_String(s, Py_eval_input, eval_dict, eval_dict)))
2898 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002900 free(s);
2901 PDATA_PUSH(self->stack, str, -1);
2902 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002904 finally:
2905 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002907 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002908
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002909 insecure:
2910 free(s);
2911 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2912 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002913}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002914
2915
2916static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002917load_binstring(Unpicklerobject *self)
2918{
2919 PyObject *py_string = 0;
2920 long l;
2921 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002922
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002923 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002925 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002926
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002927 if ((*self->read_func)(self, &s, l) < 0)
2928 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002930 if (!( py_string = PyString_FromStringAndSize(s, l)))
2931 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002932
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002933 PDATA_PUSH(self->stack, py_string, -1);
2934 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002935}
2936
2937
2938static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002939load_short_binstring(Unpicklerobject *self)
2940{
2941 PyObject *py_string = 0;
2942 unsigned char l;
2943 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002945 if ((*self->read_func)(self, &s, 1) < 0)
2946 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002948 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002950 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002952 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002954 PDATA_PUSH(self->stack, py_string, -1);
2955 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002956}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002957
2958
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002959#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002960static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002961load_unicode(Unpicklerobject *self)
2962{
2963 PyObject *str = 0;
2964 int len, res = -1;
2965 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002967 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2968 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002970 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
2971 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002973 PDATA_PUSH(self->stack, str, -1);
2974 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002976 finally:
2977 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002978}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002979#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002980
2981
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002982#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002983static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002984load_binunicode(Unpicklerobject *self)
2985{
2986 PyObject *unicode;
2987 long l;
2988 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002990 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002991
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002992 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002994 if ((*self->read_func)(self, &s, l) < 0)
2995 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002997 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
2998 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003000 PDATA_PUSH(self->stack, unicode, -1);
3001 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003002}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003003#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003004
3005
3006static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003007load_tuple(Unpicklerobject *self)
3008{
3009 PyObject *tup;
3010 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003012 if ((i = marker(self)) < 0) return -1;
3013 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3014 PDATA_PUSH(self->stack, tup, -1);
3015 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003016}
3017
3018static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003019load_empty_tuple(Unpicklerobject *self)
3020{
3021 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003023 if (!( tup=PyTuple_New(0))) return -1;
3024 PDATA_PUSH(self->stack, tup, -1);
3025 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003026}
3027
3028static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003029load_empty_list(Unpicklerobject *self)
3030{
3031 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003033 if (!( list=PyList_New(0))) return -1;
3034 PDATA_PUSH(self->stack, list, -1);
3035 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003036}
3037
3038static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003039load_empty_dict(Unpicklerobject *self)
3040{
3041 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003042
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003043 if (!( dict=PyDict_New())) return -1;
3044 PDATA_PUSH(self->stack, dict, -1);
3045 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003046}
3047
3048
3049static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003050load_list(Unpicklerobject *self)
3051{
3052 PyObject *list = 0;
3053 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003055 if ((i = marker(self)) < 0) return -1;
3056 if (!( list=Pdata_popList(self->stack, i))) return -1;
3057 PDATA_PUSH(self->stack, list, -1);
3058 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003059}
3060
3061static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003062load_dict(Unpicklerobject *self)
3063{
3064 PyObject *dict, *key, *value;
3065 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003067 if ((i = marker(self)) < 0) return -1;
3068 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003070 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003072 for (k = i+1; k < j; k += 2) {
3073 key =self->stack->data[k-1];
3074 value=self->stack->data[k ];
3075 if (PyDict_SetItem(dict, key, value) < 0) {
3076 Py_DECREF(dict);
3077 return -1;
3078 }
3079 }
3080 Pdata_clear(self->stack, i);
3081 PDATA_PUSH(self->stack, dict, -1);
3082 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003083}
3084
3085static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003086Instance_New(PyObject *cls, PyObject *args)
3087{
3088 int has_key;
3089 PyObject *safe=0, *r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003091 if (PyClass_Check(cls)) {
3092 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003094 if ((l=PyObject_Size(args)) < 0) goto err;
3095 if (!( l )) {
3096 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003098 __getinitargs__ = PyObject_GetAttr(cls,
3099 __getinitargs___str);
3100 if (!__getinitargs__) {
3101 /* We have a class with no __getinitargs__,
3102 so bypass usual construction */
3103 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003105 PyErr_Clear();
3106 if (!( inst=PyInstance_NewRaw(cls, NULL)))
3107 goto err;
3108 return inst;
3109 }
3110 Py_DECREF(__getinitargs__);
3111 }
Tim Peters84e87f32001-03-17 04:50:51 +00003112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003113 if ((r=PyInstance_New(cls, args, NULL))) return r;
3114 else goto err;
3115 }
Tim Peters84e87f32001-03-17 04:50:51 +00003116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003117 /* Is safe_constructors always a dict? */
3118 has_key = cPickle_PyMapping_HasKey(safe_constructors, cls);
3119 if (!has_key) {
3120 safe = PyObject_GetAttr(cls, __safe_for_unpickling___str);
3121 if (!safe ||
3122 !PyObject_IsTrue(safe)) {
3123 cPickle_ErrFormat(UnpicklingError,
3124 "%s is not safe for unpickling",
3125 "O", cls);
3126 Py_XDECREF(safe);
3127 return NULL;
3128 }
3129 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003131 if (args==Py_None) {
3132 /* Special case, call cls.__basicnew__() */
3133 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003135 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3136 if (!basicnew) return NULL;
3137 r=PyObject_CallObject(basicnew, NULL);
3138 Py_DECREF(basicnew);
3139 if (r) return r;
3140 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003142 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003144 err:
3145 {
3146 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003148 PyErr_Fetch(&tp, &v, &tb);
3149 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3150 Py_XDECREF(v);
3151 v=r;
3152 }
3153 PyErr_Restore(tp,v,tb);
3154 }
3155 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003156}
Tim Peters84e87f32001-03-17 04:50:51 +00003157
Guido van Rossum60456fd1997-04-09 17:36:32 +00003158
3159static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003160load_obj(Unpicklerobject *self)
3161{
3162 PyObject *class, *tup, *obj=0;
3163 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003165 if ((i = marker(self)) < 0) return -1;
3166 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3167 PDATA_POP(self->stack, class);
3168 if (class) {
3169 obj = Instance_New(class, tup);
3170 Py_DECREF(class);
3171 }
3172 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003174 if (! obj) return -1;
3175 PDATA_PUSH(self->stack, obj, -1);
3176 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003177}
3178
3179
3180static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003181load_inst(Unpicklerobject *self)
3182{
3183 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3184 int i, len;
3185 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003187 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003189 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3190 if (len < 2) return bad_readline();
3191 module_name = PyString_FromStringAndSize(s, len - 1);
3192 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003194 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3195 if (len < 2) return bad_readline();
3196 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3197 class = find_class(module_name, class_name,
3198 self->find_class);
3199 Py_DECREF(class_name);
3200 }
3201 }
3202 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003204 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003206 if ((tup=Pdata_popTuple(self->stack, i))) {
3207 obj = Instance_New(class, tup);
3208 Py_DECREF(tup);
3209 }
3210 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003212 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003214 PDATA_PUSH(self->stack, obj, -1);
3215 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003216}
3217
3218
3219static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003220load_global(Unpicklerobject *self)
3221{
3222 PyObject *class = 0, *module_name = 0, *class_name = 0;
3223 int len;
3224 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003226 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3227 if (len < 2) return bad_readline();
3228 module_name = PyString_FromStringAndSize(s, len - 1);
3229 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003231 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3232 if (len < 2) return bad_readline();
3233 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3234 class = find_class(module_name, class_name,
3235 self->find_class);
3236 Py_DECREF(class_name);
3237 }
3238 }
3239 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003241 if (! class) return -1;
3242 PDATA_PUSH(self->stack, class, -1);
3243 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003244}
3245
3246
3247static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003248load_persid(Unpicklerobject *self)
3249{
3250 PyObject *pid = 0;
3251 int len;
3252 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003254 if (self->pers_func) {
3255 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3256 if (len < 2) return bad_readline();
3257
3258 pid = PyString_FromStringAndSize(s, len - 1);
3259 if (!pid) return -1;
3260
3261 if (PyList_Check(self->pers_func)) {
3262 if (PyList_Append(self->pers_func, pid) < 0) {
3263 Py_DECREF(pid);
3264 return -1;
3265 }
3266 }
3267 else {
3268 ARG_TUP(self, pid);
3269 if (self->arg) {
3270 pid = PyObject_Call(self->pers_func, self->arg,
3271 NULL);
3272 FREE_ARG_TUP(self);
3273 }
3274 }
3275
3276 if (! pid) return -1;
3277
3278 PDATA_PUSH(self->stack, pid, -1);
3279 return 0;
3280 }
3281 else {
3282 PyErr_SetString(UnpicklingError,
3283 "A load persistent id instruction was encountered,\n"
3284 "but no persistent_load function was specified.");
3285 return -1;
3286 }
3287}
3288
3289static int
3290load_binpersid(Unpicklerobject *self)
3291{
3292 PyObject *pid = 0;
3293
3294 if (self->pers_func) {
3295 PDATA_POP(self->stack, pid);
3296 if (! pid) return -1;
3297
3298 if (PyList_Check(self->pers_func)) {
3299 if (PyList_Append(self->pers_func, pid) < 0) {
3300 Py_DECREF(pid);
3301 return -1;
3302 }
3303 }
3304 else {
3305 ARG_TUP(self, pid);
3306 if (self->arg) {
3307 pid = PyObject_Call(self->pers_func, self->arg,
3308 NULL);
3309 FREE_ARG_TUP(self);
3310 }
3311 if (! pid) return -1;
3312 }
3313
3314 PDATA_PUSH(self->stack, pid, -1);
3315 return 0;
3316 }
3317 else {
3318 PyErr_SetString(UnpicklingError,
3319 "A load persistent id instruction was encountered,\n"
3320 "but no persistent_load function was specified.");
3321 return -1;
3322 }
3323}
3324
3325
3326static int
3327load_pop(Unpicklerobject *self)
3328{
3329 int len;
3330
3331 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3332
3333 /* Note that we split the (pickle.py) stack into two stacks,
3334 an object stack and a mark stack. We have to be clever and
3335 pop the right one. We do this by looking at the top of the
3336 mark stack.
3337 */
3338
3339 if ((self->num_marks > 0) &&
3340 (self->marks[self->num_marks - 1] == len))
3341 self->num_marks--;
3342 else {
3343 len--;
3344 Py_DECREF(self->stack->data[len]);
3345 self->stack->length=len;
3346 }
3347
3348 return 0;
3349}
3350
3351
3352static int
3353load_pop_mark(Unpicklerobject *self)
3354{
3355 int i;
3356
3357 if ((i = marker(self)) < 0)
3358 return -1;
3359
3360 Pdata_clear(self->stack, i);
3361
3362 return 0;
3363}
3364
3365
3366static int
3367load_dup(Unpicklerobject *self)
3368{
3369 PyObject *last;
3370 int len;
3371
3372 if ((len = self->stack->length) <= 0) return stackUnderflow();
3373 last=self->stack->data[len-1];
3374 Py_INCREF(last);
3375 PDATA_PUSH(self->stack, last, -1);
3376 return 0;
3377}
3378
3379
3380static int
3381load_get(Unpicklerobject *self)
3382{
3383 PyObject *py_str = 0, *value = 0;
3384 int len;
3385 char *s;
3386 int rc;
3387
3388 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003389 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003391 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003393 value = PyDict_GetItem(self->memo, py_str);
3394 if (! value) {
3395 PyErr_SetObject(BadPickleGet, py_str);
3396 rc = -1;
3397 } else {
3398 PDATA_APPEND(self->stack, value, -1);
3399 rc = 0;
3400 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003402 Py_DECREF(py_str);
3403 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003404}
3405
3406
3407static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003408load_binget(Unpicklerobject *self)
3409{
3410 PyObject *py_key = 0, *value = 0;
3411 unsigned char key;
3412 char *s;
3413 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003415 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003417 key = (unsigned char)s[0];
3418 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003420 value = PyDict_GetItem(self->memo, py_key);
3421 if (! value) {
3422 PyErr_SetObject(BadPickleGet, py_key);
3423 rc = -1;
3424 } else {
3425 PDATA_APPEND(self->stack, value, -1);
3426 rc = 0;
3427 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003429 Py_DECREF(py_key);
3430 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003431}
3432
3433
3434static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003435load_long_binget(Unpicklerobject *self)
3436{
3437 PyObject *py_key = 0, *value = 0;
3438 unsigned char c;
3439 char *s;
3440 long key;
3441 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003443 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003445 c = (unsigned char)s[0];
3446 key = (long)c;
3447 c = (unsigned char)s[1];
3448 key |= (long)c << 8;
3449 c = (unsigned char)s[2];
3450 key |= (long)c << 16;
3451 c = (unsigned char)s[3];
3452 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003454 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3455
3456 value = PyDict_GetItem(self->memo, py_key);
3457 if (! value) {
3458 PyErr_SetObject(BadPickleGet, py_key);
3459 rc = -1;
3460 } else {
3461 PDATA_APPEND(self->stack, value, -1);
3462 rc = 0;
3463 }
3464
3465 Py_DECREF(py_key);
3466 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003467}
3468
3469
3470static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003471load_put(Unpicklerobject *self)
3472{
3473 PyObject *py_str = 0, *value = 0;
3474 int len, l;
3475 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003477 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3478 if (l < 2) return bad_readline();
3479 if (!( len=self->stack->length )) return stackUnderflow();
3480 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3481 value=self->stack->data[len-1];
3482 l=PyDict_SetItem(self->memo, py_str, value);
3483 Py_DECREF(py_str);
3484 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003485}
3486
3487
3488static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003489load_binput(Unpicklerobject *self)
3490{
3491 PyObject *py_key = 0, *value = 0;
3492 unsigned char key;
3493 char *s;
3494 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003496 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3497 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003499 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003501 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3502 value=self->stack->data[len-1];
3503 len=PyDict_SetItem(self->memo, py_key, value);
3504 Py_DECREF(py_key);
3505 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003506}
3507
3508
3509static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003510load_long_binput(Unpicklerobject *self)
3511{
3512 PyObject *py_key = 0, *value = 0;
3513 long key;
3514 unsigned char c;
3515 char *s;
3516 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003518 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3519 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003521 c = (unsigned char)s[0];
3522 key = (long)c;
3523 c = (unsigned char)s[1];
3524 key |= (long)c << 8;
3525 c = (unsigned char)s[2];
3526 key |= (long)c << 16;
3527 c = (unsigned char)s[3];
3528 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003530 if (!( py_key = PyInt_FromLong(key))) return -1;
3531 value=self->stack->data[len-1];
3532 len=PyDict_SetItem(self->memo, py_key, value);
3533 Py_DECREF(py_key);
3534 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003535}
3536
3537
3538static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003539do_append(Unpicklerobject *self, int x)
3540{
3541 PyObject *value = 0, *list = 0, *append_method = 0;
3542 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003544 len=self->stack->length;
3545 if (!( len >= x && x > 0 )) return stackUnderflow();
3546 /* nothing to do */
3547 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003549 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003550
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003551 if (PyList_Check(list)) {
3552 PyObject *slice;
3553 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003555 slice=Pdata_popList(self->stack, x);
3556 list_len = PyList_GET_SIZE(list);
3557 i=PyList_SetSlice(list, list_len, list_len, slice);
3558 Py_DECREF(slice);
3559 return i;
3560 }
3561 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003563 if (!( append_method = PyObject_GetAttr(list, append_str)))
3564 return -1;
3565
3566 for (i = x; i < len; i++) {
3567 PyObject *junk;
3568
3569 value=self->stack->data[i];
3570 junk=0;
3571 ARG_TUP(self, value);
3572 if (self->arg) {
3573 junk = PyObject_Call(append_method, self->arg,
3574 NULL);
3575 FREE_ARG_TUP(self);
3576 }
3577 if (! junk) {
3578 Pdata_clear(self->stack, i+1);
3579 self->stack->length=x;
3580 Py_DECREF(append_method);
3581 return -1;
3582 }
3583 Py_DECREF(junk);
3584 }
3585 self->stack->length=x;
3586 Py_DECREF(append_method);
3587 }
3588
3589 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003590}
3591
3592
3593static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003594load_append(Unpicklerobject *self)
3595{
3596 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003597}
3598
3599
3600static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003601load_appends(Unpicklerobject *self)
3602{
3603 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003604}
3605
3606
3607static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003608do_setitems(Unpicklerobject *self, int x)
3609{
3610 PyObject *value = 0, *key = 0, *dict = 0;
3611 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003613 if (!( (len=self->stack->length) >= x
3614 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003616 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003618 for (i = x+1; i < len; i += 2) {
3619 key =self->stack->data[i-1];
3620 value=self->stack->data[i ];
3621 if (PyObject_SetItem(dict, key, value) < 0) {
3622 r=-1;
3623 break;
3624 }
3625 }
3626
3627 Pdata_clear(self->stack, x);
3628
3629 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003630}
3631
3632
Tim Peters84e87f32001-03-17 04:50:51 +00003633static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003634load_setitem(Unpicklerobject *self)
3635{
3636 return do_setitems(self, self->stack->length - 2);
3637}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003639static int
3640load_setitems(Unpicklerobject *self)
3641{
3642 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003643}
3644
Tim Peters84e87f32001-03-17 04:50:51 +00003645
Guido van Rossum60456fd1997-04-09 17:36:32 +00003646static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003647load_build(Unpicklerobject *self)
3648{
3649 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3650 *junk = 0, *__setstate__ = 0;
3651 int i, r = 0;
3652
3653 if (self->stack->length < 2) return stackUnderflow();
3654 PDATA_POP(self->stack, value);
3655 if (! value) return -1;
3656 inst=self->stack->data[self->stack->length-1];
3657
3658 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3659 ARG_TUP(self, value);
3660 if (self->arg) {
3661 junk = PyObject_Call(__setstate__, self->arg, NULL);
3662 FREE_ARG_TUP(self);
3663 }
3664 Py_DECREF(__setstate__);
3665 if (! junk) return -1;
3666 Py_DECREF(junk);
3667 return 0;
3668 }
3669
3670 PyErr_Clear();
3671 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3672 i = 0;
3673 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3674 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3675 r=-1;
3676 break;
3677 }
3678 }
3679 Py_DECREF(instdict);
3680 }
3681 else r=-1;
3682
3683 Py_XDECREF(value);
3684
3685 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003686}
3687
3688
3689static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003690load_mark(Unpicklerobject *self)
3691{
3692 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003694 /* Note that we split the (pickle.py) stack into two stacks, an
3695 object stack and a mark stack. Here we push a mark onto the
3696 mark stack.
3697 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003699 if ((self->num_marks + 1) >= self->marks_size) {
3700 s=self->marks_size+20;
3701 if (s <= self->num_marks) s=self->num_marks + 1;
3702 if (self->marks == NULL)
3703 self->marks=(int *)malloc(s * sizeof(int));
3704 else
3705 self->marks=(int *)realloc(self->marks,
3706 s * sizeof(int));
3707 if (! self->marks) {
3708 PyErr_NoMemory();
3709 return -1;
3710 }
3711 self->marks_size = s;
3712 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003714 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003716 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003717}
3718
Guido van Rossum60456fd1997-04-09 17:36:32 +00003719static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003720load_reduce(Unpicklerobject *self)
3721{
3722 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003724 PDATA_POP(self->stack, arg_tup);
3725 if (! arg_tup) return -1;
3726 PDATA_POP(self->stack, callable);
3727 if (callable) {
3728 ob = Instance_New(callable, arg_tup);
3729 Py_DECREF(callable);
3730 }
3731 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003733 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003735 PDATA_PUSH(self->stack, ob, -1);
3736 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003737}
Tim Peters84e87f32001-03-17 04:50:51 +00003738
Guido van Rossum60456fd1997-04-09 17:36:32 +00003739static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003740load(Unpicklerobject *self)
3741{
3742 PyObject *err = 0, *val = 0;
3743 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003745 self->num_marks = 0;
3746 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003747
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003748 while (1) {
3749 if ((*self->read_func)(self, &s, 1) < 0)
3750 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003752 switch (s[0]) {
3753 case NONE:
3754 if (load_none(self) < 0)
3755 break;
3756 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003758 case BININT:
3759 if (load_binint(self) < 0)
3760 break;
3761 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003763 case BININT1:
3764 if (load_binint1(self) < 0)
3765 break;
3766 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003768 case BININT2:
3769 if (load_binint2(self) < 0)
3770 break;
3771 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003773 case INT:
3774 if (load_int(self) < 0)
3775 break;
3776 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003778 case LONG:
3779 if (load_long(self) < 0)
3780 break;
3781 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003783 case FLOAT:
3784 if (load_float(self) < 0)
3785 break;
3786 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003788 case BINFLOAT:
3789 if (load_binfloat(self) < 0)
3790 break;
3791 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003793 case BINSTRING:
3794 if (load_binstring(self) < 0)
3795 break;
3796 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003798 case SHORT_BINSTRING:
3799 if (load_short_binstring(self) < 0)
3800 break;
3801 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003803 case STRING:
3804 if (load_string(self) < 0)
3805 break;
3806 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003807
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003808#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003809 case UNICODE:
3810 if (load_unicode(self) < 0)
3811 break;
3812 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003814 case BINUNICODE:
3815 if (load_binunicode(self) < 0)
3816 break;
3817 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003818#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003820 case EMPTY_TUPLE:
3821 if (load_empty_tuple(self) < 0)
3822 break;
3823 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003825 case TUPLE:
3826 if (load_tuple(self) < 0)
3827 break;
3828 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003830 case EMPTY_LIST:
3831 if (load_empty_list(self) < 0)
3832 break;
3833 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003835 case LIST:
3836 if (load_list(self) < 0)
3837 break;
3838 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003840 case EMPTY_DICT:
3841 if (load_empty_dict(self) < 0)
3842 break;
3843 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003845 case DICT:
3846 if (load_dict(self) < 0)
3847 break;
3848 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003850 case OBJ:
3851 if (load_obj(self) < 0)
3852 break;
3853 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003855 case INST:
3856 if (load_inst(self) < 0)
3857 break;
3858 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003860 case GLOBAL:
3861 if (load_global(self) < 0)
3862 break;
3863 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003865 case APPEND:
3866 if (load_append(self) < 0)
3867 break;
3868 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003870 case APPENDS:
3871 if (load_appends(self) < 0)
3872 break;
3873 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003875 case BUILD:
3876 if (load_build(self) < 0)
3877 break;
3878 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003880 case DUP:
3881 if (load_dup(self) < 0)
3882 break;
3883 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003885 case BINGET:
3886 if (load_binget(self) < 0)
3887 break;
3888 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003890 case LONG_BINGET:
3891 if (load_long_binget(self) < 0)
3892 break;
3893 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003895 case GET:
3896 if (load_get(self) < 0)
3897 break;
3898 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003900 case MARK:
3901 if (load_mark(self) < 0)
3902 break;
3903 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003904
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003905 case BINPUT:
3906 if (load_binput(self) < 0)
3907 break;
3908 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003909
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003910 case LONG_BINPUT:
3911 if (load_long_binput(self) < 0)
3912 break;
3913 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003915 case PUT:
3916 if (load_put(self) < 0)
3917 break;
3918 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003919
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003920 case POP:
3921 if (load_pop(self) < 0)
3922 break;
3923 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003925 case POP_MARK:
3926 if (load_pop_mark(self) < 0)
3927 break;
3928 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003930 case SETITEM:
3931 if (load_setitem(self) < 0)
3932 break;
3933 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003935 case SETITEMS:
3936 if (load_setitems(self) < 0)
3937 break;
3938 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003940 case STOP:
3941 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003943 case PERSID:
3944 if (load_persid(self) < 0)
3945 break;
3946 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003948 case BINPERSID:
3949 if (load_binpersid(self) < 0)
3950 break;
3951 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003953 case REDUCE:
3954 if (load_reduce(self) < 0)
3955 break;
3956 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003958 case '\0':
3959 /* end of file */
3960 PyErr_SetNone(PyExc_EOFError);
3961 break;
Neil Schemenauerfa79c652002-03-22 23:02:53 +00003962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003963 default:
3964 cPickle_ErrFormat(UnpicklingError,
3965 "invalid load key, '%s'.",
3966 "c", s[0]);
3967 return NULL;
3968 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003970 break;
3971 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003973 if ((err = PyErr_Occurred())) {
3974 if (err == PyExc_EOFError) {
3975 PyErr_SetNone(PyExc_EOFError);
3976 }
3977 return NULL;
3978 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003980 PDATA_POP(self->stack, val);
3981 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003982}
Tim Peters84e87f32001-03-17 04:50:51 +00003983
Guido van Rossum60456fd1997-04-09 17:36:32 +00003984
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003985/* No-load functions to support noload, which is used to
3986 find persistent references. */
3987
3988static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003989noload_obj(Unpicklerobject *self)
3990{
3991 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003993 if ((i = marker(self)) < 0) return -1;
3994 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003995}
3996
3997
3998static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003999noload_inst(Unpicklerobject *self)
4000{
4001 int i;
4002 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004004 if ((i = marker(self)) < 0) return -1;
4005 Pdata_clear(self->stack, i);
4006 if ((*self->readline_func)(self, &s) < 0) return -1;
4007 if ((*self->readline_func)(self, &s) < 0) return -1;
4008 PDATA_APPEND(self->stack, Py_None,-1);
4009 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004010}
4011
4012static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004013noload_global(Unpicklerobject *self)
4014{
4015 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004017 if ((*self->readline_func)(self, &s) < 0) return -1;
4018 if ((*self->readline_func)(self, &s) < 0) return -1;
4019 PDATA_APPEND(self->stack, Py_None,-1);
4020 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004021}
4022
4023static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004024noload_reduce(Unpicklerobject *self)
4025{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004027 if (self->stack->length < 2) return stackUnderflow();
4028 Pdata_clear(self->stack, self->stack->length-2);
4029 PDATA_APPEND(self->stack, Py_None,-1);
4030 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004031}
4032
4033static int
4034noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004035
Guido van Rossum053b8df1998-11-25 16:18:00 +00004036 if (self->stack->length < 1) return stackUnderflow();
4037 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004038 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004039}
4040
4041
4042static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004043noload(Unpicklerobject *self)
4044{
4045 PyObject *err = 0, *val = 0;
4046 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004048 self->num_marks = 0;
4049 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004050
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004051 while (1) {
4052 if ((*self->read_func)(self, &s, 1) < 0)
4053 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004055 switch (s[0]) {
4056 case NONE:
4057 if (load_none(self) < 0)
4058 break;
4059 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004061 case BININT:
4062 if (load_binint(self) < 0)
4063 break;
4064 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004066 case BININT1:
4067 if (load_binint1(self) < 0)
4068 break;
4069 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004071 case BININT2:
4072 if (load_binint2(self) < 0)
4073 break;
4074 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004076 case INT:
4077 if (load_int(self) < 0)
4078 break;
4079 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004081 case LONG:
4082 if (load_long(self) < 0)
4083 break;
4084 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004086 case FLOAT:
4087 if (load_float(self) < 0)
4088 break;
4089 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004091 case BINFLOAT:
4092 if (load_binfloat(self) < 0)
4093 break;
4094 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004096 case BINSTRING:
4097 if (load_binstring(self) < 0)
4098 break;
4099 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004101 case SHORT_BINSTRING:
4102 if (load_short_binstring(self) < 0)
4103 break;
4104 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004106 case STRING:
4107 if (load_string(self) < 0)
4108 break;
4109 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004110
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004111#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004112 case UNICODE:
4113 if (load_unicode(self) < 0)
4114 break;
4115 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004117 case BINUNICODE:
4118 if (load_binunicode(self) < 0)
4119 break;
4120 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004121#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004123 case EMPTY_TUPLE:
4124 if (load_empty_tuple(self) < 0)
4125 break;
4126 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004128 case TUPLE:
4129 if (load_tuple(self) < 0)
4130 break;
4131 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004133 case EMPTY_LIST:
4134 if (load_empty_list(self) < 0)
4135 break;
4136 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004138 case LIST:
4139 if (load_list(self) < 0)
4140 break;
4141 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004143 case EMPTY_DICT:
4144 if (load_empty_dict(self) < 0)
4145 break;
4146 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004148 case DICT:
4149 if (load_dict(self) < 0)
4150 break;
4151 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004153 case OBJ:
4154 if (noload_obj(self) < 0)
4155 break;
4156 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004158 case INST:
4159 if (noload_inst(self) < 0)
4160 break;
4161 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004163 case GLOBAL:
4164 if (noload_global(self) < 0)
4165 break;
4166 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004168 case APPEND:
4169 if (load_append(self) < 0)
4170 break;
4171 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004173 case APPENDS:
4174 if (load_appends(self) < 0)
4175 break;
4176 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004178 case BUILD:
4179 if (noload_build(self) < 0)
4180 break;
4181 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004183 case DUP:
4184 if (load_dup(self) < 0)
4185 break;
4186 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004188 case BINGET:
4189 if (load_binget(self) < 0)
4190 break;
4191 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004193 case LONG_BINGET:
4194 if (load_long_binget(self) < 0)
4195 break;
4196 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004198 case GET:
4199 if (load_get(self) < 0)
4200 break;
4201 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004203 case MARK:
4204 if (load_mark(self) < 0)
4205 break;
4206 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004208 case BINPUT:
4209 if (load_binput(self) < 0)
4210 break;
4211 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004213 case LONG_BINPUT:
4214 if (load_long_binput(self) < 0)
4215 break;
4216 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004218 case PUT:
4219 if (load_put(self) < 0)
4220 break;
4221 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004223 case POP:
4224 if (load_pop(self) < 0)
4225 break;
4226 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004228 case POP_MARK:
4229 if (load_pop_mark(self) < 0)
4230 break;
4231 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004233 case SETITEM:
4234 if (load_setitem(self) < 0)
4235 break;
4236 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004238 case SETITEMS:
4239 if (load_setitems(self) < 0)
4240 break;
4241 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004243 case STOP:
4244 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004245
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004246 case PERSID:
4247 if (load_persid(self) < 0)
4248 break;
4249 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004251 case BINPERSID:
4252 if (load_binpersid(self) < 0)
4253 break;
4254 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004255
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004256 case REDUCE:
4257 if (noload_reduce(self) < 0)
4258 break;
4259 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004260
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004261 default:
4262 cPickle_ErrFormat(UnpicklingError,
4263 "invalid load key, '%s'.",
4264 "c", s[0]);
4265 return NULL;
4266 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004268 break;
4269 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004270
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004271 if ((err = PyErr_Occurred())) {
4272 if (err == PyExc_EOFError) {
4273 PyErr_SetNone(PyExc_EOFError);
4274 }
4275 return NULL;
4276 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004278 PDATA_POP(self->stack, val);
4279 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004280}
Tim Peters84e87f32001-03-17 04:50:51 +00004281
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004282
Guido van Rossum60456fd1997-04-09 17:36:32 +00004283static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004284Unpickler_load(Unpicklerobject *self, PyObject *args)
4285{
4286 if (!( PyArg_ParseTuple(args, ":load")))
4287 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004289 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004290}
4291
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004292static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004293Unpickler_noload(Unpicklerobject *self, PyObject *args)
4294{
4295 if (!( PyArg_ParseTuple(args, ":noload")))
4296 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004298 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004299}
4300
Guido van Rossum60456fd1997-04-09 17:36:32 +00004301
4302static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004303 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004304 "load() -- Load a pickle"
4305 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004306 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004307 "noload() -- not load a pickle, but go through most of the motions\n"
4308 "\n"
4309 "This function can be used to read past a pickle without instantiating\n"
4310 "any objects or importing any modules. It can also be used to find all\n"
4311 "persistent references without instantiating any objects or importing\n"
4312 "any modules.\n"
4313 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004314 {NULL, NULL} /* sentinel */
4315};
4316
4317
4318static Unpicklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004319newUnpicklerobject(PyObject *f)
4320{
4321 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004322
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004323 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
4324 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004326 self->file = NULL;
4327 self->arg = NULL;
4328 self->stack = (Pdata*)Pdata_New();
4329 self->pers_func = NULL;
4330 self->last_string = NULL;
4331 self->marks = NULL;
4332 self->num_marks = 0;
4333 self->marks_size = 0;
4334 self->buf_size = 0;
4335 self->read = NULL;
4336 self->readline = NULL;
4337 self->safe_constructors = NULL;
4338 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004340 if (!( self->memo = PyDict_New()))
4341 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004343 Py_INCREF(f);
4344 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004346 /* Set read, readline based on type of f */
4347 if (PyFile_Check(f)) {
4348 self->fp = PyFile_AsFile(f);
4349 if (self->fp == NULL) {
4350 PyErr_SetString(PyExc_ValueError,
4351 "I/O operation on closed file");
4352 goto err;
4353 }
4354 self->read_func = read_file;
4355 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004356 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004357 else if (PycStringIO_InputCheck(f)) {
4358 self->fp = NULL;
4359 self->read_func = read_cStringIO;
4360 self->readline_func = readline_cStringIO;
4361 }
4362 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004364 self->fp = NULL;
4365 self->read_func = read_other;
4366 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004368 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4369 (self->read = PyObject_GetAttr(f, read_str)))) {
4370 PyErr_Clear();
4371 PyErr_SetString( PyExc_TypeError,
4372 "argument must have 'read' and "
4373 "'readline' attributes" );
4374 goto err;
4375 }
4376 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004377
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004378 if (PyEval_GetRestricted()) {
4379 /* Restricted execution, get private tables */
4380 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004382 if (!( m=PyImport_Import(copy_reg_str))) goto err;
4383 self->safe_constructors=PyObject_GetAttr(m,
4384 safe_constructors_str);
4385 Py_DECREF(m);
4386 if (!( self->safe_constructors )) goto err;
4387 }
4388 else {
4389 self->safe_constructors=safe_constructors;
4390 Py_INCREF(safe_constructors);
4391 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004393 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004395 err:
4396 Py_DECREF((PyObject *)self);
4397 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004398}
4399
4400
4401static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004402get_Unpickler(PyObject *self, PyObject *args)
4403{
4404 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004406 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
4407 return NULL;
4408 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004409}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004410
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004411
Guido van Rossum60456fd1997-04-09 17:36:32 +00004412static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004413Unpickler_dealloc(Unpicklerobject *self)
4414{
4415 Py_XDECREF(self->readline);
4416 Py_XDECREF(self->read);
4417 Py_XDECREF(self->file);
4418 Py_XDECREF(self->memo);
4419 Py_XDECREF(self->stack);
4420 Py_XDECREF(self->pers_func);
4421 Py_XDECREF(self->arg);
4422 Py_XDECREF(self->last_string);
4423 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004425 if (self->marks) {
4426 free(self->marks);
4427 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004429 if (self->buf_size) {
4430 free(self->buf);
4431 }
Tim Peters84e87f32001-03-17 04:50:51 +00004432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004433 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004434}
4435
4436
4437static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004438Unpickler_getattr(Unpicklerobject *self, char *name)
4439{
4440 if (!strcmp(name, "persistent_load")) {
4441 if (!self->pers_func) {
4442 PyErr_SetString(PyExc_AttributeError, name);
4443 return NULL;
4444 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004446 Py_INCREF(self->pers_func);
4447 return self->pers_func;
4448 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004450 if (!strcmp(name, "find_global")) {
4451 if (!self->find_class) {
4452 PyErr_SetString(PyExc_AttributeError, name);
4453 return NULL;
4454 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004456 Py_INCREF(self->find_class);
4457 return self->find_class;
4458 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004460 if (!strcmp(name, "memo")) {
4461 if (!self->memo) {
4462 PyErr_SetString(PyExc_AttributeError, name);
4463 return NULL;
4464 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004466 Py_INCREF(self->memo);
4467 return self->memo;
4468 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004470 if (!strcmp(name, "UnpicklingError")) {
4471 Py_INCREF(UnpicklingError);
4472 return UnpicklingError;
4473 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004475 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004476}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004477
Guido van Rossum60456fd1997-04-09 17:36:32 +00004478
4479static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004480Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
4481{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004483 if (!strcmp(name, "persistent_load")) {
4484 Py_XDECREF(self->pers_func);
4485 self->pers_func = value;
4486 Py_XINCREF(value);
4487 return 0;
4488 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004490 if (!strcmp(name, "find_global")) {
4491 Py_XDECREF(self->find_class);
4492 self->find_class = value;
4493 Py_XINCREF(value);
4494 return 0;
4495 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004497 if (! value) {
4498 PyErr_SetString(PyExc_TypeError,
4499 "attribute deletion is not supported");
4500 return -1;
4501 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004503 if (strcmp(name, "memo") == 0) {
4504 if (!PyDict_Check(value)) {
4505 PyErr_SetString(PyExc_TypeError,
4506 "memo must be a dictionary");
4507 return -1;
4508 }
4509 Py_XDECREF(self->memo);
4510 self->memo = value;
4511 Py_INCREF(value);
4512 return 0;
4513 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004515 PyErr_SetString(PyExc_AttributeError, name);
4516 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004517}
4518
4519
4520static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004521cpm_dump(PyObject *self, PyObject *args)
4522{
4523 PyObject *ob, *file, *res = NULL;
4524 Picklerobject *pickler = 0;
4525 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004527 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin)))
4528 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004530 if (!( pickler = newPicklerobject(file, bin)))
4531 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004533 if (dump(pickler, ob) < 0)
4534 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004536 Py_INCREF(Py_None);
4537 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004538
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004539 finally:
4540 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004542 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004543}
4544
4545
4546static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004547cpm_dumps(PyObject *self, PyObject *args)
4548{
4549 PyObject *ob, *file = 0, *res = NULL;
4550 Picklerobject *pickler = 0;
4551 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004553 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin)))
4554 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004556 if (!( file = PycStringIO->NewOutput(128)))
4557 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004559 if (!( pickler = newPicklerobject(file, bin)))
4560 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004562 if (dump(pickler, ob) < 0)
4563 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004565 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004567 finally:
4568 Py_XDECREF(pickler);
4569 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004571 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004572}
4573
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004574
4575static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004576cpm_load(PyObject *self, PyObject *args)
4577{
4578 Unpicklerobject *unpickler = 0;
4579 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004581 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
4582 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004583
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004584 if (!( unpickler = newUnpicklerobject(ob)))
4585 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004587 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004589 finally:
4590 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004592 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004593}
4594
4595
4596static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004597cpm_loads(PyObject *self, PyObject *args)
4598{
4599 PyObject *ob, *file = 0, *res = NULL;
4600 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004602 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
4603 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004605 if (!( file = PycStringIO->NewInput(ob)))
4606 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004608 if (!( unpickler = newUnpicklerobject(file)))
4609 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004611 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004613 finally:
4614 Py_XDECREF(file);
4615 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004617 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004618}
4619
4620
Tim Peters84e87f32001-03-17 04:50:51 +00004621static char Unpicklertype__doc__[] =
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004622"Objects that know how to unpickle";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004623
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004624static PyTypeObject Unpicklertype = {
4625 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004626 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004627 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004628 sizeof(Unpicklerobject), /*tp_basicsize*/
4629 0, /*tp_itemsize*/
4630 /* methods */
4631 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4632 (printfunc)0, /*tp_print*/
4633 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4634 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4635 (cmpfunc)0, /*tp_compare*/
4636 (reprfunc)0, /*tp_repr*/
4637 0, /*tp_as_number*/
4638 0, /*tp_as_sequence*/
4639 0, /*tp_as_mapping*/
4640 (hashfunc)0, /*tp_hash*/
4641 (ternaryfunc)0, /*tp_call*/
4642 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004643
Guido van Rossum60456fd1997-04-09 17:36:32 +00004644 /* Space for future expansion */
4645 0L,0L,0L,0L,
4646 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004647};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004648
Guido van Rossum60456fd1997-04-09 17:36:32 +00004649static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004650 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004651 "dump(object, file, [binary]) --"
4652 "Write an object in pickle format to the given file\n"
4653 "\n"
4654 "If the optional argument, binary, is provided and is true, then the\n"
4655 "pickle will be written in binary format, which is more space and\n"
4656 "computationally efficient. \n"
4657 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004658 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004659 "dumps(object, [binary]) --"
4660 "Return a string containing an object in pickle format\n"
4661 "\n"
4662 "If the optional argument, binary, is provided and is true, then the\n"
4663 "pickle will be written in binary format, which is more space and\n"
4664 "computationally efficient. \n"
4665 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004666 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004667 "load(file) -- Load a pickle from the given file"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004668 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004669 "loads(string) -- Load a pickle from the given string"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004670 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004671 "Pickler(file, [binary]) -- Create a pickler\n"
4672 "\n"
4673 "If the optional argument, binary, is provided and is true, then\n"
4674 "pickles will be written in binary format, which is more space and\n"
4675 "computationally efficient. \n"
4676 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004677 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004678 "Unpickler(file) -- Create an unpickler"},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004679 { NULL, NULL }
4680};
4681
Guido van Rossum60456fd1997-04-09 17:36:32 +00004682static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004683init_stuff(PyObject *module_dict)
4684{
4685 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004686
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004687#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004689 INIT_STR(__class__);
4690 INIT_STR(__getinitargs__);
4691 INIT_STR(__dict__);
4692 INIT_STR(__getstate__);
4693 INIT_STR(__setstate__);
4694 INIT_STR(__name__);
4695 INIT_STR(__main__);
4696 INIT_STR(__reduce__);
4697 INIT_STR(write);
4698 INIT_STR(__safe_for_unpickling__);
4699 INIT_STR(append);
4700 INIT_STR(read);
4701 INIT_STR(readline);
4702 INIT_STR(copy_reg);
4703 INIT_STR(dispatch_table);
4704 INIT_STR(safe_constructors);
4705 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004707 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
4708 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004710 /* These next few are special because we want to use different
4711 ones in restricted mode. */
4712 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
4713 if (!dispatch_table)
4714 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004716 if (!( safe_constructors = PyObject_GetAttr(copy_reg,
4717 safe_constructors_str)))
4718 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004720 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004722 /* Down to here ********************************** */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004724 if (!( empty_tuple = PyTuple_New(0)))
4725 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004727 /* Ugh */
4728 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4729 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4730 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004732 if (!( t=PyDict_New())) return -1;
4733 if (!( r=PyRun_String(
4734 "def __init__(self, *args): self.args=args\n\n"
4735 "def __str__(self):\n"
4736 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4737 Py_file_input,
4738 module_dict, t) )) return -1;
4739 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004741 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
4742 if (!PickleError)
4743 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004745 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004747 PicklingError = PyErr_NewException("cPickle.PicklingError",
4748 PickleError, NULL);
4749 if (!PicklingError)
4750 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004752 if (!( t=PyDict_New())) return -1;
4753 if (!( r=PyRun_String(
4754 "def __init__(self, *args): self.args=args\n\n"
4755 "def __str__(self):\n"
4756 " a=self.args\n"
4757 " a=a and type(a[0]) or '(what)'\n"
4758 " return 'Cannot pickle %s objects' % a\n"
4759 , Py_file_input,
4760 module_dict, t) )) return -1;
4761 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004763 if (!( UnpickleableError = PyErr_NewException(
4764 "cPickle.UnpickleableError", PicklingError, t)))
4765 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004767 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004769 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
4770 PickleError, NULL)))
4771 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004773 if (PyDict_SetItemString(module_dict, "PickleError",
4774 PickleError) < 0)
4775 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004777 if (PyDict_SetItemString(module_dict, "PicklingError",
4778 PicklingError) < 0)
4779 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004781 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4782 UnpicklingError) < 0)
4783 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004785 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4786 UnpickleableError) < 0)
4787 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004789 if (!( BadPickleGet = PyString_FromString("cPickle.BadPickleGet")))
4790 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004792 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4793 BadPickleGet) < 0)
4794 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004796 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004798 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004799}
4800
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004801#ifndef DL_EXPORT /* declarations for DLL import/export */
4802#define DL_EXPORT(RTYPE) RTYPE
4803#endif
Guido van Rossum50f385c1998-12-04 18:48:44 +00004804DL_EXPORT(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004805initcPickle(void)
4806{
4807 PyObject *m, *d, *di, *v, *k;
4808 int i;
4809 char *rev="1.71";
4810 PyObject *format_version;
4811 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004813 Picklertype.ob_type = &PyType_Type;
4814 Picklertype.tp_getattro = PyObject_GenericGetAttr;
4815 Picklertype.tp_setattro = PyObject_GenericSetAttr;
4816 Unpicklertype.ob_type = &PyType_Type;
4817 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004819 /* Initialize some pieces. We need to do this before module creation,
4820 so we're forced to use a temporary dictionary. :(
4821 */
4822 di=PyDict_New();
4823 if (!di) return;
4824 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004825
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004826 /* Create the module and add the functions */
4827 m = Py_InitModule4("cPickle", cPickle_methods,
4828 cPickle_module_documentation,
4829 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004831 /* Add some symbolic constants to the module */
4832 d = PyModule_GetDict(m);
4833 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4834 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004836 /* Copy data from di. Waaa. */
4837 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4838 if (PyObject_SetItem(d, k, v) < 0) {
4839 Py_DECREF(di);
4840 return;
4841 }
4842 }
4843 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004845 format_version = PyString_FromString("1.3");
4846 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004848 PyDict_SetItemString(d, "format_version", format_version);
4849 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4850 Py_XDECREF(format_version);
4851 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004852}