blob: 32fdd6ed76860abce93ae9cdc9aae9fb2869d254 [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;
95static PyObject *safe_constructors;
Guido van Rossum60456fd1997-04-09 17:36:32 +000096static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000097
Guido van Rossum60456fd1997-04-09 17:36:32 +000098static PyObject *__class___str, *__getinitargs___str, *__dict___str,
99 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
100 *write_str, *__safe_for_unpickling___str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000101 *read_str, *readline_str, *__main___str, *__basicnew___str,
Fred Drake2c7a6852001-07-17 18:34:03 +0000102 *copy_reg_str, *dispatch_table_str, *safe_constructors_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000103
Guido van Rossum053b8df1998-11-25 16:18:00 +0000104/*************************************************************************
105 Internal Data type for pickle data. */
106
107typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000108 PyObject_HEAD
109 int length, size;
110 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000111} Pdata;
112
Tim Peters84e87f32001-03-17 04:50:51 +0000113static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000114Pdata_dealloc(Pdata *self)
115{
116 int i;
117 PyObject **p;
118
119 for (i=self->length, p=self->data; --i >= 0; p++) Py_DECREF(*p);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000121 if (self->data) free(self->data);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000123 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000124}
125
126static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000127 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
128 (destructor)Pdata_dealloc,
129 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000130};
131
132#define Pdata_Check(O) ((O)->ob_type == &PdataType)
133
134static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000135Pdata_New(void)
136{
137 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000139 if (!( self = PyObject_New(Pdata, &PdataType))) return NULL;
140 self->size=8;
141 self->length=0;
142 self->data=malloc(self->size * sizeof(PyObject*));
143 if (self->data) return (PyObject*)self;
144 Py_DECREF(self);
145 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000146}
147
Tim Peters84e87f32001-03-17 04:50:51 +0000148static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000149stackUnderflow(void)
150{
151 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
152 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000153}
154
155static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000156Pdata_clear(Pdata *self, int clearto)
157{
158 int i;
159 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000161 if (clearto < 0) return stackUnderflow();
162 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000164 for (i=self->length, p=self->data+clearto; --i >= clearto; p++)
165 Py_DECREF(*p);
166 self->length=clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000168 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000169}
170
171
Tim Peters84e87f32001-03-17 04:50:51 +0000172static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000173Pdata_grow(Pdata *self)
174{
175 if (! self->size) {
176 PyErr_NoMemory();
177 return -1;
178 }
179 self->size *= 2;
180 self->data = realloc(self->data, self->size*sizeof(PyObject*));
181 if (! self->data) {
182 self->size = 0;
183 PyErr_NoMemory();
184 return -1;
185 }
186 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000187}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000188
189#define PDATA_POP(D,V) { \
190 if ((D)->length) V=D->data[--((D)->length)]; \
191 else { \
192 PyErr_SetString(UnpicklingError, "bad pickle data"); \
193 V=NULL; \
194 } \
195}
196
197
198static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000199Pdata_popTuple(Pdata *self, int start)
200{
201 PyObject *r;
202 int i, j, l;
203
204 l=self->length-start;
205 if (!( r=PyTuple_New(l))) return NULL;
206 for (i=start, j=0 ; j < l; i++, j++)
207 PyTuple_SET_ITEM(r, j, self->data[i]);
208
209 self->length=start;
210 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000211}
212
213static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000214Pdata_popList(Pdata *self, int start)
215{
216 PyObject *r;
217 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000219 l=self->length-start;
220 if (!( r=PyList_New(l))) return NULL;
221 for (i=start, j=0 ; j < l; i++, j++)
222 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000224 self->length=start;
225 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000226}
227
228#define PDATA_APPEND_(D,O,ER) { \
229 if (Pdata_Append(((Pdata*)(D)), O) < 0) return ER; \
230}
231
232#define PDATA_APPEND(D,O,ER) { \
233 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
234 Pdata_grow((Pdata*)(D)) < 0) \
235 return ER; \
236 Py_INCREF(O); \
237 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
238}
239
240#define PDATA_PUSH(D,O,ER) { \
241 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
242 Pdata_grow((Pdata*)(D)) < 0) { \
243 Py_DECREF(O); \
244 return ER; \
245 } \
246 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
247}
248
249/*************************************************************************/
250
251#define ARG_TUP(self, o) { \
252 if (self->arg || (self->arg=PyTuple_New(1))) { \
253 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
254 PyTuple_SET_ITEM(self->arg,0,o); \
255 } \
256 else { \
257 Py_DECREF(o); \
258 } \
259}
260
261#define FREE_ARG_TUP(self) { \
262 if (self->arg->ob_refcnt > 1) { \
263 Py_DECREF(self->arg); \
264 self->arg=NULL; \
265 } \
266 }
267
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000268typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000269 PyObject_HEAD
270 FILE *fp;
271 PyObject *write;
272 PyObject *file;
273 PyObject *memo;
274 PyObject *arg;
275 PyObject *pers_func;
276 PyObject *inst_pers_func;
277 int bin;
278 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000279 int nesting;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000280 int (*write_func)(struct Picklerobject *, char *, int);
281 char *write_buf;
282 int buf_size;
283 PyObject *dispatch_table;
284 int fast_container; /* count nested container dumps */
285 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000286} Picklerobject;
287
Barry Warsaw52acb492001-12-21 20:04:22 +0000288#ifndef PY_CPICKLE_FAST_LIMIT
289#define PY_CPICKLE_FAST_LIMIT 50
290#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000291
Jeremy Hylton938ace62002-07-17 16:30:39 +0000292static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000293
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000294typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000295 PyObject_HEAD
296 FILE *fp;
297 PyObject *file;
298 PyObject *readline;
299 PyObject *read;
300 PyObject *memo;
301 PyObject *arg;
302 Pdata *stack;
303 PyObject *mark;
304 PyObject *pers_func;
305 PyObject *last_string;
306 int *marks;
307 int num_marks;
308 int marks_size;
309 int (*read_func)(struct Unpicklerobject *, char **, int);
310 int (*readline_func)(struct Unpicklerobject *, char **);
311 int buf_size;
312 char *buf;
313 PyObject *safe_constructors;
314 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000315} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000316
Jeremy Hylton938ace62002-07-17 16:30:39 +0000317static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000318
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000319/* Forward decls that need the above structs */
320static int save(Picklerobject *, PyObject *, int);
321static int put2(Picklerobject *, PyObject *);
322
Tim Peters84e87f32001-03-17 04:50:51 +0000323int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000324cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
325{
326 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000327
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000328 if ((v = PyObject_GetItem(o,key))) {
329 Py_DECREF(v);
330 return 1;
331 }
332
333 PyErr_Clear();
334 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000335}
336
Guido van Rossumd385d591997-04-09 17:47:47 +0000337static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000338PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000339cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
340{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000341 va_list va;
342 PyObject *args=0, *retval=0;
343 va_start(va, format);
344
345 if (format) args = Py_VaBuildValue(format, va);
346 va_end(va);
347 if (format && ! args) return NULL;
348 if (stringformat && !(retval=PyString_FromString(stringformat)))
349 return NULL;
350
351 if (retval) {
352 if (args) {
353 PyObject *v;
354 v=PyString_Format(retval, args);
355 Py_DECREF(retval);
356 Py_DECREF(args);
357 if (! v) return NULL;
358 retval=v;
359 }
360 }
361 else
362 if (args) retval=args;
363 else {
364 PyErr_SetObject(ErrType,Py_None);
365 return NULL;
366 }
367 PyErr_SetObject(ErrType,retval);
368 Py_DECREF(retval);
369 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000370}
371
Tim Peters84e87f32001-03-17 04:50:51 +0000372static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000373write_file(Picklerobject *self, char *s, int n)
374{
375 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000377 if (s == NULL) {
378 return 0;
379 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000381 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000382 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000383 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000384 if (nbyteswritten != (size_t)n) {
385 PyErr_SetFromErrno(PyExc_IOError);
386 return -1;
387 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000389 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000390}
391
Tim Peters84e87f32001-03-17 04:50:51 +0000392static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000393write_cStringIO(Picklerobject *self, char *s, int n)
394{
395 if (s == NULL) {
396 return 0;
397 }
398
399 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
400 return -1;
401 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000403 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000404}
405
Tim Peters84e87f32001-03-17 04:50:51 +0000406static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000407write_none(Picklerobject *self, char *s, int n)
408{
409 if (s == NULL) return 0;
410 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000411}
412
Tim Peters84e87f32001-03-17 04:50:51 +0000413static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000414write_other(Picklerobject *self, char *s, int n)
415{
416 PyObject *py_str = 0, *junk = 0;
417
418 if (s == NULL) {
419 if (!( self->buf_size )) return 0;
420 py_str = PyString_FromStringAndSize(self->write_buf,
421 self->buf_size);
422 if (!py_str)
423 return -1;
424 }
425 else {
426 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
427 if (write_other(self, NULL, 0) < 0)
428 return -1;
429 }
430
431 if (n > WRITE_BUF_SIZE) {
432 if (!( py_str =
433 PyString_FromStringAndSize(s, n)))
434 return -1;
435 }
436 else {
437 memcpy(self->write_buf + self->buf_size, s, n);
438 self->buf_size += n;
439 return n;
440 }
441 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000443 if (self->write) {
444 /* object with write method */
445 ARG_TUP(self, py_str);
446 if (self->arg) {
447 junk = PyObject_Call(self->write, self->arg, NULL);
448 FREE_ARG_TUP(self);
449 }
450 if (junk) Py_DECREF(junk);
451 else return -1;
452 }
453 else
454 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000456 self->buf_size = 0;
457 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000458}
459
460
Tim Peters84e87f32001-03-17 04:50:51 +0000461static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000462read_file(Unpicklerobject *self, char **s, int n)
463{
464 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000466 if (self->buf_size == 0) {
467 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000469 size = ((n < 32) ? 32 : n);
470 if (!( self->buf = (char *)malloc(size * sizeof(char)))) {
471 PyErr_NoMemory();
472 return -1;
473 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000475 self->buf_size = size;
476 }
477 else if (n > self->buf_size) {
478 self->buf = (char *)realloc(self->buf, n * sizeof(char));
479 if (!self->buf) {
480 PyErr_NoMemory();
481 return -1;
482 }
Tim Peters84e87f32001-03-17 04:50:51 +0000483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000484 self->buf_size = n;
485 }
Tim Peters84e87f32001-03-17 04:50:51 +0000486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000487 Py_BEGIN_ALLOW_THREADS
488 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
489 Py_END_ALLOW_THREADS
490 if (nbytesread != (size_t)n) {
491 if (feof(self->fp)) {
492 PyErr_SetNone(PyExc_EOFError);
493 return -1;
494 }
495
496 PyErr_SetFromErrno(PyExc_IOError);
497 return -1;
498 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000500 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000502 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000503}
504
505
Tim Peters84e87f32001-03-17 04:50:51 +0000506static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000507readline_file(Unpicklerobject *self, char **s)
508{
509 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000511 if (self->buf_size == 0) {
512 if (!( self->buf = (char *)malloc(40 * sizeof(char)))) {
513 PyErr_NoMemory();
514 return -1;
515 }
Tim Peters84e87f32001-03-17 04:50:51 +0000516
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000517 self->buf_size = 40;
518 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000519
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000520 i = 0;
521 while (1) {
522 for (; i < (self->buf_size - 1); i++) {
523 if (feof(self->fp) ||
524 (self->buf[i] = getc(self->fp)) == '\n') {
525 self->buf[i + 1] = '\0';
526 *s = self->buf;
527 return i + 1;
528 }
529 }
530 self->buf = (char *)realloc(self->buf,
531 (self->buf_size * 2) * sizeof(char));
532 if (!self->buf) {
533 PyErr_NoMemory();
534 return -1;
535 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000537 self->buf_size *= 2;
538 }
Tim Peters84e87f32001-03-17 04:50:51 +0000539}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000540
541
Tim Peters84e87f32001-03-17 04:50:51 +0000542static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000543read_cStringIO(Unpicklerobject *self, char **s, int n)
544{
545 char *ptr;
546
547 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
548 PyErr_SetNone(PyExc_EOFError);
549 return -1;
550 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000552 *s = ptr;
553
554 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000555}
556
557
Tim Peters84e87f32001-03-17 04:50:51 +0000558static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000559readline_cStringIO(Unpicklerobject *self, char **s)
560{
561 int n;
562 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000564 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
565 return -1;
566 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000568 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000570 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000571}
572
573
Tim Peters84e87f32001-03-17 04:50:51 +0000574static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000575read_other(Unpicklerobject *self, char **s, int n)
576{
577 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000579 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000581 ARG_TUP(self, bytes);
582 if (self->arg) {
583 str = PyObject_Call(self->read, self->arg, NULL);
584 FREE_ARG_TUP(self);
585 }
586 if (! str) return -1;
587
588 Py_XDECREF(self->last_string);
589 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000591 if (! (*s = PyString_AsString(str))) return -1;
592 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000593}
594
595
Tim Peters84e87f32001-03-17 04:50:51 +0000596static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000597readline_other(Unpicklerobject *self, char **s)
598{
599 PyObject *str;
600 int str_size;
601
602 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
603 return -1;
604 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000606 if ((str_size = PyString_Size(str)) < 0)
607 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000609 Py_XDECREF(self->last_string);
610 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000612 if (! (*s = PyString_AsString(str)))
613 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000615 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000616}
617
618
619static char *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000620pystrndup(char *s, int l)
621{
622 char *r;
623 if (!( r=malloc((l+1)*sizeof(char)))) return (char*)PyErr_NoMemory();
624 memcpy(r,s,l);
625 r[l]=0;
626 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000627}
628
629
630static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000631get(Picklerobject *self, PyObject *id)
632{
633 PyObject *value, *mv;
634 long c_value;
635 char s[30];
636 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000637
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000638 if (!( mv = PyDict_GetItem(self->memo, id))) {
639 PyErr_SetObject(PyExc_KeyError, id);
640 return -1;
641 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000643 if (!( value = PyTuple_GetItem(mv, 0)))
644 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000646 if (!( PyInt_Check(value))) {
647 PyErr_SetString(PicklingError, "no int where int expected in memo");
648 return -1;
649 }
650 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000652 if (!self->bin) {
653 s[0] = GET;
654 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
655 len = strlen(s);
656 }
657 else if (Pdata_Check(self->file)) {
658 if (write_other(self, NULL, 0) < 0) return -1;
659 PDATA_APPEND(self->file, mv, -1);
660 return 0;
661 }
662 else {
663 if (c_value < 256) {
664 s[0] = BINGET;
665 s[1] = (int)(c_value & 0xff);
666 len = 2;
667 }
668 else {
669 s[0] = LONG_BINGET;
670 s[1] = (int)(c_value & 0xff);
671 s[2] = (int)((c_value >> 8) & 0xff);
672 s[3] = (int)((c_value >> 16) & 0xff);
673 s[4] = (int)((c_value >> 24) & 0xff);
674 len = 5;
675 }
676 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000678 if ((*self->write_func)(self, s, len) < 0)
679 return -1;
680
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000681 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000682}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000683
Guido van Rossum60456fd1997-04-09 17:36:32 +0000684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000685static int
686put(Picklerobject *self, PyObject *ob)
687{
688 if (ob->ob_refcnt < 2 || self->fast)
689 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000691 return put2(self, ob);
692}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000693
Guido van Rossum053b8df1998-11-25 16:18:00 +0000694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000695static int
696put2(Picklerobject *self, PyObject *ob)
697{
698 char c_str[30];
699 int p;
700 size_t len;
701 int res = -1;
702 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000704 if (self->fast)
705 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000707 if ((p = PyDict_Size(self->memo)) < 0)
708 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000710 /* Make sure memo keys are positive! */
711 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000713 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
714 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000716 if (!( memo_len = PyInt_FromLong(p)))
717 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000719 if (!( t = PyTuple_New(2)))
720 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000722 PyTuple_SET_ITEM(t, 0, memo_len);
723 Py_INCREF(memo_len);
724 PyTuple_SET_ITEM(t, 1, ob);
725 Py_INCREF(ob);
726
727 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
728 goto finally;
729
730 if (!self->bin) {
731 c_str[0] = PUT;
732 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
733 len = strlen(c_str);
734 }
735 else if (Pdata_Check(self->file)) {
736 if (write_other(self, NULL, 0) < 0) return -1;
737 PDATA_APPEND(self->file, memo_len, -1);
738 res=0; /* Job well done ;) */
739 goto finally;
740 }
741 else {
742 if (p >= 256) {
743 c_str[0] = LONG_BINPUT;
744 c_str[1] = (int)(p & 0xff);
745 c_str[2] = (int)((p >> 8) & 0xff);
746 c_str[3] = (int)((p >> 16) & 0xff);
747 c_str[4] = (int)((p >> 24) & 0xff);
748 len = 5;
749 }
750 else {
751 c_str[0] = BINPUT;
752 c_str[1] = p;
753 len = 2;
754 }
755 }
756
757 if ((*self->write_func)(self, c_str, len) < 0)
758 goto finally;
759
760 res = 0;
761
762 finally:
763 Py_XDECREF(py_ob_id);
764 Py_XDECREF(memo_len);
765 Py_XDECREF(t);
766
767 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000768}
769
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000770#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000771
772static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000773PyImport_Import(PyObject *module_name)
774{
775 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
776 static PyObject *standard_builtins=0;
777 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000779 if (!( silly_list )) {
780 if (!( __import___str=PyString_FromString("__import__")))
781 return NULL;
782 if (!( __builtins___str=PyString_FromString("__builtins__")))
783 return NULL;
784 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
785 return NULL;
786 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000788 if ((globals=PyEval_GetGlobals())) {
789 Py_INCREF(globals);
790 __builtins__=PyObject_GetItem(globals,__builtins___str);
791 if (!__builtins__)
792 goto err;
793 }
794 else {
795 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000797 if (!(standard_builtins ||
798 (standard_builtins=PyImport_ImportModule("__builtin__"))))
799 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000801 __builtins__=standard_builtins;
802 Py_INCREF(__builtins__);
803 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
804 if (!globals)
805 goto err;
806 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000808 if (PyDict_Check(__builtins__)) {
809 __import__=PyObject_GetItem(__builtins__,__import___str);
810 if (!__import__) goto err;
811 }
812 else {
813 __import__=PyObject_GetAttr(__builtins__,__import___str);
814 if (!__import__) goto err;
815 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000817 r=PyObject_CallFunction(__import__,"OOOO",
818 module_name, globals, globals, silly_list);
819 if (!r)
820 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000822 Py_DECREF(globals);
823 Py_DECREF(__builtins__);
824 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000825
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000826 return r;
827 err:
828 Py_XDECREF(globals);
829 Py_XDECREF(__builtins__);
830 Py_XDECREF(__import__);
831 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000832}
833
834static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000835whichmodule(PyObject *global, PyObject *global_name)
836{
837 int i, j;
838 PyObject *module = 0, *modules_dict = 0,
839 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000841 module = PyObject_GetAttrString(global, "__module__");
842 if (module) return module;
843 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000845 if (!( modules_dict = PySys_GetObject("modules")))
846 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000848 i = 0;
849 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000851 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000853 global_name_attr = PyObject_GetAttr(module, global_name);
854 if (!global_name_attr) {
855 PyErr_Clear();
856 continue;
857 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000859 if (global_name_attr != global) {
860 Py_DECREF(global_name_attr);
861 continue;
862 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000864 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000866 break;
867 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000869 /* The following implements the rule in pickle.py added in 1.5
870 that used __main__ if no module is found. I don't actually
871 like this rule. jlf
872 */
873 if (!j) {
874 j=1;
875 name=__main___str;
876 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000878 Py_INCREF(name);
879 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000880}
881
882
Guido van Rossum60456fd1997-04-09 17:36:32 +0000883static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000884fast_save_enter(Picklerobject *self, PyObject *obj)
885{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000886 /* if fast_container < 0, we're doing an error exit. */
887 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
888 PyObject *key = NULL;
889 if (self->fast_memo == NULL) {
890 self->fast_memo = PyDict_New();
891 if (self->fast_memo == NULL) {
892 self->fast_container = -1;
893 return 0;
894 }
895 }
896 key = PyLong_FromVoidPtr(obj);
897 if (key == NULL)
898 return 0;
899 if (PyDict_GetItem(self->fast_memo, key)) {
900 PyErr_Format(PyExc_ValueError,
901 "fast mode: can't pickle cyclic objects including object type %s at %p",
902 obj->ob_type->tp_name, obj);
903 self->fast_container = -1;
904 return 0;
905 }
906 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
907 self->fast_container = -1;
908 return 0;
909 }
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000910 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000911 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000912}
913
914int
915fast_save_leave(Picklerobject *self, PyObject *obj)
916{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000917 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
918 PyObject *key = PyLong_FromVoidPtr(obj);
919 if (key == NULL)
920 return 0;
921 if (PyDict_DelItem(self->fast_memo, key) < 0) {
922 return 0;
923 }
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000924 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000925 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000926}
927
928static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000929save_none(Picklerobject *self, PyObject *args)
930{
931 static char none = NONE;
932 if ((*self->write_func)(self, &none, 1) < 0)
933 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000935 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000936}
937
Guido van Rossum77f6a652002-04-03 22:41:51 +0000938static int
939save_bool(Picklerobject *self, PyObject *args)
940{
Guido van Rossume2763392002-04-05 19:30:08 +0000941 static char *buf[2] = {FALSE, TRUE};
942 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000943 long l = PyInt_AS_LONG((PyIntObject *)args);
944
Guido van Rossume2763392002-04-05 19:30:08 +0000945 if ((*self->write_func)(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000946 return -1;
947
948 return 0;
949}
Tim Peters84e87f32001-03-17 04:50:51 +0000950
Guido van Rossum60456fd1997-04-09 17:36:32 +0000951static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000952save_int(Picklerobject *self, PyObject *args)
953{
954 char c_str[32];
955 long l = PyInt_AS_LONG((PyIntObject *)args);
956 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000958 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000959#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000960 || l > 0x7fffffffL
961 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000962#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000963 ) {
964 /* Text-mode pickle, or long too big to fit in the 4-byte
965 * signed BININT format: store as a string.
966 */
967 c_str[0] = INT;
968 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
969 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
970 return -1;
971 }
972 else {
973 /* Binary pickle and l fits in a signed 4-byte int. */
974 c_str[1] = (int)( l & 0xff);
975 c_str[2] = (int)((l >> 8) & 0xff);
976 c_str[3] = (int)((l >> 16) & 0xff);
977 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000978
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000979 if ((c_str[4] == 0) && (c_str[3] == 0)) {
980 if (c_str[2] == 0) {
981 c_str[0] = BININT1;
982 len = 2;
983 }
984 else {
985 c_str[0] = BININT2;
986 len = 3;
987 }
988 }
989 else {
990 c_str[0] = BININT;
991 len = 5;
992 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000994 if ((*self->write_func)(self, c_str, len) < 0)
995 return -1;
996 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000998 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000999}
1000
1001
1002static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001003save_long(Picklerobject *self, PyObject *args)
1004{
1005 int size, res = -1;
1006 PyObject *repr = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001008 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001009
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001010 if (!( repr = PyObject_Repr(args)))
1011 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001012
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001013 if ((size = PyString_Size(repr)) < 0)
1014 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001016 if ((*self->write_func)(self, &l, 1) < 0)
1017 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001019 if ((*self->write_func)(self,
1020 PyString_AS_STRING((PyStringObject *)repr),
1021 size) < 0)
1022 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001024 if ((*self->write_func)(self, "\n", 1) < 0)
1025 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001027 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001029 finally:
1030 Py_XDECREF(repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001031
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001032 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001033}
1034
1035
1036static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001037save_float(Picklerobject *self, PyObject *args)
1038{
1039 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001040
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001041 if (self->bin) {
1042 int s, e;
1043 double f;
1044 long fhi, flo;
1045 char str[9];
1046 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001048 *p = BINFLOAT;
1049 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001050
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001051 if (x < 0) {
1052 s = 1;
1053 x = -x;
1054 }
1055 else
1056 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001058 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001060 /* Normalize f to be in the range [1.0, 2.0) */
1061 if (0.5 <= f && f < 1.0) {
1062 f *= 2.0;
1063 e--;
1064 }
1065 else if (f == 0.0) {
1066 e = 0;
1067 }
1068 else {
1069 PyErr_SetString(PyExc_SystemError,
1070 "frexp() result out of range");
1071 return -1;
1072 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001074 if (e >= 1024) {
1075 /* XXX 1024 itself is reserved for Inf/NaN */
1076 PyErr_SetString(PyExc_OverflowError,
1077 "float too large to pack with d format");
1078 return -1;
1079 }
1080 else if (e < -1022) {
1081 /* Gradual underflow */
1082 f = ldexp(f, 1022 + e);
1083 e = 0;
1084 }
1085 else if (!(e == 0 && f == 0.0)) {
1086 e += 1023;
1087 f -= 1.0; /* Get rid of leading 1 */
1088 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001089
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001090 /* fhi receives the high 28 bits;
1091 flo the low 24 bits (== 52 bits) */
1092 f *= 268435456.0; /* 2**28 */
1093 fhi = (long) floor(f); /* Truncate */
1094 f -= (double)fhi;
1095 f *= 16777216.0; /* 2**24 */
1096 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001098 /* First byte */
1099 *p = (s<<7) | (e>>4);
1100 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001101
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001102 /* Second byte */
1103 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1104 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001106 /* Third byte */
1107 *p = (unsigned char) ((fhi>>16) & 0xFF);
1108 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001110 /* Fourth byte */
1111 *p = (unsigned char) ((fhi>>8) & 0xFF);
1112 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001114 /* Fifth byte */
1115 *p = (unsigned char) (fhi & 0xFF);
1116 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001117
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001118 /* Sixth byte */
1119 *p = (unsigned char) ((flo>>16) & 0xFF);
1120 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001122 /* Seventh byte */
1123 *p = (unsigned char) ((flo>>8) & 0xFF);
1124 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001126 /* Eighth byte */
1127 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001129 if ((*self->write_func)(self, str, 9) < 0)
1130 return -1;
1131 }
1132 else {
1133 char c_str[250];
1134 c_str[0] = FLOAT;
1135 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001137 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1138 return -1;
1139 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001140
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001141 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001142}
1143
1144
1145static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001146save_string(Picklerobject *self, PyObject *args, int doput)
1147{
1148 int size, len;
1149 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001150
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001151 if ((size = PyString_Size(args)) < 0)
1152 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001154 if (!self->bin) {
1155 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001157 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001159 if (!( repr = PyObject_Repr(args)))
1160 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001162 if ((len = PyString_Size(repr)) < 0)
1163 goto err;
1164 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001166 if ((*self->write_func)(self, &string, 1) < 0)
1167 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001169 if ((*self->write_func)(self, repr_str, len) < 0)
1170 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001172 if ((*self->write_func)(self, "\n", 1) < 0)
1173 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001175 Py_XDECREF(repr);
1176 }
1177 else {
1178 int i;
1179 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001181 if ((size = PyString_Size(args)) < 0)
1182 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001184 if (size < 256) {
1185 c_str[0] = SHORT_BINSTRING;
1186 c_str[1] = size;
1187 len = 2;
1188 }
1189 else {
1190 c_str[0] = BINSTRING;
1191 for (i = 1; i < 5; i++)
1192 c_str[i] = (int)(size >> ((i - 1) * 8));
1193 len = 5;
1194 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001196 if ((*self->write_func)(self, c_str, len) < 0)
1197 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001199 if (size > 128 && Pdata_Check(self->file)) {
1200 if (write_other(self, NULL, 0) < 0) return -1;
1201 PDATA_APPEND(self->file, args, -1);
1202 }
1203 else {
1204 if ((*self->write_func)(self,
1205 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1206 return -1;
1207 }
1208 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001210 if (doput)
1211 if (put(self, args) < 0)
1212 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001214 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001216 err:
1217 Py_XDECREF(repr);
1218 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001219}
1220
1221
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001222#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001223/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1224 backslash and newline characters to \uXXXX escapes. */
1225static PyObject *
1226modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1227{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001228 PyObject *repr;
1229 char *p;
1230 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001232 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001234 repr = PyString_FromStringAndSize(NULL, 6 * size);
1235 if (repr == NULL)
1236 return NULL;
1237 if (size == 0)
1238 return repr;
1239
1240 p = q = PyString_AS_STRING(repr);
1241 while (size-- > 0) {
1242 Py_UNICODE ch = *s++;
1243 /* Map 16-bit characters to '\uxxxx' */
1244 if (ch >= 256 || ch == '\\' || ch == '\n') {
1245 *p++ = '\\';
1246 *p++ = 'u';
1247 *p++ = hexdigit[(ch >> 12) & 0xf];
1248 *p++ = hexdigit[(ch >> 8) & 0xf];
1249 *p++ = hexdigit[(ch >> 4) & 0xf];
1250 *p++ = hexdigit[ch & 15];
1251 }
1252 /* Copy everything else as-is */
1253 else
1254 *p++ = (char) ch;
1255 }
1256 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001257 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001258 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001259}
1260
1261
Guido van Rossum60456fd1997-04-09 17:36:32 +00001262static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001263save_unicode(Picklerobject *self, PyObject *args, int doput)
1264{
1265 int size, len;
1266 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001268 if (!PyUnicode_Check(args))
1269 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001270
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001271 if (!self->bin) {
1272 char *repr_str;
1273 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001275 repr = modified_EncodeRawUnicodeEscape(
1276 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
1277 if (!repr)
1278 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001280 if ((len = PyString_Size(repr)) < 0)
1281 goto err;
1282 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001284 if ((*self->write_func)(self, &string, 1) < 0)
1285 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001287 if ((*self->write_func)(self, repr_str, len) < 0)
1288 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001290 if ((*self->write_func)(self, "\n", 1) < 0)
1291 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001293 Py_XDECREF(repr);
1294 }
1295 else {
1296 int i;
1297 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001299 if (!( repr = PyUnicode_AsUTF8String(args)))
1300 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302 if ((size = PyString_Size(repr)) < 0)
1303 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001305 c_str[0] = BINUNICODE;
1306 for (i = 1; i < 5; i++)
1307 c_str[i] = (int)(size >> ((i - 1) * 8));
1308 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001309
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001310 if ((*self->write_func)(self, c_str, len) < 0)
1311 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001313 if (size > 128 && Pdata_Check(self->file)) {
1314 if (write_other(self, NULL, 0) < 0)
1315 goto err;
1316 PDATA_APPEND(self->file, repr, -1);
1317 }
1318 else {
1319 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1320 size) < 0)
1321 goto err;
1322 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001324 Py_DECREF(repr);
1325 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001327 if (doput)
1328 if (put(self, args) < 0)
1329 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001331 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001333 err:
1334 Py_XDECREF(repr);
1335 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001336}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001337#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001338
1339
1340static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001341save_tuple(Picklerobject *self, PyObject *args)
1342{
1343 PyObject *element = 0, *py_tuple_id = 0;
1344 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001346 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001347
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001348 if ((*self->write_func)(self, &MARKv, 1) < 0)
1349 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001351 if ((len = PyTuple_Size(args)) < 0)
1352 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001353
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001354 for (i = 0; i < len; i++) {
1355 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
1356 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001358 if (save(self, element, 0) < 0)
1359 goto finally;
1360 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001362 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
1363 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001364
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001365 if (len) {
1366 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1367 if (self->bin) {
1368 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001370 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1371 goto finally;
1372 }
1373 else {
1374 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001376 for (i = 0; i <= len; i++) {
1377 if ((*self->write_func)(self, &pop, 1) < 0)
1378 goto finally;
1379 }
1380 }
Tim Peters84e87f32001-03-17 04:50:51 +00001381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001382 if (get(self, py_tuple_id) < 0)
1383 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001385 res = 0;
1386 goto finally;
1387 }
1388 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001389
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001390 if ((*self->write_func)(self, &tuple, 1) < 0) {
1391 goto finally;
1392 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001394 if (put(self, args) < 0)
1395 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001397 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001399 finally:
1400 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001402 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001403}
1404
1405static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001406save_empty_tuple(Picklerobject *self, PyObject *args)
1407{
1408 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001410 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001411}
1412
1413
1414static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001415save_list(Picklerobject *self, PyObject *args)
1416{
1417 PyObject *element = 0;
1418 int s_len, len, i, using_appends, res = -1;
1419 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001421 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001423 if (self->fast && !fast_save_enter(self, args))
1424 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001425
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001426 if (self->bin) {
1427 s[0] = EMPTY_LIST;
1428 s_len = 1;
1429 }
1430 else {
1431 s[0] = MARK;
1432 s[1] = LIST;
1433 s_len = 2;
1434 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001436 if ((len = PyList_Size(args)) < 0)
1437 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001439 if ((*self->write_func)(self, s, s_len) < 0)
1440 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001442 if (len == 0) {
1443 if (put(self, args) < 0)
1444 goto finally;
1445 }
1446 else {
1447 if (put2(self, args) < 0)
1448 goto finally;
1449 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001451 if ((using_appends = (self->bin && (len > 1))))
1452 if ((*self->write_func)(self, &MARKv, 1) < 0)
1453 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001454
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001455 for (i = 0; i < len; i++) {
1456 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
1457 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001458
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001459 if (save(self, element, 0) < 0)
1460 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001462 if (!using_appends) {
1463 if ((*self->write_func)(self, &append, 1) < 0)
1464 goto finally;
1465 }
1466 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001468 if (using_appends) {
1469 if ((*self->write_func)(self, &appends, 1) < 0)
1470 goto finally;
1471 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001473 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001475 finally:
1476 if (self->fast && !fast_save_leave(self, args))
1477 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001479 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001480}
1481
1482
Guido van Rossum60456fd1997-04-09 17:36:32 +00001483static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001484save_dict(Picklerobject *self, PyObject *args)
1485{
1486 PyObject *key = 0, *value = 0;
1487 int i, len, res = -1, using_setitems;
1488 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001490 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001492 if (self->fast && !fast_save_enter(self, args))
1493 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001495 if (self->bin) {
1496 s[0] = EMPTY_DICT;
1497 len = 1;
1498 }
1499 else {
1500 s[0] = MARK;
1501 s[1] = DICT;
1502 len = 2;
1503 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001505 if ((*self->write_func)(self, s, len) < 0)
1506 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001508 if ((len = PyDict_Size(args)) < 0)
1509 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001511 if (len == 0) {
1512 if (put(self, args) < 0)
1513 goto finally;
1514 }
1515 else {
1516 if (put2(self, args) < 0)
1517 goto finally;
1518 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001519
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001520 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1521 if ((*self->write_func)(self, &MARKv, 1) < 0)
1522 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001524 i = 0;
1525 while (PyDict_Next(args, &i, &key, &value)) {
1526 if (save(self, key, 0) < 0)
1527 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001529 if (save(self, value, 0) < 0)
1530 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001532 if (!using_setitems) {
1533 if ((*self->write_func)(self, &setitem, 1) < 0)
1534 goto finally;
1535 }
1536 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001538 if (using_setitems) {
1539 if ((*self->write_func)(self, &setitems, 1) < 0)
1540 goto finally;
1541 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001543 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001545 finally:
1546 if (self->fast && !fast_save_leave(self, args))
1547 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001549 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001550}
1551
1552
Tim Peters84e87f32001-03-17 04:50:51 +00001553static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001554save_inst(Picklerobject *self, PyObject *args)
1555{
1556 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1557 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1558 char *module_str, *name_str;
1559 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001561 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001563 if (self->fast && !fast_save_enter(self, args))
1564 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001566 if ((*self->write_func)(self, &MARKv, 1) < 0)
1567 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001569 if (!( class = PyObject_GetAttr(args, __class___str)))
1570 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001571
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001572 if (self->bin) {
1573 if (save(self, class, 0) < 0)
1574 goto finally;
1575 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001577 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1578 PyObject *element = 0;
1579 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001581 if (!( class_args =
1582 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
1583 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001585 if ((len = PyObject_Size(class_args)) < 0)
1586 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001588 for (i = 0; i < len; i++) {
1589 if (!( element = PySequence_GetItem(class_args, i)))
1590 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001592 if (save(self, element, 0) < 0) {
1593 Py_DECREF(element);
1594 goto finally;
1595 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001597 Py_DECREF(element);
1598 }
1599 }
1600 else {
1601 PyErr_Clear();
1602 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001603
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001604 if (!self->bin) {
1605 if (!( name = ((PyClassObject *)class)->cl_name )) {
1606 PyErr_SetString(PicklingError, "class has no name");
1607 goto finally;
1608 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001610 if (!( module = whichmodule(class, name)))
1611 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001612
Tim Peters84e87f32001-03-17 04:50:51 +00001613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001614 if ((module_size = PyString_Size(module)) < 0 ||
1615 (name_size = PyString_Size(name)) < 0)
1616 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001618 module_str = PyString_AS_STRING((PyStringObject *)module);
1619 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001621 if ((*self->write_func)(self, &inst, 1) < 0)
1622 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001624 if ((*self->write_func)(self, module_str, module_size) < 0)
1625 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001627 if ((*self->write_func)(self, "\n", 1) < 0)
1628 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001630 if ((*self->write_func)(self, name_str, name_size) < 0)
1631 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001633 if ((*self->write_func)(self, "\n", 1) < 0)
1634 goto finally;
1635 }
1636 else if ((*self->write_func)(self, &obj, 1) < 0) {
1637 goto finally;
1638 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001640 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1641 state = PyObject_Call(getstate_func, empty_tuple, NULL);
1642 if (!state)
1643 goto finally;
1644 }
1645 else {
1646 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001648 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1649 PyErr_Clear();
1650 res = 0;
1651 goto finally;
1652 }
1653 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001655 if (!PyDict_Check(state)) {
1656 if (put2(self, args) < 0)
1657 goto finally;
1658 }
1659 else {
1660 if (put(self, args) < 0)
1661 goto finally;
1662 }
Tim Peters84e87f32001-03-17 04:50:51 +00001663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001664 if (save(self, state, 0) < 0)
1665 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001667 if ((*self->write_func)(self, &build, 1) < 0)
1668 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001670 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001672 finally:
1673 if (self->fast && !fast_save_leave(self, args))
1674 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001676 Py_XDECREF(module);
1677 Py_XDECREF(class);
1678 Py_XDECREF(state);
1679 Py_XDECREF(getinitargs_func);
1680 Py_XDECREF(getstate_func);
1681 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001683 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001684}
1685
1686
Guido van Rossum60456fd1997-04-09 17:36:32 +00001687static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001688save_global(Picklerobject *self, PyObject *args, PyObject *name)
1689{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001690 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001691 char *name_str, *module_str;
1692 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001694 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001696 if (name) {
1697 global_name = name;
1698 Py_INCREF(global_name);
1699 }
1700 else {
1701 if (!( global_name = PyObject_GetAttr(args, __name___str)))
1702 goto finally;
1703 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001705 if (!( module = whichmodule(args, global_name)))
1706 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001708 if ((module_size = PyString_Size(module)) < 0 ||
1709 (name_size = PyString_Size(global_name)) < 0)
1710 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001712 module_str = PyString_AS_STRING((PyStringObject *)module);
1713 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001715 mod = PyImport_ImportModule(module_str);
1716 if (mod == NULL) {
1717 /* Py_ErrClear(); ?? */
1718 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);
2087 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002089 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2090 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2091 "returned by %s must be a tuple", "O", __reduce__);
2092 goto finally;
2093 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002095 res = save_reduce(self, callable, arg_tup, state, args);
2096 goto finally;
2097 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002099 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002101 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002102 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002103 Py_XDECREF(py_ob_id);
2104 Py_XDECREF(__reduce__);
2105 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002107 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002108}
2109
2110
2111static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002112dump(Picklerobject *self, PyObject *args)
2113{
2114 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002116 if (save(self, args, 0) < 0)
2117 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002119 if ((*self->write_func)(self, &stop, 1) < 0)
2120 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002122 if ((*self->write_func)(self, NULL, 0) < 0)
2123 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002125 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002126}
2127
2128static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002129Pickle_clear_memo(Picklerobject *self, PyObject *args)
2130{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002131 if (self->memo)
2132 PyDict_Clear(self->memo);
2133 Py_INCREF(Py_None);
2134 return Py_None;
2135}
2136
2137static PyObject *
2138Pickle_getvalue(Picklerobject *self, PyObject *args)
2139{
2140 int l, i, rsize, ssize, clear=1, lm;
2141 long ik;
2142 PyObject *k, *r;
2143 char *s, *p, *have_get;
2144 Pdata *data;
2145
2146 /* Can be called by Python code or C code */
2147 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2148 return NULL;
2149
2150 /* Check to make sure we are based on a list */
2151 if (! Pdata_Check(self->file)) {
2152 PyErr_SetString(PicklingError,
2153 "Attempt to getvalue() a non-list-based pickler");
2154 return NULL;
2155 }
2156
2157 /* flush write buffer */
2158 if (write_other(self, NULL, 0) < 0) return NULL;
2159
2160 data=(Pdata*)self->file;
2161 l=data->length;
2162
2163 /* set up an array to hold get/put status */
2164 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2165 lm++;
2166 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2167 memset(have_get,0,lm);
2168
2169 /* Scan for gets. */
2170 for (rsize=0, i=l; --i >= 0; ) {
2171 k=data->data[i];
2172
2173 if (PyString_Check(k)) {
2174 rsize += PyString_GET_SIZE(k);
2175 }
2176
2177 else if (PyInt_Check(k)) { /* put */
2178 ik=PyInt_AS_LONG((PyIntObject*)k);
2179 if (ik >= lm || ik==0) {
2180 PyErr_SetString(PicklingError,
2181 "Invalid get data");
2182 return NULL;
2183 }
2184 if (have_get[ik]) { /* with matching get */
2185 if (ik < 256) rsize += 2;
2186 else rsize+=5;
2187 }
2188 }
2189
2190 else if (! (PyTuple_Check(k) &&
2191 PyTuple_GET_SIZE(k) == 2 &&
2192 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2193 ) {
2194 PyErr_SetString(PicklingError,
2195 "Unexpected data in internal list");
2196 return NULL;
2197 }
2198
2199 else { /* put */
2200 ik=PyInt_AS_LONG((PyIntObject*)k);
2201 if (ik >= lm || ik==0) {
2202 PyErr_SetString(PicklingError,
2203 "Invalid get data");
2204 return NULL;
2205 }
2206 have_get[ik]=1;
2207 if (ik < 256) rsize += 2;
2208 else rsize+=5;
2209 }
2210
2211 }
2212
2213 /* Now generate the result */
2214 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2215 s=PyString_AS_STRING((PyStringObject*)r);
2216
2217 for (i=0; i<l; i++) {
2218 k=data->data[i];
2219
2220 if (PyString_Check(k)) {
2221 ssize=PyString_GET_SIZE(k);
2222 if (ssize) {
2223 p=PyString_AS_STRING((PyStringObject*)k);
2224 while (--ssize >= 0) *s++=*p++;
2225 }
2226 }
2227
2228 else if (PyTuple_Check(k)) { /* get */
2229 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2230 if (ik < 256) {
2231 *s++ = BINGET;
2232 *s++ = (int)(ik & 0xff);
2233 }
2234 else {
2235 *s++ = LONG_BINGET;
2236 *s++ = (int)(ik & 0xff);
2237 *s++ = (int)((ik >> 8) & 0xff);
2238 *s++ = (int)((ik >> 16) & 0xff);
2239 *s++ = (int)((ik >> 24) & 0xff);
2240 }
2241 }
2242
2243 else { /* put */
2244 ik=PyInt_AS_LONG((PyIntObject*)k);
2245
2246 if (have_get[ik]) { /* with matching get */
2247 if (ik < 256) {
2248 *s++ = BINPUT;
2249 *s++ = (int)(ik & 0xff);
2250 }
2251 else {
2252 *s++ = LONG_BINPUT;
2253 *s++ = (int)(ik & 0xff);
2254 *s++ = (int)((ik >> 8) & 0xff);
2255 *s++ = (int)((ik >> 16) & 0xff);
2256 *s++ = (int)((ik >> 24) & 0xff);
2257 }
2258 }
2259 }
2260
2261 }
2262
2263 if (clear) {
2264 PyDict_Clear(self->memo);
2265 Pdata_clear(data,0);
2266 }
2267
2268 free(have_get);
2269 return r;
2270 err:
2271 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002272 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002273}
2274
2275static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002276Pickler_dump(Picklerobject *self, PyObject *args)
2277{
2278 PyObject *ob;
2279 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002281 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
2282 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002284 if (dump(self, ob) < 0)
2285 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002287 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002289 /* XXX Why does dump() return self? */
2290 Py_INCREF(self);
2291 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002292}
2293
2294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002295static struct PyMethodDef Pickler_methods[] =
2296{
Neal Norwitzb0493252002-03-31 14:44:22 +00002297 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002298 PyDoc_STR("dump(object) -- "
2299 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002300 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002301 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002302 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002303 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002304 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002305};
2306
2307
2308static Picklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002309newPicklerobject(PyObject *file, int bin)
2310{
2311 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002313 if (!( self = PyObject_New(Picklerobject, &Picklertype)))
2314 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002316 self->fp = NULL;
2317 self->write = NULL;
2318 self->memo = NULL;
2319 self->arg = NULL;
2320 self->pers_func = NULL;
2321 self->inst_pers_func = NULL;
2322 self->write_buf = NULL;
2323 self->bin = bin;
2324 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002325 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002326 self->fast_container = 0;
2327 self->fast_memo = NULL;
2328 self->buf_size = 0;
2329 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002331 if (file)
2332 Py_INCREF(file);
2333 else
2334 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002336 if (!( self->file = file ))
2337 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002339 if (!( self->memo = PyDict_New()))
2340 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002342 if (PyFile_Check(file)) {
2343 self->fp = PyFile_AsFile(file);
2344 if (self->fp == NULL) {
2345 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2346 goto err;
2347 }
2348 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002349 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002350 else if (PycStringIO_OutputCheck(file)) {
2351 self->write_func = write_cStringIO;
2352 }
2353 else if (file == Py_None) {
2354 self->write_func = write_none;
2355 }
2356 else {
2357 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002359 if (! Pdata_Check(file)) {
2360 self->write = PyObject_GetAttr(file, write_str);
2361 if (!self->write) {
2362 PyErr_Clear();
2363 PyErr_SetString(PyExc_TypeError,
2364 "argument must have 'write' "
2365 "attribute");
2366 goto err;
2367 }
2368 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002370 if (!( self->write_buf =
2371 (char *)malloc(WRITE_BUF_SIZE * sizeof(char)))) {
2372 PyErr_NoMemory();
2373 goto err;
2374 }
2375 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002377 if (PyEval_GetRestricted()) {
2378 /* Restricted execution, get private tables */
2379 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002381 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2382 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2383 Py_DECREF(m);
2384 if (!( self->dispatch_table )) goto err;
2385 }
2386 else {
2387 self->dispatch_table=dispatch_table;
2388 Py_INCREF(dispatch_table);
2389 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002391 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002393 err:
2394 Py_DECREF((PyObject *)self);
2395 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002396}
2397
2398
2399static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002400get_Pickler(PyObject *self, PyObject *args)
2401{
2402 PyObject *file = NULL;
2403 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002405 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
2406 PyErr_Clear();
2407 bin = 0;
2408 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2409 return NULL;
2410 }
2411 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002412}
2413
2414
2415static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002416Pickler_dealloc(Picklerobject *self)
2417{
2418 Py_XDECREF(self->write);
2419 Py_XDECREF(self->memo);
2420 Py_XDECREF(self->fast_memo);
2421 Py_XDECREF(self->arg);
2422 Py_XDECREF(self->file);
2423 Py_XDECREF(self->pers_func);
2424 Py_XDECREF(self->inst_pers_func);
2425 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002427 if (self->write_buf) {
2428 free(self->write_buf);
2429 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002431 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002432}
2433
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002434static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002435Pickler_get_pers_func(Picklerobject *p)
2436{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002437 if (p->pers_func == NULL)
2438 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2439 else
2440 Py_INCREF(p->pers_func);
2441 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002442}
2443
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002444static int
2445Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2446{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002447 if (v == NULL) {
2448 PyErr_SetString(PyExc_TypeError,
2449 "attribute deletion is not supported");
2450 return -1;
2451 }
2452 Py_XDECREF(p->pers_func);
2453 Py_INCREF(v);
2454 p->pers_func = v;
2455 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002456}
2457
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002458static int
2459Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2460{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002461 if (v == NULL) {
2462 PyErr_SetString(PyExc_TypeError,
2463 "attribute deletion is not supported");
2464 return -1;
2465 }
2466 Py_XDECREF(p->inst_pers_func);
2467 Py_INCREF(v);
2468 p->inst_pers_func = v;
2469 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002470}
2471
2472static PyObject *
2473Pickler_get_memo(Picklerobject *p)
2474{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002475 if (p->memo == NULL)
2476 PyErr_SetString(PyExc_AttributeError, "memo");
2477 else
2478 Py_INCREF(p->memo);
2479 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002480}
2481
2482static int
2483Pickler_set_memo(Picklerobject *p, PyObject *v)
2484{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002485 if (v == NULL) {
2486 PyErr_SetString(PyExc_TypeError,
2487 "attribute deletion is not supported");
2488 return -1;
2489 }
2490 if (!PyDict_Check(v)) {
2491 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2492 return -1;
2493 }
2494 Py_XDECREF(p->memo);
2495 Py_INCREF(v);
2496 p->memo = v;
2497 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002498}
2499
2500static PyObject *
2501Pickler_get_error(Picklerobject *p)
2502{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002503 /* why is this an attribute on the Pickler? */
2504 Py_INCREF(PicklingError);
2505 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002506}
2507
2508static PyMemberDef Pickler_members[] = {
2509 {"binary", T_INT, offsetof(Picklerobject, bin)},
2510 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002511 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002512};
2513
2514static PyGetSetDef Pickler_getsets[] = {
2515 {"persistent_id", (getter)Pickler_get_pers_func,
2516 (setter)Pickler_set_pers_func},
2517 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2518 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002519 {"PicklingError", (getter)Pickler_get_error, NULL},
2520 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002521};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002522
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002523PyDoc_STRVAR(Picklertype__doc__,
2524"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002525
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002526static PyTypeObject Picklertype = {
2527 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002528 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002529 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002530 sizeof(Picklerobject), /*tp_basicsize*/
2531 0,
2532 (destructor)Pickler_dealloc, /* tp_dealloc */
2533 0, /* tp_print */
2534 0, /* tp_getattr */
2535 0, /* tp_setattr */
2536 0, /* tp_compare */
2537 0, /* tp_repr */
2538 0, /* tp_as_number */
2539 0, /* tp_as_sequence */
2540 0, /* tp_as_mapping */
2541 0, /* tp_hash */
2542 0, /* tp_call */
2543 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002544 0, /* set below */ /* tp_getattro */
2545 0, /* set below */ /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002546 0, /* tp_as_buffer */
2547 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2548 Picklertype__doc__, /* tp_doc */
2549 0, /* tp_traverse */
2550 0, /* tp_clear */
2551 0, /* tp_richcompare */
2552 0, /* tp_weaklistoffset */
2553 0, /* tp_iter */
2554 0, /* tp_iternext */
2555 Pickler_methods, /* tp_methods */
2556 Pickler_members, /* tp_members */
2557 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002558};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002559
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002560static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002561find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
2562{
2563 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002565 if (fc) {
2566 if (fc==Py_None) {
2567 PyErr_SetString(UnpicklingError,
2568 "Global and instance pickles are not supported.");
2569 return NULL;
2570 }
2571 return PyObject_CallFunction(fc, "OO", py_module_name,
2572 py_global_name);
2573 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002575 module = PySys_GetObject("modules");
2576 if (module == NULL)
2577 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002579 module = PyDict_GetItem(module, py_module_name);
2580 if (module == NULL) {
2581 module = PyImport_Import(py_module_name);
2582 if (!module)
2583 return NULL;
2584 global = PyObject_GetAttr(module, py_global_name);
2585 Py_DECREF(module);
2586 }
2587 else
2588 global = PyObject_GetAttr(module, py_global_name);
2589 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002590}
2591
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002592static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002593marker(Unpicklerobject *self)
2594{
2595 if (self->num_marks < 1) {
2596 PyErr_SetString(UnpicklingError, "could not find MARK");
2597 return -1;
2598 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002600 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002601}
2602
Tim Peters84e87f32001-03-17 04:50:51 +00002603
Guido van Rossum60456fd1997-04-09 17:36:32 +00002604static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002605load_none(Unpicklerobject *self)
2606{
2607 PDATA_APPEND(self->stack, Py_None, -1);
2608 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002609}
2610
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002611static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002612bad_readline(void)
2613{
2614 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2615 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002616}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002617
2618static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002619load_int(Unpicklerobject *self)
2620{
2621 PyObject *py_int = 0;
2622 char *endptr, *s;
2623 int len, res = -1;
2624 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002626 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2627 if (len < 2) return bad_readline();
2628 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002630 errno = 0;
2631 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002633 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2634 /* Hm, maybe we've got something long. Let's try reading
2635 it as a Python long object. */
2636 errno = 0;
2637 py_int = PyLong_FromString(s, NULL, 0);
2638 if (py_int == NULL) {
2639 PyErr_SetString(PyExc_ValueError,
2640 "could not convert string to int");
2641 goto finally;
2642 }
2643 }
2644 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002645 if (len == 3 && (l == 0 || l == 1)) {
2646 if (!( py_int = PyBool_FromLong(l))) goto finally;
2647 }
2648 else {
2649 if (!( py_int = PyInt_FromLong(l))) goto finally;
2650 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002651 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002653 free(s);
2654 PDATA_PUSH(self->stack, py_int, -1);
2655 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002657 finally:
2658 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002659
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002660 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002661}
2662
2663
Tim Peters84e87f32001-03-17 04:50:51 +00002664static long
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002665calc_binint(char *s, int x)
2666{
2667 unsigned char c;
2668 int i;
2669 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002671 for (i = 0, l = 0L; i < x; i++) {
2672 c = (unsigned char)s[i];
2673 l |= (long)c << (i * 8);
2674 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002675#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002676 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2677 * is signed, so on a box with longs bigger than 4 bytes we need
2678 * to extend a BININT's sign bit to the full width.
2679 */
2680 if (x == 4 && l & (1L << 31))
2681 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002682#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002683 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002684}
2685
2686
2687static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002688load_binintx(Unpicklerobject *self, char *s, int x)
2689{
2690 PyObject *py_int = 0;
2691 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002693 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002695 if (!( py_int = PyInt_FromLong(l)))
2696 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002698 PDATA_PUSH(self->stack, py_int, -1);
2699 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002700}
2701
2702
2703static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002704load_binint(Unpicklerobject *self)
2705{
2706 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002708 if ((*self->read_func)(self, &s, 4) < 0)
2709 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002711 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002712}
2713
2714
2715static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002716load_binint1(Unpicklerobject *self)
2717{
2718 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002720 if ((*self->read_func)(self, &s, 1) < 0)
2721 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002723 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002724}
2725
2726
2727static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002728load_binint2(Unpicklerobject *self)
2729{
2730 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002732 if ((*self->read_func)(self, &s, 2) < 0)
2733 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002735 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002736}
Tim Peters84e87f32001-03-17 04:50:51 +00002737
Guido van Rossum60456fd1997-04-09 17:36:32 +00002738static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002739load_long(Unpicklerobject *self)
2740{
2741 PyObject *l = 0;
2742 char *end, *s;
2743 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002745 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2746 if (len < 2) return bad_readline();
2747 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002749 if (!( l = PyLong_FromString(s, &end, 0)))
2750 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002752 free(s);
2753 PDATA_PUSH(self->stack, l, -1);
2754 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002756 finally:
2757 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002759 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002760}
2761
Tim Peters84e87f32001-03-17 04:50:51 +00002762
Guido van Rossum60456fd1997-04-09 17:36:32 +00002763static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002764load_float(Unpicklerobject *self)
2765{
2766 PyObject *py_float = 0;
2767 char *endptr, *s;
2768 int len, res = -1;
2769 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002771 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2772 if (len < 2) return bad_readline();
2773 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002775 errno = 0;
2776 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002778 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2779 PyErr_SetString(PyExc_ValueError,
2780 "could not convert string to float");
2781 goto finally;
2782 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002784 if (!( py_float = PyFloat_FromDouble(d)))
2785 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002787 free(s);
2788 PDATA_PUSH(self->stack, py_float, -1);
2789 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002791 finally:
2792 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002794 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002795}
2796
Guido van Rossum60456fd1997-04-09 17:36:32 +00002797static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002798load_binfloat(Unpicklerobject *self)
2799{
2800 PyObject *py_float = 0;
2801 int s, e;
2802 long fhi, flo;
2803 double x;
2804 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002806 if ((*self->read_func)(self, &p, 8) < 0)
2807 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002809 /* First byte */
2810 s = (*p>>7) & 1;
2811 e = (*p & 0x7F) << 4;
2812 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002814 /* Second byte */
2815 e |= (*p>>4) & 0xF;
2816 fhi = (*p & 0xF) << 24;
2817 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002819 /* Third byte */
2820 fhi |= (*p & 0xFF) << 16;
2821 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002823 /* Fourth byte */
2824 fhi |= (*p & 0xFF) << 8;
2825 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002827 /* Fifth byte */
2828 fhi |= *p & 0xFF;
2829 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002831 /* Sixth byte */
2832 flo = (*p & 0xFF) << 16;
2833 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002835 /* Seventh byte */
2836 flo |= (*p & 0xFF) << 8;
2837 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002839 /* Eighth byte */
2840 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002842 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2843 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002845 /* XXX This sadly ignores Inf/NaN */
2846 if (e == 0)
2847 e = -1022;
2848 else {
2849 x += 1.0;
2850 e -= 1023;
2851 }
2852 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002854 if (s)
2855 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002857 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002859 PDATA_PUSH(self->stack, py_float, -1);
2860 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002861}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002862
2863static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002864load_string(Unpicklerobject *self)
2865{
2866 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002867 int len, res = -1;
2868 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002870 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2871 if (len < 2) return bad_readline();
2872 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002873
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002874
2875 /* Strip outermost quotes */
2876 while (s[len-1] <= ' ')
2877 len--;
2878 if(s[0]=='"' && s[len-1]=='"'){
2879 s[len-1] = '\0';
2880 p = s + 1 ;
2881 len -= 2;
2882 } else if(s[0]=='\'' && s[len-1]=='\''){
2883 s[len-1] = '\0';
2884 p = s + 1 ;
2885 len -= 2;
2886 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002887 goto insecure;
2888 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002889
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002890 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
2891 if (str) {
2892 PDATA_PUSH(self->stack, str, -1);
2893 res = 0;
2894 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002895 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002896 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002898 insecure:
2899 free(s);
2900 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2901 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002902}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002903
2904
2905static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002906load_binstring(Unpicklerobject *self)
2907{
2908 PyObject *py_string = 0;
2909 long l;
2910 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002911
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002912 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002914 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002916 if ((*self->read_func)(self, &s, l) < 0)
2917 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002919 if (!( py_string = PyString_FromStringAndSize(s, l)))
2920 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002922 PDATA_PUSH(self->stack, py_string, -1);
2923 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002924}
2925
2926
2927static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002928load_short_binstring(Unpicklerobject *self)
2929{
2930 PyObject *py_string = 0;
2931 unsigned char l;
2932 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002934 if ((*self->read_func)(self, &s, 1) < 0)
2935 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002937 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002939 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002941 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943 PDATA_PUSH(self->stack, py_string, -1);
2944 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002945}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002946
2947
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002948#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002949static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002950load_unicode(Unpicklerobject *self)
2951{
2952 PyObject *str = 0;
2953 int len, res = -1;
2954 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002956 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2957 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002959 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
2960 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002962 PDATA_PUSH(self->stack, str, -1);
2963 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002964
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002965 finally:
2966 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002967}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002968#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002969
2970
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002971#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002972static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002973load_binunicode(Unpicklerobject *self)
2974{
2975 PyObject *unicode;
2976 long l;
2977 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002978
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002979 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002981 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002983 if ((*self->read_func)(self, &s, l) < 0)
2984 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002986 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
2987 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002988
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002989 PDATA_PUSH(self->stack, unicode, -1);
2990 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002991}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002992#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002993
2994
2995static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002996load_tuple(Unpicklerobject *self)
2997{
2998 PyObject *tup;
2999 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003001 if ((i = marker(self)) < 0) return -1;
3002 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3003 PDATA_PUSH(self->stack, tup, -1);
3004 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003005}
3006
3007static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003008load_empty_tuple(Unpicklerobject *self)
3009{
3010 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003012 if (!( tup=PyTuple_New(0))) return -1;
3013 PDATA_PUSH(self->stack, tup, -1);
3014 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003015}
3016
3017static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003018load_empty_list(Unpicklerobject *self)
3019{
3020 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003021
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003022 if (!( list=PyList_New(0))) return -1;
3023 PDATA_PUSH(self->stack, list, -1);
3024 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003025}
3026
3027static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003028load_empty_dict(Unpicklerobject *self)
3029{
3030 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003031
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003032 if (!( dict=PyDict_New())) return -1;
3033 PDATA_PUSH(self->stack, dict, -1);
3034 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003035}
3036
3037
3038static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003039load_list(Unpicklerobject *self)
3040{
3041 PyObject *list = 0;
3042 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003044 if ((i = marker(self)) < 0) return -1;
3045 if (!( list=Pdata_popList(self->stack, i))) return -1;
3046 PDATA_PUSH(self->stack, list, -1);
3047 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003048}
3049
3050static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003051load_dict(Unpicklerobject *self)
3052{
3053 PyObject *dict, *key, *value;
3054 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003056 if ((i = marker(self)) < 0) return -1;
3057 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003059 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003061 for (k = i+1; k < j; k += 2) {
3062 key =self->stack->data[k-1];
3063 value=self->stack->data[k ];
3064 if (PyDict_SetItem(dict, key, value) < 0) {
3065 Py_DECREF(dict);
3066 return -1;
3067 }
3068 }
3069 Pdata_clear(self->stack, i);
3070 PDATA_PUSH(self->stack, dict, -1);
3071 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003072}
3073
3074static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003075Instance_New(PyObject *cls, PyObject *args)
3076{
3077 int has_key;
3078 PyObject *safe=0, *r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003080 if (PyClass_Check(cls)) {
3081 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003083 if ((l=PyObject_Size(args)) < 0) goto err;
3084 if (!( l )) {
3085 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003087 __getinitargs__ = PyObject_GetAttr(cls,
3088 __getinitargs___str);
3089 if (!__getinitargs__) {
3090 /* We have a class with no __getinitargs__,
3091 so bypass usual construction */
3092 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003094 PyErr_Clear();
3095 if (!( inst=PyInstance_NewRaw(cls, NULL)))
3096 goto err;
3097 return inst;
3098 }
3099 Py_DECREF(__getinitargs__);
3100 }
Tim Peters84e87f32001-03-17 04:50:51 +00003101
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003102 if ((r=PyInstance_New(cls, args, NULL))) return r;
3103 else goto err;
3104 }
Tim Peters84e87f32001-03-17 04:50:51 +00003105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003106 /* Is safe_constructors always a dict? */
3107 has_key = cPickle_PyMapping_HasKey(safe_constructors, cls);
3108 if (!has_key) {
3109 safe = PyObject_GetAttr(cls, __safe_for_unpickling___str);
3110 if (!safe ||
3111 !PyObject_IsTrue(safe)) {
3112 cPickle_ErrFormat(UnpicklingError,
3113 "%s is not safe for unpickling",
3114 "O", cls);
3115 Py_XDECREF(safe);
3116 return NULL;
3117 }
3118 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003120 if (args==Py_None) {
3121 /* Special case, call cls.__basicnew__() */
3122 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003124 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3125 if (!basicnew) return NULL;
3126 r=PyObject_CallObject(basicnew, NULL);
3127 Py_DECREF(basicnew);
3128 if (r) return r;
3129 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003131 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003133 err:
3134 {
3135 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003137 PyErr_Fetch(&tp, &v, &tb);
3138 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3139 Py_XDECREF(v);
3140 v=r;
3141 }
3142 PyErr_Restore(tp,v,tb);
3143 }
3144 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003145}
Tim Peters84e87f32001-03-17 04:50:51 +00003146
Guido van Rossum60456fd1997-04-09 17:36:32 +00003147
3148static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003149load_obj(Unpicklerobject *self)
3150{
3151 PyObject *class, *tup, *obj=0;
3152 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003154 if ((i = marker(self)) < 0) return -1;
3155 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3156 PDATA_POP(self->stack, class);
3157 if (class) {
3158 obj = Instance_New(class, tup);
3159 Py_DECREF(class);
3160 }
3161 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003163 if (! obj) return -1;
3164 PDATA_PUSH(self->stack, obj, -1);
3165 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003166}
3167
3168
3169static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003170load_inst(Unpicklerobject *self)
3171{
3172 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3173 int i, len;
3174 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003176 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003178 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3179 if (len < 2) return bad_readline();
3180 module_name = PyString_FromStringAndSize(s, len - 1);
3181 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003183 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3184 if (len < 2) return bad_readline();
3185 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3186 class = find_class(module_name, class_name,
3187 self->find_class);
3188 Py_DECREF(class_name);
3189 }
3190 }
3191 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003193 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003195 if ((tup=Pdata_popTuple(self->stack, i))) {
3196 obj = Instance_New(class, tup);
3197 Py_DECREF(tup);
3198 }
3199 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003200
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003201 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003203 PDATA_PUSH(self->stack, obj, -1);
3204 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003205}
3206
3207
3208static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003209load_global(Unpicklerobject *self)
3210{
3211 PyObject *class = 0, *module_name = 0, *class_name = 0;
3212 int len;
3213 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003215 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3216 if (len < 2) return bad_readline();
3217 module_name = PyString_FromStringAndSize(s, len - 1);
3218 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003220 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3221 if (len < 2) return bad_readline();
3222 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3223 class = find_class(module_name, class_name,
3224 self->find_class);
3225 Py_DECREF(class_name);
3226 }
3227 }
3228 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003230 if (! class) return -1;
3231 PDATA_PUSH(self->stack, class, -1);
3232 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003233}
3234
3235
3236static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003237load_persid(Unpicklerobject *self)
3238{
3239 PyObject *pid = 0;
3240 int len;
3241 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003243 if (self->pers_func) {
3244 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3245 if (len < 2) return bad_readline();
3246
3247 pid = PyString_FromStringAndSize(s, len - 1);
3248 if (!pid) return -1;
3249
3250 if (PyList_Check(self->pers_func)) {
3251 if (PyList_Append(self->pers_func, pid) < 0) {
3252 Py_DECREF(pid);
3253 return -1;
3254 }
3255 }
3256 else {
3257 ARG_TUP(self, pid);
3258 if (self->arg) {
3259 pid = PyObject_Call(self->pers_func, self->arg,
3260 NULL);
3261 FREE_ARG_TUP(self);
3262 }
3263 }
3264
3265 if (! pid) return -1;
3266
3267 PDATA_PUSH(self->stack, pid, -1);
3268 return 0;
3269 }
3270 else {
3271 PyErr_SetString(UnpicklingError,
3272 "A load persistent id instruction was encountered,\n"
3273 "but no persistent_load function was specified.");
3274 return -1;
3275 }
3276}
3277
3278static int
3279load_binpersid(Unpicklerobject *self)
3280{
3281 PyObject *pid = 0;
3282
3283 if (self->pers_func) {
3284 PDATA_POP(self->stack, pid);
3285 if (! pid) return -1;
3286
3287 if (PyList_Check(self->pers_func)) {
3288 if (PyList_Append(self->pers_func, pid) < 0) {
3289 Py_DECREF(pid);
3290 return -1;
3291 }
3292 }
3293 else {
3294 ARG_TUP(self, pid);
3295 if (self->arg) {
3296 pid = PyObject_Call(self->pers_func, self->arg,
3297 NULL);
3298 FREE_ARG_TUP(self);
3299 }
3300 if (! pid) return -1;
3301 }
3302
3303 PDATA_PUSH(self->stack, pid, -1);
3304 return 0;
3305 }
3306 else {
3307 PyErr_SetString(UnpicklingError,
3308 "A load persistent id instruction was encountered,\n"
3309 "but no persistent_load function was specified.");
3310 return -1;
3311 }
3312}
3313
3314
3315static int
3316load_pop(Unpicklerobject *self)
3317{
3318 int len;
3319
3320 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3321
3322 /* Note that we split the (pickle.py) stack into two stacks,
3323 an object stack and a mark stack. We have to be clever and
3324 pop the right one. We do this by looking at the top of the
3325 mark stack.
3326 */
3327
3328 if ((self->num_marks > 0) &&
3329 (self->marks[self->num_marks - 1] == len))
3330 self->num_marks--;
3331 else {
3332 len--;
3333 Py_DECREF(self->stack->data[len]);
3334 self->stack->length=len;
3335 }
3336
3337 return 0;
3338}
3339
3340
3341static int
3342load_pop_mark(Unpicklerobject *self)
3343{
3344 int i;
3345
3346 if ((i = marker(self)) < 0)
3347 return -1;
3348
3349 Pdata_clear(self->stack, i);
3350
3351 return 0;
3352}
3353
3354
3355static int
3356load_dup(Unpicklerobject *self)
3357{
3358 PyObject *last;
3359 int len;
3360
3361 if ((len = self->stack->length) <= 0) return stackUnderflow();
3362 last=self->stack->data[len-1];
3363 Py_INCREF(last);
3364 PDATA_PUSH(self->stack, last, -1);
3365 return 0;
3366}
3367
3368
3369static int
3370load_get(Unpicklerobject *self)
3371{
3372 PyObject *py_str = 0, *value = 0;
3373 int len;
3374 char *s;
3375 int rc;
3376
3377 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003378 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003380 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003382 value = PyDict_GetItem(self->memo, py_str);
3383 if (! value) {
3384 PyErr_SetObject(BadPickleGet, py_str);
3385 rc = -1;
3386 } else {
3387 PDATA_APPEND(self->stack, value, -1);
3388 rc = 0;
3389 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003391 Py_DECREF(py_str);
3392 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003393}
3394
3395
3396static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003397load_binget(Unpicklerobject *self)
3398{
3399 PyObject *py_key = 0, *value = 0;
3400 unsigned char key;
3401 char *s;
3402 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003404 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003406 key = (unsigned char)s[0];
3407 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003409 value = PyDict_GetItem(self->memo, py_key);
3410 if (! value) {
3411 PyErr_SetObject(BadPickleGet, py_key);
3412 rc = -1;
3413 } else {
3414 PDATA_APPEND(self->stack, value, -1);
3415 rc = 0;
3416 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003418 Py_DECREF(py_key);
3419 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003420}
3421
3422
3423static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003424load_long_binget(Unpicklerobject *self)
3425{
3426 PyObject *py_key = 0, *value = 0;
3427 unsigned char c;
3428 char *s;
3429 long key;
3430 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003432 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003434 c = (unsigned char)s[0];
3435 key = (long)c;
3436 c = (unsigned char)s[1];
3437 key |= (long)c << 8;
3438 c = (unsigned char)s[2];
3439 key |= (long)c << 16;
3440 c = (unsigned char)s[3];
3441 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003443 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3444
3445 value = PyDict_GetItem(self->memo, py_key);
3446 if (! value) {
3447 PyErr_SetObject(BadPickleGet, py_key);
3448 rc = -1;
3449 } else {
3450 PDATA_APPEND(self->stack, value, -1);
3451 rc = 0;
3452 }
3453
3454 Py_DECREF(py_key);
3455 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003456}
3457
3458
3459static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003460load_put(Unpicklerobject *self)
3461{
3462 PyObject *py_str = 0, *value = 0;
3463 int len, l;
3464 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003466 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3467 if (l < 2) return bad_readline();
3468 if (!( len=self->stack->length )) return stackUnderflow();
3469 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3470 value=self->stack->data[len-1];
3471 l=PyDict_SetItem(self->memo, py_str, value);
3472 Py_DECREF(py_str);
3473 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003474}
3475
3476
3477static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003478load_binput(Unpicklerobject *self)
3479{
3480 PyObject *py_key = 0, *value = 0;
3481 unsigned char key;
3482 char *s;
3483 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003484
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003485 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3486 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003488 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003490 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3491 value=self->stack->data[len-1];
3492 len=PyDict_SetItem(self->memo, py_key, value);
3493 Py_DECREF(py_key);
3494 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003495}
3496
3497
3498static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003499load_long_binput(Unpicklerobject *self)
3500{
3501 PyObject *py_key = 0, *value = 0;
3502 long key;
3503 unsigned char c;
3504 char *s;
3505 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003507 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3508 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003510 c = (unsigned char)s[0];
3511 key = (long)c;
3512 c = (unsigned char)s[1];
3513 key |= (long)c << 8;
3514 c = (unsigned char)s[2];
3515 key |= (long)c << 16;
3516 c = (unsigned char)s[3];
3517 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003519 if (!( py_key = PyInt_FromLong(key))) return -1;
3520 value=self->stack->data[len-1];
3521 len=PyDict_SetItem(self->memo, py_key, value);
3522 Py_DECREF(py_key);
3523 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003524}
3525
3526
3527static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003528do_append(Unpicklerobject *self, int x)
3529{
3530 PyObject *value = 0, *list = 0, *append_method = 0;
3531 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003533 len=self->stack->length;
3534 if (!( len >= x && x > 0 )) return stackUnderflow();
3535 /* nothing to do */
3536 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003538 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003540 if (PyList_Check(list)) {
3541 PyObject *slice;
3542 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003544 slice=Pdata_popList(self->stack, x);
3545 list_len = PyList_GET_SIZE(list);
3546 i=PyList_SetSlice(list, list_len, list_len, slice);
3547 Py_DECREF(slice);
3548 return i;
3549 }
3550 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003552 if (!( append_method = PyObject_GetAttr(list, append_str)))
3553 return -1;
3554
3555 for (i = x; i < len; i++) {
3556 PyObject *junk;
3557
3558 value=self->stack->data[i];
3559 junk=0;
3560 ARG_TUP(self, value);
3561 if (self->arg) {
3562 junk = PyObject_Call(append_method, self->arg,
3563 NULL);
3564 FREE_ARG_TUP(self);
3565 }
3566 if (! junk) {
3567 Pdata_clear(self->stack, i+1);
3568 self->stack->length=x;
3569 Py_DECREF(append_method);
3570 return -1;
3571 }
3572 Py_DECREF(junk);
3573 }
3574 self->stack->length=x;
3575 Py_DECREF(append_method);
3576 }
3577
3578 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003579}
3580
3581
3582static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003583load_append(Unpicklerobject *self)
3584{
3585 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003586}
3587
3588
3589static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003590load_appends(Unpicklerobject *self)
3591{
3592 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003593}
3594
3595
3596static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003597do_setitems(Unpicklerobject *self, int x)
3598{
3599 PyObject *value = 0, *key = 0, *dict = 0;
3600 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003602 if (!( (len=self->stack->length) >= x
3603 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003605 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003607 for (i = x+1; i < len; i += 2) {
3608 key =self->stack->data[i-1];
3609 value=self->stack->data[i ];
3610 if (PyObject_SetItem(dict, key, value) < 0) {
3611 r=-1;
3612 break;
3613 }
3614 }
3615
3616 Pdata_clear(self->stack, x);
3617
3618 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003619}
3620
3621
Tim Peters84e87f32001-03-17 04:50:51 +00003622static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003623load_setitem(Unpicklerobject *self)
3624{
3625 return do_setitems(self, self->stack->length - 2);
3626}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003628static int
3629load_setitems(Unpicklerobject *self)
3630{
3631 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003632}
3633
Tim Peters84e87f32001-03-17 04:50:51 +00003634
Guido van Rossum60456fd1997-04-09 17:36:32 +00003635static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003636load_build(Unpicklerobject *self)
3637{
3638 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3639 *junk = 0, *__setstate__ = 0;
3640 int i, r = 0;
3641
3642 if (self->stack->length < 2) return stackUnderflow();
3643 PDATA_POP(self->stack, value);
3644 if (! value) return -1;
3645 inst=self->stack->data[self->stack->length-1];
3646
3647 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3648 ARG_TUP(self, value);
3649 if (self->arg) {
3650 junk = PyObject_Call(__setstate__, self->arg, NULL);
3651 FREE_ARG_TUP(self);
3652 }
3653 Py_DECREF(__setstate__);
3654 if (! junk) return -1;
3655 Py_DECREF(junk);
3656 return 0;
3657 }
3658
3659 PyErr_Clear();
3660 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3661 i = 0;
3662 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3663 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3664 r=-1;
3665 break;
3666 }
3667 }
3668 Py_DECREF(instdict);
3669 }
3670 else r=-1;
3671
3672 Py_XDECREF(value);
3673
3674 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003675}
3676
3677
3678static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003679load_mark(Unpicklerobject *self)
3680{
3681 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003683 /* Note that we split the (pickle.py) stack into two stacks, an
3684 object stack and a mark stack. Here we push a mark onto the
3685 mark stack.
3686 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003687
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003688 if ((self->num_marks + 1) >= self->marks_size) {
3689 s=self->marks_size+20;
3690 if (s <= self->num_marks) s=self->num_marks + 1;
3691 if (self->marks == NULL)
3692 self->marks=(int *)malloc(s * sizeof(int));
3693 else
3694 self->marks=(int *)realloc(self->marks,
3695 s * sizeof(int));
3696 if (! self->marks) {
3697 PyErr_NoMemory();
3698 return -1;
3699 }
3700 self->marks_size = s;
3701 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003703 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003705 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003706}
3707
Guido van Rossum60456fd1997-04-09 17:36:32 +00003708static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003709load_reduce(Unpicklerobject *self)
3710{
3711 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003713 PDATA_POP(self->stack, arg_tup);
3714 if (! arg_tup) return -1;
3715 PDATA_POP(self->stack, callable);
3716 if (callable) {
3717 ob = Instance_New(callable, arg_tup);
3718 Py_DECREF(callable);
3719 }
3720 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003722 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003724 PDATA_PUSH(self->stack, ob, -1);
3725 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003726}
Tim Peters84e87f32001-03-17 04:50:51 +00003727
Guido van Rossum60456fd1997-04-09 17:36:32 +00003728static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003729load(Unpicklerobject *self)
3730{
3731 PyObject *err = 0, *val = 0;
3732 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003734 self->num_marks = 0;
3735 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003737 while (1) {
3738 if ((*self->read_func)(self, &s, 1) < 0)
3739 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003741 switch (s[0]) {
3742 case NONE:
3743 if (load_none(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 BININT:
3748 if (load_binint(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 BININT1:
3753 if (load_binint1(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 BININT2:
3758 if (load_binint2(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 INT:
3763 if (load_int(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 LONG:
3768 if (load_long(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 FLOAT:
3773 if (load_float(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 BINFLOAT:
3778 if (load_binfloat(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 BINSTRING:
3783 if (load_binstring(self) < 0)
3784 break;
3785 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003787 case SHORT_BINSTRING:
3788 if (load_short_binstring(self) < 0)
3789 break;
3790 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003792 case STRING:
3793 if (load_string(self) < 0)
3794 break;
3795 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003796
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003797#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003798 case UNICODE:
3799 if (load_unicode(self) < 0)
3800 break;
3801 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003803 case BINUNICODE:
3804 if (load_binunicode(self) < 0)
3805 break;
3806 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003807#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003809 case EMPTY_TUPLE:
3810 if (load_empty_tuple(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 TUPLE:
3815 if (load_tuple(self) < 0)
3816 break;
3817 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003819 case EMPTY_LIST:
3820 if (load_empty_list(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 LIST:
3825 if (load_list(self) < 0)
3826 break;
3827 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003829 case EMPTY_DICT:
3830 if (load_empty_dict(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 DICT:
3835 if (load_dict(self) < 0)
3836 break;
3837 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003839 case OBJ:
3840 if (load_obj(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 INST:
3845 if (load_inst(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 GLOBAL:
3850 if (load_global(self) < 0)
3851 break;
3852 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003854 case APPEND:
3855 if (load_append(self) < 0)
3856 break;
3857 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003859 case APPENDS:
3860 if (load_appends(self) < 0)
3861 break;
3862 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003864 case BUILD:
3865 if (load_build(self) < 0)
3866 break;
3867 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003869 case DUP:
3870 if (load_dup(self) < 0)
3871 break;
3872 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003874 case BINGET:
3875 if (load_binget(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 LONG_BINGET:
3880 if (load_long_binget(self) < 0)
3881 break;
3882 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003884 case GET:
3885 if (load_get(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 MARK:
3890 if (load_mark(self) < 0)
3891 break;
3892 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003894 case BINPUT:
3895 if (load_binput(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 LONG_BINPUT:
3900 if (load_long_binput(self) < 0)
3901 break;
3902 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003904 case PUT:
3905 if (load_put(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 POP:
3910 if (load_pop(self) < 0)
3911 break;
3912 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003914 case POP_MARK:
3915 if (load_pop_mark(self) < 0)
3916 break;
3917 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003919 case SETITEM:
3920 if (load_setitem(self) < 0)
3921 break;
3922 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003924 case SETITEMS:
3925 if (load_setitems(self) < 0)
3926 break;
3927 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003929 case STOP:
3930 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003932 case PERSID:
3933 if (load_persid(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 BINPERSID:
3938 if (load_binpersid(self) < 0)
3939 break;
3940 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003942 case REDUCE:
3943 if (load_reduce(self) < 0)
3944 break;
3945 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003947 case '\0':
3948 /* end of file */
3949 PyErr_SetNone(PyExc_EOFError);
3950 break;
Neil Schemenauerfa79c652002-03-22 23:02:53 +00003951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003952 default:
3953 cPickle_ErrFormat(UnpicklingError,
3954 "invalid load key, '%s'.",
3955 "c", s[0]);
3956 return NULL;
3957 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003959 break;
3960 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003962 if ((err = PyErr_Occurred())) {
3963 if (err == PyExc_EOFError) {
3964 PyErr_SetNone(PyExc_EOFError);
3965 }
3966 return NULL;
3967 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003969 PDATA_POP(self->stack, val);
3970 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003971}
Tim Peters84e87f32001-03-17 04:50:51 +00003972
Guido van Rossum60456fd1997-04-09 17:36:32 +00003973
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003974/* No-load functions to support noload, which is used to
3975 find persistent references. */
3976
3977static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003978noload_obj(Unpicklerobject *self)
3979{
3980 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003982 if ((i = marker(self)) < 0) return -1;
3983 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003984}
3985
3986
3987static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003988noload_inst(Unpicklerobject *self)
3989{
3990 int i;
3991 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003993 if ((i = marker(self)) < 0) return -1;
3994 Pdata_clear(self->stack, i);
3995 if ((*self->readline_func)(self, &s) < 0) return -1;
3996 if ((*self->readline_func)(self, &s) < 0) return -1;
3997 PDATA_APPEND(self->stack, Py_None,-1);
3998 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003999}
4000
4001static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004002noload_global(Unpicklerobject *self)
4003{
4004 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004005
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004006 if ((*self->readline_func)(self, &s) < 0) return -1;
4007 if ((*self->readline_func)(self, &s) < 0) return -1;
4008 PDATA_APPEND(self->stack, Py_None,-1);
4009 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004010}
4011
4012static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004013noload_reduce(Unpicklerobject *self)
4014{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004016 if (self->stack->length < 2) return stackUnderflow();
4017 Pdata_clear(self->stack, self->stack->length-2);
4018 PDATA_APPEND(self->stack, Py_None,-1);
4019 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004020}
4021
4022static int
4023noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004024
Guido van Rossum053b8df1998-11-25 16:18:00 +00004025 if (self->stack->length < 1) return stackUnderflow();
4026 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004027 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004028}
4029
4030
4031static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004032noload(Unpicklerobject *self)
4033{
4034 PyObject *err = 0, *val = 0;
4035 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004036
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004037 self->num_marks = 0;
4038 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004039
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004040 while (1) {
4041 if ((*self->read_func)(self, &s, 1) < 0)
4042 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004044 switch (s[0]) {
4045 case NONE:
4046 if (load_none(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 BININT:
4051 if (load_binint(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 BININT1:
4056 if (load_binint1(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 BININT2:
4061 if (load_binint2(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 INT:
4066 if (load_int(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 LONG:
4071 if (load_long(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 FLOAT:
4076 if (load_float(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 BINFLOAT:
4081 if (load_binfloat(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 BINSTRING:
4086 if (load_binstring(self) < 0)
4087 break;
4088 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004089
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004090 case SHORT_BINSTRING:
4091 if (load_short_binstring(self) < 0)
4092 break;
4093 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004095 case STRING:
4096 if (load_string(self) < 0)
4097 break;
4098 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004099
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004100#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004101 case UNICODE:
4102 if (load_unicode(self) < 0)
4103 break;
4104 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004106 case BINUNICODE:
4107 if (load_binunicode(self) < 0)
4108 break;
4109 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004110#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004112 case EMPTY_TUPLE:
4113 if (load_empty_tuple(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 TUPLE:
4118 if (load_tuple(self) < 0)
4119 break;
4120 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004122 case EMPTY_LIST:
4123 if (load_empty_list(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 LIST:
4128 if (load_list(self) < 0)
4129 break;
4130 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004132 case EMPTY_DICT:
4133 if (load_empty_dict(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 DICT:
4138 if (load_dict(self) < 0)
4139 break;
4140 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004142 case OBJ:
4143 if (noload_obj(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 INST:
4148 if (noload_inst(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 GLOBAL:
4153 if (noload_global(self) < 0)
4154 break;
4155 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004157 case APPEND:
4158 if (load_append(self) < 0)
4159 break;
4160 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004162 case APPENDS:
4163 if (load_appends(self) < 0)
4164 break;
4165 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004167 case BUILD:
4168 if (noload_build(self) < 0)
4169 break;
4170 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004172 case DUP:
4173 if (load_dup(self) < 0)
4174 break;
4175 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004177 case BINGET:
4178 if (load_binget(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 LONG_BINGET:
4183 if (load_long_binget(self) < 0)
4184 break;
4185 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004187 case GET:
4188 if (load_get(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 MARK:
4193 if (load_mark(self) < 0)
4194 break;
4195 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004197 case BINPUT:
4198 if (load_binput(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 LONG_BINPUT:
4203 if (load_long_binput(self) < 0)
4204 break;
4205 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004207 case PUT:
4208 if (load_put(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 POP:
4213 if (load_pop(self) < 0)
4214 break;
4215 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004217 case POP_MARK:
4218 if (load_pop_mark(self) < 0)
4219 break;
4220 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004222 case SETITEM:
4223 if (load_setitem(self) < 0)
4224 break;
4225 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004226
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004227 case SETITEMS:
4228 if (load_setitems(self) < 0)
4229 break;
4230 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004232 case STOP:
4233 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004235 case PERSID:
4236 if (load_persid(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 case BINPERSID:
4241 if (load_binpersid(self) < 0)
4242 break;
4243 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004245 case REDUCE:
4246 if (noload_reduce(self) < 0)
4247 break;
4248 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004250 default:
4251 cPickle_ErrFormat(UnpicklingError,
4252 "invalid load key, '%s'.",
4253 "c", s[0]);
4254 return NULL;
4255 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004257 break;
4258 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004260 if ((err = PyErr_Occurred())) {
4261 if (err == PyExc_EOFError) {
4262 PyErr_SetNone(PyExc_EOFError);
4263 }
4264 return NULL;
4265 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004267 PDATA_POP(self->stack, val);
4268 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004269}
Tim Peters84e87f32001-03-17 04:50:51 +00004270
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004271
Guido van Rossum60456fd1997-04-09 17:36:32 +00004272static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004273Unpickler_load(Unpicklerobject *self, PyObject *args)
4274{
4275 if (!( PyArg_ParseTuple(args, ":load")))
4276 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004278 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004279}
4280
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004281static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004282Unpickler_noload(Unpicklerobject *self, PyObject *args)
4283{
4284 if (!( PyArg_ParseTuple(args, ":noload")))
4285 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004287 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004288}
4289
Guido van Rossum60456fd1997-04-09 17:36:32 +00004290
4291static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004292 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004293 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004294 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004295 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004296 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004297 "noload() -- not load a pickle, but go through most of the motions\n"
4298 "\n"
4299 "This function can be used to read past a pickle without instantiating\n"
4300 "any objects or importing any modules. It can also be used to find all\n"
4301 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004302 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004303 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004304 {NULL, NULL} /* sentinel */
4305};
4306
4307
4308static Unpicklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004309newUnpicklerobject(PyObject *f)
4310{
4311 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004313 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
4314 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004316 self->file = NULL;
4317 self->arg = NULL;
4318 self->stack = (Pdata*)Pdata_New();
4319 self->pers_func = NULL;
4320 self->last_string = NULL;
4321 self->marks = NULL;
4322 self->num_marks = 0;
4323 self->marks_size = 0;
4324 self->buf_size = 0;
4325 self->read = NULL;
4326 self->readline = NULL;
4327 self->safe_constructors = NULL;
4328 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004330 if (!( self->memo = PyDict_New()))
4331 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004333 Py_INCREF(f);
4334 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004336 /* Set read, readline based on type of f */
4337 if (PyFile_Check(f)) {
4338 self->fp = PyFile_AsFile(f);
4339 if (self->fp == NULL) {
4340 PyErr_SetString(PyExc_ValueError,
4341 "I/O operation on closed file");
4342 goto err;
4343 }
4344 self->read_func = read_file;
4345 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004346 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004347 else if (PycStringIO_InputCheck(f)) {
4348 self->fp = NULL;
4349 self->read_func = read_cStringIO;
4350 self->readline_func = readline_cStringIO;
4351 }
4352 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004353
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004354 self->fp = NULL;
4355 self->read_func = read_other;
4356 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004358 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4359 (self->read = PyObject_GetAttr(f, read_str)))) {
4360 PyErr_Clear();
4361 PyErr_SetString( PyExc_TypeError,
4362 "argument must have 'read' and "
4363 "'readline' attributes" );
4364 goto err;
4365 }
4366 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004368 if (PyEval_GetRestricted()) {
4369 /* Restricted execution, get private tables */
4370 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004372 if (!( m=PyImport_Import(copy_reg_str))) goto err;
4373 self->safe_constructors=PyObject_GetAttr(m,
4374 safe_constructors_str);
4375 Py_DECREF(m);
4376 if (!( self->safe_constructors )) goto err;
4377 }
4378 else {
4379 self->safe_constructors=safe_constructors;
4380 Py_INCREF(safe_constructors);
4381 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004383 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004385 err:
4386 Py_DECREF((PyObject *)self);
4387 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004388}
4389
4390
4391static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004392get_Unpickler(PyObject *self, PyObject *args)
4393{
4394 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004396 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
4397 return NULL;
4398 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004399}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004400
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004401
Guido van Rossum60456fd1997-04-09 17:36:32 +00004402static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004403Unpickler_dealloc(Unpicklerobject *self)
4404{
4405 Py_XDECREF(self->readline);
4406 Py_XDECREF(self->read);
4407 Py_XDECREF(self->file);
4408 Py_XDECREF(self->memo);
4409 Py_XDECREF(self->stack);
4410 Py_XDECREF(self->pers_func);
4411 Py_XDECREF(self->arg);
4412 Py_XDECREF(self->last_string);
4413 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004415 if (self->marks) {
4416 free(self->marks);
4417 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004419 if (self->buf_size) {
4420 free(self->buf);
4421 }
Tim Peters84e87f32001-03-17 04:50:51 +00004422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004423 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004424}
4425
4426
4427static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004428Unpickler_getattr(Unpicklerobject *self, char *name)
4429{
4430 if (!strcmp(name, "persistent_load")) {
4431 if (!self->pers_func) {
4432 PyErr_SetString(PyExc_AttributeError, name);
4433 return NULL;
4434 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004436 Py_INCREF(self->pers_func);
4437 return self->pers_func;
4438 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004440 if (!strcmp(name, "find_global")) {
4441 if (!self->find_class) {
4442 PyErr_SetString(PyExc_AttributeError, name);
4443 return NULL;
4444 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004446 Py_INCREF(self->find_class);
4447 return self->find_class;
4448 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004450 if (!strcmp(name, "memo")) {
4451 if (!self->memo) {
4452 PyErr_SetString(PyExc_AttributeError, name);
4453 return NULL;
4454 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004456 Py_INCREF(self->memo);
4457 return self->memo;
4458 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004460 if (!strcmp(name, "UnpicklingError")) {
4461 Py_INCREF(UnpicklingError);
4462 return UnpicklingError;
4463 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004465 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004466}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004467
Guido van Rossum60456fd1997-04-09 17:36:32 +00004468
4469static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004470Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
4471{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004473 if (!strcmp(name, "persistent_load")) {
4474 Py_XDECREF(self->pers_func);
4475 self->pers_func = value;
4476 Py_XINCREF(value);
4477 return 0;
4478 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004480 if (!strcmp(name, "find_global")) {
4481 Py_XDECREF(self->find_class);
4482 self->find_class = value;
4483 Py_XINCREF(value);
4484 return 0;
4485 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004487 if (! value) {
4488 PyErr_SetString(PyExc_TypeError,
4489 "attribute deletion is not supported");
4490 return -1;
4491 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004493 if (strcmp(name, "memo") == 0) {
4494 if (!PyDict_Check(value)) {
4495 PyErr_SetString(PyExc_TypeError,
4496 "memo must be a dictionary");
4497 return -1;
4498 }
4499 Py_XDECREF(self->memo);
4500 self->memo = value;
4501 Py_INCREF(value);
4502 return 0;
4503 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004505 PyErr_SetString(PyExc_AttributeError, name);
4506 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004507}
4508
4509
4510static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004511cpm_dump(PyObject *self, PyObject *args)
4512{
4513 PyObject *ob, *file, *res = NULL;
4514 Picklerobject *pickler = 0;
4515 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004516
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004517 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin)))
4518 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004519
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004520 if (!( pickler = newPicklerobject(file, bin)))
4521 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004523 if (dump(pickler, ob) < 0)
4524 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004525
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004526 Py_INCREF(Py_None);
4527 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004529 finally:
4530 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004532 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004533}
4534
4535
4536static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004537cpm_dumps(PyObject *self, PyObject *args)
4538{
4539 PyObject *ob, *file = 0, *res = NULL;
4540 Picklerobject *pickler = 0;
4541 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004543 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin)))
4544 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004546 if (!( file = PycStringIO->NewOutput(128)))
4547 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004549 if (!( pickler = newPicklerobject(file, bin)))
4550 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004552 if (dump(pickler, ob) < 0)
4553 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004555 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004557 finally:
4558 Py_XDECREF(pickler);
4559 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004561 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004562}
4563
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004564
4565static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004566cpm_load(PyObject *self, PyObject *args)
4567{
4568 Unpicklerobject *unpickler = 0;
4569 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004571 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
4572 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004573
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004574 if (!( unpickler = newUnpicklerobject(ob)))
4575 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004577 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004579 finally:
4580 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004582 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004583}
4584
4585
4586static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004587cpm_loads(PyObject *self, PyObject *args)
4588{
4589 PyObject *ob, *file = 0, *res = NULL;
4590 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004592 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
4593 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004595 if (!( file = PycStringIO->NewInput(ob)))
4596 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004598 if (!( unpickler = newUnpicklerobject(file)))
4599 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004601 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004603 finally:
4604 Py_XDECREF(file);
4605 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004607 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004608}
4609
4610
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004611PyDoc_STRVAR(Unpicklertype__doc__,
4612"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004613
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004614static PyTypeObject Unpicklertype = {
4615 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004616 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004617 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004618 sizeof(Unpicklerobject), /*tp_basicsize*/
4619 0, /*tp_itemsize*/
4620 /* methods */
4621 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4622 (printfunc)0, /*tp_print*/
4623 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4624 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4625 (cmpfunc)0, /*tp_compare*/
4626 (reprfunc)0, /*tp_repr*/
4627 0, /*tp_as_number*/
4628 0, /*tp_as_sequence*/
4629 0, /*tp_as_mapping*/
4630 (hashfunc)0, /*tp_hash*/
4631 (ternaryfunc)0, /*tp_call*/
4632 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004633
Guido van Rossum60456fd1997-04-09 17:36:32 +00004634 /* Space for future expansion */
4635 0L,0L,0L,0L,
4636 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004637};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004638
Guido van Rossum60456fd1997-04-09 17:36:32 +00004639static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004640 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004641 PyDoc_STR("dump(object, file, [binary]) --"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004642 "Write an object in pickle format to the given file\n"
4643 "\n"
4644 "If the optional argument, binary, is provided and is true, then the\n"
4645 "pickle will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004646 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004647 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004648 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004649 PyDoc_STR("dumps(object, [binary]) --"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004650 "Return a string containing an object in pickle format\n"
4651 "\n"
4652 "If the optional argument, binary, is provided and is true, then the\n"
4653 "pickle will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004654 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004655 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004656 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004657 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Neal Norwitzb0493252002-03-31 14:44:22 +00004658 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004659 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Neal Norwitzb0493252002-03-31 14:44:22 +00004660 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004661 PyDoc_STR("Pickler(file, [binary]) -- Create a pickler\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004662 "\n"
4663 "If the optional argument, binary, is provided and is true, then\n"
4664 "pickles will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004665 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004666 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004667 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004668 PyDoc_STR("Unpickler(file) -- Create an unpickler")},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004669 { NULL, NULL }
4670};
4671
Guido van Rossum60456fd1997-04-09 17:36:32 +00004672static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004673init_stuff(PyObject *module_dict)
4674{
4675 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004676
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004677#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004679 INIT_STR(__class__);
4680 INIT_STR(__getinitargs__);
4681 INIT_STR(__dict__);
4682 INIT_STR(__getstate__);
4683 INIT_STR(__setstate__);
4684 INIT_STR(__name__);
4685 INIT_STR(__main__);
4686 INIT_STR(__reduce__);
4687 INIT_STR(write);
4688 INIT_STR(__safe_for_unpickling__);
4689 INIT_STR(append);
4690 INIT_STR(read);
4691 INIT_STR(readline);
4692 INIT_STR(copy_reg);
4693 INIT_STR(dispatch_table);
4694 INIT_STR(safe_constructors);
4695 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004697 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
4698 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004700 /* These next few are special because we want to use different
4701 ones in restricted mode. */
4702 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
4703 if (!dispatch_table)
4704 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004706 if (!( safe_constructors = PyObject_GetAttr(copy_reg,
4707 safe_constructors_str)))
4708 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004710 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004712 /* Down to here ********************************** */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004714 if (!( empty_tuple = PyTuple_New(0)))
4715 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004717 /* Ugh */
4718 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4719 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4720 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004722 if (!( t=PyDict_New())) return -1;
4723 if (!( r=PyRun_String(
4724 "def __init__(self, *args): self.args=args\n\n"
4725 "def __str__(self):\n"
4726 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4727 Py_file_input,
4728 module_dict, t) )) return -1;
4729 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004730
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004731 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
4732 if (!PickleError)
4733 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004735 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004737 PicklingError = PyErr_NewException("cPickle.PicklingError",
4738 PickleError, NULL);
4739 if (!PicklingError)
4740 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004742 if (!( t=PyDict_New())) return -1;
4743 if (!( r=PyRun_String(
4744 "def __init__(self, *args): self.args=args\n\n"
4745 "def __str__(self):\n"
4746 " a=self.args\n"
4747 " a=a and type(a[0]) or '(what)'\n"
4748 " return 'Cannot pickle %s objects' % a\n"
4749 , Py_file_input,
4750 module_dict, t) )) return -1;
4751 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004753 if (!( UnpickleableError = PyErr_NewException(
4754 "cPickle.UnpickleableError", PicklingError, t)))
4755 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004757 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004759 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
4760 PickleError, NULL)))
4761 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004762
Martin v. Löwis658009a2002-09-16 17:26:24 +00004763 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
4764 UnpicklingError, NULL)))
4765 return -1;
4766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004767 if (PyDict_SetItemString(module_dict, "PickleError",
4768 PickleError) < 0)
4769 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004771 if (PyDict_SetItemString(module_dict, "PicklingError",
4772 PicklingError) < 0)
4773 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004775 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4776 UnpicklingError) < 0)
4777 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004779 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4780 UnpickleableError) < 0)
4781 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004783 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4784 BadPickleGet) < 0)
4785 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004787 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004789 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004790}
4791
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004792#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
4793#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004794#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004795PyMODINIT_FUNC
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004796initcPickle(void)
4797{
4798 PyObject *m, *d, *di, *v, *k;
4799 int i;
4800 char *rev="1.71";
4801 PyObject *format_version;
4802 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004804 Picklertype.ob_type = &PyType_Type;
4805 Picklertype.tp_getattro = PyObject_GenericGetAttr;
4806 Picklertype.tp_setattro = PyObject_GenericSetAttr;
4807 Unpicklertype.ob_type = &PyType_Type;
4808 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004810 /* Initialize some pieces. We need to do this before module creation,
4811 so we're forced to use a temporary dictionary. :(
4812 */
4813 di=PyDict_New();
4814 if (!di) return;
4815 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004817 /* Create the module and add the functions */
4818 m = Py_InitModule4("cPickle", cPickle_methods,
4819 cPickle_module_documentation,
4820 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004822 /* Add some symbolic constants to the module */
4823 d = PyModule_GetDict(m);
4824 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4825 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004827 /* Copy data from di. Waaa. */
4828 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4829 if (PyObject_SetItem(d, k, v) < 0) {
4830 Py_DECREF(di);
4831 return;
4832 }
4833 }
4834 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004836 format_version = PyString_FromString("1.3");
4837 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004839 PyDict_SetItemString(d, "format_version", format_version);
4840 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4841 Py_XDECREF(format_version);
4842 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004843}