blob: 9412ad9718ca7e46229c4de1d6f4c46b89c80b03 [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
Guido van Rossum053b8df1998-11-25 16:18:00 +0000228#define PDATA_APPEND(D,O,ER) { \
229 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
230 Pdata_grow((Pdata*)(D)) < 0) \
231 return ER; \
232 Py_INCREF(O); \
233 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
234}
235
236#define PDATA_PUSH(D,O,ER) { \
237 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
238 Pdata_grow((Pdata*)(D)) < 0) { \
239 Py_DECREF(O); \
240 return ER; \
241 } \
242 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
243}
244
245/*************************************************************************/
246
247#define ARG_TUP(self, o) { \
248 if (self->arg || (self->arg=PyTuple_New(1))) { \
249 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
250 PyTuple_SET_ITEM(self->arg,0,o); \
251 } \
252 else { \
253 Py_DECREF(o); \
254 } \
255}
256
257#define FREE_ARG_TUP(self) { \
258 if (self->arg->ob_refcnt > 1) { \
259 Py_DECREF(self->arg); \
260 self->arg=NULL; \
261 } \
262 }
263
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000264typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000265 PyObject_HEAD
266 FILE *fp;
267 PyObject *write;
268 PyObject *file;
269 PyObject *memo;
270 PyObject *arg;
271 PyObject *pers_func;
272 PyObject *inst_pers_func;
273 int bin;
274 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000275 int nesting;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000276 int (*write_func)(struct Picklerobject *, char *, int);
277 char *write_buf;
278 int buf_size;
279 PyObject *dispatch_table;
280 int fast_container; /* count nested container dumps */
281 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000282} Picklerobject;
283
Barry Warsaw52acb492001-12-21 20:04:22 +0000284#ifndef PY_CPICKLE_FAST_LIMIT
285#define PY_CPICKLE_FAST_LIMIT 50
286#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000287
Jeremy Hylton938ace62002-07-17 16:30:39 +0000288static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000289
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000290typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000291 PyObject_HEAD
292 FILE *fp;
293 PyObject *file;
294 PyObject *readline;
295 PyObject *read;
296 PyObject *memo;
297 PyObject *arg;
298 Pdata *stack;
299 PyObject *mark;
300 PyObject *pers_func;
301 PyObject *last_string;
302 int *marks;
303 int num_marks;
304 int marks_size;
305 int (*read_func)(struct Unpicklerobject *, char **, int);
306 int (*readline_func)(struct Unpicklerobject *, char **);
307 int buf_size;
308 char *buf;
309 PyObject *safe_constructors;
310 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000311} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000312
Jeremy Hylton938ace62002-07-17 16:30:39 +0000313static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000314
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000315/* Forward decls that need the above structs */
316static int save(Picklerobject *, PyObject *, int);
317static int put2(Picklerobject *, PyObject *);
318
Tim Peters84e87f32001-03-17 04:50:51 +0000319int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000320cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
321{
322 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000324 if ((v = PyObject_GetItem(o,key))) {
325 Py_DECREF(v);
326 return 1;
327 }
328
329 PyErr_Clear();
330 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000331}
332
Guido van Rossumd385d591997-04-09 17:47:47 +0000333static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000334PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000335cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
336{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000337 va_list va;
338 PyObject *args=0, *retval=0;
339 va_start(va, format);
340
341 if (format) args = Py_VaBuildValue(format, va);
342 va_end(va);
343 if (format && ! args) return NULL;
344 if (stringformat && !(retval=PyString_FromString(stringformat)))
345 return NULL;
346
347 if (retval) {
348 if (args) {
349 PyObject *v;
350 v=PyString_Format(retval, args);
351 Py_DECREF(retval);
352 Py_DECREF(args);
353 if (! v) return NULL;
354 retval=v;
355 }
356 }
357 else
358 if (args) retval=args;
359 else {
360 PyErr_SetObject(ErrType,Py_None);
361 return NULL;
362 }
363 PyErr_SetObject(ErrType,retval);
364 Py_DECREF(retval);
365 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000366}
367
Tim Peters84e87f32001-03-17 04:50:51 +0000368static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000369write_file(Picklerobject *self, char *s, int n)
370{
371 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000373 if (s == NULL) {
374 return 0;
375 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000377 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000378 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000379 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000380 if (nbyteswritten != (size_t)n) {
381 PyErr_SetFromErrno(PyExc_IOError);
382 return -1;
383 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000385 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000386}
387
Tim Peters84e87f32001-03-17 04:50:51 +0000388static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000389write_cStringIO(Picklerobject *self, char *s, int n)
390{
391 if (s == NULL) {
392 return 0;
393 }
394
395 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
396 return -1;
397 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000399 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000400}
401
Tim Peters84e87f32001-03-17 04:50:51 +0000402static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000403write_none(Picklerobject *self, char *s, int n)
404{
405 if (s == NULL) return 0;
406 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000407}
408
Tim Peters84e87f32001-03-17 04:50:51 +0000409static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000410write_other(Picklerobject *self, char *s, int n)
411{
412 PyObject *py_str = 0, *junk = 0;
413
414 if (s == NULL) {
415 if (!( self->buf_size )) return 0;
416 py_str = PyString_FromStringAndSize(self->write_buf,
417 self->buf_size);
418 if (!py_str)
419 return -1;
420 }
421 else {
422 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
423 if (write_other(self, NULL, 0) < 0)
424 return -1;
425 }
426
427 if (n > WRITE_BUF_SIZE) {
428 if (!( py_str =
429 PyString_FromStringAndSize(s, n)))
430 return -1;
431 }
432 else {
433 memcpy(self->write_buf + self->buf_size, s, n);
434 self->buf_size += n;
435 return n;
436 }
437 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000439 if (self->write) {
440 /* object with write method */
441 ARG_TUP(self, py_str);
442 if (self->arg) {
443 junk = PyObject_Call(self->write, self->arg, NULL);
444 FREE_ARG_TUP(self);
445 }
446 if (junk) Py_DECREF(junk);
447 else return -1;
448 }
449 else
450 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000452 self->buf_size = 0;
453 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000454}
455
456
Tim Peters84e87f32001-03-17 04:50:51 +0000457static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000458read_file(Unpicklerobject *self, char **s, int n)
459{
460 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000462 if (self->buf_size == 0) {
463 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000465 size = ((n < 32) ? 32 : n);
466 if (!( self->buf = (char *)malloc(size * sizeof(char)))) {
467 PyErr_NoMemory();
468 return -1;
469 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000471 self->buf_size = size;
472 }
473 else if (n > self->buf_size) {
474 self->buf = (char *)realloc(self->buf, n * sizeof(char));
475 if (!self->buf) {
476 PyErr_NoMemory();
477 return -1;
478 }
Tim Peters84e87f32001-03-17 04:50:51 +0000479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000480 self->buf_size = n;
481 }
Tim Peters84e87f32001-03-17 04:50:51 +0000482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000483 Py_BEGIN_ALLOW_THREADS
484 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
485 Py_END_ALLOW_THREADS
486 if (nbytesread != (size_t)n) {
487 if (feof(self->fp)) {
488 PyErr_SetNone(PyExc_EOFError);
489 return -1;
490 }
491
492 PyErr_SetFromErrno(PyExc_IOError);
493 return -1;
494 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000496 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000498 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000499}
500
501
Tim Peters84e87f32001-03-17 04:50:51 +0000502static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000503readline_file(Unpicklerobject *self, char **s)
504{
505 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000507 if (self->buf_size == 0) {
508 if (!( self->buf = (char *)malloc(40 * sizeof(char)))) {
509 PyErr_NoMemory();
510 return -1;
511 }
Tim Peters84e87f32001-03-17 04:50:51 +0000512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000513 self->buf_size = 40;
514 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000516 i = 0;
517 while (1) {
518 for (; i < (self->buf_size - 1); i++) {
519 if (feof(self->fp) ||
520 (self->buf[i] = getc(self->fp)) == '\n') {
521 self->buf[i + 1] = '\0';
522 *s = self->buf;
523 return i + 1;
524 }
525 }
526 self->buf = (char *)realloc(self->buf,
527 (self->buf_size * 2) * sizeof(char));
528 if (!self->buf) {
529 PyErr_NoMemory();
530 return -1;
531 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000533 self->buf_size *= 2;
534 }
Tim Peters84e87f32001-03-17 04:50:51 +0000535}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000536
537
Tim Peters84e87f32001-03-17 04:50:51 +0000538static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000539read_cStringIO(Unpicklerobject *self, char **s, int n)
540{
541 char *ptr;
542
543 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
544 PyErr_SetNone(PyExc_EOFError);
545 return -1;
546 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000548 *s = ptr;
549
550 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000551}
552
553
Tim Peters84e87f32001-03-17 04:50:51 +0000554static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000555readline_cStringIO(Unpicklerobject *self, char **s)
556{
557 int n;
558 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000560 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
561 return -1;
562 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000564 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000566 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000567}
568
569
Tim Peters84e87f32001-03-17 04:50:51 +0000570static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000571read_other(Unpicklerobject *self, char **s, int n)
572{
573 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000575 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000577 ARG_TUP(self, bytes);
578 if (self->arg) {
579 str = PyObject_Call(self->read, self->arg, NULL);
580 FREE_ARG_TUP(self);
581 }
582 if (! str) return -1;
583
584 Py_XDECREF(self->last_string);
585 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000587 if (! (*s = PyString_AsString(str))) return -1;
588 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000589}
590
591
Tim Peters84e87f32001-03-17 04:50:51 +0000592static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000593readline_other(Unpicklerobject *self, char **s)
594{
595 PyObject *str;
596 int str_size;
597
598 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
599 return -1;
600 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000602 if ((str_size = PyString_Size(str)) < 0)
603 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000605 Py_XDECREF(self->last_string);
606 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000608 if (! (*s = PyString_AsString(str)))
609 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000611 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000612}
613
614
615static char *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000616pystrndup(char *s, int l)
617{
618 char *r;
619 if (!( r=malloc((l+1)*sizeof(char)))) return (char*)PyErr_NoMemory();
620 memcpy(r,s,l);
621 r[l]=0;
622 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000623}
624
625
626static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000627get(Picklerobject *self, PyObject *id)
628{
629 PyObject *value, *mv;
630 long c_value;
631 char s[30];
632 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000634 if (!( mv = PyDict_GetItem(self->memo, id))) {
635 PyErr_SetObject(PyExc_KeyError, id);
636 return -1;
637 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000639 if (!( value = PyTuple_GetItem(mv, 0)))
640 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000642 if (!( PyInt_Check(value))) {
643 PyErr_SetString(PicklingError, "no int where int expected in memo");
644 return -1;
645 }
646 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000648 if (!self->bin) {
649 s[0] = GET;
650 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
651 len = strlen(s);
652 }
653 else if (Pdata_Check(self->file)) {
654 if (write_other(self, NULL, 0) < 0) return -1;
655 PDATA_APPEND(self->file, mv, -1);
656 return 0;
657 }
658 else {
659 if (c_value < 256) {
660 s[0] = BINGET;
661 s[1] = (int)(c_value & 0xff);
662 len = 2;
663 }
664 else {
665 s[0] = LONG_BINGET;
666 s[1] = (int)(c_value & 0xff);
667 s[2] = (int)((c_value >> 8) & 0xff);
668 s[3] = (int)((c_value >> 16) & 0xff);
669 s[4] = (int)((c_value >> 24) & 0xff);
670 len = 5;
671 }
672 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000674 if ((*self->write_func)(self, s, len) < 0)
675 return -1;
676
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000677 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000678}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000679
Guido van Rossum60456fd1997-04-09 17:36:32 +0000680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000681static int
682put(Picklerobject *self, PyObject *ob)
683{
684 if (ob->ob_refcnt < 2 || self->fast)
685 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000687 return put2(self, ob);
688}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000689
Guido van Rossum053b8df1998-11-25 16:18:00 +0000690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000691static int
692put2(Picklerobject *self, PyObject *ob)
693{
694 char c_str[30];
695 int p;
696 size_t len;
697 int res = -1;
698 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000700 if (self->fast)
701 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000703 if ((p = PyDict_Size(self->memo)) < 0)
704 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000706 /* Make sure memo keys are positive! */
707 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000709 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
710 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000712 if (!( memo_len = PyInt_FromLong(p)))
713 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000715 if (!( t = PyTuple_New(2)))
716 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000718 PyTuple_SET_ITEM(t, 0, memo_len);
719 Py_INCREF(memo_len);
720 PyTuple_SET_ITEM(t, 1, ob);
721 Py_INCREF(ob);
722
723 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
724 goto finally;
725
726 if (!self->bin) {
727 c_str[0] = PUT;
728 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
729 len = strlen(c_str);
730 }
731 else if (Pdata_Check(self->file)) {
732 if (write_other(self, NULL, 0) < 0) return -1;
733 PDATA_APPEND(self->file, memo_len, -1);
734 res=0; /* Job well done ;) */
735 goto finally;
736 }
737 else {
738 if (p >= 256) {
739 c_str[0] = LONG_BINPUT;
740 c_str[1] = (int)(p & 0xff);
741 c_str[2] = (int)((p >> 8) & 0xff);
742 c_str[3] = (int)((p >> 16) & 0xff);
743 c_str[4] = (int)((p >> 24) & 0xff);
744 len = 5;
745 }
746 else {
747 c_str[0] = BINPUT;
748 c_str[1] = p;
749 len = 2;
750 }
751 }
752
753 if ((*self->write_func)(self, c_str, len) < 0)
754 goto finally;
755
756 res = 0;
757
758 finally:
759 Py_XDECREF(py_ob_id);
760 Py_XDECREF(memo_len);
761 Py_XDECREF(t);
762
763 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000764}
765
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000766#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000767
768static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000769PyImport_Import(PyObject *module_name)
770{
771 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
772 static PyObject *standard_builtins=0;
773 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000775 if (!( silly_list )) {
776 if (!( __import___str=PyString_FromString("__import__")))
777 return NULL;
778 if (!( __builtins___str=PyString_FromString("__builtins__")))
779 return NULL;
780 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
781 return NULL;
782 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000784 if ((globals=PyEval_GetGlobals())) {
785 Py_INCREF(globals);
786 __builtins__=PyObject_GetItem(globals,__builtins___str);
787 if (!__builtins__)
788 goto err;
789 }
790 else {
791 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000793 if (!(standard_builtins ||
794 (standard_builtins=PyImport_ImportModule("__builtin__"))))
795 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000797 __builtins__=standard_builtins;
798 Py_INCREF(__builtins__);
799 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
800 if (!globals)
801 goto err;
802 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000804 if (PyDict_Check(__builtins__)) {
805 __import__=PyObject_GetItem(__builtins__,__import___str);
806 if (!__import__) goto err;
807 }
808 else {
809 __import__=PyObject_GetAttr(__builtins__,__import___str);
810 if (!__import__) goto err;
811 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000813 r=PyObject_CallFunction(__import__,"OOOO",
814 module_name, globals, globals, silly_list);
815 if (!r)
816 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000818 Py_DECREF(globals);
819 Py_DECREF(__builtins__);
820 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000822 return r;
823 err:
824 Py_XDECREF(globals);
825 Py_XDECREF(__builtins__);
826 Py_XDECREF(__import__);
827 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000828}
829
830static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000831whichmodule(PyObject *global, PyObject *global_name)
832{
833 int i, j;
834 PyObject *module = 0, *modules_dict = 0,
835 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000837 module = PyObject_GetAttrString(global, "__module__");
838 if (module) return module;
839 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000841 if (!( modules_dict = PySys_GetObject("modules")))
842 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000844 i = 0;
845 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000847 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000849 global_name_attr = PyObject_GetAttr(module, global_name);
850 if (!global_name_attr) {
851 PyErr_Clear();
852 continue;
853 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000855 if (global_name_attr != global) {
856 Py_DECREF(global_name_attr);
857 continue;
858 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000860 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 break;
863 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000865 /* The following implements the rule in pickle.py added in 1.5
866 that used __main__ if no module is found. I don't actually
867 like this rule. jlf
868 */
869 if (!j) {
870 j=1;
871 name=__main___str;
872 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000874 Py_INCREF(name);
875 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000876}
877
878
Guido van Rossum60456fd1997-04-09 17:36:32 +0000879static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000880fast_save_enter(Picklerobject *self, PyObject *obj)
881{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000882 /* if fast_container < 0, we're doing an error exit. */
883 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
884 PyObject *key = NULL;
885 if (self->fast_memo == NULL) {
886 self->fast_memo = PyDict_New();
887 if (self->fast_memo == NULL) {
888 self->fast_container = -1;
889 return 0;
890 }
891 }
892 key = PyLong_FromVoidPtr(obj);
893 if (key == NULL)
894 return 0;
895 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000896 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000897 PyErr_Format(PyExc_ValueError,
898 "fast mode: can't pickle cyclic objects including object type %s at %p",
899 obj->ob_type->tp_name, obj);
900 self->fast_container = -1;
901 return 0;
902 }
903 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000904 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000905 self->fast_container = -1;
906 return 0;
907 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000908 Py_DECREF(key);
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) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000921 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000922 return 0;
923 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000924 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000925 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000926 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000927}
928
929static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000930save_none(Picklerobject *self, PyObject *args)
931{
932 static char none = NONE;
933 if ((*self->write_func)(self, &none, 1) < 0)
934 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000936 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000937}
938
Guido van Rossum77f6a652002-04-03 22:41:51 +0000939static int
940save_bool(Picklerobject *self, PyObject *args)
941{
Guido van Rossume2763392002-04-05 19:30:08 +0000942 static char *buf[2] = {FALSE, TRUE};
943 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000944 long l = PyInt_AS_LONG((PyIntObject *)args);
945
Guido van Rossume2763392002-04-05 19:30:08 +0000946 if ((*self->write_func)(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000947 return -1;
948
949 return 0;
950}
Tim Peters84e87f32001-03-17 04:50:51 +0000951
Guido van Rossum60456fd1997-04-09 17:36:32 +0000952static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000953save_int(Picklerobject *self, PyObject *args)
954{
955 char c_str[32];
956 long l = PyInt_AS_LONG((PyIntObject *)args);
957 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000959 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000960#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000961 || l > 0x7fffffffL
962 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000963#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000964 ) {
965 /* Text-mode pickle, or long too big to fit in the 4-byte
966 * signed BININT format: store as a string.
967 */
968 c_str[0] = INT;
969 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
970 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
971 return -1;
972 }
973 else {
974 /* Binary pickle and l fits in a signed 4-byte int. */
975 c_str[1] = (int)( l & 0xff);
976 c_str[2] = (int)((l >> 8) & 0xff);
977 c_str[3] = (int)((l >> 16) & 0xff);
978 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000980 if ((c_str[4] == 0) && (c_str[3] == 0)) {
981 if (c_str[2] == 0) {
982 c_str[0] = BININT1;
983 len = 2;
984 }
985 else {
986 c_str[0] = BININT2;
987 len = 3;
988 }
989 }
990 else {
991 c_str[0] = BININT;
992 len = 5;
993 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000995 if ((*self->write_func)(self, c_str, len) < 0)
996 return -1;
997 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000999 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001000}
1001
1002
1003static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001004save_long(Picklerobject *self, PyObject *args)
1005{
1006 int size, res = -1;
1007 PyObject *repr = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001009 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001011 if (!( repr = PyObject_Repr(args)))
1012 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001014 if ((size = PyString_Size(repr)) < 0)
1015 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001017 if ((*self->write_func)(self, &l, 1) < 0)
1018 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001020 if ((*self->write_func)(self,
1021 PyString_AS_STRING((PyStringObject *)repr),
1022 size) < 0)
1023 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001025 if ((*self->write_func)(self, "\n", 1) < 0)
1026 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001027
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001028 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001030 finally:
1031 Py_XDECREF(repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001033 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001034}
1035
1036
1037static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001038save_float(Picklerobject *self, PyObject *args)
1039{
1040 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001042 if (self->bin) {
1043 int s, e;
1044 double f;
1045 long fhi, flo;
1046 char str[9];
1047 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001049 *p = BINFLOAT;
1050 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001052 if (x < 0) {
1053 s = 1;
1054 x = -x;
1055 }
1056 else
1057 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001059 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001061 /* Normalize f to be in the range [1.0, 2.0) */
1062 if (0.5 <= f && f < 1.0) {
1063 f *= 2.0;
1064 e--;
1065 }
1066 else if (f == 0.0) {
1067 e = 0;
1068 }
1069 else {
1070 PyErr_SetString(PyExc_SystemError,
1071 "frexp() result out of range");
1072 return -1;
1073 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001075 if (e >= 1024) {
1076 /* XXX 1024 itself is reserved for Inf/NaN */
1077 PyErr_SetString(PyExc_OverflowError,
1078 "float too large to pack with d format");
1079 return -1;
1080 }
1081 else if (e < -1022) {
1082 /* Gradual underflow */
1083 f = ldexp(f, 1022 + e);
1084 e = 0;
1085 }
1086 else if (!(e == 0 && f == 0.0)) {
1087 e += 1023;
1088 f -= 1.0; /* Get rid of leading 1 */
1089 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001091 /* fhi receives the high 28 bits;
1092 flo the low 24 bits (== 52 bits) */
1093 f *= 268435456.0; /* 2**28 */
1094 fhi = (long) floor(f); /* Truncate */
1095 f -= (double)fhi;
1096 f *= 16777216.0; /* 2**24 */
1097 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001099 /* First byte */
1100 *p = (s<<7) | (e>>4);
1101 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001103 /* Second byte */
1104 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1105 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001107 /* Third byte */
1108 *p = (unsigned char) ((fhi>>16) & 0xFF);
1109 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001111 /* Fourth byte */
1112 *p = (unsigned char) ((fhi>>8) & 0xFF);
1113 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001115 /* Fifth byte */
1116 *p = (unsigned char) (fhi & 0xFF);
1117 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001119 /* Sixth byte */
1120 *p = (unsigned char) ((flo>>16) & 0xFF);
1121 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001123 /* Seventh byte */
1124 *p = (unsigned char) ((flo>>8) & 0xFF);
1125 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001127 /* Eighth byte */
1128 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001130 if ((*self->write_func)(self, str, 9) < 0)
1131 return -1;
1132 }
1133 else {
1134 char c_str[250];
1135 c_str[0] = FLOAT;
1136 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001138 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1139 return -1;
1140 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001142 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001143}
1144
1145
1146static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001147save_string(Picklerobject *self, PyObject *args, int doput)
1148{
1149 int size, len;
1150 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001152 if ((size = PyString_Size(args)) < 0)
1153 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001155 if (!self->bin) {
1156 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001158 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001160 if (!( repr = PyObject_Repr(args)))
1161 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001163 if ((len = PyString_Size(repr)) < 0)
1164 goto err;
1165 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001167 if ((*self->write_func)(self, &string, 1) < 0)
1168 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001170 if ((*self->write_func)(self, repr_str, len) < 0)
1171 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001173 if ((*self->write_func)(self, "\n", 1) < 0)
1174 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001176 Py_XDECREF(repr);
1177 }
1178 else {
1179 int i;
1180 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001182 if ((size = PyString_Size(args)) < 0)
1183 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001185 if (size < 256) {
1186 c_str[0] = SHORT_BINSTRING;
1187 c_str[1] = size;
1188 len = 2;
1189 }
1190 else {
1191 c_str[0] = BINSTRING;
1192 for (i = 1; i < 5; i++)
1193 c_str[i] = (int)(size >> ((i - 1) * 8));
1194 len = 5;
1195 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 if ((*self->write_func)(self, c_str, len) < 0)
1198 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001200 if (size > 128 && Pdata_Check(self->file)) {
1201 if (write_other(self, NULL, 0) < 0) return -1;
1202 PDATA_APPEND(self->file, args, -1);
1203 }
1204 else {
1205 if ((*self->write_func)(self,
1206 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1207 return -1;
1208 }
1209 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001211 if (doput)
1212 if (put(self, args) < 0)
1213 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001215 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001217 err:
1218 Py_XDECREF(repr);
1219 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001220}
1221
1222
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001223#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001224/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1225 backslash and newline characters to \uXXXX escapes. */
1226static PyObject *
1227modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1228{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001229 PyObject *repr;
1230 char *p;
1231 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001233 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001235 repr = PyString_FromStringAndSize(NULL, 6 * size);
1236 if (repr == NULL)
1237 return NULL;
1238 if (size == 0)
1239 return repr;
1240
1241 p = q = PyString_AS_STRING(repr);
1242 while (size-- > 0) {
1243 Py_UNICODE ch = *s++;
1244 /* Map 16-bit characters to '\uxxxx' */
1245 if (ch >= 256 || ch == '\\' || ch == '\n') {
1246 *p++ = '\\';
1247 *p++ = 'u';
1248 *p++ = hexdigit[(ch >> 12) & 0xf];
1249 *p++ = hexdigit[(ch >> 8) & 0xf];
1250 *p++ = hexdigit[(ch >> 4) & 0xf];
1251 *p++ = hexdigit[ch & 15];
1252 }
1253 /* Copy everything else as-is */
1254 else
1255 *p++ = (char) ch;
1256 }
1257 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001258 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001259 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001260}
1261
1262
Guido van Rossum60456fd1997-04-09 17:36:32 +00001263static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001264save_unicode(Picklerobject *self, PyObject *args, int doput)
1265{
1266 int size, len;
1267 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001269 if (!PyUnicode_Check(args))
1270 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001272 if (!self->bin) {
1273 char *repr_str;
1274 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001275
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001276 repr = modified_EncodeRawUnicodeEscape(
1277 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
1278 if (!repr)
1279 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001281 if ((len = PyString_Size(repr)) < 0)
1282 goto err;
1283 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001285 if ((*self->write_func)(self, &string, 1) < 0)
1286 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001288 if ((*self->write_func)(self, repr_str, len) < 0)
1289 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001291 if ((*self->write_func)(self, "\n", 1) < 0)
1292 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001294 Py_XDECREF(repr);
1295 }
1296 else {
1297 int i;
1298 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300 if (!( repr = PyUnicode_AsUTF8String(args)))
1301 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001303 if ((size = PyString_Size(repr)) < 0)
1304 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001306 c_str[0] = BINUNICODE;
1307 for (i = 1; i < 5; i++)
1308 c_str[i] = (int)(size >> ((i - 1) * 8));
1309 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001311 if ((*self->write_func)(self, c_str, len) < 0)
1312 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001314 if (size > 128 && Pdata_Check(self->file)) {
1315 if (write_other(self, NULL, 0) < 0)
1316 goto err;
1317 PDATA_APPEND(self->file, repr, -1);
1318 }
1319 else {
1320 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1321 size) < 0)
1322 goto err;
1323 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001325 Py_DECREF(repr);
1326 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001327
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001328 if (doput)
1329 if (put(self, args) < 0)
1330 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001332 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001334 err:
1335 Py_XDECREF(repr);
1336 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001337}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001338#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001339
1340
1341static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001342save_tuple(Picklerobject *self, PyObject *args)
1343{
1344 PyObject *element = 0, *py_tuple_id = 0;
1345 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001347 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001349 if ((*self->write_func)(self, &MARKv, 1) < 0)
1350 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001352 if ((len = PyTuple_Size(args)) < 0)
1353 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001355 for (i = 0; i < len; i++) {
1356 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
1357 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001359 if (save(self, element, 0) < 0)
1360 goto finally;
1361 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001363 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
1364 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001366 if (len) {
1367 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1368 if (self->bin) {
1369 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001371 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1372 goto finally;
1373 }
1374 else {
1375 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001377 for (i = 0; i <= len; i++) {
1378 if ((*self->write_func)(self, &pop, 1) < 0)
1379 goto finally;
1380 }
1381 }
Tim Peters84e87f32001-03-17 04:50:51 +00001382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001383 if (get(self, py_tuple_id) < 0)
1384 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001386 res = 0;
1387 goto finally;
1388 }
1389 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001391 if ((*self->write_func)(self, &tuple, 1) < 0) {
1392 goto finally;
1393 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001395 if (put(self, args) < 0)
1396 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001398 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001400 finally:
1401 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001403 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001404}
1405
1406static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001407save_empty_tuple(Picklerobject *self, PyObject *args)
1408{
1409 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001411 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001412}
1413
1414
1415static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001416save_list(Picklerobject *self, PyObject *args)
1417{
1418 PyObject *element = 0;
1419 int s_len, len, i, using_appends, res = -1;
1420 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001422 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001424 if (self->fast && !fast_save_enter(self, args))
1425 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001427 if (self->bin) {
1428 s[0] = EMPTY_LIST;
1429 s_len = 1;
1430 }
1431 else {
1432 s[0] = MARK;
1433 s[1] = LIST;
1434 s_len = 2;
1435 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001437 if ((len = PyList_Size(args)) < 0)
1438 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001440 if ((*self->write_func)(self, s, s_len) < 0)
1441 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001443 if (len == 0) {
1444 if (put(self, args) < 0)
1445 goto finally;
1446 }
1447 else {
1448 if (put2(self, args) < 0)
1449 goto finally;
1450 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001452 if ((using_appends = (self->bin && (len > 1))))
1453 if ((*self->write_func)(self, &MARKv, 1) < 0)
1454 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001456 for (i = 0; i < len; i++) {
1457 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
1458 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001460 if (save(self, element, 0) < 0)
1461 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001462
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001463 if (!using_appends) {
1464 if ((*self->write_func)(self, &append, 1) < 0)
1465 goto finally;
1466 }
1467 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001469 if (using_appends) {
1470 if ((*self->write_func)(self, &appends, 1) < 0)
1471 goto finally;
1472 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001474 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001476 finally:
1477 if (self->fast && !fast_save_leave(self, args))
1478 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001480 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001481}
1482
1483
Guido van Rossum60456fd1997-04-09 17:36:32 +00001484static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001485save_dict(Picklerobject *self, PyObject *args)
1486{
1487 PyObject *key = 0, *value = 0;
1488 int i, len, res = -1, using_setitems;
1489 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001491 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001493 if (self->fast && !fast_save_enter(self, args))
1494 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001496 if (self->bin) {
1497 s[0] = EMPTY_DICT;
1498 len = 1;
1499 }
1500 else {
1501 s[0] = MARK;
1502 s[1] = DICT;
1503 len = 2;
1504 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001506 if ((*self->write_func)(self, s, len) < 0)
1507 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001509 if ((len = PyDict_Size(args)) < 0)
1510 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001512 if (len == 0) {
1513 if (put(self, args) < 0)
1514 goto finally;
1515 }
1516 else {
1517 if (put2(self, args) < 0)
1518 goto finally;
1519 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001521 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1522 if ((*self->write_func)(self, &MARKv, 1) < 0)
1523 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001525 i = 0;
1526 while (PyDict_Next(args, &i, &key, &value)) {
1527 if (save(self, key, 0) < 0)
1528 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001530 if (save(self, value, 0) < 0)
1531 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001533 if (!using_setitems) {
1534 if ((*self->write_func)(self, &setitem, 1) < 0)
1535 goto finally;
1536 }
1537 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001538
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001539 if (using_setitems) {
1540 if ((*self->write_func)(self, &setitems, 1) < 0)
1541 goto finally;
1542 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001544 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001546 finally:
1547 if (self->fast && !fast_save_leave(self, args))
1548 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001550 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001551}
1552
1553
Tim Peters84e87f32001-03-17 04:50:51 +00001554static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001555save_inst(Picklerobject *self, PyObject *args)
1556{
1557 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1558 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1559 char *module_str, *name_str;
1560 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001562 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001564 if (self->fast && !fast_save_enter(self, args))
1565 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001567 if ((*self->write_func)(self, &MARKv, 1) < 0)
1568 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001570 if (!( class = PyObject_GetAttr(args, __class___str)))
1571 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001573 if (self->bin) {
1574 if (save(self, class, 0) < 0)
1575 goto finally;
1576 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001578 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1579 PyObject *element = 0;
1580 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001582 if (!( class_args =
1583 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
1584 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001586 if ((len = PyObject_Size(class_args)) < 0)
1587 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001589 for (i = 0; i < len; i++) {
1590 if (!( element = PySequence_GetItem(class_args, i)))
1591 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001592
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001593 if (save(self, element, 0) < 0) {
1594 Py_DECREF(element);
1595 goto finally;
1596 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001598 Py_DECREF(element);
1599 }
1600 }
1601 else {
1602 PyErr_Clear();
1603 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001605 if (!self->bin) {
1606 if (!( name = ((PyClassObject *)class)->cl_name )) {
1607 PyErr_SetString(PicklingError, "class has no name");
1608 goto finally;
1609 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001611 if (!( module = whichmodule(class, name)))
1612 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001613
Tim Peters84e87f32001-03-17 04:50:51 +00001614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001615 if ((module_size = PyString_Size(module)) < 0 ||
1616 (name_size = PyString_Size(name)) < 0)
1617 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001619 module_str = PyString_AS_STRING((PyStringObject *)module);
1620 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001622 if ((*self->write_func)(self, &inst, 1) < 0)
1623 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001625 if ((*self->write_func)(self, module_str, module_size) < 0)
1626 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001628 if ((*self->write_func)(self, "\n", 1) < 0)
1629 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001631 if ((*self->write_func)(self, name_str, name_size) < 0)
1632 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001634 if ((*self->write_func)(self, "\n", 1) < 0)
1635 goto finally;
1636 }
1637 else if ((*self->write_func)(self, &obj, 1) < 0) {
1638 goto finally;
1639 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001641 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1642 state = PyObject_Call(getstate_func, empty_tuple, NULL);
1643 if (!state)
1644 goto finally;
1645 }
1646 else {
1647 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001649 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1650 PyErr_Clear();
1651 res = 0;
1652 goto finally;
1653 }
1654 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001655
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001656 if (!PyDict_Check(state)) {
1657 if (put2(self, args) < 0)
1658 goto finally;
1659 }
1660 else {
1661 if (put(self, args) < 0)
1662 goto finally;
1663 }
Tim Peters84e87f32001-03-17 04:50:51 +00001664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001665 if (save(self, state, 0) < 0)
1666 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001668 if ((*self->write_func)(self, &build, 1) < 0)
1669 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001671 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001673 finally:
1674 if (self->fast && !fast_save_leave(self, args))
1675 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001676
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001677 Py_XDECREF(module);
1678 Py_XDECREF(class);
1679 Py_XDECREF(state);
1680 Py_XDECREF(getinitargs_func);
1681 Py_XDECREF(getstate_func);
1682 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001684 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001685}
1686
1687
Guido van Rossum60456fd1997-04-09 17:36:32 +00001688static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001689save_global(Picklerobject *self, PyObject *args, PyObject *name)
1690{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001691 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001692 char *name_str, *module_str;
1693 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001695 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001697 if (name) {
1698 global_name = name;
1699 Py_INCREF(global_name);
1700 }
1701 else {
1702 if (!( global_name = PyObject_GetAttr(args, __name___str)))
1703 goto finally;
1704 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001706 if (!( module = whichmodule(args, global_name)))
1707 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001709 if ((module_size = PyString_Size(module)) < 0 ||
1710 (name_size = PyString_Size(global_name)) < 0)
1711 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001713 module_str = PyString_AS_STRING((PyStringObject *)module);
1714 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001715
Guido van Rossum75bfd052002-12-24 18:10:07 +00001716 /* XXX This can be doing a relative import. Clearly it shouldn't,
1717 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001718 mod = PyImport_ImportModule(module_str);
1719 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001720 cPickle_ErrFormat(PicklingError,
1721 "Can't pickle %s: it's not found as %s.%s",
1722 "OSS", args, module, global_name);
1723 goto finally;
1724 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001725 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001726 if (klass == NULL) {
1727 cPickle_ErrFormat(PicklingError,
1728 "Can't pickle %s: it's not found as %s.%s",
1729 "OSS", args, module, global_name);
1730 goto finally;
1731 }
1732 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001733 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001734 cPickle_ErrFormat(PicklingError,
1735 "Can't pickle %s: it's not the same object as %s.%s",
1736 "OSS", args, module, global_name);
1737 goto finally;
1738 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001739 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001741 if ((*self->write_func)(self, &global, 1) < 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, module_str, module_size) < 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, "\n", 1) < 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, name_str, name_size) < 0)
1751 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001753 if ((*self->write_func)(self, "\n", 1) < 0)
1754 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001756 if (put(self, args) < 0)
1757 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001759 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001761 finally:
1762 Py_XDECREF(module);
1763 Py_XDECREF(global_name);
1764 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001766 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001767}
1768
Guido van Rossum60456fd1997-04-09 17:36:32 +00001769static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001770save_pers(Picklerobject *self, PyObject *args, PyObject *f)
1771{
1772 PyObject *pid = 0;
1773 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001775 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001777 Py_INCREF(args);
1778 ARG_TUP(self, args);
1779 if (self->arg) {
1780 pid = PyObject_Call(f, self->arg, NULL);
1781 FREE_ARG_TUP(self);
1782 }
1783 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001785 if (pid != Py_None) {
1786 if (!self->bin) {
1787 if (!PyString_Check(pid)) {
1788 PyErr_SetString(PicklingError,
1789 "persistent id must be string");
1790 goto finally;
1791 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001793 if ((*self->write_func)(self, &persid, 1) < 0)
1794 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001796 if ((size = PyString_Size(pid)) < 0)
1797 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001799 if ((*self->write_func)(self,
1800 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1801 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001803 if ((*self->write_func)(self, "\n", 1) < 0)
1804 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001806 res = 1;
1807 goto finally;
1808 }
1809 else if (save(self, pid, 1) >= 0) {
1810 if ((*self->write_func)(self, &binpersid, 1) < 0)
1811 res = -1;
1812 else
1813 res = 1;
1814 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001816 goto finally;
1817 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001819 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001821 finally:
1822 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001824 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001825}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001826
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001827
Tim Peters84e87f32001-03-17 04:50:51 +00001828static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001829save_reduce(Picklerobject *self, PyObject *callable,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001830 PyObject *tup, PyObject *state, PyObject *ob)
1831{
1832 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001834 if (save(self, callable, 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 (save(self, tup, 0) < 0)
1838 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001840 if ((*self->write_func)(self, &reduce, 1) < 0)
1841 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001843 if (ob != NULL) {
1844 if (state && !PyDict_Check(state)) {
1845 if (put2(self, ob) < 0)
1846 return -1;
1847 }
1848 else {
1849 if (put(self, ob) < 0)
1850 return -1;
1851 }
1852 }
Tim Peters84e87f32001-03-17 04:50:51 +00001853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001854 if (state) {
1855 if (save(self, state, 0) < 0)
1856 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001858 if ((*self->write_func)(self, &build, 1) < 0)
1859 return -1;
1860 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001862 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001863}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001864
Guido van Rossum60456fd1997-04-09 17:36:32 +00001865static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001866save(Picklerobject *self, PyObject *args, int pers_save)
1867{
1868 PyTypeObject *type;
1869 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1870 *callable = 0, *state = 0;
1871 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001872
Martin v. Löwis5a395302002-08-04 08:20:23 +00001873 if (self->nesting++ > Py_GetRecursionLimit()){
1874 PyErr_SetString(PyExc_RuntimeError,
1875 "maximum recursion depth exceeded");
1876 goto finally;
1877 }
1878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001879 if (!pers_save && self->pers_func) {
1880 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1881 res = tmp;
1882 goto finally;
1883 }
1884 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001886 if (args == Py_None) {
1887 res = save_none(self, args);
1888 goto finally;
1889 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001891 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001892
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001893 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001894 case 'b':
1895 if (args == Py_False || args == Py_True) {
1896 res = save_bool(self, args);
1897 goto finally;
1898 }
1899 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001900 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001901 if (type == &PyInt_Type) {
1902 res = save_int(self, args);
1903 goto finally;
1904 }
1905 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001906
Guido van Rossum60456fd1997-04-09 17:36:32 +00001907 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001908 if (type == &PyLong_Type) {
1909 res = save_long(self, args);
1910 goto finally;
1911 }
1912 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001913
Guido van Rossum60456fd1997-04-09 17:36:32 +00001914 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001915 if (type == &PyFloat_Type) {
1916 res = save_float(self, args);
1917 goto finally;
1918 }
1919 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001920
Guido van Rossum60456fd1997-04-09 17:36:32 +00001921 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001922 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
1923 if (self->bin) res = save_empty_tuple(self, args);
1924 else res = save_tuple(self, args);
1925 goto finally;
1926 }
1927 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001928
Guido van Rossum60456fd1997-04-09 17:36:32 +00001929 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001930 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
1931 res = save_string(self, args, 0);
1932 goto finally;
1933 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001934
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001935#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001936 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001937 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1938 res = save_unicode(self, args, 0);
1939 goto finally;
1940 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001941#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001942 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001944 if (args->ob_refcnt > 1) {
1945 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
1946 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001948 if (PyDict_GetItem(self->memo, py_ob_id)) {
1949 if (get(self, py_ob_id) < 0)
1950 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001952 res = 0;
1953 goto finally;
1954 }
1955 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001957 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001958 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001959 if (type == &PyString_Type) {
1960 res = save_string(self, args, 1);
1961 goto finally;
1962 }
1963 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001964
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001965#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001966 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001967 if (type == &PyUnicode_Type) {
1968 res = save_unicode(self, args, 1);
1969 goto finally;
1970 }
1971 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001972#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001973
Guido van Rossum60456fd1997-04-09 17:36:32 +00001974 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001975 if (type == &PyTuple_Type) {
1976 res = save_tuple(self, args);
1977 goto finally;
1978 }
1979 if (type == &PyType_Type) {
1980 res = save_global(self, args, NULL);
1981 goto finally;
1982 }
1983 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001984
Guido van Rossum60456fd1997-04-09 17:36:32 +00001985 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001986 if (type == &PyList_Type) {
1987 res = save_list(self, args);
1988 goto finally;
1989 }
1990 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001991
1992 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001993 if (type == &PyDict_Type) {
1994 res = save_dict(self, args);
1995 goto finally;
1996 }
1997 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001998
1999 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002000 if (type == &PyInstance_Type) {
2001 res = save_inst(self, args);
2002 goto finally;
2003 }
2004 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002005
2006 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002007 if (type == &PyClass_Type) {
2008 res = save_global(self, args, NULL);
2009 goto finally;
2010 }
2011 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002012
2013 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002014 if (type == &PyFunction_Type) {
2015 res = save_global(self, args, NULL);
2016 goto finally;
2017 }
2018 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002019
2020 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002021 if (type == &PyCFunction_Type) {
2022 res = save_global(self, args, NULL);
2023 goto finally;
2024 }
2025 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002027 if (!pers_save && self->inst_pers_func) {
2028 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2029 res = tmp;
2030 goto finally;
2031 }
2032 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002033
Jeremy Hylton39c61162002-07-16 19:47:43 +00002034 if (PyType_IsSubtype(type, &PyType_Type)) {
2035 res = save_global(self, args, NULL);
2036 goto finally;
2037 }
2038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002039 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2040 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002042 Py_INCREF(args);
2043 ARG_TUP(self, args);
2044 if (self->arg) {
2045 t = PyObject_Call(__reduce__, self->arg, NULL);
2046 FREE_ARG_TUP(self);
2047 }
2048 if (! t) goto finally;
2049 }
2050 else {
2051 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002053 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2054 t = PyObject_Call(__reduce__, empty_tuple, NULL);
2055 if (!t)
2056 goto finally;
2057 }
2058 else {
2059 PyErr_Clear();
2060 }
2061 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002063 if (t) {
2064 if (PyString_Check(t)) {
2065 res = save_global(self, args, t);
2066 goto finally;
2067 }
Tim Peters84e87f32001-03-17 04:50:51 +00002068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002069 if (!PyTuple_Check(t)) {
2070 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2071 "be a tuple", "O", __reduce__);
2072 goto finally;
2073 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002075 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002077 if ((size != 3) && (size != 2)) {
2078 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2079 "contain only two or three elements", "O", __reduce__);
2080 goto finally;
2081 }
Tim Peters84e87f32001-03-17 04:50:51 +00002082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002083 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002085 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002087 if (size > 2) {
2088 state = PyTuple_GET_ITEM(t, 2);
2089 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002091 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2092 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2093 "returned by %s must be a tuple", "O", __reduce__);
2094 goto finally;
2095 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002097 res = save_reduce(self, callable, arg_tup, state, args);
2098 goto finally;
2099 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002101 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002103 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002104 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002105 Py_XDECREF(py_ob_id);
2106 Py_XDECREF(__reduce__);
2107 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002109 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002110}
2111
2112
2113static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002114dump(Picklerobject *self, PyObject *args)
2115{
2116 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002117
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002118 if (save(self, args, 0) < 0)
2119 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002121 if ((*self->write_func)(self, &stop, 1) < 0)
2122 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002124 if ((*self->write_func)(self, NULL, 0) < 0)
2125 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002127 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002128}
2129
2130static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002131Pickle_clear_memo(Picklerobject *self, PyObject *args)
2132{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002133 if (self->memo)
2134 PyDict_Clear(self->memo);
2135 Py_INCREF(Py_None);
2136 return Py_None;
2137}
2138
2139static PyObject *
2140Pickle_getvalue(Picklerobject *self, PyObject *args)
2141{
2142 int l, i, rsize, ssize, clear=1, lm;
2143 long ik;
2144 PyObject *k, *r;
2145 char *s, *p, *have_get;
2146 Pdata *data;
2147
2148 /* Can be called by Python code or C code */
2149 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2150 return NULL;
2151
2152 /* Check to make sure we are based on a list */
2153 if (! Pdata_Check(self->file)) {
2154 PyErr_SetString(PicklingError,
2155 "Attempt to getvalue() a non-list-based pickler");
2156 return NULL;
2157 }
2158
2159 /* flush write buffer */
2160 if (write_other(self, NULL, 0) < 0) return NULL;
2161
2162 data=(Pdata*)self->file;
2163 l=data->length;
2164
2165 /* set up an array to hold get/put status */
2166 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2167 lm++;
2168 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2169 memset(have_get,0,lm);
2170
2171 /* Scan for gets. */
2172 for (rsize=0, i=l; --i >= 0; ) {
2173 k=data->data[i];
2174
2175 if (PyString_Check(k)) {
2176 rsize += PyString_GET_SIZE(k);
2177 }
2178
2179 else if (PyInt_Check(k)) { /* put */
2180 ik=PyInt_AS_LONG((PyIntObject*)k);
2181 if (ik >= lm || ik==0) {
2182 PyErr_SetString(PicklingError,
2183 "Invalid get data");
2184 return NULL;
2185 }
2186 if (have_get[ik]) { /* with matching get */
2187 if (ik < 256) rsize += 2;
2188 else rsize+=5;
2189 }
2190 }
2191
2192 else if (! (PyTuple_Check(k) &&
2193 PyTuple_GET_SIZE(k) == 2 &&
2194 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2195 ) {
2196 PyErr_SetString(PicklingError,
2197 "Unexpected data in internal list");
2198 return NULL;
2199 }
2200
2201 else { /* put */
2202 ik=PyInt_AS_LONG((PyIntObject*)k);
2203 if (ik >= lm || ik==0) {
2204 PyErr_SetString(PicklingError,
2205 "Invalid get data");
2206 return NULL;
2207 }
2208 have_get[ik]=1;
2209 if (ik < 256) rsize += 2;
2210 else rsize+=5;
2211 }
2212
2213 }
2214
2215 /* Now generate the result */
2216 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2217 s=PyString_AS_STRING((PyStringObject*)r);
2218
2219 for (i=0; i<l; i++) {
2220 k=data->data[i];
2221
2222 if (PyString_Check(k)) {
2223 ssize=PyString_GET_SIZE(k);
2224 if (ssize) {
2225 p=PyString_AS_STRING((PyStringObject*)k);
2226 while (--ssize >= 0) *s++=*p++;
2227 }
2228 }
2229
2230 else if (PyTuple_Check(k)) { /* get */
2231 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2232 if (ik < 256) {
2233 *s++ = BINGET;
2234 *s++ = (int)(ik & 0xff);
2235 }
2236 else {
2237 *s++ = LONG_BINGET;
2238 *s++ = (int)(ik & 0xff);
2239 *s++ = (int)((ik >> 8) & 0xff);
2240 *s++ = (int)((ik >> 16) & 0xff);
2241 *s++ = (int)((ik >> 24) & 0xff);
2242 }
2243 }
2244
2245 else { /* put */
2246 ik=PyInt_AS_LONG((PyIntObject*)k);
2247
2248 if (have_get[ik]) { /* with matching get */
2249 if (ik < 256) {
2250 *s++ = BINPUT;
2251 *s++ = (int)(ik & 0xff);
2252 }
2253 else {
2254 *s++ = LONG_BINPUT;
2255 *s++ = (int)(ik & 0xff);
2256 *s++ = (int)((ik >> 8) & 0xff);
2257 *s++ = (int)((ik >> 16) & 0xff);
2258 *s++ = (int)((ik >> 24) & 0xff);
2259 }
2260 }
2261 }
2262
2263 }
2264
2265 if (clear) {
2266 PyDict_Clear(self->memo);
2267 Pdata_clear(data,0);
2268 }
2269
2270 free(have_get);
2271 return r;
2272 err:
2273 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002274 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002275}
2276
2277static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002278Pickler_dump(Picklerobject *self, PyObject *args)
2279{
2280 PyObject *ob;
2281 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002283 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
2284 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002286 if (dump(self, ob) < 0)
2287 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002289 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002291 /* XXX Why does dump() return self? */
2292 Py_INCREF(self);
2293 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002294}
2295
2296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002297static struct PyMethodDef Pickler_methods[] =
2298{
Neal Norwitzb0493252002-03-31 14:44:22 +00002299 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002300 PyDoc_STR("dump(object) -- "
2301 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002302 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002303 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002304 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002305 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002306 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002307};
2308
2309
2310static Picklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002311newPicklerobject(PyObject *file, int bin)
2312{
2313 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002315 if (!( self = PyObject_New(Picklerobject, &Picklertype)))
2316 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002318 self->fp = NULL;
2319 self->write = NULL;
2320 self->memo = NULL;
2321 self->arg = NULL;
2322 self->pers_func = NULL;
2323 self->inst_pers_func = NULL;
2324 self->write_buf = NULL;
2325 self->bin = bin;
2326 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002327 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002328 self->fast_container = 0;
2329 self->fast_memo = NULL;
2330 self->buf_size = 0;
2331 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002333 if (file)
2334 Py_INCREF(file);
2335 else
2336 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002338 if (!( self->file = file ))
2339 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002341 if (!( self->memo = PyDict_New()))
2342 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002344 if (PyFile_Check(file)) {
2345 self->fp = PyFile_AsFile(file);
2346 if (self->fp == NULL) {
2347 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2348 goto err;
2349 }
2350 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002351 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002352 else if (PycStringIO_OutputCheck(file)) {
2353 self->write_func = write_cStringIO;
2354 }
2355 else if (file == Py_None) {
2356 self->write_func = write_none;
2357 }
2358 else {
2359 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002361 if (! Pdata_Check(file)) {
2362 self->write = PyObject_GetAttr(file, write_str);
2363 if (!self->write) {
2364 PyErr_Clear();
2365 PyErr_SetString(PyExc_TypeError,
2366 "argument must have 'write' "
2367 "attribute");
2368 goto err;
2369 }
2370 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002372 if (!( self->write_buf =
2373 (char *)malloc(WRITE_BUF_SIZE * sizeof(char)))) {
2374 PyErr_NoMemory();
2375 goto err;
2376 }
2377 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002379 if (PyEval_GetRestricted()) {
2380 /* Restricted execution, get private tables */
2381 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002383 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2384 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2385 Py_DECREF(m);
2386 if (!( self->dispatch_table )) goto err;
2387 }
2388 else {
2389 self->dispatch_table=dispatch_table;
2390 Py_INCREF(dispatch_table);
2391 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002393 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002395 err:
2396 Py_DECREF((PyObject *)self);
2397 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002398}
2399
2400
2401static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002402get_Pickler(PyObject *self, PyObject *args)
2403{
2404 PyObject *file = NULL;
2405 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002407 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
2408 PyErr_Clear();
2409 bin = 0;
2410 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2411 return NULL;
2412 }
2413 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002414}
2415
2416
2417static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002418Pickler_dealloc(Picklerobject *self)
2419{
2420 Py_XDECREF(self->write);
2421 Py_XDECREF(self->memo);
2422 Py_XDECREF(self->fast_memo);
2423 Py_XDECREF(self->arg);
2424 Py_XDECREF(self->file);
2425 Py_XDECREF(self->pers_func);
2426 Py_XDECREF(self->inst_pers_func);
2427 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002429 if (self->write_buf) {
2430 free(self->write_buf);
2431 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002433 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002434}
2435
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002436static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002437Pickler_get_pers_func(Picklerobject *p)
2438{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002439 if (p->pers_func == NULL)
2440 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2441 else
2442 Py_INCREF(p->pers_func);
2443 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002444}
2445
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002446static int
2447Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2448{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002449 if (v == NULL) {
2450 PyErr_SetString(PyExc_TypeError,
2451 "attribute deletion is not supported");
2452 return -1;
2453 }
2454 Py_XDECREF(p->pers_func);
2455 Py_INCREF(v);
2456 p->pers_func = v;
2457 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002458}
2459
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002460static int
2461Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2462{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002463 if (v == NULL) {
2464 PyErr_SetString(PyExc_TypeError,
2465 "attribute deletion is not supported");
2466 return -1;
2467 }
2468 Py_XDECREF(p->inst_pers_func);
2469 Py_INCREF(v);
2470 p->inst_pers_func = v;
2471 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002472}
2473
2474static PyObject *
2475Pickler_get_memo(Picklerobject *p)
2476{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002477 if (p->memo == NULL)
2478 PyErr_SetString(PyExc_AttributeError, "memo");
2479 else
2480 Py_INCREF(p->memo);
2481 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002482}
2483
2484static int
2485Pickler_set_memo(Picklerobject *p, PyObject *v)
2486{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002487 if (v == NULL) {
2488 PyErr_SetString(PyExc_TypeError,
2489 "attribute deletion is not supported");
2490 return -1;
2491 }
2492 if (!PyDict_Check(v)) {
2493 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2494 return -1;
2495 }
2496 Py_XDECREF(p->memo);
2497 Py_INCREF(v);
2498 p->memo = v;
2499 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002500}
2501
2502static PyObject *
2503Pickler_get_error(Picklerobject *p)
2504{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002505 /* why is this an attribute on the Pickler? */
2506 Py_INCREF(PicklingError);
2507 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002508}
2509
2510static PyMemberDef Pickler_members[] = {
2511 {"binary", T_INT, offsetof(Picklerobject, bin)},
2512 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002513 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002514};
2515
2516static PyGetSetDef Pickler_getsets[] = {
2517 {"persistent_id", (getter)Pickler_get_pers_func,
2518 (setter)Pickler_set_pers_func},
2519 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2520 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002521 {"PicklingError", (getter)Pickler_get_error, NULL},
2522 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002523};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002524
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002525PyDoc_STRVAR(Picklertype__doc__,
2526"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002527
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002528static PyTypeObject Picklertype = {
2529 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002530 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002531 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002532 sizeof(Picklerobject), /*tp_basicsize*/
2533 0,
2534 (destructor)Pickler_dealloc, /* tp_dealloc */
2535 0, /* tp_print */
2536 0, /* tp_getattr */
2537 0, /* tp_setattr */
2538 0, /* tp_compare */
2539 0, /* tp_repr */
2540 0, /* tp_as_number */
2541 0, /* tp_as_sequence */
2542 0, /* tp_as_mapping */
2543 0, /* tp_hash */
2544 0, /* tp_call */
2545 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002546 0, /* set below */ /* tp_getattro */
2547 0, /* set below */ /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002548 0, /* tp_as_buffer */
2549 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2550 Picklertype__doc__, /* tp_doc */
2551 0, /* tp_traverse */
2552 0, /* tp_clear */
2553 0, /* tp_richcompare */
2554 0, /* tp_weaklistoffset */
2555 0, /* tp_iter */
2556 0, /* tp_iternext */
2557 Pickler_methods, /* tp_methods */
2558 Pickler_members, /* tp_members */
2559 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002560};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002561
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002562static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002563find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
2564{
2565 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002567 if (fc) {
2568 if (fc==Py_None) {
2569 PyErr_SetString(UnpicklingError,
2570 "Global and instance pickles are not supported.");
2571 return NULL;
2572 }
2573 return PyObject_CallFunction(fc, "OO", py_module_name,
2574 py_global_name);
2575 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002577 module = PySys_GetObject("modules");
2578 if (module == NULL)
2579 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002581 module = PyDict_GetItem(module, py_module_name);
2582 if (module == NULL) {
2583 module = PyImport_Import(py_module_name);
2584 if (!module)
2585 return NULL;
2586 global = PyObject_GetAttr(module, py_global_name);
2587 Py_DECREF(module);
2588 }
2589 else
2590 global = PyObject_GetAttr(module, py_global_name);
2591 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002592}
2593
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002594static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002595marker(Unpicklerobject *self)
2596{
2597 if (self->num_marks < 1) {
2598 PyErr_SetString(UnpicklingError, "could not find MARK");
2599 return -1;
2600 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002602 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002603}
2604
Tim Peters84e87f32001-03-17 04:50:51 +00002605
Guido van Rossum60456fd1997-04-09 17:36:32 +00002606static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002607load_none(Unpicklerobject *self)
2608{
2609 PDATA_APPEND(self->stack, Py_None, -1);
2610 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002611}
2612
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002613static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002614bad_readline(void)
2615{
2616 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2617 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002618}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002619
2620static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002621load_int(Unpicklerobject *self)
2622{
2623 PyObject *py_int = 0;
2624 char *endptr, *s;
2625 int len, res = -1;
2626 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002628 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2629 if (len < 2) return bad_readline();
2630 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002632 errno = 0;
2633 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002635 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2636 /* Hm, maybe we've got something long. Let's try reading
2637 it as a Python long object. */
2638 errno = 0;
2639 py_int = PyLong_FromString(s, NULL, 0);
2640 if (py_int == NULL) {
2641 PyErr_SetString(PyExc_ValueError,
2642 "could not convert string to int");
2643 goto finally;
2644 }
2645 }
2646 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002647 if (len == 3 && (l == 0 || l == 1)) {
2648 if (!( py_int = PyBool_FromLong(l))) goto finally;
2649 }
2650 else {
2651 if (!( py_int = PyInt_FromLong(l))) goto finally;
2652 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002653 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002655 free(s);
2656 PDATA_PUSH(self->stack, py_int, -1);
2657 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002658
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002659 finally:
2660 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002662 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002663}
2664
2665
Tim Peters84e87f32001-03-17 04:50:51 +00002666static long
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002667calc_binint(char *s, int x)
2668{
2669 unsigned char c;
2670 int i;
2671 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002673 for (i = 0, l = 0L; i < x; i++) {
2674 c = (unsigned char)s[i];
2675 l |= (long)c << (i * 8);
2676 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002677#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002678 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2679 * is signed, so on a box with longs bigger than 4 bytes we need
2680 * to extend a BININT's sign bit to the full width.
2681 */
2682 if (x == 4 && l & (1L << 31))
2683 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002684#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002685 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002686}
2687
2688
2689static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002690load_binintx(Unpicklerobject *self, char *s, int x)
2691{
2692 PyObject *py_int = 0;
2693 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002695 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002697 if (!( py_int = PyInt_FromLong(l)))
2698 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002700 PDATA_PUSH(self->stack, py_int, -1);
2701 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002702}
2703
2704
2705static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002706load_binint(Unpicklerobject *self)
2707{
2708 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002710 if ((*self->read_func)(self, &s, 4) < 0)
2711 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002713 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002714}
2715
2716
2717static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002718load_binint1(Unpicklerobject *self)
2719{
2720 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002722 if ((*self->read_func)(self, &s, 1) < 0)
2723 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002725 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002726}
2727
2728
2729static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002730load_binint2(Unpicklerobject *self)
2731{
2732 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002734 if ((*self->read_func)(self, &s, 2) < 0)
2735 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002737 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002738}
Tim Peters84e87f32001-03-17 04:50:51 +00002739
Guido van Rossum60456fd1997-04-09 17:36:32 +00002740static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002741load_long(Unpicklerobject *self)
2742{
2743 PyObject *l = 0;
2744 char *end, *s;
2745 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002747 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2748 if (len < 2) return bad_readline();
2749 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002751 if (!( l = PyLong_FromString(s, &end, 0)))
2752 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002754 free(s);
2755 PDATA_PUSH(self->stack, l, -1);
2756 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002758 finally:
2759 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002761 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002762}
2763
Tim Peters84e87f32001-03-17 04:50:51 +00002764
Guido van Rossum60456fd1997-04-09 17:36:32 +00002765static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002766load_float(Unpicklerobject *self)
2767{
2768 PyObject *py_float = 0;
2769 char *endptr, *s;
2770 int len, res = -1;
2771 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002773 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2774 if (len < 2) return bad_readline();
2775 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002777 errno = 0;
2778 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002780 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2781 PyErr_SetString(PyExc_ValueError,
2782 "could not convert string to float");
2783 goto finally;
2784 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002786 if (!( py_float = PyFloat_FromDouble(d)))
2787 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002789 free(s);
2790 PDATA_PUSH(self->stack, py_float, -1);
2791 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002793 finally:
2794 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002796 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002797}
2798
Guido van Rossum60456fd1997-04-09 17:36:32 +00002799static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002800load_binfloat(Unpicklerobject *self)
2801{
2802 PyObject *py_float = 0;
2803 int s, e;
2804 long fhi, flo;
2805 double x;
2806 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002808 if ((*self->read_func)(self, &p, 8) < 0)
2809 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002811 /* First byte */
2812 s = (*p>>7) & 1;
2813 e = (*p & 0x7F) << 4;
2814 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002816 /* Second byte */
2817 e |= (*p>>4) & 0xF;
2818 fhi = (*p & 0xF) << 24;
2819 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002821 /* Third byte */
2822 fhi |= (*p & 0xFF) << 16;
2823 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002825 /* Fourth byte */
2826 fhi |= (*p & 0xFF) << 8;
2827 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002829 /* Fifth byte */
2830 fhi |= *p & 0xFF;
2831 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002833 /* Sixth byte */
2834 flo = (*p & 0xFF) << 16;
2835 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002837 /* Seventh byte */
2838 flo |= (*p & 0xFF) << 8;
2839 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002841 /* Eighth byte */
2842 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002844 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2845 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002847 /* XXX This sadly ignores Inf/NaN */
2848 if (e == 0)
2849 e = -1022;
2850 else {
2851 x += 1.0;
2852 e -= 1023;
2853 }
2854 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002856 if (s)
2857 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002859 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002861 PDATA_PUSH(self->stack, py_float, -1);
2862 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002863}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002864
2865static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002866load_string(Unpicklerobject *self)
2867{
2868 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002869 int len, res = -1;
2870 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002872 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2873 if (len < 2) return bad_readline();
2874 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002875
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002876
2877 /* Strip outermost quotes */
2878 while (s[len-1] <= ' ')
2879 len--;
2880 if(s[0]=='"' && s[len-1]=='"'){
2881 s[len-1] = '\0';
2882 p = s + 1 ;
2883 len -= 2;
2884 } else if(s[0]=='\'' && s[len-1]=='\''){
2885 s[len-1] = '\0';
2886 p = s + 1 ;
2887 len -= 2;
2888 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002889 goto insecure;
2890 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002891
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002892 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
2893 if (str) {
2894 PDATA_PUSH(self->stack, str, -1);
2895 res = 0;
2896 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002897 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002898 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002900 insecure:
2901 free(s);
2902 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2903 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002904}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002905
2906
2907static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002908load_binstring(Unpicklerobject *self)
2909{
2910 PyObject *py_string = 0;
2911 long l;
2912 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002914 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002916 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002917
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002918 if ((*self->read_func)(self, &s, l) < 0)
2919 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002921 if (!( py_string = PyString_FromStringAndSize(s, l)))
2922 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002924 PDATA_PUSH(self->stack, py_string, -1);
2925 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002926}
2927
2928
2929static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002930load_short_binstring(Unpicklerobject *self)
2931{
2932 PyObject *py_string = 0;
2933 unsigned char l;
2934 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002936 if ((*self->read_func)(self, &s, 1) < 0)
2937 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002939 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002941 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002945 PDATA_PUSH(self->stack, py_string, -1);
2946 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002947}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002948
2949
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002950#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002951static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002952load_unicode(Unpicklerobject *self)
2953{
2954 PyObject *str = 0;
2955 int len, res = -1;
2956 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002958 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2959 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002961 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
2962 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002964 PDATA_PUSH(self->stack, str, -1);
2965 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002967 finally:
2968 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002969}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002970#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002971
2972
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002973#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002974static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002975load_binunicode(Unpicklerobject *self)
2976{
2977 PyObject *unicode;
2978 long l;
2979 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002981 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002983 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002985 if ((*self->read_func)(self, &s, l) < 0)
2986 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002988 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
2989 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002991 PDATA_PUSH(self->stack, unicode, -1);
2992 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002993}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002994#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002995
2996
2997static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002998load_tuple(Unpicklerobject *self)
2999{
3000 PyObject *tup;
3001 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003003 if ((i = marker(self)) < 0) return -1;
3004 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3005 PDATA_PUSH(self->stack, tup, -1);
3006 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003007}
3008
3009static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003010load_empty_tuple(Unpicklerobject *self)
3011{
3012 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003014 if (!( tup=PyTuple_New(0))) return -1;
3015 PDATA_PUSH(self->stack, tup, -1);
3016 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003017}
3018
3019static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003020load_empty_list(Unpicklerobject *self)
3021{
3022 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003024 if (!( list=PyList_New(0))) return -1;
3025 PDATA_PUSH(self->stack, list, -1);
3026 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003027}
3028
3029static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003030load_empty_dict(Unpicklerobject *self)
3031{
3032 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003034 if (!( dict=PyDict_New())) return -1;
3035 PDATA_PUSH(self->stack, dict, -1);
3036 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003037}
3038
3039
3040static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003041load_list(Unpicklerobject *self)
3042{
3043 PyObject *list = 0;
3044 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003046 if ((i = marker(self)) < 0) return -1;
3047 if (!( list=Pdata_popList(self->stack, i))) return -1;
3048 PDATA_PUSH(self->stack, list, -1);
3049 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003050}
3051
3052static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003053load_dict(Unpicklerobject *self)
3054{
3055 PyObject *dict, *key, *value;
3056 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003058 if ((i = marker(self)) < 0) return -1;
3059 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003061 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003063 for (k = i+1; k < j; k += 2) {
3064 key =self->stack->data[k-1];
3065 value=self->stack->data[k ];
3066 if (PyDict_SetItem(dict, key, value) < 0) {
3067 Py_DECREF(dict);
3068 return -1;
3069 }
3070 }
3071 Pdata_clear(self->stack, i);
3072 PDATA_PUSH(self->stack, dict, -1);
3073 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003074}
3075
3076static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003077Instance_New(PyObject *cls, PyObject *args)
3078{
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 }
Tim Peters4e52ca82002-12-07 02:43:28 +00003120 Py_DECREF(safe);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003121 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003123 if (args==Py_None) {
3124 /* Special case, call cls.__basicnew__() */
3125 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003127 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3128 if (!basicnew) return NULL;
3129 r=PyObject_CallObject(basicnew, NULL);
3130 Py_DECREF(basicnew);
3131 if (r) return r;
3132 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003134 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003136 err:
3137 {
3138 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003140 PyErr_Fetch(&tp, &v, &tb);
3141 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3142 Py_XDECREF(v);
3143 v=r;
3144 }
3145 PyErr_Restore(tp,v,tb);
3146 }
3147 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003148}
Tim Peters84e87f32001-03-17 04:50:51 +00003149
Guido van Rossum60456fd1997-04-09 17:36:32 +00003150
3151static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003152load_obj(Unpicklerobject *self)
3153{
3154 PyObject *class, *tup, *obj=0;
3155 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003157 if ((i = marker(self)) < 0) return -1;
3158 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3159 PDATA_POP(self->stack, class);
3160 if (class) {
3161 obj = Instance_New(class, tup);
3162 Py_DECREF(class);
3163 }
3164 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003166 if (! obj) return -1;
3167 PDATA_PUSH(self->stack, obj, -1);
3168 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003169}
3170
3171
3172static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003173load_inst(Unpicklerobject *self)
3174{
3175 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3176 int i, len;
3177 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003179 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003181 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3182 if (len < 2) return bad_readline();
3183 module_name = PyString_FromStringAndSize(s, len - 1);
3184 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003186 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3187 if (len < 2) return bad_readline();
3188 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3189 class = find_class(module_name, class_name,
3190 self->find_class);
3191 Py_DECREF(class_name);
3192 }
3193 }
3194 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003196 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003198 if ((tup=Pdata_popTuple(self->stack, i))) {
3199 obj = Instance_New(class, tup);
3200 Py_DECREF(tup);
3201 }
3202 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003204 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003206 PDATA_PUSH(self->stack, obj, -1);
3207 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003208}
3209
3210
3211static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003212load_global(Unpicklerobject *self)
3213{
3214 PyObject *class = 0, *module_name = 0, *class_name = 0;
3215 int len;
3216 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003218 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3219 if (len < 2) return bad_readline();
3220 module_name = PyString_FromStringAndSize(s, len - 1);
3221 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003223 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003224 if (len < 2) {
3225 Py_DECREF(module_name);
3226 return bad_readline();
3227 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003228 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3229 class = find_class(module_name, class_name,
3230 self->find_class);
3231 Py_DECREF(class_name);
3232 }
3233 }
3234 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003235
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003236 if (! class) return -1;
3237 PDATA_PUSH(self->stack, class, -1);
3238 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003239}
3240
3241
3242static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003243load_persid(Unpicklerobject *self)
3244{
3245 PyObject *pid = 0;
3246 int len;
3247 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003248
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003249 if (self->pers_func) {
3250 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3251 if (len < 2) return bad_readline();
3252
3253 pid = PyString_FromStringAndSize(s, len - 1);
3254 if (!pid) return -1;
3255
3256 if (PyList_Check(self->pers_func)) {
3257 if (PyList_Append(self->pers_func, pid) < 0) {
3258 Py_DECREF(pid);
3259 return -1;
3260 }
3261 }
3262 else {
3263 ARG_TUP(self, pid);
3264 if (self->arg) {
3265 pid = PyObject_Call(self->pers_func, self->arg,
3266 NULL);
3267 FREE_ARG_TUP(self);
3268 }
3269 }
3270
3271 if (! pid) return -1;
3272
3273 PDATA_PUSH(self->stack, pid, -1);
3274 return 0;
3275 }
3276 else {
3277 PyErr_SetString(UnpicklingError,
3278 "A load persistent id instruction was encountered,\n"
3279 "but no persistent_load function was specified.");
3280 return -1;
3281 }
3282}
3283
3284static int
3285load_binpersid(Unpicklerobject *self)
3286{
3287 PyObject *pid = 0;
3288
3289 if (self->pers_func) {
3290 PDATA_POP(self->stack, pid);
3291 if (! pid) return -1;
3292
3293 if (PyList_Check(self->pers_func)) {
3294 if (PyList_Append(self->pers_func, pid) < 0) {
3295 Py_DECREF(pid);
3296 return -1;
3297 }
3298 }
3299 else {
3300 ARG_TUP(self, pid);
3301 if (self->arg) {
3302 pid = PyObject_Call(self->pers_func, self->arg,
3303 NULL);
3304 FREE_ARG_TUP(self);
3305 }
3306 if (! pid) return -1;
3307 }
3308
3309 PDATA_PUSH(self->stack, pid, -1);
3310 return 0;
3311 }
3312 else {
3313 PyErr_SetString(UnpicklingError,
3314 "A load persistent id instruction was encountered,\n"
3315 "but no persistent_load function was specified.");
3316 return -1;
3317 }
3318}
3319
3320
3321static int
3322load_pop(Unpicklerobject *self)
3323{
3324 int len;
3325
3326 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3327
3328 /* Note that we split the (pickle.py) stack into two stacks,
3329 an object stack and a mark stack. We have to be clever and
3330 pop the right one. We do this by looking at the top of the
3331 mark stack.
3332 */
3333
3334 if ((self->num_marks > 0) &&
3335 (self->marks[self->num_marks - 1] == len))
3336 self->num_marks--;
3337 else {
3338 len--;
3339 Py_DECREF(self->stack->data[len]);
3340 self->stack->length=len;
3341 }
3342
3343 return 0;
3344}
3345
3346
3347static int
3348load_pop_mark(Unpicklerobject *self)
3349{
3350 int i;
3351
3352 if ((i = marker(self)) < 0)
3353 return -1;
3354
3355 Pdata_clear(self->stack, i);
3356
3357 return 0;
3358}
3359
3360
3361static int
3362load_dup(Unpicklerobject *self)
3363{
3364 PyObject *last;
3365 int len;
3366
3367 if ((len = self->stack->length) <= 0) return stackUnderflow();
3368 last=self->stack->data[len-1];
3369 Py_INCREF(last);
3370 PDATA_PUSH(self->stack, last, -1);
3371 return 0;
3372}
3373
3374
3375static int
3376load_get(Unpicklerobject *self)
3377{
3378 PyObject *py_str = 0, *value = 0;
3379 int len;
3380 char *s;
3381 int rc;
3382
3383 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003384 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003386 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003387
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003388 value = PyDict_GetItem(self->memo, py_str);
3389 if (! value) {
3390 PyErr_SetObject(BadPickleGet, py_str);
3391 rc = -1;
3392 } else {
3393 PDATA_APPEND(self->stack, value, -1);
3394 rc = 0;
3395 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003397 Py_DECREF(py_str);
3398 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003399}
3400
3401
3402static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003403load_binget(Unpicklerobject *self)
3404{
3405 PyObject *py_key = 0, *value = 0;
3406 unsigned char key;
3407 char *s;
3408 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003410 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003412 key = (unsigned char)s[0];
3413 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003415 value = PyDict_GetItem(self->memo, py_key);
3416 if (! value) {
3417 PyErr_SetObject(BadPickleGet, py_key);
3418 rc = -1;
3419 } else {
3420 PDATA_APPEND(self->stack, value, -1);
3421 rc = 0;
3422 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003424 Py_DECREF(py_key);
3425 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003426}
3427
3428
3429static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003430load_long_binget(Unpicklerobject *self)
3431{
3432 PyObject *py_key = 0, *value = 0;
3433 unsigned char c;
3434 char *s;
3435 long key;
3436 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003438 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003440 c = (unsigned char)s[0];
3441 key = (long)c;
3442 c = (unsigned char)s[1];
3443 key |= (long)c << 8;
3444 c = (unsigned char)s[2];
3445 key |= (long)c << 16;
3446 c = (unsigned char)s[3];
3447 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003449 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3450
3451 value = PyDict_GetItem(self->memo, py_key);
3452 if (! value) {
3453 PyErr_SetObject(BadPickleGet, py_key);
3454 rc = -1;
3455 } else {
3456 PDATA_APPEND(self->stack, value, -1);
3457 rc = 0;
3458 }
3459
3460 Py_DECREF(py_key);
3461 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003462}
3463
3464
3465static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003466load_put(Unpicklerobject *self)
3467{
3468 PyObject *py_str = 0, *value = 0;
3469 int len, l;
3470 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003472 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3473 if (l < 2) return bad_readline();
3474 if (!( len=self->stack->length )) return stackUnderflow();
3475 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3476 value=self->stack->data[len-1];
3477 l=PyDict_SetItem(self->memo, py_str, value);
3478 Py_DECREF(py_str);
3479 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003480}
3481
3482
3483static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003484load_binput(Unpicklerobject *self)
3485{
3486 PyObject *py_key = 0, *value = 0;
3487 unsigned char key;
3488 char *s;
3489 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003491 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3492 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003494 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003496 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3497 value=self->stack->data[len-1];
3498 len=PyDict_SetItem(self->memo, py_key, value);
3499 Py_DECREF(py_key);
3500 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003501}
3502
3503
3504static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003505load_long_binput(Unpicklerobject *self)
3506{
3507 PyObject *py_key = 0, *value = 0;
3508 long key;
3509 unsigned char c;
3510 char *s;
3511 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003513 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3514 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003516 c = (unsigned char)s[0];
3517 key = (long)c;
3518 c = (unsigned char)s[1];
3519 key |= (long)c << 8;
3520 c = (unsigned char)s[2];
3521 key |= (long)c << 16;
3522 c = (unsigned char)s[3];
3523 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003525 if (!( py_key = PyInt_FromLong(key))) return -1;
3526 value=self->stack->data[len-1];
3527 len=PyDict_SetItem(self->memo, py_key, value);
3528 Py_DECREF(py_key);
3529 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003530}
3531
3532
3533static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003534do_append(Unpicklerobject *self, int x)
3535{
3536 PyObject *value = 0, *list = 0, *append_method = 0;
3537 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003538
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003539 len=self->stack->length;
3540 if (!( len >= x && x > 0 )) return stackUnderflow();
3541 /* nothing to do */
3542 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003544 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003546 if (PyList_Check(list)) {
3547 PyObject *slice;
3548 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003550 slice=Pdata_popList(self->stack, x);
3551 list_len = PyList_GET_SIZE(list);
3552 i=PyList_SetSlice(list, list_len, list_len, slice);
3553 Py_DECREF(slice);
3554 return i;
3555 }
3556 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003558 if (!( append_method = PyObject_GetAttr(list, append_str)))
3559 return -1;
3560
3561 for (i = x; i < len; i++) {
3562 PyObject *junk;
3563
3564 value=self->stack->data[i];
3565 junk=0;
3566 ARG_TUP(self, value);
3567 if (self->arg) {
3568 junk = PyObject_Call(append_method, self->arg,
3569 NULL);
3570 FREE_ARG_TUP(self);
3571 }
3572 if (! junk) {
3573 Pdata_clear(self->stack, i+1);
3574 self->stack->length=x;
3575 Py_DECREF(append_method);
3576 return -1;
3577 }
3578 Py_DECREF(junk);
3579 }
3580 self->stack->length=x;
3581 Py_DECREF(append_method);
3582 }
3583
3584 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003585}
3586
3587
3588static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003589load_append(Unpicklerobject *self)
3590{
3591 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003592}
3593
3594
3595static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003596load_appends(Unpicklerobject *self)
3597{
3598 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003599}
3600
3601
3602static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003603do_setitems(Unpicklerobject *self, int x)
3604{
3605 PyObject *value = 0, *key = 0, *dict = 0;
3606 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003608 if (!( (len=self->stack->length) >= x
3609 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003611 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003613 for (i = x+1; i < len; i += 2) {
3614 key =self->stack->data[i-1];
3615 value=self->stack->data[i ];
3616 if (PyObject_SetItem(dict, key, value) < 0) {
3617 r=-1;
3618 break;
3619 }
3620 }
3621
3622 Pdata_clear(self->stack, x);
3623
3624 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003625}
3626
3627
Tim Peters84e87f32001-03-17 04:50:51 +00003628static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003629load_setitem(Unpicklerobject *self)
3630{
3631 return do_setitems(self, self->stack->length - 2);
3632}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003634static int
3635load_setitems(Unpicklerobject *self)
3636{
3637 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003638}
3639
Tim Peters84e87f32001-03-17 04:50:51 +00003640
Guido van Rossum60456fd1997-04-09 17:36:32 +00003641static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003642load_build(Unpicklerobject *self)
3643{
3644 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3645 *junk = 0, *__setstate__ = 0;
3646 int i, r = 0;
3647
3648 if (self->stack->length < 2) return stackUnderflow();
3649 PDATA_POP(self->stack, value);
3650 if (! value) return -1;
3651 inst=self->stack->data[self->stack->length-1];
3652
3653 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3654 ARG_TUP(self, value);
3655 if (self->arg) {
3656 junk = PyObject_Call(__setstate__, self->arg, NULL);
3657 FREE_ARG_TUP(self);
3658 }
3659 Py_DECREF(__setstate__);
3660 if (! junk) return -1;
3661 Py_DECREF(junk);
3662 return 0;
3663 }
3664
3665 PyErr_Clear();
3666 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3667 i = 0;
3668 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3669 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3670 r=-1;
3671 break;
3672 }
3673 }
3674 Py_DECREF(instdict);
3675 }
3676 else r=-1;
3677
3678 Py_XDECREF(value);
3679
3680 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003681}
3682
3683
3684static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003685load_mark(Unpicklerobject *self)
3686{
3687 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003689 /* Note that we split the (pickle.py) stack into two stacks, an
3690 object stack and a mark stack. Here we push a mark onto the
3691 mark stack.
3692 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003694 if ((self->num_marks + 1) >= self->marks_size) {
3695 s=self->marks_size+20;
3696 if (s <= self->num_marks) s=self->num_marks + 1;
3697 if (self->marks == NULL)
3698 self->marks=(int *)malloc(s * sizeof(int));
3699 else
3700 self->marks=(int *)realloc(self->marks,
3701 s * sizeof(int));
3702 if (! self->marks) {
3703 PyErr_NoMemory();
3704 return -1;
3705 }
3706 self->marks_size = s;
3707 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003709 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003711 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003712}
3713
Guido van Rossum60456fd1997-04-09 17:36:32 +00003714static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003715load_reduce(Unpicklerobject *self)
3716{
3717 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003719 PDATA_POP(self->stack, arg_tup);
3720 if (! arg_tup) return -1;
3721 PDATA_POP(self->stack, callable);
3722 if (callable) {
3723 ob = Instance_New(callable, arg_tup);
3724 Py_DECREF(callable);
3725 }
3726 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003728 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003730 PDATA_PUSH(self->stack, ob, -1);
3731 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003732}
Tim Peters84e87f32001-03-17 04:50:51 +00003733
Guido van Rossum60456fd1997-04-09 17:36:32 +00003734static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003735load(Unpicklerobject *self)
3736{
3737 PyObject *err = 0, *val = 0;
3738 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003740 self->num_marks = 0;
3741 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003743 while (1) {
3744 if ((*self->read_func)(self, &s, 1) < 0)
3745 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003747 switch (s[0]) {
3748 case NONE:
3749 if (load_none(self) < 0)
3750 break;
3751 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003753 case BININT:
3754 if (load_binint(self) < 0)
3755 break;
3756 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003758 case BININT1:
3759 if (load_binint1(self) < 0)
3760 break;
3761 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003763 case BININT2:
3764 if (load_binint2(self) < 0)
3765 break;
3766 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003768 case INT:
3769 if (load_int(self) < 0)
3770 break;
3771 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003773 case LONG:
3774 if (load_long(self) < 0)
3775 break;
3776 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003778 case FLOAT:
3779 if (load_float(self) < 0)
3780 break;
3781 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003783 case BINFLOAT:
3784 if (load_binfloat(self) < 0)
3785 break;
3786 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003788 case BINSTRING:
3789 if (load_binstring(self) < 0)
3790 break;
3791 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003793 case SHORT_BINSTRING:
3794 if (load_short_binstring(self) < 0)
3795 break;
3796 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003798 case STRING:
3799 if (load_string(self) < 0)
3800 break;
3801 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003802
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003803#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003804 case UNICODE:
3805 if (load_unicode(self) < 0)
3806 break;
3807 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003809 case BINUNICODE:
3810 if (load_binunicode(self) < 0)
3811 break;
3812 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003813#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003815 case EMPTY_TUPLE:
3816 if (load_empty_tuple(self) < 0)
3817 break;
3818 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003820 case TUPLE:
3821 if (load_tuple(self) < 0)
3822 break;
3823 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003825 case EMPTY_LIST:
3826 if (load_empty_list(self) < 0)
3827 break;
3828 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003830 case LIST:
3831 if (load_list(self) < 0)
3832 break;
3833 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003835 case EMPTY_DICT:
3836 if (load_empty_dict(self) < 0)
3837 break;
3838 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003840 case DICT:
3841 if (load_dict(self) < 0)
3842 break;
3843 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003845 case OBJ:
3846 if (load_obj(self) < 0)
3847 break;
3848 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003850 case INST:
3851 if (load_inst(self) < 0)
3852 break;
3853 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003855 case GLOBAL:
3856 if (load_global(self) < 0)
3857 break;
3858 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003860 case APPEND:
3861 if (load_append(self) < 0)
3862 break;
3863 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003865 case APPENDS:
3866 if (load_appends(self) < 0)
3867 break;
3868 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003870 case BUILD:
3871 if (load_build(self) < 0)
3872 break;
3873 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003875 case DUP:
3876 if (load_dup(self) < 0)
3877 break;
3878 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003880 case BINGET:
3881 if (load_binget(self) < 0)
3882 break;
3883 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003885 case LONG_BINGET:
3886 if (load_long_binget(self) < 0)
3887 break;
3888 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003890 case GET:
3891 if (load_get(self) < 0)
3892 break;
3893 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003895 case MARK:
3896 if (load_mark(self) < 0)
3897 break;
3898 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003900 case BINPUT:
3901 if (load_binput(self) < 0)
3902 break;
3903 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003904
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003905 case LONG_BINPUT:
3906 if (load_long_binput(self) < 0)
3907 break;
3908 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003909
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003910 case PUT:
3911 if (load_put(self) < 0)
3912 break;
3913 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003915 case POP:
3916 if (load_pop(self) < 0)
3917 break;
3918 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003919
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003920 case POP_MARK:
3921 if (load_pop_mark(self) < 0)
3922 break;
3923 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003925 case SETITEM:
3926 if (load_setitem(self) < 0)
3927 break;
3928 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003930 case SETITEMS:
3931 if (load_setitems(self) < 0)
3932 break;
3933 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003935 case STOP:
3936 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003938 case PERSID:
3939 if (load_persid(self) < 0)
3940 break;
3941 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003943 case BINPERSID:
3944 if (load_binpersid(self) < 0)
3945 break;
3946 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003948 case REDUCE:
3949 if (load_reduce(self) < 0)
3950 break;
3951 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003953 case '\0':
3954 /* end of file */
3955 PyErr_SetNone(PyExc_EOFError);
3956 break;
Neil Schemenauerfa79c652002-03-22 23:02:53 +00003957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003958 default:
3959 cPickle_ErrFormat(UnpicklingError,
3960 "invalid load key, '%s'.",
3961 "c", s[0]);
3962 return NULL;
3963 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003964
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003965 break;
3966 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003967
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003968 if ((err = PyErr_Occurred())) {
3969 if (err == PyExc_EOFError) {
3970 PyErr_SetNone(PyExc_EOFError);
3971 }
3972 return NULL;
3973 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003974
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003975 PDATA_POP(self->stack, val);
3976 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003977}
Tim Peters84e87f32001-03-17 04:50:51 +00003978
Guido van Rossum60456fd1997-04-09 17:36:32 +00003979
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003980/* No-load functions to support noload, which is used to
3981 find persistent references. */
3982
3983static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003984noload_obj(Unpicklerobject *self)
3985{
3986 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003988 if ((i = marker(self)) < 0) return -1;
3989 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003990}
3991
3992
3993static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003994noload_inst(Unpicklerobject *self)
3995{
3996 int i;
3997 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003999 if ((i = marker(self)) < 0) return -1;
4000 Pdata_clear(self->stack, i);
4001 if ((*self->readline_func)(self, &s) < 0) return -1;
4002 if ((*self->readline_func)(self, &s) < 0) return -1;
4003 PDATA_APPEND(self->stack, Py_None,-1);
4004 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004005}
4006
4007static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004008noload_global(Unpicklerobject *self)
4009{
4010 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004012 if ((*self->readline_func)(self, &s) < 0) return -1;
4013 if ((*self->readline_func)(self, &s) < 0) return -1;
4014 PDATA_APPEND(self->stack, Py_None,-1);
4015 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004016}
4017
4018static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004019noload_reduce(Unpicklerobject *self)
4020{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004021
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004022 if (self->stack->length < 2) return stackUnderflow();
4023 Pdata_clear(self->stack, self->stack->length-2);
4024 PDATA_APPEND(self->stack, Py_None,-1);
4025 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004026}
4027
4028static int
4029noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004030
Guido van Rossum053b8df1998-11-25 16:18:00 +00004031 if (self->stack->length < 1) return stackUnderflow();
4032 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004033 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004034}
4035
4036
4037static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004038noload(Unpicklerobject *self)
4039{
4040 PyObject *err = 0, *val = 0;
4041 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004042
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004043 self->num_marks = 0;
4044 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004046 while (1) {
4047 if ((*self->read_func)(self, &s, 1) < 0)
4048 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004050 switch (s[0]) {
4051 case NONE:
4052 if (load_none(self) < 0)
4053 break;
4054 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004056 case BININT:
4057 if (load_binint(self) < 0)
4058 break;
4059 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004061 case BININT1:
4062 if (load_binint1(self) < 0)
4063 break;
4064 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004066 case BININT2:
4067 if (load_binint2(self) < 0)
4068 break;
4069 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004071 case INT:
4072 if (load_int(self) < 0)
4073 break;
4074 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004076 case LONG:
4077 if (load_long(self) < 0)
4078 break;
4079 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004081 case FLOAT:
4082 if (load_float(self) < 0)
4083 break;
4084 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004086 case BINFLOAT:
4087 if (load_binfloat(self) < 0)
4088 break;
4089 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004091 case BINSTRING:
4092 if (load_binstring(self) < 0)
4093 break;
4094 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004096 case SHORT_BINSTRING:
4097 if (load_short_binstring(self) < 0)
4098 break;
4099 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004101 case STRING:
4102 if (load_string(self) < 0)
4103 break;
4104 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004105
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004106#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004107 case UNICODE:
4108 if (load_unicode(self) < 0)
4109 break;
4110 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004112 case BINUNICODE:
4113 if (load_binunicode(self) < 0)
4114 break;
4115 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004116#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004117
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004118 case EMPTY_TUPLE:
4119 if (load_empty_tuple(self) < 0)
4120 break;
4121 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004123 case TUPLE:
4124 if (load_tuple(self) < 0)
4125 break;
4126 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004128 case EMPTY_LIST:
4129 if (load_empty_list(self) < 0)
4130 break;
4131 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004133 case LIST:
4134 if (load_list(self) < 0)
4135 break;
4136 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004138 case EMPTY_DICT:
4139 if (load_empty_dict(self) < 0)
4140 break;
4141 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004143 case DICT:
4144 if (load_dict(self) < 0)
4145 break;
4146 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004148 case OBJ:
4149 if (noload_obj(self) < 0)
4150 break;
4151 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004153 case INST:
4154 if (noload_inst(self) < 0)
4155 break;
4156 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004158 case GLOBAL:
4159 if (noload_global(self) < 0)
4160 break;
4161 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004163 case APPEND:
4164 if (load_append(self) < 0)
4165 break;
4166 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004168 case APPENDS:
4169 if (load_appends(self) < 0)
4170 break;
4171 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004173 case BUILD:
4174 if (noload_build(self) < 0)
4175 break;
4176 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004178 case DUP:
4179 if (load_dup(self) < 0)
4180 break;
4181 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004183 case BINGET:
4184 if (load_binget(self) < 0)
4185 break;
4186 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004188 case LONG_BINGET:
4189 if (load_long_binget(self) < 0)
4190 break;
4191 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004193 case GET:
4194 if (load_get(self) < 0)
4195 break;
4196 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004198 case MARK:
4199 if (load_mark(self) < 0)
4200 break;
4201 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004203 case BINPUT:
4204 if (load_binput(self) < 0)
4205 break;
4206 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004208 case LONG_BINPUT:
4209 if (load_long_binput(self) < 0)
4210 break;
4211 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004213 case PUT:
4214 if (load_put(self) < 0)
4215 break;
4216 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004218 case POP:
4219 if (load_pop(self) < 0)
4220 break;
4221 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004223 case POP_MARK:
4224 if (load_pop_mark(self) < 0)
4225 break;
4226 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004228 case SETITEM:
4229 if (load_setitem(self) < 0)
4230 break;
4231 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004233 case SETITEMS:
4234 if (load_setitems(self) < 0)
4235 break;
4236 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004238 case STOP:
4239 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004241 case PERSID:
4242 if (load_persid(self) < 0)
4243 break;
4244 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004245
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004246 case BINPERSID:
4247 if (load_binpersid(self) < 0)
4248 break;
4249 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004251 case REDUCE:
4252 if (noload_reduce(self) < 0)
4253 break;
4254 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004255
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004256 default:
4257 cPickle_ErrFormat(UnpicklingError,
4258 "invalid load key, '%s'.",
4259 "c", s[0]);
4260 return NULL;
4261 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004263 break;
4264 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004265
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004266 if ((err = PyErr_Occurred())) {
4267 if (err == PyExc_EOFError) {
4268 PyErr_SetNone(PyExc_EOFError);
4269 }
4270 return NULL;
4271 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004273 PDATA_POP(self->stack, val);
4274 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004275}
Tim Peters84e87f32001-03-17 04:50:51 +00004276
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004277
Guido van Rossum60456fd1997-04-09 17:36:32 +00004278static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004279Unpickler_load(Unpicklerobject *self, PyObject *args)
4280{
4281 if (!( PyArg_ParseTuple(args, ":load")))
4282 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004284 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004285}
4286
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004287static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004288Unpickler_noload(Unpicklerobject *self, PyObject *args)
4289{
4290 if (!( PyArg_ParseTuple(args, ":noload")))
4291 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004293 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004294}
4295
Guido van Rossum60456fd1997-04-09 17:36:32 +00004296
4297static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004298 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004299 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004300 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004301 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004302 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004303 "noload() -- not load a pickle, but go through most of the motions\n"
4304 "\n"
4305 "This function can be used to read past a pickle without instantiating\n"
4306 "any objects or importing any modules. It can also be used to find all\n"
4307 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004308 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004309 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004310 {NULL, NULL} /* sentinel */
4311};
4312
4313
4314static Unpicklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004315newUnpicklerobject(PyObject *f)
4316{
4317 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004318
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004319 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
4320 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004322 self->file = NULL;
4323 self->arg = NULL;
4324 self->stack = (Pdata*)Pdata_New();
4325 self->pers_func = NULL;
4326 self->last_string = NULL;
4327 self->marks = NULL;
4328 self->num_marks = 0;
4329 self->marks_size = 0;
4330 self->buf_size = 0;
4331 self->read = NULL;
4332 self->readline = NULL;
4333 self->safe_constructors = NULL;
4334 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004336 if (!( self->memo = PyDict_New()))
4337 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004339 Py_INCREF(f);
4340 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004342 /* Set read, readline based on type of f */
4343 if (PyFile_Check(f)) {
4344 self->fp = PyFile_AsFile(f);
4345 if (self->fp == NULL) {
4346 PyErr_SetString(PyExc_ValueError,
4347 "I/O operation on closed file");
4348 goto err;
4349 }
4350 self->read_func = read_file;
4351 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004352 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004353 else if (PycStringIO_InputCheck(f)) {
4354 self->fp = NULL;
4355 self->read_func = read_cStringIO;
4356 self->readline_func = readline_cStringIO;
4357 }
4358 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004359
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004360 self->fp = NULL;
4361 self->read_func = read_other;
4362 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004364 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4365 (self->read = PyObject_GetAttr(f, read_str)))) {
4366 PyErr_Clear();
4367 PyErr_SetString( PyExc_TypeError,
4368 "argument must have 'read' and "
4369 "'readline' attributes" );
4370 goto err;
4371 }
4372 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004374 if (PyEval_GetRestricted()) {
4375 /* Restricted execution, get private tables */
4376 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004377
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004378 if (!( m=PyImport_Import(copy_reg_str))) goto err;
4379 self->safe_constructors=PyObject_GetAttr(m,
4380 safe_constructors_str);
4381 Py_DECREF(m);
4382 if (!( self->safe_constructors )) goto err;
4383 }
4384 else {
4385 self->safe_constructors=safe_constructors;
4386 Py_INCREF(safe_constructors);
4387 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004389 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004391 err:
4392 Py_DECREF((PyObject *)self);
4393 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004394}
4395
4396
4397static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004398get_Unpickler(PyObject *self, PyObject *args)
4399{
4400 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004402 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
4403 return NULL;
4404 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004405}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004406
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004407
Guido van Rossum60456fd1997-04-09 17:36:32 +00004408static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004409Unpickler_dealloc(Unpicklerobject *self)
4410{
4411 Py_XDECREF(self->readline);
4412 Py_XDECREF(self->read);
4413 Py_XDECREF(self->file);
4414 Py_XDECREF(self->memo);
4415 Py_XDECREF(self->stack);
4416 Py_XDECREF(self->pers_func);
4417 Py_XDECREF(self->arg);
4418 Py_XDECREF(self->last_string);
4419 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004421 if (self->marks) {
4422 free(self->marks);
4423 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004425 if (self->buf_size) {
4426 free(self->buf);
4427 }
Tim Peters84e87f32001-03-17 04:50:51 +00004428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004429 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004430}
4431
4432
4433static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004434Unpickler_getattr(Unpicklerobject *self, char *name)
4435{
4436 if (!strcmp(name, "persistent_load")) {
4437 if (!self->pers_func) {
4438 PyErr_SetString(PyExc_AttributeError, name);
4439 return NULL;
4440 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004442 Py_INCREF(self->pers_func);
4443 return self->pers_func;
4444 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004446 if (!strcmp(name, "find_global")) {
4447 if (!self->find_class) {
4448 PyErr_SetString(PyExc_AttributeError, name);
4449 return NULL;
4450 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004452 Py_INCREF(self->find_class);
4453 return self->find_class;
4454 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004456 if (!strcmp(name, "memo")) {
4457 if (!self->memo) {
4458 PyErr_SetString(PyExc_AttributeError, name);
4459 return NULL;
4460 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004462 Py_INCREF(self->memo);
4463 return self->memo;
4464 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004466 if (!strcmp(name, "UnpicklingError")) {
4467 Py_INCREF(UnpicklingError);
4468 return UnpicklingError;
4469 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004471 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004472}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004473
Guido van Rossum60456fd1997-04-09 17:36:32 +00004474
4475static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004476Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
4477{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004479 if (!strcmp(name, "persistent_load")) {
4480 Py_XDECREF(self->pers_func);
4481 self->pers_func = value;
4482 Py_XINCREF(value);
4483 return 0;
4484 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004486 if (!strcmp(name, "find_global")) {
4487 Py_XDECREF(self->find_class);
4488 self->find_class = value;
4489 Py_XINCREF(value);
4490 return 0;
4491 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004493 if (! value) {
4494 PyErr_SetString(PyExc_TypeError,
4495 "attribute deletion is not supported");
4496 return -1;
4497 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004499 if (strcmp(name, "memo") == 0) {
4500 if (!PyDict_Check(value)) {
4501 PyErr_SetString(PyExc_TypeError,
4502 "memo must be a dictionary");
4503 return -1;
4504 }
4505 Py_XDECREF(self->memo);
4506 self->memo = value;
4507 Py_INCREF(value);
4508 return 0;
4509 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004511 PyErr_SetString(PyExc_AttributeError, name);
4512 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004513}
4514
4515
4516static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004517cpm_dump(PyObject *self, PyObject *args)
4518{
4519 PyObject *ob, *file, *res = NULL;
4520 Picklerobject *pickler = 0;
4521 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004523 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin)))
4524 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004525
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004526 if (!( pickler = newPicklerobject(file, bin)))
4527 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004529 if (dump(pickler, ob) < 0)
4530 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004532 Py_INCREF(Py_None);
4533 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004535 finally:
4536 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004538 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004539}
4540
4541
4542static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004543cpm_dumps(PyObject *self, PyObject *args)
4544{
4545 PyObject *ob, *file = 0, *res = NULL;
4546 Picklerobject *pickler = 0;
4547 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004549 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin)))
4550 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004552 if (!( file = PycStringIO->NewOutput(128)))
4553 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004555 if (!( pickler = newPicklerobject(file, bin)))
4556 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004558 if (dump(pickler, ob) < 0)
4559 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004561 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004563 finally:
4564 Py_XDECREF(pickler);
4565 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004567 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004568}
4569
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004570
4571static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004572cpm_load(PyObject *self, PyObject *args)
4573{
4574 Unpicklerobject *unpickler = 0;
4575 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004577 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
4578 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004580 if (!( unpickler = newUnpicklerobject(ob)))
4581 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004583 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004585 finally:
4586 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004588 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004589}
4590
4591
4592static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004593cpm_loads(PyObject *self, PyObject *args)
4594{
4595 PyObject *ob, *file = 0, *res = NULL;
4596 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004598 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
4599 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004601 if (!( file = PycStringIO->NewInput(ob)))
4602 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004603
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004604 if (!( unpickler = newUnpicklerobject(file)))
4605 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004607 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004609 finally:
4610 Py_XDECREF(file);
4611 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004613 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004614}
4615
4616
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004617PyDoc_STRVAR(Unpicklertype__doc__,
4618"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004619
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004620static PyTypeObject Unpicklertype = {
4621 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004622 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004623 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004624 sizeof(Unpicklerobject), /*tp_basicsize*/
4625 0, /*tp_itemsize*/
4626 /* methods */
4627 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4628 (printfunc)0, /*tp_print*/
4629 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4630 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4631 (cmpfunc)0, /*tp_compare*/
4632 (reprfunc)0, /*tp_repr*/
4633 0, /*tp_as_number*/
4634 0, /*tp_as_sequence*/
4635 0, /*tp_as_mapping*/
4636 (hashfunc)0, /*tp_hash*/
4637 (ternaryfunc)0, /*tp_call*/
4638 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004639
Guido van Rossum60456fd1997-04-09 17:36:32 +00004640 /* Space for future expansion */
4641 0L,0L,0L,0L,
4642 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004643};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004644
Guido van Rossum60456fd1997-04-09 17:36:32 +00004645static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004646 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004647 PyDoc_STR("dump(object, file, [binary]) --"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004648 "Write an object in pickle format to the given file\n"
4649 "\n"
4650 "If the optional argument, binary, is provided and is true, then the\n"
4651 "pickle will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004652 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004653 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004654 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004655 PyDoc_STR("dumps(object, [binary]) --"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004656 "Return a string containing an object in pickle format\n"
4657 "\n"
4658 "If the optional argument, binary, is provided and is true, then the\n"
4659 "pickle will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004660 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004661 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004662 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004663 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Neal Norwitzb0493252002-03-31 14:44:22 +00004664 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004665 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Neal Norwitzb0493252002-03-31 14:44:22 +00004666 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004667 PyDoc_STR("Pickler(file, [binary]) -- Create a pickler\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004668 "\n"
4669 "If the optional argument, binary, is provided and is true, then\n"
4670 "pickles will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004671 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004672 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004673 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004674 PyDoc_STR("Unpickler(file) -- Create an unpickler")},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004675 { NULL, NULL }
4676};
4677
Guido van Rossum60456fd1997-04-09 17:36:32 +00004678static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004679init_stuff(PyObject *module_dict)
4680{
4681 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004682
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004683#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004685 INIT_STR(__class__);
4686 INIT_STR(__getinitargs__);
4687 INIT_STR(__dict__);
4688 INIT_STR(__getstate__);
4689 INIT_STR(__setstate__);
4690 INIT_STR(__name__);
4691 INIT_STR(__main__);
4692 INIT_STR(__reduce__);
4693 INIT_STR(write);
4694 INIT_STR(__safe_for_unpickling__);
4695 INIT_STR(append);
4696 INIT_STR(read);
4697 INIT_STR(readline);
4698 INIT_STR(copy_reg);
4699 INIT_STR(dispatch_table);
4700 INIT_STR(safe_constructors);
4701 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004703 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
4704 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004706 /* These next few are special because we want to use different
4707 ones in restricted mode. */
4708 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
4709 if (!dispatch_table)
4710 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004712 if (!( safe_constructors = PyObject_GetAttr(copy_reg,
4713 safe_constructors_str)))
4714 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004716 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004718 /* Down to here ********************************** */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004720 if (!( empty_tuple = PyTuple_New(0)))
4721 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004723 /* Ugh */
4724 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4725 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4726 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004728 if (!( t=PyDict_New())) return -1;
4729 if (!( r=PyRun_String(
4730 "def __init__(self, *args): self.args=args\n\n"
4731 "def __str__(self):\n"
4732 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4733 Py_file_input,
4734 module_dict, t) )) return -1;
4735 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004737 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
4738 if (!PickleError)
4739 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004741 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004743 PicklingError = PyErr_NewException("cPickle.PicklingError",
4744 PickleError, NULL);
4745 if (!PicklingError)
4746 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004747
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004748 if (!( t=PyDict_New())) return -1;
4749 if (!( r=PyRun_String(
4750 "def __init__(self, *args): self.args=args\n\n"
4751 "def __str__(self):\n"
4752 " a=self.args\n"
4753 " a=a and type(a[0]) or '(what)'\n"
4754 " return 'Cannot pickle %s objects' % a\n"
4755 , Py_file_input,
4756 module_dict, t) )) return -1;
4757 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004759 if (!( UnpickleableError = PyErr_NewException(
4760 "cPickle.UnpickleableError", PicklingError, t)))
4761 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004763 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004765 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
4766 PickleError, NULL)))
4767 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004768
Martin v. Löwis658009a2002-09-16 17:26:24 +00004769 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
4770 UnpicklingError, NULL)))
4771 return -1;
4772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004773 if (PyDict_SetItemString(module_dict, "PickleError",
4774 PickleError) < 0)
4775 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004777 if (PyDict_SetItemString(module_dict, "PicklingError",
4778 PicklingError) < 0)
4779 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004781 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4782 UnpicklingError) < 0)
4783 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004785 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4786 UnpickleableError) < 0)
4787 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004789 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4790 BadPickleGet) < 0)
4791 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004793 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004795 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004796}
4797
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004798#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
4799#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004800#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004801PyMODINIT_FUNC
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004802initcPickle(void)
4803{
4804 PyObject *m, *d, *di, *v, *k;
4805 int i;
4806 char *rev="1.71";
4807 PyObject *format_version;
4808 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004810 Picklertype.ob_type = &PyType_Type;
4811 Picklertype.tp_getattro = PyObject_GenericGetAttr;
4812 Picklertype.tp_setattro = PyObject_GenericSetAttr;
4813 Unpicklertype.ob_type = &PyType_Type;
4814 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004816 /* Initialize some pieces. We need to do this before module creation,
4817 so we're forced to use a temporary dictionary. :(
4818 */
4819 di=PyDict_New();
4820 if (!di) return;
4821 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004823 /* Create the module and add the functions */
4824 m = Py_InitModule4("cPickle", cPickle_methods,
4825 cPickle_module_documentation,
4826 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004828 /* Add some symbolic constants to the module */
4829 d = PyModule_GetDict(m);
4830 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4831 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004833 /* Copy data from di. Waaa. */
4834 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4835 if (PyObject_SetItem(d, k, v) < 0) {
4836 Py_DECREF(di);
4837 return;
4838 }
4839 }
4840 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004842 format_version = PyString_FromString("1.3");
4843 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004845 PyDict_SetItemString(d, "format_version", format_version);
4846 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4847 Py_XDECREF(format_version);
4848 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004849}