blob: b83e76581a629e409fd7e03f786de239791297e1 [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
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001716 mod = PyImport_ImportModule(module_str);
1717 if (mod == NULL) {
1718 /* Py_ErrClear(); ?? */
1719 cPickle_ErrFormat(PicklingError,
1720 "Can't pickle %s: it's not found as %s.%s",
1721 "OSS", args, module, global_name);
1722 goto finally;
1723 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001724 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001725 if (klass == NULL) {
1726 cPickle_ErrFormat(PicklingError,
1727 "Can't pickle %s: it's not found as %s.%s",
1728 "OSS", args, module, global_name);
1729 goto finally;
1730 }
1731 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001732 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001733 cPickle_ErrFormat(PicklingError,
1734 "Can't pickle %s: it's not the same object as %s.%s",
1735 "OSS", args, module, global_name);
1736 goto finally;
1737 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001738 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001740 if ((*self->write_func)(self, &global, 1) < 0)
1741 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001743 if ((*self->write_func)(self, module_str, module_size) < 0)
1744 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001746 if ((*self->write_func)(self, "\n", 1) < 0)
1747 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001749 if ((*self->write_func)(self, name_str, name_size) < 0)
1750 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001752 if ((*self->write_func)(self, "\n", 1) < 0)
1753 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001755 if (put(self, args) < 0)
1756 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001758 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001760 finally:
1761 Py_XDECREF(module);
1762 Py_XDECREF(global_name);
1763 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001765 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001766}
1767
Guido van Rossum60456fd1997-04-09 17:36:32 +00001768static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001769save_pers(Picklerobject *self, PyObject *args, PyObject *f)
1770{
1771 PyObject *pid = 0;
1772 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001774 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001776 Py_INCREF(args);
1777 ARG_TUP(self, args);
1778 if (self->arg) {
1779 pid = PyObject_Call(f, self->arg, NULL);
1780 FREE_ARG_TUP(self);
1781 }
1782 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001784 if (pid != Py_None) {
1785 if (!self->bin) {
1786 if (!PyString_Check(pid)) {
1787 PyErr_SetString(PicklingError,
1788 "persistent id must be string");
1789 goto finally;
1790 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001792 if ((*self->write_func)(self, &persid, 1) < 0)
1793 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001795 if ((size = PyString_Size(pid)) < 0)
1796 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001798 if ((*self->write_func)(self,
1799 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1800 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001802 if ((*self->write_func)(self, "\n", 1) < 0)
1803 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001805 res = 1;
1806 goto finally;
1807 }
1808 else if (save(self, pid, 1) >= 0) {
1809 if ((*self->write_func)(self, &binpersid, 1) < 0)
1810 res = -1;
1811 else
1812 res = 1;
1813 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001815 goto finally;
1816 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001818 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001820 finally:
1821 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001823 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001824}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001825
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001826
Tim Peters84e87f32001-03-17 04:50:51 +00001827static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001828save_reduce(Picklerobject *self, PyObject *callable,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001829 PyObject *tup, PyObject *state, PyObject *ob)
1830{
1831 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001833 if (save(self, callable, 0) < 0)
1834 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001836 if (save(self, tup, 0) < 0)
1837 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001839 if ((*self->write_func)(self, &reduce, 1) < 0)
1840 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001842 if (ob != NULL) {
1843 if (state && !PyDict_Check(state)) {
1844 if (put2(self, ob) < 0)
1845 return -1;
1846 }
1847 else {
1848 if (put(self, ob) < 0)
1849 return -1;
1850 }
1851 }
Tim Peters84e87f32001-03-17 04:50:51 +00001852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001853 if (state) {
1854 if (save(self, state, 0) < 0)
1855 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001857 if ((*self->write_func)(self, &build, 1) < 0)
1858 return -1;
1859 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001861 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001862}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001863
Guido van Rossum60456fd1997-04-09 17:36:32 +00001864static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001865save(Picklerobject *self, PyObject *args, int pers_save)
1866{
1867 PyTypeObject *type;
1868 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1869 *callable = 0, *state = 0;
1870 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001871
Martin v. Löwis5a395302002-08-04 08:20:23 +00001872 if (self->nesting++ > Py_GetRecursionLimit()){
1873 PyErr_SetString(PyExc_RuntimeError,
1874 "maximum recursion depth exceeded");
1875 goto finally;
1876 }
1877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001878 if (!pers_save && self->pers_func) {
1879 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1880 res = tmp;
1881 goto finally;
1882 }
1883 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001885 if (args == Py_None) {
1886 res = save_none(self, args);
1887 goto finally;
1888 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001890 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001892 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001893 case 'b':
1894 if (args == Py_False || args == Py_True) {
1895 res = save_bool(self, args);
1896 goto finally;
1897 }
1898 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001899 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001900 if (type == &PyInt_Type) {
1901 res = save_int(self, args);
1902 goto finally;
1903 }
1904 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001905
Guido van Rossum60456fd1997-04-09 17:36:32 +00001906 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001907 if (type == &PyLong_Type) {
1908 res = save_long(self, args);
1909 goto finally;
1910 }
1911 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001912
Guido van Rossum60456fd1997-04-09 17:36:32 +00001913 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001914 if (type == &PyFloat_Type) {
1915 res = save_float(self, args);
1916 goto finally;
1917 }
1918 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001919
Guido van Rossum60456fd1997-04-09 17:36:32 +00001920 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001921 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
1922 if (self->bin) res = save_empty_tuple(self, args);
1923 else res = save_tuple(self, args);
1924 goto finally;
1925 }
1926 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001927
Guido van Rossum60456fd1997-04-09 17:36:32 +00001928 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001929 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
1930 res = save_string(self, args, 0);
1931 goto finally;
1932 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001933
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001934#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001935 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001936 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1937 res = save_unicode(self, args, 0);
1938 goto finally;
1939 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001940#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001941 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001943 if (args->ob_refcnt > 1) {
1944 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
1945 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001947 if (PyDict_GetItem(self->memo, py_ob_id)) {
1948 if (get(self, py_ob_id) < 0)
1949 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001951 res = 0;
1952 goto finally;
1953 }
1954 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001956 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001957 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001958 if (type == &PyString_Type) {
1959 res = save_string(self, args, 1);
1960 goto finally;
1961 }
1962 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001963
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001964#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001965 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001966 if (type == &PyUnicode_Type) {
1967 res = save_unicode(self, args, 1);
1968 goto finally;
1969 }
1970 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001971#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001972
Guido van Rossum60456fd1997-04-09 17:36:32 +00001973 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001974 if (type == &PyTuple_Type) {
1975 res = save_tuple(self, args);
1976 goto finally;
1977 }
1978 if (type == &PyType_Type) {
1979 res = save_global(self, args, NULL);
1980 goto finally;
1981 }
1982 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001983
Guido van Rossum60456fd1997-04-09 17:36:32 +00001984 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001985 if (type == &PyList_Type) {
1986 res = save_list(self, args);
1987 goto finally;
1988 }
1989 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001990
1991 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001992 if (type == &PyDict_Type) {
1993 res = save_dict(self, args);
1994 goto finally;
1995 }
1996 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001997
1998 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001999 if (type == &PyInstance_Type) {
2000 res = save_inst(self, args);
2001 goto finally;
2002 }
2003 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002004
2005 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002006 if (type == &PyClass_Type) {
2007 res = save_global(self, args, NULL);
2008 goto finally;
2009 }
2010 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002011
2012 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002013 if (type == &PyFunction_Type) {
2014 res = save_global(self, args, NULL);
2015 goto finally;
2016 }
2017 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002018
2019 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002020 if (type == &PyCFunction_Type) {
2021 res = save_global(self, args, NULL);
2022 goto finally;
2023 }
2024 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002026 if (!pers_save && self->inst_pers_func) {
2027 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2028 res = tmp;
2029 goto finally;
2030 }
2031 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002032
Jeremy Hylton39c61162002-07-16 19:47:43 +00002033 if (PyType_IsSubtype(type, &PyType_Type)) {
2034 res = save_global(self, args, NULL);
2035 goto finally;
2036 }
2037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002038 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2039 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002040
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002041 Py_INCREF(args);
2042 ARG_TUP(self, args);
2043 if (self->arg) {
2044 t = PyObject_Call(__reduce__, self->arg, NULL);
2045 FREE_ARG_TUP(self);
2046 }
2047 if (! t) goto finally;
2048 }
2049 else {
2050 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002052 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2053 t = PyObject_Call(__reduce__, empty_tuple, NULL);
2054 if (!t)
2055 goto finally;
2056 }
2057 else {
2058 PyErr_Clear();
2059 }
2060 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002062 if (t) {
2063 if (PyString_Check(t)) {
2064 res = save_global(self, args, t);
2065 goto finally;
2066 }
Tim Peters84e87f32001-03-17 04:50:51 +00002067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002068 if (!PyTuple_Check(t)) {
2069 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2070 "be a tuple", "O", __reduce__);
2071 goto finally;
2072 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002074 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002076 if ((size != 3) && (size != 2)) {
2077 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2078 "contain only two or three elements", "O", __reduce__);
2079 goto finally;
2080 }
Tim Peters84e87f32001-03-17 04:50:51 +00002081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002082 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002084 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002086 if (size > 2) {
2087 state = PyTuple_GET_ITEM(t, 2);
2088 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002089
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002090 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2091 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2092 "returned by %s must be a tuple", "O", __reduce__);
2093 goto finally;
2094 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002096 res = save_reduce(self, callable, arg_tup, state, args);
2097 goto finally;
2098 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002100 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002101
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002102 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002103 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002104 Py_XDECREF(py_ob_id);
2105 Py_XDECREF(__reduce__);
2106 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002108 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002109}
2110
2111
2112static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002113dump(Picklerobject *self, PyObject *args)
2114{
2115 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002117 if (save(self, args, 0) < 0)
2118 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002120 if ((*self->write_func)(self, &stop, 1) < 0)
2121 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002123 if ((*self->write_func)(self, NULL, 0) < 0)
2124 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002126 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002127}
2128
2129static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002130Pickle_clear_memo(Picklerobject *self, PyObject *args)
2131{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002132 if (self->memo)
2133 PyDict_Clear(self->memo);
2134 Py_INCREF(Py_None);
2135 return Py_None;
2136}
2137
2138static PyObject *
2139Pickle_getvalue(Picklerobject *self, PyObject *args)
2140{
2141 int l, i, rsize, ssize, clear=1, lm;
2142 long ik;
2143 PyObject *k, *r;
2144 char *s, *p, *have_get;
2145 Pdata *data;
2146
2147 /* Can be called by Python code or C code */
2148 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2149 return NULL;
2150
2151 /* Check to make sure we are based on a list */
2152 if (! Pdata_Check(self->file)) {
2153 PyErr_SetString(PicklingError,
2154 "Attempt to getvalue() a non-list-based pickler");
2155 return NULL;
2156 }
2157
2158 /* flush write buffer */
2159 if (write_other(self, NULL, 0) < 0) return NULL;
2160
2161 data=(Pdata*)self->file;
2162 l=data->length;
2163
2164 /* set up an array to hold get/put status */
2165 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2166 lm++;
2167 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2168 memset(have_get,0,lm);
2169
2170 /* Scan for gets. */
2171 for (rsize=0, i=l; --i >= 0; ) {
2172 k=data->data[i];
2173
2174 if (PyString_Check(k)) {
2175 rsize += PyString_GET_SIZE(k);
2176 }
2177
2178 else if (PyInt_Check(k)) { /* put */
2179 ik=PyInt_AS_LONG((PyIntObject*)k);
2180 if (ik >= lm || ik==0) {
2181 PyErr_SetString(PicklingError,
2182 "Invalid get data");
2183 return NULL;
2184 }
2185 if (have_get[ik]) { /* with matching get */
2186 if (ik < 256) rsize += 2;
2187 else rsize+=5;
2188 }
2189 }
2190
2191 else if (! (PyTuple_Check(k) &&
2192 PyTuple_GET_SIZE(k) == 2 &&
2193 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2194 ) {
2195 PyErr_SetString(PicklingError,
2196 "Unexpected data in internal list");
2197 return NULL;
2198 }
2199
2200 else { /* put */
2201 ik=PyInt_AS_LONG((PyIntObject*)k);
2202 if (ik >= lm || ik==0) {
2203 PyErr_SetString(PicklingError,
2204 "Invalid get data");
2205 return NULL;
2206 }
2207 have_get[ik]=1;
2208 if (ik < 256) rsize += 2;
2209 else rsize+=5;
2210 }
2211
2212 }
2213
2214 /* Now generate the result */
2215 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2216 s=PyString_AS_STRING((PyStringObject*)r);
2217
2218 for (i=0; i<l; i++) {
2219 k=data->data[i];
2220
2221 if (PyString_Check(k)) {
2222 ssize=PyString_GET_SIZE(k);
2223 if (ssize) {
2224 p=PyString_AS_STRING((PyStringObject*)k);
2225 while (--ssize >= 0) *s++=*p++;
2226 }
2227 }
2228
2229 else if (PyTuple_Check(k)) { /* get */
2230 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2231 if (ik < 256) {
2232 *s++ = BINGET;
2233 *s++ = (int)(ik & 0xff);
2234 }
2235 else {
2236 *s++ = LONG_BINGET;
2237 *s++ = (int)(ik & 0xff);
2238 *s++ = (int)((ik >> 8) & 0xff);
2239 *s++ = (int)((ik >> 16) & 0xff);
2240 *s++ = (int)((ik >> 24) & 0xff);
2241 }
2242 }
2243
2244 else { /* put */
2245 ik=PyInt_AS_LONG((PyIntObject*)k);
2246
2247 if (have_get[ik]) { /* with matching get */
2248 if (ik < 256) {
2249 *s++ = BINPUT;
2250 *s++ = (int)(ik & 0xff);
2251 }
2252 else {
2253 *s++ = LONG_BINPUT;
2254 *s++ = (int)(ik & 0xff);
2255 *s++ = (int)((ik >> 8) & 0xff);
2256 *s++ = (int)((ik >> 16) & 0xff);
2257 *s++ = (int)((ik >> 24) & 0xff);
2258 }
2259 }
2260 }
2261
2262 }
2263
2264 if (clear) {
2265 PyDict_Clear(self->memo);
2266 Pdata_clear(data,0);
2267 }
2268
2269 free(have_get);
2270 return r;
2271 err:
2272 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002273 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002274}
2275
2276static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002277Pickler_dump(Picklerobject *self, PyObject *args)
2278{
2279 PyObject *ob;
2280 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002282 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
2283 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002285 if (dump(self, ob) < 0)
2286 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002288 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002290 /* XXX Why does dump() return self? */
2291 Py_INCREF(self);
2292 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002293}
2294
2295
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002296static struct PyMethodDef Pickler_methods[] =
2297{
Neal Norwitzb0493252002-03-31 14:44:22 +00002298 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002299 PyDoc_STR("dump(object) -- "
2300 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002301 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002302 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002303 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002304 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002305 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002306};
2307
2308
2309static Picklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002310newPicklerobject(PyObject *file, int bin)
2311{
2312 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002314 if (!( self = PyObject_New(Picklerobject, &Picklertype)))
2315 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002317 self->fp = NULL;
2318 self->write = NULL;
2319 self->memo = NULL;
2320 self->arg = NULL;
2321 self->pers_func = NULL;
2322 self->inst_pers_func = NULL;
2323 self->write_buf = NULL;
2324 self->bin = bin;
2325 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002326 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002327 self->fast_container = 0;
2328 self->fast_memo = NULL;
2329 self->buf_size = 0;
2330 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002332 if (file)
2333 Py_INCREF(file);
2334 else
2335 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002337 if (!( self->file = file ))
2338 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002340 if (!( self->memo = PyDict_New()))
2341 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002343 if (PyFile_Check(file)) {
2344 self->fp = PyFile_AsFile(file);
2345 if (self->fp == NULL) {
2346 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2347 goto err;
2348 }
2349 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002350 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002351 else if (PycStringIO_OutputCheck(file)) {
2352 self->write_func = write_cStringIO;
2353 }
2354 else if (file == Py_None) {
2355 self->write_func = write_none;
2356 }
2357 else {
2358 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002359
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002360 if (! Pdata_Check(file)) {
2361 self->write = PyObject_GetAttr(file, write_str);
2362 if (!self->write) {
2363 PyErr_Clear();
2364 PyErr_SetString(PyExc_TypeError,
2365 "argument must have 'write' "
2366 "attribute");
2367 goto err;
2368 }
2369 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002371 if (!( self->write_buf =
2372 (char *)malloc(WRITE_BUF_SIZE * sizeof(char)))) {
2373 PyErr_NoMemory();
2374 goto err;
2375 }
2376 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002377
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002378 if (PyEval_GetRestricted()) {
2379 /* Restricted execution, get private tables */
2380 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002382 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2383 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2384 Py_DECREF(m);
2385 if (!( self->dispatch_table )) goto err;
2386 }
2387 else {
2388 self->dispatch_table=dispatch_table;
2389 Py_INCREF(dispatch_table);
2390 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002392 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002394 err:
2395 Py_DECREF((PyObject *)self);
2396 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002397}
2398
2399
2400static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002401get_Pickler(PyObject *self, PyObject *args)
2402{
2403 PyObject *file = NULL;
2404 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002406 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
2407 PyErr_Clear();
2408 bin = 0;
2409 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2410 return NULL;
2411 }
2412 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002413}
2414
2415
2416static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002417Pickler_dealloc(Picklerobject *self)
2418{
2419 Py_XDECREF(self->write);
2420 Py_XDECREF(self->memo);
2421 Py_XDECREF(self->fast_memo);
2422 Py_XDECREF(self->arg);
2423 Py_XDECREF(self->file);
2424 Py_XDECREF(self->pers_func);
2425 Py_XDECREF(self->inst_pers_func);
2426 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002428 if (self->write_buf) {
2429 free(self->write_buf);
2430 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002432 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002433}
2434
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002435static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002436Pickler_get_pers_func(Picklerobject *p)
2437{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002438 if (p->pers_func == NULL)
2439 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2440 else
2441 Py_INCREF(p->pers_func);
2442 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002443}
2444
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002445static int
2446Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2447{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002448 if (v == NULL) {
2449 PyErr_SetString(PyExc_TypeError,
2450 "attribute deletion is not supported");
2451 return -1;
2452 }
2453 Py_XDECREF(p->pers_func);
2454 Py_INCREF(v);
2455 p->pers_func = v;
2456 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002457}
2458
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002459static int
2460Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2461{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002462 if (v == NULL) {
2463 PyErr_SetString(PyExc_TypeError,
2464 "attribute deletion is not supported");
2465 return -1;
2466 }
2467 Py_XDECREF(p->inst_pers_func);
2468 Py_INCREF(v);
2469 p->inst_pers_func = v;
2470 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002471}
2472
2473static PyObject *
2474Pickler_get_memo(Picklerobject *p)
2475{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002476 if (p->memo == NULL)
2477 PyErr_SetString(PyExc_AttributeError, "memo");
2478 else
2479 Py_INCREF(p->memo);
2480 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002481}
2482
2483static int
2484Pickler_set_memo(Picklerobject *p, PyObject *v)
2485{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002486 if (v == NULL) {
2487 PyErr_SetString(PyExc_TypeError,
2488 "attribute deletion is not supported");
2489 return -1;
2490 }
2491 if (!PyDict_Check(v)) {
2492 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2493 return -1;
2494 }
2495 Py_XDECREF(p->memo);
2496 Py_INCREF(v);
2497 p->memo = v;
2498 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002499}
2500
2501static PyObject *
2502Pickler_get_error(Picklerobject *p)
2503{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002504 /* why is this an attribute on the Pickler? */
2505 Py_INCREF(PicklingError);
2506 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002507}
2508
2509static PyMemberDef Pickler_members[] = {
2510 {"binary", T_INT, offsetof(Picklerobject, bin)},
2511 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002512 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002513};
2514
2515static PyGetSetDef Pickler_getsets[] = {
2516 {"persistent_id", (getter)Pickler_get_pers_func,
2517 (setter)Pickler_set_pers_func},
2518 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2519 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002520 {"PicklingError", (getter)Pickler_get_error, NULL},
2521 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002522};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002523
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002524PyDoc_STRVAR(Picklertype__doc__,
2525"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002526
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002527static PyTypeObject Picklertype = {
2528 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002529 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002530 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002531 sizeof(Picklerobject), /*tp_basicsize*/
2532 0,
2533 (destructor)Pickler_dealloc, /* tp_dealloc */
2534 0, /* tp_print */
2535 0, /* tp_getattr */
2536 0, /* tp_setattr */
2537 0, /* tp_compare */
2538 0, /* tp_repr */
2539 0, /* tp_as_number */
2540 0, /* tp_as_sequence */
2541 0, /* tp_as_mapping */
2542 0, /* tp_hash */
2543 0, /* tp_call */
2544 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002545 0, /* set below */ /* tp_getattro */
2546 0, /* set below */ /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002547 0, /* tp_as_buffer */
2548 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2549 Picklertype__doc__, /* tp_doc */
2550 0, /* tp_traverse */
2551 0, /* tp_clear */
2552 0, /* tp_richcompare */
2553 0, /* tp_weaklistoffset */
2554 0, /* tp_iter */
2555 0, /* tp_iternext */
2556 Pickler_methods, /* tp_methods */
2557 Pickler_members, /* tp_members */
2558 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002559};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002560
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002561static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002562find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
2563{
2564 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002566 if (fc) {
2567 if (fc==Py_None) {
2568 PyErr_SetString(UnpicklingError,
2569 "Global and instance pickles are not supported.");
2570 return NULL;
2571 }
2572 return PyObject_CallFunction(fc, "OO", py_module_name,
2573 py_global_name);
2574 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002576 module = PySys_GetObject("modules");
2577 if (module == NULL)
2578 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002580 module = PyDict_GetItem(module, py_module_name);
2581 if (module == NULL) {
2582 module = PyImport_Import(py_module_name);
2583 if (!module)
2584 return NULL;
2585 global = PyObject_GetAttr(module, py_global_name);
2586 Py_DECREF(module);
2587 }
2588 else
2589 global = PyObject_GetAttr(module, py_global_name);
2590 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002591}
2592
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002593static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002594marker(Unpicklerobject *self)
2595{
2596 if (self->num_marks < 1) {
2597 PyErr_SetString(UnpicklingError, "could not find MARK");
2598 return -1;
2599 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002601 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002602}
2603
Tim Peters84e87f32001-03-17 04:50:51 +00002604
Guido van Rossum60456fd1997-04-09 17:36:32 +00002605static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002606load_none(Unpicklerobject *self)
2607{
2608 PDATA_APPEND(self->stack, Py_None, -1);
2609 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002610}
2611
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002612static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002613bad_readline(void)
2614{
2615 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2616 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002617}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002618
2619static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002620load_int(Unpicklerobject *self)
2621{
2622 PyObject *py_int = 0;
2623 char *endptr, *s;
2624 int len, res = -1;
2625 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002627 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2628 if (len < 2) return bad_readline();
2629 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002631 errno = 0;
2632 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002634 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2635 /* Hm, maybe we've got something long. Let's try reading
2636 it as a Python long object. */
2637 errno = 0;
2638 py_int = PyLong_FromString(s, NULL, 0);
2639 if (py_int == NULL) {
2640 PyErr_SetString(PyExc_ValueError,
2641 "could not convert string to int");
2642 goto finally;
2643 }
2644 }
2645 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002646 if (len == 3 && (l == 0 || l == 1)) {
2647 if (!( py_int = PyBool_FromLong(l))) goto finally;
2648 }
2649 else {
2650 if (!( py_int = PyInt_FromLong(l))) goto finally;
2651 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002652 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002654 free(s);
2655 PDATA_PUSH(self->stack, py_int, -1);
2656 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002658 finally:
2659 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002661 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002662}
2663
2664
Tim Peters84e87f32001-03-17 04:50:51 +00002665static long
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002666calc_binint(char *s, int x)
2667{
2668 unsigned char c;
2669 int i;
2670 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002672 for (i = 0, l = 0L; i < x; i++) {
2673 c = (unsigned char)s[i];
2674 l |= (long)c << (i * 8);
2675 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002676#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002677 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2678 * is signed, so on a box with longs bigger than 4 bytes we need
2679 * to extend a BININT's sign bit to the full width.
2680 */
2681 if (x == 4 && l & (1L << 31))
2682 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002683#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002684 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002685}
2686
2687
2688static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002689load_binintx(Unpicklerobject *self, char *s, int x)
2690{
2691 PyObject *py_int = 0;
2692 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002694 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002696 if (!( py_int = PyInt_FromLong(l)))
2697 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002699 PDATA_PUSH(self->stack, py_int, -1);
2700 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002701}
2702
2703
2704static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002705load_binint(Unpicklerobject *self)
2706{
2707 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002709 if ((*self->read_func)(self, &s, 4) < 0)
2710 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002712 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002713}
2714
2715
2716static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002717load_binint1(Unpicklerobject *self)
2718{
2719 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002721 if ((*self->read_func)(self, &s, 1) < 0)
2722 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002724 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002725}
2726
2727
2728static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002729load_binint2(Unpicklerobject *self)
2730{
2731 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002733 if ((*self->read_func)(self, &s, 2) < 0)
2734 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002736 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002737}
Tim Peters84e87f32001-03-17 04:50:51 +00002738
Guido van Rossum60456fd1997-04-09 17:36:32 +00002739static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002740load_long(Unpicklerobject *self)
2741{
2742 PyObject *l = 0;
2743 char *end, *s;
2744 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002746 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2747 if (len < 2) return bad_readline();
2748 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002750 if (!( l = PyLong_FromString(s, &end, 0)))
2751 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002753 free(s);
2754 PDATA_PUSH(self->stack, l, -1);
2755 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002757 finally:
2758 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002760 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002761}
2762
Tim Peters84e87f32001-03-17 04:50:51 +00002763
Guido van Rossum60456fd1997-04-09 17:36:32 +00002764static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002765load_float(Unpicklerobject *self)
2766{
2767 PyObject *py_float = 0;
2768 char *endptr, *s;
2769 int len, res = -1;
2770 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002772 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2773 if (len < 2) return bad_readline();
2774 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002776 errno = 0;
2777 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002779 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2780 PyErr_SetString(PyExc_ValueError,
2781 "could not convert string to float");
2782 goto finally;
2783 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002785 if (!( py_float = PyFloat_FromDouble(d)))
2786 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002788 free(s);
2789 PDATA_PUSH(self->stack, py_float, -1);
2790 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002792 finally:
2793 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002795 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002796}
2797
Guido van Rossum60456fd1997-04-09 17:36:32 +00002798static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002799load_binfloat(Unpicklerobject *self)
2800{
2801 PyObject *py_float = 0;
2802 int s, e;
2803 long fhi, flo;
2804 double x;
2805 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002807 if ((*self->read_func)(self, &p, 8) < 0)
2808 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002810 /* First byte */
2811 s = (*p>>7) & 1;
2812 e = (*p & 0x7F) << 4;
2813 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002815 /* Second byte */
2816 e |= (*p>>4) & 0xF;
2817 fhi = (*p & 0xF) << 24;
2818 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002820 /* Third byte */
2821 fhi |= (*p & 0xFF) << 16;
2822 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002824 /* Fourth byte */
2825 fhi |= (*p & 0xFF) << 8;
2826 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002828 /* Fifth byte */
2829 fhi |= *p & 0xFF;
2830 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002832 /* Sixth byte */
2833 flo = (*p & 0xFF) << 16;
2834 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002836 /* Seventh byte */
2837 flo |= (*p & 0xFF) << 8;
2838 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002840 /* Eighth byte */
2841 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002843 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2844 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002846 /* XXX This sadly ignores Inf/NaN */
2847 if (e == 0)
2848 e = -1022;
2849 else {
2850 x += 1.0;
2851 e -= 1023;
2852 }
2853 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002855 if (s)
2856 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002858 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002860 PDATA_PUSH(self->stack, py_float, -1);
2861 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002862}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002863
2864static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002865load_string(Unpicklerobject *self)
2866{
2867 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002868 int len, res = -1;
2869 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002871 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2872 if (len < 2) return bad_readline();
2873 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002874
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002875
2876 /* Strip outermost quotes */
2877 while (s[len-1] <= ' ')
2878 len--;
2879 if(s[0]=='"' && s[len-1]=='"'){
2880 s[len-1] = '\0';
2881 p = s + 1 ;
2882 len -= 2;
2883 } else if(s[0]=='\'' && s[len-1]=='\''){
2884 s[len-1] = '\0';
2885 p = s + 1 ;
2886 len -= 2;
2887 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002888 goto insecure;
2889 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002890
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002891 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
2892 if (str) {
2893 PDATA_PUSH(self->stack, str, -1);
2894 res = 0;
2895 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002896 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002897 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002898
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002899 insecure:
2900 free(s);
2901 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2902 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002903}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002904
2905
2906static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002907load_binstring(Unpicklerobject *self)
2908{
2909 PyObject *py_string = 0;
2910 long l;
2911 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002912
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002913 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002915 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002916
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002917 if ((*self->read_func)(self, &s, l) < 0)
2918 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002919
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002920 if (!( py_string = PyString_FromStringAndSize(s, l)))
2921 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002922
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002923 PDATA_PUSH(self->stack, py_string, -1);
2924 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002925}
2926
2927
2928static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002929load_short_binstring(Unpicklerobject *self)
2930{
2931 PyObject *py_string = 0;
2932 unsigned char l;
2933 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002935 if ((*self->read_func)(self, &s, 1) < 0)
2936 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002938 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002940 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002942 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002944 PDATA_PUSH(self->stack, py_string, -1);
2945 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002946}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002947
2948
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002949#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002950static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002951load_unicode(Unpicklerobject *self)
2952{
2953 PyObject *str = 0;
2954 int len, res = -1;
2955 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002957 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2958 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002960 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
2961 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002963 PDATA_PUSH(self->stack, str, -1);
2964 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002966 finally:
2967 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002968}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002969#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002970
2971
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002972#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002973static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002974load_binunicode(Unpicklerobject *self)
2975{
2976 PyObject *unicode;
2977 long l;
2978 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002980 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002982 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002984 if ((*self->read_func)(self, &s, l) < 0)
2985 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002987 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
2988 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002990 PDATA_PUSH(self->stack, unicode, -1);
2991 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002992}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002993#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002994
2995
2996static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002997load_tuple(Unpicklerobject *self)
2998{
2999 PyObject *tup;
3000 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003002 if ((i = marker(self)) < 0) return -1;
3003 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3004 PDATA_PUSH(self->stack, tup, -1);
3005 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003006}
3007
3008static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003009load_empty_tuple(Unpicklerobject *self)
3010{
3011 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003012
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003013 if (!( tup=PyTuple_New(0))) return -1;
3014 PDATA_PUSH(self->stack, tup, -1);
3015 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003016}
3017
3018static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003019load_empty_list(Unpicklerobject *self)
3020{
3021 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003023 if (!( list=PyList_New(0))) return -1;
3024 PDATA_PUSH(self->stack, list, -1);
3025 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003026}
3027
3028static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003029load_empty_dict(Unpicklerobject *self)
3030{
3031 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003033 if (!( dict=PyDict_New())) return -1;
3034 PDATA_PUSH(self->stack, dict, -1);
3035 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003036}
3037
3038
3039static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003040load_list(Unpicklerobject *self)
3041{
3042 PyObject *list = 0;
3043 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003045 if ((i = marker(self)) < 0) return -1;
3046 if (!( list=Pdata_popList(self->stack, i))) return -1;
3047 PDATA_PUSH(self->stack, list, -1);
3048 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003049}
3050
3051static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003052load_dict(Unpicklerobject *self)
3053{
3054 PyObject *dict, *key, *value;
3055 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003057 if ((i = marker(self)) < 0) return -1;
3058 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003060 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003062 for (k = i+1; k < j; k += 2) {
3063 key =self->stack->data[k-1];
3064 value=self->stack->data[k ];
3065 if (PyDict_SetItem(dict, key, value) < 0) {
3066 Py_DECREF(dict);
3067 return -1;
3068 }
3069 }
3070 Pdata_clear(self->stack, i);
3071 PDATA_PUSH(self->stack, dict, -1);
3072 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003073}
3074
3075static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003076Instance_New(PyObject *cls, PyObject *args)
3077{
3078 int has_key;
3079 PyObject *safe=0, *r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003081 if (PyClass_Check(cls)) {
3082 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003084 if ((l=PyObject_Size(args)) < 0) goto err;
3085 if (!( l )) {
3086 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003088 __getinitargs__ = PyObject_GetAttr(cls,
3089 __getinitargs___str);
3090 if (!__getinitargs__) {
3091 /* We have a class with no __getinitargs__,
3092 so bypass usual construction */
3093 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003095 PyErr_Clear();
3096 if (!( inst=PyInstance_NewRaw(cls, NULL)))
3097 goto err;
3098 return inst;
3099 }
3100 Py_DECREF(__getinitargs__);
3101 }
Tim Peters84e87f32001-03-17 04:50:51 +00003102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003103 if ((r=PyInstance_New(cls, args, NULL))) return r;
3104 else goto err;
3105 }
Tim Peters84e87f32001-03-17 04:50:51 +00003106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003107 /* Is safe_constructors always a dict? */
3108 has_key = cPickle_PyMapping_HasKey(safe_constructors, cls);
3109 if (!has_key) {
3110 safe = PyObject_GetAttr(cls, __safe_for_unpickling___str);
3111 if (!safe ||
3112 !PyObject_IsTrue(safe)) {
3113 cPickle_ErrFormat(UnpicklingError,
3114 "%s is not safe for unpickling",
3115 "O", cls);
3116 Py_XDECREF(safe);
3117 return NULL;
3118 }
Tim Peters4e52ca82002-12-07 02:43:28 +00003119 Py_DECREF(safe);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003120 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003122 if (args==Py_None) {
3123 /* Special case, call cls.__basicnew__() */
3124 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003126 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3127 if (!basicnew) return NULL;
3128 r=PyObject_CallObject(basicnew, NULL);
3129 Py_DECREF(basicnew);
3130 if (r) return r;
3131 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003133 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003135 err:
3136 {
3137 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003139 PyErr_Fetch(&tp, &v, &tb);
3140 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3141 Py_XDECREF(v);
3142 v=r;
3143 }
3144 PyErr_Restore(tp,v,tb);
3145 }
3146 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003147}
Tim Peters84e87f32001-03-17 04:50:51 +00003148
Guido van Rossum60456fd1997-04-09 17:36:32 +00003149
3150static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003151load_obj(Unpicklerobject *self)
3152{
3153 PyObject *class, *tup, *obj=0;
3154 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003156 if ((i = marker(self)) < 0) return -1;
3157 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3158 PDATA_POP(self->stack, class);
3159 if (class) {
3160 obj = Instance_New(class, tup);
3161 Py_DECREF(class);
3162 }
3163 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003165 if (! obj) return -1;
3166 PDATA_PUSH(self->stack, obj, -1);
3167 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003168}
3169
3170
3171static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003172load_inst(Unpicklerobject *self)
3173{
3174 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3175 int i, len;
3176 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003178 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003180 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3181 if (len < 2) return bad_readline();
3182 module_name = PyString_FromStringAndSize(s, len - 1);
3183 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003185 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3186 if (len < 2) return bad_readline();
3187 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3188 class = find_class(module_name, class_name,
3189 self->find_class);
3190 Py_DECREF(class_name);
3191 }
3192 }
3193 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003195 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003197 if ((tup=Pdata_popTuple(self->stack, i))) {
3198 obj = Instance_New(class, tup);
3199 Py_DECREF(tup);
3200 }
3201 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003203 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003205 PDATA_PUSH(self->stack, obj, -1);
3206 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003207}
3208
3209
3210static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003211load_global(Unpicklerobject *self)
3212{
3213 PyObject *class = 0, *module_name = 0, *class_name = 0;
3214 int len;
3215 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003217 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3218 if (len < 2) return bad_readline();
3219 module_name = PyString_FromStringAndSize(s, len - 1);
3220 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003222 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003223 if (len < 2) {
3224 Py_DECREF(module_name);
3225 return bad_readline();
3226 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003227 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3228 class = find_class(module_name, class_name,
3229 self->find_class);
3230 Py_DECREF(class_name);
3231 }
3232 }
3233 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003235 if (! class) return -1;
3236 PDATA_PUSH(self->stack, class, -1);
3237 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003238}
3239
3240
3241static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003242load_persid(Unpicklerobject *self)
3243{
3244 PyObject *pid = 0;
3245 int len;
3246 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003248 if (self->pers_func) {
3249 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3250 if (len < 2) return bad_readline();
3251
3252 pid = PyString_FromStringAndSize(s, len - 1);
3253 if (!pid) return -1;
3254
3255 if (PyList_Check(self->pers_func)) {
3256 if (PyList_Append(self->pers_func, pid) < 0) {
3257 Py_DECREF(pid);
3258 return -1;
3259 }
3260 }
3261 else {
3262 ARG_TUP(self, pid);
3263 if (self->arg) {
3264 pid = PyObject_Call(self->pers_func, self->arg,
3265 NULL);
3266 FREE_ARG_TUP(self);
3267 }
3268 }
3269
3270 if (! pid) return -1;
3271
3272 PDATA_PUSH(self->stack, pid, -1);
3273 return 0;
3274 }
3275 else {
3276 PyErr_SetString(UnpicklingError,
3277 "A load persistent id instruction was encountered,\n"
3278 "but no persistent_load function was specified.");
3279 return -1;
3280 }
3281}
3282
3283static int
3284load_binpersid(Unpicklerobject *self)
3285{
3286 PyObject *pid = 0;
3287
3288 if (self->pers_func) {
3289 PDATA_POP(self->stack, pid);
3290 if (! pid) return -1;
3291
3292 if (PyList_Check(self->pers_func)) {
3293 if (PyList_Append(self->pers_func, pid) < 0) {
3294 Py_DECREF(pid);
3295 return -1;
3296 }
3297 }
3298 else {
3299 ARG_TUP(self, pid);
3300 if (self->arg) {
3301 pid = PyObject_Call(self->pers_func, self->arg,
3302 NULL);
3303 FREE_ARG_TUP(self);
3304 }
3305 if (! pid) return -1;
3306 }
3307
3308 PDATA_PUSH(self->stack, pid, -1);
3309 return 0;
3310 }
3311 else {
3312 PyErr_SetString(UnpicklingError,
3313 "A load persistent id instruction was encountered,\n"
3314 "but no persistent_load function was specified.");
3315 return -1;
3316 }
3317}
3318
3319
3320static int
3321load_pop(Unpicklerobject *self)
3322{
3323 int len;
3324
3325 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3326
3327 /* Note that we split the (pickle.py) stack into two stacks,
3328 an object stack and a mark stack. We have to be clever and
3329 pop the right one. We do this by looking at the top of the
3330 mark stack.
3331 */
3332
3333 if ((self->num_marks > 0) &&
3334 (self->marks[self->num_marks - 1] == len))
3335 self->num_marks--;
3336 else {
3337 len--;
3338 Py_DECREF(self->stack->data[len]);
3339 self->stack->length=len;
3340 }
3341
3342 return 0;
3343}
3344
3345
3346static int
3347load_pop_mark(Unpicklerobject *self)
3348{
3349 int i;
3350
3351 if ((i = marker(self)) < 0)
3352 return -1;
3353
3354 Pdata_clear(self->stack, i);
3355
3356 return 0;
3357}
3358
3359
3360static int
3361load_dup(Unpicklerobject *self)
3362{
3363 PyObject *last;
3364 int len;
3365
3366 if ((len = self->stack->length) <= 0) return stackUnderflow();
3367 last=self->stack->data[len-1];
3368 Py_INCREF(last);
3369 PDATA_PUSH(self->stack, last, -1);
3370 return 0;
3371}
3372
3373
3374static int
3375load_get(Unpicklerobject *self)
3376{
3377 PyObject *py_str = 0, *value = 0;
3378 int len;
3379 char *s;
3380 int rc;
3381
3382 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003383 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003385 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003387 value = PyDict_GetItem(self->memo, py_str);
3388 if (! value) {
3389 PyErr_SetObject(BadPickleGet, py_str);
3390 rc = -1;
3391 } else {
3392 PDATA_APPEND(self->stack, value, -1);
3393 rc = 0;
3394 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003396 Py_DECREF(py_str);
3397 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003398}
3399
3400
3401static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003402load_binget(Unpicklerobject *self)
3403{
3404 PyObject *py_key = 0, *value = 0;
3405 unsigned char key;
3406 char *s;
3407 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003409 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003411 key = (unsigned char)s[0];
3412 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003413
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003414 value = PyDict_GetItem(self->memo, py_key);
3415 if (! value) {
3416 PyErr_SetObject(BadPickleGet, py_key);
3417 rc = -1;
3418 } else {
3419 PDATA_APPEND(self->stack, value, -1);
3420 rc = 0;
3421 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003423 Py_DECREF(py_key);
3424 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003425}
3426
3427
3428static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003429load_long_binget(Unpicklerobject *self)
3430{
3431 PyObject *py_key = 0, *value = 0;
3432 unsigned char c;
3433 char *s;
3434 long key;
3435 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003437 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003439 c = (unsigned char)s[0];
3440 key = (long)c;
3441 c = (unsigned char)s[1];
3442 key |= (long)c << 8;
3443 c = (unsigned char)s[2];
3444 key |= (long)c << 16;
3445 c = (unsigned char)s[3];
3446 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003448 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3449
3450 value = PyDict_GetItem(self->memo, py_key);
3451 if (! value) {
3452 PyErr_SetObject(BadPickleGet, py_key);
3453 rc = -1;
3454 } else {
3455 PDATA_APPEND(self->stack, value, -1);
3456 rc = 0;
3457 }
3458
3459 Py_DECREF(py_key);
3460 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003461}
3462
3463
3464static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003465load_put(Unpicklerobject *self)
3466{
3467 PyObject *py_str = 0, *value = 0;
3468 int len, l;
3469 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003471 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3472 if (l < 2) return bad_readline();
3473 if (!( len=self->stack->length )) return stackUnderflow();
3474 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3475 value=self->stack->data[len-1];
3476 l=PyDict_SetItem(self->memo, py_str, value);
3477 Py_DECREF(py_str);
3478 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003479}
3480
3481
3482static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003483load_binput(Unpicklerobject *self)
3484{
3485 PyObject *py_key = 0, *value = 0;
3486 unsigned char key;
3487 char *s;
3488 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003490 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3491 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003493 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003495 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3496 value=self->stack->data[len-1];
3497 len=PyDict_SetItem(self->memo, py_key, value);
3498 Py_DECREF(py_key);
3499 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003500}
3501
3502
3503static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003504load_long_binput(Unpicklerobject *self)
3505{
3506 PyObject *py_key = 0, *value = 0;
3507 long key;
3508 unsigned char c;
3509 char *s;
3510 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003512 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3513 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003515 c = (unsigned char)s[0];
3516 key = (long)c;
3517 c = (unsigned char)s[1];
3518 key |= (long)c << 8;
3519 c = (unsigned char)s[2];
3520 key |= (long)c << 16;
3521 c = (unsigned char)s[3];
3522 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003524 if (!( py_key = PyInt_FromLong(key))) return -1;
3525 value=self->stack->data[len-1];
3526 len=PyDict_SetItem(self->memo, py_key, value);
3527 Py_DECREF(py_key);
3528 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003529}
3530
3531
3532static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003533do_append(Unpicklerobject *self, int x)
3534{
3535 PyObject *value = 0, *list = 0, *append_method = 0;
3536 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003538 len=self->stack->length;
3539 if (!( len >= x && x > 0 )) return stackUnderflow();
3540 /* nothing to do */
3541 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003543 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003545 if (PyList_Check(list)) {
3546 PyObject *slice;
3547 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003549 slice=Pdata_popList(self->stack, x);
3550 list_len = PyList_GET_SIZE(list);
3551 i=PyList_SetSlice(list, list_len, list_len, slice);
3552 Py_DECREF(slice);
3553 return i;
3554 }
3555 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003557 if (!( append_method = PyObject_GetAttr(list, append_str)))
3558 return -1;
3559
3560 for (i = x; i < len; i++) {
3561 PyObject *junk;
3562
3563 value=self->stack->data[i];
3564 junk=0;
3565 ARG_TUP(self, value);
3566 if (self->arg) {
3567 junk = PyObject_Call(append_method, self->arg,
3568 NULL);
3569 FREE_ARG_TUP(self);
3570 }
3571 if (! junk) {
3572 Pdata_clear(self->stack, i+1);
3573 self->stack->length=x;
3574 Py_DECREF(append_method);
3575 return -1;
3576 }
3577 Py_DECREF(junk);
3578 }
3579 self->stack->length=x;
3580 Py_DECREF(append_method);
3581 }
3582
3583 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003584}
3585
3586
3587static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003588load_append(Unpicklerobject *self)
3589{
3590 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003591}
3592
3593
3594static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003595load_appends(Unpicklerobject *self)
3596{
3597 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003598}
3599
3600
3601static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003602do_setitems(Unpicklerobject *self, int x)
3603{
3604 PyObject *value = 0, *key = 0, *dict = 0;
3605 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003607 if (!( (len=self->stack->length) >= x
3608 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003610 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003612 for (i = x+1; i < len; i += 2) {
3613 key =self->stack->data[i-1];
3614 value=self->stack->data[i ];
3615 if (PyObject_SetItem(dict, key, value) < 0) {
3616 r=-1;
3617 break;
3618 }
3619 }
3620
3621 Pdata_clear(self->stack, x);
3622
3623 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003624}
3625
3626
Tim Peters84e87f32001-03-17 04:50:51 +00003627static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003628load_setitem(Unpicklerobject *self)
3629{
3630 return do_setitems(self, self->stack->length - 2);
3631}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003633static int
3634load_setitems(Unpicklerobject *self)
3635{
3636 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003637}
3638
Tim Peters84e87f32001-03-17 04:50:51 +00003639
Guido van Rossum60456fd1997-04-09 17:36:32 +00003640static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003641load_build(Unpicklerobject *self)
3642{
3643 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3644 *junk = 0, *__setstate__ = 0;
3645 int i, r = 0;
3646
3647 if (self->stack->length < 2) return stackUnderflow();
3648 PDATA_POP(self->stack, value);
3649 if (! value) return -1;
3650 inst=self->stack->data[self->stack->length-1];
3651
3652 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3653 ARG_TUP(self, value);
3654 if (self->arg) {
3655 junk = PyObject_Call(__setstate__, self->arg, NULL);
3656 FREE_ARG_TUP(self);
3657 }
3658 Py_DECREF(__setstate__);
3659 if (! junk) return -1;
3660 Py_DECREF(junk);
3661 return 0;
3662 }
3663
3664 PyErr_Clear();
3665 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3666 i = 0;
3667 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3668 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3669 r=-1;
3670 break;
3671 }
3672 }
3673 Py_DECREF(instdict);
3674 }
3675 else r=-1;
3676
3677 Py_XDECREF(value);
3678
3679 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003680}
3681
3682
3683static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003684load_mark(Unpicklerobject *self)
3685{
3686 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003687
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003688 /* Note that we split the (pickle.py) stack into two stacks, an
3689 object stack and a mark stack. Here we push a mark onto the
3690 mark stack.
3691 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003693 if ((self->num_marks + 1) >= self->marks_size) {
3694 s=self->marks_size+20;
3695 if (s <= self->num_marks) s=self->num_marks + 1;
3696 if (self->marks == NULL)
3697 self->marks=(int *)malloc(s * sizeof(int));
3698 else
3699 self->marks=(int *)realloc(self->marks,
3700 s * sizeof(int));
3701 if (! self->marks) {
3702 PyErr_NoMemory();
3703 return -1;
3704 }
3705 self->marks_size = s;
3706 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003708 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003710 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003711}
3712
Guido van Rossum60456fd1997-04-09 17:36:32 +00003713static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003714load_reduce(Unpicklerobject *self)
3715{
3716 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003718 PDATA_POP(self->stack, arg_tup);
3719 if (! arg_tup) return -1;
3720 PDATA_POP(self->stack, callable);
3721 if (callable) {
3722 ob = Instance_New(callable, arg_tup);
3723 Py_DECREF(callable);
3724 }
3725 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003727 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003728
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003729 PDATA_PUSH(self->stack, ob, -1);
3730 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003731}
Tim Peters84e87f32001-03-17 04:50:51 +00003732
Guido van Rossum60456fd1997-04-09 17:36:32 +00003733static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003734load(Unpicklerobject *self)
3735{
3736 PyObject *err = 0, *val = 0;
3737 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003739 self->num_marks = 0;
3740 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003742 while (1) {
3743 if ((*self->read_func)(self, &s, 1) < 0)
3744 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003746 switch (s[0]) {
3747 case NONE:
3748 if (load_none(self) < 0)
3749 break;
3750 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003752 case BININT:
3753 if (load_binint(self) < 0)
3754 break;
3755 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003757 case BININT1:
3758 if (load_binint1(self) < 0)
3759 break;
3760 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762 case BININT2:
3763 if (load_binint2(self) < 0)
3764 break;
3765 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003767 case INT:
3768 if (load_int(self) < 0)
3769 break;
3770 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003772 case LONG:
3773 if (load_long(self) < 0)
3774 break;
3775 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003777 case FLOAT:
3778 if (load_float(self) < 0)
3779 break;
3780 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003782 case BINFLOAT:
3783 if (load_binfloat(self) < 0)
3784 break;
3785 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003787 case BINSTRING:
3788 if (load_binstring(self) < 0)
3789 break;
3790 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003792 case SHORT_BINSTRING:
3793 if (load_short_binstring(self) < 0)
3794 break;
3795 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003797 case STRING:
3798 if (load_string(self) < 0)
3799 break;
3800 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003801
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003802#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003803 case UNICODE:
3804 if (load_unicode(self) < 0)
3805 break;
3806 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003808 case BINUNICODE:
3809 if (load_binunicode(self) < 0)
3810 break;
3811 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003812#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003814 case EMPTY_TUPLE:
3815 if (load_empty_tuple(self) < 0)
3816 break;
3817 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003819 case TUPLE:
3820 if (load_tuple(self) < 0)
3821 break;
3822 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003824 case EMPTY_LIST:
3825 if (load_empty_list(self) < 0)
3826 break;
3827 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003829 case LIST:
3830 if (load_list(self) < 0)
3831 break;
3832 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003834 case EMPTY_DICT:
3835 if (load_empty_dict(self) < 0)
3836 break;
3837 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003839 case DICT:
3840 if (load_dict(self) < 0)
3841 break;
3842 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003844 case OBJ:
3845 if (load_obj(self) < 0)
3846 break;
3847 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003849 case INST:
3850 if (load_inst(self) < 0)
3851 break;
3852 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003854 case GLOBAL:
3855 if (load_global(self) < 0)
3856 break;
3857 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003859 case APPEND:
3860 if (load_append(self) < 0)
3861 break;
3862 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003864 case APPENDS:
3865 if (load_appends(self) < 0)
3866 break;
3867 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003869 case BUILD:
3870 if (load_build(self) < 0)
3871 break;
3872 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003874 case DUP:
3875 if (load_dup(self) < 0)
3876 break;
3877 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003879 case BINGET:
3880 if (load_binget(self) < 0)
3881 break;
3882 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003884 case LONG_BINGET:
3885 if (load_long_binget(self) < 0)
3886 break;
3887 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003889 case GET:
3890 if (load_get(self) < 0)
3891 break;
3892 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003894 case MARK:
3895 if (load_mark(self) < 0)
3896 break;
3897 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003898
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003899 case BINPUT:
3900 if (load_binput(self) < 0)
3901 break;
3902 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003904 case LONG_BINPUT:
3905 if (load_long_binput(self) < 0)
3906 break;
3907 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003908
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003909 case PUT:
3910 if (load_put(self) < 0)
3911 break;
3912 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003914 case POP:
3915 if (load_pop(self) < 0)
3916 break;
3917 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003919 case POP_MARK:
3920 if (load_pop_mark(self) < 0)
3921 break;
3922 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003924 case SETITEM:
3925 if (load_setitem(self) < 0)
3926 break;
3927 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003929 case SETITEMS:
3930 if (load_setitems(self) < 0)
3931 break;
3932 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003934 case STOP:
3935 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003937 case PERSID:
3938 if (load_persid(self) < 0)
3939 break;
3940 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003942 case BINPERSID:
3943 if (load_binpersid(self) < 0)
3944 break;
3945 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003947 case REDUCE:
3948 if (load_reduce(self) < 0)
3949 break;
3950 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003952 case '\0':
3953 /* end of file */
3954 PyErr_SetNone(PyExc_EOFError);
3955 break;
Neil Schemenauerfa79c652002-03-22 23:02:53 +00003956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003957 default:
3958 cPickle_ErrFormat(UnpicklingError,
3959 "invalid load key, '%s'.",
3960 "c", s[0]);
3961 return NULL;
3962 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003964 break;
3965 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003967 if ((err = PyErr_Occurred())) {
3968 if (err == PyExc_EOFError) {
3969 PyErr_SetNone(PyExc_EOFError);
3970 }
3971 return NULL;
3972 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003973
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003974 PDATA_POP(self->stack, val);
3975 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003976}
Tim Peters84e87f32001-03-17 04:50:51 +00003977
Guido van Rossum60456fd1997-04-09 17:36:32 +00003978
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003979/* No-load functions to support noload, which is used to
3980 find persistent references. */
3981
3982static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003983noload_obj(Unpicklerobject *self)
3984{
3985 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003987 if ((i = marker(self)) < 0) return -1;
3988 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003989}
3990
3991
3992static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003993noload_inst(Unpicklerobject *self)
3994{
3995 int i;
3996 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003998 if ((i = marker(self)) < 0) return -1;
3999 Pdata_clear(self->stack, i);
4000 if ((*self->readline_func)(self, &s) < 0) return -1;
4001 if ((*self->readline_func)(self, &s) < 0) return -1;
4002 PDATA_APPEND(self->stack, Py_None,-1);
4003 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004004}
4005
4006static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004007noload_global(Unpicklerobject *self)
4008{
4009 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004011 if ((*self->readline_func)(self, &s) < 0) return -1;
4012 if ((*self->readline_func)(self, &s) < 0) return -1;
4013 PDATA_APPEND(self->stack, Py_None,-1);
4014 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004015}
4016
4017static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004018noload_reduce(Unpicklerobject *self)
4019{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004021 if (self->stack->length < 2) return stackUnderflow();
4022 Pdata_clear(self->stack, self->stack->length-2);
4023 PDATA_APPEND(self->stack, Py_None,-1);
4024 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004025}
4026
4027static int
4028noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004029
Guido van Rossum053b8df1998-11-25 16:18:00 +00004030 if (self->stack->length < 1) return stackUnderflow();
4031 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004032 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004033}
4034
4035
4036static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004037noload(Unpicklerobject *self)
4038{
4039 PyObject *err = 0, *val = 0;
4040 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004042 self->num_marks = 0;
4043 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004045 while (1) {
4046 if ((*self->read_func)(self, &s, 1) < 0)
4047 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004049 switch (s[0]) {
4050 case NONE:
4051 if (load_none(self) < 0)
4052 break;
4053 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004055 case BININT:
4056 if (load_binint(self) < 0)
4057 break;
4058 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004060 case BININT1:
4061 if (load_binint1(self) < 0)
4062 break;
4063 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004065 case BININT2:
4066 if (load_binint2(self) < 0)
4067 break;
4068 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004070 case INT:
4071 if (load_int(self) < 0)
4072 break;
4073 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004075 case LONG:
4076 if (load_long(self) < 0)
4077 break;
4078 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004080 case FLOAT:
4081 if (load_float(self) < 0)
4082 break;
4083 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004085 case BINFLOAT:
4086 if (load_binfloat(self) < 0)
4087 break;
4088 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004089
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004090 case BINSTRING:
4091 if (load_binstring(self) < 0)
4092 break;
4093 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004095 case SHORT_BINSTRING:
4096 if (load_short_binstring(self) < 0)
4097 break;
4098 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004100 case STRING:
4101 if (load_string(self) < 0)
4102 break;
4103 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004104
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004105#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004106 case UNICODE:
4107 if (load_unicode(self) < 0)
4108 break;
4109 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004111 case BINUNICODE:
4112 if (load_binunicode(self) < 0)
4113 break;
4114 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004115#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004117 case EMPTY_TUPLE:
4118 if (load_empty_tuple(self) < 0)
4119 break;
4120 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004122 case TUPLE:
4123 if (load_tuple(self) < 0)
4124 break;
4125 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004127 case EMPTY_LIST:
4128 if (load_empty_list(self) < 0)
4129 break;
4130 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004132 case LIST:
4133 if (load_list(self) < 0)
4134 break;
4135 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004137 case EMPTY_DICT:
4138 if (load_empty_dict(self) < 0)
4139 break;
4140 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004142 case DICT:
4143 if (load_dict(self) < 0)
4144 break;
4145 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004147 case OBJ:
4148 if (noload_obj(self) < 0)
4149 break;
4150 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004152 case INST:
4153 if (noload_inst(self) < 0)
4154 break;
4155 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004157 case GLOBAL:
4158 if (noload_global(self) < 0)
4159 break;
4160 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004162 case APPEND:
4163 if (load_append(self) < 0)
4164 break;
4165 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004167 case APPENDS:
4168 if (load_appends(self) < 0)
4169 break;
4170 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004172 case BUILD:
4173 if (noload_build(self) < 0)
4174 break;
4175 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004177 case DUP:
4178 if (load_dup(self) < 0)
4179 break;
4180 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004182 case BINGET:
4183 if (load_binget(self) < 0)
4184 break;
4185 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004187 case LONG_BINGET:
4188 if (load_long_binget(self) < 0)
4189 break;
4190 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004192 case GET:
4193 if (load_get(self) < 0)
4194 break;
4195 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004197 case MARK:
4198 if (load_mark(self) < 0)
4199 break;
4200 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004202 case BINPUT:
4203 if (load_binput(self) < 0)
4204 break;
4205 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004207 case LONG_BINPUT:
4208 if (load_long_binput(self) < 0)
4209 break;
4210 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004212 case PUT:
4213 if (load_put(self) < 0)
4214 break;
4215 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004217 case POP:
4218 if (load_pop(self) < 0)
4219 break;
4220 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004222 case POP_MARK:
4223 if (load_pop_mark(self) < 0)
4224 break;
4225 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004226
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004227 case SETITEM:
4228 if (load_setitem(self) < 0)
4229 break;
4230 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004232 case SETITEMS:
4233 if (load_setitems(self) < 0)
4234 break;
4235 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004237 case STOP:
4238 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004240 case PERSID:
4241 if (load_persid(self) < 0)
4242 break;
4243 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004245 case BINPERSID:
4246 if (load_binpersid(self) < 0)
4247 break;
4248 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004250 case REDUCE:
4251 if (noload_reduce(self) < 0)
4252 break;
4253 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004255 default:
4256 cPickle_ErrFormat(UnpicklingError,
4257 "invalid load key, '%s'.",
4258 "c", s[0]);
4259 return NULL;
4260 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004261
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004262 break;
4263 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004265 if ((err = PyErr_Occurred())) {
4266 if (err == PyExc_EOFError) {
4267 PyErr_SetNone(PyExc_EOFError);
4268 }
4269 return NULL;
4270 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004272 PDATA_POP(self->stack, val);
4273 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004274}
Tim Peters84e87f32001-03-17 04:50:51 +00004275
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004276
Guido van Rossum60456fd1997-04-09 17:36:32 +00004277static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004278Unpickler_load(Unpicklerobject *self, PyObject *args)
4279{
4280 if (!( PyArg_ParseTuple(args, ":load")))
4281 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004283 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004284}
4285
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004286static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004287Unpickler_noload(Unpicklerobject *self, PyObject *args)
4288{
4289 if (!( PyArg_ParseTuple(args, ":noload")))
4290 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004292 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004293}
4294
Guido van Rossum60456fd1997-04-09 17:36:32 +00004295
4296static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004297 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004298 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004299 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004300 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004301 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004302 "noload() -- not load a pickle, but go through most of the motions\n"
4303 "\n"
4304 "This function can be used to read past a pickle without instantiating\n"
4305 "any objects or importing any modules. It can also be used to find all\n"
4306 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004307 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004308 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004309 {NULL, NULL} /* sentinel */
4310};
4311
4312
4313static Unpicklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004314newUnpicklerobject(PyObject *f)
4315{
4316 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004318 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
4319 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004321 self->file = NULL;
4322 self->arg = NULL;
4323 self->stack = (Pdata*)Pdata_New();
4324 self->pers_func = NULL;
4325 self->last_string = NULL;
4326 self->marks = NULL;
4327 self->num_marks = 0;
4328 self->marks_size = 0;
4329 self->buf_size = 0;
4330 self->read = NULL;
4331 self->readline = NULL;
4332 self->safe_constructors = NULL;
4333 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004335 if (!( self->memo = PyDict_New()))
4336 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004338 Py_INCREF(f);
4339 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004341 /* Set read, readline based on type of f */
4342 if (PyFile_Check(f)) {
4343 self->fp = PyFile_AsFile(f);
4344 if (self->fp == NULL) {
4345 PyErr_SetString(PyExc_ValueError,
4346 "I/O operation on closed file");
4347 goto err;
4348 }
4349 self->read_func = read_file;
4350 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004351 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004352 else if (PycStringIO_InputCheck(f)) {
4353 self->fp = NULL;
4354 self->read_func = read_cStringIO;
4355 self->readline_func = readline_cStringIO;
4356 }
4357 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004359 self->fp = NULL;
4360 self->read_func = read_other;
4361 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004363 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4364 (self->read = PyObject_GetAttr(f, read_str)))) {
4365 PyErr_Clear();
4366 PyErr_SetString( PyExc_TypeError,
4367 "argument must have 'read' and "
4368 "'readline' attributes" );
4369 goto err;
4370 }
4371 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004373 if (PyEval_GetRestricted()) {
4374 /* Restricted execution, get private tables */
4375 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004377 if (!( m=PyImport_Import(copy_reg_str))) goto err;
4378 self->safe_constructors=PyObject_GetAttr(m,
4379 safe_constructors_str);
4380 Py_DECREF(m);
4381 if (!( self->safe_constructors )) goto err;
4382 }
4383 else {
4384 self->safe_constructors=safe_constructors;
4385 Py_INCREF(safe_constructors);
4386 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004387
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004388 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004389
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004390 err:
4391 Py_DECREF((PyObject *)self);
4392 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004393}
4394
4395
4396static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004397get_Unpickler(PyObject *self, PyObject *args)
4398{
4399 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004401 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
4402 return NULL;
4403 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004404}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004405
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004406
Guido van Rossum60456fd1997-04-09 17:36:32 +00004407static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004408Unpickler_dealloc(Unpicklerobject *self)
4409{
4410 Py_XDECREF(self->readline);
4411 Py_XDECREF(self->read);
4412 Py_XDECREF(self->file);
4413 Py_XDECREF(self->memo);
4414 Py_XDECREF(self->stack);
4415 Py_XDECREF(self->pers_func);
4416 Py_XDECREF(self->arg);
4417 Py_XDECREF(self->last_string);
4418 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004420 if (self->marks) {
4421 free(self->marks);
4422 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004424 if (self->buf_size) {
4425 free(self->buf);
4426 }
Tim Peters84e87f32001-03-17 04:50:51 +00004427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004428 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004429}
4430
4431
4432static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004433Unpickler_getattr(Unpicklerobject *self, char *name)
4434{
4435 if (!strcmp(name, "persistent_load")) {
4436 if (!self->pers_func) {
4437 PyErr_SetString(PyExc_AttributeError, name);
4438 return NULL;
4439 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004441 Py_INCREF(self->pers_func);
4442 return self->pers_func;
4443 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004445 if (!strcmp(name, "find_global")) {
4446 if (!self->find_class) {
4447 PyErr_SetString(PyExc_AttributeError, name);
4448 return NULL;
4449 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004451 Py_INCREF(self->find_class);
4452 return self->find_class;
4453 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004454
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004455 if (!strcmp(name, "memo")) {
4456 if (!self->memo) {
4457 PyErr_SetString(PyExc_AttributeError, name);
4458 return NULL;
4459 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004461 Py_INCREF(self->memo);
4462 return self->memo;
4463 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004465 if (!strcmp(name, "UnpicklingError")) {
4466 Py_INCREF(UnpicklingError);
4467 return UnpicklingError;
4468 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004470 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004471}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004472
Guido van Rossum60456fd1997-04-09 17:36:32 +00004473
4474static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004475Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
4476{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004478 if (!strcmp(name, "persistent_load")) {
4479 Py_XDECREF(self->pers_func);
4480 self->pers_func = value;
4481 Py_XINCREF(value);
4482 return 0;
4483 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004484
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004485 if (!strcmp(name, "find_global")) {
4486 Py_XDECREF(self->find_class);
4487 self->find_class = value;
4488 Py_XINCREF(value);
4489 return 0;
4490 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004492 if (! value) {
4493 PyErr_SetString(PyExc_TypeError,
4494 "attribute deletion is not supported");
4495 return -1;
4496 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004498 if (strcmp(name, "memo") == 0) {
4499 if (!PyDict_Check(value)) {
4500 PyErr_SetString(PyExc_TypeError,
4501 "memo must be a dictionary");
4502 return -1;
4503 }
4504 Py_XDECREF(self->memo);
4505 self->memo = value;
4506 Py_INCREF(value);
4507 return 0;
4508 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004510 PyErr_SetString(PyExc_AttributeError, name);
4511 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004512}
4513
4514
4515static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004516cpm_dump(PyObject *self, PyObject *args)
4517{
4518 PyObject *ob, *file, *res = NULL;
4519 Picklerobject *pickler = 0;
4520 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004522 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin)))
4523 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004525 if (!( pickler = newPicklerobject(file, bin)))
4526 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004528 if (dump(pickler, ob) < 0)
4529 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004531 Py_INCREF(Py_None);
4532 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004534 finally:
4535 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004537 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004538}
4539
4540
4541static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004542cpm_dumps(PyObject *self, PyObject *args)
4543{
4544 PyObject *ob, *file = 0, *res = NULL;
4545 Picklerobject *pickler = 0;
4546 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004548 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin)))
4549 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004550
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004551 if (!( file = PycStringIO->NewOutput(128)))
4552 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004554 if (!( pickler = newPicklerobject(file, bin)))
4555 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004557 if (dump(pickler, ob) < 0)
4558 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004560 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004562 finally:
4563 Py_XDECREF(pickler);
4564 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004566 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004567}
4568
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004569
4570static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004571cpm_load(PyObject *self, PyObject *args)
4572{
4573 Unpicklerobject *unpickler = 0;
4574 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004576 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
4577 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004579 if (!( unpickler = newUnpicklerobject(ob)))
4580 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004582 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004583
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004584 finally:
4585 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004587 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004588}
4589
4590
4591static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004592cpm_loads(PyObject *self, PyObject *args)
4593{
4594 PyObject *ob, *file = 0, *res = NULL;
4595 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004597 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
4598 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004600 if (!( file = PycStringIO->NewInput(ob)))
4601 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004603 if (!( unpickler = newUnpicklerobject(file)))
4604 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004606 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004608 finally:
4609 Py_XDECREF(file);
4610 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004612 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004613}
4614
4615
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004616PyDoc_STRVAR(Unpicklertype__doc__,
4617"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004618
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004619static PyTypeObject Unpicklertype = {
4620 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004621 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004622 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004623 sizeof(Unpicklerobject), /*tp_basicsize*/
4624 0, /*tp_itemsize*/
4625 /* methods */
4626 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4627 (printfunc)0, /*tp_print*/
4628 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4629 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4630 (cmpfunc)0, /*tp_compare*/
4631 (reprfunc)0, /*tp_repr*/
4632 0, /*tp_as_number*/
4633 0, /*tp_as_sequence*/
4634 0, /*tp_as_mapping*/
4635 (hashfunc)0, /*tp_hash*/
4636 (ternaryfunc)0, /*tp_call*/
4637 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004638
Guido van Rossum60456fd1997-04-09 17:36:32 +00004639 /* Space for future expansion */
4640 0L,0L,0L,0L,
4641 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004642};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004643
Guido van Rossum60456fd1997-04-09 17:36:32 +00004644static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004645 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004646 PyDoc_STR("dump(object, file, [binary]) --"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004647 "Write an object in pickle format to the given file\n"
4648 "\n"
4649 "If the optional argument, binary, is provided and is true, then the\n"
4650 "pickle will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004651 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004652 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004653 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004654 PyDoc_STR("dumps(object, [binary]) --"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004655 "Return a string containing an object in pickle format\n"
4656 "\n"
4657 "If the optional argument, binary, is provided and is true, then the\n"
4658 "pickle will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004659 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004660 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004661 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004662 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Neal Norwitzb0493252002-03-31 14:44:22 +00004663 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004664 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Neal Norwitzb0493252002-03-31 14:44:22 +00004665 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004666 PyDoc_STR("Pickler(file, [binary]) -- Create a pickler\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004667 "\n"
4668 "If the optional argument, binary, is provided and is true, then\n"
4669 "pickles will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004670 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004671 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004672 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004673 PyDoc_STR("Unpickler(file) -- Create an unpickler")},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004674 { NULL, NULL }
4675};
4676
Guido van Rossum60456fd1997-04-09 17:36:32 +00004677static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004678init_stuff(PyObject *module_dict)
4679{
4680 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004681
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004682#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004684 INIT_STR(__class__);
4685 INIT_STR(__getinitargs__);
4686 INIT_STR(__dict__);
4687 INIT_STR(__getstate__);
4688 INIT_STR(__setstate__);
4689 INIT_STR(__name__);
4690 INIT_STR(__main__);
4691 INIT_STR(__reduce__);
4692 INIT_STR(write);
4693 INIT_STR(__safe_for_unpickling__);
4694 INIT_STR(append);
4695 INIT_STR(read);
4696 INIT_STR(readline);
4697 INIT_STR(copy_reg);
4698 INIT_STR(dispatch_table);
4699 INIT_STR(safe_constructors);
4700 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004702 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
4703 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004705 /* These next few are special because we want to use different
4706 ones in restricted mode. */
4707 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
4708 if (!dispatch_table)
4709 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004711 if (!( safe_constructors = PyObject_GetAttr(copy_reg,
4712 safe_constructors_str)))
4713 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004715 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004717 /* Down to here ********************************** */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004719 if (!( empty_tuple = PyTuple_New(0)))
4720 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004722 /* Ugh */
4723 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4724 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4725 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004727 if (!( t=PyDict_New())) return -1;
4728 if (!( r=PyRun_String(
4729 "def __init__(self, *args): self.args=args\n\n"
4730 "def __str__(self):\n"
4731 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4732 Py_file_input,
4733 module_dict, t) )) return -1;
4734 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004736 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
4737 if (!PickleError)
4738 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004740 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004742 PicklingError = PyErr_NewException("cPickle.PicklingError",
4743 PickleError, NULL);
4744 if (!PicklingError)
4745 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004747 if (!( t=PyDict_New())) return -1;
4748 if (!( r=PyRun_String(
4749 "def __init__(self, *args): self.args=args\n\n"
4750 "def __str__(self):\n"
4751 " a=self.args\n"
4752 " a=a and type(a[0]) or '(what)'\n"
4753 " return 'Cannot pickle %s objects' % a\n"
4754 , Py_file_input,
4755 module_dict, t) )) return -1;
4756 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004758 if (!( UnpickleableError = PyErr_NewException(
4759 "cPickle.UnpickleableError", PicklingError, t)))
4760 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004762 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004764 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
4765 PickleError, NULL)))
4766 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004767
Martin v. Löwis658009a2002-09-16 17:26:24 +00004768 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
4769 UnpicklingError, NULL)))
4770 return -1;
4771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004772 if (PyDict_SetItemString(module_dict, "PickleError",
4773 PickleError) < 0)
4774 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004776 if (PyDict_SetItemString(module_dict, "PicklingError",
4777 PicklingError) < 0)
4778 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004780 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4781 UnpicklingError) < 0)
4782 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004784 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4785 UnpickleableError) < 0)
4786 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004788 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4789 BadPickleGet) < 0)
4790 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004792 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004794 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004795}
4796
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004797#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
4798#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004799#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004800PyMODINIT_FUNC
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004801initcPickle(void)
4802{
4803 PyObject *m, *d, *di, *v, *k;
4804 int i;
4805 char *rev="1.71";
4806 PyObject *format_version;
4807 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004809 Picklertype.ob_type = &PyType_Type;
4810 Picklertype.tp_getattro = PyObject_GenericGetAttr;
4811 Picklertype.tp_setattro = PyObject_GenericSetAttr;
4812 Unpicklertype.ob_type = &PyType_Type;
4813 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004815 /* Initialize some pieces. We need to do this before module creation,
4816 so we're forced to use a temporary dictionary. :(
4817 */
4818 di=PyDict_New();
4819 if (!di) return;
4820 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004822 /* Create the module and add the functions */
4823 m = Py_InitModule4("cPickle", cPickle_methods,
4824 cPickle_module_documentation,
4825 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004827 /* Add some symbolic constants to the module */
4828 d = PyModule_GetDict(m);
4829 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4830 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004832 /* Copy data from di. Waaa. */
4833 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4834 if (PyObject_SetItem(d, k, v) < 0) {
4835 Py_DECREF(di);
4836 return;
4837 }
4838 }
4839 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004841 format_version = PyString_FromString("1.3");
4842 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004844 PyDict_SetItemString(d, "format_version", format_version);
4845 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4846 Py_XDECREF(format_version);
4847 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004848}