blob: a43d7b911665c5440ca57742e71e1e438d13d016 [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
Jeremy Hylton938ace62002-07-17 16:30:39 +0000291static 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
Jeremy Hylton938ace62002-07-17 16:30:39 +0000316static 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
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000381 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000382 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000383 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{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001689 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001690 char *name_str, *module_str;
1691 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001693 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001695 if (name) {
1696 global_name = name;
1697 Py_INCREF(global_name);
1698 }
1699 else {
1700 if (!( global_name = PyObject_GetAttr(args, __name___str)))
1701 goto finally;
1702 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001704 if (!( module = whichmodule(args, global_name)))
1705 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001707 if ((module_size = PyString_Size(module)) < 0 ||
1708 (name_size = PyString_Size(global_name)) < 0)
1709 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001711 module_str = PyString_AS_STRING((PyStringObject *)module);
1712 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001713
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 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001722 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001723 if (klass == NULL) {
1724 cPickle_ErrFormat(PicklingError,
1725 "Can't pickle %s: it's not found as %s.%s",
1726 "OSS", args, module, global_name);
1727 goto finally;
1728 }
1729 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001730 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001731 cPickle_ErrFormat(PicklingError,
1732 "Can't pickle %s: it's not the same object as %s.%s",
1733 "OSS", args, module, global_name);
1734 goto finally;
1735 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001736 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001738 if ((*self->write_func)(self, &global, 1) < 0)
1739 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001741 if ((*self->write_func)(self, module_str, module_size) < 0)
1742 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001743
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001744 if ((*self->write_func)(self, "\n", 1) < 0)
1745 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001747 if ((*self->write_func)(self, name_str, name_size) < 0)
1748 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001750 if ((*self->write_func)(self, "\n", 1) < 0)
1751 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001753 if (put(self, args) < 0)
1754 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001756 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001758 finally:
1759 Py_XDECREF(module);
1760 Py_XDECREF(global_name);
1761 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001763 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001764}
1765
Guido van Rossum60456fd1997-04-09 17:36:32 +00001766static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001767save_pers(Picklerobject *self, PyObject *args, PyObject *f)
1768{
1769 PyObject *pid = 0;
1770 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001772 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001774 Py_INCREF(args);
1775 ARG_TUP(self, args);
1776 if (self->arg) {
1777 pid = PyObject_Call(f, self->arg, NULL);
1778 FREE_ARG_TUP(self);
1779 }
1780 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001782 if (pid != Py_None) {
1783 if (!self->bin) {
1784 if (!PyString_Check(pid)) {
1785 PyErr_SetString(PicklingError,
1786 "persistent id must be string");
1787 goto finally;
1788 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001789
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001790 if ((*self->write_func)(self, &persid, 1) < 0)
1791 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001793 if ((size = PyString_Size(pid)) < 0)
1794 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001796 if ((*self->write_func)(self,
1797 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1798 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001800 if ((*self->write_func)(self, "\n", 1) < 0)
1801 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001803 res = 1;
1804 goto finally;
1805 }
1806 else if (save(self, pid, 1) >= 0) {
1807 if ((*self->write_func)(self, &binpersid, 1) < 0)
1808 res = -1;
1809 else
1810 res = 1;
1811 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001813 goto finally;
1814 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001816 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001818 finally:
1819 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001821 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001822}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001823
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001824
Tim Peters84e87f32001-03-17 04:50:51 +00001825static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001826save_reduce(Picklerobject *self, PyObject *callable,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001827 PyObject *tup, PyObject *state, PyObject *ob)
1828{
1829 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001831 if (save(self, callable, 0) < 0)
1832 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001834 if (save(self, tup, 0) < 0)
1835 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001837 if ((*self->write_func)(self, &reduce, 1) < 0)
1838 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001840 if (ob != NULL) {
1841 if (state && !PyDict_Check(state)) {
1842 if (put2(self, ob) < 0)
1843 return -1;
1844 }
1845 else {
1846 if (put(self, ob) < 0)
1847 return -1;
1848 }
1849 }
Tim Peters84e87f32001-03-17 04:50:51 +00001850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001851 if (state) {
1852 if (save(self, state, 0) < 0)
1853 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001855 if ((*self->write_func)(self, &build, 1) < 0)
1856 return -1;
1857 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001859 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001860}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001861
Guido van Rossum60456fd1997-04-09 17:36:32 +00001862static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001863save(Picklerobject *self, PyObject *args, int pers_save)
1864{
1865 PyTypeObject *type;
1866 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1867 *callable = 0, *state = 0;
1868 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001870 if (!pers_save && self->pers_func) {
1871 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1872 res = tmp;
1873 goto finally;
1874 }
1875 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001877 if (args == Py_None) {
1878 res = save_none(self, args);
1879 goto finally;
1880 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001882 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001884 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001885 case 'b':
1886 if (args == Py_False || args == Py_True) {
1887 res = save_bool(self, args);
1888 goto finally;
1889 }
1890 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001891 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001892 if (type == &PyInt_Type) {
1893 res = save_int(self, args);
1894 goto finally;
1895 }
1896 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001897
Guido van Rossum60456fd1997-04-09 17:36:32 +00001898 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001899 if (type == &PyLong_Type) {
1900 res = save_long(self, args);
1901 goto finally;
1902 }
1903 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001904
Guido van Rossum60456fd1997-04-09 17:36:32 +00001905 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001906 if (type == &PyFloat_Type) {
1907 res = save_float(self, args);
1908 goto finally;
1909 }
1910 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001911
Guido van Rossum60456fd1997-04-09 17:36:32 +00001912 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001913 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
1914 if (self->bin) res = save_empty_tuple(self, args);
1915 else res = save_tuple(self, args);
1916 goto finally;
1917 }
1918 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001919
Guido van Rossum60456fd1997-04-09 17:36:32 +00001920 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001921 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
1922 res = save_string(self, args, 0);
1923 goto finally;
1924 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001925
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001926#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001927 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001928 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1929 res = save_unicode(self, args, 0);
1930 goto finally;
1931 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001932#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001933 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001935 if (args->ob_refcnt > 1) {
1936 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
1937 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001939 if (PyDict_GetItem(self->memo, py_ob_id)) {
1940 if (get(self, py_ob_id) < 0)
1941 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001943 res = 0;
1944 goto finally;
1945 }
1946 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001948 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001949 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001950 if (type == &PyString_Type) {
1951 res = save_string(self, args, 1);
1952 goto finally;
1953 }
1954 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001955
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001956#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001957 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001958 if (type == &PyUnicode_Type) {
1959 res = save_unicode(self, args, 1);
1960 goto finally;
1961 }
1962 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001963#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001964
Guido van Rossum60456fd1997-04-09 17:36:32 +00001965 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001966 if (type == &PyTuple_Type) {
1967 res = save_tuple(self, args);
1968 goto finally;
1969 }
1970 if (type == &PyType_Type) {
1971 res = save_global(self, args, NULL);
1972 goto finally;
1973 }
1974 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001975
Guido van Rossum60456fd1997-04-09 17:36:32 +00001976 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001977 if (type == &PyList_Type) {
1978 res = save_list(self, args);
1979 goto finally;
1980 }
1981 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001982
1983 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001984 if (type == &PyDict_Type) {
1985 res = save_dict(self, args);
1986 goto finally;
1987 }
1988 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001989
1990 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001991 if (type == &PyInstance_Type) {
1992 res = save_inst(self, args);
1993 goto finally;
1994 }
1995 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001996
1997 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001998 if (type == &PyClass_Type) {
1999 res = save_global(self, args, NULL);
2000 goto finally;
2001 }
2002 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002003
2004 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002005 if (type == &PyFunction_Type) {
2006 res = save_global(self, args, NULL);
2007 goto finally;
2008 }
2009 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002010
2011 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002012 if (type == &PyCFunction_Type) {
2013 res = save_global(self, args, NULL);
2014 goto finally;
2015 }
2016 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002018 if (!pers_save && self->inst_pers_func) {
2019 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2020 res = tmp;
2021 goto finally;
2022 }
2023 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002024
Jeremy Hylton39c61162002-07-16 19:47:43 +00002025 if (PyType_IsSubtype(type, &PyType_Type)) {
2026 res = save_global(self, args, NULL);
2027 goto finally;
2028 }
2029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002030 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2031 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002033 Py_INCREF(args);
2034 ARG_TUP(self, args);
2035 if (self->arg) {
2036 t = PyObject_Call(__reduce__, self->arg, NULL);
2037 FREE_ARG_TUP(self);
2038 }
2039 if (! t) goto finally;
2040 }
2041 else {
2042 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002044 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2045 t = PyObject_Call(__reduce__, empty_tuple, NULL);
2046 if (!t)
2047 goto finally;
2048 }
2049 else {
2050 PyErr_Clear();
2051 }
2052 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002054 if (t) {
2055 if (PyString_Check(t)) {
2056 res = save_global(self, args, t);
2057 goto finally;
2058 }
Tim Peters84e87f32001-03-17 04:50:51 +00002059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002060 if (!PyTuple_Check(t)) {
2061 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2062 "be a tuple", "O", __reduce__);
2063 goto finally;
2064 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002066 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002068 if ((size != 3) && (size != 2)) {
2069 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2070 "contain only two or three elements", "O", __reduce__);
2071 goto finally;
2072 }
Tim Peters84e87f32001-03-17 04:50:51 +00002073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002074 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002076 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002078 if (size > 2) {
2079 state = PyTuple_GET_ITEM(t, 2);
2080 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002082 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2083 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2084 "returned by %s must be a tuple", "O", __reduce__);
2085 goto finally;
2086 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002088 res = save_reduce(self, callable, arg_tup, state, args);
2089 goto finally;
2090 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002092 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002094 finally:
2095 Py_XDECREF(py_ob_id);
2096 Py_XDECREF(__reduce__);
2097 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002099 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002100}
2101
2102
2103static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002104dump(Picklerobject *self, PyObject *args)
2105{
2106 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002108 if (save(self, args, 0) < 0)
2109 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002111 if ((*self->write_func)(self, &stop, 1) < 0)
2112 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002114 if ((*self->write_func)(self, NULL, 0) < 0)
2115 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002117 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002118}
2119
2120static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002121Pickle_clear_memo(Picklerobject *self, PyObject *args)
2122{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002123 if (self->memo)
2124 PyDict_Clear(self->memo);
2125 Py_INCREF(Py_None);
2126 return Py_None;
2127}
2128
2129static PyObject *
2130Pickle_getvalue(Picklerobject *self, PyObject *args)
2131{
2132 int l, i, rsize, ssize, clear=1, lm;
2133 long ik;
2134 PyObject *k, *r;
2135 char *s, *p, *have_get;
2136 Pdata *data;
2137
2138 /* Can be called by Python code or C code */
2139 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2140 return NULL;
2141
2142 /* Check to make sure we are based on a list */
2143 if (! Pdata_Check(self->file)) {
2144 PyErr_SetString(PicklingError,
2145 "Attempt to getvalue() a non-list-based pickler");
2146 return NULL;
2147 }
2148
2149 /* flush write buffer */
2150 if (write_other(self, NULL, 0) < 0) return NULL;
2151
2152 data=(Pdata*)self->file;
2153 l=data->length;
2154
2155 /* set up an array to hold get/put status */
2156 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2157 lm++;
2158 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2159 memset(have_get,0,lm);
2160
2161 /* Scan for gets. */
2162 for (rsize=0, i=l; --i >= 0; ) {
2163 k=data->data[i];
2164
2165 if (PyString_Check(k)) {
2166 rsize += PyString_GET_SIZE(k);
2167 }
2168
2169 else if (PyInt_Check(k)) { /* put */
2170 ik=PyInt_AS_LONG((PyIntObject*)k);
2171 if (ik >= lm || ik==0) {
2172 PyErr_SetString(PicklingError,
2173 "Invalid get data");
2174 return NULL;
2175 }
2176 if (have_get[ik]) { /* with matching get */
2177 if (ik < 256) rsize += 2;
2178 else rsize+=5;
2179 }
2180 }
2181
2182 else if (! (PyTuple_Check(k) &&
2183 PyTuple_GET_SIZE(k) == 2 &&
2184 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2185 ) {
2186 PyErr_SetString(PicklingError,
2187 "Unexpected data in internal list");
2188 return NULL;
2189 }
2190
2191 else { /* put */
2192 ik=PyInt_AS_LONG((PyIntObject*)k);
2193 if (ik >= lm || ik==0) {
2194 PyErr_SetString(PicklingError,
2195 "Invalid get data");
2196 return NULL;
2197 }
2198 have_get[ik]=1;
2199 if (ik < 256) rsize += 2;
2200 else rsize+=5;
2201 }
2202
2203 }
2204
2205 /* Now generate the result */
2206 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2207 s=PyString_AS_STRING((PyStringObject*)r);
2208
2209 for (i=0; i<l; i++) {
2210 k=data->data[i];
2211
2212 if (PyString_Check(k)) {
2213 ssize=PyString_GET_SIZE(k);
2214 if (ssize) {
2215 p=PyString_AS_STRING((PyStringObject*)k);
2216 while (--ssize >= 0) *s++=*p++;
2217 }
2218 }
2219
2220 else if (PyTuple_Check(k)) { /* get */
2221 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2222 if (ik < 256) {
2223 *s++ = BINGET;
2224 *s++ = (int)(ik & 0xff);
2225 }
2226 else {
2227 *s++ = LONG_BINGET;
2228 *s++ = (int)(ik & 0xff);
2229 *s++ = (int)((ik >> 8) & 0xff);
2230 *s++ = (int)((ik >> 16) & 0xff);
2231 *s++ = (int)((ik >> 24) & 0xff);
2232 }
2233 }
2234
2235 else { /* put */
2236 ik=PyInt_AS_LONG((PyIntObject*)k);
2237
2238 if (have_get[ik]) { /* with matching get */
2239 if (ik < 256) {
2240 *s++ = BINPUT;
2241 *s++ = (int)(ik & 0xff);
2242 }
2243 else {
2244 *s++ = LONG_BINPUT;
2245 *s++ = (int)(ik & 0xff);
2246 *s++ = (int)((ik >> 8) & 0xff);
2247 *s++ = (int)((ik >> 16) & 0xff);
2248 *s++ = (int)((ik >> 24) & 0xff);
2249 }
2250 }
2251 }
2252
2253 }
2254
2255 if (clear) {
2256 PyDict_Clear(self->memo);
2257 Pdata_clear(data,0);
2258 }
2259
2260 free(have_get);
2261 return r;
2262 err:
2263 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002264 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002265}
2266
2267static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002268Pickler_dump(Picklerobject *self, PyObject *args)
2269{
2270 PyObject *ob;
2271 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002273 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
2274 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002275
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002276 if (dump(self, ob) < 0)
2277 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002279 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002281 /* XXX Why does dump() return self? */
2282 Py_INCREF(self);
2283 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002284}
2285
2286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002287static struct PyMethodDef Pickler_methods[] =
2288{
Neal Norwitzb0493252002-03-31 14:44:22 +00002289 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002290 "dump(object) --"
Fred Drake0ebacc82002-05-01 20:36:39 +00002291 "Write an object in pickle format to the object's pickle stream"},
2292 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002293 "clear_memo() -- Clear the picklers memo"},
Neal Norwitzb0493252002-03-31 14:44:22 +00002294 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Guido van Rossum053b8df1998-11-25 16:18:00 +00002295 "getvalue() -- Finish picking a list-based pickle"},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002296 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002297};
2298
2299
2300static Picklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002301newPicklerobject(PyObject *file, int bin)
2302{
2303 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002305 if (!( self = PyObject_New(Picklerobject, &Picklertype)))
2306 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002308 self->fp = NULL;
2309 self->write = NULL;
2310 self->memo = NULL;
2311 self->arg = NULL;
2312 self->pers_func = NULL;
2313 self->inst_pers_func = NULL;
2314 self->write_buf = NULL;
2315 self->bin = bin;
2316 self->fast = 0;
2317 self->fast_container = 0;
2318 self->fast_memo = NULL;
2319 self->buf_size = 0;
2320 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002322 if (file)
2323 Py_INCREF(file);
2324 else
2325 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002327 if (!( self->file = file ))
2328 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002330 if (!( self->memo = PyDict_New()))
2331 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002333 if (PyFile_Check(file)) {
2334 self->fp = PyFile_AsFile(file);
2335 if (self->fp == NULL) {
2336 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2337 goto err;
2338 }
2339 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002340 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002341 else if (PycStringIO_OutputCheck(file)) {
2342 self->write_func = write_cStringIO;
2343 }
2344 else if (file == Py_None) {
2345 self->write_func = write_none;
2346 }
2347 else {
2348 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002350 if (! Pdata_Check(file)) {
2351 self->write = PyObject_GetAttr(file, write_str);
2352 if (!self->write) {
2353 PyErr_Clear();
2354 PyErr_SetString(PyExc_TypeError,
2355 "argument must have 'write' "
2356 "attribute");
2357 goto err;
2358 }
2359 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002361 if (!( self->write_buf =
2362 (char *)malloc(WRITE_BUF_SIZE * sizeof(char)))) {
2363 PyErr_NoMemory();
2364 goto err;
2365 }
2366 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002368 if (PyEval_GetRestricted()) {
2369 /* Restricted execution, get private tables */
2370 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002372 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2373 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2374 Py_DECREF(m);
2375 if (!( self->dispatch_table )) goto err;
2376 }
2377 else {
2378 self->dispatch_table=dispatch_table;
2379 Py_INCREF(dispatch_table);
2380 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002382 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002384 err:
2385 Py_DECREF((PyObject *)self);
2386 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002387}
2388
2389
2390static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002391get_Pickler(PyObject *self, PyObject *args)
2392{
2393 PyObject *file = NULL;
2394 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002396 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
2397 PyErr_Clear();
2398 bin = 0;
2399 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2400 return NULL;
2401 }
2402 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002403}
2404
2405
2406static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002407Pickler_dealloc(Picklerobject *self)
2408{
2409 Py_XDECREF(self->write);
2410 Py_XDECREF(self->memo);
2411 Py_XDECREF(self->fast_memo);
2412 Py_XDECREF(self->arg);
2413 Py_XDECREF(self->file);
2414 Py_XDECREF(self->pers_func);
2415 Py_XDECREF(self->inst_pers_func);
2416 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002418 if (self->write_buf) {
2419 free(self->write_buf);
2420 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002422 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002423}
2424
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002425static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002426Pickler_get_pers_func(Picklerobject *p)
2427{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002428 if (p->pers_func == NULL)
2429 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2430 else
2431 Py_INCREF(p->pers_func);
2432 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002433}
2434
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002435static int
2436Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2437{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002438 if (v == NULL) {
2439 PyErr_SetString(PyExc_TypeError,
2440 "attribute deletion is not supported");
2441 return -1;
2442 }
2443 Py_XDECREF(p->pers_func);
2444 Py_INCREF(v);
2445 p->pers_func = v;
2446 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002447}
2448
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002449static int
2450Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2451{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002452 if (v == NULL) {
2453 PyErr_SetString(PyExc_TypeError,
2454 "attribute deletion is not supported");
2455 return -1;
2456 }
2457 Py_XDECREF(p->inst_pers_func);
2458 Py_INCREF(v);
2459 p->inst_pers_func = v;
2460 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002461}
2462
2463static PyObject *
2464Pickler_get_memo(Picklerobject *p)
2465{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002466 if (p->memo == NULL)
2467 PyErr_SetString(PyExc_AttributeError, "memo");
2468 else
2469 Py_INCREF(p->memo);
2470 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002471}
2472
2473static int
2474Pickler_set_memo(Picklerobject *p, PyObject *v)
2475{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002476 if (v == NULL) {
2477 PyErr_SetString(PyExc_TypeError,
2478 "attribute deletion is not supported");
2479 return -1;
2480 }
2481 if (!PyDict_Check(v)) {
2482 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2483 return -1;
2484 }
2485 Py_XDECREF(p->memo);
2486 Py_INCREF(v);
2487 p->memo = v;
2488 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002489}
2490
2491static PyObject *
2492Pickler_get_error(Picklerobject *p)
2493{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002494 /* why is this an attribute on the Pickler? */
2495 Py_INCREF(PicklingError);
2496 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002497}
2498
2499static PyMemberDef Pickler_members[] = {
2500 {"binary", T_INT, offsetof(Picklerobject, bin)},
2501 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002502 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002503};
2504
2505static PyGetSetDef Pickler_getsets[] = {
2506 {"persistent_id", (getter)Pickler_get_pers_func,
2507 (setter)Pickler_set_pers_func},
2508 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2509 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002510 {"PicklingError", (getter)Pickler_get_error, NULL},
2511 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002512};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002513
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002514PyDoc_STRVAR(Picklertype__doc__,
2515"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002516
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002517static PyTypeObject Picklertype = {
2518 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002519 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002520 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002521 sizeof(Picklerobject), /*tp_basicsize*/
2522 0,
2523 (destructor)Pickler_dealloc, /* tp_dealloc */
2524 0, /* tp_print */
2525 0, /* tp_getattr */
2526 0, /* tp_setattr */
2527 0, /* tp_compare */
2528 0, /* tp_repr */
2529 0, /* tp_as_number */
2530 0, /* tp_as_sequence */
2531 0, /* tp_as_mapping */
2532 0, /* tp_hash */
2533 0, /* tp_call */
2534 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002535 0, /* set below */ /* tp_getattro */
2536 0, /* set below */ /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002537 0, /* tp_as_buffer */
2538 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2539 Picklertype__doc__, /* tp_doc */
2540 0, /* tp_traverse */
2541 0, /* tp_clear */
2542 0, /* tp_richcompare */
2543 0, /* tp_weaklistoffset */
2544 0, /* tp_iter */
2545 0, /* tp_iternext */
2546 Pickler_methods, /* tp_methods */
2547 Pickler_members, /* tp_members */
2548 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002549};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002550
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002551static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002552find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
2553{
2554 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002556 if (fc) {
2557 if (fc==Py_None) {
2558 PyErr_SetString(UnpicklingError,
2559 "Global and instance pickles are not supported.");
2560 return NULL;
2561 }
2562 return PyObject_CallFunction(fc, "OO", py_module_name,
2563 py_global_name);
2564 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002566 module = PySys_GetObject("modules");
2567 if (module == NULL)
2568 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002570 module = PyDict_GetItem(module, py_module_name);
2571 if (module == NULL) {
2572 module = PyImport_Import(py_module_name);
2573 if (!module)
2574 return NULL;
2575 global = PyObject_GetAttr(module, py_global_name);
2576 Py_DECREF(module);
2577 }
2578 else
2579 global = PyObject_GetAttr(module, py_global_name);
2580 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002581}
2582
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002583static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002584marker(Unpicklerobject *self)
2585{
2586 if (self->num_marks < 1) {
2587 PyErr_SetString(UnpicklingError, "could not find MARK");
2588 return -1;
2589 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002591 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002592}
2593
Tim Peters84e87f32001-03-17 04:50:51 +00002594
Guido van Rossum60456fd1997-04-09 17:36:32 +00002595static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002596load_none(Unpicklerobject *self)
2597{
2598 PDATA_APPEND(self->stack, Py_None, -1);
2599 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002600}
2601
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002602static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002603bad_readline(void)
2604{
2605 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2606 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002607}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002608
2609static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002610load_int(Unpicklerobject *self)
2611{
2612 PyObject *py_int = 0;
2613 char *endptr, *s;
2614 int len, res = -1;
2615 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002617 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2618 if (len < 2) return bad_readline();
2619 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002621 errno = 0;
2622 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002624 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2625 /* Hm, maybe we've got something long. Let's try reading
2626 it as a Python long object. */
2627 errno = 0;
2628 py_int = PyLong_FromString(s, NULL, 0);
2629 if (py_int == NULL) {
2630 PyErr_SetString(PyExc_ValueError,
2631 "could not convert string to int");
2632 goto finally;
2633 }
2634 }
2635 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002636 if (len == 3 && (l == 0 || l == 1)) {
2637 if (!( py_int = PyBool_FromLong(l))) goto finally;
2638 }
2639 else {
2640 if (!( py_int = PyInt_FromLong(l))) goto finally;
2641 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002642 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002644 free(s);
2645 PDATA_PUSH(self->stack, py_int, -1);
2646 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002648 finally:
2649 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002651 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002652}
2653
2654
Tim Peters84e87f32001-03-17 04:50:51 +00002655static long
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002656calc_binint(char *s, int x)
2657{
2658 unsigned char c;
2659 int i;
2660 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002662 for (i = 0, l = 0L; i < x; i++) {
2663 c = (unsigned char)s[i];
2664 l |= (long)c << (i * 8);
2665 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002666#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002667 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2668 * is signed, so on a box with longs bigger than 4 bytes we need
2669 * to extend a BININT's sign bit to the full width.
2670 */
2671 if (x == 4 && l & (1L << 31))
2672 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002673#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002674 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002675}
2676
2677
2678static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002679load_binintx(Unpicklerobject *self, char *s, int x)
2680{
2681 PyObject *py_int = 0;
2682 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002684 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002686 if (!( py_int = PyInt_FromLong(l)))
2687 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002689 PDATA_PUSH(self->stack, py_int, -1);
2690 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002691}
2692
2693
2694static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002695load_binint(Unpicklerobject *self)
2696{
2697 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002699 if ((*self->read_func)(self, &s, 4) < 0)
2700 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002702 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002703}
2704
2705
2706static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002707load_binint1(Unpicklerobject *self)
2708{
2709 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002711 if ((*self->read_func)(self, &s, 1) < 0)
2712 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002714 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002715}
2716
2717
2718static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002719load_binint2(Unpicklerobject *self)
2720{
2721 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002723 if ((*self->read_func)(self, &s, 2) < 0)
2724 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002726 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002727}
Tim Peters84e87f32001-03-17 04:50:51 +00002728
Guido van Rossum60456fd1997-04-09 17:36:32 +00002729static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002730load_long(Unpicklerobject *self)
2731{
2732 PyObject *l = 0;
2733 char *end, *s;
2734 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002736 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2737 if (len < 2) return bad_readline();
2738 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002740 if (!( l = PyLong_FromString(s, &end, 0)))
2741 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002743 free(s);
2744 PDATA_PUSH(self->stack, l, -1);
2745 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002747 finally:
2748 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002750 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002751}
2752
Tim Peters84e87f32001-03-17 04:50:51 +00002753
Guido van Rossum60456fd1997-04-09 17:36:32 +00002754static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002755load_float(Unpicklerobject *self)
2756{
2757 PyObject *py_float = 0;
2758 char *endptr, *s;
2759 int len, res = -1;
2760 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002762 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2763 if (len < 2) return bad_readline();
2764 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002766 errno = 0;
2767 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002769 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2770 PyErr_SetString(PyExc_ValueError,
2771 "could not convert string to float");
2772 goto finally;
2773 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002775 if (!( py_float = PyFloat_FromDouble(d)))
2776 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002778 free(s);
2779 PDATA_PUSH(self->stack, py_float, -1);
2780 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002782 finally:
2783 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002785 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002786}
2787
Guido van Rossum60456fd1997-04-09 17:36:32 +00002788static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002789load_binfloat(Unpicklerobject *self)
2790{
2791 PyObject *py_float = 0;
2792 int s, e;
2793 long fhi, flo;
2794 double x;
2795 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002797 if ((*self->read_func)(self, &p, 8) < 0)
2798 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002800 /* First byte */
2801 s = (*p>>7) & 1;
2802 e = (*p & 0x7F) << 4;
2803 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002805 /* Second byte */
2806 e |= (*p>>4) & 0xF;
2807 fhi = (*p & 0xF) << 24;
2808 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002810 /* Third byte */
2811 fhi |= (*p & 0xFF) << 16;
2812 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002814 /* Fourth byte */
2815 fhi |= (*p & 0xFF) << 8;
2816 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002818 /* Fifth byte */
2819 fhi |= *p & 0xFF;
2820 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002822 /* Sixth byte */
2823 flo = (*p & 0xFF) << 16;
2824 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002825
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002826 /* Seventh byte */
2827 flo |= (*p & 0xFF) << 8;
2828 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002830 /* Eighth byte */
2831 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002833 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2834 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002836 /* XXX This sadly ignores Inf/NaN */
2837 if (e == 0)
2838 e = -1022;
2839 else {
2840 x += 1.0;
2841 e -= 1023;
2842 }
2843 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002845 if (s)
2846 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002848 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002850 PDATA_PUSH(self->stack, py_float, -1);
2851 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002852}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002853
2854static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002855load_string(Unpicklerobject *self)
2856{
2857 PyObject *str = 0;
2858 int len, res = -1, nslash;
2859 char *s, q, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002861 static PyObject *eval_dict = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002863 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2864 if (len < 2) return bad_readline();
2865 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002867 /* Check for unquoted quotes (evil strings) */
2868 q=*s;
2869 if (q != '"' && q != '\'') goto insecure;
2870 for (p=s+1, nslash=0; *p; p++) {
2871 if (*p==q && nslash%2==0) break;
2872 if (*p=='\\') nslash++;
2873 else nslash=0;
2874 }
2875 if (*p == q) {
2876 for (p++; *p; p++)
2877 if (*(unsigned char *)p > ' ')
2878 goto insecure;
2879 }
2880 else
2881 goto insecure;
2882 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002884 if (!( eval_dict ))
2885 if (!( eval_dict = Py_BuildValue("{s{}}", "__builtins__")))
2886 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002888 if (!( str = PyRun_String(s, Py_eval_input, eval_dict, eval_dict)))
2889 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002891 free(s);
2892 PDATA_PUSH(self->stack, str, -1);
2893 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002895 finally:
2896 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002898 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002900 insecure:
2901 free(s);
2902 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2903 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002904}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002905
2906
2907static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002908load_binstring(Unpicklerobject *self)
2909{
2910 PyObject *py_string = 0;
2911 long l;
2912 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002914 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002916 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002917
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002918 if ((*self->read_func)(self, &s, l) < 0)
2919 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002921 if (!( py_string = PyString_FromStringAndSize(s, l)))
2922 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002924 PDATA_PUSH(self->stack, py_string, -1);
2925 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002926}
2927
2928
2929static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002930load_short_binstring(Unpicklerobject *self)
2931{
2932 PyObject *py_string = 0;
2933 unsigned char l;
2934 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002936 if ((*self->read_func)(self, &s, 1) < 0)
2937 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002939 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002941 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002945 PDATA_PUSH(self->stack, py_string, -1);
2946 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002947}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002948
2949
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002950#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002951static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002952load_unicode(Unpicklerobject *self)
2953{
2954 PyObject *str = 0;
2955 int len, res = -1;
2956 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002958 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2959 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002961 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
2962 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002964 PDATA_PUSH(self->stack, str, -1);
2965 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002967 finally:
2968 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002969}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002970#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002971
2972
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002973#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002974static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002975load_binunicode(Unpicklerobject *self)
2976{
2977 PyObject *unicode;
2978 long l;
2979 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002981 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002983 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002985 if ((*self->read_func)(self, &s, l) < 0)
2986 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002988 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
2989 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002991 PDATA_PUSH(self->stack, unicode, -1);
2992 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002993}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002994#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002995
2996
2997static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002998load_tuple(Unpicklerobject *self)
2999{
3000 PyObject *tup;
3001 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003003 if ((i = marker(self)) < 0) return -1;
3004 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3005 PDATA_PUSH(self->stack, tup, -1);
3006 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003007}
3008
3009static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003010load_empty_tuple(Unpicklerobject *self)
3011{
3012 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003014 if (!( tup=PyTuple_New(0))) return -1;
3015 PDATA_PUSH(self->stack, tup, -1);
3016 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003017}
3018
3019static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003020load_empty_list(Unpicklerobject *self)
3021{
3022 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003024 if (!( list=PyList_New(0))) return -1;
3025 PDATA_PUSH(self->stack, list, -1);
3026 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003027}
3028
3029static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003030load_empty_dict(Unpicklerobject *self)
3031{
3032 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003034 if (!( dict=PyDict_New())) return -1;
3035 PDATA_PUSH(self->stack, dict, -1);
3036 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003037}
3038
3039
3040static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003041load_list(Unpicklerobject *self)
3042{
3043 PyObject *list = 0;
3044 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003046 if ((i = marker(self)) < 0) return -1;
3047 if (!( list=Pdata_popList(self->stack, i))) return -1;
3048 PDATA_PUSH(self->stack, list, -1);
3049 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003050}
3051
3052static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003053load_dict(Unpicklerobject *self)
3054{
3055 PyObject *dict, *key, *value;
3056 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003058 if ((i = marker(self)) < 0) return -1;
3059 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003061 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003063 for (k = i+1; k < j; k += 2) {
3064 key =self->stack->data[k-1];
3065 value=self->stack->data[k ];
3066 if (PyDict_SetItem(dict, key, value) < 0) {
3067 Py_DECREF(dict);
3068 return -1;
3069 }
3070 }
3071 Pdata_clear(self->stack, i);
3072 PDATA_PUSH(self->stack, dict, -1);
3073 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003074}
3075
3076static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003077Instance_New(PyObject *cls, PyObject *args)
3078{
3079 int has_key;
3080 PyObject *safe=0, *r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003082 if (PyClass_Check(cls)) {
3083 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003085 if ((l=PyObject_Size(args)) < 0) goto err;
3086 if (!( l )) {
3087 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003089 __getinitargs__ = PyObject_GetAttr(cls,
3090 __getinitargs___str);
3091 if (!__getinitargs__) {
3092 /* We have a class with no __getinitargs__,
3093 so bypass usual construction */
3094 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003096 PyErr_Clear();
3097 if (!( inst=PyInstance_NewRaw(cls, NULL)))
3098 goto err;
3099 return inst;
3100 }
3101 Py_DECREF(__getinitargs__);
3102 }
Tim Peters84e87f32001-03-17 04:50:51 +00003103
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003104 if ((r=PyInstance_New(cls, args, NULL))) return r;
3105 else goto err;
3106 }
Tim Peters84e87f32001-03-17 04:50:51 +00003107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003108 /* Is safe_constructors always a dict? */
3109 has_key = cPickle_PyMapping_HasKey(safe_constructors, cls);
3110 if (!has_key) {
3111 safe = PyObject_GetAttr(cls, __safe_for_unpickling___str);
3112 if (!safe ||
3113 !PyObject_IsTrue(safe)) {
3114 cPickle_ErrFormat(UnpicklingError,
3115 "%s is not safe for unpickling",
3116 "O", cls);
3117 Py_XDECREF(safe);
3118 return NULL;
3119 }
3120 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003122 if (args==Py_None) {
3123 /* Special case, call cls.__basicnew__() */
3124 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003126 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3127 if (!basicnew) return NULL;
3128 r=PyObject_CallObject(basicnew, NULL);
3129 Py_DECREF(basicnew);
3130 if (r) return r;
3131 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003133 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003135 err:
3136 {
3137 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003139 PyErr_Fetch(&tp, &v, &tb);
3140 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3141 Py_XDECREF(v);
3142 v=r;
3143 }
3144 PyErr_Restore(tp,v,tb);
3145 }
3146 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003147}
Tim Peters84e87f32001-03-17 04:50:51 +00003148
Guido van Rossum60456fd1997-04-09 17:36:32 +00003149
3150static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003151load_obj(Unpicklerobject *self)
3152{
3153 PyObject *class, *tup, *obj=0;
3154 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003156 if ((i = marker(self)) < 0) return -1;
3157 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3158 PDATA_POP(self->stack, class);
3159 if (class) {
3160 obj = Instance_New(class, tup);
3161 Py_DECREF(class);
3162 }
3163 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003165 if (! obj) return -1;
3166 PDATA_PUSH(self->stack, obj, -1);
3167 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003168}
3169
3170
3171static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003172load_inst(Unpicklerobject *self)
3173{
3174 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3175 int i, len;
3176 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003178 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003180 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3181 if (len < 2) return bad_readline();
3182 module_name = PyString_FromStringAndSize(s, len - 1);
3183 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003185 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3186 if (len < 2) return bad_readline();
3187 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3188 class = find_class(module_name, class_name,
3189 self->find_class);
3190 Py_DECREF(class_name);
3191 }
3192 }
3193 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003195 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003197 if ((tup=Pdata_popTuple(self->stack, i))) {
3198 obj = Instance_New(class, tup);
3199 Py_DECREF(tup);
3200 }
3201 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003203 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003205 PDATA_PUSH(self->stack, obj, -1);
3206 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003207}
3208
3209
3210static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003211load_global(Unpicklerobject *self)
3212{
3213 PyObject *class = 0, *module_name = 0, *class_name = 0;
3214 int len;
3215 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003217 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3218 if (len < 2) return bad_readline();
3219 module_name = PyString_FromStringAndSize(s, len - 1);
3220 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003222 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3223 if (len < 2) return bad_readline();
3224 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3225 class = find_class(module_name, class_name,
3226 self->find_class);
3227 Py_DECREF(class_name);
3228 }
3229 }
3230 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003232 if (! class) return -1;
3233 PDATA_PUSH(self->stack, class, -1);
3234 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003235}
3236
3237
3238static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003239load_persid(Unpicklerobject *self)
3240{
3241 PyObject *pid = 0;
3242 int len;
3243 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003245 if (self->pers_func) {
3246 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3247 if (len < 2) return bad_readline();
3248
3249 pid = PyString_FromStringAndSize(s, len - 1);
3250 if (!pid) return -1;
3251
3252 if (PyList_Check(self->pers_func)) {
3253 if (PyList_Append(self->pers_func, pid) < 0) {
3254 Py_DECREF(pid);
3255 return -1;
3256 }
3257 }
3258 else {
3259 ARG_TUP(self, pid);
3260 if (self->arg) {
3261 pid = PyObject_Call(self->pers_func, self->arg,
3262 NULL);
3263 FREE_ARG_TUP(self);
3264 }
3265 }
3266
3267 if (! pid) return -1;
3268
3269 PDATA_PUSH(self->stack, pid, -1);
3270 return 0;
3271 }
3272 else {
3273 PyErr_SetString(UnpicklingError,
3274 "A load persistent id instruction was encountered,\n"
3275 "but no persistent_load function was specified.");
3276 return -1;
3277 }
3278}
3279
3280static int
3281load_binpersid(Unpicklerobject *self)
3282{
3283 PyObject *pid = 0;
3284
3285 if (self->pers_func) {
3286 PDATA_POP(self->stack, pid);
3287 if (! pid) return -1;
3288
3289 if (PyList_Check(self->pers_func)) {
3290 if (PyList_Append(self->pers_func, pid) < 0) {
3291 Py_DECREF(pid);
3292 return -1;
3293 }
3294 }
3295 else {
3296 ARG_TUP(self, pid);
3297 if (self->arg) {
3298 pid = PyObject_Call(self->pers_func, self->arg,
3299 NULL);
3300 FREE_ARG_TUP(self);
3301 }
3302 if (! pid) return -1;
3303 }
3304
3305 PDATA_PUSH(self->stack, pid, -1);
3306 return 0;
3307 }
3308 else {
3309 PyErr_SetString(UnpicklingError,
3310 "A load persistent id instruction was encountered,\n"
3311 "but no persistent_load function was specified.");
3312 return -1;
3313 }
3314}
3315
3316
3317static int
3318load_pop(Unpicklerobject *self)
3319{
3320 int len;
3321
3322 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3323
3324 /* Note that we split the (pickle.py) stack into two stacks,
3325 an object stack and a mark stack. We have to be clever and
3326 pop the right one. We do this by looking at the top of the
3327 mark stack.
3328 */
3329
3330 if ((self->num_marks > 0) &&
3331 (self->marks[self->num_marks - 1] == len))
3332 self->num_marks--;
3333 else {
3334 len--;
3335 Py_DECREF(self->stack->data[len]);
3336 self->stack->length=len;
3337 }
3338
3339 return 0;
3340}
3341
3342
3343static int
3344load_pop_mark(Unpicklerobject *self)
3345{
3346 int i;
3347
3348 if ((i = marker(self)) < 0)
3349 return -1;
3350
3351 Pdata_clear(self->stack, i);
3352
3353 return 0;
3354}
3355
3356
3357static int
3358load_dup(Unpicklerobject *self)
3359{
3360 PyObject *last;
3361 int len;
3362
3363 if ((len = self->stack->length) <= 0) return stackUnderflow();
3364 last=self->stack->data[len-1];
3365 Py_INCREF(last);
3366 PDATA_PUSH(self->stack, last, -1);
3367 return 0;
3368}
3369
3370
3371static int
3372load_get(Unpicklerobject *self)
3373{
3374 PyObject *py_str = 0, *value = 0;
3375 int len;
3376 char *s;
3377 int rc;
3378
3379 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003380 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003382 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003384 value = PyDict_GetItem(self->memo, py_str);
3385 if (! value) {
3386 PyErr_SetObject(BadPickleGet, py_str);
3387 rc = -1;
3388 } else {
3389 PDATA_APPEND(self->stack, value, -1);
3390 rc = 0;
3391 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003393 Py_DECREF(py_str);
3394 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003395}
3396
3397
3398static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003399load_binget(Unpicklerobject *self)
3400{
3401 PyObject *py_key = 0, *value = 0;
3402 unsigned char key;
3403 char *s;
3404 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003406 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003408 key = (unsigned char)s[0];
3409 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003411 value = PyDict_GetItem(self->memo, py_key);
3412 if (! value) {
3413 PyErr_SetObject(BadPickleGet, py_key);
3414 rc = -1;
3415 } else {
3416 PDATA_APPEND(self->stack, value, -1);
3417 rc = 0;
3418 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003420 Py_DECREF(py_key);
3421 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003422}
3423
3424
3425static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003426load_long_binget(Unpicklerobject *self)
3427{
3428 PyObject *py_key = 0, *value = 0;
3429 unsigned char c;
3430 char *s;
3431 long key;
3432 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003434 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003436 c = (unsigned char)s[0];
3437 key = (long)c;
3438 c = (unsigned char)s[1];
3439 key |= (long)c << 8;
3440 c = (unsigned char)s[2];
3441 key |= (long)c << 16;
3442 c = (unsigned char)s[3];
3443 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003445 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3446
3447 value = PyDict_GetItem(self->memo, py_key);
3448 if (! value) {
3449 PyErr_SetObject(BadPickleGet, py_key);
3450 rc = -1;
3451 } else {
3452 PDATA_APPEND(self->stack, value, -1);
3453 rc = 0;
3454 }
3455
3456 Py_DECREF(py_key);
3457 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003458}
3459
3460
3461static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003462load_put(Unpicklerobject *self)
3463{
3464 PyObject *py_str = 0, *value = 0;
3465 int len, l;
3466 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003468 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3469 if (l < 2) return bad_readline();
3470 if (!( len=self->stack->length )) return stackUnderflow();
3471 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3472 value=self->stack->data[len-1];
3473 l=PyDict_SetItem(self->memo, py_str, value);
3474 Py_DECREF(py_str);
3475 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003476}
3477
3478
3479static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003480load_binput(Unpicklerobject *self)
3481{
3482 PyObject *py_key = 0, *value = 0;
3483 unsigned char key;
3484 char *s;
3485 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003487 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3488 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003490 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003492 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3493 value=self->stack->data[len-1];
3494 len=PyDict_SetItem(self->memo, py_key, value);
3495 Py_DECREF(py_key);
3496 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003497}
3498
3499
3500static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003501load_long_binput(Unpicklerobject *self)
3502{
3503 PyObject *py_key = 0, *value = 0;
3504 long key;
3505 unsigned char c;
3506 char *s;
3507 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003509 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3510 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003512 c = (unsigned char)s[0];
3513 key = (long)c;
3514 c = (unsigned char)s[1];
3515 key |= (long)c << 8;
3516 c = (unsigned char)s[2];
3517 key |= (long)c << 16;
3518 c = (unsigned char)s[3];
3519 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003521 if (!( py_key = PyInt_FromLong(key))) return -1;
3522 value=self->stack->data[len-1];
3523 len=PyDict_SetItem(self->memo, py_key, value);
3524 Py_DECREF(py_key);
3525 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003526}
3527
3528
3529static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003530do_append(Unpicklerobject *self, int x)
3531{
3532 PyObject *value = 0, *list = 0, *append_method = 0;
3533 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003535 len=self->stack->length;
3536 if (!( len >= x && x > 0 )) return stackUnderflow();
3537 /* nothing to do */
3538 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003540 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003542 if (PyList_Check(list)) {
3543 PyObject *slice;
3544 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003546 slice=Pdata_popList(self->stack, x);
3547 list_len = PyList_GET_SIZE(list);
3548 i=PyList_SetSlice(list, list_len, list_len, slice);
3549 Py_DECREF(slice);
3550 return i;
3551 }
3552 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003554 if (!( append_method = PyObject_GetAttr(list, append_str)))
3555 return -1;
3556
3557 for (i = x; i < len; i++) {
3558 PyObject *junk;
3559
3560 value=self->stack->data[i];
3561 junk=0;
3562 ARG_TUP(self, value);
3563 if (self->arg) {
3564 junk = PyObject_Call(append_method, self->arg,
3565 NULL);
3566 FREE_ARG_TUP(self);
3567 }
3568 if (! junk) {
3569 Pdata_clear(self->stack, i+1);
3570 self->stack->length=x;
3571 Py_DECREF(append_method);
3572 return -1;
3573 }
3574 Py_DECREF(junk);
3575 }
3576 self->stack->length=x;
3577 Py_DECREF(append_method);
3578 }
3579
3580 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003581}
3582
3583
3584static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003585load_append(Unpicklerobject *self)
3586{
3587 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003588}
3589
3590
3591static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003592load_appends(Unpicklerobject *self)
3593{
3594 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003595}
3596
3597
3598static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003599do_setitems(Unpicklerobject *self, int x)
3600{
3601 PyObject *value = 0, *key = 0, *dict = 0;
3602 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003603
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003604 if (!( (len=self->stack->length) >= x
3605 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003607 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003609 for (i = x+1; i < len; i += 2) {
3610 key =self->stack->data[i-1];
3611 value=self->stack->data[i ];
3612 if (PyObject_SetItem(dict, key, value) < 0) {
3613 r=-1;
3614 break;
3615 }
3616 }
3617
3618 Pdata_clear(self->stack, x);
3619
3620 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003621}
3622
3623
Tim Peters84e87f32001-03-17 04:50:51 +00003624static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003625load_setitem(Unpicklerobject *self)
3626{
3627 return do_setitems(self, self->stack->length - 2);
3628}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003630static int
3631load_setitems(Unpicklerobject *self)
3632{
3633 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003634}
3635
Tim Peters84e87f32001-03-17 04:50:51 +00003636
Guido van Rossum60456fd1997-04-09 17:36:32 +00003637static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003638load_build(Unpicklerobject *self)
3639{
3640 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3641 *junk = 0, *__setstate__ = 0;
3642 int i, r = 0;
3643
3644 if (self->stack->length < 2) return stackUnderflow();
3645 PDATA_POP(self->stack, value);
3646 if (! value) return -1;
3647 inst=self->stack->data[self->stack->length-1];
3648
3649 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3650 ARG_TUP(self, value);
3651 if (self->arg) {
3652 junk = PyObject_Call(__setstate__, self->arg, NULL);
3653 FREE_ARG_TUP(self);
3654 }
3655 Py_DECREF(__setstate__);
3656 if (! junk) return -1;
3657 Py_DECREF(junk);
3658 return 0;
3659 }
3660
3661 PyErr_Clear();
3662 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3663 i = 0;
3664 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3665 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3666 r=-1;
3667 break;
3668 }
3669 }
3670 Py_DECREF(instdict);
3671 }
3672 else r=-1;
3673
3674 Py_XDECREF(value);
3675
3676 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003677}
3678
3679
3680static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003681load_mark(Unpicklerobject *self)
3682{
3683 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003685 /* Note that we split the (pickle.py) stack into two stacks, an
3686 object stack and a mark stack. Here we push a mark onto the
3687 mark stack.
3688 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003690 if ((self->num_marks + 1) >= self->marks_size) {
3691 s=self->marks_size+20;
3692 if (s <= self->num_marks) s=self->num_marks + 1;
3693 if (self->marks == NULL)
3694 self->marks=(int *)malloc(s * sizeof(int));
3695 else
3696 self->marks=(int *)realloc(self->marks,
3697 s * sizeof(int));
3698 if (! self->marks) {
3699 PyErr_NoMemory();
3700 return -1;
3701 }
3702 self->marks_size = s;
3703 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003705 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003707 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003708}
3709
Guido van Rossum60456fd1997-04-09 17:36:32 +00003710static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003711load_reduce(Unpicklerobject *self)
3712{
3713 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003715 PDATA_POP(self->stack, arg_tup);
3716 if (! arg_tup) return -1;
3717 PDATA_POP(self->stack, callable);
3718 if (callable) {
3719 ob = Instance_New(callable, arg_tup);
3720 Py_DECREF(callable);
3721 }
3722 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003724 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003726 PDATA_PUSH(self->stack, ob, -1);
3727 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003728}
Tim Peters84e87f32001-03-17 04:50:51 +00003729
Guido van Rossum60456fd1997-04-09 17:36:32 +00003730static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003731load(Unpicklerobject *self)
3732{
3733 PyObject *err = 0, *val = 0;
3734 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003736 self->num_marks = 0;
3737 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003739 while (1) {
3740 if ((*self->read_func)(self, &s, 1) < 0)
3741 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003743 switch (s[0]) {
3744 case NONE:
3745 if (load_none(self) < 0)
3746 break;
3747 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003749 case BININT:
3750 if (load_binint(self) < 0)
3751 break;
3752 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003754 case BININT1:
3755 if (load_binint1(self) < 0)
3756 break;
3757 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003759 case BININT2:
3760 if (load_binint2(self) < 0)
3761 break;
3762 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003764 case INT:
3765 if (load_int(self) < 0)
3766 break;
3767 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003769 case LONG:
3770 if (load_long(self) < 0)
3771 break;
3772 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003774 case FLOAT:
3775 if (load_float(self) < 0)
3776 break;
3777 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003779 case BINFLOAT:
3780 if (load_binfloat(self) < 0)
3781 break;
3782 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003784 case BINSTRING:
3785 if (load_binstring(self) < 0)
3786 break;
3787 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003789 case SHORT_BINSTRING:
3790 if (load_short_binstring(self) < 0)
3791 break;
3792 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003794 case STRING:
3795 if (load_string(self) < 0)
3796 break;
3797 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003798
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003799#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003800 case UNICODE:
3801 if (load_unicode(self) < 0)
3802 break;
3803 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003805 case BINUNICODE:
3806 if (load_binunicode(self) < 0)
3807 break;
3808 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003809#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003811 case EMPTY_TUPLE:
3812 if (load_empty_tuple(self) < 0)
3813 break;
3814 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003816 case TUPLE:
3817 if (load_tuple(self) < 0)
3818 break;
3819 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003821 case EMPTY_LIST:
3822 if (load_empty_list(self) < 0)
3823 break;
3824 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003825
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003826 case LIST:
3827 if (load_list(self) < 0)
3828 break;
3829 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003831 case EMPTY_DICT:
3832 if (load_empty_dict(self) < 0)
3833 break;
3834 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003836 case DICT:
3837 if (load_dict(self) < 0)
3838 break;
3839 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003841 case OBJ:
3842 if (load_obj(self) < 0)
3843 break;
3844 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003846 case INST:
3847 if (load_inst(self) < 0)
3848 break;
3849 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003851 case GLOBAL:
3852 if (load_global(self) < 0)
3853 break;
3854 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003856 case APPEND:
3857 if (load_append(self) < 0)
3858 break;
3859 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003861 case APPENDS:
3862 if (load_appends(self) < 0)
3863 break;
3864 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003866 case BUILD:
3867 if (load_build(self) < 0)
3868 break;
3869 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003871 case DUP:
3872 if (load_dup(self) < 0)
3873 break;
3874 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003876 case BINGET:
3877 if (load_binget(self) < 0)
3878 break;
3879 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003881 case LONG_BINGET:
3882 if (load_long_binget(self) < 0)
3883 break;
3884 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003886 case GET:
3887 if (load_get(self) < 0)
3888 break;
3889 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003891 case MARK:
3892 if (load_mark(self) < 0)
3893 break;
3894 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003896 case BINPUT:
3897 if (load_binput(self) < 0)
3898 break;
3899 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003901 case LONG_BINPUT:
3902 if (load_long_binput(self) < 0)
3903 break;
3904 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003905
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003906 case PUT:
3907 if (load_put(self) < 0)
3908 break;
3909 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003911 case POP:
3912 if (load_pop(self) < 0)
3913 break;
3914 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003916 case POP_MARK:
3917 if (load_pop_mark(self) < 0)
3918 break;
3919 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003921 case SETITEM:
3922 if (load_setitem(self) < 0)
3923 break;
3924 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003926 case SETITEMS:
3927 if (load_setitems(self) < 0)
3928 break;
3929 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003930
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003931 case STOP:
3932 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003934 case PERSID:
3935 if (load_persid(self) < 0)
3936 break;
3937 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003939 case BINPERSID:
3940 if (load_binpersid(self) < 0)
3941 break;
3942 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003944 case REDUCE:
3945 if (load_reduce(self) < 0)
3946 break;
3947 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003949 case '\0':
3950 /* end of file */
3951 PyErr_SetNone(PyExc_EOFError);
3952 break;
Neil Schemenauerfa79c652002-03-22 23:02:53 +00003953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003954 default:
3955 cPickle_ErrFormat(UnpicklingError,
3956 "invalid load key, '%s'.",
3957 "c", s[0]);
3958 return NULL;
3959 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003961 break;
3962 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003964 if ((err = PyErr_Occurred())) {
3965 if (err == PyExc_EOFError) {
3966 PyErr_SetNone(PyExc_EOFError);
3967 }
3968 return NULL;
3969 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003970
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003971 PDATA_POP(self->stack, val);
3972 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003973}
Tim Peters84e87f32001-03-17 04:50:51 +00003974
Guido van Rossum60456fd1997-04-09 17:36:32 +00003975
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003976/* No-load functions to support noload, which is used to
3977 find persistent references. */
3978
3979static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003980noload_obj(Unpicklerobject *self)
3981{
3982 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003984 if ((i = marker(self)) < 0) return -1;
3985 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003986}
3987
3988
3989static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003990noload_inst(Unpicklerobject *self)
3991{
3992 int i;
3993 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003995 if ((i = marker(self)) < 0) return -1;
3996 Pdata_clear(self->stack, i);
3997 if ((*self->readline_func)(self, &s) < 0) return -1;
3998 if ((*self->readline_func)(self, &s) < 0) return -1;
3999 PDATA_APPEND(self->stack, Py_None,-1);
4000 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004001}
4002
4003static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004004noload_global(Unpicklerobject *self)
4005{
4006 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004008 if ((*self->readline_func)(self, &s) < 0) return -1;
4009 if ((*self->readline_func)(self, &s) < 0) return -1;
4010 PDATA_APPEND(self->stack, Py_None,-1);
4011 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004012}
4013
4014static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004015noload_reduce(Unpicklerobject *self)
4016{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004018 if (self->stack->length < 2) return stackUnderflow();
4019 Pdata_clear(self->stack, self->stack->length-2);
4020 PDATA_APPEND(self->stack, Py_None,-1);
4021 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004022}
4023
4024static int
4025noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004026
Guido van Rossum053b8df1998-11-25 16:18:00 +00004027 if (self->stack->length < 1) return stackUnderflow();
4028 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004029 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004030}
4031
4032
4033static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004034noload(Unpicklerobject *self)
4035{
4036 PyObject *err = 0, *val = 0;
4037 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004039 self->num_marks = 0;
4040 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004042 while (1) {
4043 if ((*self->read_func)(self, &s, 1) < 0)
4044 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004046 switch (s[0]) {
4047 case NONE:
4048 if (load_none(self) < 0)
4049 break;
4050 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004052 case BININT:
4053 if (load_binint(self) < 0)
4054 break;
4055 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004057 case BININT1:
4058 if (load_binint1(self) < 0)
4059 break;
4060 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004062 case BININT2:
4063 if (load_binint2(self) < 0)
4064 break;
4065 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004067 case INT:
4068 if (load_int(self) < 0)
4069 break;
4070 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004072 case LONG:
4073 if (load_long(self) < 0)
4074 break;
4075 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004077 case FLOAT:
4078 if (load_float(self) < 0)
4079 break;
4080 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004082 case BINFLOAT:
4083 if (load_binfloat(self) < 0)
4084 break;
4085 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004087 case BINSTRING:
4088 if (load_binstring(self) < 0)
4089 break;
4090 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004092 case SHORT_BINSTRING:
4093 if (load_short_binstring(self) < 0)
4094 break;
4095 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004097 case STRING:
4098 if (load_string(self) < 0)
4099 break;
4100 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004101
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004102#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004103 case UNICODE:
4104 if (load_unicode(self) < 0)
4105 break;
4106 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004108 case BINUNICODE:
4109 if (load_binunicode(self) < 0)
4110 break;
4111 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004112#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004114 case EMPTY_TUPLE:
4115 if (load_empty_tuple(self) < 0)
4116 break;
4117 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004119 case TUPLE:
4120 if (load_tuple(self) < 0)
4121 break;
4122 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004124 case EMPTY_LIST:
4125 if (load_empty_list(self) < 0)
4126 break;
4127 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004129 case LIST:
4130 if (load_list(self) < 0)
4131 break;
4132 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004134 case EMPTY_DICT:
4135 if (load_empty_dict(self) < 0)
4136 break;
4137 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004139 case DICT:
4140 if (load_dict(self) < 0)
4141 break;
4142 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004144 case OBJ:
4145 if (noload_obj(self) < 0)
4146 break;
4147 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004148
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004149 case INST:
4150 if (noload_inst(self) < 0)
4151 break;
4152 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004154 case GLOBAL:
4155 if (noload_global(self) < 0)
4156 break;
4157 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004159 case APPEND:
4160 if (load_append(self) < 0)
4161 break;
4162 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004164 case APPENDS:
4165 if (load_appends(self) < 0)
4166 break;
4167 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004169 case BUILD:
4170 if (noload_build(self) < 0)
4171 break;
4172 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004174 case DUP:
4175 if (load_dup(self) < 0)
4176 break;
4177 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004179 case BINGET:
4180 if (load_binget(self) < 0)
4181 break;
4182 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004184 case LONG_BINGET:
4185 if (load_long_binget(self) < 0)
4186 break;
4187 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004189 case GET:
4190 if (load_get(self) < 0)
4191 break;
4192 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004194 case MARK:
4195 if (load_mark(self) < 0)
4196 break;
4197 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004199 case BINPUT:
4200 if (load_binput(self) < 0)
4201 break;
4202 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004204 case LONG_BINPUT:
4205 if (load_long_binput(self) < 0)
4206 break;
4207 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004209 case PUT:
4210 if (load_put(self) < 0)
4211 break;
4212 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004214 case POP:
4215 if (load_pop(self) < 0)
4216 break;
4217 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004219 case POP_MARK:
4220 if (load_pop_mark(self) < 0)
4221 break;
4222 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004224 case SETITEM:
4225 if (load_setitem(self) < 0)
4226 break;
4227 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004229 case SETITEMS:
4230 if (load_setitems(self) < 0)
4231 break;
4232 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004234 case STOP:
4235 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004237 case PERSID:
4238 if (load_persid(self) < 0)
4239 break;
4240 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004242 case BINPERSID:
4243 if (load_binpersid(self) < 0)
4244 break;
4245 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004247 case REDUCE:
4248 if (noload_reduce(self) < 0)
4249 break;
4250 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004251
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004252 default:
4253 cPickle_ErrFormat(UnpicklingError,
4254 "invalid load key, '%s'.",
4255 "c", s[0]);
4256 return NULL;
4257 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004259 break;
4260 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004261
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004262 if ((err = PyErr_Occurred())) {
4263 if (err == PyExc_EOFError) {
4264 PyErr_SetNone(PyExc_EOFError);
4265 }
4266 return NULL;
4267 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004269 PDATA_POP(self->stack, val);
4270 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004271}
Tim Peters84e87f32001-03-17 04:50:51 +00004272
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004273
Guido van Rossum60456fd1997-04-09 17:36:32 +00004274static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004275Unpickler_load(Unpicklerobject *self, PyObject *args)
4276{
4277 if (!( PyArg_ParseTuple(args, ":load")))
4278 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004280 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004281}
4282
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004283static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004284Unpickler_noload(Unpicklerobject *self, PyObject *args)
4285{
4286 if (!( PyArg_ParseTuple(args, ":noload")))
4287 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004289 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004290}
4291
Guido van Rossum60456fd1997-04-09 17:36:32 +00004292
4293static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004294 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004295 "load() -- Load a pickle"
4296 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004297 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004298 "noload() -- not load a pickle, but go through most of the motions\n"
4299 "\n"
4300 "This function can be used to read past a pickle without instantiating\n"
4301 "any objects or importing any modules. It can also be used to find all\n"
4302 "persistent references without instantiating any objects or importing\n"
4303 "any modules.\n"
4304 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004305 {NULL, NULL} /* sentinel */
4306};
4307
4308
4309static Unpicklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004310newUnpicklerobject(PyObject *f)
4311{
4312 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004314 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
4315 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004317 self->file = NULL;
4318 self->arg = NULL;
4319 self->stack = (Pdata*)Pdata_New();
4320 self->pers_func = NULL;
4321 self->last_string = NULL;
4322 self->marks = NULL;
4323 self->num_marks = 0;
4324 self->marks_size = 0;
4325 self->buf_size = 0;
4326 self->read = NULL;
4327 self->readline = NULL;
4328 self->safe_constructors = NULL;
4329 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004331 if (!( self->memo = PyDict_New()))
4332 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004334 Py_INCREF(f);
4335 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004337 /* Set read, readline based on type of f */
4338 if (PyFile_Check(f)) {
4339 self->fp = PyFile_AsFile(f);
4340 if (self->fp == NULL) {
4341 PyErr_SetString(PyExc_ValueError,
4342 "I/O operation on closed file");
4343 goto err;
4344 }
4345 self->read_func = read_file;
4346 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004347 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004348 else if (PycStringIO_InputCheck(f)) {
4349 self->fp = NULL;
4350 self->read_func = read_cStringIO;
4351 self->readline_func = readline_cStringIO;
4352 }
4353 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004355 self->fp = NULL;
4356 self->read_func = read_other;
4357 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004359 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4360 (self->read = PyObject_GetAttr(f, read_str)))) {
4361 PyErr_Clear();
4362 PyErr_SetString( PyExc_TypeError,
4363 "argument must have 'read' and "
4364 "'readline' attributes" );
4365 goto err;
4366 }
4367 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004369 if (PyEval_GetRestricted()) {
4370 /* Restricted execution, get private tables */
4371 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004373 if (!( m=PyImport_Import(copy_reg_str))) goto err;
4374 self->safe_constructors=PyObject_GetAttr(m,
4375 safe_constructors_str);
4376 Py_DECREF(m);
4377 if (!( self->safe_constructors )) goto err;
4378 }
4379 else {
4380 self->safe_constructors=safe_constructors;
4381 Py_INCREF(safe_constructors);
4382 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004384 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004386 err:
4387 Py_DECREF((PyObject *)self);
4388 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004389}
4390
4391
4392static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004393get_Unpickler(PyObject *self, PyObject *args)
4394{
4395 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004397 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
4398 return NULL;
4399 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004400}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004401
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004402
Guido van Rossum60456fd1997-04-09 17:36:32 +00004403static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004404Unpickler_dealloc(Unpicklerobject *self)
4405{
4406 Py_XDECREF(self->readline);
4407 Py_XDECREF(self->read);
4408 Py_XDECREF(self->file);
4409 Py_XDECREF(self->memo);
4410 Py_XDECREF(self->stack);
4411 Py_XDECREF(self->pers_func);
4412 Py_XDECREF(self->arg);
4413 Py_XDECREF(self->last_string);
4414 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004416 if (self->marks) {
4417 free(self->marks);
4418 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004420 if (self->buf_size) {
4421 free(self->buf);
4422 }
Tim Peters84e87f32001-03-17 04:50:51 +00004423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004424 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004425}
4426
4427
4428static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004429Unpickler_getattr(Unpicklerobject *self, char *name)
4430{
4431 if (!strcmp(name, "persistent_load")) {
4432 if (!self->pers_func) {
4433 PyErr_SetString(PyExc_AttributeError, name);
4434 return NULL;
4435 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004437 Py_INCREF(self->pers_func);
4438 return self->pers_func;
4439 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004441 if (!strcmp(name, "find_global")) {
4442 if (!self->find_class) {
4443 PyErr_SetString(PyExc_AttributeError, name);
4444 return NULL;
4445 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004447 Py_INCREF(self->find_class);
4448 return self->find_class;
4449 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004451 if (!strcmp(name, "memo")) {
4452 if (!self->memo) {
4453 PyErr_SetString(PyExc_AttributeError, name);
4454 return NULL;
4455 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004456
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004457 Py_INCREF(self->memo);
4458 return self->memo;
4459 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004461 if (!strcmp(name, "UnpicklingError")) {
4462 Py_INCREF(UnpicklingError);
4463 return UnpicklingError;
4464 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004466 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004467}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004468
Guido van Rossum60456fd1997-04-09 17:36:32 +00004469
4470static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004471Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
4472{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004474 if (!strcmp(name, "persistent_load")) {
4475 Py_XDECREF(self->pers_func);
4476 self->pers_func = value;
4477 Py_XINCREF(value);
4478 return 0;
4479 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004481 if (!strcmp(name, "find_global")) {
4482 Py_XDECREF(self->find_class);
4483 self->find_class = value;
4484 Py_XINCREF(value);
4485 return 0;
4486 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004488 if (! value) {
4489 PyErr_SetString(PyExc_TypeError,
4490 "attribute deletion is not supported");
4491 return -1;
4492 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004494 if (strcmp(name, "memo") == 0) {
4495 if (!PyDict_Check(value)) {
4496 PyErr_SetString(PyExc_TypeError,
4497 "memo must be a dictionary");
4498 return -1;
4499 }
4500 Py_XDECREF(self->memo);
4501 self->memo = value;
4502 Py_INCREF(value);
4503 return 0;
4504 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004506 PyErr_SetString(PyExc_AttributeError, name);
4507 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004508}
4509
4510
4511static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004512cpm_dump(PyObject *self, PyObject *args)
4513{
4514 PyObject *ob, *file, *res = NULL;
4515 Picklerobject *pickler = 0;
4516 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004518 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin)))
4519 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004521 if (!( pickler = newPicklerobject(file, bin)))
4522 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004524 if (dump(pickler, ob) < 0)
4525 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004527 Py_INCREF(Py_None);
4528 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004530 finally:
4531 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004533 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004534}
4535
4536
4537static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004538cpm_dumps(PyObject *self, PyObject *args)
4539{
4540 PyObject *ob, *file = 0, *res = NULL;
4541 Picklerobject *pickler = 0;
4542 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004544 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin)))
4545 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004546
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004547 if (!( file = PycStringIO->NewOutput(128)))
4548 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004550 if (!( pickler = newPicklerobject(file, bin)))
4551 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004553 if (dump(pickler, ob) < 0)
4554 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004556 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004558 finally:
4559 Py_XDECREF(pickler);
4560 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004562 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004563}
4564
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004565
4566static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004567cpm_load(PyObject *self, PyObject *args)
4568{
4569 Unpicklerobject *unpickler = 0;
4570 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004571
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004572 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
4573 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004575 if (!( unpickler = newUnpicklerobject(ob)))
4576 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004578 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004580 finally:
4581 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004583 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004584}
4585
4586
4587static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004588cpm_loads(PyObject *self, PyObject *args)
4589{
4590 PyObject *ob, *file = 0, *res = NULL;
4591 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004592
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004593 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
4594 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004596 if (!( file = PycStringIO->NewInput(ob)))
4597 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004598
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004599 if (!( unpickler = newUnpicklerobject(file)))
4600 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004602 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004603
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004604 finally:
4605 Py_XDECREF(file);
4606 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004608 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004609}
4610
4611
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004612PyDoc_STRVAR(Unpicklertype__doc__,
4613"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004614
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004615static PyTypeObject Unpicklertype = {
4616 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004617 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004618 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004619 sizeof(Unpicklerobject), /*tp_basicsize*/
4620 0, /*tp_itemsize*/
4621 /* methods */
4622 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4623 (printfunc)0, /*tp_print*/
4624 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4625 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4626 (cmpfunc)0, /*tp_compare*/
4627 (reprfunc)0, /*tp_repr*/
4628 0, /*tp_as_number*/
4629 0, /*tp_as_sequence*/
4630 0, /*tp_as_mapping*/
4631 (hashfunc)0, /*tp_hash*/
4632 (ternaryfunc)0, /*tp_call*/
4633 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004634
Guido van Rossum60456fd1997-04-09 17:36:32 +00004635 /* Space for future expansion */
4636 0L,0L,0L,0L,
4637 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004638};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004639
Guido van Rossum60456fd1997-04-09 17:36:32 +00004640static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004641 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004642 "dump(object, file, [binary]) --"
4643 "Write an object in pickle format to the given file\n"
4644 "\n"
4645 "If the optional argument, binary, is provided and is true, then the\n"
4646 "pickle will be written in binary format, which is more space and\n"
4647 "computationally efficient. \n"
4648 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004649 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004650 "dumps(object, [binary]) --"
4651 "Return a string containing an object in pickle format\n"
4652 "\n"
4653 "If the optional argument, binary, is provided and is true, then the\n"
4654 "pickle will be written in binary format, which is more space and\n"
4655 "computationally efficient. \n"
4656 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004657 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004658 "load(file) -- Load a pickle from the given file"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004659 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004660 "loads(string) -- Load a pickle from the given string"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004661 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004662 "Pickler(file, [binary]) -- Create a pickler\n"
4663 "\n"
4664 "If the optional argument, binary, is provided and is true, then\n"
4665 "pickles will be written in binary format, which is more space and\n"
4666 "computationally efficient. \n"
4667 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004668 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004669 "Unpickler(file) -- Create an unpickler"},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004670 { NULL, NULL }
4671};
4672
Guido van Rossum60456fd1997-04-09 17:36:32 +00004673static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004674init_stuff(PyObject *module_dict)
4675{
4676 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004677
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004678#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004680 INIT_STR(__class__);
4681 INIT_STR(__getinitargs__);
4682 INIT_STR(__dict__);
4683 INIT_STR(__getstate__);
4684 INIT_STR(__setstate__);
4685 INIT_STR(__name__);
4686 INIT_STR(__main__);
4687 INIT_STR(__reduce__);
4688 INIT_STR(write);
4689 INIT_STR(__safe_for_unpickling__);
4690 INIT_STR(append);
4691 INIT_STR(read);
4692 INIT_STR(readline);
4693 INIT_STR(copy_reg);
4694 INIT_STR(dispatch_table);
4695 INIT_STR(safe_constructors);
4696 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004698 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
4699 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004701 /* These next few are special because we want to use different
4702 ones in restricted mode. */
4703 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
4704 if (!dispatch_table)
4705 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004707 if (!( safe_constructors = PyObject_GetAttr(copy_reg,
4708 safe_constructors_str)))
4709 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004711 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004713 /* Down to here ********************************** */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004715 if (!( empty_tuple = PyTuple_New(0)))
4716 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004718 /* Ugh */
4719 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4720 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4721 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004723 if (!( t=PyDict_New())) return -1;
4724 if (!( r=PyRun_String(
4725 "def __init__(self, *args): self.args=args\n\n"
4726 "def __str__(self):\n"
4727 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4728 Py_file_input,
4729 module_dict, t) )) return -1;
4730 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004732 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
4733 if (!PickleError)
4734 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004736 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004738 PicklingError = PyErr_NewException("cPickle.PicklingError",
4739 PickleError, NULL);
4740 if (!PicklingError)
4741 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004743 if (!( t=PyDict_New())) return -1;
4744 if (!( r=PyRun_String(
4745 "def __init__(self, *args): self.args=args\n\n"
4746 "def __str__(self):\n"
4747 " a=self.args\n"
4748 " a=a and type(a[0]) or '(what)'\n"
4749 " return 'Cannot pickle %s objects' % a\n"
4750 , Py_file_input,
4751 module_dict, t) )) return -1;
4752 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004754 if (!( UnpickleableError = PyErr_NewException(
4755 "cPickle.UnpickleableError", PicklingError, t)))
4756 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004758 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004760 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
4761 PickleError, NULL)))
4762 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004764 if (PyDict_SetItemString(module_dict, "PickleError",
4765 PickleError) < 0)
4766 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004768 if (PyDict_SetItemString(module_dict, "PicklingError",
4769 PicklingError) < 0)
4770 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004772 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4773 UnpicklingError) < 0)
4774 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004776 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4777 UnpickleableError) < 0)
4778 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004780 if (!( BadPickleGet = PyString_FromString("cPickle.BadPickleGet")))
4781 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004783 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4784 BadPickleGet) < 0)
4785 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004787 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004789 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004790}
4791
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004792#ifndef DL_EXPORT /* declarations for DLL import/export */
4793#define DL_EXPORT(RTYPE) RTYPE
4794#endif
Guido van Rossum50f385c1998-12-04 18:48:44 +00004795DL_EXPORT(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004796initcPickle(void)
4797{
4798 PyObject *m, *d, *di, *v, *k;
4799 int i;
4800 char *rev="1.71";
4801 PyObject *format_version;
4802 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004804 Picklertype.ob_type = &PyType_Type;
4805 Picklertype.tp_getattro = PyObject_GenericGetAttr;
4806 Picklertype.tp_setattro = PyObject_GenericSetAttr;
4807 Unpicklertype.ob_type = &PyType_Type;
4808 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004810 /* Initialize some pieces. We need to do this before module creation,
4811 so we're forced to use a temporary dictionary. :(
4812 */
4813 di=PyDict_New();
4814 if (!di) return;
4815 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004817 /* Create the module and add the functions */
4818 m = Py_InitModule4("cPickle", cPickle_methods,
4819 cPickle_module_documentation,
4820 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004822 /* Add some symbolic constants to the module */
4823 d = PyModule_GetDict(m);
4824 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4825 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004827 /* Copy data from di. Waaa. */
4828 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4829 if (PyObject_SetItem(d, k, v) < 0) {
4830 Py_DECREF(di);
4831 return;
4832 }
4833 }
4834 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004836 format_version = PyString_FromString("1.3");
4837 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004839 PyDict_SetItemString(d, "format_version", format_version);
4840 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4841 Py_XDECREF(format_version);
4842 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004843}