blob: 07d108914d6bd4fc2106ef30ede12c61e6fe3b8e [file] [log] [blame]
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001#include "Python.h"
2#include "cStringIO.h"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005PyDoc_STRVAR(cPickle_module_documentation,
6"C implementation and optimization of the Python pickle module\n"
7"\n"
8"cPickle.c,v 1.71 1999/07/11 13:30:34 jim Exp\n");
9
Guido van Rossum142eeb81997-08-13 03:14:41 +000010#ifndef Py_eval_input
11#include <graminit.h>
12#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000013#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000014
Guido van Rossum2f4caa41997-01-06 22:59:08 +000015#include <errno.h>
16
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +000017
Guido van Rossum2f4caa41997-01-06 22:59:08 +000018
Guido van Rossum60456fd1997-04-09 17:36:32 +000019#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000020
Guido van Rossum60456fd1997-04-09 17:36:32 +000021#define WRITE_BUF_SIZE 256
22
Tim Peters3906eb82001-04-10 04:22:00 +000023/* --------------------------------------------------------------------------
24NOTES on format codes.
25XXX much more is needed here
26
27Integer types
Tim Petersd8ae7c22001-04-10 04:35:28 +000028BININT1 8-bit unsigned integer; followed by 1 byte.
Tim Peters3906eb82001-04-10 04:22:00 +000029BININT2 16-bit unsigned integer; followed by 2 bytes, little-endian.
Tim Petersd8ae7c22001-04-10 04:35:28 +000030BININT 32-bit signed integer; followed by 4 bytes, little-endian.
31INT Integer; natural decimal string conversion, then newline.
Tim Peters3906eb82001-04-10 04:22:00 +000032 CAUTION: INT-reading code can't assume that what follows
33 fits in a Python int, because the size of Python ints varies
34 across platforms.
Tim Petersd8ae7c22001-04-10 04:35:28 +000035LONG Long (unbounded) integer; repr(i), then newline.
Tim Peters3906eb82001-04-10 04:22:00 +000036-------------------------------------------------------------------------- */
Guido van Rossum60456fd1997-04-09 17:36:32 +000037
38#define MARK '('
39#define STOP '.'
40#define POP '0'
41#define POP_MARK '1'
42#define DUP '2'
43#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000044#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000045#define INT 'I'
46#define BININT 'J'
47#define BININT1 'K'
48#define LONG 'L'
49#define BININT2 'M'
50#define NONE 'N'
51#define PERSID 'P'
52#define BINPERSID 'Q'
53#define REDUCE 'R'
54#define STRING 'S'
55#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000056#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000057#define UNICODE 'V'
58#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000059#define APPEND 'a'
60#define BUILD 'b'
61#define GLOBAL 'c'
62#define DICT 'd'
63#define EMPTY_DICT '}'
64#define APPENDS 'e'
65#define GET 'g'
66#define BINGET 'h'
67#define INST 'i'
68#define LONG_BINGET 'j'
69#define LIST 'l'
70#define EMPTY_LIST ']'
71#define OBJ 'o'
72#define PUT 'p'
73#define BINPUT 'q'
74#define LONG_BINPUT 'r'
75#define SETITEM 's'
76#define TUPLE 't'
77#define EMPTY_TUPLE ')'
78#define SETITEMS 'u'
Jack Jansen3a967022002-06-26 20:40:42 +000079#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000080#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000081#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000082#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000083
Guido van Rossum2f4caa41997-01-06 22:59:08 +000084
Guido van Rossum60456fd1997-04-09 17:36:32 +000085static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000086
Guido van Rossumc03158b1999-06-09 15:23:31 +000087static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000088static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +000089static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000090static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +000091static PyObject *BadPickleGet;
92
Guido van Rossum2f4caa41997-01-06 22:59:08 +000093
Guido van Rossum60456fd1997-04-09 17:36:32 +000094static PyObject *dispatch_table;
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,
Tim Peters1f1b2d22003-02-01 02:16:37 +000099 *write_str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000100 *read_str, *readline_str, *__main___str, *__basicnew___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000101 *copy_reg_str, *dispatch_table_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
Guido van Rossum053b8df1998-11-25 16:18:00 +0000227#define PDATA_APPEND(D,O,ER) { \
228 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
229 Pdata_grow((Pdata*)(D)) < 0) \
230 return ER; \
231 Py_INCREF(O); \
232 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
233}
234
235#define PDATA_PUSH(D,O,ER) { \
236 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
237 Pdata_grow((Pdata*)(D)) < 0) { \
238 Py_DECREF(O); \
239 return ER; \
240 } \
241 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
242}
243
244/*************************************************************************/
245
246#define ARG_TUP(self, o) { \
247 if (self->arg || (self->arg=PyTuple_New(1))) { \
248 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
249 PyTuple_SET_ITEM(self->arg,0,o); \
250 } \
251 else { \
252 Py_DECREF(o); \
253 } \
254}
255
256#define FREE_ARG_TUP(self) { \
257 if (self->arg->ob_refcnt > 1) { \
258 Py_DECREF(self->arg); \
259 self->arg=NULL; \
260 } \
261 }
262
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000263typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000264 PyObject_HEAD
265 FILE *fp;
266 PyObject *write;
267 PyObject *file;
268 PyObject *memo;
269 PyObject *arg;
270 PyObject *pers_func;
271 PyObject *inst_pers_func;
272 int bin;
273 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000274 int nesting;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000275 int (*write_func)(struct Picklerobject *, char *, int);
276 char *write_buf;
277 int buf_size;
278 PyObject *dispatch_table;
279 int fast_container; /* count nested container dumps */
280 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000281} Picklerobject;
282
Barry Warsaw52acb492001-12-21 20:04:22 +0000283#ifndef PY_CPICKLE_FAST_LIMIT
284#define PY_CPICKLE_FAST_LIMIT 50
285#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000286
Jeremy Hylton938ace62002-07-17 16:30:39 +0000287static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000288
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000289typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000290 PyObject_HEAD
291 FILE *fp;
292 PyObject *file;
293 PyObject *readline;
294 PyObject *read;
295 PyObject *memo;
296 PyObject *arg;
297 Pdata *stack;
298 PyObject *mark;
299 PyObject *pers_func;
300 PyObject *last_string;
301 int *marks;
302 int num_marks;
303 int marks_size;
304 int (*read_func)(struct Unpicklerobject *, char **, int);
305 int (*readline_func)(struct Unpicklerobject *, char **);
306 int buf_size;
307 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000308 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000309} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000310
Jeremy Hylton938ace62002-07-17 16:30:39 +0000311static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000312
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000313/* Forward decls that need the above structs */
314static int save(Picklerobject *, PyObject *, int);
315static int put2(Picklerobject *, PyObject *);
316
Tim Peters84e87f32001-03-17 04:50:51 +0000317int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000318cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
319{
320 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000322 if ((v = PyObject_GetItem(o,key))) {
323 Py_DECREF(v);
324 return 1;
325 }
326
327 PyErr_Clear();
328 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000329}
330
Guido van Rossumd385d591997-04-09 17:47:47 +0000331static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000332PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000333cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
334{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000335 va_list va;
336 PyObject *args=0, *retval=0;
337 va_start(va, format);
338
339 if (format) args = Py_VaBuildValue(format, va);
340 va_end(va);
341 if (format && ! args) return NULL;
342 if (stringformat && !(retval=PyString_FromString(stringformat)))
343 return NULL;
344
345 if (retval) {
346 if (args) {
347 PyObject *v;
348 v=PyString_Format(retval, args);
349 Py_DECREF(retval);
350 Py_DECREF(args);
351 if (! v) return NULL;
352 retval=v;
353 }
354 }
355 else
356 if (args) retval=args;
357 else {
358 PyErr_SetObject(ErrType,Py_None);
359 return NULL;
360 }
361 PyErr_SetObject(ErrType,retval);
362 Py_DECREF(retval);
363 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000364}
365
Tim Peters84e87f32001-03-17 04:50:51 +0000366static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000367write_file(Picklerobject *self, char *s, int n)
368{
369 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000371 if (s == NULL) {
372 return 0;
373 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000375 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000376 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000377 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000378 if (nbyteswritten != (size_t)n) {
379 PyErr_SetFromErrno(PyExc_IOError);
380 return -1;
381 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000383 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000384}
385
Tim Peters84e87f32001-03-17 04:50:51 +0000386static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000387write_cStringIO(Picklerobject *self, char *s, int n)
388{
389 if (s == NULL) {
390 return 0;
391 }
392
393 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
394 return -1;
395 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000397 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000398}
399
Tim Peters84e87f32001-03-17 04:50:51 +0000400static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000401write_none(Picklerobject *self, char *s, int n)
402{
403 if (s == NULL) return 0;
404 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000405}
406
Tim Peters84e87f32001-03-17 04:50:51 +0000407static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000408write_other(Picklerobject *self, char *s, int n)
409{
410 PyObject *py_str = 0, *junk = 0;
411
412 if (s == NULL) {
413 if (!( self->buf_size )) return 0;
414 py_str = PyString_FromStringAndSize(self->write_buf,
415 self->buf_size);
416 if (!py_str)
417 return -1;
418 }
419 else {
420 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
421 if (write_other(self, NULL, 0) < 0)
422 return -1;
423 }
424
425 if (n > WRITE_BUF_SIZE) {
426 if (!( py_str =
427 PyString_FromStringAndSize(s, n)))
428 return -1;
429 }
430 else {
431 memcpy(self->write_buf + self->buf_size, s, n);
432 self->buf_size += n;
433 return n;
434 }
435 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000437 if (self->write) {
438 /* object with write method */
439 ARG_TUP(self, py_str);
440 if (self->arg) {
441 junk = PyObject_Call(self->write, self->arg, NULL);
442 FREE_ARG_TUP(self);
443 }
444 if (junk) Py_DECREF(junk);
445 else return -1;
446 }
447 else
448 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000450 self->buf_size = 0;
451 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000452}
453
454
Tim Peters84e87f32001-03-17 04:50:51 +0000455static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000456read_file(Unpicklerobject *self, char **s, int n)
457{
458 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000460 if (self->buf_size == 0) {
461 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000462
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000463 size = ((n < 32) ? 32 : n);
464 if (!( self->buf = (char *)malloc(size * sizeof(char)))) {
465 PyErr_NoMemory();
466 return -1;
467 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000469 self->buf_size = size;
470 }
471 else if (n > self->buf_size) {
472 self->buf = (char *)realloc(self->buf, n * sizeof(char));
473 if (!self->buf) {
474 PyErr_NoMemory();
475 return -1;
476 }
Tim Peters84e87f32001-03-17 04:50:51 +0000477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000478 self->buf_size = n;
479 }
Tim Peters84e87f32001-03-17 04:50:51 +0000480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000481 Py_BEGIN_ALLOW_THREADS
482 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
483 Py_END_ALLOW_THREADS
484 if (nbytesread != (size_t)n) {
485 if (feof(self->fp)) {
486 PyErr_SetNone(PyExc_EOFError);
487 return -1;
488 }
489
490 PyErr_SetFromErrno(PyExc_IOError);
491 return -1;
492 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000494 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000496 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000497}
498
499
Tim Peters84e87f32001-03-17 04:50:51 +0000500static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000501readline_file(Unpicklerobject *self, char **s)
502{
503 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000505 if (self->buf_size == 0) {
506 if (!( self->buf = (char *)malloc(40 * sizeof(char)))) {
507 PyErr_NoMemory();
508 return -1;
509 }
Tim Peters84e87f32001-03-17 04:50:51 +0000510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000511 self->buf_size = 40;
512 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000514 i = 0;
515 while (1) {
516 for (; i < (self->buf_size - 1); i++) {
517 if (feof(self->fp) ||
518 (self->buf[i] = getc(self->fp)) == '\n') {
519 self->buf[i + 1] = '\0';
520 *s = self->buf;
521 return i + 1;
522 }
523 }
524 self->buf = (char *)realloc(self->buf,
525 (self->buf_size * 2) * sizeof(char));
526 if (!self->buf) {
527 PyErr_NoMemory();
528 return -1;
529 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000531 self->buf_size *= 2;
532 }
Tim Peters84e87f32001-03-17 04:50:51 +0000533}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000534
535
Tim Peters84e87f32001-03-17 04:50:51 +0000536static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000537read_cStringIO(Unpicklerobject *self, char **s, int n)
538{
539 char *ptr;
540
541 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
542 PyErr_SetNone(PyExc_EOFError);
543 return -1;
544 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000546 *s = ptr;
547
548 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000549}
550
551
Tim Peters84e87f32001-03-17 04:50:51 +0000552static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000553readline_cStringIO(Unpicklerobject *self, char **s)
554{
555 int n;
556 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000558 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
559 return -1;
560 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000562 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000564 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000565}
566
567
Tim Peters84e87f32001-03-17 04:50:51 +0000568static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000569read_other(Unpicklerobject *self, char **s, int n)
570{
571 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000573 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000575 ARG_TUP(self, bytes);
576 if (self->arg) {
577 str = PyObject_Call(self->read, self->arg, NULL);
578 FREE_ARG_TUP(self);
579 }
580 if (! str) return -1;
581
582 Py_XDECREF(self->last_string);
583 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000585 if (! (*s = PyString_AsString(str))) return -1;
586 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000587}
588
589
Tim Peters84e87f32001-03-17 04:50:51 +0000590static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000591readline_other(Unpicklerobject *self, char **s)
592{
593 PyObject *str;
594 int str_size;
595
596 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
597 return -1;
598 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000600 if ((str_size = PyString_Size(str)) < 0)
601 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000603 Py_XDECREF(self->last_string);
604 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000606 if (! (*s = PyString_AsString(str)))
607 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000609 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000610}
611
612
613static char *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000614pystrndup(char *s, int l)
615{
616 char *r;
617 if (!( r=malloc((l+1)*sizeof(char)))) return (char*)PyErr_NoMemory();
618 memcpy(r,s,l);
619 r[l]=0;
620 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000621}
622
623
624static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000625get(Picklerobject *self, PyObject *id)
626{
627 PyObject *value, *mv;
628 long c_value;
629 char s[30];
630 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000632 if (!( mv = PyDict_GetItem(self->memo, id))) {
633 PyErr_SetObject(PyExc_KeyError, id);
634 return -1;
635 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000637 if (!( value = PyTuple_GetItem(mv, 0)))
638 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000640 if (!( PyInt_Check(value))) {
641 PyErr_SetString(PicklingError, "no int where int expected in memo");
642 return -1;
643 }
644 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000646 if (!self->bin) {
647 s[0] = GET;
648 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
649 len = strlen(s);
650 }
651 else if (Pdata_Check(self->file)) {
652 if (write_other(self, NULL, 0) < 0) return -1;
653 PDATA_APPEND(self->file, mv, -1);
654 return 0;
655 }
656 else {
657 if (c_value < 256) {
658 s[0] = BINGET;
659 s[1] = (int)(c_value & 0xff);
660 len = 2;
661 }
662 else {
663 s[0] = LONG_BINGET;
664 s[1] = (int)(c_value & 0xff);
665 s[2] = (int)((c_value >> 8) & 0xff);
666 s[3] = (int)((c_value >> 16) & 0xff);
667 s[4] = (int)((c_value >> 24) & 0xff);
668 len = 5;
669 }
670 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000672 if ((*self->write_func)(self, s, len) < 0)
673 return -1;
674
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000675 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000676}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000677
Guido van Rossum60456fd1997-04-09 17:36:32 +0000678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000679static int
680put(Picklerobject *self, PyObject *ob)
681{
682 if (ob->ob_refcnt < 2 || self->fast)
683 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000685 return put2(self, ob);
686}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000687
Guido van Rossum053b8df1998-11-25 16:18:00 +0000688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000689static int
690put2(Picklerobject *self, PyObject *ob)
691{
692 char c_str[30];
693 int p;
694 size_t len;
695 int res = -1;
696 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000698 if (self->fast)
699 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000701 if ((p = PyDict_Size(self->memo)) < 0)
702 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000704 /* Make sure memo keys are positive! */
705 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000707 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
708 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000710 if (!( memo_len = PyInt_FromLong(p)))
711 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000713 if (!( t = PyTuple_New(2)))
714 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000716 PyTuple_SET_ITEM(t, 0, memo_len);
717 Py_INCREF(memo_len);
718 PyTuple_SET_ITEM(t, 1, ob);
719 Py_INCREF(ob);
720
721 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
722 goto finally;
723
724 if (!self->bin) {
725 c_str[0] = PUT;
726 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
727 len = strlen(c_str);
728 }
729 else if (Pdata_Check(self->file)) {
730 if (write_other(self, NULL, 0) < 0) return -1;
731 PDATA_APPEND(self->file, memo_len, -1);
732 res=0; /* Job well done ;) */
733 goto finally;
734 }
735 else {
736 if (p >= 256) {
737 c_str[0] = LONG_BINPUT;
738 c_str[1] = (int)(p & 0xff);
739 c_str[2] = (int)((p >> 8) & 0xff);
740 c_str[3] = (int)((p >> 16) & 0xff);
741 c_str[4] = (int)((p >> 24) & 0xff);
742 len = 5;
743 }
744 else {
745 c_str[0] = BINPUT;
746 c_str[1] = p;
747 len = 2;
748 }
749 }
750
751 if ((*self->write_func)(self, c_str, len) < 0)
752 goto finally;
753
754 res = 0;
755
756 finally:
757 Py_XDECREF(py_ob_id);
758 Py_XDECREF(memo_len);
759 Py_XDECREF(t);
760
761 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000762}
763
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000764#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000765
766static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000767PyImport_Import(PyObject *module_name)
768{
769 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
770 static PyObject *standard_builtins=0;
771 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000773 if (!( silly_list )) {
774 if (!( __import___str=PyString_FromString("__import__")))
775 return NULL;
776 if (!( __builtins___str=PyString_FromString("__builtins__")))
777 return NULL;
778 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
779 return NULL;
780 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000782 if ((globals=PyEval_GetGlobals())) {
783 Py_INCREF(globals);
784 __builtins__=PyObject_GetItem(globals,__builtins___str);
785 if (!__builtins__)
786 goto err;
787 }
788 else {
789 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000791 if (!(standard_builtins ||
792 (standard_builtins=PyImport_ImportModule("__builtin__"))))
793 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000795 __builtins__=standard_builtins;
796 Py_INCREF(__builtins__);
797 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
798 if (!globals)
799 goto err;
800 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000802 if (PyDict_Check(__builtins__)) {
803 __import__=PyObject_GetItem(__builtins__,__import___str);
804 if (!__import__) goto err;
805 }
806 else {
807 __import__=PyObject_GetAttr(__builtins__,__import___str);
808 if (!__import__) goto err;
809 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000811 r=PyObject_CallFunction(__import__,"OOOO",
812 module_name, globals, globals, silly_list);
813 if (!r)
814 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000816 Py_DECREF(globals);
817 Py_DECREF(__builtins__);
818 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000820 return r;
821 err:
822 Py_XDECREF(globals);
823 Py_XDECREF(__builtins__);
824 Py_XDECREF(__import__);
825 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000826}
827
828static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000829whichmodule(PyObject *global, PyObject *global_name)
830{
831 int i, j;
832 PyObject *module = 0, *modules_dict = 0,
833 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000835 module = PyObject_GetAttrString(global, "__module__");
836 if (module) return module;
837 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000839 if (!( modules_dict = PySys_GetObject("modules")))
840 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000842 i = 0;
843 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000845 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000847 global_name_attr = PyObject_GetAttr(module, global_name);
848 if (!global_name_attr) {
849 PyErr_Clear();
850 continue;
851 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000853 if (global_name_attr != global) {
854 Py_DECREF(global_name_attr);
855 continue;
856 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000858 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000860 break;
861 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000863 /* The following implements the rule in pickle.py added in 1.5
864 that used __main__ if no module is found. I don't actually
865 like this rule. jlf
866 */
867 if (!j) {
868 j=1;
869 name=__main___str;
870 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000872 Py_INCREF(name);
873 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000874}
875
876
Guido van Rossum60456fd1997-04-09 17:36:32 +0000877static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000878fast_save_enter(Picklerobject *self, PyObject *obj)
879{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000880 /* if fast_container < 0, we're doing an error exit. */
881 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
882 PyObject *key = NULL;
883 if (self->fast_memo == NULL) {
884 self->fast_memo = PyDict_New();
885 if (self->fast_memo == NULL) {
886 self->fast_container = -1;
887 return 0;
888 }
889 }
890 key = PyLong_FromVoidPtr(obj);
891 if (key == NULL)
892 return 0;
893 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000894 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000895 PyErr_Format(PyExc_ValueError,
896 "fast mode: can't pickle cyclic objects including object type %s at %p",
897 obj->ob_type->tp_name, obj);
898 self->fast_container = -1;
899 return 0;
900 }
901 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000902 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000903 self->fast_container = -1;
904 return 0;
905 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000906 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000907 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000908 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000909}
910
911int
912fast_save_leave(Picklerobject *self, PyObject *obj)
913{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000914 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
915 PyObject *key = PyLong_FromVoidPtr(obj);
916 if (key == NULL)
917 return 0;
918 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000919 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000920 return 0;
921 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000922 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000923 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000924 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000925}
926
927static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000928save_none(Picklerobject *self, PyObject *args)
929{
930 static char none = NONE;
931 if ((*self->write_func)(self, &none, 1) < 0)
932 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000934 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000935}
936
Guido van Rossum77f6a652002-04-03 22:41:51 +0000937static int
938save_bool(Picklerobject *self, PyObject *args)
939{
Guido van Rossume2763392002-04-05 19:30:08 +0000940 static char *buf[2] = {FALSE, TRUE};
941 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000942 long l = PyInt_AS_LONG((PyIntObject *)args);
943
Guido van Rossume2763392002-04-05 19:30:08 +0000944 if ((*self->write_func)(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000945 return -1;
946
947 return 0;
948}
Tim Peters84e87f32001-03-17 04:50:51 +0000949
Guido van Rossum60456fd1997-04-09 17:36:32 +0000950static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000951save_int(Picklerobject *self, PyObject *args)
952{
953 char c_str[32];
954 long l = PyInt_AS_LONG((PyIntObject *)args);
955 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000957 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000958#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000959 || l > 0x7fffffffL
960 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000961#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000962 ) {
963 /* Text-mode pickle, or long too big to fit in the 4-byte
964 * signed BININT format: store as a string.
965 */
966 c_str[0] = INT;
967 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
968 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
969 return -1;
970 }
971 else {
972 /* Binary pickle and l fits in a signed 4-byte int. */
973 c_str[1] = (int)( l & 0xff);
974 c_str[2] = (int)((l >> 8) & 0xff);
975 c_str[3] = (int)((l >> 16) & 0xff);
976 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000977
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000978 if ((c_str[4] == 0) && (c_str[3] == 0)) {
979 if (c_str[2] == 0) {
980 c_str[0] = BININT1;
981 len = 2;
982 }
983 else {
984 c_str[0] = BININT2;
985 len = 3;
986 }
987 }
988 else {
989 c_str[0] = BININT;
990 len = 5;
991 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000993 if ((*self->write_func)(self, c_str, len) < 0)
994 return -1;
995 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000997 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000998}
999
1000
1001static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001002save_long(Picklerobject *self, PyObject *args)
1003{
1004 int size, res = -1;
1005 PyObject *repr = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001007 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001009 if (!( repr = PyObject_Repr(args)))
1010 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001012 if ((size = PyString_Size(repr)) < 0)
1013 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001014
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001015 if ((*self->write_func)(self, &l, 1) < 0)
1016 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001018 if ((*self->write_func)(self,
1019 PyString_AS_STRING((PyStringObject *)repr),
1020 size) < 0)
1021 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001023 if ((*self->write_func)(self, "\n", 1) < 0)
1024 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001026 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001027
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001028 finally:
1029 Py_XDECREF(repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001031 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001032}
1033
1034
1035static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001036save_float(Picklerobject *self, PyObject *args)
1037{
1038 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001039
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001040 if (self->bin) {
1041 int s, e;
1042 double f;
1043 long fhi, flo;
1044 char str[9];
1045 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001046
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001047 *p = BINFLOAT;
1048 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001050 if (x < 0) {
1051 s = 1;
1052 x = -x;
1053 }
1054 else
1055 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001057 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001059 /* Normalize f to be in the range [1.0, 2.0) */
1060 if (0.5 <= f && f < 1.0) {
1061 f *= 2.0;
1062 e--;
1063 }
1064 else if (f == 0.0) {
1065 e = 0;
1066 }
1067 else {
1068 PyErr_SetString(PyExc_SystemError,
1069 "frexp() result out of range");
1070 return -1;
1071 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001073 if (e >= 1024) {
1074 /* XXX 1024 itself is reserved for Inf/NaN */
1075 PyErr_SetString(PyExc_OverflowError,
1076 "float too large to pack with d format");
1077 return -1;
1078 }
1079 else if (e < -1022) {
1080 /* Gradual underflow */
1081 f = ldexp(f, 1022 + e);
1082 e = 0;
1083 }
1084 else if (!(e == 0 && f == 0.0)) {
1085 e += 1023;
1086 f -= 1.0; /* Get rid of leading 1 */
1087 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001089 /* fhi receives the high 28 bits;
1090 flo the low 24 bits (== 52 bits) */
1091 f *= 268435456.0; /* 2**28 */
1092 fhi = (long) floor(f); /* Truncate */
1093 f -= (double)fhi;
1094 f *= 16777216.0; /* 2**24 */
1095 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001097 /* First byte */
1098 *p = (s<<7) | (e>>4);
1099 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001101 /* Second byte */
1102 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1103 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001105 /* Third byte */
1106 *p = (unsigned char) ((fhi>>16) & 0xFF);
1107 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001109 /* Fourth byte */
1110 *p = (unsigned char) ((fhi>>8) & 0xFF);
1111 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001113 /* Fifth byte */
1114 *p = (unsigned char) (fhi & 0xFF);
1115 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001117 /* Sixth byte */
1118 *p = (unsigned char) ((flo>>16) & 0xFF);
1119 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001121 /* Seventh byte */
1122 *p = (unsigned char) ((flo>>8) & 0xFF);
1123 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001125 /* Eighth byte */
1126 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001128 if ((*self->write_func)(self, str, 9) < 0)
1129 return -1;
1130 }
1131 else {
1132 char c_str[250];
1133 c_str[0] = FLOAT;
1134 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001136 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1137 return -1;
1138 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001140 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001141}
1142
1143
1144static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001145save_string(Picklerobject *self, PyObject *args, int doput)
1146{
1147 int size, len;
1148 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001150 if ((size = PyString_Size(args)) < 0)
1151 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001153 if (!self->bin) {
1154 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001156 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001158 if (!( repr = PyObject_Repr(args)))
1159 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001161 if ((len = PyString_Size(repr)) < 0)
1162 goto err;
1163 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001165 if ((*self->write_func)(self, &string, 1) < 0)
1166 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001168 if ((*self->write_func)(self, repr_str, len) < 0)
1169 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001170
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001171 if ((*self->write_func)(self, "\n", 1) < 0)
1172 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001174 Py_XDECREF(repr);
1175 }
1176 else {
1177 int i;
1178 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001180 if ((size = PyString_Size(args)) < 0)
1181 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001183 if (size < 256) {
1184 c_str[0] = SHORT_BINSTRING;
1185 c_str[1] = size;
1186 len = 2;
1187 }
1188 else {
1189 c_str[0] = BINSTRING;
1190 for (i = 1; i < 5; i++)
1191 c_str[i] = (int)(size >> ((i - 1) * 8));
1192 len = 5;
1193 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195 if ((*self->write_func)(self, c_str, len) < 0)
1196 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001198 if (size > 128 && Pdata_Check(self->file)) {
1199 if (write_other(self, NULL, 0) < 0) return -1;
1200 PDATA_APPEND(self->file, args, -1);
1201 }
1202 else {
1203 if ((*self->write_func)(self,
1204 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1205 return -1;
1206 }
1207 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001209 if (doput)
1210 if (put(self, args) < 0)
1211 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001213 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001215 err:
1216 Py_XDECREF(repr);
1217 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001218}
1219
1220
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001221#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001222/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1223 backslash and newline characters to \uXXXX escapes. */
1224static PyObject *
1225modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1226{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001227 PyObject *repr;
1228 char *p;
1229 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001231 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001233 repr = PyString_FromStringAndSize(NULL, 6 * size);
1234 if (repr == NULL)
1235 return NULL;
1236 if (size == 0)
1237 return repr;
1238
1239 p = q = PyString_AS_STRING(repr);
1240 while (size-- > 0) {
1241 Py_UNICODE ch = *s++;
1242 /* Map 16-bit characters to '\uxxxx' */
1243 if (ch >= 256 || ch == '\\' || ch == '\n') {
1244 *p++ = '\\';
1245 *p++ = 'u';
1246 *p++ = hexdigit[(ch >> 12) & 0xf];
1247 *p++ = hexdigit[(ch >> 8) & 0xf];
1248 *p++ = hexdigit[(ch >> 4) & 0xf];
1249 *p++ = hexdigit[ch & 15];
1250 }
1251 /* Copy everything else as-is */
1252 else
1253 *p++ = (char) ch;
1254 }
1255 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001256 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001257 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001258}
1259
1260
Guido van Rossum60456fd1997-04-09 17:36:32 +00001261static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001262save_unicode(Picklerobject *self, PyObject *args, int doput)
1263{
1264 int size, len;
1265 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001267 if (!PyUnicode_Check(args))
1268 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001270 if (!self->bin) {
1271 char *repr_str;
1272 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001273
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001274 repr = modified_EncodeRawUnicodeEscape(
1275 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
1276 if (!repr)
1277 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001279 if ((len = PyString_Size(repr)) < 0)
1280 goto err;
1281 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001283 if ((*self->write_func)(self, &string, 1) < 0)
1284 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001286 if ((*self->write_func)(self, repr_str, len) < 0)
1287 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001289 if ((*self->write_func)(self, "\n", 1) < 0)
1290 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001292 Py_XDECREF(repr);
1293 }
1294 else {
1295 int i;
1296 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001298 if (!( repr = PyUnicode_AsUTF8String(args)))
1299 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001301 if ((size = PyString_Size(repr)) < 0)
1302 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001304 c_str[0] = BINUNICODE;
1305 for (i = 1; i < 5; i++)
1306 c_str[i] = (int)(size >> ((i - 1) * 8));
1307 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001309 if ((*self->write_func)(self, c_str, len) < 0)
1310 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001312 if (size > 128 && Pdata_Check(self->file)) {
1313 if (write_other(self, NULL, 0) < 0)
1314 goto err;
1315 PDATA_APPEND(self->file, repr, -1);
1316 }
1317 else {
1318 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1319 size) < 0)
1320 goto err;
1321 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001322
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001323 Py_DECREF(repr);
1324 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001326 if (doput)
1327 if (put(self, args) < 0)
1328 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001330 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001332 err:
1333 Py_XDECREF(repr);
1334 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001335}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001336#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001337
1338
1339static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001340save_tuple(Picklerobject *self, PyObject *args)
1341{
1342 PyObject *element = 0, *py_tuple_id = 0;
1343 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001344
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001345 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001347 if ((*self->write_func)(self, &MARKv, 1) < 0)
1348 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001350 if ((len = PyTuple_Size(args)) < 0)
1351 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001353 for (i = 0; i < len; i++) {
1354 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
1355 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001357 if (save(self, element, 0) < 0)
1358 goto finally;
1359 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001361 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
1362 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001364 if (len) {
1365 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1366 if (self->bin) {
1367 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001369 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1370 goto finally;
1371 }
1372 else {
1373 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001375 for (i = 0; i <= len; i++) {
1376 if ((*self->write_func)(self, &pop, 1) < 0)
1377 goto finally;
1378 }
1379 }
Tim Peters84e87f32001-03-17 04:50:51 +00001380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001381 if (get(self, py_tuple_id) < 0)
1382 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001384 res = 0;
1385 goto finally;
1386 }
1387 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001389 if ((*self->write_func)(self, &tuple, 1) < 0) {
1390 goto finally;
1391 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001393 if (put(self, args) < 0)
1394 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001396 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001398 finally:
1399 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001401 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001402}
1403
1404static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001405save_empty_tuple(Picklerobject *self, PyObject *args)
1406{
1407 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001409 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001410}
1411
1412
1413static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001414save_list(Picklerobject *self, PyObject *args)
1415{
1416 PyObject *element = 0;
1417 int s_len, len, i, using_appends, res = -1;
1418 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001420 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001422 if (self->fast && !fast_save_enter(self, args))
1423 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001425 if (self->bin) {
1426 s[0] = EMPTY_LIST;
1427 s_len = 1;
1428 }
1429 else {
1430 s[0] = MARK;
1431 s[1] = LIST;
1432 s_len = 2;
1433 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001435 if ((len = PyList_Size(args)) < 0)
1436 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001438 if ((*self->write_func)(self, s, s_len) < 0)
1439 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001441 if (len == 0) {
1442 if (put(self, args) < 0)
1443 goto finally;
1444 }
1445 else {
1446 if (put2(self, args) < 0)
1447 goto finally;
1448 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001450 if ((using_appends = (self->bin && (len > 1))))
1451 if ((*self->write_func)(self, &MARKv, 1) < 0)
1452 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001454 for (i = 0; i < len; i++) {
1455 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
1456 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001458 if (save(self, element, 0) < 0)
1459 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001461 if (!using_appends) {
1462 if ((*self->write_func)(self, &append, 1) < 0)
1463 goto finally;
1464 }
1465 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001467 if (using_appends) {
1468 if ((*self->write_func)(self, &appends, 1) < 0)
1469 goto finally;
1470 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001472 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001474 finally:
1475 if (self->fast && !fast_save_leave(self, args))
1476 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001478 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001479}
1480
1481
Guido van Rossum60456fd1997-04-09 17:36:32 +00001482static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001483save_dict(Picklerobject *self, PyObject *args)
1484{
1485 PyObject *key = 0, *value = 0;
1486 int i, len, res = -1, using_setitems;
1487 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001489 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001491 if (self->fast && !fast_save_enter(self, args))
1492 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001494 if (self->bin) {
1495 s[0] = EMPTY_DICT;
1496 len = 1;
1497 }
1498 else {
1499 s[0] = MARK;
1500 s[1] = DICT;
1501 len = 2;
1502 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001504 if ((*self->write_func)(self, s, len) < 0)
1505 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001507 if ((len = PyDict_Size(args)) < 0)
1508 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001510 if (len == 0) {
1511 if (put(self, args) < 0)
1512 goto finally;
1513 }
1514 else {
1515 if (put2(self, args) < 0)
1516 goto finally;
1517 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001519 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1520 if ((*self->write_func)(self, &MARKv, 1) < 0)
1521 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001523 i = 0;
1524 while (PyDict_Next(args, &i, &key, &value)) {
1525 if (save(self, key, 0) < 0)
1526 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001528 if (save(self, value, 0) < 0)
1529 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001531 if (!using_setitems) {
1532 if ((*self->write_func)(self, &setitem, 1) < 0)
1533 goto finally;
1534 }
1535 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001537 if (using_setitems) {
1538 if ((*self->write_func)(self, &setitems, 1) < 0)
1539 goto finally;
1540 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001542 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001544 finally:
1545 if (self->fast && !fast_save_leave(self, args))
1546 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001548 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001549}
1550
1551
Tim Peters84e87f32001-03-17 04:50:51 +00001552static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001553save_inst(Picklerobject *self, PyObject *args)
1554{
1555 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1556 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1557 char *module_str, *name_str;
1558 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001560 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001562 if (self->fast && !fast_save_enter(self, args))
1563 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001565 if ((*self->write_func)(self, &MARKv, 1) < 0)
1566 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001568 if (!( class = PyObject_GetAttr(args, __class___str)))
1569 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001571 if (self->bin) {
1572 if (save(self, class, 0) < 0)
1573 goto finally;
1574 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001576 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1577 PyObject *element = 0;
1578 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001580 if (!( class_args =
1581 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
1582 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001583
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001584 if ((len = PyObject_Size(class_args)) < 0)
1585 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001587 for (i = 0; i < len; i++) {
1588 if (!( element = PySequence_GetItem(class_args, i)))
1589 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001591 if (save(self, element, 0) < 0) {
1592 Py_DECREF(element);
1593 goto finally;
1594 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001596 Py_DECREF(element);
1597 }
1598 }
1599 else {
1600 PyErr_Clear();
1601 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001603 if (!self->bin) {
1604 if (!( name = ((PyClassObject *)class)->cl_name )) {
1605 PyErr_SetString(PicklingError, "class has no name");
1606 goto finally;
1607 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001609 if (!( module = whichmodule(class, name)))
1610 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001611
Tim Peters84e87f32001-03-17 04:50:51 +00001612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001613 if ((module_size = PyString_Size(module)) < 0 ||
1614 (name_size = PyString_Size(name)) < 0)
1615 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001617 module_str = PyString_AS_STRING((PyStringObject *)module);
1618 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001619
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001620 if ((*self->write_func)(self, &inst, 1) < 0)
1621 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001622
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001623 if ((*self->write_func)(self, module_str, module_size) < 0)
1624 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001626 if ((*self->write_func)(self, "\n", 1) < 0)
1627 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001629 if ((*self->write_func)(self, name_str, name_size) < 0)
1630 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001632 if ((*self->write_func)(self, "\n", 1) < 0)
1633 goto finally;
1634 }
1635 else if ((*self->write_func)(self, &obj, 1) < 0) {
1636 goto finally;
1637 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001639 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1640 state = PyObject_Call(getstate_func, empty_tuple, NULL);
1641 if (!state)
1642 goto finally;
1643 }
1644 else {
1645 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001647 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1648 PyErr_Clear();
1649 res = 0;
1650 goto finally;
1651 }
1652 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001654 if (!PyDict_Check(state)) {
1655 if (put2(self, args) < 0)
1656 goto finally;
1657 }
1658 else {
1659 if (put(self, args) < 0)
1660 goto finally;
1661 }
Tim Peters84e87f32001-03-17 04:50:51 +00001662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001663 if (save(self, state, 0) < 0)
1664 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001666 if ((*self->write_func)(self, &build, 1) < 0)
1667 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001669 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001671 finally:
1672 if (self->fast && !fast_save_leave(self, args))
1673 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001675 Py_XDECREF(module);
1676 Py_XDECREF(class);
1677 Py_XDECREF(state);
1678 Py_XDECREF(getinitargs_func);
1679 Py_XDECREF(getstate_func);
1680 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001681
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001682 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001683}
1684
1685
Guido van Rossum60456fd1997-04-09 17:36:32 +00001686static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001687save_global(Picklerobject *self, PyObject *args, PyObject *name)
1688{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001689 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001690 char *name_str, *module_str;
1691 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001693 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001695 if (name) {
1696 global_name = name;
1697 Py_INCREF(global_name);
1698 }
1699 else {
1700 if (!( global_name = PyObject_GetAttr(args, __name___str)))
1701 goto finally;
1702 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001704 if (!( module = whichmodule(args, global_name)))
1705 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001707 if ((module_size = PyString_Size(module)) < 0 ||
1708 (name_size = PyString_Size(global_name)) < 0)
1709 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001711 module_str = PyString_AS_STRING((PyStringObject *)module);
1712 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001713
Guido van Rossum75bfd052002-12-24 18:10:07 +00001714 /* XXX This can be doing a relative import. Clearly it shouldn't,
1715 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001716 mod = PyImport_ImportModule(module_str);
1717 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001718 cPickle_ErrFormat(PicklingError,
1719 "Can't pickle %s: it's not found as %s.%s",
1720 "OSS", args, module, global_name);
1721 goto finally;
1722 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001723 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001724 if (klass == NULL) {
1725 cPickle_ErrFormat(PicklingError,
1726 "Can't pickle %s: it's not found as %s.%s",
1727 "OSS", args, module, global_name);
1728 goto finally;
1729 }
1730 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001731 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001732 cPickle_ErrFormat(PicklingError,
1733 "Can't pickle %s: it's not the same object as %s.%s",
1734 "OSS", args, module, global_name);
1735 goto finally;
1736 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001737 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001739 if ((*self->write_func)(self, &global, 1) < 0)
1740 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001742 if ((*self->write_func)(self, module_str, module_size) < 0)
1743 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001745 if ((*self->write_func)(self, "\n", 1) < 0)
1746 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001747
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001748 if ((*self->write_func)(self, name_str, name_size) < 0)
1749 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001751 if ((*self->write_func)(self, "\n", 1) < 0)
1752 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001754 if (put(self, args) < 0)
1755 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001757 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001759 finally:
1760 Py_XDECREF(module);
1761 Py_XDECREF(global_name);
1762 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001764 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001765}
1766
Guido van Rossum60456fd1997-04-09 17:36:32 +00001767static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001768save_pers(Picklerobject *self, PyObject *args, PyObject *f)
1769{
1770 PyObject *pid = 0;
1771 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001773 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001775 Py_INCREF(args);
1776 ARG_TUP(self, args);
1777 if (self->arg) {
1778 pid = PyObject_Call(f, self->arg, NULL);
1779 FREE_ARG_TUP(self);
1780 }
1781 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001783 if (pid != Py_None) {
1784 if (!self->bin) {
1785 if (!PyString_Check(pid)) {
1786 PyErr_SetString(PicklingError,
1787 "persistent id must be string");
1788 goto finally;
1789 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001791 if ((*self->write_func)(self, &persid, 1) < 0)
1792 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001794 if ((size = PyString_Size(pid)) < 0)
1795 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001797 if ((*self->write_func)(self,
1798 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1799 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001801 if ((*self->write_func)(self, "\n", 1) < 0)
1802 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001804 res = 1;
1805 goto finally;
1806 }
1807 else if (save(self, pid, 1) >= 0) {
1808 if ((*self->write_func)(self, &binpersid, 1) < 0)
1809 res = -1;
1810 else
1811 res = 1;
1812 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001814 goto finally;
1815 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001817 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001819 finally:
1820 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001822 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001823}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001824
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001825
Tim Peters84e87f32001-03-17 04:50:51 +00001826static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001827save_reduce(Picklerobject *self, PyObject *callable,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001828 PyObject *tup, PyObject *state, PyObject *ob)
1829{
1830 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001832 if (save(self, callable, 0) < 0)
1833 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001835 if (save(self, tup, 0) < 0)
1836 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001838 if ((*self->write_func)(self, &reduce, 1) < 0)
1839 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001841 if (ob != NULL) {
1842 if (state && !PyDict_Check(state)) {
1843 if (put2(self, ob) < 0)
1844 return -1;
1845 }
1846 else {
1847 if (put(self, ob) < 0)
1848 return -1;
1849 }
1850 }
Tim Peters84e87f32001-03-17 04:50:51 +00001851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001852 if (state) {
1853 if (save(self, state, 0) < 0)
1854 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001856 if ((*self->write_func)(self, &build, 1) < 0)
1857 return -1;
1858 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001860 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001861}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001862
Guido van Rossum60456fd1997-04-09 17:36:32 +00001863static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001864save(Picklerobject *self, PyObject *args, int pers_save)
1865{
1866 PyTypeObject *type;
1867 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1868 *callable = 0, *state = 0;
1869 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001870
Martin v. Löwis5a395302002-08-04 08:20:23 +00001871 if (self->nesting++ > Py_GetRecursionLimit()){
1872 PyErr_SetString(PyExc_RuntimeError,
1873 "maximum recursion depth exceeded");
1874 goto finally;
1875 }
1876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001877 if (!pers_save && self->pers_func) {
1878 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1879 res = tmp;
1880 goto finally;
1881 }
1882 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001884 if (args == Py_None) {
1885 res = save_none(self, args);
1886 goto finally;
1887 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001889 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001891 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001892 case 'b':
1893 if (args == Py_False || args == Py_True) {
1894 res = save_bool(self, args);
1895 goto finally;
1896 }
1897 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001898 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001899 if (type == &PyInt_Type) {
1900 res = save_int(self, args);
1901 goto finally;
1902 }
1903 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001904
Guido van Rossum60456fd1997-04-09 17:36:32 +00001905 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001906 if (type == &PyLong_Type) {
1907 res = save_long(self, args);
1908 goto finally;
1909 }
1910 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001911
Guido van Rossum60456fd1997-04-09 17:36:32 +00001912 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001913 if (type == &PyFloat_Type) {
1914 res = save_float(self, args);
1915 goto finally;
1916 }
1917 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001918
Guido van Rossum60456fd1997-04-09 17:36:32 +00001919 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001920 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
1921 if (self->bin) res = save_empty_tuple(self, args);
1922 else res = save_tuple(self, args);
1923 goto finally;
1924 }
1925 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001926
Guido van Rossum60456fd1997-04-09 17:36:32 +00001927 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001928 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
1929 res = save_string(self, args, 0);
1930 goto finally;
1931 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001932
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001933#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001934 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001935 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1936 res = save_unicode(self, args, 0);
1937 goto finally;
1938 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001939#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001940 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001942 if (args->ob_refcnt > 1) {
1943 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
1944 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001946 if (PyDict_GetItem(self->memo, py_ob_id)) {
1947 if (get(self, py_ob_id) < 0)
1948 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001950 res = 0;
1951 goto finally;
1952 }
1953 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001955 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001956 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001957 if (type == &PyString_Type) {
1958 res = save_string(self, args, 1);
1959 goto finally;
1960 }
1961 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001962
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001963#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001964 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001965 if (type == &PyUnicode_Type) {
1966 res = save_unicode(self, args, 1);
1967 goto finally;
1968 }
1969 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001970#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001971
Guido van Rossum60456fd1997-04-09 17:36:32 +00001972 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001973 if (type == &PyTuple_Type) {
1974 res = save_tuple(self, args);
1975 goto finally;
1976 }
1977 if (type == &PyType_Type) {
1978 res = save_global(self, args, NULL);
1979 goto finally;
1980 }
1981 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001982
Guido van Rossum60456fd1997-04-09 17:36:32 +00001983 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001984 if (type == &PyList_Type) {
1985 res = save_list(self, args);
1986 goto finally;
1987 }
1988 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001989
1990 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001991 if (type == &PyDict_Type) {
1992 res = save_dict(self, args);
1993 goto finally;
1994 }
1995 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001996
1997 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001998 if (type == &PyInstance_Type) {
1999 res = save_inst(self, args);
2000 goto finally;
2001 }
2002 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002003
2004 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002005 if (type == &PyClass_Type) {
2006 res = save_global(self, args, NULL);
2007 goto finally;
2008 }
2009 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002010
2011 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002012 if (type == &PyFunction_Type) {
2013 res = save_global(self, args, NULL);
2014 goto finally;
2015 }
2016 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002017
2018 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002019 if (type == &PyCFunction_Type) {
2020 res = save_global(self, args, NULL);
2021 goto finally;
2022 }
2023 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002025 if (!pers_save && self->inst_pers_func) {
2026 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2027 res = tmp;
2028 goto finally;
2029 }
2030 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002031
Jeremy Hylton39c61162002-07-16 19:47:43 +00002032 if (PyType_IsSubtype(type, &PyType_Type)) {
2033 res = save_global(self, args, NULL);
2034 goto finally;
2035 }
2036
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002037 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2038 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002039
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002040 Py_INCREF(args);
2041 ARG_TUP(self, args);
2042 if (self->arg) {
2043 t = PyObject_Call(__reduce__, self->arg, NULL);
2044 FREE_ARG_TUP(self);
2045 }
2046 if (! t) goto finally;
2047 }
2048 else {
2049 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002050
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002051 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2052 t = PyObject_Call(__reduce__, empty_tuple, NULL);
2053 if (!t)
2054 goto finally;
2055 }
2056 else {
2057 PyErr_Clear();
2058 }
2059 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002061 if (t) {
2062 if (PyString_Check(t)) {
2063 res = save_global(self, args, t);
2064 goto finally;
2065 }
Tim Peters84e87f32001-03-17 04:50:51 +00002066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002067 if (!PyTuple_Check(t)) {
2068 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2069 "be a tuple", "O", __reduce__);
2070 goto finally;
2071 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002073 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002075 if ((size != 3) && (size != 2)) {
2076 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2077 "contain only two or three elements", "O", __reduce__);
2078 goto finally;
2079 }
Tim Peters84e87f32001-03-17 04:50:51 +00002080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002081 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002083 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002085 if (size > 2) {
2086 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002087 if (state == Py_None)
2088 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002089 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002091 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2092 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2093 "returned by %s must be a tuple", "O", __reduce__);
2094 goto finally;
2095 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002097 res = save_reduce(self, callable, arg_tup, state, args);
2098 goto finally;
2099 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002101 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002103 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002104 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002105 Py_XDECREF(py_ob_id);
2106 Py_XDECREF(__reduce__);
2107 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002109 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002110}
2111
2112
2113static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002114dump(Picklerobject *self, PyObject *args)
2115{
2116 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002117
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002118 if (save(self, args, 0) < 0)
2119 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002121 if ((*self->write_func)(self, &stop, 1) < 0)
2122 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002124 if ((*self->write_func)(self, NULL, 0) < 0)
2125 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002127 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002128}
2129
2130static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002131Pickle_clear_memo(Picklerobject *self, PyObject *args)
2132{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002133 if (self->memo)
2134 PyDict_Clear(self->memo);
2135 Py_INCREF(Py_None);
2136 return Py_None;
2137}
2138
2139static PyObject *
2140Pickle_getvalue(Picklerobject *self, PyObject *args)
2141{
2142 int l, i, rsize, ssize, clear=1, lm;
2143 long ik;
2144 PyObject *k, *r;
2145 char *s, *p, *have_get;
2146 Pdata *data;
2147
2148 /* Can be called by Python code or C code */
2149 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2150 return NULL;
2151
2152 /* Check to make sure we are based on a list */
2153 if (! Pdata_Check(self->file)) {
2154 PyErr_SetString(PicklingError,
2155 "Attempt to getvalue() a non-list-based pickler");
2156 return NULL;
2157 }
2158
2159 /* flush write buffer */
2160 if (write_other(self, NULL, 0) < 0) return NULL;
2161
2162 data=(Pdata*)self->file;
2163 l=data->length;
2164
2165 /* set up an array to hold get/put status */
2166 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2167 lm++;
2168 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2169 memset(have_get,0,lm);
2170
2171 /* Scan for gets. */
2172 for (rsize=0, i=l; --i >= 0; ) {
2173 k=data->data[i];
2174
2175 if (PyString_Check(k)) {
2176 rsize += PyString_GET_SIZE(k);
2177 }
2178
2179 else if (PyInt_Check(k)) { /* put */
2180 ik=PyInt_AS_LONG((PyIntObject*)k);
2181 if (ik >= lm || ik==0) {
2182 PyErr_SetString(PicklingError,
2183 "Invalid get data");
2184 return NULL;
2185 }
2186 if (have_get[ik]) { /* with matching get */
2187 if (ik < 256) rsize += 2;
2188 else rsize+=5;
2189 }
2190 }
2191
2192 else if (! (PyTuple_Check(k) &&
2193 PyTuple_GET_SIZE(k) == 2 &&
2194 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2195 ) {
2196 PyErr_SetString(PicklingError,
2197 "Unexpected data in internal list");
2198 return NULL;
2199 }
2200
2201 else { /* put */
2202 ik=PyInt_AS_LONG((PyIntObject*)k);
2203 if (ik >= lm || ik==0) {
2204 PyErr_SetString(PicklingError,
2205 "Invalid get data");
2206 return NULL;
2207 }
2208 have_get[ik]=1;
2209 if (ik < 256) rsize += 2;
2210 else rsize+=5;
2211 }
2212
2213 }
2214
2215 /* Now generate the result */
2216 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2217 s=PyString_AS_STRING((PyStringObject*)r);
2218
2219 for (i=0; i<l; i++) {
2220 k=data->data[i];
2221
2222 if (PyString_Check(k)) {
2223 ssize=PyString_GET_SIZE(k);
2224 if (ssize) {
2225 p=PyString_AS_STRING((PyStringObject*)k);
2226 while (--ssize >= 0) *s++=*p++;
2227 }
2228 }
2229
2230 else if (PyTuple_Check(k)) { /* get */
2231 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2232 if (ik < 256) {
2233 *s++ = BINGET;
2234 *s++ = (int)(ik & 0xff);
2235 }
2236 else {
2237 *s++ = LONG_BINGET;
2238 *s++ = (int)(ik & 0xff);
2239 *s++ = (int)((ik >> 8) & 0xff);
2240 *s++ = (int)((ik >> 16) & 0xff);
2241 *s++ = (int)((ik >> 24) & 0xff);
2242 }
2243 }
2244
2245 else { /* put */
2246 ik=PyInt_AS_LONG((PyIntObject*)k);
2247
2248 if (have_get[ik]) { /* with matching get */
2249 if (ik < 256) {
2250 *s++ = BINPUT;
2251 *s++ = (int)(ik & 0xff);
2252 }
2253 else {
2254 *s++ = LONG_BINPUT;
2255 *s++ = (int)(ik & 0xff);
2256 *s++ = (int)((ik >> 8) & 0xff);
2257 *s++ = (int)((ik >> 16) & 0xff);
2258 *s++ = (int)((ik >> 24) & 0xff);
2259 }
2260 }
2261 }
2262
2263 }
2264
2265 if (clear) {
2266 PyDict_Clear(self->memo);
2267 Pdata_clear(data,0);
2268 }
2269
2270 free(have_get);
2271 return r;
2272 err:
2273 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002274 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002275}
2276
2277static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002278Pickler_dump(Picklerobject *self, PyObject *args)
2279{
2280 PyObject *ob;
2281 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002283 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
2284 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002286 if (dump(self, ob) < 0)
2287 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002289 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002291 /* XXX Why does dump() return self? */
2292 Py_INCREF(self);
2293 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002294}
2295
2296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002297static struct PyMethodDef Pickler_methods[] =
2298{
Neal Norwitzb0493252002-03-31 14:44:22 +00002299 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002300 PyDoc_STR("dump(object) -- "
2301 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002302 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002303 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002304 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002305 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002306 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002307};
2308
2309
2310static Picklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002311newPicklerobject(PyObject *file, int bin)
2312{
2313 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002315 if (!( self = PyObject_New(Picklerobject, &Picklertype)))
2316 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002318 self->fp = NULL;
2319 self->write = NULL;
2320 self->memo = NULL;
2321 self->arg = NULL;
2322 self->pers_func = NULL;
2323 self->inst_pers_func = NULL;
2324 self->write_buf = NULL;
2325 self->bin = bin;
2326 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002327 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002328 self->fast_container = 0;
2329 self->fast_memo = NULL;
2330 self->buf_size = 0;
2331 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002333 if (file)
2334 Py_INCREF(file);
2335 else
2336 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002338 if (!( self->file = file ))
2339 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002341 if (!( self->memo = PyDict_New()))
2342 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002344 if (PyFile_Check(file)) {
2345 self->fp = PyFile_AsFile(file);
2346 if (self->fp == NULL) {
2347 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2348 goto err;
2349 }
2350 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002351 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002352 else if (PycStringIO_OutputCheck(file)) {
2353 self->write_func = write_cStringIO;
2354 }
2355 else if (file == Py_None) {
2356 self->write_func = write_none;
2357 }
2358 else {
2359 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002361 if (! Pdata_Check(file)) {
2362 self->write = PyObject_GetAttr(file, write_str);
2363 if (!self->write) {
2364 PyErr_Clear();
2365 PyErr_SetString(PyExc_TypeError,
2366 "argument must have 'write' "
2367 "attribute");
2368 goto err;
2369 }
2370 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002372 if (!( self->write_buf =
2373 (char *)malloc(WRITE_BUF_SIZE * sizeof(char)))) {
2374 PyErr_NoMemory();
2375 goto err;
2376 }
2377 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002379 if (PyEval_GetRestricted()) {
2380 /* Restricted execution, get private tables */
2381 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002383 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2384 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2385 Py_DECREF(m);
2386 if (!( self->dispatch_table )) goto err;
2387 }
2388 else {
2389 self->dispatch_table=dispatch_table;
2390 Py_INCREF(dispatch_table);
2391 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002393 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002395 err:
2396 Py_DECREF((PyObject *)self);
2397 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002398}
2399
2400
2401static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002402get_Pickler(PyObject *self, PyObject *args)
2403{
2404 PyObject *file = NULL;
2405 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002407 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
2408 PyErr_Clear();
2409 bin = 0;
2410 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2411 return NULL;
2412 }
2413 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002414}
2415
2416
2417static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002418Pickler_dealloc(Picklerobject *self)
2419{
2420 Py_XDECREF(self->write);
2421 Py_XDECREF(self->memo);
2422 Py_XDECREF(self->fast_memo);
2423 Py_XDECREF(self->arg);
2424 Py_XDECREF(self->file);
2425 Py_XDECREF(self->pers_func);
2426 Py_XDECREF(self->inst_pers_func);
2427 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002429 if (self->write_buf) {
2430 free(self->write_buf);
2431 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002433 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002434}
2435
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002436static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002437Pickler_get_pers_func(Picklerobject *p)
2438{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002439 if (p->pers_func == NULL)
2440 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2441 else
2442 Py_INCREF(p->pers_func);
2443 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002444}
2445
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002446static int
2447Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2448{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002449 if (v == NULL) {
2450 PyErr_SetString(PyExc_TypeError,
2451 "attribute deletion is not supported");
2452 return -1;
2453 }
2454 Py_XDECREF(p->pers_func);
2455 Py_INCREF(v);
2456 p->pers_func = v;
2457 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002458}
2459
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002460static int
2461Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2462{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002463 if (v == NULL) {
2464 PyErr_SetString(PyExc_TypeError,
2465 "attribute deletion is not supported");
2466 return -1;
2467 }
2468 Py_XDECREF(p->inst_pers_func);
2469 Py_INCREF(v);
2470 p->inst_pers_func = v;
2471 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002472}
2473
2474static PyObject *
2475Pickler_get_memo(Picklerobject *p)
2476{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002477 if (p->memo == NULL)
2478 PyErr_SetString(PyExc_AttributeError, "memo");
2479 else
2480 Py_INCREF(p->memo);
2481 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002482}
2483
2484static int
2485Pickler_set_memo(Picklerobject *p, PyObject *v)
2486{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002487 if (v == NULL) {
2488 PyErr_SetString(PyExc_TypeError,
2489 "attribute deletion is not supported");
2490 return -1;
2491 }
2492 if (!PyDict_Check(v)) {
2493 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2494 return -1;
2495 }
2496 Py_XDECREF(p->memo);
2497 Py_INCREF(v);
2498 p->memo = v;
2499 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002500}
2501
2502static PyObject *
2503Pickler_get_error(Picklerobject *p)
2504{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002505 /* why is this an attribute on the Pickler? */
2506 Py_INCREF(PicklingError);
2507 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002508}
2509
2510static PyMemberDef Pickler_members[] = {
2511 {"binary", T_INT, offsetof(Picklerobject, bin)},
2512 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002513 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002514};
2515
2516static PyGetSetDef Pickler_getsets[] = {
2517 {"persistent_id", (getter)Pickler_get_pers_func,
2518 (setter)Pickler_set_pers_func},
2519 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2520 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002521 {"PicklingError", (getter)Pickler_get_error, NULL},
2522 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002523};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002524
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002525PyDoc_STRVAR(Picklertype__doc__,
2526"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002527
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002528static PyTypeObject Picklertype = {
2529 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002530 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002531 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002532 sizeof(Picklerobject), /*tp_basicsize*/
2533 0,
2534 (destructor)Pickler_dealloc, /* tp_dealloc */
2535 0, /* tp_print */
2536 0, /* tp_getattr */
2537 0, /* tp_setattr */
2538 0, /* tp_compare */
2539 0, /* tp_repr */
2540 0, /* tp_as_number */
2541 0, /* tp_as_sequence */
2542 0, /* tp_as_mapping */
2543 0, /* tp_hash */
2544 0, /* tp_call */
2545 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002546 PyObject_GenericGetAttr, /* tp_getattro */
2547 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002548 0, /* tp_as_buffer */
2549 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2550 Picklertype__doc__, /* tp_doc */
2551 0, /* tp_traverse */
2552 0, /* tp_clear */
2553 0, /* tp_richcompare */
2554 0, /* tp_weaklistoffset */
2555 0, /* tp_iter */
2556 0, /* tp_iternext */
2557 Pickler_methods, /* tp_methods */
2558 Pickler_members, /* tp_members */
2559 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002560};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002561
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002562static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002563find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
2564{
2565 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002567 if (fc) {
2568 if (fc==Py_None) {
2569 PyErr_SetString(UnpicklingError,
2570 "Global and instance pickles are not supported.");
2571 return NULL;
2572 }
2573 return PyObject_CallFunction(fc, "OO", py_module_name,
2574 py_global_name);
2575 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002577 module = PySys_GetObject("modules");
2578 if (module == NULL)
2579 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002581 module = PyDict_GetItem(module, py_module_name);
2582 if (module == NULL) {
2583 module = PyImport_Import(py_module_name);
2584 if (!module)
2585 return NULL;
2586 global = PyObject_GetAttr(module, py_global_name);
2587 Py_DECREF(module);
2588 }
2589 else
2590 global = PyObject_GetAttr(module, py_global_name);
2591 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002592}
2593
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002594static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002595marker(Unpicklerobject *self)
2596{
2597 if (self->num_marks < 1) {
2598 PyErr_SetString(UnpicklingError, "could not find MARK");
2599 return -1;
2600 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002602 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002603}
2604
Tim Peters84e87f32001-03-17 04:50:51 +00002605
Guido van Rossum60456fd1997-04-09 17:36:32 +00002606static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002607load_none(Unpicklerobject *self)
2608{
2609 PDATA_APPEND(self->stack, Py_None, -1);
2610 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002611}
2612
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002613static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002614bad_readline(void)
2615{
2616 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2617 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002618}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002619
2620static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002621load_int(Unpicklerobject *self)
2622{
2623 PyObject *py_int = 0;
2624 char *endptr, *s;
2625 int len, res = -1;
2626 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002628 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2629 if (len < 2) return bad_readline();
2630 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002632 errno = 0;
2633 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002635 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2636 /* Hm, maybe we've got something long. Let's try reading
2637 it as a Python long object. */
2638 errno = 0;
2639 py_int = PyLong_FromString(s, NULL, 0);
2640 if (py_int == NULL) {
2641 PyErr_SetString(PyExc_ValueError,
2642 "could not convert string to int");
2643 goto finally;
2644 }
2645 }
2646 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002647 if (len == 3 && (l == 0 || l == 1)) {
2648 if (!( py_int = PyBool_FromLong(l))) goto finally;
2649 }
2650 else {
2651 if (!( py_int = PyInt_FromLong(l))) goto finally;
2652 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002653 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002655 free(s);
2656 PDATA_PUSH(self->stack, py_int, -1);
2657 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002658
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002659 finally:
2660 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002662 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002663}
2664
2665
Tim Peters84e87f32001-03-17 04:50:51 +00002666static long
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002667calc_binint(char *s, int x)
2668{
2669 unsigned char c;
2670 int i;
2671 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002673 for (i = 0, l = 0L; i < x; i++) {
2674 c = (unsigned char)s[i];
2675 l |= (long)c << (i * 8);
2676 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002677#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002678 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2679 * is signed, so on a box with longs bigger than 4 bytes we need
2680 * to extend a BININT's sign bit to the full width.
2681 */
2682 if (x == 4 && l & (1L << 31))
2683 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002684#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002685 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002686}
2687
2688
2689static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002690load_binintx(Unpicklerobject *self, char *s, int x)
2691{
2692 PyObject *py_int = 0;
2693 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002695 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002697 if (!( py_int = PyInt_FromLong(l)))
2698 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002700 PDATA_PUSH(self->stack, py_int, -1);
2701 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002702}
2703
2704
2705static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002706load_binint(Unpicklerobject *self)
2707{
2708 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002710 if ((*self->read_func)(self, &s, 4) < 0)
2711 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002713 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002714}
2715
2716
2717static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002718load_binint1(Unpicklerobject *self)
2719{
2720 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002722 if ((*self->read_func)(self, &s, 1) < 0)
2723 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002725 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002726}
2727
2728
2729static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002730load_binint2(Unpicklerobject *self)
2731{
2732 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002734 if ((*self->read_func)(self, &s, 2) < 0)
2735 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002737 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002738}
Tim Peters84e87f32001-03-17 04:50:51 +00002739
Guido van Rossum60456fd1997-04-09 17:36:32 +00002740static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002741load_long(Unpicklerobject *self)
2742{
2743 PyObject *l = 0;
2744 char *end, *s;
2745 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002747 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2748 if (len < 2) return bad_readline();
2749 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002751 if (!( l = PyLong_FromString(s, &end, 0)))
2752 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002754 free(s);
2755 PDATA_PUSH(self->stack, l, -1);
2756 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002758 finally:
2759 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002761 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002762}
2763
Tim Peters84e87f32001-03-17 04:50:51 +00002764
Guido van Rossum60456fd1997-04-09 17:36:32 +00002765static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002766load_float(Unpicklerobject *self)
2767{
2768 PyObject *py_float = 0;
2769 char *endptr, *s;
2770 int len, res = -1;
2771 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002773 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2774 if (len < 2) return bad_readline();
2775 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002777 errno = 0;
2778 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002780 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2781 PyErr_SetString(PyExc_ValueError,
2782 "could not convert string to float");
2783 goto finally;
2784 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002786 if (!( py_float = PyFloat_FromDouble(d)))
2787 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002789 free(s);
2790 PDATA_PUSH(self->stack, py_float, -1);
2791 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002793 finally:
2794 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002796 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002797}
2798
Guido van Rossum60456fd1997-04-09 17:36:32 +00002799static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002800load_binfloat(Unpicklerobject *self)
2801{
2802 PyObject *py_float = 0;
2803 int s, e;
2804 long fhi, flo;
2805 double x;
2806 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002808 if ((*self->read_func)(self, &p, 8) < 0)
2809 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002811 /* First byte */
2812 s = (*p>>7) & 1;
2813 e = (*p & 0x7F) << 4;
2814 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002816 /* Second byte */
2817 e |= (*p>>4) & 0xF;
2818 fhi = (*p & 0xF) << 24;
2819 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002821 /* Third byte */
2822 fhi |= (*p & 0xFF) << 16;
2823 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002825 /* Fourth byte */
2826 fhi |= (*p & 0xFF) << 8;
2827 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002829 /* Fifth byte */
2830 fhi |= *p & 0xFF;
2831 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002833 /* Sixth byte */
2834 flo = (*p & 0xFF) << 16;
2835 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002837 /* Seventh byte */
2838 flo |= (*p & 0xFF) << 8;
2839 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002841 /* Eighth byte */
2842 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002844 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2845 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002847 /* XXX This sadly ignores Inf/NaN */
2848 if (e == 0)
2849 e = -1022;
2850 else {
2851 x += 1.0;
2852 e -= 1023;
2853 }
2854 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002856 if (s)
2857 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002859 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002861 PDATA_PUSH(self->stack, py_float, -1);
2862 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002863}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002864
2865static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002866load_string(Unpicklerobject *self)
2867{
2868 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002869 int len, res = -1;
2870 char *s, *p;
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öwis8a8da792002-08-14 07:46:28 +00002876
2877 /* Strip outermost quotes */
2878 while (s[len-1] <= ' ')
2879 len--;
2880 if(s[0]=='"' && s[len-1]=='"'){
2881 s[len-1] = '\0';
2882 p = s + 1 ;
2883 len -= 2;
2884 } else if(s[0]=='\'' && s[len-1]=='\''){
2885 s[len-1] = '\0';
2886 p = s + 1 ;
2887 len -= 2;
2888 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002889 goto insecure;
2890 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002891
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002892 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
2893 if (str) {
2894 PDATA_PUSH(self->stack, str, -1);
2895 res = 0;
2896 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002897 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002898 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002900 insecure:
2901 free(s);
2902 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2903 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002904}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002905
2906
2907static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002908load_binstring(Unpicklerobject *self)
2909{
2910 PyObject *py_string = 0;
2911 long l;
2912 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002914 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002916 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002917
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002918 if ((*self->read_func)(self, &s, l) < 0)
2919 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002921 if (!( py_string = PyString_FromStringAndSize(s, l)))
2922 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002924 PDATA_PUSH(self->stack, py_string, -1);
2925 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002926}
2927
2928
2929static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002930load_short_binstring(Unpicklerobject *self)
2931{
2932 PyObject *py_string = 0;
2933 unsigned char l;
2934 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002936 if ((*self->read_func)(self, &s, 1) < 0)
2937 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002939 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002941 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002945 PDATA_PUSH(self->stack, py_string, -1);
2946 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002947}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002948
2949
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002950#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002951static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002952load_unicode(Unpicklerobject *self)
2953{
2954 PyObject *str = 0;
2955 int len, res = -1;
2956 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002958 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2959 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002961 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
2962 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002964 PDATA_PUSH(self->stack, str, -1);
2965 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002967 finally:
2968 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002969}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002970#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002971
2972
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002973#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002974static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002975load_binunicode(Unpicklerobject *self)
2976{
2977 PyObject *unicode;
2978 long l;
2979 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002981 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002983 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002985 if ((*self->read_func)(self, &s, l) < 0)
2986 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002988 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
2989 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002991 PDATA_PUSH(self->stack, unicode, -1);
2992 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002993}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002994#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002995
2996
2997static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002998load_tuple(Unpicklerobject *self)
2999{
3000 PyObject *tup;
3001 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003003 if ((i = marker(self)) < 0) return -1;
3004 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3005 PDATA_PUSH(self->stack, tup, -1);
3006 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003007}
3008
3009static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003010load_empty_tuple(Unpicklerobject *self)
3011{
3012 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003014 if (!( tup=PyTuple_New(0))) return -1;
3015 PDATA_PUSH(self->stack, tup, -1);
3016 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003017}
3018
3019static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003020load_empty_list(Unpicklerobject *self)
3021{
3022 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003024 if (!( list=PyList_New(0))) return -1;
3025 PDATA_PUSH(self->stack, list, -1);
3026 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003027}
3028
3029static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003030load_empty_dict(Unpicklerobject *self)
3031{
3032 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003034 if (!( dict=PyDict_New())) return -1;
3035 PDATA_PUSH(self->stack, dict, -1);
3036 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003037}
3038
3039
3040static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003041load_list(Unpicklerobject *self)
3042{
3043 PyObject *list = 0;
3044 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003046 if ((i = marker(self)) < 0) return -1;
3047 if (!( list=Pdata_popList(self->stack, i))) return -1;
3048 PDATA_PUSH(self->stack, list, -1);
3049 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003050}
3051
3052static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003053load_dict(Unpicklerobject *self)
3054{
3055 PyObject *dict, *key, *value;
3056 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003058 if ((i = marker(self)) < 0) return -1;
3059 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003061 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003063 for (k = i+1; k < j; k += 2) {
3064 key =self->stack->data[k-1];
3065 value=self->stack->data[k ];
3066 if (PyDict_SetItem(dict, key, value) < 0) {
3067 Py_DECREF(dict);
3068 return -1;
3069 }
3070 }
3071 Pdata_clear(self->stack, i);
3072 PDATA_PUSH(self->stack, dict, -1);
3073 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003074}
3075
3076static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003077Instance_New(PyObject *cls, PyObject *args)
3078{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003079 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003081 if (PyClass_Check(cls)) {
3082 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003084 if ((l=PyObject_Size(args)) < 0) goto err;
3085 if (!( l )) {
3086 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003088 __getinitargs__ = PyObject_GetAttr(cls,
3089 __getinitargs___str);
3090 if (!__getinitargs__) {
3091 /* We have a class with no __getinitargs__,
3092 so bypass usual construction */
3093 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003095 PyErr_Clear();
3096 if (!( inst=PyInstance_NewRaw(cls, NULL)))
3097 goto err;
3098 return inst;
3099 }
3100 Py_DECREF(__getinitargs__);
3101 }
Tim Peters84e87f32001-03-17 04:50:51 +00003102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003103 if ((r=PyInstance_New(cls, args, NULL))) return r;
3104 else goto err;
3105 }
Tim Peters84e87f32001-03-17 04:50:51 +00003106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003107 if (args==Py_None) {
3108 /* Special case, call cls.__basicnew__() */
3109 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003111 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3112 if (!basicnew) return NULL;
3113 r=PyObject_CallObject(basicnew, NULL);
3114 Py_DECREF(basicnew);
3115 if (r) return r;
3116 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003117
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003118 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003120 err:
3121 {
3122 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003124 PyErr_Fetch(&tp, &v, &tb);
3125 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3126 Py_XDECREF(v);
3127 v=r;
3128 }
3129 PyErr_Restore(tp,v,tb);
3130 }
3131 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003132}
Tim Peters84e87f32001-03-17 04:50:51 +00003133
Guido van Rossum60456fd1997-04-09 17:36:32 +00003134
3135static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003136load_obj(Unpicklerobject *self)
3137{
3138 PyObject *class, *tup, *obj=0;
3139 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003140
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003141 if ((i = marker(self)) < 0) return -1;
3142 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3143 PDATA_POP(self->stack, class);
3144 if (class) {
3145 obj = Instance_New(class, tup);
3146 Py_DECREF(class);
3147 }
3148 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003150 if (! obj) return -1;
3151 PDATA_PUSH(self->stack, obj, -1);
3152 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003153}
3154
3155
3156static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003157load_inst(Unpicklerobject *self)
3158{
3159 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3160 int i, len;
3161 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003163 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003165 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3166 if (len < 2) return bad_readline();
3167 module_name = PyString_FromStringAndSize(s, len - 1);
3168 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003170 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3171 if (len < 2) return bad_readline();
3172 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3173 class = find_class(module_name, class_name,
3174 self->find_class);
3175 Py_DECREF(class_name);
3176 }
3177 }
3178 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003180 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003182 if ((tup=Pdata_popTuple(self->stack, i))) {
3183 obj = Instance_New(class, tup);
3184 Py_DECREF(tup);
3185 }
3186 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003188 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003190 PDATA_PUSH(self->stack, obj, -1);
3191 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003192}
3193
3194
3195static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003196load_global(Unpicklerobject *self)
3197{
3198 PyObject *class = 0, *module_name = 0, *class_name = 0;
3199 int len;
3200 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003202 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3203 if (len < 2) return bad_readline();
3204 module_name = PyString_FromStringAndSize(s, len - 1);
3205 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003207 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003208 if (len < 2) {
3209 Py_DECREF(module_name);
3210 return bad_readline();
3211 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003212 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3213 class = find_class(module_name, class_name,
3214 self->find_class);
3215 Py_DECREF(class_name);
3216 }
3217 }
3218 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003220 if (! class) return -1;
3221 PDATA_PUSH(self->stack, class, -1);
3222 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003223}
3224
3225
3226static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003227load_persid(Unpicklerobject *self)
3228{
3229 PyObject *pid = 0;
3230 int len;
3231 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003233 if (self->pers_func) {
3234 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3235 if (len < 2) return bad_readline();
3236
3237 pid = PyString_FromStringAndSize(s, len - 1);
3238 if (!pid) return -1;
3239
3240 if (PyList_Check(self->pers_func)) {
3241 if (PyList_Append(self->pers_func, pid) < 0) {
3242 Py_DECREF(pid);
3243 return -1;
3244 }
3245 }
3246 else {
3247 ARG_TUP(self, pid);
3248 if (self->arg) {
3249 pid = PyObject_Call(self->pers_func, self->arg,
3250 NULL);
3251 FREE_ARG_TUP(self);
3252 }
3253 }
3254
3255 if (! pid) return -1;
3256
3257 PDATA_PUSH(self->stack, pid, -1);
3258 return 0;
3259 }
3260 else {
3261 PyErr_SetString(UnpicklingError,
3262 "A load persistent id instruction was encountered,\n"
3263 "but no persistent_load function was specified.");
3264 return -1;
3265 }
3266}
3267
3268static int
3269load_binpersid(Unpicklerobject *self)
3270{
3271 PyObject *pid = 0;
3272
3273 if (self->pers_func) {
3274 PDATA_POP(self->stack, pid);
3275 if (! pid) return -1;
3276
3277 if (PyList_Check(self->pers_func)) {
3278 if (PyList_Append(self->pers_func, pid) < 0) {
3279 Py_DECREF(pid);
3280 return -1;
3281 }
3282 }
3283 else {
3284 ARG_TUP(self, pid);
3285 if (self->arg) {
3286 pid = PyObject_Call(self->pers_func, self->arg,
3287 NULL);
3288 FREE_ARG_TUP(self);
3289 }
3290 if (! pid) return -1;
3291 }
3292
3293 PDATA_PUSH(self->stack, pid, -1);
3294 return 0;
3295 }
3296 else {
3297 PyErr_SetString(UnpicklingError,
3298 "A load persistent id instruction was encountered,\n"
3299 "but no persistent_load function was specified.");
3300 return -1;
3301 }
3302}
3303
3304
3305static int
3306load_pop(Unpicklerobject *self)
3307{
3308 int len;
3309
3310 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3311
3312 /* Note that we split the (pickle.py) stack into two stacks,
3313 an object stack and a mark stack. We have to be clever and
3314 pop the right one. We do this by looking at the top of the
3315 mark stack.
3316 */
3317
3318 if ((self->num_marks > 0) &&
3319 (self->marks[self->num_marks - 1] == len))
3320 self->num_marks--;
3321 else {
3322 len--;
3323 Py_DECREF(self->stack->data[len]);
3324 self->stack->length=len;
3325 }
3326
3327 return 0;
3328}
3329
3330
3331static int
3332load_pop_mark(Unpicklerobject *self)
3333{
3334 int i;
3335
3336 if ((i = marker(self)) < 0)
3337 return -1;
3338
3339 Pdata_clear(self->stack, i);
3340
3341 return 0;
3342}
3343
3344
3345static int
3346load_dup(Unpicklerobject *self)
3347{
3348 PyObject *last;
3349 int len;
3350
3351 if ((len = self->stack->length) <= 0) return stackUnderflow();
3352 last=self->stack->data[len-1];
3353 Py_INCREF(last);
3354 PDATA_PUSH(self->stack, last, -1);
3355 return 0;
3356}
3357
3358
3359static int
3360load_get(Unpicklerobject *self)
3361{
3362 PyObject *py_str = 0, *value = 0;
3363 int len;
3364 char *s;
3365 int rc;
3366
3367 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003368 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003370 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003372 value = PyDict_GetItem(self->memo, py_str);
3373 if (! value) {
3374 PyErr_SetObject(BadPickleGet, py_str);
3375 rc = -1;
3376 } else {
3377 PDATA_APPEND(self->stack, value, -1);
3378 rc = 0;
3379 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003381 Py_DECREF(py_str);
3382 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003383}
3384
3385
3386static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003387load_binget(Unpicklerobject *self)
3388{
3389 PyObject *py_key = 0, *value = 0;
3390 unsigned char key;
3391 char *s;
3392 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003394 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003396 key = (unsigned char)s[0];
3397 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003399 value = PyDict_GetItem(self->memo, py_key);
3400 if (! value) {
3401 PyErr_SetObject(BadPickleGet, py_key);
3402 rc = -1;
3403 } else {
3404 PDATA_APPEND(self->stack, value, -1);
3405 rc = 0;
3406 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003408 Py_DECREF(py_key);
3409 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003410}
3411
3412
3413static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003414load_long_binget(Unpicklerobject *self)
3415{
3416 PyObject *py_key = 0, *value = 0;
3417 unsigned char c;
3418 char *s;
3419 long key;
3420 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003422 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003424 c = (unsigned char)s[0];
3425 key = (long)c;
3426 c = (unsigned char)s[1];
3427 key |= (long)c << 8;
3428 c = (unsigned char)s[2];
3429 key |= (long)c << 16;
3430 c = (unsigned char)s[3];
3431 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003433 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3434
3435 value = PyDict_GetItem(self->memo, py_key);
3436 if (! value) {
3437 PyErr_SetObject(BadPickleGet, py_key);
3438 rc = -1;
3439 } else {
3440 PDATA_APPEND(self->stack, value, -1);
3441 rc = 0;
3442 }
3443
3444 Py_DECREF(py_key);
3445 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003446}
3447
3448
3449static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003450load_put(Unpicklerobject *self)
3451{
3452 PyObject *py_str = 0, *value = 0;
3453 int len, l;
3454 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003456 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3457 if (l < 2) return bad_readline();
3458 if (!( len=self->stack->length )) return stackUnderflow();
3459 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3460 value=self->stack->data[len-1];
3461 l=PyDict_SetItem(self->memo, py_str, value);
3462 Py_DECREF(py_str);
3463 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003464}
3465
3466
3467static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003468load_binput(Unpicklerobject *self)
3469{
3470 PyObject *py_key = 0, *value = 0;
3471 unsigned char key;
3472 char *s;
3473 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003475 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3476 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003478 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003480 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3481 value=self->stack->data[len-1];
3482 len=PyDict_SetItem(self->memo, py_key, value);
3483 Py_DECREF(py_key);
3484 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003485}
3486
3487
3488static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003489load_long_binput(Unpicklerobject *self)
3490{
3491 PyObject *py_key = 0, *value = 0;
3492 long key;
3493 unsigned char c;
3494 char *s;
3495 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003497 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3498 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003500 c = (unsigned char)s[0];
3501 key = (long)c;
3502 c = (unsigned char)s[1];
3503 key |= (long)c << 8;
3504 c = (unsigned char)s[2];
3505 key |= (long)c << 16;
3506 c = (unsigned char)s[3];
3507 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003509 if (!( py_key = PyInt_FromLong(key))) return -1;
3510 value=self->stack->data[len-1];
3511 len=PyDict_SetItem(self->memo, py_key, value);
3512 Py_DECREF(py_key);
3513 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003514}
3515
3516
3517static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003518do_append(Unpicklerobject *self, int x)
3519{
3520 PyObject *value = 0, *list = 0, *append_method = 0;
3521 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003523 len=self->stack->length;
3524 if (!( len >= x && x > 0 )) return stackUnderflow();
3525 /* nothing to do */
3526 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003528 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003530 if (PyList_Check(list)) {
3531 PyObject *slice;
3532 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003534 slice=Pdata_popList(self->stack, x);
3535 list_len = PyList_GET_SIZE(list);
3536 i=PyList_SetSlice(list, list_len, list_len, slice);
3537 Py_DECREF(slice);
3538 return i;
3539 }
3540 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003542 if (!( append_method = PyObject_GetAttr(list, append_str)))
3543 return -1;
3544
3545 for (i = x; i < len; i++) {
3546 PyObject *junk;
3547
3548 value=self->stack->data[i];
3549 junk=0;
3550 ARG_TUP(self, value);
3551 if (self->arg) {
3552 junk = PyObject_Call(append_method, self->arg,
3553 NULL);
3554 FREE_ARG_TUP(self);
3555 }
3556 if (! junk) {
3557 Pdata_clear(self->stack, i+1);
3558 self->stack->length=x;
3559 Py_DECREF(append_method);
3560 return -1;
3561 }
3562 Py_DECREF(junk);
3563 }
3564 self->stack->length=x;
3565 Py_DECREF(append_method);
3566 }
3567
3568 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003569}
3570
3571
3572static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003573load_append(Unpicklerobject *self)
3574{
3575 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003576}
3577
3578
3579static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003580load_appends(Unpicklerobject *self)
3581{
3582 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003583}
3584
3585
3586static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003587do_setitems(Unpicklerobject *self, int x)
3588{
3589 PyObject *value = 0, *key = 0, *dict = 0;
3590 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003592 if (!( (len=self->stack->length) >= x
3593 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003595 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003597 for (i = x+1; i < len; i += 2) {
3598 key =self->stack->data[i-1];
3599 value=self->stack->data[i ];
3600 if (PyObject_SetItem(dict, key, value) < 0) {
3601 r=-1;
3602 break;
3603 }
3604 }
3605
3606 Pdata_clear(self->stack, x);
3607
3608 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003609}
3610
3611
Tim Peters84e87f32001-03-17 04:50:51 +00003612static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003613load_setitem(Unpicklerobject *self)
3614{
3615 return do_setitems(self, self->stack->length - 2);
3616}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003618static int
3619load_setitems(Unpicklerobject *self)
3620{
3621 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003622}
3623
Tim Peters84e87f32001-03-17 04:50:51 +00003624
Guido van Rossum60456fd1997-04-09 17:36:32 +00003625static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003626load_build(Unpicklerobject *self)
3627{
3628 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3629 *junk = 0, *__setstate__ = 0;
3630 int i, r = 0;
3631
3632 if (self->stack->length < 2) return stackUnderflow();
3633 PDATA_POP(self->stack, value);
3634 if (! value) return -1;
3635 inst=self->stack->data[self->stack->length-1];
3636
3637 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3638 ARG_TUP(self, value);
3639 if (self->arg) {
3640 junk = PyObject_Call(__setstate__, self->arg, NULL);
3641 FREE_ARG_TUP(self);
3642 }
3643 Py_DECREF(__setstate__);
3644 if (! junk) return -1;
3645 Py_DECREF(junk);
3646 return 0;
3647 }
3648
3649 PyErr_Clear();
3650 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3651 i = 0;
3652 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3653 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3654 r=-1;
3655 break;
3656 }
3657 }
3658 Py_DECREF(instdict);
3659 }
3660 else r=-1;
3661
3662 Py_XDECREF(value);
3663
3664 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003665}
3666
3667
3668static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003669load_mark(Unpicklerobject *self)
3670{
3671 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003673 /* Note that we split the (pickle.py) stack into two stacks, an
3674 object stack and a mark stack. Here we push a mark onto the
3675 mark stack.
3676 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003678 if ((self->num_marks + 1) >= self->marks_size) {
3679 s=self->marks_size+20;
3680 if (s <= self->num_marks) s=self->num_marks + 1;
3681 if (self->marks == NULL)
3682 self->marks=(int *)malloc(s * sizeof(int));
3683 else
3684 self->marks=(int *)realloc(self->marks,
3685 s * sizeof(int));
3686 if (! self->marks) {
3687 PyErr_NoMemory();
3688 return -1;
3689 }
3690 self->marks_size = s;
3691 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003693 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003695 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003696}
3697
Guido van Rossum60456fd1997-04-09 17:36:32 +00003698static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003699load_reduce(Unpicklerobject *self)
3700{
3701 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003703 PDATA_POP(self->stack, arg_tup);
3704 if (! arg_tup) return -1;
3705 PDATA_POP(self->stack, callable);
3706 if (callable) {
3707 ob = Instance_New(callable, arg_tup);
3708 Py_DECREF(callable);
3709 }
3710 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003712 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003714 PDATA_PUSH(self->stack, ob, -1);
3715 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003716}
Tim Peters84e87f32001-03-17 04:50:51 +00003717
Guido van Rossum60456fd1997-04-09 17:36:32 +00003718static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003719load(Unpicklerobject *self)
3720{
3721 PyObject *err = 0, *val = 0;
3722 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003724 self->num_marks = 0;
3725 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003727 while (1) {
3728 if ((*self->read_func)(self, &s, 1) < 0)
3729 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003730
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003731 switch (s[0]) {
3732 case NONE:
3733 if (load_none(self) < 0)
3734 break;
3735 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003737 case BININT:
3738 if (load_binint(self) < 0)
3739 break;
3740 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003742 case BININT1:
3743 if (load_binint1(self) < 0)
3744 break;
3745 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003747 case BININT2:
3748 if (load_binint2(self) < 0)
3749 break;
3750 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003752 case INT:
3753 if (load_int(self) < 0)
3754 break;
3755 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003757 case LONG:
3758 if (load_long(self) < 0)
3759 break;
3760 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762 case FLOAT:
3763 if (load_float(self) < 0)
3764 break;
3765 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003767 case BINFLOAT:
3768 if (load_binfloat(self) < 0)
3769 break;
3770 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003772 case BINSTRING:
3773 if (load_binstring(self) < 0)
3774 break;
3775 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003777 case SHORT_BINSTRING:
3778 if (load_short_binstring(self) < 0)
3779 break;
3780 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003782 case STRING:
3783 if (load_string(self) < 0)
3784 break;
3785 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003786
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003787#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003788 case UNICODE:
3789 if (load_unicode(self) < 0)
3790 break;
3791 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003793 case BINUNICODE:
3794 if (load_binunicode(self) < 0)
3795 break;
3796 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003797#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003799 case EMPTY_TUPLE:
3800 if (load_empty_tuple(self) < 0)
3801 break;
3802 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003804 case TUPLE:
3805 if (load_tuple(self) < 0)
3806 break;
3807 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003809 case EMPTY_LIST:
3810 if (load_empty_list(self) < 0)
3811 break;
3812 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003814 case LIST:
3815 if (load_list(self) < 0)
3816 break;
3817 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003819 case EMPTY_DICT:
3820 if (load_empty_dict(self) < 0)
3821 break;
3822 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003824 case DICT:
3825 if (load_dict(self) < 0)
3826 break;
3827 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003829 case OBJ:
3830 if (load_obj(self) < 0)
3831 break;
3832 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003834 case INST:
3835 if (load_inst(self) < 0)
3836 break;
3837 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003839 case GLOBAL:
3840 if (load_global(self) < 0)
3841 break;
3842 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003844 case APPEND:
3845 if (load_append(self) < 0)
3846 break;
3847 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003849 case APPENDS:
3850 if (load_appends(self) < 0)
3851 break;
3852 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003854 case BUILD:
3855 if (load_build(self) < 0)
3856 break;
3857 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003859 case DUP:
3860 if (load_dup(self) < 0)
3861 break;
3862 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003864 case BINGET:
3865 if (load_binget(self) < 0)
3866 break;
3867 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003869 case LONG_BINGET:
3870 if (load_long_binget(self) < 0)
3871 break;
3872 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003874 case GET:
3875 if (load_get(self) < 0)
3876 break;
3877 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003879 case MARK:
3880 if (load_mark(self) < 0)
3881 break;
3882 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003884 case BINPUT:
3885 if (load_binput(self) < 0)
3886 break;
3887 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003889 case LONG_BINPUT:
3890 if (load_long_binput(self) < 0)
3891 break;
3892 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003894 case PUT:
3895 if (load_put(self) < 0)
3896 break;
3897 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003898
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003899 case POP:
3900 if (load_pop(self) < 0)
3901 break;
3902 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003904 case POP_MARK:
3905 if (load_pop_mark(self) < 0)
3906 break;
3907 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003908
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003909 case SETITEM:
3910 if (load_setitem(self) < 0)
3911 break;
3912 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003914 case SETITEMS:
3915 if (load_setitems(self) < 0)
3916 break;
3917 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003919 case STOP:
3920 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003922 case PERSID:
3923 if (load_persid(self) < 0)
3924 break;
3925 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003926
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003927 case BINPERSID:
3928 if (load_binpersid(self) < 0)
3929 break;
3930 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003932 case REDUCE:
3933 if (load_reduce(self) < 0)
3934 break;
3935 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003937 case '\0':
3938 /* end of file */
3939 PyErr_SetNone(PyExc_EOFError);
3940 break;
Neil Schemenauerfa79c652002-03-22 23:02:53 +00003941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003942 default:
3943 cPickle_ErrFormat(UnpicklingError,
3944 "invalid load key, '%s'.",
3945 "c", s[0]);
3946 return NULL;
3947 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003949 break;
3950 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003952 if ((err = PyErr_Occurred())) {
3953 if (err == PyExc_EOFError) {
3954 PyErr_SetNone(PyExc_EOFError);
3955 }
3956 return NULL;
3957 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003959 PDATA_POP(self->stack, val);
3960 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003961}
Tim Peters84e87f32001-03-17 04:50:51 +00003962
Guido van Rossum60456fd1997-04-09 17:36:32 +00003963
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003964/* No-load functions to support noload, which is used to
3965 find persistent references. */
3966
3967static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003968noload_obj(Unpicklerobject *self)
3969{
3970 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003971
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003972 if ((i = marker(self)) < 0) return -1;
3973 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003974}
3975
3976
3977static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003978noload_inst(Unpicklerobject *self)
3979{
3980 int i;
3981 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003983 if ((i = marker(self)) < 0) return -1;
3984 Pdata_clear(self->stack, i);
3985 if ((*self->readline_func)(self, &s) < 0) return -1;
3986 if ((*self->readline_func)(self, &s) < 0) return -1;
3987 PDATA_APPEND(self->stack, Py_None,-1);
3988 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003989}
3990
3991static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003992noload_global(Unpicklerobject *self)
3993{
3994 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003996 if ((*self->readline_func)(self, &s) < 0) return -1;
3997 if ((*self->readline_func)(self, &s) < 0) return -1;
3998 PDATA_APPEND(self->stack, Py_None,-1);
3999 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004000}
4001
4002static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004003noload_reduce(Unpicklerobject *self)
4004{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004005
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004006 if (self->stack->length < 2) return stackUnderflow();
4007 Pdata_clear(self->stack, self->stack->length-2);
4008 PDATA_APPEND(self->stack, Py_None,-1);
4009 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004010}
4011
4012static int
4013noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004014
Guido van Rossum053b8df1998-11-25 16:18:00 +00004015 if (self->stack->length < 1) return stackUnderflow();
4016 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004017 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004018}
4019
4020
4021static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004022noload(Unpicklerobject *self)
4023{
4024 PyObject *err = 0, *val = 0;
4025 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004027 self->num_marks = 0;
4028 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004030 while (1) {
4031 if ((*self->read_func)(self, &s, 1) < 0)
4032 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004034 switch (s[0]) {
4035 case NONE:
4036 if (load_none(self) < 0)
4037 break;
4038 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004039
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004040 case BININT:
4041 if (load_binint(self) < 0)
4042 break;
4043 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004045 case BININT1:
4046 if (load_binint1(self) < 0)
4047 break;
4048 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004050 case BININT2:
4051 if (load_binint2(self) < 0)
4052 break;
4053 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004055 case INT:
4056 if (load_int(self) < 0)
4057 break;
4058 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004060 case LONG:
4061 if (load_long(self) < 0)
4062 break;
4063 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004065 case FLOAT:
4066 if (load_float(self) < 0)
4067 break;
4068 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004070 case BINFLOAT:
4071 if (load_binfloat(self) < 0)
4072 break;
4073 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004075 case BINSTRING:
4076 if (load_binstring(self) < 0)
4077 break;
4078 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004080 case SHORT_BINSTRING:
4081 if (load_short_binstring(self) < 0)
4082 break;
4083 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004085 case STRING:
4086 if (load_string(self) < 0)
4087 break;
4088 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004089
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004090#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004091 case UNICODE:
4092 if (load_unicode(self) < 0)
4093 break;
4094 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004096 case BINUNICODE:
4097 if (load_binunicode(self) < 0)
4098 break;
4099 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004100#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004101
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004102 case EMPTY_TUPLE:
4103 if (load_empty_tuple(self) < 0)
4104 break;
4105 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004107 case TUPLE:
4108 if (load_tuple(self) < 0)
4109 break;
4110 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004112 case EMPTY_LIST:
4113 if (load_empty_list(self) < 0)
4114 break;
4115 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004117 case LIST:
4118 if (load_list(self) < 0)
4119 break;
4120 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004122 case EMPTY_DICT:
4123 if (load_empty_dict(self) < 0)
4124 break;
4125 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004127 case DICT:
4128 if (load_dict(self) < 0)
4129 break;
4130 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004132 case OBJ:
4133 if (noload_obj(self) < 0)
4134 break;
4135 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004137 case INST:
4138 if (noload_inst(self) < 0)
4139 break;
4140 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004142 case GLOBAL:
4143 if (noload_global(self) < 0)
4144 break;
4145 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004147 case APPEND:
4148 if (load_append(self) < 0)
4149 break;
4150 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004152 case APPENDS:
4153 if (load_appends(self) < 0)
4154 break;
4155 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004157 case BUILD:
4158 if (noload_build(self) < 0)
4159 break;
4160 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004162 case DUP:
4163 if (load_dup(self) < 0)
4164 break;
4165 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004167 case BINGET:
4168 if (load_binget(self) < 0)
4169 break;
4170 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004172 case LONG_BINGET:
4173 if (load_long_binget(self) < 0)
4174 break;
4175 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004177 case GET:
4178 if (load_get(self) < 0)
4179 break;
4180 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004182 case MARK:
4183 if (load_mark(self) < 0)
4184 break;
4185 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004187 case BINPUT:
4188 if (load_binput(self) < 0)
4189 break;
4190 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004192 case LONG_BINPUT:
4193 if (load_long_binput(self) < 0)
4194 break;
4195 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004197 case PUT:
4198 if (load_put(self) < 0)
4199 break;
4200 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004202 case POP:
4203 if (load_pop(self) < 0)
4204 break;
4205 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004207 case POP_MARK:
4208 if (load_pop_mark(self) < 0)
4209 break;
4210 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004212 case SETITEM:
4213 if (load_setitem(self) < 0)
4214 break;
4215 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004217 case SETITEMS:
4218 if (load_setitems(self) < 0)
4219 break;
4220 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004222 case STOP:
4223 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004225 case PERSID:
4226 if (load_persid(self) < 0)
4227 break;
4228 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004230 case BINPERSID:
4231 if (load_binpersid(self) < 0)
4232 break;
4233 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004235 case REDUCE:
4236 if (noload_reduce(self) < 0)
4237 break;
4238 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004240 default:
4241 cPickle_ErrFormat(UnpicklingError,
4242 "invalid load key, '%s'.",
4243 "c", s[0]);
4244 return NULL;
4245 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004247 break;
4248 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004250 if ((err = PyErr_Occurred())) {
4251 if (err == PyExc_EOFError) {
4252 PyErr_SetNone(PyExc_EOFError);
4253 }
4254 return NULL;
4255 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004257 PDATA_POP(self->stack, val);
4258 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004259}
Tim Peters84e87f32001-03-17 04:50:51 +00004260
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004261
Guido van Rossum60456fd1997-04-09 17:36:32 +00004262static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004263Unpickler_load(Unpicklerobject *self, PyObject *args)
4264{
4265 if (!( PyArg_ParseTuple(args, ":load")))
4266 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004268 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004269}
4270
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004271static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004272Unpickler_noload(Unpicklerobject *self, PyObject *args)
4273{
4274 if (!( PyArg_ParseTuple(args, ":noload")))
4275 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004277 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004278}
4279
Guido van Rossum60456fd1997-04-09 17:36:32 +00004280
4281static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004282 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004283 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004284 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004285 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004286 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004287 "noload() -- not load a pickle, but go through most of the motions\n"
4288 "\n"
4289 "This function can be used to read past a pickle without instantiating\n"
4290 "any objects or importing any modules. It can also be used to find all\n"
4291 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004292 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004293 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004294 {NULL, NULL} /* sentinel */
4295};
4296
4297
4298static Unpicklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004299newUnpicklerobject(PyObject *f)
4300{
4301 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004303 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
4304 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004306 self->file = NULL;
4307 self->arg = NULL;
4308 self->stack = (Pdata*)Pdata_New();
4309 self->pers_func = NULL;
4310 self->last_string = NULL;
4311 self->marks = NULL;
4312 self->num_marks = 0;
4313 self->marks_size = 0;
4314 self->buf_size = 0;
4315 self->read = NULL;
4316 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004317 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004318
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004319 if (!( self->memo = PyDict_New()))
4320 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004322 Py_INCREF(f);
4323 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004325 /* Set read, readline based on type of f */
4326 if (PyFile_Check(f)) {
4327 self->fp = PyFile_AsFile(f);
4328 if (self->fp == NULL) {
4329 PyErr_SetString(PyExc_ValueError,
4330 "I/O operation on closed file");
4331 goto err;
4332 }
4333 self->read_func = read_file;
4334 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004335 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004336 else if (PycStringIO_InputCheck(f)) {
4337 self->fp = NULL;
4338 self->read_func = read_cStringIO;
4339 self->readline_func = readline_cStringIO;
4340 }
4341 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004343 self->fp = NULL;
4344 self->read_func = read_other;
4345 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004347 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4348 (self->read = PyObject_GetAttr(f, read_str)))) {
4349 PyErr_Clear();
4350 PyErr_SetString( PyExc_TypeError,
4351 "argument must have 'read' and "
4352 "'readline' attributes" );
4353 goto err;
4354 }
4355 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004357 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004359 err:
4360 Py_DECREF((PyObject *)self);
4361 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004362}
4363
4364
4365static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004366get_Unpickler(PyObject *self, PyObject *args)
4367{
4368 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004370 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
4371 return NULL;
4372 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004373}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004374
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004375
Guido van Rossum60456fd1997-04-09 17:36:32 +00004376static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004377Unpickler_dealloc(Unpicklerobject *self)
4378{
4379 Py_XDECREF(self->readline);
4380 Py_XDECREF(self->read);
4381 Py_XDECREF(self->file);
4382 Py_XDECREF(self->memo);
4383 Py_XDECREF(self->stack);
4384 Py_XDECREF(self->pers_func);
4385 Py_XDECREF(self->arg);
4386 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004387
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004388 if (self->marks) {
4389 free(self->marks);
4390 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004392 if (self->buf_size) {
4393 free(self->buf);
4394 }
Tim Peters84e87f32001-03-17 04:50:51 +00004395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004396 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004397}
4398
4399
4400static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004401Unpickler_getattr(Unpicklerobject *self, char *name)
4402{
4403 if (!strcmp(name, "persistent_load")) {
4404 if (!self->pers_func) {
4405 PyErr_SetString(PyExc_AttributeError, name);
4406 return NULL;
4407 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004409 Py_INCREF(self->pers_func);
4410 return self->pers_func;
4411 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004413 if (!strcmp(name, "find_global")) {
4414 if (!self->find_class) {
4415 PyErr_SetString(PyExc_AttributeError, name);
4416 return NULL;
4417 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004419 Py_INCREF(self->find_class);
4420 return self->find_class;
4421 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004423 if (!strcmp(name, "memo")) {
4424 if (!self->memo) {
4425 PyErr_SetString(PyExc_AttributeError, name);
4426 return NULL;
4427 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004429 Py_INCREF(self->memo);
4430 return self->memo;
4431 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004433 if (!strcmp(name, "UnpicklingError")) {
4434 Py_INCREF(UnpicklingError);
4435 return UnpicklingError;
4436 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004438 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004439}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004440
Guido van Rossum60456fd1997-04-09 17:36:32 +00004441
4442static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004443Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
4444{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004446 if (!strcmp(name, "persistent_load")) {
4447 Py_XDECREF(self->pers_func);
4448 self->pers_func = value;
4449 Py_XINCREF(value);
4450 return 0;
4451 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004453 if (!strcmp(name, "find_global")) {
4454 Py_XDECREF(self->find_class);
4455 self->find_class = value;
4456 Py_XINCREF(value);
4457 return 0;
4458 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004460 if (! value) {
4461 PyErr_SetString(PyExc_TypeError,
4462 "attribute deletion is not supported");
4463 return -1;
4464 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004466 if (strcmp(name, "memo") == 0) {
4467 if (!PyDict_Check(value)) {
4468 PyErr_SetString(PyExc_TypeError,
4469 "memo must be a dictionary");
4470 return -1;
4471 }
4472 Py_XDECREF(self->memo);
4473 self->memo = value;
4474 Py_INCREF(value);
4475 return 0;
4476 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004478 PyErr_SetString(PyExc_AttributeError, name);
4479 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004480}
4481
4482
4483static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004484cpm_dump(PyObject *self, PyObject *args)
4485{
4486 PyObject *ob, *file, *res = NULL;
4487 Picklerobject *pickler = 0;
4488 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004490 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin)))
4491 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004493 if (!( pickler = newPicklerobject(file, bin)))
4494 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004496 if (dump(pickler, ob) < 0)
4497 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004499 Py_INCREF(Py_None);
4500 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004502 finally:
4503 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004505 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004506}
4507
4508
4509static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004510cpm_dumps(PyObject *self, PyObject *args)
4511{
4512 PyObject *ob, *file = 0, *res = NULL;
4513 Picklerobject *pickler = 0;
4514 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004516 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin)))
4517 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004519 if (!( file = PycStringIO->NewOutput(128)))
4520 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004522 if (!( pickler = newPicklerobject(file, bin)))
4523 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004525 if (dump(pickler, ob) < 0)
4526 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004528 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004530 finally:
4531 Py_XDECREF(pickler);
4532 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004534 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004535}
4536
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004537
4538static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004539cpm_load(PyObject *self, PyObject *args)
4540{
4541 Unpicklerobject *unpickler = 0;
4542 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004544 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
4545 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004546
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004547 if (!( unpickler = newUnpicklerobject(ob)))
4548 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004550 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004552 finally:
4553 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004555 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004556}
4557
4558
4559static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004560cpm_loads(PyObject *self, PyObject *args)
4561{
4562 PyObject *ob, *file = 0, *res = NULL;
4563 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004565 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
4566 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004568 if (!( file = PycStringIO->NewInput(ob)))
4569 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004571 if (!( unpickler = newUnpicklerobject(file)))
4572 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004573
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004574 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004576 finally:
4577 Py_XDECREF(file);
4578 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004580 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004581}
4582
4583
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004584PyDoc_STRVAR(Unpicklertype__doc__,
4585"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004586
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004587static PyTypeObject Unpicklertype = {
4588 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004589 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004590 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004591 sizeof(Unpicklerobject), /*tp_basicsize*/
4592 0, /*tp_itemsize*/
4593 /* methods */
4594 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4595 (printfunc)0, /*tp_print*/
4596 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4597 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4598 (cmpfunc)0, /*tp_compare*/
4599 (reprfunc)0, /*tp_repr*/
4600 0, /*tp_as_number*/
4601 0, /*tp_as_sequence*/
4602 0, /*tp_as_mapping*/
4603 (hashfunc)0, /*tp_hash*/
4604 (ternaryfunc)0, /*tp_call*/
4605 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004606
Guido van Rossum60456fd1997-04-09 17:36:32 +00004607 /* Space for future expansion */
4608 0L,0L,0L,0L,
4609 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004610};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004611
Guido van Rossum60456fd1997-04-09 17:36:32 +00004612static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004613 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004614 PyDoc_STR("dump(object, file, [binary]) --"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004615 "Write an object in pickle format to the given file\n"
4616 "\n"
4617 "If the optional argument, binary, is provided and is true, then the\n"
4618 "pickle will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004619 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004620 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004621 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004622 PyDoc_STR("dumps(object, [binary]) --"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004623 "Return a string containing an object in pickle format\n"
4624 "\n"
4625 "If the optional argument, binary, is provided and is true, then the\n"
4626 "pickle will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004627 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004628 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004629 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004630 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Neal Norwitzb0493252002-03-31 14:44:22 +00004631 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004632 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Neal Norwitzb0493252002-03-31 14:44:22 +00004633 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004634 PyDoc_STR("Pickler(file, [binary]) -- Create a pickler\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004635 "\n"
4636 "If the optional argument, binary, is provided and is true, then\n"
4637 "pickles will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004638 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004639 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004640 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004641 PyDoc_STR("Unpickler(file) -- Create an unpickler")},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004642 { NULL, NULL }
4643};
4644
Guido van Rossum60456fd1997-04-09 17:36:32 +00004645static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004646init_stuff(PyObject *module_dict)
4647{
4648 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004649
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004650#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004652 INIT_STR(__class__);
4653 INIT_STR(__getinitargs__);
4654 INIT_STR(__dict__);
4655 INIT_STR(__getstate__);
4656 INIT_STR(__setstate__);
4657 INIT_STR(__name__);
4658 INIT_STR(__main__);
4659 INIT_STR(__reduce__);
4660 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004661 INIT_STR(append);
4662 INIT_STR(read);
4663 INIT_STR(readline);
4664 INIT_STR(copy_reg);
4665 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004666 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004668 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
4669 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004670
Tim Peters1f1b2d22003-02-01 02:16:37 +00004671 /* This is special because we want to use a different
4672 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004673 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
4674 if (!dispatch_table)
4675 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004676
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004677 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004679 /* Down to here ********************************** */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004681 if (!( empty_tuple = PyTuple_New(0)))
4682 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004684 /* Ugh */
4685 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4686 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4687 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004689 if (!( t=PyDict_New())) return -1;
4690 if (!( r=PyRun_String(
4691 "def __init__(self, *args): self.args=args\n\n"
4692 "def __str__(self):\n"
4693 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4694 Py_file_input,
4695 module_dict, t) )) return -1;
4696 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004698 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
4699 if (!PickleError)
4700 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004702 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004704 PicklingError = PyErr_NewException("cPickle.PicklingError",
4705 PickleError, NULL);
4706 if (!PicklingError)
4707 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004709 if (!( t=PyDict_New())) return -1;
4710 if (!( r=PyRun_String(
4711 "def __init__(self, *args): self.args=args\n\n"
4712 "def __str__(self):\n"
4713 " a=self.args\n"
4714 " a=a and type(a[0]) or '(what)'\n"
4715 " return 'Cannot pickle %s objects' % a\n"
4716 , Py_file_input,
4717 module_dict, t) )) return -1;
4718 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004720 if (!( UnpickleableError = PyErr_NewException(
4721 "cPickle.UnpickleableError", PicklingError, t)))
4722 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004724 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004726 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
4727 PickleError, NULL)))
4728 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004729
Martin v. Löwis658009a2002-09-16 17:26:24 +00004730 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
4731 UnpicklingError, NULL)))
4732 return -1;
4733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004734 if (PyDict_SetItemString(module_dict, "PickleError",
4735 PickleError) < 0)
4736 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004738 if (PyDict_SetItemString(module_dict, "PicklingError",
4739 PicklingError) < 0)
4740 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004742 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4743 UnpicklingError) < 0)
4744 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004746 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4747 UnpickleableError) < 0)
4748 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004750 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4751 BadPickleGet) < 0)
4752 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004754 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004756 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004757}
4758
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004759#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
4760#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004761#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004762PyMODINIT_FUNC
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004763initcPickle(void)
4764{
4765 PyObject *m, *d, *di, *v, *k;
4766 int i;
4767 char *rev="1.71";
4768 PyObject *format_version;
4769 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004771 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004772 Unpicklertype.ob_type = &PyType_Type;
4773 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004775 /* Initialize some pieces. We need to do this before module creation,
4776 so we're forced to use a temporary dictionary. :(
4777 */
4778 di=PyDict_New();
4779 if (!di) return;
4780 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004782 /* Create the module and add the functions */
4783 m = Py_InitModule4("cPickle", cPickle_methods,
4784 cPickle_module_documentation,
4785 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004787 /* Add some symbolic constants to the module */
4788 d = PyModule_GetDict(m);
4789 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4790 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004792 /* Copy data from di. Waaa. */
4793 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4794 if (PyObject_SetItem(d, k, v) < 0) {
4795 Py_DECREF(di);
4796 return;
4797 }
4798 }
4799 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004801 format_version = PyString_FromString("1.3");
4802 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004804 PyDict_SetItemString(d, "format_version", format_version);
4805 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4806 Py_XDECREF(format_version);
4807 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004808}