blob: 248436532bc88a8ef9f0ac1d39a1e791639b206b [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 */
279 int (*write_func)(struct Picklerobject *, char *, int);
280 char *write_buf;
281 int buf_size;
282 PyObject *dispatch_table;
283 int fast_container; /* count nested container dumps */
284 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000285} Picklerobject;
286
Barry Warsaw52acb492001-12-21 20:04:22 +0000287#ifndef PY_CPICKLE_FAST_LIMIT
288#define PY_CPICKLE_FAST_LIMIT 50
289#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000290
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000291staticforward PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000292
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000293typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000294 PyObject_HEAD
295 FILE *fp;
296 PyObject *file;
297 PyObject *readline;
298 PyObject *read;
299 PyObject *memo;
300 PyObject *arg;
301 Pdata *stack;
302 PyObject *mark;
303 PyObject *pers_func;
304 PyObject *last_string;
305 int *marks;
306 int num_marks;
307 int marks_size;
308 int (*read_func)(struct Unpicklerobject *, char **, int);
309 int (*readline_func)(struct Unpicklerobject *, char **);
310 int buf_size;
311 char *buf;
312 PyObject *safe_constructors;
313 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000314} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000315
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000316staticforward PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000317
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000318/* Forward decls that need the above structs */
319static int save(Picklerobject *, PyObject *, int);
320static int put2(Picklerobject *, PyObject *);
321
Tim Peters84e87f32001-03-17 04:50:51 +0000322int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000323cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
324{
325 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000327 if ((v = PyObject_GetItem(o,key))) {
328 Py_DECREF(v);
329 return 1;
330 }
331
332 PyErr_Clear();
333 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000334}
335
Guido van Rossumd385d591997-04-09 17:47:47 +0000336static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000337PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000338cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
339{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000340 va_list va;
341 PyObject *args=0, *retval=0;
342 va_start(va, format);
343
344 if (format) args = Py_VaBuildValue(format, va);
345 va_end(va);
346 if (format && ! args) return NULL;
347 if (stringformat && !(retval=PyString_FromString(stringformat)))
348 return NULL;
349
350 if (retval) {
351 if (args) {
352 PyObject *v;
353 v=PyString_Format(retval, args);
354 Py_DECREF(retval);
355 Py_DECREF(args);
356 if (! v) return NULL;
357 retval=v;
358 }
359 }
360 else
361 if (args) retval=args;
362 else {
363 PyErr_SetObject(ErrType,Py_None);
364 return NULL;
365 }
366 PyErr_SetObject(ErrType,retval);
367 Py_DECREF(retval);
368 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000369}
370
Tim Peters84e87f32001-03-17 04:50:51 +0000371static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000372write_file(Picklerobject *self, char *s, int n)
373{
374 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000376 if (s == NULL) {
377 return 0;
378 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000380 Py_BEGIN_ALLOW_THREADS
381 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
382 Py_END_ALLOW_THREADS
383 if (nbyteswritten != (size_t)n) {
384 PyErr_SetFromErrno(PyExc_IOError);
385 return -1;
386 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000387
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000388 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000389}
390
Tim Peters84e87f32001-03-17 04:50:51 +0000391static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000392write_cStringIO(Picklerobject *self, char *s, int n)
393{
394 if (s == NULL) {
395 return 0;
396 }
397
398 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
399 return -1;
400 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000402 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000403}
404
Tim Peters84e87f32001-03-17 04:50:51 +0000405static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000406write_none(Picklerobject *self, char *s, int n)
407{
408 if (s == NULL) return 0;
409 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000410}
411
Tim Peters84e87f32001-03-17 04:50:51 +0000412static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000413write_other(Picklerobject *self, char *s, int n)
414{
415 PyObject *py_str = 0, *junk = 0;
416
417 if (s == NULL) {
418 if (!( self->buf_size )) return 0;
419 py_str = PyString_FromStringAndSize(self->write_buf,
420 self->buf_size);
421 if (!py_str)
422 return -1;
423 }
424 else {
425 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
426 if (write_other(self, NULL, 0) < 0)
427 return -1;
428 }
429
430 if (n > WRITE_BUF_SIZE) {
431 if (!( py_str =
432 PyString_FromStringAndSize(s, n)))
433 return -1;
434 }
435 else {
436 memcpy(self->write_buf + self->buf_size, s, n);
437 self->buf_size += n;
438 return n;
439 }
440 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000442 if (self->write) {
443 /* object with write method */
444 ARG_TUP(self, py_str);
445 if (self->arg) {
446 junk = PyObject_Call(self->write, self->arg, NULL);
447 FREE_ARG_TUP(self);
448 }
449 if (junk) Py_DECREF(junk);
450 else return -1;
451 }
452 else
453 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000454
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000455 self->buf_size = 0;
456 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000457}
458
459
Tim Peters84e87f32001-03-17 04:50:51 +0000460static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000461read_file(Unpicklerobject *self, char **s, int n)
462{
463 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000465 if (self->buf_size == 0) {
466 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000468 size = ((n < 32) ? 32 : n);
469 if (!( self->buf = (char *)malloc(size * sizeof(char)))) {
470 PyErr_NoMemory();
471 return -1;
472 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000474 self->buf_size = size;
475 }
476 else if (n > self->buf_size) {
477 self->buf = (char *)realloc(self->buf, n * sizeof(char));
478 if (!self->buf) {
479 PyErr_NoMemory();
480 return -1;
481 }
Tim Peters84e87f32001-03-17 04:50:51 +0000482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000483 self->buf_size = n;
484 }
Tim Peters84e87f32001-03-17 04:50:51 +0000485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000486 Py_BEGIN_ALLOW_THREADS
487 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
488 Py_END_ALLOW_THREADS
489 if (nbytesread != (size_t)n) {
490 if (feof(self->fp)) {
491 PyErr_SetNone(PyExc_EOFError);
492 return -1;
493 }
494
495 PyErr_SetFromErrno(PyExc_IOError);
496 return -1;
497 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000499 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000501 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000502}
503
504
Tim Peters84e87f32001-03-17 04:50:51 +0000505static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000506readline_file(Unpicklerobject *self, char **s)
507{
508 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000510 if (self->buf_size == 0) {
511 if (!( self->buf = (char *)malloc(40 * sizeof(char)))) {
512 PyErr_NoMemory();
513 return -1;
514 }
Tim Peters84e87f32001-03-17 04:50:51 +0000515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000516 self->buf_size = 40;
517 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000519 i = 0;
520 while (1) {
521 for (; i < (self->buf_size - 1); i++) {
522 if (feof(self->fp) ||
523 (self->buf[i] = getc(self->fp)) == '\n') {
524 self->buf[i + 1] = '\0';
525 *s = self->buf;
526 return i + 1;
527 }
528 }
529 self->buf = (char *)realloc(self->buf,
530 (self->buf_size * 2) * sizeof(char));
531 if (!self->buf) {
532 PyErr_NoMemory();
533 return -1;
534 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000536 self->buf_size *= 2;
537 }
Tim Peters84e87f32001-03-17 04:50:51 +0000538}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000539
540
Tim Peters84e87f32001-03-17 04:50:51 +0000541static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000542read_cStringIO(Unpicklerobject *self, char **s, int n)
543{
544 char *ptr;
545
546 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
547 PyErr_SetNone(PyExc_EOFError);
548 return -1;
549 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000550
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000551 *s = ptr;
552
553 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000554}
555
556
Tim Peters84e87f32001-03-17 04:50:51 +0000557static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000558readline_cStringIO(Unpicklerobject *self, char **s)
559{
560 int n;
561 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000563 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
564 return -1;
565 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000567 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000569 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000570}
571
572
Tim Peters84e87f32001-03-17 04:50:51 +0000573static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000574read_other(Unpicklerobject *self, char **s, int n)
575{
576 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000578 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000580 ARG_TUP(self, bytes);
581 if (self->arg) {
582 str = PyObject_Call(self->read, self->arg, NULL);
583 FREE_ARG_TUP(self);
584 }
585 if (! str) return -1;
586
587 Py_XDECREF(self->last_string);
588 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000589
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000590 if (! (*s = PyString_AsString(str))) return -1;
591 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000592}
593
594
Tim Peters84e87f32001-03-17 04:50:51 +0000595static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000596readline_other(Unpicklerobject *self, char **s)
597{
598 PyObject *str;
599 int str_size;
600
601 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
602 return -1;
603 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000605 if ((str_size = PyString_Size(str)) < 0)
606 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000608 Py_XDECREF(self->last_string);
609 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000611 if (! (*s = PyString_AsString(str)))
612 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000614 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000615}
616
617
618static char *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000619pystrndup(char *s, int l)
620{
621 char *r;
622 if (!( r=malloc((l+1)*sizeof(char)))) return (char*)PyErr_NoMemory();
623 memcpy(r,s,l);
624 r[l]=0;
625 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000626}
627
628
629static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000630get(Picklerobject *self, PyObject *id)
631{
632 PyObject *value, *mv;
633 long c_value;
634 char s[30];
635 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000637 if (!( mv = PyDict_GetItem(self->memo, id))) {
638 PyErr_SetObject(PyExc_KeyError, id);
639 return -1;
640 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000642 if (!( value = PyTuple_GetItem(mv, 0)))
643 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000644
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000645 if (!( PyInt_Check(value))) {
646 PyErr_SetString(PicklingError, "no int where int expected in memo");
647 return -1;
648 }
649 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000651 if (!self->bin) {
652 s[0] = GET;
653 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
654 len = strlen(s);
655 }
656 else if (Pdata_Check(self->file)) {
657 if (write_other(self, NULL, 0) < 0) return -1;
658 PDATA_APPEND(self->file, mv, -1);
659 return 0;
660 }
661 else {
662 if (c_value < 256) {
663 s[0] = BINGET;
664 s[1] = (int)(c_value & 0xff);
665 len = 2;
666 }
667 else {
668 s[0] = LONG_BINGET;
669 s[1] = (int)(c_value & 0xff);
670 s[2] = (int)((c_value >> 8) & 0xff);
671 s[3] = (int)((c_value >> 16) & 0xff);
672 s[4] = (int)((c_value >> 24) & 0xff);
673 len = 5;
674 }
675 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000676
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000677 if ((*self->write_func)(self, s, len) < 0)
678 return -1;
679
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000680 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000681}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000682
Guido van Rossum60456fd1997-04-09 17:36:32 +0000683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000684static int
685put(Picklerobject *self, PyObject *ob)
686{
687 if (ob->ob_refcnt < 2 || self->fast)
688 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000690 return put2(self, ob);
691}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000692
Guido van Rossum053b8df1998-11-25 16:18:00 +0000693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000694static int
695put2(Picklerobject *self, PyObject *ob)
696{
697 char c_str[30];
698 int p;
699 size_t len;
700 int res = -1;
701 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000703 if (self->fast)
704 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000706 if ((p = PyDict_Size(self->memo)) < 0)
707 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000709 /* Make sure memo keys are positive! */
710 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000712 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
713 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000715 if (!( memo_len = PyInt_FromLong(p)))
716 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000718 if (!( t = PyTuple_New(2)))
719 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000721 PyTuple_SET_ITEM(t, 0, memo_len);
722 Py_INCREF(memo_len);
723 PyTuple_SET_ITEM(t, 1, ob);
724 Py_INCREF(ob);
725
726 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
727 goto finally;
728
729 if (!self->bin) {
730 c_str[0] = PUT;
731 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
732 len = strlen(c_str);
733 }
734 else if (Pdata_Check(self->file)) {
735 if (write_other(self, NULL, 0) < 0) return -1;
736 PDATA_APPEND(self->file, memo_len, -1);
737 res=0; /* Job well done ;) */
738 goto finally;
739 }
740 else {
741 if (p >= 256) {
742 c_str[0] = LONG_BINPUT;
743 c_str[1] = (int)(p & 0xff);
744 c_str[2] = (int)((p >> 8) & 0xff);
745 c_str[3] = (int)((p >> 16) & 0xff);
746 c_str[4] = (int)((p >> 24) & 0xff);
747 len = 5;
748 }
749 else {
750 c_str[0] = BINPUT;
751 c_str[1] = p;
752 len = 2;
753 }
754 }
755
756 if ((*self->write_func)(self, c_str, len) < 0)
757 goto finally;
758
759 res = 0;
760
761 finally:
762 Py_XDECREF(py_ob_id);
763 Py_XDECREF(memo_len);
764 Py_XDECREF(t);
765
766 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000767}
768
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000769#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000770
771static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000772PyImport_Import(PyObject *module_name)
773{
774 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
775 static PyObject *standard_builtins=0;
776 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000778 if (!( silly_list )) {
779 if (!( __import___str=PyString_FromString("__import__")))
780 return NULL;
781 if (!( __builtins___str=PyString_FromString("__builtins__")))
782 return NULL;
783 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
784 return NULL;
785 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000787 if ((globals=PyEval_GetGlobals())) {
788 Py_INCREF(globals);
789 __builtins__=PyObject_GetItem(globals,__builtins___str);
790 if (!__builtins__)
791 goto err;
792 }
793 else {
794 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000796 if (!(standard_builtins ||
797 (standard_builtins=PyImport_ImportModule("__builtin__"))))
798 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000800 __builtins__=standard_builtins;
801 Py_INCREF(__builtins__);
802 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
803 if (!globals)
804 goto err;
805 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000807 if (PyDict_Check(__builtins__)) {
808 __import__=PyObject_GetItem(__builtins__,__import___str);
809 if (!__import__) goto err;
810 }
811 else {
812 __import__=PyObject_GetAttr(__builtins__,__import___str);
813 if (!__import__) goto err;
814 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000816 r=PyObject_CallFunction(__import__,"OOOO",
817 module_name, globals, globals, silly_list);
818 if (!r)
819 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000821 Py_DECREF(globals);
822 Py_DECREF(__builtins__);
823 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000825 return r;
826 err:
827 Py_XDECREF(globals);
828 Py_XDECREF(__builtins__);
829 Py_XDECREF(__import__);
830 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000831}
832
833static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000834whichmodule(PyObject *global, PyObject *global_name)
835{
836 int i, j;
837 PyObject *module = 0, *modules_dict = 0,
838 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000840 module = PyObject_GetAttrString(global, "__module__");
841 if (module) return module;
842 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000844 if (!( modules_dict = PySys_GetObject("modules")))
845 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000847 i = 0;
848 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000850 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000852 global_name_attr = PyObject_GetAttr(module, global_name);
853 if (!global_name_attr) {
854 PyErr_Clear();
855 continue;
856 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000858 if (global_name_attr != global) {
859 Py_DECREF(global_name_attr);
860 continue;
861 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000863 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000865 break;
866 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000868 /* The following implements the rule in pickle.py added in 1.5
869 that used __main__ if no module is found. I don't actually
870 like this rule. jlf
871 */
872 if (!j) {
873 j=1;
874 name=__main___str;
875 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000877 Py_INCREF(name);
878 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000879}
880
881
Guido van Rossum60456fd1997-04-09 17:36:32 +0000882static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000883fast_save_enter(Picklerobject *self, PyObject *obj)
884{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000885 /* if fast_container < 0, we're doing an error exit. */
886 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
887 PyObject *key = NULL;
888 if (self->fast_memo == NULL) {
889 self->fast_memo = PyDict_New();
890 if (self->fast_memo == NULL) {
891 self->fast_container = -1;
892 return 0;
893 }
894 }
895 key = PyLong_FromVoidPtr(obj);
896 if (key == NULL)
897 return 0;
898 if (PyDict_GetItem(self->fast_memo, key)) {
899 PyErr_Format(PyExc_ValueError,
900 "fast mode: can't pickle cyclic objects including object type %s at %p",
901 obj->ob_type->tp_name, obj);
902 self->fast_container = -1;
903 return 0;
904 }
905 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
906 self->fast_container = -1;
907 return 0;
908 }
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000909 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000910 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000911}
912
913int
914fast_save_leave(Picklerobject *self, PyObject *obj)
915{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000916 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
917 PyObject *key = PyLong_FromVoidPtr(obj);
918 if (key == NULL)
919 return 0;
920 if (PyDict_DelItem(self->fast_memo, key) < 0) {
921 return 0;
922 }
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000923 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000924 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000925}
926
927static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000928save_none(Picklerobject *self, PyObject *args)
929{
930 static char none = NONE;
931 if ((*self->write_func)(self, &none, 1) < 0)
932 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000934 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000935}
936
Guido van Rossum77f6a652002-04-03 22:41:51 +0000937static int
938save_bool(Picklerobject *self, PyObject *args)
939{
Guido van Rossume2763392002-04-05 19:30:08 +0000940 static char *buf[2] = {FALSE, TRUE};
941 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000942 long l = PyInt_AS_LONG((PyIntObject *)args);
943
Guido van Rossume2763392002-04-05 19:30:08 +0000944 if ((*self->write_func)(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000945 return -1;
946
947 return 0;
948}
Tim Peters84e87f32001-03-17 04:50:51 +0000949
Guido van Rossum60456fd1997-04-09 17:36:32 +0000950static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000951save_int(Picklerobject *self, PyObject *args)
952{
953 char c_str[32];
954 long l = PyInt_AS_LONG((PyIntObject *)args);
955 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000957 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000958#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000959 || l > 0x7fffffffL
960 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000961#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000962 ) {
963 /* Text-mode pickle, or long too big to fit in the 4-byte
964 * signed BININT format: store as a string.
965 */
966 c_str[0] = INT;
967 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
968 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
969 return -1;
970 }
971 else {
972 /* Binary pickle and l fits in a signed 4-byte int. */
973 c_str[1] = (int)( l & 0xff);
974 c_str[2] = (int)((l >> 8) & 0xff);
975 c_str[3] = (int)((l >> 16) & 0xff);
976 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000977
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000978 if ((c_str[4] == 0) && (c_str[3] == 0)) {
979 if (c_str[2] == 0) {
980 c_str[0] = BININT1;
981 len = 2;
982 }
983 else {
984 c_str[0] = BININT2;
985 len = 3;
986 }
987 }
988 else {
989 c_str[0] = BININT;
990 len = 5;
991 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000993 if ((*self->write_func)(self, c_str, len) < 0)
994 return -1;
995 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000997 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000998}
999
1000
1001static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001002save_long(Picklerobject *self, PyObject *args)
1003{
1004 int size, res = -1;
1005 PyObject *repr = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001007 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001009 if (!( repr = PyObject_Repr(args)))
1010 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001012 if ((size = PyString_Size(repr)) < 0)
1013 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001014
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001015 if ((*self->write_func)(self, &l, 1) < 0)
1016 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001018 if ((*self->write_func)(self,
1019 PyString_AS_STRING((PyStringObject *)repr),
1020 size) < 0)
1021 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001023 if ((*self->write_func)(self, "\n", 1) < 0)
1024 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001026 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001027
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001028 finally:
1029 Py_XDECREF(repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001031 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001032}
1033
1034
1035static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001036save_float(Picklerobject *self, PyObject *args)
1037{
1038 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001039
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001040 if (self->bin) {
1041 int s, e;
1042 double f;
1043 long fhi, flo;
1044 char str[9];
1045 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001046
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001047 *p = BINFLOAT;
1048 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001050 if (x < 0) {
1051 s = 1;
1052 x = -x;
1053 }
1054 else
1055 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001057 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001059 /* Normalize f to be in the range [1.0, 2.0) */
1060 if (0.5 <= f && f < 1.0) {
1061 f *= 2.0;
1062 e--;
1063 }
1064 else if (f == 0.0) {
1065 e = 0;
1066 }
1067 else {
1068 PyErr_SetString(PyExc_SystemError,
1069 "frexp() result out of range");
1070 return -1;
1071 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001073 if (e >= 1024) {
1074 /* XXX 1024 itself is reserved for Inf/NaN */
1075 PyErr_SetString(PyExc_OverflowError,
1076 "float too large to pack with d format");
1077 return -1;
1078 }
1079 else if (e < -1022) {
1080 /* Gradual underflow */
1081 f = ldexp(f, 1022 + e);
1082 e = 0;
1083 }
1084 else if (!(e == 0 && f == 0.0)) {
1085 e += 1023;
1086 f -= 1.0; /* Get rid of leading 1 */
1087 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001089 /* fhi receives the high 28 bits;
1090 flo the low 24 bits (== 52 bits) */
1091 f *= 268435456.0; /* 2**28 */
1092 fhi = (long) floor(f); /* Truncate */
1093 f -= (double)fhi;
1094 f *= 16777216.0; /* 2**24 */
1095 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001097 /* First byte */
1098 *p = (s<<7) | (e>>4);
1099 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001101 /* Second byte */
1102 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1103 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001105 /* Third byte */
1106 *p = (unsigned char) ((fhi>>16) & 0xFF);
1107 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001109 /* Fourth byte */
1110 *p = (unsigned char) ((fhi>>8) & 0xFF);
1111 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001113 /* Fifth byte */
1114 *p = (unsigned char) (fhi & 0xFF);
1115 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001117 /* Sixth byte */
1118 *p = (unsigned char) ((flo>>16) & 0xFF);
1119 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001121 /* Seventh byte */
1122 *p = (unsigned char) ((flo>>8) & 0xFF);
1123 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001125 /* Eighth byte */
1126 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001128 if ((*self->write_func)(self, str, 9) < 0)
1129 return -1;
1130 }
1131 else {
1132 char c_str[250];
1133 c_str[0] = FLOAT;
1134 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001136 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1137 return -1;
1138 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001140 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001141}
1142
1143
1144static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001145save_string(Picklerobject *self, PyObject *args, int doput)
1146{
1147 int size, len;
1148 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001150 if ((size = PyString_Size(args)) < 0)
1151 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001153 if (!self->bin) {
1154 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001156 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001158 if (!( repr = PyObject_Repr(args)))
1159 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001161 if ((len = PyString_Size(repr)) < 0)
1162 goto err;
1163 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001165 if ((*self->write_func)(self, &string, 1) < 0)
1166 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001168 if ((*self->write_func)(self, repr_str, len) < 0)
1169 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001170
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001171 if ((*self->write_func)(self, "\n", 1) < 0)
1172 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001174 Py_XDECREF(repr);
1175 }
1176 else {
1177 int i;
1178 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001180 if ((size = PyString_Size(args)) < 0)
1181 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001183 if (size < 256) {
1184 c_str[0] = SHORT_BINSTRING;
1185 c_str[1] = size;
1186 len = 2;
1187 }
1188 else {
1189 c_str[0] = BINSTRING;
1190 for (i = 1; i < 5; i++)
1191 c_str[i] = (int)(size >> ((i - 1) * 8));
1192 len = 5;
1193 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195 if ((*self->write_func)(self, c_str, len) < 0)
1196 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001198 if (size > 128 && Pdata_Check(self->file)) {
1199 if (write_other(self, NULL, 0) < 0) return -1;
1200 PDATA_APPEND(self->file, args, -1);
1201 }
1202 else {
1203 if ((*self->write_func)(self,
1204 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1205 return -1;
1206 }
1207 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001209 if (doput)
1210 if (put(self, args) < 0)
1211 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001213 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001215 err:
1216 Py_XDECREF(repr);
1217 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001218}
1219
1220
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001221#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001222/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1223 backslash and newline characters to \uXXXX escapes. */
1224static PyObject *
1225modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1226{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001227 PyObject *repr;
1228 char *p;
1229 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001231 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001233 repr = PyString_FromStringAndSize(NULL, 6 * size);
1234 if (repr == NULL)
1235 return NULL;
1236 if (size == 0)
1237 return repr;
1238
1239 p = q = PyString_AS_STRING(repr);
1240 while (size-- > 0) {
1241 Py_UNICODE ch = *s++;
1242 /* Map 16-bit characters to '\uxxxx' */
1243 if (ch >= 256 || ch == '\\' || ch == '\n') {
1244 *p++ = '\\';
1245 *p++ = 'u';
1246 *p++ = hexdigit[(ch >> 12) & 0xf];
1247 *p++ = hexdigit[(ch >> 8) & 0xf];
1248 *p++ = hexdigit[(ch >> 4) & 0xf];
1249 *p++ = hexdigit[ch & 15];
1250 }
1251 /* Copy everything else as-is */
1252 else
1253 *p++ = (char) ch;
1254 }
1255 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001256 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001257 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001258}
1259
1260
Guido van Rossum60456fd1997-04-09 17:36:32 +00001261static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001262save_unicode(Picklerobject *self, PyObject *args, int doput)
1263{
1264 int size, len;
1265 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001267 if (!PyUnicode_Check(args))
1268 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001270 if (!self->bin) {
1271 char *repr_str;
1272 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001273
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001274 repr = modified_EncodeRawUnicodeEscape(
1275 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
1276 if (!repr)
1277 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001279 if ((len = PyString_Size(repr)) < 0)
1280 goto err;
1281 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001283 if ((*self->write_func)(self, &string, 1) < 0)
1284 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001286 if ((*self->write_func)(self, repr_str, len) < 0)
1287 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001289 if ((*self->write_func)(self, "\n", 1) < 0)
1290 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001292 Py_XDECREF(repr);
1293 }
1294 else {
1295 int i;
1296 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001298 if (!( repr = PyUnicode_AsUTF8String(args)))
1299 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001301 if ((size = PyString_Size(repr)) < 0)
1302 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001304 c_str[0] = BINUNICODE;
1305 for (i = 1; i < 5; i++)
1306 c_str[i] = (int)(size >> ((i - 1) * 8));
1307 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001309 if ((*self->write_func)(self, c_str, len) < 0)
1310 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001312 if (size > 128 && Pdata_Check(self->file)) {
1313 if (write_other(self, NULL, 0) < 0)
1314 goto err;
1315 PDATA_APPEND(self->file, repr, -1);
1316 }
1317 else {
1318 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1319 size) < 0)
1320 goto err;
1321 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001322
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001323 Py_DECREF(repr);
1324 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001326 if (doput)
1327 if (put(self, args) < 0)
1328 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001330 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001332 err:
1333 Py_XDECREF(repr);
1334 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001335}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001336#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001337
1338
1339static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001340save_tuple(Picklerobject *self, PyObject *args)
1341{
1342 PyObject *element = 0, *py_tuple_id = 0;
1343 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001344
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001345 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001347 if ((*self->write_func)(self, &MARKv, 1) < 0)
1348 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001350 if ((len = PyTuple_Size(args)) < 0)
1351 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001353 for (i = 0; i < len; i++) {
1354 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
1355 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001357 if (save(self, element, 0) < 0)
1358 goto finally;
1359 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001361 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
1362 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001364 if (len) {
1365 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1366 if (self->bin) {
1367 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001369 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1370 goto finally;
1371 }
1372 else {
1373 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001375 for (i = 0; i <= len; i++) {
1376 if ((*self->write_func)(self, &pop, 1) < 0)
1377 goto finally;
1378 }
1379 }
Tim Peters84e87f32001-03-17 04:50:51 +00001380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001381 if (get(self, py_tuple_id) < 0)
1382 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001384 res = 0;
1385 goto finally;
1386 }
1387 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001389 if ((*self->write_func)(self, &tuple, 1) < 0) {
1390 goto finally;
1391 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001393 if (put(self, args) < 0)
1394 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001396 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001398 finally:
1399 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001401 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001402}
1403
1404static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001405save_empty_tuple(Picklerobject *self, PyObject *args)
1406{
1407 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001409 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001410}
1411
1412
1413static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001414save_list(Picklerobject *self, PyObject *args)
1415{
1416 PyObject *element = 0;
1417 int s_len, len, i, using_appends, res = -1;
1418 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001420 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001422 if (self->fast && !fast_save_enter(self, args))
1423 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001425 if (self->bin) {
1426 s[0] = EMPTY_LIST;
1427 s_len = 1;
1428 }
1429 else {
1430 s[0] = MARK;
1431 s[1] = LIST;
1432 s_len = 2;
1433 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001435 if ((len = PyList_Size(args)) < 0)
1436 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001438 if ((*self->write_func)(self, s, s_len) < 0)
1439 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001441 if (len == 0) {
1442 if (put(self, args) < 0)
1443 goto finally;
1444 }
1445 else {
1446 if (put2(self, args) < 0)
1447 goto finally;
1448 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001450 if ((using_appends = (self->bin && (len > 1))))
1451 if ((*self->write_func)(self, &MARKv, 1) < 0)
1452 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001454 for (i = 0; i < len; i++) {
1455 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
1456 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001458 if (save(self, element, 0) < 0)
1459 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001461 if (!using_appends) {
1462 if ((*self->write_func)(self, &append, 1) < 0)
1463 goto finally;
1464 }
1465 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001467 if (using_appends) {
1468 if ((*self->write_func)(self, &appends, 1) < 0)
1469 goto finally;
1470 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001472 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001474 finally:
1475 if (self->fast && !fast_save_leave(self, args))
1476 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001478 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001479}
1480
1481
Guido van Rossum60456fd1997-04-09 17:36:32 +00001482static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001483save_dict(Picklerobject *self, PyObject *args)
1484{
1485 PyObject *key = 0, *value = 0;
1486 int i, len, res = -1, using_setitems;
1487 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001489 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001491 if (self->fast && !fast_save_enter(self, args))
1492 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001494 if (self->bin) {
1495 s[0] = EMPTY_DICT;
1496 len = 1;
1497 }
1498 else {
1499 s[0] = MARK;
1500 s[1] = DICT;
1501 len = 2;
1502 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001504 if ((*self->write_func)(self, s, len) < 0)
1505 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001507 if ((len = PyDict_Size(args)) < 0)
1508 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001510 if (len == 0) {
1511 if (put(self, args) < 0)
1512 goto finally;
1513 }
1514 else {
1515 if (put2(self, args) < 0)
1516 goto finally;
1517 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001519 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1520 if ((*self->write_func)(self, &MARKv, 1) < 0)
1521 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001523 i = 0;
1524 while (PyDict_Next(args, &i, &key, &value)) {
1525 if (save(self, key, 0) < 0)
1526 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001528 if (save(self, value, 0) < 0)
1529 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001531 if (!using_setitems) {
1532 if ((*self->write_func)(self, &setitem, 1) < 0)
1533 goto finally;
1534 }
1535 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001537 if (using_setitems) {
1538 if ((*self->write_func)(self, &setitems, 1) < 0)
1539 goto finally;
1540 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001542 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001544 finally:
1545 if (self->fast && !fast_save_leave(self, args))
1546 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001548 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001549}
1550
1551
Tim Peters84e87f32001-03-17 04:50:51 +00001552static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001553save_inst(Picklerobject *self, PyObject *args)
1554{
1555 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1556 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1557 char *module_str, *name_str;
1558 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001560 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001562 if (self->fast && !fast_save_enter(self, args))
1563 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001565 if ((*self->write_func)(self, &MARKv, 1) < 0)
1566 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001568 if (!( class = PyObject_GetAttr(args, __class___str)))
1569 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001571 if (self->bin) {
1572 if (save(self, class, 0) < 0)
1573 goto finally;
1574 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001576 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1577 PyObject *element = 0;
1578 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001580 if (!( class_args =
1581 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
1582 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001583
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001584 if ((len = PyObject_Size(class_args)) < 0)
1585 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001587 for (i = 0; i < len; i++) {
1588 if (!( element = PySequence_GetItem(class_args, i)))
1589 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001591 if (save(self, element, 0) < 0) {
1592 Py_DECREF(element);
1593 goto finally;
1594 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001596 Py_DECREF(element);
1597 }
1598 }
1599 else {
1600 PyErr_Clear();
1601 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001603 if (!self->bin) {
1604 if (!( name = ((PyClassObject *)class)->cl_name )) {
1605 PyErr_SetString(PicklingError, "class has no name");
1606 goto finally;
1607 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001609 if (!( module = whichmodule(class, name)))
1610 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001611
Tim Peters84e87f32001-03-17 04:50:51 +00001612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001613 if ((module_size = PyString_Size(module)) < 0 ||
1614 (name_size = PyString_Size(name)) < 0)
1615 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001617 module_str = PyString_AS_STRING((PyStringObject *)module);
1618 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001619
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001620 if ((*self->write_func)(self, &inst, 1) < 0)
1621 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001622
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001623 if ((*self->write_func)(self, module_str, module_size) < 0)
1624 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001626 if ((*self->write_func)(self, "\n", 1) < 0)
1627 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001629 if ((*self->write_func)(self, name_str, name_size) < 0)
1630 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001632 if ((*self->write_func)(self, "\n", 1) < 0)
1633 goto finally;
1634 }
1635 else if ((*self->write_func)(self, &obj, 1) < 0) {
1636 goto finally;
1637 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001639 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1640 state = PyObject_Call(getstate_func, empty_tuple, NULL);
1641 if (!state)
1642 goto finally;
1643 }
1644 else {
1645 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001647 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1648 PyErr_Clear();
1649 res = 0;
1650 goto finally;
1651 }
1652 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001654 if (!PyDict_Check(state)) {
1655 if (put2(self, args) < 0)
1656 goto finally;
1657 }
1658 else {
1659 if (put(self, args) < 0)
1660 goto finally;
1661 }
Tim Peters84e87f32001-03-17 04:50:51 +00001662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001663 if (save(self, state, 0) < 0)
1664 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001666 if ((*self->write_func)(self, &build, 1) < 0)
1667 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001669 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001671 finally:
1672 if (self->fast && !fast_save_leave(self, args))
1673 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001675 Py_XDECREF(module);
1676 Py_XDECREF(class);
1677 Py_XDECREF(state);
1678 Py_XDECREF(getinitargs_func);
1679 Py_XDECREF(getstate_func);
1680 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001681
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001682 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001683}
1684
1685
Guido van Rossum60456fd1997-04-09 17:36:32 +00001686static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001687save_global(Picklerobject *self, PyObject *args, PyObject *name)
1688{
1689 PyObject *global_name = 0, *module = 0, *mod = 0, *moddict = 0, *klass = 0;
1690 char *name_str, *module_str;
1691 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001693 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001695 if (name) {
1696 global_name = name;
1697 Py_INCREF(global_name);
1698 }
1699 else {
1700 if (!( global_name = PyObject_GetAttr(args, __name___str)))
1701 goto finally;
1702 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001704 if (!( module = whichmodule(args, global_name)))
1705 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001707 if ((module_size = PyString_Size(module)) < 0 ||
1708 (name_size = PyString_Size(global_name)) < 0)
1709 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001711 module_str = PyString_AS_STRING((PyStringObject *)module);
1712 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001714 mod = PyImport_ImportModule(module_str);
1715 if (mod == NULL) {
1716 /* Py_ErrClear(); ?? */
1717 cPickle_ErrFormat(PicklingError,
1718 "Can't pickle %s: it's not found as %s.%s",
1719 "OSS", args, module, global_name);
1720 goto finally;
1721 }
1722 /* borrowed ref */
1723 moddict = PyModule_GetDict(mod);
1724 /* borrowed ref */
1725 klass = PyDict_GetItemString(moddict, name_str);
1726 if (klass == NULL) {
1727 cPickle_ErrFormat(PicklingError,
1728 "Can't pickle %s: it's not found as %s.%s",
1729 "OSS", args, module, global_name);
1730 goto finally;
1731 }
1732 if (klass != args) {
1733 cPickle_ErrFormat(PicklingError,
1734 "Can't pickle %s: it's not the same object as %s.%s",
1735 "OSS", args, module, global_name);
1736 goto finally;
1737 }
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öwis2f6ef4c2002-04-01 17:40:08 +00001871 if (!pers_save && self->pers_func) {
1872 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1873 res = tmp;
1874 goto finally;
1875 }
1876 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001878 if (args == Py_None) {
1879 res = save_none(self, args);
1880 goto finally;
1881 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001883 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001885 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001886 case 'b':
1887 if (args == Py_False || args == Py_True) {
1888 res = save_bool(self, args);
1889 goto finally;
1890 }
1891 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001892 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001893 if (type == &PyInt_Type) {
1894 res = save_int(self, args);
1895 goto finally;
1896 }
1897 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001898
Guido van Rossum60456fd1997-04-09 17:36:32 +00001899 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001900 if (type == &PyLong_Type) {
1901 res = save_long(self, args);
1902 goto finally;
1903 }
1904 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001905
Guido van Rossum60456fd1997-04-09 17:36:32 +00001906 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001907 if (type == &PyFloat_Type) {
1908 res = save_float(self, args);
1909 goto finally;
1910 }
1911 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001912
Guido van Rossum60456fd1997-04-09 17:36:32 +00001913 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001914 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
1915 if (self->bin) res = save_empty_tuple(self, args);
1916 else res = save_tuple(self, args);
1917 goto finally;
1918 }
1919 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001920
Guido van Rossum60456fd1997-04-09 17:36:32 +00001921 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001922 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
1923 res = save_string(self, args, 0);
1924 goto finally;
1925 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001926
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001927#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001928 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001929 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1930 res = save_unicode(self, args, 0);
1931 goto finally;
1932 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001933#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001934 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001936 if (args->ob_refcnt > 1) {
1937 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
1938 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001940 if (PyDict_GetItem(self->memo, py_ob_id)) {
1941 if (get(self, py_ob_id) < 0)
1942 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001944 res = 0;
1945 goto finally;
1946 }
1947 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001949 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001950 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001951 if (type == &PyString_Type) {
1952 res = save_string(self, args, 1);
1953 goto finally;
1954 }
1955 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001956
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001957#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001958 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001959 if (type == &PyUnicode_Type) {
1960 res = save_unicode(self, args, 1);
1961 goto finally;
1962 }
1963 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001964#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001965
Guido van Rossum60456fd1997-04-09 17:36:32 +00001966 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001967 if (type == &PyTuple_Type) {
1968 res = save_tuple(self, args);
1969 goto finally;
1970 }
1971 if (type == &PyType_Type) {
1972 res = save_global(self, args, NULL);
1973 goto finally;
1974 }
1975 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001976
Guido van Rossum60456fd1997-04-09 17:36:32 +00001977 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001978 if (type == &PyList_Type) {
1979 res = save_list(self, args);
1980 goto finally;
1981 }
1982 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001983
1984 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001985 if (type == &PyDict_Type) {
1986 res = save_dict(self, args);
1987 goto finally;
1988 }
1989 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001990
1991 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001992 if (type == &PyInstance_Type) {
1993 res = save_inst(self, args);
1994 goto finally;
1995 }
1996 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001997
1998 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001999 if (type == &PyClass_Type) {
2000 res = save_global(self, args, NULL);
2001 goto finally;
2002 }
2003 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002004
2005 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002006 if (type == &PyFunction_Type) {
2007 res = save_global(self, args, NULL);
2008 goto finally;
2009 }
2010 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002011
2012 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002013 if (type == &PyCFunction_Type) {
2014 res = save_global(self, args, NULL);
2015 goto finally;
2016 }
2017 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002019 if (PyType_IsSubtype(type, &PyType_Type)) {
2020 res = save_global(self, args, NULL);
2021 goto finally;
2022 }
Guido van Rossum950dce62001-12-19 16:56:54 +00002023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002024 if (!pers_save && self->inst_pers_func) {
2025 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2026 res = tmp;
2027 goto finally;
2028 }
2029 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002031 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2032 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002034 Py_INCREF(args);
2035 ARG_TUP(self, args);
2036 if (self->arg) {
2037 t = PyObject_Call(__reduce__, self->arg, NULL);
2038 FREE_ARG_TUP(self);
2039 }
2040 if (! t) goto finally;
2041 }
2042 else {
2043 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002045 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2046 t = PyObject_Call(__reduce__, empty_tuple, NULL);
2047 if (!t)
2048 goto finally;
2049 }
2050 else {
2051 PyErr_Clear();
2052 }
2053 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002055 if (t) {
2056 if (PyString_Check(t)) {
2057 res = save_global(self, args, t);
2058 goto finally;
2059 }
Tim Peters84e87f32001-03-17 04:50:51 +00002060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002061 if (!PyTuple_Check(t)) {
2062 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2063 "be a tuple", "O", __reduce__);
2064 goto finally;
2065 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002067 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002069 if ((size != 3) && (size != 2)) {
2070 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2071 "contain only two or three elements", "O", __reduce__);
2072 goto finally;
2073 }
Tim Peters84e87f32001-03-17 04:50:51 +00002074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002075 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002077 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002079 if (size > 2) {
2080 state = PyTuple_GET_ITEM(t, 2);
2081 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002083 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2084 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2085 "returned by %s must be a tuple", "O", __reduce__);
2086 goto finally;
2087 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002089 res = save_reduce(self, callable, arg_tup, state, args);
2090 goto finally;
2091 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002093 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002095 finally:
2096 Py_XDECREF(py_ob_id);
2097 Py_XDECREF(__reduce__);
2098 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002100 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002101}
2102
2103
2104static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002105dump(Picklerobject *self, PyObject *args)
2106{
2107 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002109 if (save(self, args, 0) < 0)
2110 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002112 if ((*self->write_func)(self, &stop, 1) < 0)
2113 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002115 if ((*self->write_func)(self, NULL, 0) < 0)
2116 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002117
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002118 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002119}
2120
2121static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002122Pickle_clear_memo(Picklerobject *self, PyObject *args)
2123{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002124 if (self->memo)
2125 PyDict_Clear(self->memo);
2126 Py_INCREF(Py_None);
2127 return Py_None;
2128}
2129
2130static PyObject *
2131Pickle_getvalue(Picklerobject *self, PyObject *args)
2132{
2133 int l, i, rsize, ssize, clear=1, lm;
2134 long ik;
2135 PyObject *k, *r;
2136 char *s, *p, *have_get;
2137 Pdata *data;
2138
2139 /* Can be called by Python code or C code */
2140 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2141 return NULL;
2142
2143 /* Check to make sure we are based on a list */
2144 if (! Pdata_Check(self->file)) {
2145 PyErr_SetString(PicklingError,
2146 "Attempt to getvalue() a non-list-based pickler");
2147 return NULL;
2148 }
2149
2150 /* flush write buffer */
2151 if (write_other(self, NULL, 0) < 0) return NULL;
2152
2153 data=(Pdata*)self->file;
2154 l=data->length;
2155
2156 /* set up an array to hold get/put status */
2157 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2158 lm++;
2159 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2160 memset(have_get,0,lm);
2161
2162 /* Scan for gets. */
2163 for (rsize=0, i=l; --i >= 0; ) {
2164 k=data->data[i];
2165
2166 if (PyString_Check(k)) {
2167 rsize += PyString_GET_SIZE(k);
2168 }
2169
2170 else if (PyInt_Check(k)) { /* put */
2171 ik=PyInt_AS_LONG((PyIntObject*)k);
2172 if (ik >= lm || ik==0) {
2173 PyErr_SetString(PicklingError,
2174 "Invalid get data");
2175 return NULL;
2176 }
2177 if (have_get[ik]) { /* with matching get */
2178 if (ik < 256) rsize += 2;
2179 else rsize+=5;
2180 }
2181 }
2182
2183 else if (! (PyTuple_Check(k) &&
2184 PyTuple_GET_SIZE(k) == 2 &&
2185 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2186 ) {
2187 PyErr_SetString(PicklingError,
2188 "Unexpected data in internal list");
2189 return NULL;
2190 }
2191
2192 else { /* put */
2193 ik=PyInt_AS_LONG((PyIntObject*)k);
2194 if (ik >= lm || ik==0) {
2195 PyErr_SetString(PicklingError,
2196 "Invalid get data");
2197 return NULL;
2198 }
2199 have_get[ik]=1;
2200 if (ik < 256) rsize += 2;
2201 else rsize+=5;
2202 }
2203
2204 }
2205
2206 /* Now generate the result */
2207 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2208 s=PyString_AS_STRING((PyStringObject*)r);
2209
2210 for (i=0; i<l; i++) {
2211 k=data->data[i];
2212
2213 if (PyString_Check(k)) {
2214 ssize=PyString_GET_SIZE(k);
2215 if (ssize) {
2216 p=PyString_AS_STRING((PyStringObject*)k);
2217 while (--ssize >= 0) *s++=*p++;
2218 }
2219 }
2220
2221 else if (PyTuple_Check(k)) { /* get */
2222 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2223 if (ik < 256) {
2224 *s++ = BINGET;
2225 *s++ = (int)(ik & 0xff);
2226 }
2227 else {
2228 *s++ = LONG_BINGET;
2229 *s++ = (int)(ik & 0xff);
2230 *s++ = (int)((ik >> 8) & 0xff);
2231 *s++ = (int)((ik >> 16) & 0xff);
2232 *s++ = (int)((ik >> 24) & 0xff);
2233 }
2234 }
2235
2236 else { /* put */
2237 ik=PyInt_AS_LONG((PyIntObject*)k);
2238
2239 if (have_get[ik]) { /* with matching get */
2240 if (ik < 256) {
2241 *s++ = BINPUT;
2242 *s++ = (int)(ik & 0xff);
2243 }
2244 else {
2245 *s++ = LONG_BINPUT;
2246 *s++ = (int)(ik & 0xff);
2247 *s++ = (int)((ik >> 8) & 0xff);
2248 *s++ = (int)((ik >> 16) & 0xff);
2249 *s++ = (int)((ik >> 24) & 0xff);
2250 }
2251 }
2252 }
2253
2254 }
2255
2256 if (clear) {
2257 PyDict_Clear(self->memo);
2258 Pdata_clear(data,0);
2259 }
2260
2261 free(have_get);
2262 return r;
2263 err:
2264 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002265 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002266}
2267
2268static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002269Pickler_dump(Picklerobject *self, PyObject *args)
2270{
2271 PyObject *ob;
2272 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002273
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002274 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
2275 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002277 if (dump(self, ob) < 0)
2278 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002280 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002282 /* XXX Why does dump() return self? */
2283 Py_INCREF(self);
2284 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002285}
2286
2287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002288static struct PyMethodDef Pickler_methods[] =
2289{
Neal Norwitzb0493252002-03-31 14:44:22 +00002290 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002291 "dump(object) --"
Fred Drake0ebacc82002-05-01 20:36:39 +00002292 "Write an object in pickle format to the object's pickle stream"},
2293 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002294 "clear_memo() -- Clear the picklers memo"},
Neal Norwitzb0493252002-03-31 14:44:22 +00002295 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Guido van Rossum053b8df1998-11-25 16:18:00 +00002296 "getvalue() -- Finish picking a list-based pickle"},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002297 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002298};
2299
2300
2301static Picklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002302newPicklerobject(PyObject *file, int bin)
2303{
2304 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002306 if (!( self = PyObject_New(Picklerobject, &Picklertype)))
2307 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002309 self->fp = NULL;
2310 self->write = NULL;
2311 self->memo = NULL;
2312 self->arg = NULL;
2313 self->pers_func = NULL;
2314 self->inst_pers_func = NULL;
2315 self->write_buf = NULL;
2316 self->bin = bin;
2317 self->fast = 0;
2318 self->fast_container = 0;
2319 self->fast_memo = NULL;
2320 self->buf_size = 0;
2321 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002322
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002323 if (file)
2324 Py_INCREF(file);
2325 else
2326 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002327
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002328 if (!( self->file = file ))
2329 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002331 if (!( self->memo = PyDict_New()))
2332 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002334 if (PyFile_Check(file)) {
2335 self->fp = PyFile_AsFile(file);
2336 if (self->fp == NULL) {
2337 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2338 goto err;
2339 }
2340 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002341 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002342 else if (PycStringIO_OutputCheck(file)) {
2343 self->write_func = write_cStringIO;
2344 }
2345 else if (file == Py_None) {
2346 self->write_func = write_none;
2347 }
2348 else {
2349 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002351 if (! Pdata_Check(file)) {
2352 self->write = PyObject_GetAttr(file, write_str);
2353 if (!self->write) {
2354 PyErr_Clear();
2355 PyErr_SetString(PyExc_TypeError,
2356 "argument must have 'write' "
2357 "attribute");
2358 goto err;
2359 }
2360 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002362 if (!( self->write_buf =
2363 (char *)malloc(WRITE_BUF_SIZE * sizeof(char)))) {
2364 PyErr_NoMemory();
2365 goto err;
2366 }
2367 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002369 if (PyEval_GetRestricted()) {
2370 /* Restricted execution, get private tables */
2371 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002373 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2374 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2375 Py_DECREF(m);
2376 if (!( self->dispatch_table )) goto err;
2377 }
2378 else {
2379 self->dispatch_table=dispatch_table;
2380 Py_INCREF(dispatch_table);
2381 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002383 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002385 err:
2386 Py_DECREF((PyObject *)self);
2387 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002388}
2389
2390
2391static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002392get_Pickler(PyObject *self, PyObject *args)
2393{
2394 PyObject *file = NULL;
2395 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002397 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
2398 PyErr_Clear();
2399 bin = 0;
2400 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2401 return NULL;
2402 }
2403 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002404}
2405
2406
2407static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002408Pickler_dealloc(Picklerobject *self)
2409{
2410 Py_XDECREF(self->write);
2411 Py_XDECREF(self->memo);
2412 Py_XDECREF(self->fast_memo);
2413 Py_XDECREF(self->arg);
2414 Py_XDECREF(self->file);
2415 Py_XDECREF(self->pers_func);
2416 Py_XDECREF(self->inst_pers_func);
2417 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002419 if (self->write_buf) {
2420 free(self->write_buf);
2421 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002423 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002424}
2425
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002426static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002427Pickler_get_pers_func(Picklerobject *p)
2428{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002429 if (p->pers_func == NULL)
2430 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2431 else
2432 Py_INCREF(p->pers_func);
2433 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002434}
2435
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002436static int
2437Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2438{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002439 if (v == NULL) {
2440 PyErr_SetString(PyExc_TypeError,
2441 "attribute deletion is not supported");
2442 return -1;
2443 }
2444 Py_XDECREF(p->pers_func);
2445 Py_INCREF(v);
2446 p->pers_func = v;
2447 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002448}
2449
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002450static int
2451Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2452{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002453 if (v == NULL) {
2454 PyErr_SetString(PyExc_TypeError,
2455 "attribute deletion is not supported");
2456 return -1;
2457 }
2458 Py_XDECREF(p->inst_pers_func);
2459 Py_INCREF(v);
2460 p->inst_pers_func = v;
2461 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002462}
2463
2464static PyObject *
2465Pickler_get_memo(Picklerobject *p)
2466{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002467 if (p->memo == NULL)
2468 PyErr_SetString(PyExc_AttributeError, "memo");
2469 else
2470 Py_INCREF(p->memo);
2471 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002472}
2473
2474static int
2475Pickler_set_memo(Picklerobject *p, PyObject *v)
2476{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002477 if (v == NULL) {
2478 PyErr_SetString(PyExc_TypeError,
2479 "attribute deletion is not supported");
2480 return -1;
2481 }
2482 if (!PyDict_Check(v)) {
2483 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2484 return -1;
2485 }
2486 Py_XDECREF(p->memo);
2487 Py_INCREF(v);
2488 p->memo = v;
2489 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002490}
2491
2492static PyObject *
2493Pickler_get_error(Picklerobject *p)
2494{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002495 /* why is this an attribute on the Pickler? */
2496 Py_INCREF(PicklingError);
2497 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002498}
2499
2500static PyMemberDef Pickler_members[] = {
2501 {"binary", T_INT, offsetof(Picklerobject, bin)},
2502 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002503 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002504};
2505
2506static PyGetSetDef Pickler_getsets[] = {
2507 {"persistent_id", (getter)Pickler_get_pers_func,
2508 (setter)Pickler_set_pers_func},
2509 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2510 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002511 {"PicklingError", (getter)Pickler_get_error, NULL},
2512 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002513};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002514
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002515PyDoc_STRVAR(Picklertype__doc__,
2516"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002517
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002518static PyTypeObject Picklertype = {
2519 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002520 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002521 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002522 sizeof(Picklerobject), /*tp_basicsize*/
2523 0,
2524 (destructor)Pickler_dealloc, /* tp_dealloc */
2525 0, /* tp_print */
2526 0, /* tp_getattr */
2527 0, /* tp_setattr */
2528 0, /* tp_compare */
2529 0, /* tp_repr */
2530 0, /* tp_as_number */
2531 0, /* tp_as_sequence */
2532 0, /* tp_as_mapping */
2533 0, /* tp_hash */
2534 0, /* tp_call */
2535 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002536 0, /* set below */ /* tp_getattro */
2537 0, /* set below */ /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002538 0, /* tp_as_buffer */
2539 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2540 Picklertype__doc__, /* tp_doc */
2541 0, /* tp_traverse */
2542 0, /* tp_clear */
2543 0, /* tp_richcompare */
2544 0, /* tp_weaklistoffset */
2545 0, /* tp_iter */
2546 0, /* tp_iternext */
2547 Pickler_methods, /* tp_methods */
2548 Pickler_members, /* tp_members */
2549 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002550};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002551
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002552static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002553find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
2554{
2555 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002557 if (fc) {
2558 if (fc==Py_None) {
2559 PyErr_SetString(UnpicklingError,
2560 "Global and instance pickles are not supported.");
2561 return NULL;
2562 }
2563 return PyObject_CallFunction(fc, "OO", py_module_name,
2564 py_global_name);
2565 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002567 module = PySys_GetObject("modules");
2568 if (module == NULL)
2569 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002571 module = PyDict_GetItem(module, py_module_name);
2572 if (module == NULL) {
2573 module = PyImport_Import(py_module_name);
2574 if (!module)
2575 return NULL;
2576 global = PyObject_GetAttr(module, py_global_name);
2577 Py_DECREF(module);
2578 }
2579 else
2580 global = PyObject_GetAttr(module, py_global_name);
2581 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002582}
2583
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002584static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002585marker(Unpicklerobject *self)
2586{
2587 if (self->num_marks < 1) {
2588 PyErr_SetString(UnpicklingError, "could not find MARK");
2589 return -1;
2590 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002592 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002593}
2594
Tim Peters84e87f32001-03-17 04:50:51 +00002595
Guido van Rossum60456fd1997-04-09 17:36:32 +00002596static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002597load_none(Unpicklerobject *self)
2598{
2599 PDATA_APPEND(self->stack, Py_None, -1);
2600 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002601}
2602
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002603static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002604bad_readline(void)
2605{
2606 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2607 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002608}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002609
2610static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002611load_int(Unpicklerobject *self)
2612{
2613 PyObject *py_int = 0;
2614 char *endptr, *s;
2615 int len, res = -1;
2616 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002618 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2619 if (len < 2) return bad_readline();
2620 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002622 errno = 0;
2623 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002625 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2626 /* Hm, maybe we've got something long. Let's try reading
2627 it as a Python long object. */
2628 errno = 0;
2629 py_int = PyLong_FromString(s, NULL, 0);
2630 if (py_int == NULL) {
2631 PyErr_SetString(PyExc_ValueError,
2632 "could not convert string to int");
2633 goto finally;
2634 }
2635 }
2636 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002637 if (len == 3 && (l == 0 || l == 1)) {
2638 if (!( py_int = PyBool_FromLong(l))) goto finally;
2639 }
2640 else {
2641 if (!( py_int = PyInt_FromLong(l))) goto finally;
2642 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002643 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002644
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002645 free(s);
2646 PDATA_PUSH(self->stack, py_int, -1);
2647 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002649 finally:
2650 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002652 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002653}
2654
2655
Tim Peters84e87f32001-03-17 04:50:51 +00002656static long
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002657calc_binint(char *s, int x)
2658{
2659 unsigned char c;
2660 int i;
2661 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002663 for (i = 0, l = 0L; i < x; i++) {
2664 c = (unsigned char)s[i];
2665 l |= (long)c << (i * 8);
2666 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002667#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002668 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2669 * is signed, so on a box with longs bigger than 4 bytes we need
2670 * to extend a BININT's sign bit to the full width.
2671 */
2672 if (x == 4 && l & (1L << 31))
2673 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002674#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002675 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002676}
2677
2678
2679static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002680load_binintx(Unpicklerobject *self, char *s, int x)
2681{
2682 PyObject *py_int = 0;
2683 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002685 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002687 if (!( py_int = PyInt_FromLong(l)))
2688 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002690 PDATA_PUSH(self->stack, py_int, -1);
2691 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002692}
2693
2694
2695static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002696load_binint(Unpicklerobject *self)
2697{
2698 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002700 if ((*self->read_func)(self, &s, 4) < 0)
2701 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002703 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002704}
2705
2706
2707static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002708load_binint1(Unpicklerobject *self)
2709{
2710 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002712 if ((*self->read_func)(self, &s, 1) < 0)
2713 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002715 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002716}
2717
2718
2719static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002720load_binint2(Unpicklerobject *self)
2721{
2722 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002724 if ((*self->read_func)(self, &s, 2) < 0)
2725 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002727 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002728}
Tim Peters84e87f32001-03-17 04:50:51 +00002729
Guido van Rossum60456fd1997-04-09 17:36:32 +00002730static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002731load_long(Unpicklerobject *self)
2732{
2733 PyObject *l = 0;
2734 char *end, *s;
2735 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002737 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2738 if (len < 2) return bad_readline();
2739 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002741 if (!( l = PyLong_FromString(s, &end, 0)))
2742 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002743
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002744 free(s);
2745 PDATA_PUSH(self->stack, l, -1);
2746 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002747
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002748 finally:
2749 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002751 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002752}
2753
Tim Peters84e87f32001-03-17 04:50:51 +00002754
Guido van Rossum60456fd1997-04-09 17:36:32 +00002755static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002756load_float(Unpicklerobject *self)
2757{
2758 PyObject *py_float = 0;
2759 char *endptr, *s;
2760 int len, res = -1;
2761 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002763 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2764 if (len < 2) return bad_readline();
2765 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002767 errno = 0;
2768 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002770 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2771 PyErr_SetString(PyExc_ValueError,
2772 "could not convert string to float");
2773 goto finally;
2774 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002776 if (!( py_float = PyFloat_FromDouble(d)))
2777 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002779 free(s);
2780 PDATA_PUSH(self->stack, py_float, -1);
2781 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002783 finally:
2784 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002786 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002787}
2788
Guido van Rossum60456fd1997-04-09 17:36:32 +00002789static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002790load_binfloat(Unpicklerobject *self)
2791{
2792 PyObject *py_float = 0;
2793 int s, e;
2794 long fhi, flo;
2795 double x;
2796 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002798 if ((*self->read_func)(self, &p, 8) < 0)
2799 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002801 /* First byte */
2802 s = (*p>>7) & 1;
2803 e = (*p & 0x7F) << 4;
2804 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002806 /* Second byte */
2807 e |= (*p>>4) & 0xF;
2808 fhi = (*p & 0xF) << 24;
2809 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002811 /* Third byte */
2812 fhi |= (*p & 0xFF) << 16;
2813 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002815 /* Fourth byte */
2816 fhi |= (*p & 0xFF) << 8;
2817 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002819 /* Fifth byte */
2820 fhi |= *p & 0xFF;
2821 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002823 /* Sixth byte */
2824 flo = (*p & 0xFF) << 16;
2825 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002827 /* Seventh byte */
2828 flo |= (*p & 0xFF) << 8;
2829 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002831 /* Eighth byte */
2832 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002834 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2835 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002837 /* XXX This sadly ignores Inf/NaN */
2838 if (e == 0)
2839 e = -1022;
2840 else {
2841 x += 1.0;
2842 e -= 1023;
2843 }
2844 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002846 if (s)
2847 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002849 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002851 PDATA_PUSH(self->stack, py_float, -1);
2852 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002853}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002854
2855static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002856load_string(Unpicklerobject *self)
2857{
2858 PyObject *str = 0;
2859 int len, res = -1, nslash;
2860 char *s, q, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002862 static PyObject *eval_dict = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002864 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2865 if (len < 2) return bad_readline();
2866 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002868 /* Check for unquoted quotes (evil strings) */
2869 q=*s;
2870 if (q != '"' && q != '\'') goto insecure;
2871 for (p=s+1, nslash=0; *p; p++) {
2872 if (*p==q && nslash%2==0) break;
2873 if (*p=='\\') nslash++;
2874 else nslash=0;
2875 }
2876 if (*p == q) {
2877 for (p++; *p; p++)
2878 if (*(unsigned char *)p > ' ')
2879 goto insecure;
2880 }
2881 else
2882 goto insecure;
2883 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002885 if (!( eval_dict ))
2886 if (!( eval_dict = Py_BuildValue("{s{}}", "__builtins__")))
2887 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002889 if (!( str = PyRun_String(s, Py_eval_input, eval_dict, eval_dict)))
2890 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002892 free(s);
2893 PDATA_PUSH(self->stack, str, -1);
2894 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002896 finally:
2897 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002898
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002899 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002901 insecure:
2902 free(s);
2903 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2904 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002905}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002906
2907
2908static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002909load_binstring(Unpicklerobject *self)
2910{
2911 PyObject *py_string = 0;
2912 long l;
2913 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002915 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002916
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002917 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002919 if ((*self->read_func)(self, &s, l) < 0)
2920 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002922 if (!( py_string = PyString_FromStringAndSize(s, l)))
2923 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002925 PDATA_PUSH(self->stack, py_string, -1);
2926 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002927}
2928
2929
2930static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002931load_short_binstring(Unpicklerobject *self)
2932{
2933 PyObject *py_string = 0;
2934 unsigned char l;
2935 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002937 if ((*self->read_func)(self, &s, 1) < 0)
2938 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002940 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002942 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002944 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002946 PDATA_PUSH(self->stack, py_string, -1);
2947 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002948}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002949
2950
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002951#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002952static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002953load_unicode(Unpicklerobject *self)
2954{
2955 PyObject *str = 0;
2956 int len, res = -1;
2957 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002959 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2960 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002962 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
2963 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002964
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002965 PDATA_PUSH(self->stack, str, -1);
2966 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002967
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002968 finally:
2969 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002970}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002971#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002972
2973
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002974#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002975static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002976load_binunicode(Unpicklerobject *self)
2977{
2978 PyObject *unicode;
2979 long l;
2980 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002982 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002984 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002986 if ((*self->read_func)(self, &s, l) < 0)
2987 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002988
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002989 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
2990 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002991
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002992 PDATA_PUSH(self->stack, unicode, -1);
2993 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002994}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002995#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002996
2997
2998static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002999load_tuple(Unpicklerobject *self)
3000{
3001 PyObject *tup;
3002 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003004 if ((i = marker(self)) < 0) return -1;
3005 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3006 PDATA_PUSH(self->stack, tup, -1);
3007 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003008}
3009
3010static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003011load_empty_tuple(Unpicklerobject *self)
3012{
3013 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003014
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003015 if (!( tup=PyTuple_New(0))) return -1;
3016 PDATA_PUSH(self->stack, tup, -1);
3017 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003018}
3019
3020static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003021load_empty_list(Unpicklerobject *self)
3022{
3023 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003025 if (!( list=PyList_New(0))) return -1;
3026 PDATA_PUSH(self->stack, list, -1);
3027 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003028}
3029
3030static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003031load_empty_dict(Unpicklerobject *self)
3032{
3033 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003034
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003035 if (!( dict=PyDict_New())) return -1;
3036 PDATA_PUSH(self->stack, dict, -1);
3037 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003038}
3039
3040
3041static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003042load_list(Unpicklerobject *self)
3043{
3044 PyObject *list = 0;
3045 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003046
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003047 if ((i = marker(self)) < 0) return -1;
3048 if (!( list=Pdata_popList(self->stack, i))) return -1;
3049 PDATA_PUSH(self->stack, list, -1);
3050 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003051}
3052
3053static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003054load_dict(Unpicklerobject *self)
3055{
3056 PyObject *dict, *key, *value;
3057 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003059 if ((i = marker(self)) < 0) return -1;
3060 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003062 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003064 for (k = i+1; k < j; k += 2) {
3065 key =self->stack->data[k-1];
3066 value=self->stack->data[k ];
3067 if (PyDict_SetItem(dict, key, value) < 0) {
3068 Py_DECREF(dict);
3069 return -1;
3070 }
3071 }
3072 Pdata_clear(self->stack, i);
3073 PDATA_PUSH(self->stack, dict, -1);
3074 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003075}
3076
3077static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003078Instance_New(PyObject *cls, PyObject *args)
3079{
3080 int has_key;
3081 PyObject *safe=0, *r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003083 if (PyClass_Check(cls)) {
3084 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003086 if ((l=PyObject_Size(args)) < 0) goto err;
3087 if (!( l )) {
3088 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003089
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003090 __getinitargs__ = PyObject_GetAttr(cls,
3091 __getinitargs___str);
3092 if (!__getinitargs__) {
3093 /* We have a class with no __getinitargs__,
3094 so bypass usual construction */
3095 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003097 PyErr_Clear();
3098 if (!( inst=PyInstance_NewRaw(cls, NULL)))
3099 goto err;
3100 return inst;
3101 }
3102 Py_DECREF(__getinitargs__);
3103 }
Tim Peters84e87f32001-03-17 04:50:51 +00003104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003105 if ((r=PyInstance_New(cls, args, NULL))) return r;
3106 else goto err;
3107 }
Tim Peters84e87f32001-03-17 04:50:51 +00003108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003109 /* Is safe_constructors always a dict? */
3110 has_key = cPickle_PyMapping_HasKey(safe_constructors, cls);
3111 if (!has_key) {
3112 safe = PyObject_GetAttr(cls, __safe_for_unpickling___str);
3113 if (!safe ||
3114 !PyObject_IsTrue(safe)) {
3115 cPickle_ErrFormat(UnpicklingError,
3116 "%s is not safe for unpickling",
3117 "O", cls);
3118 Py_XDECREF(safe);
3119 return NULL;
3120 }
3121 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003123 if (args==Py_None) {
3124 /* Special case, call cls.__basicnew__() */
3125 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003127 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3128 if (!basicnew) return NULL;
3129 r=PyObject_CallObject(basicnew, NULL);
3130 Py_DECREF(basicnew);
3131 if (r) return r;
3132 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003134 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003136 err:
3137 {
3138 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003140 PyErr_Fetch(&tp, &v, &tb);
3141 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3142 Py_XDECREF(v);
3143 v=r;
3144 }
3145 PyErr_Restore(tp,v,tb);
3146 }
3147 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003148}
Tim Peters84e87f32001-03-17 04:50:51 +00003149
Guido van Rossum60456fd1997-04-09 17:36:32 +00003150
3151static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003152load_obj(Unpicklerobject *self)
3153{
3154 PyObject *class, *tup, *obj=0;
3155 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003157 if ((i = marker(self)) < 0) return -1;
3158 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3159 PDATA_POP(self->stack, class);
3160 if (class) {
3161 obj = Instance_New(class, tup);
3162 Py_DECREF(class);
3163 }
3164 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003166 if (! obj) return -1;
3167 PDATA_PUSH(self->stack, obj, -1);
3168 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003169}
3170
3171
3172static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003173load_inst(Unpicklerobject *self)
3174{
3175 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3176 int i, len;
3177 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003179 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003181 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3182 if (len < 2) return bad_readline();
3183 module_name = PyString_FromStringAndSize(s, len - 1);
3184 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003186 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3187 if (len < 2) return bad_readline();
3188 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3189 class = find_class(module_name, class_name,
3190 self->find_class);
3191 Py_DECREF(class_name);
3192 }
3193 }
3194 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003196 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003198 if ((tup=Pdata_popTuple(self->stack, i))) {
3199 obj = Instance_New(class, tup);
3200 Py_DECREF(tup);
3201 }
3202 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003204 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003206 PDATA_PUSH(self->stack, obj, -1);
3207 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003208}
3209
3210
3211static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003212load_global(Unpicklerobject *self)
3213{
3214 PyObject *class = 0, *module_name = 0, *class_name = 0;
3215 int len;
3216 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003218 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3219 if (len < 2) return bad_readline();
3220 module_name = PyString_FromStringAndSize(s, len - 1);
3221 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003223 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3224 if (len < 2) return bad_readline();
3225 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3226 class = find_class(module_name, class_name,
3227 self->find_class);
3228 Py_DECREF(class_name);
3229 }
3230 }
3231 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003233 if (! class) return -1;
3234 PDATA_PUSH(self->stack, class, -1);
3235 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003236}
3237
3238
3239static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003240load_persid(Unpicklerobject *self)
3241{
3242 PyObject *pid = 0;
3243 int len;
3244 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003245
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003246 if (self->pers_func) {
3247 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3248 if (len < 2) return bad_readline();
3249
3250 pid = PyString_FromStringAndSize(s, len - 1);
3251 if (!pid) return -1;
3252
3253 if (PyList_Check(self->pers_func)) {
3254 if (PyList_Append(self->pers_func, pid) < 0) {
3255 Py_DECREF(pid);
3256 return -1;
3257 }
3258 }
3259 else {
3260 ARG_TUP(self, pid);
3261 if (self->arg) {
3262 pid = PyObject_Call(self->pers_func, self->arg,
3263 NULL);
3264 FREE_ARG_TUP(self);
3265 }
3266 }
3267
3268 if (! pid) return -1;
3269
3270 PDATA_PUSH(self->stack, pid, -1);
3271 return 0;
3272 }
3273 else {
3274 PyErr_SetString(UnpicklingError,
3275 "A load persistent id instruction was encountered,\n"
3276 "but no persistent_load function was specified.");
3277 return -1;
3278 }
3279}
3280
3281static int
3282load_binpersid(Unpicklerobject *self)
3283{
3284 PyObject *pid = 0;
3285
3286 if (self->pers_func) {
3287 PDATA_POP(self->stack, pid);
3288 if (! pid) return -1;
3289
3290 if (PyList_Check(self->pers_func)) {
3291 if (PyList_Append(self->pers_func, pid) < 0) {
3292 Py_DECREF(pid);
3293 return -1;
3294 }
3295 }
3296 else {
3297 ARG_TUP(self, pid);
3298 if (self->arg) {
3299 pid = PyObject_Call(self->pers_func, self->arg,
3300 NULL);
3301 FREE_ARG_TUP(self);
3302 }
3303 if (! pid) return -1;
3304 }
3305
3306 PDATA_PUSH(self->stack, pid, -1);
3307 return 0;
3308 }
3309 else {
3310 PyErr_SetString(UnpicklingError,
3311 "A load persistent id instruction was encountered,\n"
3312 "but no persistent_load function was specified.");
3313 return -1;
3314 }
3315}
3316
3317
3318static int
3319load_pop(Unpicklerobject *self)
3320{
3321 int len;
3322
3323 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3324
3325 /* Note that we split the (pickle.py) stack into two stacks,
3326 an object stack and a mark stack. We have to be clever and
3327 pop the right one. We do this by looking at the top of the
3328 mark stack.
3329 */
3330
3331 if ((self->num_marks > 0) &&
3332 (self->marks[self->num_marks - 1] == len))
3333 self->num_marks--;
3334 else {
3335 len--;
3336 Py_DECREF(self->stack->data[len]);
3337 self->stack->length=len;
3338 }
3339
3340 return 0;
3341}
3342
3343
3344static int
3345load_pop_mark(Unpicklerobject *self)
3346{
3347 int i;
3348
3349 if ((i = marker(self)) < 0)
3350 return -1;
3351
3352 Pdata_clear(self->stack, i);
3353
3354 return 0;
3355}
3356
3357
3358static int
3359load_dup(Unpicklerobject *self)
3360{
3361 PyObject *last;
3362 int len;
3363
3364 if ((len = self->stack->length) <= 0) return stackUnderflow();
3365 last=self->stack->data[len-1];
3366 Py_INCREF(last);
3367 PDATA_PUSH(self->stack, last, -1);
3368 return 0;
3369}
3370
3371
3372static int
3373load_get(Unpicklerobject *self)
3374{
3375 PyObject *py_str = 0, *value = 0;
3376 int len;
3377 char *s;
3378 int rc;
3379
3380 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003381 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003383 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003385 value = PyDict_GetItem(self->memo, py_str);
3386 if (! value) {
3387 PyErr_SetObject(BadPickleGet, py_str);
3388 rc = -1;
3389 } else {
3390 PDATA_APPEND(self->stack, value, -1);
3391 rc = 0;
3392 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003394 Py_DECREF(py_str);
3395 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003396}
3397
3398
3399static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003400load_binget(Unpicklerobject *self)
3401{
3402 PyObject *py_key = 0, *value = 0;
3403 unsigned char key;
3404 char *s;
3405 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003407 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003409 key = (unsigned char)s[0];
3410 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003412 value = PyDict_GetItem(self->memo, py_key);
3413 if (! value) {
3414 PyErr_SetObject(BadPickleGet, py_key);
3415 rc = -1;
3416 } else {
3417 PDATA_APPEND(self->stack, value, -1);
3418 rc = 0;
3419 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003421 Py_DECREF(py_key);
3422 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003423}
3424
3425
3426static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003427load_long_binget(Unpicklerobject *self)
3428{
3429 PyObject *py_key = 0, *value = 0;
3430 unsigned char c;
3431 char *s;
3432 long key;
3433 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003435 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003437 c = (unsigned char)s[0];
3438 key = (long)c;
3439 c = (unsigned char)s[1];
3440 key |= (long)c << 8;
3441 c = (unsigned char)s[2];
3442 key |= (long)c << 16;
3443 c = (unsigned char)s[3];
3444 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003446 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3447
3448 value = PyDict_GetItem(self->memo, py_key);
3449 if (! value) {
3450 PyErr_SetObject(BadPickleGet, py_key);
3451 rc = -1;
3452 } else {
3453 PDATA_APPEND(self->stack, value, -1);
3454 rc = 0;
3455 }
3456
3457 Py_DECREF(py_key);
3458 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003459}
3460
3461
3462static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003463load_put(Unpicklerobject *self)
3464{
3465 PyObject *py_str = 0, *value = 0;
3466 int len, l;
3467 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003469 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3470 if (l < 2) return bad_readline();
3471 if (!( len=self->stack->length )) return stackUnderflow();
3472 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3473 value=self->stack->data[len-1];
3474 l=PyDict_SetItem(self->memo, py_str, value);
3475 Py_DECREF(py_str);
3476 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003477}
3478
3479
3480static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003481load_binput(Unpicklerobject *self)
3482{
3483 PyObject *py_key = 0, *value = 0;
3484 unsigned char key;
3485 char *s;
3486 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003488 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3489 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003491 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003493 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3494 value=self->stack->data[len-1];
3495 len=PyDict_SetItem(self->memo, py_key, value);
3496 Py_DECREF(py_key);
3497 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003498}
3499
3500
3501static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003502load_long_binput(Unpicklerobject *self)
3503{
3504 PyObject *py_key = 0, *value = 0;
3505 long key;
3506 unsigned char c;
3507 char *s;
3508 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003510 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3511 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003513 c = (unsigned char)s[0];
3514 key = (long)c;
3515 c = (unsigned char)s[1];
3516 key |= (long)c << 8;
3517 c = (unsigned char)s[2];
3518 key |= (long)c << 16;
3519 c = (unsigned char)s[3];
3520 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003522 if (!( py_key = PyInt_FromLong(key))) return -1;
3523 value=self->stack->data[len-1];
3524 len=PyDict_SetItem(self->memo, py_key, value);
3525 Py_DECREF(py_key);
3526 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003527}
3528
3529
3530static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003531do_append(Unpicklerobject *self, int x)
3532{
3533 PyObject *value = 0, *list = 0, *append_method = 0;
3534 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003536 len=self->stack->length;
3537 if (!( len >= x && x > 0 )) return stackUnderflow();
3538 /* nothing to do */
3539 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003541 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003543 if (PyList_Check(list)) {
3544 PyObject *slice;
3545 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003546
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003547 slice=Pdata_popList(self->stack, x);
3548 list_len = PyList_GET_SIZE(list);
3549 i=PyList_SetSlice(list, list_len, list_len, slice);
3550 Py_DECREF(slice);
3551 return i;
3552 }
3553 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003555 if (!( append_method = PyObject_GetAttr(list, append_str)))
3556 return -1;
3557
3558 for (i = x; i < len; i++) {
3559 PyObject *junk;
3560
3561 value=self->stack->data[i];
3562 junk=0;
3563 ARG_TUP(self, value);
3564 if (self->arg) {
3565 junk = PyObject_Call(append_method, self->arg,
3566 NULL);
3567 FREE_ARG_TUP(self);
3568 }
3569 if (! junk) {
3570 Pdata_clear(self->stack, i+1);
3571 self->stack->length=x;
3572 Py_DECREF(append_method);
3573 return -1;
3574 }
3575 Py_DECREF(junk);
3576 }
3577 self->stack->length=x;
3578 Py_DECREF(append_method);
3579 }
3580
3581 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003582}
3583
3584
3585static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003586load_append(Unpicklerobject *self)
3587{
3588 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003589}
3590
3591
3592static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003593load_appends(Unpicklerobject *self)
3594{
3595 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003596}
3597
3598
3599static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003600do_setitems(Unpicklerobject *self, int x)
3601{
3602 PyObject *value = 0, *key = 0, *dict = 0;
3603 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003605 if (!( (len=self->stack->length) >= x
3606 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003608 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003610 for (i = x+1; i < len; i += 2) {
3611 key =self->stack->data[i-1];
3612 value=self->stack->data[i ];
3613 if (PyObject_SetItem(dict, key, value) < 0) {
3614 r=-1;
3615 break;
3616 }
3617 }
3618
3619 Pdata_clear(self->stack, x);
3620
3621 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003622}
3623
3624
Tim Peters84e87f32001-03-17 04:50:51 +00003625static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003626load_setitem(Unpicklerobject *self)
3627{
3628 return do_setitems(self, self->stack->length - 2);
3629}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003631static int
3632load_setitems(Unpicklerobject *self)
3633{
3634 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003635}
3636
Tim Peters84e87f32001-03-17 04:50:51 +00003637
Guido van Rossum60456fd1997-04-09 17:36:32 +00003638static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003639load_build(Unpicklerobject *self)
3640{
3641 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3642 *junk = 0, *__setstate__ = 0;
3643 int i, r = 0;
3644
3645 if (self->stack->length < 2) return stackUnderflow();
3646 PDATA_POP(self->stack, value);
3647 if (! value) return -1;
3648 inst=self->stack->data[self->stack->length-1];
3649
3650 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3651 ARG_TUP(self, value);
3652 if (self->arg) {
3653 junk = PyObject_Call(__setstate__, self->arg, NULL);
3654 FREE_ARG_TUP(self);
3655 }
3656 Py_DECREF(__setstate__);
3657 if (! junk) return -1;
3658 Py_DECREF(junk);
3659 return 0;
3660 }
3661
3662 PyErr_Clear();
3663 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3664 i = 0;
3665 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3666 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3667 r=-1;
3668 break;
3669 }
3670 }
3671 Py_DECREF(instdict);
3672 }
3673 else r=-1;
3674
3675 Py_XDECREF(value);
3676
3677 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003678}
3679
3680
3681static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003682load_mark(Unpicklerobject *self)
3683{
3684 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003686 /* Note that we split the (pickle.py) stack into two stacks, an
3687 object stack and a mark stack. Here we push a mark onto the
3688 mark stack.
3689 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003691 if ((self->num_marks + 1) >= self->marks_size) {
3692 s=self->marks_size+20;
3693 if (s <= self->num_marks) s=self->num_marks + 1;
3694 if (self->marks == NULL)
3695 self->marks=(int *)malloc(s * sizeof(int));
3696 else
3697 self->marks=(int *)realloc(self->marks,
3698 s * sizeof(int));
3699 if (! self->marks) {
3700 PyErr_NoMemory();
3701 return -1;
3702 }
3703 self->marks_size = s;
3704 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003706 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003708 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003709}
3710
Guido van Rossum60456fd1997-04-09 17:36:32 +00003711static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003712load_reduce(Unpicklerobject *self)
3713{
3714 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003716 PDATA_POP(self->stack, arg_tup);
3717 if (! arg_tup) return -1;
3718 PDATA_POP(self->stack, callable);
3719 if (callable) {
3720 ob = Instance_New(callable, arg_tup);
3721 Py_DECREF(callable);
3722 }
3723 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003725 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003727 PDATA_PUSH(self->stack, ob, -1);
3728 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003729}
Tim Peters84e87f32001-03-17 04:50:51 +00003730
Guido van Rossum60456fd1997-04-09 17:36:32 +00003731static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003732load(Unpicklerobject *self)
3733{
3734 PyObject *err = 0, *val = 0;
3735 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003737 self->num_marks = 0;
3738 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003740 while (1) {
3741 if ((*self->read_func)(self, &s, 1) < 0)
3742 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003743
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003744 switch (s[0]) {
3745 case NONE:
3746 if (load_none(self) < 0)
3747 break;
3748 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003750 case BININT:
3751 if (load_binint(self) < 0)
3752 break;
3753 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003755 case BININT1:
3756 if (load_binint1(self) < 0)
3757 break;
3758 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003760 case BININT2:
3761 if (load_binint2(self) < 0)
3762 break;
3763 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003765 case INT:
3766 if (load_int(self) < 0)
3767 break;
3768 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003770 case LONG:
3771 if (load_long(self) < 0)
3772 break;
3773 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003775 case FLOAT:
3776 if (load_float(self) < 0)
3777 break;
3778 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003780 case BINFLOAT:
3781 if (load_binfloat(self) < 0)
3782 break;
3783 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003785 case BINSTRING:
3786 if (load_binstring(self) < 0)
3787 break;
3788 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003789
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003790 case SHORT_BINSTRING:
3791 if (load_short_binstring(self) < 0)
3792 break;
3793 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003795 case STRING:
3796 if (load_string(self) < 0)
3797 break;
3798 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003799
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003800#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003801 case UNICODE:
3802 if (load_unicode(self) < 0)
3803 break;
3804 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003806 case BINUNICODE:
3807 if (load_binunicode(self) < 0)
3808 break;
3809 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003810#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003812 case EMPTY_TUPLE:
3813 if (load_empty_tuple(self) < 0)
3814 break;
3815 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003817 case TUPLE:
3818 if (load_tuple(self) < 0)
3819 break;
3820 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003822 case EMPTY_LIST:
3823 if (load_empty_list(self) < 0)
3824 break;
3825 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003827 case LIST:
3828 if (load_list(self) < 0)
3829 break;
3830 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003832 case EMPTY_DICT:
3833 if (load_empty_dict(self) < 0)
3834 break;
3835 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003837 case DICT:
3838 if (load_dict(self) < 0)
3839 break;
3840 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003842 case OBJ:
3843 if (load_obj(self) < 0)
3844 break;
3845 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003847 case INST:
3848 if (load_inst(self) < 0)
3849 break;
3850 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003852 case GLOBAL:
3853 if (load_global(self) < 0)
3854 break;
3855 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003857 case APPEND:
3858 if (load_append(self) < 0)
3859 break;
3860 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003862 case APPENDS:
3863 if (load_appends(self) < 0)
3864 break;
3865 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003867 case BUILD:
3868 if (load_build(self) < 0)
3869 break;
3870 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003872 case DUP:
3873 if (load_dup(self) < 0)
3874 break;
3875 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003877 case BINGET:
3878 if (load_binget(self) < 0)
3879 break;
3880 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003882 case LONG_BINGET:
3883 if (load_long_binget(self) < 0)
3884 break;
3885 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003887 case GET:
3888 if (load_get(self) < 0)
3889 break;
3890 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003892 case MARK:
3893 if (load_mark(self) < 0)
3894 break;
3895 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003897 case BINPUT:
3898 if (load_binput(self) < 0)
3899 break;
3900 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003902 case LONG_BINPUT:
3903 if (load_long_binput(self) < 0)
3904 break;
3905 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003907 case PUT:
3908 if (load_put(self) < 0)
3909 break;
3910 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003911
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003912 case POP:
3913 if (load_pop(self) < 0)
3914 break;
3915 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003916
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003917 case POP_MARK:
3918 if (load_pop_mark(self) < 0)
3919 break;
3920 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003922 case SETITEM:
3923 if (load_setitem(self) < 0)
3924 break;
3925 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003926
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003927 case SETITEMS:
3928 if (load_setitems(self) < 0)
3929 break;
3930 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003932 case STOP:
3933 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003935 case PERSID:
3936 if (load_persid(self) < 0)
3937 break;
3938 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003940 case BINPERSID:
3941 if (load_binpersid(self) < 0)
3942 break;
3943 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003945 case REDUCE:
3946 if (load_reduce(self) < 0)
3947 break;
3948 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003950 case '\0':
3951 /* end of file */
3952 PyErr_SetNone(PyExc_EOFError);
3953 break;
Neil Schemenauerfa79c652002-03-22 23:02:53 +00003954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003955 default:
3956 cPickle_ErrFormat(UnpicklingError,
3957 "invalid load key, '%s'.",
3958 "c", s[0]);
3959 return NULL;
3960 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003962 break;
3963 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003964
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003965 if ((err = PyErr_Occurred())) {
3966 if (err == PyExc_EOFError) {
3967 PyErr_SetNone(PyExc_EOFError);
3968 }
3969 return NULL;
3970 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003971
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003972 PDATA_POP(self->stack, val);
3973 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003974}
Tim Peters84e87f32001-03-17 04:50:51 +00003975
Guido van Rossum60456fd1997-04-09 17:36:32 +00003976
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003977/* No-load functions to support noload, which is used to
3978 find persistent references. */
3979
3980static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003981noload_obj(Unpicklerobject *self)
3982{
3983 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003985 if ((i = marker(self)) < 0) return -1;
3986 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003987}
3988
3989
3990static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003991noload_inst(Unpicklerobject *self)
3992{
3993 int i;
3994 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003996 if ((i = marker(self)) < 0) return -1;
3997 Pdata_clear(self->stack, i);
3998 if ((*self->readline_func)(self, &s) < 0) return -1;
3999 if ((*self->readline_func)(self, &s) < 0) return -1;
4000 PDATA_APPEND(self->stack, Py_None,-1);
4001 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004002}
4003
4004static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004005noload_global(Unpicklerobject *self)
4006{
4007 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004009 if ((*self->readline_func)(self, &s) < 0) return -1;
4010 if ((*self->readline_func)(self, &s) < 0) return -1;
4011 PDATA_APPEND(self->stack, Py_None,-1);
4012 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004013}
4014
4015static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004016noload_reduce(Unpicklerobject *self)
4017{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004019 if (self->stack->length < 2) return stackUnderflow();
4020 Pdata_clear(self->stack, self->stack->length-2);
4021 PDATA_APPEND(self->stack, Py_None,-1);
4022 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004023}
4024
4025static int
4026noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004027
Guido van Rossum053b8df1998-11-25 16:18:00 +00004028 if (self->stack->length < 1) return stackUnderflow();
4029 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004030 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004031}
4032
4033
4034static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004035noload(Unpicklerobject *self)
4036{
4037 PyObject *err = 0, *val = 0;
4038 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004039
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004040 self->num_marks = 0;
4041 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004042
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004043 while (1) {
4044 if ((*self->read_func)(self, &s, 1) < 0)
4045 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004046
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004047 switch (s[0]) {
4048 case NONE:
4049 if (load_none(self) < 0)
4050 break;
4051 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004053 case BININT:
4054 if (load_binint(self) < 0)
4055 break;
4056 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004058 case BININT1:
4059 if (load_binint1(self) < 0)
4060 break;
4061 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004063 case BININT2:
4064 if (load_binint2(self) < 0)
4065 break;
4066 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004068 case INT:
4069 if (load_int(self) < 0)
4070 break;
4071 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004073 case LONG:
4074 if (load_long(self) < 0)
4075 break;
4076 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004078 case FLOAT:
4079 if (load_float(self) < 0)
4080 break;
4081 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004083 case BINFLOAT:
4084 if (load_binfloat(self) < 0)
4085 break;
4086 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004088 case BINSTRING:
4089 if (load_binstring(self) < 0)
4090 break;
4091 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004093 case SHORT_BINSTRING:
4094 if (load_short_binstring(self) < 0)
4095 break;
4096 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004098 case STRING:
4099 if (load_string(self) < 0)
4100 break;
4101 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004102
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004103#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004104 case UNICODE:
4105 if (load_unicode(self) < 0)
4106 break;
4107 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004109 case BINUNICODE:
4110 if (load_binunicode(self) < 0)
4111 break;
4112 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004113#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004115 case EMPTY_TUPLE:
4116 if (load_empty_tuple(self) < 0)
4117 break;
4118 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004120 case TUPLE:
4121 if (load_tuple(self) < 0)
4122 break;
4123 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004125 case EMPTY_LIST:
4126 if (load_empty_list(self) < 0)
4127 break;
4128 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004130 case LIST:
4131 if (load_list(self) < 0)
4132 break;
4133 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004135 case EMPTY_DICT:
4136 if (load_empty_dict(self) < 0)
4137 break;
4138 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004140 case DICT:
4141 if (load_dict(self) < 0)
4142 break;
4143 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004145 case OBJ:
4146 if (noload_obj(self) < 0)
4147 break;
4148 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004150 case INST:
4151 if (noload_inst(self) < 0)
4152 break;
4153 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004155 case GLOBAL:
4156 if (noload_global(self) < 0)
4157 break;
4158 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004160 case APPEND:
4161 if (load_append(self) < 0)
4162 break;
4163 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004165 case APPENDS:
4166 if (load_appends(self) < 0)
4167 break;
4168 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004170 case BUILD:
4171 if (noload_build(self) < 0)
4172 break;
4173 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004175 case DUP:
4176 if (load_dup(self) < 0)
4177 break;
4178 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004180 case BINGET:
4181 if (load_binget(self) < 0)
4182 break;
4183 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004185 case LONG_BINGET:
4186 if (load_long_binget(self) < 0)
4187 break;
4188 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004190 case GET:
4191 if (load_get(self) < 0)
4192 break;
4193 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004195 case MARK:
4196 if (load_mark(self) < 0)
4197 break;
4198 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004200 case BINPUT:
4201 if (load_binput(self) < 0)
4202 break;
4203 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004205 case LONG_BINPUT:
4206 if (load_long_binput(self) < 0)
4207 break;
4208 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004210 case PUT:
4211 if (load_put(self) < 0)
4212 break;
4213 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004215 case POP:
4216 if (load_pop(self) < 0)
4217 break;
4218 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004220 case POP_MARK:
4221 if (load_pop_mark(self) < 0)
4222 break;
4223 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004225 case SETITEM:
4226 if (load_setitem(self) < 0)
4227 break;
4228 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004230 case SETITEMS:
4231 if (load_setitems(self) < 0)
4232 break;
4233 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004235 case STOP:
4236 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004238 case PERSID:
4239 if (load_persid(self) < 0)
4240 break;
4241 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004243 case BINPERSID:
4244 if (load_binpersid(self) < 0)
4245 break;
4246 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004248 case REDUCE:
4249 if (noload_reduce(self) < 0)
4250 break;
4251 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004253 default:
4254 cPickle_ErrFormat(UnpicklingError,
4255 "invalid load key, '%s'.",
4256 "c", s[0]);
4257 return NULL;
4258 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004260 break;
4261 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004263 if ((err = PyErr_Occurred())) {
4264 if (err == PyExc_EOFError) {
4265 PyErr_SetNone(PyExc_EOFError);
4266 }
4267 return NULL;
4268 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004270 PDATA_POP(self->stack, val);
4271 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004272}
Tim Peters84e87f32001-03-17 04:50:51 +00004273
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004274
Guido van Rossum60456fd1997-04-09 17:36:32 +00004275static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004276Unpickler_load(Unpicklerobject *self, PyObject *args)
4277{
4278 if (!( PyArg_ParseTuple(args, ":load")))
4279 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004281 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004282}
4283
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004284static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004285Unpickler_noload(Unpicklerobject *self, PyObject *args)
4286{
4287 if (!( PyArg_ParseTuple(args, ":noload")))
4288 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004290 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004291}
4292
Guido van Rossum60456fd1997-04-09 17:36:32 +00004293
4294static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004295 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004296 "load() -- Load a pickle"
4297 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004298 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004299 "noload() -- not load a pickle, but go through most of the motions\n"
4300 "\n"
4301 "This function can be used to read past a pickle without instantiating\n"
4302 "any objects or importing any modules. It can also be used to find all\n"
4303 "persistent references without instantiating any objects or importing\n"
4304 "any modules.\n"
4305 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004306 {NULL, NULL} /* sentinel */
4307};
4308
4309
4310static Unpicklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004311newUnpicklerobject(PyObject *f)
4312{
4313 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004315 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
4316 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004318 self->file = NULL;
4319 self->arg = NULL;
4320 self->stack = (Pdata*)Pdata_New();
4321 self->pers_func = NULL;
4322 self->last_string = NULL;
4323 self->marks = NULL;
4324 self->num_marks = 0;
4325 self->marks_size = 0;
4326 self->buf_size = 0;
4327 self->read = NULL;
4328 self->readline = NULL;
4329 self->safe_constructors = NULL;
4330 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004332 if (!( self->memo = PyDict_New()))
4333 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004335 Py_INCREF(f);
4336 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004338 /* Set read, readline based on type of f */
4339 if (PyFile_Check(f)) {
4340 self->fp = PyFile_AsFile(f);
4341 if (self->fp == NULL) {
4342 PyErr_SetString(PyExc_ValueError,
4343 "I/O operation on closed file");
4344 goto err;
4345 }
4346 self->read_func = read_file;
4347 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004348 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004349 else if (PycStringIO_InputCheck(f)) {
4350 self->fp = NULL;
4351 self->read_func = read_cStringIO;
4352 self->readline_func = readline_cStringIO;
4353 }
4354 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004355
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004356 self->fp = NULL;
4357 self->read_func = read_other;
4358 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004359
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004360 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4361 (self->read = PyObject_GetAttr(f, read_str)))) {
4362 PyErr_Clear();
4363 PyErr_SetString( PyExc_TypeError,
4364 "argument must have 'read' and "
4365 "'readline' attributes" );
4366 goto err;
4367 }
4368 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004370 if (PyEval_GetRestricted()) {
4371 /* Restricted execution, get private tables */
4372 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004374 if (!( m=PyImport_Import(copy_reg_str))) goto err;
4375 self->safe_constructors=PyObject_GetAttr(m,
4376 safe_constructors_str);
4377 Py_DECREF(m);
4378 if (!( self->safe_constructors )) goto err;
4379 }
4380 else {
4381 self->safe_constructors=safe_constructors;
4382 Py_INCREF(safe_constructors);
4383 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004385 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004387 err:
4388 Py_DECREF((PyObject *)self);
4389 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004390}
4391
4392
4393static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004394get_Unpickler(PyObject *self, PyObject *args)
4395{
4396 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004398 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
4399 return NULL;
4400 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004401}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004402
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004403
Guido van Rossum60456fd1997-04-09 17:36:32 +00004404static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004405Unpickler_dealloc(Unpicklerobject *self)
4406{
4407 Py_XDECREF(self->readline);
4408 Py_XDECREF(self->read);
4409 Py_XDECREF(self->file);
4410 Py_XDECREF(self->memo);
4411 Py_XDECREF(self->stack);
4412 Py_XDECREF(self->pers_func);
4413 Py_XDECREF(self->arg);
4414 Py_XDECREF(self->last_string);
4415 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004417 if (self->marks) {
4418 free(self->marks);
4419 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004421 if (self->buf_size) {
4422 free(self->buf);
4423 }
Tim Peters84e87f32001-03-17 04:50:51 +00004424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004425 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004426}
4427
4428
4429static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004430Unpickler_getattr(Unpicklerobject *self, char *name)
4431{
4432 if (!strcmp(name, "persistent_load")) {
4433 if (!self->pers_func) {
4434 PyErr_SetString(PyExc_AttributeError, name);
4435 return NULL;
4436 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004438 Py_INCREF(self->pers_func);
4439 return self->pers_func;
4440 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004442 if (!strcmp(name, "find_global")) {
4443 if (!self->find_class) {
4444 PyErr_SetString(PyExc_AttributeError, name);
4445 return NULL;
4446 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004448 Py_INCREF(self->find_class);
4449 return self->find_class;
4450 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004452 if (!strcmp(name, "memo")) {
4453 if (!self->memo) {
4454 PyErr_SetString(PyExc_AttributeError, name);
4455 return NULL;
4456 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004458 Py_INCREF(self->memo);
4459 return self->memo;
4460 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004462 if (!strcmp(name, "UnpicklingError")) {
4463 Py_INCREF(UnpicklingError);
4464 return UnpicklingError;
4465 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004467 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004468}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004469
Guido van Rossum60456fd1997-04-09 17:36:32 +00004470
4471static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004472Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
4473{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004475 if (!strcmp(name, "persistent_load")) {
4476 Py_XDECREF(self->pers_func);
4477 self->pers_func = value;
4478 Py_XINCREF(value);
4479 return 0;
4480 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004482 if (!strcmp(name, "find_global")) {
4483 Py_XDECREF(self->find_class);
4484 self->find_class = value;
4485 Py_XINCREF(value);
4486 return 0;
4487 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004489 if (! value) {
4490 PyErr_SetString(PyExc_TypeError,
4491 "attribute deletion is not supported");
4492 return -1;
4493 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004495 if (strcmp(name, "memo") == 0) {
4496 if (!PyDict_Check(value)) {
4497 PyErr_SetString(PyExc_TypeError,
4498 "memo must be a dictionary");
4499 return -1;
4500 }
4501 Py_XDECREF(self->memo);
4502 self->memo = value;
4503 Py_INCREF(value);
4504 return 0;
4505 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004507 PyErr_SetString(PyExc_AttributeError, name);
4508 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004509}
4510
4511
4512static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004513cpm_dump(PyObject *self, PyObject *args)
4514{
4515 PyObject *ob, *file, *res = NULL;
4516 Picklerobject *pickler = 0;
4517 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004519 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin)))
4520 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004522 if (!( pickler = newPicklerobject(file, bin)))
4523 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004525 if (dump(pickler, ob) < 0)
4526 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004528 Py_INCREF(Py_None);
4529 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004531 finally:
4532 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004534 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004535}
4536
4537
4538static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004539cpm_dumps(PyObject *self, PyObject *args)
4540{
4541 PyObject *ob, *file = 0, *res = NULL;
4542 Picklerobject *pickler = 0;
4543 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004545 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin)))
4546 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004548 if (!( file = PycStringIO->NewOutput(128)))
4549 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004550
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004551 if (!( pickler = newPicklerobject(file, bin)))
4552 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004554 if (dump(pickler, ob) < 0)
4555 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004557 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004559 finally:
4560 Py_XDECREF(pickler);
4561 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004563 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004564}
4565
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004566
4567static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004568cpm_load(PyObject *self, PyObject *args)
4569{
4570 Unpicklerobject *unpickler = 0;
4571 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004573 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
4574 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004576 if (!( unpickler = newUnpicklerobject(ob)))
4577 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004579 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004581 finally:
4582 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004583
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004584 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004585}
4586
4587
4588static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004589cpm_loads(PyObject *self, PyObject *args)
4590{
4591 PyObject *ob, *file = 0, *res = NULL;
4592 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004594 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
4595 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004597 if (!( file = PycStringIO->NewInput(ob)))
4598 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004600 if (!( unpickler = newUnpicklerobject(file)))
4601 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004603 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004605 finally:
4606 Py_XDECREF(file);
4607 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004609 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004610}
4611
4612
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004613PyDoc_STRVAR(Unpicklertype__doc__,
4614"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004615
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004616static PyTypeObject Unpicklertype = {
4617 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004618 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004619 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004620 sizeof(Unpicklerobject), /*tp_basicsize*/
4621 0, /*tp_itemsize*/
4622 /* methods */
4623 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4624 (printfunc)0, /*tp_print*/
4625 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4626 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4627 (cmpfunc)0, /*tp_compare*/
4628 (reprfunc)0, /*tp_repr*/
4629 0, /*tp_as_number*/
4630 0, /*tp_as_sequence*/
4631 0, /*tp_as_mapping*/
4632 (hashfunc)0, /*tp_hash*/
4633 (ternaryfunc)0, /*tp_call*/
4634 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004635
Guido van Rossum60456fd1997-04-09 17:36:32 +00004636 /* Space for future expansion */
4637 0L,0L,0L,0L,
4638 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004639};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004640
Guido van Rossum60456fd1997-04-09 17:36:32 +00004641static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004642 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004643 "dump(object, file, [binary]) --"
4644 "Write an object in pickle format to the given file\n"
4645 "\n"
4646 "If the optional argument, binary, is provided and is true, then the\n"
4647 "pickle will be written in binary format, which is more space and\n"
4648 "computationally efficient. \n"
4649 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004650 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004651 "dumps(object, [binary]) --"
4652 "Return a string containing an object in pickle format\n"
4653 "\n"
4654 "If the optional argument, binary, is provided and is true, then the\n"
4655 "pickle will be written in binary format, which is more space and\n"
4656 "computationally efficient. \n"
4657 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004658 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004659 "load(file) -- Load a pickle from the given file"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004660 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004661 "loads(string) -- Load a pickle from the given string"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004662 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004663 "Pickler(file, [binary]) -- Create a pickler\n"
4664 "\n"
4665 "If the optional argument, binary, is provided and is true, then\n"
4666 "pickles will be written in binary format, which is more space and\n"
4667 "computationally efficient. \n"
4668 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004669 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004670 "Unpickler(file) -- Create an unpickler"},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004671 { NULL, NULL }
4672};
4673
Guido van Rossum60456fd1997-04-09 17:36:32 +00004674static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004675init_stuff(PyObject *module_dict)
4676{
4677 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004678
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004679#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004681 INIT_STR(__class__);
4682 INIT_STR(__getinitargs__);
4683 INIT_STR(__dict__);
4684 INIT_STR(__getstate__);
4685 INIT_STR(__setstate__);
4686 INIT_STR(__name__);
4687 INIT_STR(__main__);
4688 INIT_STR(__reduce__);
4689 INIT_STR(write);
4690 INIT_STR(__safe_for_unpickling__);
4691 INIT_STR(append);
4692 INIT_STR(read);
4693 INIT_STR(readline);
4694 INIT_STR(copy_reg);
4695 INIT_STR(dispatch_table);
4696 INIT_STR(safe_constructors);
4697 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004699 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
4700 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004702 /* These next few are special because we want to use different
4703 ones in restricted mode. */
4704 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
4705 if (!dispatch_table)
4706 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004708 if (!( safe_constructors = PyObject_GetAttr(copy_reg,
4709 safe_constructors_str)))
4710 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004712 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004714 /* Down to here ********************************** */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004716 if (!( empty_tuple = PyTuple_New(0)))
4717 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004719 /* Ugh */
4720 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4721 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4722 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004724 if (!( t=PyDict_New())) return -1;
4725 if (!( r=PyRun_String(
4726 "def __init__(self, *args): self.args=args\n\n"
4727 "def __str__(self):\n"
4728 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4729 Py_file_input,
4730 module_dict, t) )) return -1;
4731 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004733 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
4734 if (!PickleError)
4735 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004737 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004739 PicklingError = PyErr_NewException("cPickle.PicklingError",
4740 PickleError, NULL);
4741 if (!PicklingError)
4742 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004743
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004744 if (!( t=PyDict_New())) return -1;
4745 if (!( r=PyRun_String(
4746 "def __init__(self, *args): self.args=args\n\n"
4747 "def __str__(self):\n"
4748 " a=self.args\n"
4749 " a=a and type(a[0]) or '(what)'\n"
4750 " return 'Cannot pickle %s objects' % a\n"
4751 , Py_file_input,
4752 module_dict, t) )) return -1;
4753 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004755 if (!( UnpickleableError = PyErr_NewException(
4756 "cPickle.UnpickleableError", PicklingError, t)))
4757 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004759 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004761 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
4762 PickleError, NULL)))
4763 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004765 if (PyDict_SetItemString(module_dict, "PickleError",
4766 PickleError) < 0)
4767 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004769 if (PyDict_SetItemString(module_dict, "PicklingError",
4770 PicklingError) < 0)
4771 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004773 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4774 UnpicklingError) < 0)
4775 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004777 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4778 UnpickleableError) < 0)
4779 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004781 if (!( BadPickleGet = PyString_FromString("cPickle.BadPickleGet")))
4782 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004784 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4785 BadPickleGet) < 0)
4786 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004788 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004789
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004790 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004791}
4792
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004793#ifndef DL_EXPORT /* declarations for DLL import/export */
4794#define DL_EXPORT(RTYPE) RTYPE
4795#endif
Guido van Rossum50f385c1998-12-04 18:48:44 +00004796DL_EXPORT(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004797initcPickle(void)
4798{
4799 PyObject *m, *d, *di, *v, *k;
4800 int i;
4801 char *rev="1.71";
4802 PyObject *format_version;
4803 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004805 Picklertype.ob_type = &PyType_Type;
4806 Picklertype.tp_getattro = PyObject_GenericGetAttr;
4807 Picklertype.tp_setattro = PyObject_GenericSetAttr;
4808 Unpicklertype.ob_type = &PyType_Type;
4809 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004811 /* Initialize some pieces. We need to do this before module creation,
4812 so we're forced to use a temporary dictionary. :(
4813 */
4814 di=PyDict_New();
4815 if (!di) return;
4816 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004818 /* Create the module and add the functions */
4819 m = Py_InitModule4("cPickle", cPickle_methods,
4820 cPickle_module_documentation,
4821 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004823 /* Add some symbolic constants to the module */
4824 d = PyModule_GetDict(m);
4825 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4826 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004828 /* Copy data from di. Waaa. */
4829 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4830 if (PyObject_SetItem(d, k, v) < 0) {
4831 Py_DECREF(di);
4832 return;
4833 }
4834 }
4835 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004837 format_version = PyString_FromString("1.3");
4838 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004840 PyDict_SetItemString(d, "format_version", format_version);
4841 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4842 Py_XDECREF(format_version);
4843 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004844}