blob: 08bb8e8b2d90e5a763bb4f2822fd00d0115ef2a5 [file] [log] [blame]
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001#include "Python.h"
2#include "cStringIO.h"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005PyDoc_STRVAR(cPickle_module_documentation,
6"C implementation and optimization of the Python pickle module\n"
7"\n"
8"cPickle.c,v 1.71 1999/07/11 13:30:34 jim Exp\n");
9
Guido van Rossum142eeb81997-08-13 03:14:41 +000010#ifndef Py_eval_input
11#include <graminit.h>
12#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000013#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000014
Guido van Rossum2f4caa41997-01-06 22:59:08 +000015#include <errno.h>
16
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +000017
Guido van Rossum2f4caa41997-01-06 22:59:08 +000018
Guido van Rossum60456fd1997-04-09 17:36:32 +000019#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000020
Guido van Rossum60456fd1997-04-09 17:36:32 +000021#define WRITE_BUF_SIZE 256
22
Tim Peters3906eb82001-04-10 04:22:00 +000023/* --------------------------------------------------------------------------
24NOTES on format codes.
25XXX much more is needed here
26
27Integer types
Tim Petersd8ae7c22001-04-10 04:35:28 +000028BININT1 8-bit unsigned integer; followed by 1 byte.
Tim Peters3906eb82001-04-10 04:22:00 +000029BININT2 16-bit unsigned integer; followed by 2 bytes, little-endian.
Tim Petersd8ae7c22001-04-10 04:35:28 +000030BININT 32-bit signed integer; followed by 4 bytes, little-endian.
31INT Integer; natural decimal string conversion, then newline.
Tim Peters3906eb82001-04-10 04:22:00 +000032 CAUTION: INT-reading code can't assume that what follows
33 fits in a Python int, because the size of Python ints varies
34 across platforms.
Tim Petersd8ae7c22001-04-10 04:35:28 +000035LONG Long (unbounded) integer; repr(i), then newline.
Tim Peters3906eb82001-04-10 04:22:00 +000036-------------------------------------------------------------------------- */
Guido van Rossum60456fd1997-04-09 17:36:32 +000037
38#define MARK '('
39#define STOP '.'
40#define POP '0'
41#define POP_MARK '1'
42#define DUP '2'
43#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000044#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000045#define INT 'I'
46#define BININT 'J'
47#define BININT1 'K'
48#define LONG 'L'
49#define BININT2 'M'
50#define NONE 'N'
51#define PERSID 'P'
52#define BINPERSID 'Q'
53#define REDUCE 'R'
54#define STRING 'S'
55#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000056#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000057#define UNICODE 'V'
58#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000059#define APPEND 'a'
60#define BUILD 'b'
61#define GLOBAL 'c'
62#define DICT 'd'
63#define EMPTY_DICT '}'
64#define APPENDS 'e'
65#define GET 'g'
66#define BINGET 'h'
67#define INST 'i'
68#define LONG_BINGET 'j'
69#define LIST 'l'
70#define EMPTY_LIST ']'
71#define OBJ 'o'
72#define PUT 'p'
73#define BINPUT 'q'
74#define LONG_BINPUT 'r'
75#define SETITEM 's'
76#define TUPLE 't'
77#define EMPTY_TUPLE ')'
78#define SETITEMS 'u'
Jack Jansen3a967022002-06-26 20:40:42 +000079#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000080#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000081#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000082#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000083
Guido van Rossum2f4caa41997-01-06 22:59:08 +000084
Guido van Rossum60456fd1997-04-09 17:36:32 +000085static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000086
Guido van Rossumc03158b1999-06-09 15:23:31 +000087static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000088static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +000089static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000090static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +000091static PyObject *BadPickleGet;
92
Guido van Rossum2f4caa41997-01-06 22:59:08 +000093
Guido van Rossum60456fd1997-04-09 17:36:32 +000094static PyObject *dispatch_table;
95static PyObject *safe_constructors;
Guido van Rossum60456fd1997-04-09 17:36:32 +000096static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000097
Guido van Rossum60456fd1997-04-09 17:36:32 +000098static PyObject *__class___str, *__getinitargs___str, *__dict___str,
99 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
100 *write_str, *__safe_for_unpickling___str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000101 *read_str, *readline_str, *__main___str, *__basicnew___str,
Fred Drake2c7a6852001-07-17 18:34:03 +0000102 *copy_reg_str, *dispatch_table_str, *safe_constructors_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000103
Guido van Rossum053b8df1998-11-25 16:18:00 +0000104/*************************************************************************
105 Internal Data type for pickle data. */
106
107typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000108 PyObject_HEAD
109 int length, size;
110 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000111} Pdata;
112
Tim Peters84e87f32001-03-17 04:50:51 +0000113static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000114Pdata_dealloc(Pdata *self)
115{
116 int i;
117 PyObject **p;
118
119 for (i=self->length, p=self->data; --i >= 0; p++) Py_DECREF(*p);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000121 if (self->data) free(self->data);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000123 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000124}
125
126static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000127 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
128 (destructor)Pdata_dealloc,
129 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000130};
131
132#define Pdata_Check(O) ((O)->ob_type == &PdataType)
133
134static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000135Pdata_New(void)
136{
137 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000139 if (!( self = PyObject_New(Pdata, &PdataType))) return NULL;
140 self->size=8;
141 self->length=0;
142 self->data=malloc(self->size * sizeof(PyObject*));
143 if (self->data) return (PyObject*)self;
144 Py_DECREF(self);
145 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000146}
147
Tim Peters84e87f32001-03-17 04:50:51 +0000148static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000149stackUnderflow(void)
150{
151 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
152 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000153}
154
155static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000156Pdata_clear(Pdata *self, int clearto)
157{
158 int i;
159 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000161 if (clearto < 0) return stackUnderflow();
162 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000164 for (i=self->length, p=self->data+clearto; --i >= clearto; p++)
165 Py_DECREF(*p);
166 self->length=clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000168 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000169}
170
171
Tim Peters84e87f32001-03-17 04:50:51 +0000172static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000173Pdata_grow(Pdata *self)
174{
175 if (! self->size) {
176 PyErr_NoMemory();
177 return -1;
178 }
179 self->size *= 2;
180 self->data = realloc(self->data, self->size*sizeof(PyObject*));
181 if (! self->data) {
182 self->size = 0;
183 PyErr_NoMemory();
184 return -1;
185 }
186 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000187}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000188
189#define PDATA_POP(D,V) { \
190 if ((D)->length) V=D->data[--((D)->length)]; \
191 else { \
192 PyErr_SetString(UnpicklingError, "bad pickle data"); \
193 V=NULL; \
194 } \
195}
196
197
198static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000199Pdata_popTuple(Pdata *self, int start)
200{
201 PyObject *r;
202 int i, j, l;
203
204 l=self->length-start;
205 if (!( r=PyTuple_New(l))) return NULL;
206 for (i=start, j=0 ; j < l; i++, j++)
207 PyTuple_SET_ITEM(r, j, self->data[i]);
208
209 self->length=start;
210 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000211}
212
213static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000214Pdata_popList(Pdata *self, int start)
215{
216 PyObject *r;
217 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000219 l=self->length-start;
220 if (!( r=PyList_New(l))) return NULL;
221 for (i=start, j=0 ; j < l; i++, j++)
222 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000224 self->length=start;
225 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000226}
227
Guido van Rossum053b8df1998-11-25 16:18:00 +0000228#define PDATA_APPEND(D,O,ER) { \
229 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
230 Pdata_grow((Pdata*)(D)) < 0) \
231 return ER; \
232 Py_INCREF(O); \
233 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
234}
235
236#define PDATA_PUSH(D,O,ER) { \
237 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
238 Pdata_grow((Pdata*)(D)) < 0) { \
239 Py_DECREF(O); \
240 return ER; \
241 } \
242 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
243}
244
245/*************************************************************************/
246
247#define ARG_TUP(self, o) { \
248 if (self->arg || (self->arg=PyTuple_New(1))) { \
249 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
250 PyTuple_SET_ITEM(self->arg,0,o); \
251 } \
252 else { \
253 Py_DECREF(o); \
254 } \
255}
256
257#define FREE_ARG_TUP(self) { \
258 if (self->arg->ob_refcnt > 1) { \
259 Py_DECREF(self->arg); \
260 self->arg=NULL; \
261 } \
262 }
263
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000264typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000265 PyObject_HEAD
266 FILE *fp;
267 PyObject *write;
268 PyObject *file;
269 PyObject *memo;
270 PyObject *arg;
271 PyObject *pers_func;
272 PyObject *inst_pers_func;
273 int bin;
274 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000275 int nesting;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000276 int (*write_func)(struct Picklerobject *, char *, int);
277 char *write_buf;
278 int buf_size;
279 PyObject *dispatch_table;
280 int fast_container; /* count nested container dumps */
281 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000282} Picklerobject;
283
Barry Warsaw52acb492001-12-21 20:04:22 +0000284#ifndef PY_CPICKLE_FAST_LIMIT
285#define PY_CPICKLE_FAST_LIMIT 50
286#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000287
Jeremy Hylton938ace62002-07-17 16:30:39 +0000288static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000289
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000290typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000291 PyObject_HEAD
292 FILE *fp;
293 PyObject *file;
294 PyObject *readline;
295 PyObject *read;
296 PyObject *memo;
297 PyObject *arg;
298 Pdata *stack;
299 PyObject *mark;
300 PyObject *pers_func;
301 PyObject *last_string;
302 int *marks;
303 int num_marks;
304 int marks_size;
305 int (*read_func)(struct Unpicklerobject *, char **, int);
306 int (*readline_func)(struct Unpicklerobject *, char **);
307 int buf_size;
308 char *buf;
309 PyObject *safe_constructors;
310 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000311} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000312
Jeremy Hylton938ace62002-07-17 16:30:39 +0000313static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000314
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000315/* Forward decls that need the above structs */
316static int save(Picklerobject *, PyObject *, int);
317static int put2(Picklerobject *, PyObject *);
318
Tim Peters84e87f32001-03-17 04:50:51 +0000319int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000320cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
321{
322 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000324 if ((v = PyObject_GetItem(o,key))) {
325 Py_DECREF(v);
326 return 1;
327 }
328
329 PyErr_Clear();
330 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000331}
332
Guido van Rossumd385d591997-04-09 17:47:47 +0000333static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000334PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000335cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
336{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000337 va_list va;
338 PyObject *args=0, *retval=0;
339 va_start(va, format);
340
341 if (format) args = Py_VaBuildValue(format, va);
342 va_end(va);
343 if (format && ! args) return NULL;
344 if (stringformat && !(retval=PyString_FromString(stringformat)))
345 return NULL;
346
347 if (retval) {
348 if (args) {
349 PyObject *v;
350 v=PyString_Format(retval, args);
351 Py_DECREF(retval);
352 Py_DECREF(args);
353 if (! v) return NULL;
354 retval=v;
355 }
356 }
357 else
358 if (args) retval=args;
359 else {
360 PyErr_SetObject(ErrType,Py_None);
361 return NULL;
362 }
363 PyErr_SetObject(ErrType,retval);
364 Py_DECREF(retval);
365 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000366}
367
Tim Peters84e87f32001-03-17 04:50:51 +0000368static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000369write_file(Picklerobject *self, char *s, int n)
370{
371 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000373 if (s == NULL) {
374 return 0;
375 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000377 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000378 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000379 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000380 if (nbyteswritten != (size_t)n) {
381 PyErr_SetFromErrno(PyExc_IOError);
382 return -1;
383 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000385 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000386}
387
Tim Peters84e87f32001-03-17 04:50:51 +0000388static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000389write_cStringIO(Picklerobject *self, char *s, int n)
390{
391 if (s == NULL) {
392 return 0;
393 }
394
395 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
396 return -1;
397 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000399 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000400}
401
Tim Peters84e87f32001-03-17 04:50:51 +0000402static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000403write_none(Picklerobject *self, char *s, int n)
404{
405 if (s == NULL) return 0;
406 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000407}
408
Tim Peters84e87f32001-03-17 04:50:51 +0000409static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000410write_other(Picklerobject *self, char *s, int n)
411{
412 PyObject *py_str = 0, *junk = 0;
413
414 if (s == NULL) {
415 if (!( self->buf_size )) return 0;
416 py_str = PyString_FromStringAndSize(self->write_buf,
417 self->buf_size);
418 if (!py_str)
419 return -1;
420 }
421 else {
422 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
423 if (write_other(self, NULL, 0) < 0)
424 return -1;
425 }
426
427 if (n > WRITE_BUF_SIZE) {
428 if (!( py_str =
429 PyString_FromStringAndSize(s, n)))
430 return -1;
431 }
432 else {
433 memcpy(self->write_buf + self->buf_size, s, n);
434 self->buf_size += n;
435 return n;
436 }
437 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000439 if (self->write) {
440 /* object with write method */
441 ARG_TUP(self, py_str);
442 if (self->arg) {
443 junk = PyObject_Call(self->write, self->arg, NULL);
444 FREE_ARG_TUP(self);
445 }
446 if (junk) Py_DECREF(junk);
447 else return -1;
448 }
449 else
450 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000452 self->buf_size = 0;
453 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000454}
455
456
Tim Peters84e87f32001-03-17 04:50:51 +0000457static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000458read_file(Unpicklerobject *self, char **s, int n)
459{
460 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000462 if (self->buf_size == 0) {
463 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000465 size = ((n < 32) ? 32 : n);
466 if (!( self->buf = (char *)malloc(size * sizeof(char)))) {
467 PyErr_NoMemory();
468 return -1;
469 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000471 self->buf_size = size;
472 }
473 else if (n > self->buf_size) {
474 self->buf = (char *)realloc(self->buf, n * sizeof(char));
475 if (!self->buf) {
476 PyErr_NoMemory();
477 return -1;
478 }
Tim Peters84e87f32001-03-17 04:50:51 +0000479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000480 self->buf_size = n;
481 }
Tim Peters84e87f32001-03-17 04:50:51 +0000482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000483 Py_BEGIN_ALLOW_THREADS
484 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
485 Py_END_ALLOW_THREADS
486 if (nbytesread != (size_t)n) {
487 if (feof(self->fp)) {
488 PyErr_SetNone(PyExc_EOFError);
489 return -1;
490 }
491
492 PyErr_SetFromErrno(PyExc_IOError);
493 return -1;
494 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000496 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000498 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000499}
500
501
Tim Peters84e87f32001-03-17 04:50:51 +0000502static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000503readline_file(Unpicklerobject *self, char **s)
504{
505 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000507 if (self->buf_size == 0) {
508 if (!( self->buf = (char *)malloc(40 * sizeof(char)))) {
509 PyErr_NoMemory();
510 return -1;
511 }
Tim Peters84e87f32001-03-17 04:50:51 +0000512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000513 self->buf_size = 40;
514 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000516 i = 0;
517 while (1) {
518 for (; i < (self->buf_size - 1); i++) {
519 if (feof(self->fp) ||
520 (self->buf[i] = getc(self->fp)) == '\n') {
521 self->buf[i + 1] = '\0';
522 *s = self->buf;
523 return i + 1;
524 }
525 }
526 self->buf = (char *)realloc(self->buf,
527 (self->buf_size * 2) * sizeof(char));
528 if (!self->buf) {
529 PyErr_NoMemory();
530 return -1;
531 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000533 self->buf_size *= 2;
534 }
Tim Peters84e87f32001-03-17 04:50:51 +0000535}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000536
537
Tim Peters84e87f32001-03-17 04:50:51 +0000538static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000539read_cStringIO(Unpicklerobject *self, char **s, int n)
540{
541 char *ptr;
542
543 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
544 PyErr_SetNone(PyExc_EOFError);
545 return -1;
546 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000548 *s = ptr;
549
550 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000551}
552
553
Tim Peters84e87f32001-03-17 04:50:51 +0000554static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000555readline_cStringIO(Unpicklerobject *self, char **s)
556{
557 int n;
558 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000560 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
561 return -1;
562 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000564 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000566 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000567}
568
569
Tim Peters84e87f32001-03-17 04:50:51 +0000570static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000571read_other(Unpicklerobject *self, char **s, int n)
572{
573 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000575 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000577 ARG_TUP(self, bytes);
578 if (self->arg) {
579 str = PyObject_Call(self->read, self->arg, NULL);
580 FREE_ARG_TUP(self);
581 }
582 if (! str) return -1;
583
584 Py_XDECREF(self->last_string);
585 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000587 if (! (*s = PyString_AsString(str))) return -1;
588 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000589}
590
591
Tim Peters84e87f32001-03-17 04:50:51 +0000592static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000593readline_other(Unpicklerobject *self, char **s)
594{
595 PyObject *str;
596 int str_size;
597
598 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
599 return -1;
600 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000602 if ((str_size = PyString_Size(str)) < 0)
603 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000605 Py_XDECREF(self->last_string);
606 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000608 if (! (*s = PyString_AsString(str)))
609 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000611 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000612}
613
614
615static char *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000616pystrndup(char *s, int l)
617{
618 char *r;
619 if (!( r=malloc((l+1)*sizeof(char)))) return (char*)PyErr_NoMemory();
620 memcpy(r,s,l);
621 r[l]=0;
622 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000623}
624
625
626static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000627get(Picklerobject *self, PyObject *id)
628{
629 PyObject *value, *mv;
630 long c_value;
631 char s[30];
632 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000634 if (!( mv = PyDict_GetItem(self->memo, id))) {
635 PyErr_SetObject(PyExc_KeyError, id);
636 return -1;
637 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000639 if (!( value = PyTuple_GetItem(mv, 0)))
640 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000642 if (!( PyInt_Check(value))) {
643 PyErr_SetString(PicklingError, "no int where int expected in memo");
644 return -1;
645 }
646 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000648 if (!self->bin) {
649 s[0] = GET;
650 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
651 len = strlen(s);
652 }
653 else if (Pdata_Check(self->file)) {
654 if (write_other(self, NULL, 0) < 0) return -1;
655 PDATA_APPEND(self->file, mv, -1);
656 return 0;
657 }
658 else {
659 if (c_value < 256) {
660 s[0] = BINGET;
661 s[1] = (int)(c_value & 0xff);
662 len = 2;
663 }
664 else {
665 s[0] = LONG_BINGET;
666 s[1] = (int)(c_value & 0xff);
667 s[2] = (int)((c_value >> 8) & 0xff);
668 s[3] = (int)((c_value >> 16) & 0xff);
669 s[4] = (int)((c_value >> 24) & 0xff);
670 len = 5;
671 }
672 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000674 if ((*self->write_func)(self, s, len) < 0)
675 return -1;
676
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000677 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000678}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000679
Guido van Rossum60456fd1997-04-09 17:36:32 +0000680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000681static int
682put(Picklerobject *self, PyObject *ob)
683{
684 if (ob->ob_refcnt < 2 || self->fast)
685 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000687 return put2(self, ob);
688}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000689
Guido van Rossum053b8df1998-11-25 16:18:00 +0000690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000691static int
692put2(Picklerobject *self, PyObject *ob)
693{
694 char c_str[30];
695 int p;
696 size_t len;
697 int res = -1;
698 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000700 if (self->fast)
701 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000703 if ((p = PyDict_Size(self->memo)) < 0)
704 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000706 /* Make sure memo keys are positive! */
707 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000709 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
710 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000712 if (!( memo_len = PyInt_FromLong(p)))
713 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000715 if (!( t = PyTuple_New(2)))
716 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000718 PyTuple_SET_ITEM(t, 0, memo_len);
719 Py_INCREF(memo_len);
720 PyTuple_SET_ITEM(t, 1, ob);
721 Py_INCREF(ob);
722
723 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
724 goto finally;
725
726 if (!self->bin) {
727 c_str[0] = PUT;
728 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
729 len = strlen(c_str);
730 }
731 else if (Pdata_Check(self->file)) {
732 if (write_other(self, NULL, 0) < 0) return -1;
733 PDATA_APPEND(self->file, memo_len, -1);
734 res=0; /* Job well done ;) */
735 goto finally;
736 }
737 else {
738 if (p >= 256) {
739 c_str[0] = LONG_BINPUT;
740 c_str[1] = (int)(p & 0xff);
741 c_str[2] = (int)((p >> 8) & 0xff);
742 c_str[3] = (int)((p >> 16) & 0xff);
743 c_str[4] = (int)((p >> 24) & 0xff);
744 len = 5;
745 }
746 else {
747 c_str[0] = BINPUT;
748 c_str[1] = p;
749 len = 2;
750 }
751 }
752
753 if ((*self->write_func)(self, c_str, len) < 0)
754 goto finally;
755
756 res = 0;
757
758 finally:
759 Py_XDECREF(py_ob_id);
760 Py_XDECREF(memo_len);
761 Py_XDECREF(t);
762
763 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000764}
765
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000766#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000767
768static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000769PyImport_Import(PyObject *module_name)
770{
771 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
772 static PyObject *standard_builtins=0;
773 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000775 if (!( silly_list )) {
776 if (!( __import___str=PyString_FromString("__import__")))
777 return NULL;
778 if (!( __builtins___str=PyString_FromString("__builtins__")))
779 return NULL;
780 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
781 return NULL;
782 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000784 if ((globals=PyEval_GetGlobals())) {
785 Py_INCREF(globals);
786 __builtins__=PyObject_GetItem(globals,__builtins___str);
787 if (!__builtins__)
788 goto err;
789 }
790 else {
791 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000793 if (!(standard_builtins ||
794 (standard_builtins=PyImport_ImportModule("__builtin__"))))
795 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000797 __builtins__=standard_builtins;
798 Py_INCREF(__builtins__);
799 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
800 if (!globals)
801 goto err;
802 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000804 if (PyDict_Check(__builtins__)) {
805 __import__=PyObject_GetItem(__builtins__,__import___str);
806 if (!__import__) goto err;
807 }
808 else {
809 __import__=PyObject_GetAttr(__builtins__,__import___str);
810 if (!__import__) goto err;
811 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000813 r=PyObject_CallFunction(__import__,"OOOO",
814 module_name, globals, globals, silly_list);
815 if (!r)
816 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000818 Py_DECREF(globals);
819 Py_DECREF(__builtins__);
820 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000822 return r;
823 err:
824 Py_XDECREF(globals);
825 Py_XDECREF(__builtins__);
826 Py_XDECREF(__import__);
827 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000828}
829
830static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000831whichmodule(PyObject *global, PyObject *global_name)
832{
833 int i, j;
834 PyObject *module = 0, *modules_dict = 0,
835 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000837 module = PyObject_GetAttrString(global, "__module__");
838 if (module) return module;
839 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000841 if (!( modules_dict = PySys_GetObject("modules")))
842 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000844 i = 0;
845 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000847 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000849 global_name_attr = PyObject_GetAttr(module, global_name);
850 if (!global_name_attr) {
851 PyErr_Clear();
852 continue;
853 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000855 if (global_name_attr != global) {
856 Py_DECREF(global_name_attr);
857 continue;
858 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000860 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 break;
863 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000865 /* The following implements the rule in pickle.py added in 1.5
866 that used __main__ if no module is found. I don't actually
867 like this rule. jlf
868 */
869 if (!j) {
870 j=1;
871 name=__main___str;
872 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000874 Py_INCREF(name);
875 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000876}
877
878
Guido van Rossum60456fd1997-04-09 17:36:32 +0000879static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000880fast_save_enter(Picklerobject *self, PyObject *obj)
881{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000882 /* if fast_container < 0, we're doing an error exit. */
883 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
884 PyObject *key = NULL;
885 if (self->fast_memo == NULL) {
886 self->fast_memo = PyDict_New();
887 if (self->fast_memo == NULL) {
888 self->fast_container = -1;
889 return 0;
890 }
891 }
892 key = PyLong_FromVoidPtr(obj);
893 if (key == NULL)
894 return 0;
895 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000896 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000897 PyErr_Format(PyExc_ValueError,
898 "fast mode: can't pickle cyclic objects including object type %s at %p",
899 obj->ob_type->tp_name, obj);
900 self->fast_container = -1;
901 return 0;
902 }
903 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000904 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000905 self->fast_container = -1;
906 return 0;
907 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000908 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000909 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000910 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000911}
912
913int
914fast_save_leave(Picklerobject *self, PyObject *obj)
915{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000916 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
917 PyObject *key = PyLong_FromVoidPtr(obj);
918 if (key == NULL)
919 return 0;
920 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000921 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000922 return 0;
923 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000924 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000925 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000926 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000927}
928
929static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000930save_none(Picklerobject *self, PyObject *args)
931{
932 static char none = NONE;
933 if ((*self->write_func)(self, &none, 1) < 0)
934 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000936 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000937}
938
Guido van Rossum77f6a652002-04-03 22:41:51 +0000939static int
940save_bool(Picklerobject *self, PyObject *args)
941{
Guido van Rossume2763392002-04-05 19:30:08 +0000942 static char *buf[2] = {FALSE, TRUE};
943 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000944 long l = PyInt_AS_LONG((PyIntObject *)args);
945
Guido van Rossume2763392002-04-05 19:30:08 +0000946 if ((*self->write_func)(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000947 return -1;
948
949 return 0;
950}
Tim Peters84e87f32001-03-17 04:50:51 +0000951
Guido van Rossum60456fd1997-04-09 17:36:32 +0000952static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000953save_int(Picklerobject *self, PyObject *args)
954{
955 char c_str[32];
956 long l = PyInt_AS_LONG((PyIntObject *)args);
957 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000959 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000960#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000961 || l > 0x7fffffffL
962 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000963#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000964 ) {
965 /* Text-mode pickle, or long too big to fit in the 4-byte
966 * signed BININT format: store as a string.
967 */
968 c_str[0] = INT;
969 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
970 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
971 return -1;
972 }
973 else {
974 /* Binary pickle and l fits in a signed 4-byte int. */
975 c_str[1] = (int)( l & 0xff);
976 c_str[2] = (int)((l >> 8) & 0xff);
977 c_str[3] = (int)((l >> 16) & 0xff);
978 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000980 if ((c_str[4] == 0) && (c_str[3] == 0)) {
981 if (c_str[2] == 0) {
982 c_str[0] = BININT1;
983 len = 2;
984 }
985 else {
986 c_str[0] = BININT2;
987 len = 3;
988 }
989 }
990 else {
991 c_str[0] = BININT;
992 len = 5;
993 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000995 if ((*self->write_func)(self, c_str, len) < 0)
996 return -1;
997 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000999 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001000}
1001
1002
1003static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001004save_long(Picklerobject *self, PyObject *args)
1005{
1006 int size, res = -1;
1007 PyObject *repr = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001009 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001011 if (!( repr = PyObject_Repr(args)))
1012 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001014 if ((size = PyString_Size(repr)) < 0)
1015 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001017 if ((*self->write_func)(self, &l, 1) < 0)
1018 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001020 if ((*self->write_func)(self,
1021 PyString_AS_STRING((PyStringObject *)repr),
1022 size) < 0)
1023 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001025 if ((*self->write_func)(self, "\n", 1) < 0)
1026 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001027
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001028 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001030 finally:
1031 Py_XDECREF(repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001033 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001034}
1035
1036
1037static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001038save_float(Picklerobject *self, PyObject *args)
1039{
1040 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001042 if (self->bin) {
1043 int s, e;
1044 double f;
1045 long fhi, flo;
1046 char str[9];
1047 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001049 *p = BINFLOAT;
1050 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001052 if (x < 0) {
1053 s = 1;
1054 x = -x;
1055 }
1056 else
1057 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001059 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001061 /* Normalize f to be in the range [1.0, 2.0) */
1062 if (0.5 <= f && f < 1.0) {
1063 f *= 2.0;
1064 e--;
1065 }
1066 else if (f == 0.0) {
1067 e = 0;
1068 }
1069 else {
1070 PyErr_SetString(PyExc_SystemError,
1071 "frexp() result out of range");
1072 return -1;
1073 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001075 if (e >= 1024) {
1076 /* XXX 1024 itself is reserved for Inf/NaN */
1077 PyErr_SetString(PyExc_OverflowError,
1078 "float too large to pack with d format");
1079 return -1;
1080 }
1081 else if (e < -1022) {
1082 /* Gradual underflow */
1083 f = ldexp(f, 1022 + e);
1084 e = 0;
1085 }
1086 else if (!(e == 0 && f == 0.0)) {
1087 e += 1023;
1088 f -= 1.0; /* Get rid of leading 1 */
1089 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001091 /* fhi receives the high 28 bits;
1092 flo the low 24 bits (== 52 bits) */
1093 f *= 268435456.0; /* 2**28 */
1094 fhi = (long) floor(f); /* Truncate */
1095 f -= (double)fhi;
1096 f *= 16777216.0; /* 2**24 */
1097 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001099 /* First byte */
1100 *p = (s<<7) | (e>>4);
1101 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001103 /* Second byte */
1104 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1105 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001107 /* Third byte */
1108 *p = (unsigned char) ((fhi>>16) & 0xFF);
1109 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001111 /* Fourth byte */
1112 *p = (unsigned char) ((fhi>>8) & 0xFF);
1113 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001115 /* Fifth byte */
1116 *p = (unsigned char) (fhi & 0xFF);
1117 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001119 /* Sixth byte */
1120 *p = (unsigned char) ((flo>>16) & 0xFF);
1121 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001123 /* Seventh byte */
1124 *p = (unsigned char) ((flo>>8) & 0xFF);
1125 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001127 /* Eighth byte */
1128 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001130 if ((*self->write_func)(self, str, 9) < 0)
1131 return -1;
1132 }
1133 else {
1134 char c_str[250];
1135 c_str[0] = FLOAT;
1136 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001138 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1139 return -1;
1140 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001142 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001143}
1144
1145
1146static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001147save_string(Picklerobject *self, PyObject *args, int doput)
1148{
1149 int size, len;
1150 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001152 if ((size = PyString_Size(args)) < 0)
1153 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001155 if (!self->bin) {
1156 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001158 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001160 if (!( repr = PyObject_Repr(args)))
1161 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001163 if ((len = PyString_Size(repr)) < 0)
1164 goto err;
1165 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001167 if ((*self->write_func)(self, &string, 1) < 0)
1168 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001170 if ((*self->write_func)(self, repr_str, len) < 0)
1171 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001173 if ((*self->write_func)(self, "\n", 1) < 0)
1174 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001176 Py_XDECREF(repr);
1177 }
1178 else {
1179 int i;
1180 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001182 if ((size = PyString_Size(args)) < 0)
1183 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001185 if (size < 256) {
1186 c_str[0] = SHORT_BINSTRING;
1187 c_str[1] = size;
1188 len = 2;
1189 }
1190 else {
1191 c_str[0] = BINSTRING;
1192 for (i = 1; i < 5; i++)
1193 c_str[i] = (int)(size >> ((i - 1) * 8));
1194 len = 5;
1195 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 if ((*self->write_func)(self, c_str, len) < 0)
1198 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001200 if (size > 128 && Pdata_Check(self->file)) {
1201 if (write_other(self, NULL, 0) < 0) return -1;
1202 PDATA_APPEND(self->file, args, -1);
1203 }
1204 else {
1205 if ((*self->write_func)(self,
1206 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1207 return -1;
1208 }
1209 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001211 if (doput)
1212 if (put(self, args) < 0)
1213 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001215 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001217 err:
1218 Py_XDECREF(repr);
1219 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001220}
1221
1222
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001223#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001224/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1225 backslash and newline characters to \uXXXX escapes. */
1226static PyObject *
1227modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1228{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001229 PyObject *repr;
1230 char *p;
1231 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001233 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001235 repr = PyString_FromStringAndSize(NULL, 6 * size);
1236 if (repr == NULL)
1237 return NULL;
1238 if (size == 0)
1239 return repr;
1240
1241 p = q = PyString_AS_STRING(repr);
1242 while (size-- > 0) {
1243 Py_UNICODE ch = *s++;
1244 /* Map 16-bit characters to '\uxxxx' */
1245 if (ch >= 256 || ch == '\\' || ch == '\n') {
1246 *p++ = '\\';
1247 *p++ = 'u';
1248 *p++ = hexdigit[(ch >> 12) & 0xf];
1249 *p++ = hexdigit[(ch >> 8) & 0xf];
1250 *p++ = hexdigit[(ch >> 4) & 0xf];
1251 *p++ = hexdigit[ch & 15];
1252 }
1253 /* Copy everything else as-is */
1254 else
1255 *p++ = (char) ch;
1256 }
1257 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001258 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001259 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001260}
1261
1262
Guido van Rossum60456fd1997-04-09 17:36:32 +00001263static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001264save_unicode(Picklerobject *self, PyObject *args, int doput)
1265{
1266 int size, len;
1267 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001269 if (!PyUnicode_Check(args))
1270 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001272 if (!self->bin) {
1273 char *repr_str;
1274 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001275
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001276 repr = modified_EncodeRawUnicodeEscape(
1277 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
1278 if (!repr)
1279 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001281 if ((len = PyString_Size(repr)) < 0)
1282 goto err;
1283 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001285 if ((*self->write_func)(self, &string, 1) < 0)
1286 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001288 if ((*self->write_func)(self, repr_str, len) < 0)
1289 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001291 if ((*self->write_func)(self, "\n", 1) < 0)
1292 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001294 Py_XDECREF(repr);
1295 }
1296 else {
1297 int i;
1298 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300 if (!( repr = PyUnicode_AsUTF8String(args)))
1301 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001303 if ((size = PyString_Size(repr)) < 0)
1304 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001306 c_str[0] = BINUNICODE;
1307 for (i = 1; i < 5; i++)
1308 c_str[i] = (int)(size >> ((i - 1) * 8));
1309 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001311 if ((*self->write_func)(self, c_str, len) < 0)
1312 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001314 if (size > 128 && Pdata_Check(self->file)) {
1315 if (write_other(self, NULL, 0) < 0)
1316 goto err;
1317 PDATA_APPEND(self->file, repr, -1);
1318 }
1319 else {
1320 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1321 size) < 0)
1322 goto err;
1323 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001325 Py_DECREF(repr);
1326 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001327
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001328 if (doput)
1329 if (put(self, args) < 0)
1330 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001332 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001334 err:
1335 Py_XDECREF(repr);
1336 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001337}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001338#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001339
1340
1341static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001342save_tuple(Picklerobject *self, PyObject *args)
1343{
1344 PyObject *element = 0, *py_tuple_id = 0;
1345 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001347 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001349 if ((*self->write_func)(self, &MARKv, 1) < 0)
1350 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001352 if ((len = PyTuple_Size(args)) < 0)
1353 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001355 for (i = 0; i < len; i++) {
1356 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
1357 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001359 if (save(self, element, 0) < 0)
1360 goto finally;
1361 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001363 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
1364 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001366 if (len) {
1367 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1368 if (self->bin) {
1369 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001371 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1372 goto finally;
1373 }
1374 else {
1375 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001377 for (i = 0; i <= len; i++) {
1378 if ((*self->write_func)(self, &pop, 1) < 0)
1379 goto finally;
1380 }
1381 }
Tim Peters84e87f32001-03-17 04:50:51 +00001382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001383 if (get(self, py_tuple_id) < 0)
1384 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001386 res = 0;
1387 goto finally;
1388 }
1389 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001391 if ((*self->write_func)(self, &tuple, 1) < 0) {
1392 goto finally;
1393 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001395 if (put(self, args) < 0)
1396 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001398 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001400 finally:
1401 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001403 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001404}
1405
1406static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001407save_empty_tuple(Picklerobject *self, PyObject *args)
1408{
1409 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001411 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001412}
1413
1414
1415static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001416save_list(Picklerobject *self, PyObject *args)
1417{
1418 PyObject *element = 0;
1419 int s_len, len, i, using_appends, res = -1;
1420 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001422 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001424 if (self->fast && !fast_save_enter(self, args))
1425 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001427 if (self->bin) {
1428 s[0] = EMPTY_LIST;
1429 s_len = 1;
1430 }
1431 else {
1432 s[0] = MARK;
1433 s[1] = LIST;
1434 s_len = 2;
1435 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001437 if ((len = PyList_Size(args)) < 0)
1438 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001440 if ((*self->write_func)(self, s, s_len) < 0)
1441 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001443 if (len == 0) {
1444 if (put(self, args) < 0)
1445 goto finally;
1446 }
1447 else {
1448 if (put2(self, args) < 0)
1449 goto finally;
1450 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001452 if ((using_appends = (self->bin && (len > 1))))
1453 if ((*self->write_func)(self, &MARKv, 1) < 0)
1454 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001456 for (i = 0; i < len; i++) {
1457 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
1458 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001460 if (save(self, element, 0) < 0)
1461 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001462
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001463 if (!using_appends) {
1464 if ((*self->write_func)(self, &append, 1) < 0)
1465 goto finally;
1466 }
1467 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001469 if (using_appends) {
1470 if ((*self->write_func)(self, &appends, 1) < 0)
1471 goto finally;
1472 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001474 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001476 finally:
1477 if (self->fast && !fast_save_leave(self, args))
1478 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001480 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001481}
1482
1483
Guido van Rossum60456fd1997-04-09 17:36:32 +00001484static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001485save_dict(Picklerobject *self, PyObject *args)
1486{
1487 PyObject *key = 0, *value = 0;
1488 int i, len, res = -1, using_setitems;
1489 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001491 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001493 if (self->fast && !fast_save_enter(self, args))
1494 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001496 if (self->bin) {
1497 s[0] = EMPTY_DICT;
1498 len = 1;
1499 }
1500 else {
1501 s[0] = MARK;
1502 s[1] = DICT;
1503 len = 2;
1504 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001506 if ((*self->write_func)(self, s, len) < 0)
1507 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001509 if ((len = PyDict_Size(args)) < 0)
1510 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001512 if (len == 0) {
1513 if (put(self, args) < 0)
1514 goto finally;
1515 }
1516 else {
1517 if (put2(self, args) < 0)
1518 goto finally;
1519 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001521 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1522 if ((*self->write_func)(self, &MARKv, 1) < 0)
1523 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001525 i = 0;
1526 while (PyDict_Next(args, &i, &key, &value)) {
1527 if (save(self, key, 0) < 0)
1528 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001530 if (save(self, value, 0) < 0)
1531 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001533 if (!using_setitems) {
1534 if ((*self->write_func)(self, &setitem, 1) < 0)
1535 goto finally;
1536 }
1537 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001538
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001539 if (using_setitems) {
1540 if ((*self->write_func)(self, &setitems, 1) < 0)
1541 goto finally;
1542 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001544 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001546 finally:
1547 if (self->fast && !fast_save_leave(self, args))
1548 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001550 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001551}
1552
1553
Tim Peters84e87f32001-03-17 04:50:51 +00001554static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001555save_inst(Picklerobject *self, PyObject *args)
1556{
1557 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1558 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1559 char *module_str, *name_str;
1560 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001562 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001564 if (self->fast && !fast_save_enter(self, args))
1565 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001567 if ((*self->write_func)(self, &MARKv, 1) < 0)
1568 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001570 if (!( class = PyObject_GetAttr(args, __class___str)))
1571 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001573 if (self->bin) {
1574 if (save(self, class, 0) < 0)
1575 goto finally;
1576 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001578 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1579 PyObject *element = 0;
1580 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001582 if (!( class_args =
1583 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
1584 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001586 if ((len = PyObject_Size(class_args)) < 0)
1587 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001589 for (i = 0; i < len; i++) {
1590 if (!( element = PySequence_GetItem(class_args, i)))
1591 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001592
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001593 if (save(self, element, 0) < 0) {
1594 Py_DECREF(element);
1595 goto finally;
1596 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001598 Py_DECREF(element);
1599 }
1600 }
1601 else {
1602 PyErr_Clear();
1603 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001605 if (!self->bin) {
1606 if (!( name = ((PyClassObject *)class)->cl_name )) {
1607 PyErr_SetString(PicklingError, "class has no name");
1608 goto finally;
1609 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001611 if (!( module = whichmodule(class, name)))
1612 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001613
Tim Peters84e87f32001-03-17 04:50:51 +00001614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001615 if ((module_size = PyString_Size(module)) < 0 ||
1616 (name_size = PyString_Size(name)) < 0)
1617 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001619 module_str = PyString_AS_STRING((PyStringObject *)module);
1620 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001622 if ((*self->write_func)(self, &inst, 1) < 0)
1623 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001625 if ((*self->write_func)(self, module_str, module_size) < 0)
1626 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001628 if ((*self->write_func)(self, "\n", 1) < 0)
1629 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001631 if ((*self->write_func)(self, name_str, name_size) < 0)
1632 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001634 if ((*self->write_func)(self, "\n", 1) < 0)
1635 goto finally;
1636 }
1637 else if ((*self->write_func)(self, &obj, 1) < 0) {
1638 goto finally;
1639 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001641 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1642 state = PyObject_Call(getstate_func, empty_tuple, NULL);
1643 if (!state)
1644 goto finally;
1645 }
1646 else {
1647 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001649 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1650 PyErr_Clear();
1651 res = 0;
1652 goto finally;
1653 }
1654 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001655
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001656 if (!PyDict_Check(state)) {
1657 if (put2(self, args) < 0)
1658 goto finally;
1659 }
1660 else {
1661 if (put(self, args) < 0)
1662 goto finally;
1663 }
Tim Peters84e87f32001-03-17 04:50:51 +00001664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001665 if (save(self, state, 0) < 0)
1666 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001668 if ((*self->write_func)(self, &build, 1) < 0)
1669 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001671 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001673 finally:
1674 if (self->fast && !fast_save_leave(self, args))
1675 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001676
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001677 Py_XDECREF(module);
1678 Py_XDECREF(class);
1679 Py_XDECREF(state);
1680 Py_XDECREF(getinitargs_func);
1681 Py_XDECREF(getstate_func);
1682 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001684 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001685}
1686
1687
Guido van Rossum60456fd1997-04-09 17:36:32 +00001688static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001689save_global(Picklerobject *self, PyObject *args, PyObject *name)
1690{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001691 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001692 char *name_str, *module_str;
1693 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001695 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001697 if (name) {
1698 global_name = name;
1699 Py_INCREF(global_name);
1700 }
1701 else {
1702 if (!( global_name = PyObject_GetAttr(args, __name___str)))
1703 goto finally;
1704 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001706 if (!( module = whichmodule(args, global_name)))
1707 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001709 if ((module_size = PyString_Size(module)) < 0 ||
1710 (name_size = PyString_Size(global_name)) < 0)
1711 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001713 module_str = PyString_AS_STRING((PyStringObject *)module);
1714 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001715
Guido van Rossum75bfd052002-12-24 18:10:07 +00001716 /* XXX This can be doing a relative import. Clearly it shouldn't,
1717 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001718 mod = PyImport_ImportModule(module_str);
1719 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001720 cPickle_ErrFormat(PicklingError,
1721 "Can't pickle %s: it's not found as %s.%s",
1722 "OSS", args, module, global_name);
1723 goto finally;
1724 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001725 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001726 if (klass == NULL) {
1727 cPickle_ErrFormat(PicklingError,
1728 "Can't pickle %s: it's not found as %s.%s",
1729 "OSS", args, module, global_name);
1730 goto finally;
1731 }
1732 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001733 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001734 cPickle_ErrFormat(PicklingError,
1735 "Can't pickle %s: it's not the same object as %s.%s",
1736 "OSS", args, module, global_name);
1737 goto finally;
1738 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001739 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001741 if ((*self->write_func)(self, &global, 1) < 0)
1742 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001743
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001744 if ((*self->write_func)(self, module_str, module_size) < 0)
1745 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001747 if ((*self->write_func)(self, "\n", 1) < 0)
1748 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001750 if ((*self->write_func)(self, name_str, name_size) < 0)
1751 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001753 if ((*self->write_func)(self, "\n", 1) < 0)
1754 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001756 if (put(self, args) < 0)
1757 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001759 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001761 finally:
1762 Py_XDECREF(module);
1763 Py_XDECREF(global_name);
1764 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001766 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001767}
1768
Guido van Rossum60456fd1997-04-09 17:36:32 +00001769static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001770save_pers(Picklerobject *self, PyObject *args, PyObject *f)
1771{
1772 PyObject *pid = 0;
1773 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001775 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001777 Py_INCREF(args);
1778 ARG_TUP(self, args);
1779 if (self->arg) {
1780 pid = PyObject_Call(f, self->arg, NULL);
1781 FREE_ARG_TUP(self);
1782 }
1783 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001785 if (pid != Py_None) {
1786 if (!self->bin) {
1787 if (!PyString_Check(pid)) {
1788 PyErr_SetString(PicklingError,
1789 "persistent id must be string");
1790 goto finally;
1791 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001793 if ((*self->write_func)(self, &persid, 1) < 0)
1794 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001796 if ((size = PyString_Size(pid)) < 0)
1797 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001799 if ((*self->write_func)(self,
1800 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1801 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001803 if ((*self->write_func)(self, "\n", 1) < 0)
1804 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001806 res = 1;
1807 goto finally;
1808 }
1809 else if (save(self, pid, 1) >= 0) {
1810 if ((*self->write_func)(self, &binpersid, 1) < 0)
1811 res = -1;
1812 else
1813 res = 1;
1814 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001816 goto finally;
1817 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001819 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001821 finally:
1822 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001824 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001825}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001826
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001827
Tim Peters84e87f32001-03-17 04:50:51 +00001828static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001829save_reduce(Picklerobject *self, PyObject *callable,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001830 PyObject *tup, PyObject *state, PyObject *ob)
1831{
1832 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001834 if (save(self, callable, 0) < 0)
1835 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001837 if (save(self, tup, 0) < 0)
1838 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001840 if ((*self->write_func)(self, &reduce, 1) < 0)
1841 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001843 if (ob != NULL) {
1844 if (state && !PyDict_Check(state)) {
1845 if (put2(self, ob) < 0)
1846 return -1;
1847 }
1848 else {
1849 if (put(self, ob) < 0)
1850 return -1;
1851 }
1852 }
Tim Peters84e87f32001-03-17 04:50:51 +00001853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001854 if (state) {
1855 if (save(self, state, 0) < 0)
1856 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001858 if ((*self->write_func)(self, &build, 1) < 0)
1859 return -1;
1860 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001862 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001863}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001864
Guido van Rossum60456fd1997-04-09 17:36:32 +00001865static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001866save(Picklerobject *self, PyObject *args, int pers_save)
1867{
1868 PyTypeObject *type;
1869 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1870 *callable = 0, *state = 0;
1871 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001872
Martin v. Löwis5a395302002-08-04 08:20:23 +00001873 if (self->nesting++ > Py_GetRecursionLimit()){
1874 PyErr_SetString(PyExc_RuntimeError,
1875 "maximum recursion depth exceeded");
1876 goto finally;
1877 }
1878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001879 if (!pers_save && self->pers_func) {
1880 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1881 res = tmp;
1882 goto finally;
1883 }
1884 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001886 if (args == Py_None) {
1887 res = save_none(self, args);
1888 goto finally;
1889 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001891 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001892
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001893 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001894 case 'b':
1895 if (args == Py_False || args == Py_True) {
1896 res = save_bool(self, args);
1897 goto finally;
1898 }
1899 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001900 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001901 if (type == &PyInt_Type) {
1902 res = save_int(self, args);
1903 goto finally;
1904 }
1905 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001906
Guido van Rossum60456fd1997-04-09 17:36:32 +00001907 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001908 if (type == &PyLong_Type) {
1909 res = save_long(self, args);
1910 goto finally;
1911 }
1912 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001913
Guido van Rossum60456fd1997-04-09 17:36:32 +00001914 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001915 if (type == &PyFloat_Type) {
1916 res = save_float(self, args);
1917 goto finally;
1918 }
1919 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001920
Guido van Rossum60456fd1997-04-09 17:36:32 +00001921 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001922 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
1923 if (self->bin) res = save_empty_tuple(self, args);
1924 else res = save_tuple(self, args);
1925 goto finally;
1926 }
1927 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001928
Guido van Rossum60456fd1997-04-09 17:36:32 +00001929 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001930 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
1931 res = save_string(self, args, 0);
1932 goto finally;
1933 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001934
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001935#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001936 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001937 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1938 res = save_unicode(self, args, 0);
1939 goto finally;
1940 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001941#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001942 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001944 if (args->ob_refcnt > 1) {
1945 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
1946 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001948 if (PyDict_GetItem(self->memo, py_ob_id)) {
1949 if (get(self, py_ob_id) < 0)
1950 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001952 res = 0;
1953 goto finally;
1954 }
1955 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001957 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001958 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001959 if (type == &PyString_Type) {
1960 res = save_string(self, args, 1);
1961 goto finally;
1962 }
1963 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001964
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001965#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001966 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001967 if (type == &PyUnicode_Type) {
1968 res = save_unicode(self, args, 1);
1969 goto finally;
1970 }
1971 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001972#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001973
Guido van Rossum60456fd1997-04-09 17:36:32 +00001974 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001975 if (type == &PyTuple_Type) {
1976 res = save_tuple(self, args);
1977 goto finally;
1978 }
1979 if (type == &PyType_Type) {
1980 res = save_global(self, args, NULL);
1981 goto finally;
1982 }
1983 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001984
Guido van Rossum60456fd1997-04-09 17:36:32 +00001985 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001986 if (type == &PyList_Type) {
1987 res = save_list(self, args);
1988 goto finally;
1989 }
1990 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001991
1992 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001993 if (type == &PyDict_Type) {
1994 res = save_dict(self, args);
1995 goto finally;
1996 }
1997 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001998
1999 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002000 if (type == &PyInstance_Type) {
2001 res = save_inst(self, args);
2002 goto finally;
2003 }
2004 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002005
2006 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002007 if (type == &PyClass_Type) {
2008 res = save_global(self, args, NULL);
2009 goto finally;
2010 }
2011 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002012
2013 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002014 if (type == &PyFunction_Type) {
2015 res = save_global(self, args, NULL);
2016 goto finally;
2017 }
2018 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002019
2020 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002021 if (type == &PyCFunction_Type) {
2022 res = save_global(self, args, NULL);
2023 goto finally;
2024 }
2025 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002027 if (!pers_save && self->inst_pers_func) {
2028 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2029 res = tmp;
2030 goto finally;
2031 }
2032 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002033
Jeremy Hylton39c61162002-07-16 19:47:43 +00002034 if (PyType_IsSubtype(type, &PyType_Type)) {
2035 res = save_global(self, args, NULL);
2036 goto finally;
2037 }
2038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002039 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2040 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002042 Py_INCREF(args);
2043 ARG_TUP(self, args);
2044 if (self->arg) {
2045 t = PyObject_Call(__reduce__, self->arg, NULL);
2046 FREE_ARG_TUP(self);
2047 }
2048 if (! t) goto finally;
2049 }
2050 else {
2051 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002053 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2054 t = PyObject_Call(__reduce__, empty_tuple, NULL);
2055 if (!t)
2056 goto finally;
2057 }
2058 else {
2059 PyErr_Clear();
2060 }
2061 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002063 if (t) {
2064 if (PyString_Check(t)) {
2065 res = save_global(self, args, t);
2066 goto finally;
2067 }
Tim Peters84e87f32001-03-17 04:50:51 +00002068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002069 if (!PyTuple_Check(t)) {
2070 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2071 "be a tuple", "O", __reduce__);
2072 goto finally;
2073 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002075 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002077 if ((size != 3) && (size != 2)) {
2078 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2079 "contain only two or three elements", "O", __reduce__);
2080 goto finally;
2081 }
Tim Peters84e87f32001-03-17 04:50:51 +00002082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002083 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002085 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002087 if (size > 2) {
2088 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002089 if (state == Py_None)
2090 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002091 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002093 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2094 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2095 "returned by %s must be a tuple", "O", __reduce__);
2096 goto finally;
2097 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002099 res = save_reduce(self, callable, arg_tup, state, args);
2100 goto finally;
2101 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002103 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002105 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002106 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002107 Py_XDECREF(py_ob_id);
2108 Py_XDECREF(__reduce__);
2109 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002111 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002112}
2113
2114
2115static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002116dump(Picklerobject *self, PyObject *args)
2117{
2118 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002120 if (save(self, args, 0) < 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, &stop, 1) < 0)
2124 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002126 if ((*self->write_func)(self, NULL, 0) < 0)
2127 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002129 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002130}
2131
2132static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002133Pickle_clear_memo(Picklerobject *self, PyObject *args)
2134{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002135 if (self->memo)
2136 PyDict_Clear(self->memo);
2137 Py_INCREF(Py_None);
2138 return Py_None;
2139}
2140
2141static PyObject *
2142Pickle_getvalue(Picklerobject *self, PyObject *args)
2143{
2144 int l, i, rsize, ssize, clear=1, lm;
2145 long ik;
2146 PyObject *k, *r;
2147 char *s, *p, *have_get;
2148 Pdata *data;
2149
2150 /* Can be called by Python code or C code */
2151 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2152 return NULL;
2153
2154 /* Check to make sure we are based on a list */
2155 if (! Pdata_Check(self->file)) {
2156 PyErr_SetString(PicklingError,
2157 "Attempt to getvalue() a non-list-based pickler");
2158 return NULL;
2159 }
2160
2161 /* flush write buffer */
2162 if (write_other(self, NULL, 0) < 0) return NULL;
2163
2164 data=(Pdata*)self->file;
2165 l=data->length;
2166
2167 /* set up an array to hold get/put status */
2168 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2169 lm++;
2170 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2171 memset(have_get,0,lm);
2172
2173 /* Scan for gets. */
2174 for (rsize=0, i=l; --i >= 0; ) {
2175 k=data->data[i];
2176
2177 if (PyString_Check(k)) {
2178 rsize += PyString_GET_SIZE(k);
2179 }
2180
2181 else if (PyInt_Check(k)) { /* put */
2182 ik=PyInt_AS_LONG((PyIntObject*)k);
2183 if (ik >= lm || ik==0) {
2184 PyErr_SetString(PicklingError,
2185 "Invalid get data");
2186 return NULL;
2187 }
2188 if (have_get[ik]) { /* with matching get */
2189 if (ik < 256) rsize += 2;
2190 else rsize+=5;
2191 }
2192 }
2193
2194 else if (! (PyTuple_Check(k) &&
2195 PyTuple_GET_SIZE(k) == 2 &&
2196 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2197 ) {
2198 PyErr_SetString(PicklingError,
2199 "Unexpected data in internal list");
2200 return NULL;
2201 }
2202
2203 else { /* put */
2204 ik=PyInt_AS_LONG((PyIntObject*)k);
2205 if (ik >= lm || ik==0) {
2206 PyErr_SetString(PicklingError,
2207 "Invalid get data");
2208 return NULL;
2209 }
2210 have_get[ik]=1;
2211 if (ik < 256) rsize += 2;
2212 else rsize+=5;
2213 }
2214
2215 }
2216
2217 /* Now generate the result */
2218 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2219 s=PyString_AS_STRING((PyStringObject*)r);
2220
2221 for (i=0; i<l; i++) {
2222 k=data->data[i];
2223
2224 if (PyString_Check(k)) {
2225 ssize=PyString_GET_SIZE(k);
2226 if (ssize) {
2227 p=PyString_AS_STRING((PyStringObject*)k);
2228 while (--ssize >= 0) *s++=*p++;
2229 }
2230 }
2231
2232 else if (PyTuple_Check(k)) { /* get */
2233 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2234 if (ik < 256) {
2235 *s++ = BINGET;
2236 *s++ = (int)(ik & 0xff);
2237 }
2238 else {
2239 *s++ = LONG_BINGET;
2240 *s++ = (int)(ik & 0xff);
2241 *s++ = (int)((ik >> 8) & 0xff);
2242 *s++ = (int)((ik >> 16) & 0xff);
2243 *s++ = (int)((ik >> 24) & 0xff);
2244 }
2245 }
2246
2247 else { /* put */
2248 ik=PyInt_AS_LONG((PyIntObject*)k);
2249
2250 if (have_get[ik]) { /* with matching get */
2251 if (ik < 256) {
2252 *s++ = BINPUT;
2253 *s++ = (int)(ik & 0xff);
2254 }
2255 else {
2256 *s++ = LONG_BINPUT;
2257 *s++ = (int)(ik & 0xff);
2258 *s++ = (int)((ik >> 8) & 0xff);
2259 *s++ = (int)((ik >> 16) & 0xff);
2260 *s++ = (int)((ik >> 24) & 0xff);
2261 }
2262 }
2263 }
2264
2265 }
2266
2267 if (clear) {
2268 PyDict_Clear(self->memo);
2269 Pdata_clear(data,0);
2270 }
2271
2272 free(have_get);
2273 return r;
2274 err:
2275 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002276 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002277}
2278
2279static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002280Pickler_dump(Picklerobject *self, PyObject *args)
2281{
2282 PyObject *ob;
2283 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002285 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
2286 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002288 if (dump(self, ob) < 0)
2289 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002291 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002293 /* XXX Why does dump() return self? */
2294 Py_INCREF(self);
2295 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002296}
2297
2298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002299static struct PyMethodDef Pickler_methods[] =
2300{
Neal Norwitzb0493252002-03-31 14:44:22 +00002301 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002302 PyDoc_STR("dump(object) -- "
2303 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002304 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002305 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002306 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002307 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002308 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002309};
2310
2311
2312static Picklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002313newPicklerobject(PyObject *file, int bin)
2314{
2315 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002317 if (!( self = PyObject_New(Picklerobject, &Picklertype)))
2318 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002319
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002320 self->fp = NULL;
2321 self->write = NULL;
2322 self->memo = NULL;
2323 self->arg = NULL;
2324 self->pers_func = NULL;
2325 self->inst_pers_func = NULL;
2326 self->write_buf = NULL;
2327 self->bin = bin;
2328 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002329 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002330 self->fast_container = 0;
2331 self->fast_memo = NULL;
2332 self->buf_size = 0;
2333 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002335 if (file)
2336 Py_INCREF(file);
2337 else
2338 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002340 if (!( self->file = file ))
2341 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002343 if (!( self->memo = PyDict_New()))
2344 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002346 if (PyFile_Check(file)) {
2347 self->fp = PyFile_AsFile(file);
2348 if (self->fp == NULL) {
2349 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2350 goto err;
2351 }
2352 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002353 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002354 else if (PycStringIO_OutputCheck(file)) {
2355 self->write_func = write_cStringIO;
2356 }
2357 else if (file == Py_None) {
2358 self->write_func = write_none;
2359 }
2360 else {
2361 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002363 if (! Pdata_Check(file)) {
2364 self->write = PyObject_GetAttr(file, write_str);
2365 if (!self->write) {
2366 PyErr_Clear();
2367 PyErr_SetString(PyExc_TypeError,
2368 "argument must have 'write' "
2369 "attribute");
2370 goto err;
2371 }
2372 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002374 if (!( self->write_buf =
2375 (char *)malloc(WRITE_BUF_SIZE * sizeof(char)))) {
2376 PyErr_NoMemory();
2377 goto err;
2378 }
2379 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002381 if (PyEval_GetRestricted()) {
2382 /* Restricted execution, get private tables */
2383 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002385 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2386 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2387 Py_DECREF(m);
2388 if (!( self->dispatch_table )) goto err;
2389 }
2390 else {
2391 self->dispatch_table=dispatch_table;
2392 Py_INCREF(dispatch_table);
2393 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002395 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002397 err:
2398 Py_DECREF((PyObject *)self);
2399 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002400}
2401
2402
2403static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002404get_Pickler(PyObject *self, PyObject *args)
2405{
2406 PyObject *file = NULL;
2407 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002409 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
2410 PyErr_Clear();
2411 bin = 0;
2412 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2413 return NULL;
2414 }
2415 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002416}
2417
2418
2419static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002420Pickler_dealloc(Picklerobject *self)
2421{
2422 Py_XDECREF(self->write);
2423 Py_XDECREF(self->memo);
2424 Py_XDECREF(self->fast_memo);
2425 Py_XDECREF(self->arg);
2426 Py_XDECREF(self->file);
2427 Py_XDECREF(self->pers_func);
2428 Py_XDECREF(self->inst_pers_func);
2429 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002431 if (self->write_buf) {
2432 free(self->write_buf);
2433 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002435 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002436}
2437
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002438static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002439Pickler_get_pers_func(Picklerobject *p)
2440{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002441 if (p->pers_func == NULL)
2442 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2443 else
2444 Py_INCREF(p->pers_func);
2445 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002446}
2447
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002448static int
2449Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2450{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002451 if (v == NULL) {
2452 PyErr_SetString(PyExc_TypeError,
2453 "attribute deletion is not supported");
2454 return -1;
2455 }
2456 Py_XDECREF(p->pers_func);
2457 Py_INCREF(v);
2458 p->pers_func = v;
2459 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002460}
2461
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002462static int
2463Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2464{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002465 if (v == NULL) {
2466 PyErr_SetString(PyExc_TypeError,
2467 "attribute deletion is not supported");
2468 return -1;
2469 }
2470 Py_XDECREF(p->inst_pers_func);
2471 Py_INCREF(v);
2472 p->inst_pers_func = v;
2473 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002474}
2475
2476static PyObject *
2477Pickler_get_memo(Picklerobject *p)
2478{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002479 if (p->memo == NULL)
2480 PyErr_SetString(PyExc_AttributeError, "memo");
2481 else
2482 Py_INCREF(p->memo);
2483 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002484}
2485
2486static int
2487Pickler_set_memo(Picklerobject *p, PyObject *v)
2488{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002489 if (v == NULL) {
2490 PyErr_SetString(PyExc_TypeError,
2491 "attribute deletion is not supported");
2492 return -1;
2493 }
2494 if (!PyDict_Check(v)) {
2495 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2496 return -1;
2497 }
2498 Py_XDECREF(p->memo);
2499 Py_INCREF(v);
2500 p->memo = v;
2501 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002502}
2503
2504static PyObject *
2505Pickler_get_error(Picklerobject *p)
2506{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002507 /* why is this an attribute on the Pickler? */
2508 Py_INCREF(PicklingError);
2509 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002510}
2511
2512static PyMemberDef Pickler_members[] = {
2513 {"binary", T_INT, offsetof(Picklerobject, bin)},
2514 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002515 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002516};
2517
2518static PyGetSetDef Pickler_getsets[] = {
2519 {"persistent_id", (getter)Pickler_get_pers_func,
2520 (setter)Pickler_set_pers_func},
2521 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2522 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002523 {"PicklingError", (getter)Pickler_get_error, NULL},
2524 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002525};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002526
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002527PyDoc_STRVAR(Picklertype__doc__,
2528"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002529
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002530static PyTypeObject Picklertype = {
2531 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002532 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002533 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002534 sizeof(Picklerobject), /*tp_basicsize*/
2535 0,
2536 (destructor)Pickler_dealloc, /* tp_dealloc */
2537 0, /* tp_print */
2538 0, /* tp_getattr */
2539 0, /* tp_setattr */
2540 0, /* tp_compare */
2541 0, /* tp_repr */
2542 0, /* tp_as_number */
2543 0, /* tp_as_sequence */
2544 0, /* tp_as_mapping */
2545 0, /* tp_hash */
2546 0, /* tp_call */
2547 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002548 PyObject_GenericGetAttr, /* tp_getattro */
2549 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002550 0, /* tp_as_buffer */
2551 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2552 Picklertype__doc__, /* tp_doc */
2553 0, /* tp_traverse */
2554 0, /* tp_clear */
2555 0, /* tp_richcompare */
2556 0, /* tp_weaklistoffset */
2557 0, /* tp_iter */
2558 0, /* tp_iternext */
2559 Pickler_methods, /* tp_methods */
2560 Pickler_members, /* tp_members */
2561 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002562};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002563
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002564static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002565find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
2566{
2567 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002569 if (fc) {
2570 if (fc==Py_None) {
2571 PyErr_SetString(UnpicklingError,
2572 "Global and instance pickles are not supported.");
2573 return NULL;
2574 }
2575 return PyObject_CallFunction(fc, "OO", py_module_name,
2576 py_global_name);
2577 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002579 module = PySys_GetObject("modules");
2580 if (module == NULL)
2581 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002583 module = PyDict_GetItem(module, py_module_name);
2584 if (module == NULL) {
2585 module = PyImport_Import(py_module_name);
2586 if (!module)
2587 return NULL;
2588 global = PyObject_GetAttr(module, py_global_name);
2589 Py_DECREF(module);
2590 }
2591 else
2592 global = PyObject_GetAttr(module, py_global_name);
2593 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002594}
2595
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002596static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002597marker(Unpicklerobject *self)
2598{
2599 if (self->num_marks < 1) {
2600 PyErr_SetString(UnpicklingError, "could not find MARK");
2601 return -1;
2602 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002603
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002604 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002605}
2606
Tim Peters84e87f32001-03-17 04:50:51 +00002607
Guido van Rossum60456fd1997-04-09 17:36:32 +00002608static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002609load_none(Unpicklerobject *self)
2610{
2611 PDATA_APPEND(self->stack, Py_None, -1);
2612 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002613}
2614
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002615static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002616bad_readline(void)
2617{
2618 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2619 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002620}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002621
2622static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002623load_int(Unpicklerobject *self)
2624{
2625 PyObject *py_int = 0;
2626 char *endptr, *s;
2627 int len, res = -1;
2628 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002630 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2631 if (len < 2) return bad_readline();
2632 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002634 errno = 0;
2635 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002637 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2638 /* Hm, maybe we've got something long. Let's try reading
2639 it as a Python long object. */
2640 errno = 0;
2641 py_int = PyLong_FromString(s, NULL, 0);
2642 if (py_int == NULL) {
2643 PyErr_SetString(PyExc_ValueError,
2644 "could not convert string to int");
2645 goto finally;
2646 }
2647 }
2648 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002649 if (len == 3 && (l == 0 || l == 1)) {
2650 if (!( py_int = PyBool_FromLong(l))) goto finally;
2651 }
2652 else {
2653 if (!( py_int = PyInt_FromLong(l))) goto finally;
2654 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002655 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002657 free(s);
2658 PDATA_PUSH(self->stack, py_int, -1);
2659 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002661 finally:
2662 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002664 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002665}
2666
2667
Tim Peters84e87f32001-03-17 04:50:51 +00002668static long
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002669calc_binint(char *s, int x)
2670{
2671 unsigned char c;
2672 int i;
2673 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002675 for (i = 0, l = 0L; i < x; i++) {
2676 c = (unsigned char)s[i];
2677 l |= (long)c << (i * 8);
2678 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002679#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002680 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2681 * is signed, so on a box with longs bigger than 4 bytes we need
2682 * to extend a BININT's sign bit to the full width.
2683 */
2684 if (x == 4 && l & (1L << 31))
2685 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002686#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002687 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002688}
2689
2690
2691static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002692load_binintx(Unpicklerobject *self, char *s, int x)
2693{
2694 PyObject *py_int = 0;
2695 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002697 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002699 if (!( py_int = PyInt_FromLong(l)))
2700 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002702 PDATA_PUSH(self->stack, py_int, -1);
2703 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002704}
2705
2706
2707static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002708load_binint(Unpicklerobject *self)
2709{
2710 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002712 if ((*self->read_func)(self, &s, 4) < 0)
2713 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002715 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002716}
2717
2718
2719static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002720load_binint1(Unpicklerobject *self)
2721{
2722 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002724 if ((*self->read_func)(self, &s, 1) < 0)
2725 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002727 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002728}
2729
2730
2731static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002732load_binint2(Unpicklerobject *self)
2733{
2734 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002736 if ((*self->read_func)(self, &s, 2) < 0)
2737 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002739 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002740}
Tim Peters84e87f32001-03-17 04:50:51 +00002741
Guido van Rossum60456fd1997-04-09 17:36:32 +00002742static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002743load_long(Unpicklerobject *self)
2744{
2745 PyObject *l = 0;
2746 char *end, *s;
2747 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002749 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2750 if (len < 2) return bad_readline();
2751 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002753 if (!( l = PyLong_FromString(s, &end, 0)))
2754 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002756 free(s);
2757 PDATA_PUSH(self->stack, l, -1);
2758 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002760 finally:
2761 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002763 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002764}
2765
Tim Peters84e87f32001-03-17 04:50:51 +00002766
Guido van Rossum60456fd1997-04-09 17:36:32 +00002767static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002768load_float(Unpicklerobject *self)
2769{
2770 PyObject *py_float = 0;
2771 char *endptr, *s;
2772 int len, res = -1;
2773 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002775 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2776 if (len < 2) return bad_readline();
2777 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002779 errno = 0;
2780 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002782 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2783 PyErr_SetString(PyExc_ValueError,
2784 "could not convert string to float");
2785 goto finally;
2786 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002788 if (!( py_float = PyFloat_FromDouble(d)))
2789 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002791 free(s);
2792 PDATA_PUSH(self->stack, py_float, -1);
2793 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002795 finally:
2796 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002798 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002799}
2800
Guido van Rossum60456fd1997-04-09 17:36:32 +00002801static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002802load_binfloat(Unpicklerobject *self)
2803{
2804 PyObject *py_float = 0;
2805 int s, e;
2806 long fhi, flo;
2807 double x;
2808 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002810 if ((*self->read_func)(self, &p, 8) < 0)
2811 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002813 /* First byte */
2814 s = (*p>>7) & 1;
2815 e = (*p & 0x7F) << 4;
2816 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002818 /* Second byte */
2819 e |= (*p>>4) & 0xF;
2820 fhi = (*p & 0xF) << 24;
2821 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002823 /* Third byte */
2824 fhi |= (*p & 0xFF) << 16;
2825 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002827 /* Fourth byte */
2828 fhi |= (*p & 0xFF) << 8;
2829 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002831 /* Fifth byte */
2832 fhi |= *p & 0xFF;
2833 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002835 /* Sixth byte */
2836 flo = (*p & 0xFF) << 16;
2837 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002839 /* Seventh byte */
2840 flo |= (*p & 0xFF) << 8;
2841 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002843 /* Eighth byte */
2844 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002846 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2847 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002849 /* XXX This sadly ignores Inf/NaN */
2850 if (e == 0)
2851 e = -1022;
2852 else {
2853 x += 1.0;
2854 e -= 1023;
2855 }
2856 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002858 if (s)
2859 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002861 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002863 PDATA_PUSH(self->stack, py_float, -1);
2864 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002865}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002866
2867static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002868load_string(Unpicklerobject *self)
2869{
2870 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002871 int len, res = -1;
2872 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002874 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2875 if (len < 2) return bad_readline();
2876 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002877
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002878
2879 /* Strip outermost quotes */
2880 while (s[len-1] <= ' ')
2881 len--;
2882 if(s[0]=='"' && s[len-1]=='"'){
2883 s[len-1] = '\0';
2884 p = s + 1 ;
2885 len -= 2;
2886 } else if(s[0]=='\'' && s[len-1]=='\''){
2887 s[len-1] = '\0';
2888 p = s + 1 ;
2889 len -= 2;
2890 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002891 goto insecure;
2892 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002893
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002894 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
2895 if (str) {
2896 PDATA_PUSH(self->stack, str, -1);
2897 res = 0;
2898 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002899 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002900 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002902 insecure:
2903 free(s);
2904 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2905 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002906}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002907
2908
2909static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002910load_binstring(Unpicklerobject *self)
2911{
2912 PyObject *py_string = 0;
2913 long l;
2914 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002916 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002917
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002918 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002919
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002920 if ((*self->read_func)(self, &s, l) < 0)
2921 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002922
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002923 if (!( py_string = PyString_FromStringAndSize(s, l)))
2924 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002926 PDATA_PUSH(self->stack, py_string, -1);
2927 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002928}
2929
2930
2931static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002932load_short_binstring(Unpicklerobject *self)
2933{
2934 PyObject *py_string = 0;
2935 unsigned char l;
2936 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002938 if ((*self->read_func)(self, &s, 1) < 0)
2939 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002941 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002945 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002947 PDATA_PUSH(self->stack, py_string, -1);
2948 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002949}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002950
2951
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002952#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002953static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002954load_unicode(Unpicklerobject *self)
2955{
2956 PyObject *str = 0;
2957 int len, res = -1;
2958 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002960 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2961 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002963 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
2964 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002966 PDATA_PUSH(self->stack, str, -1);
2967 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002969 finally:
2970 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002971}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002972#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002973
2974
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002975#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002976static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002977load_binunicode(Unpicklerobject *self)
2978{
2979 PyObject *unicode;
2980 long l;
2981 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002983 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002985 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002987 if ((*self->read_func)(self, &s, l) < 0)
2988 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002990 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
2991 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002993 PDATA_PUSH(self->stack, unicode, -1);
2994 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002995}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002996#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002997
2998
2999static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003000load_tuple(Unpicklerobject *self)
3001{
3002 PyObject *tup;
3003 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003004
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003005 if ((i = marker(self)) < 0) return -1;
3006 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3007 PDATA_PUSH(self->stack, tup, -1);
3008 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003009}
3010
3011static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003012load_empty_tuple(Unpicklerobject *self)
3013{
3014 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003016 if (!( tup=PyTuple_New(0))) return -1;
3017 PDATA_PUSH(self->stack, tup, -1);
3018 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003019}
3020
3021static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003022load_empty_list(Unpicklerobject *self)
3023{
3024 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003026 if (!( list=PyList_New(0))) return -1;
3027 PDATA_PUSH(self->stack, list, -1);
3028 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003029}
3030
3031static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003032load_empty_dict(Unpicklerobject *self)
3033{
3034 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003036 if (!( dict=PyDict_New())) return -1;
3037 PDATA_PUSH(self->stack, dict, -1);
3038 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003039}
3040
3041
3042static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003043load_list(Unpicklerobject *self)
3044{
3045 PyObject *list = 0;
3046 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003048 if ((i = marker(self)) < 0) return -1;
3049 if (!( list=Pdata_popList(self->stack, i))) return -1;
3050 PDATA_PUSH(self->stack, list, -1);
3051 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003052}
3053
3054static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003055load_dict(Unpicklerobject *self)
3056{
3057 PyObject *dict, *key, *value;
3058 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003060 if ((i = marker(self)) < 0) return -1;
3061 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003063 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003065 for (k = i+1; k < j; k += 2) {
3066 key =self->stack->data[k-1];
3067 value=self->stack->data[k ];
3068 if (PyDict_SetItem(dict, key, value) < 0) {
3069 Py_DECREF(dict);
3070 return -1;
3071 }
3072 }
3073 Pdata_clear(self->stack, i);
3074 PDATA_PUSH(self->stack, dict, -1);
3075 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003076}
3077
3078static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003079Instance_New(PyObject *cls, PyObject *args)
3080{
3081 int has_key;
3082 PyObject *safe=0, *r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003084 if (PyClass_Check(cls)) {
3085 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003087 if ((l=PyObject_Size(args)) < 0) goto err;
3088 if (!( l )) {
3089 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003091 __getinitargs__ = PyObject_GetAttr(cls,
3092 __getinitargs___str);
3093 if (!__getinitargs__) {
3094 /* We have a class with no __getinitargs__,
3095 so bypass usual construction */
3096 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003098 PyErr_Clear();
3099 if (!( inst=PyInstance_NewRaw(cls, NULL)))
3100 goto err;
3101 return inst;
3102 }
3103 Py_DECREF(__getinitargs__);
3104 }
Tim Peters84e87f32001-03-17 04:50:51 +00003105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003106 if ((r=PyInstance_New(cls, args, NULL))) return r;
3107 else goto err;
3108 }
Tim Peters84e87f32001-03-17 04:50:51 +00003109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003110 /* Is safe_constructors always a dict? */
3111 has_key = cPickle_PyMapping_HasKey(safe_constructors, cls);
3112 if (!has_key) {
3113 safe = PyObject_GetAttr(cls, __safe_for_unpickling___str);
3114 if (!safe ||
3115 !PyObject_IsTrue(safe)) {
3116 cPickle_ErrFormat(UnpicklingError,
3117 "%s is not safe for unpickling",
3118 "O", cls);
3119 Py_XDECREF(safe);
3120 return NULL;
3121 }
Tim Peters4e52ca82002-12-07 02:43:28 +00003122 Py_DECREF(safe);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003123 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003125 if (args==Py_None) {
3126 /* Special case, call cls.__basicnew__() */
3127 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003129 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3130 if (!basicnew) return NULL;
3131 r=PyObject_CallObject(basicnew, NULL);
3132 Py_DECREF(basicnew);
3133 if (r) return r;
3134 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003136 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003138 err:
3139 {
3140 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003142 PyErr_Fetch(&tp, &v, &tb);
3143 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3144 Py_XDECREF(v);
3145 v=r;
3146 }
3147 PyErr_Restore(tp,v,tb);
3148 }
3149 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003150}
Tim Peters84e87f32001-03-17 04:50:51 +00003151
Guido van Rossum60456fd1997-04-09 17:36:32 +00003152
3153static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003154load_obj(Unpicklerobject *self)
3155{
3156 PyObject *class, *tup, *obj=0;
3157 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003159 if ((i = marker(self)) < 0) return -1;
3160 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3161 PDATA_POP(self->stack, class);
3162 if (class) {
3163 obj = Instance_New(class, tup);
3164 Py_DECREF(class);
3165 }
3166 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003168 if (! obj) return -1;
3169 PDATA_PUSH(self->stack, obj, -1);
3170 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003171}
3172
3173
3174static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003175load_inst(Unpicklerobject *self)
3176{
3177 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3178 int i, len;
3179 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003181 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003183 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3184 if (len < 2) return bad_readline();
3185 module_name = PyString_FromStringAndSize(s, len - 1);
3186 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003188 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3189 if (len < 2) return bad_readline();
3190 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3191 class = find_class(module_name, class_name,
3192 self->find_class);
3193 Py_DECREF(class_name);
3194 }
3195 }
3196 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003198 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003200 if ((tup=Pdata_popTuple(self->stack, i))) {
3201 obj = Instance_New(class, tup);
3202 Py_DECREF(tup);
3203 }
3204 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003206 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003208 PDATA_PUSH(self->stack, obj, -1);
3209 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003210}
3211
3212
3213static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003214load_global(Unpicklerobject *self)
3215{
3216 PyObject *class = 0, *module_name = 0, *class_name = 0;
3217 int len;
3218 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003220 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3221 if (len < 2) return bad_readline();
3222 module_name = PyString_FromStringAndSize(s, len - 1);
3223 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003225 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003226 if (len < 2) {
3227 Py_DECREF(module_name);
3228 return bad_readline();
3229 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003230 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3231 class = find_class(module_name, class_name,
3232 self->find_class);
3233 Py_DECREF(class_name);
3234 }
3235 }
3236 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003238 if (! class) return -1;
3239 PDATA_PUSH(self->stack, class, -1);
3240 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003241}
3242
3243
3244static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003245load_persid(Unpicklerobject *self)
3246{
3247 PyObject *pid = 0;
3248 int len;
3249 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003251 if (self->pers_func) {
3252 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3253 if (len < 2) return bad_readline();
3254
3255 pid = PyString_FromStringAndSize(s, len - 1);
3256 if (!pid) return -1;
3257
3258 if (PyList_Check(self->pers_func)) {
3259 if (PyList_Append(self->pers_func, pid) < 0) {
3260 Py_DECREF(pid);
3261 return -1;
3262 }
3263 }
3264 else {
3265 ARG_TUP(self, pid);
3266 if (self->arg) {
3267 pid = PyObject_Call(self->pers_func, self->arg,
3268 NULL);
3269 FREE_ARG_TUP(self);
3270 }
3271 }
3272
3273 if (! pid) return -1;
3274
3275 PDATA_PUSH(self->stack, pid, -1);
3276 return 0;
3277 }
3278 else {
3279 PyErr_SetString(UnpicklingError,
3280 "A load persistent id instruction was encountered,\n"
3281 "but no persistent_load function was specified.");
3282 return -1;
3283 }
3284}
3285
3286static int
3287load_binpersid(Unpicklerobject *self)
3288{
3289 PyObject *pid = 0;
3290
3291 if (self->pers_func) {
3292 PDATA_POP(self->stack, pid);
3293 if (! pid) return -1;
3294
3295 if (PyList_Check(self->pers_func)) {
3296 if (PyList_Append(self->pers_func, pid) < 0) {
3297 Py_DECREF(pid);
3298 return -1;
3299 }
3300 }
3301 else {
3302 ARG_TUP(self, pid);
3303 if (self->arg) {
3304 pid = PyObject_Call(self->pers_func, self->arg,
3305 NULL);
3306 FREE_ARG_TUP(self);
3307 }
3308 if (! pid) return -1;
3309 }
3310
3311 PDATA_PUSH(self->stack, pid, -1);
3312 return 0;
3313 }
3314 else {
3315 PyErr_SetString(UnpicklingError,
3316 "A load persistent id instruction was encountered,\n"
3317 "but no persistent_load function was specified.");
3318 return -1;
3319 }
3320}
3321
3322
3323static int
3324load_pop(Unpicklerobject *self)
3325{
3326 int len;
3327
3328 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3329
3330 /* Note that we split the (pickle.py) stack into two stacks,
3331 an object stack and a mark stack. We have to be clever and
3332 pop the right one. We do this by looking at the top of the
3333 mark stack.
3334 */
3335
3336 if ((self->num_marks > 0) &&
3337 (self->marks[self->num_marks - 1] == len))
3338 self->num_marks--;
3339 else {
3340 len--;
3341 Py_DECREF(self->stack->data[len]);
3342 self->stack->length=len;
3343 }
3344
3345 return 0;
3346}
3347
3348
3349static int
3350load_pop_mark(Unpicklerobject *self)
3351{
3352 int i;
3353
3354 if ((i = marker(self)) < 0)
3355 return -1;
3356
3357 Pdata_clear(self->stack, i);
3358
3359 return 0;
3360}
3361
3362
3363static int
3364load_dup(Unpicklerobject *self)
3365{
3366 PyObject *last;
3367 int len;
3368
3369 if ((len = self->stack->length) <= 0) return stackUnderflow();
3370 last=self->stack->data[len-1];
3371 Py_INCREF(last);
3372 PDATA_PUSH(self->stack, last, -1);
3373 return 0;
3374}
3375
3376
3377static int
3378load_get(Unpicklerobject *self)
3379{
3380 PyObject *py_str = 0, *value = 0;
3381 int len;
3382 char *s;
3383 int rc;
3384
3385 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003386 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003387
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003388 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003389
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003390 value = PyDict_GetItem(self->memo, py_str);
3391 if (! value) {
3392 PyErr_SetObject(BadPickleGet, py_str);
3393 rc = -1;
3394 } else {
3395 PDATA_APPEND(self->stack, value, -1);
3396 rc = 0;
3397 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003399 Py_DECREF(py_str);
3400 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003401}
3402
3403
3404static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003405load_binget(Unpicklerobject *self)
3406{
3407 PyObject *py_key = 0, *value = 0;
3408 unsigned char key;
3409 char *s;
3410 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003412 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003413
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003414 key = (unsigned char)s[0];
3415 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003417 value = PyDict_GetItem(self->memo, py_key);
3418 if (! value) {
3419 PyErr_SetObject(BadPickleGet, py_key);
3420 rc = -1;
3421 } else {
3422 PDATA_APPEND(self->stack, value, -1);
3423 rc = 0;
3424 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003425
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003426 Py_DECREF(py_key);
3427 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003428}
3429
3430
3431static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003432load_long_binget(Unpicklerobject *self)
3433{
3434 PyObject *py_key = 0, *value = 0;
3435 unsigned char c;
3436 char *s;
3437 long key;
3438 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003440 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003442 c = (unsigned char)s[0];
3443 key = (long)c;
3444 c = (unsigned char)s[1];
3445 key |= (long)c << 8;
3446 c = (unsigned char)s[2];
3447 key |= (long)c << 16;
3448 c = (unsigned char)s[3];
3449 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003451 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3452
3453 value = PyDict_GetItem(self->memo, py_key);
3454 if (! value) {
3455 PyErr_SetObject(BadPickleGet, py_key);
3456 rc = -1;
3457 } else {
3458 PDATA_APPEND(self->stack, value, -1);
3459 rc = 0;
3460 }
3461
3462 Py_DECREF(py_key);
3463 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003464}
3465
3466
3467static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003468load_put(Unpicklerobject *self)
3469{
3470 PyObject *py_str = 0, *value = 0;
3471 int len, l;
3472 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003474 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3475 if (l < 2) return bad_readline();
3476 if (!( len=self->stack->length )) return stackUnderflow();
3477 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3478 value=self->stack->data[len-1];
3479 l=PyDict_SetItem(self->memo, py_str, value);
3480 Py_DECREF(py_str);
3481 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003482}
3483
3484
3485static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003486load_binput(Unpicklerobject *self)
3487{
3488 PyObject *py_key = 0, *value = 0;
3489 unsigned char key;
3490 char *s;
3491 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003493 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3494 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003496 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003498 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3499 value=self->stack->data[len-1];
3500 len=PyDict_SetItem(self->memo, py_key, value);
3501 Py_DECREF(py_key);
3502 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003503}
3504
3505
3506static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003507load_long_binput(Unpicklerobject *self)
3508{
3509 PyObject *py_key = 0, *value = 0;
3510 long key;
3511 unsigned char c;
3512 char *s;
3513 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003515 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3516 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003518 c = (unsigned char)s[0];
3519 key = (long)c;
3520 c = (unsigned char)s[1];
3521 key |= (long)c << 8;
3522 c = (unsigned char)s[2];
3523 key |= (long)c << 16;
3524 c = (unsigned char)s[3];
3525 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003527 if (!( py_key = PyInt_FromLong(key))) return -1;
3528 value=self->stack->data[len-1];
3529 len=PyDict_SetItem(self->memo, py_key, value);
3530 Py_DECREF(py_key);
3531 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003532}
3533
3534
3535static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003536do_append(Unpicklerobject *self, int x)
3537{
3538 PyObject *value = 0, *list = 0, *append_method = 0;
3539 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003541 len=self->stack->length;
3542 if (!( len >= x && x > 0 )) return stackUnderflow();
3543 /* nothing to do */
3544 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003546 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003548 if (PyList_Check(list)) {
3549 PyObject *slice;
3550 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003552 slice=Pdata_popList(self->stack, x);
3553 list_len = PyList_GET_SIZE(list);
3554 i=PyList_SetSlice(list, list_len, list_len, slice);
3555 Py_DECREF(slice);
3556 return i;
3557 }
3558 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003560 if (!( append_method = PyObject_GetAttr(list, append_str)))
3561 return -1;
3562
3563 for (i = x; i < len; i++) {
3564 PyObject *junk;
3565
3566 value=self->stack->data[i];
3567 junk=0;
3568 ARG_TUP(self, value);
3569 if (self->arg) {
3570 junk = PyObject_Call(append_method, self->arg,
3571 NULL);
3572 FREE_ARG_TUP(self);
3573 }
3574 if (! junk) {
3575 Pdata_clear(self->stack, i+1);
3576 self->stack->length=x;
3577 Py_DECREF(append_method);
3578 return -1;
3579 }
3580 Py_DECREF(junk);
3581 }
3582 self->stack->length=x;
3583 Py_DECREF(append_method);
3584 }
3585
3586 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003587}
3588
3589
3590static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003591load_append(Unpicklerobject *self)
3592{
3593 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003594}
3595
3596
3597static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003598load_appends(Unpicklerobject *self)
3599{
3600 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003601}
3602
3603
3604static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003605do_setitems(Unpicklerobject *self, int x)
3606{
3607 PyObject *value = 0, *key = 0, *dict = 0;
3608 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003610 if (!( (len=self->stack->length) >= x
3611 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003613 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003615 for (i = x+1; i < len; i += 2) {
3616 key =self->stack->data[i-1];
3617 value=self->stack->data[i ];
3618 if (PyObject_SetItem(dict, key, value) < 0) {
3619 r=-1;
3620 break;
3621 }
3622 }
3623
3624 Pdata_clear(self->stack, x);
3625
3626 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003627}
3628
3629
Tim Peters84e87f32001-03-17 04:50:51 +00003630static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003631load_setitem(Unpicklerobject *self)
3632{
3633 return do_setitems(self, self->stack->length - 2);
3634}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003636static int
3637load_setitems(Unpicklerobject *self)
3638{
3639 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003640}
3641
Tim Peters84e87f32001-03-17 04:50:51 +00003642
Guido van Rossum60456fd1997-04-09 17:36:32 +00003643static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003644load_build(Unpicklerobject *self)
3645{
3646 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3647 *junk = 0, *__setstate__ = 0;
3648 int i, r = 0;
3649
3650 if (self->stack->length < 2) return stackUnderflow();
3651 PDATA_POP(self->stack, value);
3652 if (! value) return -1;
3653 inst=self->stack->data[self->stack->length-1];
3654
3655 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3656 ARG_TUP(self, value);
3657 if (self->arg) {
3658 junk = PyObject_Call(__setstate__, self->arg, NULL);
3659 FREE_ARG_TUP(self);
3660 }
3661 Py_DECREF(__setstate__);
3662 if (! junk) return -1;
3663 Py_DECREF(junk);
3664 return 0;
3665 }
3666
3667 PyErr_Clear();
3668 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3669 i = 0;
3670 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3671 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3672 r=-1;
3673 break;
3674 }
3675 }
3676 Py_DECREF(instdict);
3677 }
3678 else r=-1;
3679
3680 Py_XDECREF(value);
3681
3682 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003683}
3684
3685
3686static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003687load_mark(Unpicklerobject *self)
3688{
3689 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003691 /* Note that we split the (pickle.py) stack into two stacks, an
3692 object stack and a mark stack. Here we push a mark onto the
3693 mark stack.
3694 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003696 if ((self->num_marks + 1) >= self->marks_size) {
3697 s=self->marks_size+20;
3698 if (s <= self->num_marks) s=self->num_marks + 1;
3699 if (self->marks == NULL)
3700 self->marks=(int *)malloc(s * sizeof(int));
3701 else
3702 self->marks=(int *)realloc(self->marks,
3703 s * sizeof(int));
3704 if (! self->marks) {
3705 PyErr_NoMemory();
3706 return -1;
3707 }
3708 self->marks_size = s;
3709 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003711 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003713 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003714}
3715
Guido van Rossum60456fd1997-04-09 17:36:32 +00003716static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003717load_reduce(Unpicklerobject *self)
3718{
3719 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003721 PDATA_POP(self->stack, arg_tup);
3722 if (! arg_tup) return -1;
3723 PDATA_POP(self->stack, callable);
3724 if (callable) {
3725 ob = Instance_New(callable, arg_tup);
3726 Py_DECREF(callable);
3727 }
3728 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003730 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003732 PDATA_PUSH(self->stack, ob, -1);
3733 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003734}
Tim Peters84e87f32001-03-17 04:50:51 +00003735
Guido van Rossum60456fd1997-04-09 17:36:32 +00003736static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003737load(Unpicklerobject *self)
3738{
3739 PyObject *err = 0, *val = 0;
3740 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003742 self->num_marks = 0;
3743 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003745 while (1) {
3746 if ((*self->read_func)(self, &s, 1) < 0)
3747 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003749 switch (s[0]) {
3750 case NONE:
3751 if (load_none(self) < 0)
3752 break;
3753 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003755 case BININT:
3756 if (load_binint(self) < 0)
3757 break;
3758 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003760 case BININT1:
3761 if (load_binint1(self) < 0)
3762 break;
3763 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003765 case BININT2:
3766 if (load_binint2(self) < 0)
3767 break;
3768 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003770 case INT:
3771 if (load_int(self) < 0)
3772 break;
3773 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003775 case LONG:
3776 if (load_long(self) < 0)
3777 break;
3778 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003780 case FLOAT:
3781 if (load_float(self) < 0)
3782 break;
3783 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003785 case BINFLOAT:
3786 if (load_binfloat(self) < 0)
3787 break;
3788 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003789
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003790 case BINSTRING:
3791 if (load_binstring(self) < 0)
3792 break;
3793 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003795 case SHORT_BINSTRING:
3796 if (load_short_binstring(self) < 0)
3797 break;
3798 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003800 case STRING:
3801 if (load_string(self) < 0)
3802 break;
3803 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003804
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003805#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003806 case UNICODE:
3807 if (load_unicode(self) < 0)
3808 break;
3809 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003811 case BINUNICODE:
3812 if (load_binunicode(self) < 0)
3813 break;
3814 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003815#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003817 case EMPTY_TUPLE:
3818 if (load_empty_tuple(self) < 0)
3819 break;
3820 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003822 case TUPLE:
3823 if (load_tuple(self) < 0)
3824 break;
3825 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003827 case EMPTY_LIST:
3828 if (load_empty_list(self) < 0)
3829 break;
3830 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003832 case LIST:
3833 if (load_list(self) < 0)
3834 break;
3835 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003837 case EMPTY_DICT:
3838 if (load_empty_dict(self) < 0)
3839 break;
3840 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003842 case DICT:
3843 if (load_dict(self) < 0)
3844 break;
3845 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003847 case OBJ:
3848 if (load_obj(self) < 0)
3849 break;
3850 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003852 case INST:
3853 if (load_inst(self) < 0)
3854 break;
3855 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003857 case GLOBAL:
3858 if (load_global(self) < 0)
3859 break;
3860 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003862 case APPEND:
3863 if (load_append(self) < 0)
3864 break;
3865 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003867 case APPENDS:
3868 if (load_appends(self) < 0)
3869 break;
3870 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003872 case BUILD:
3873 if (load_build(self) < 0)
3874 break;
3875 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003877 case DUP:
3878 if (load_dup(self) < 0)
3879 break;
3880 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003882 case BINGET:
3883 if (load_binget(self) < 0)
3884 break;
3885 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003887 case LONG_BINGET:
3888 if (load_long_binget(self) < 0)
3889 break;
3890 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003892 case GET:
3893 if (load_get(self) < 0)
3894 break;
3895 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003897 case MARK:
3898 if (load_mark(self) < 0)
3899 break;
3900 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003902 case BINPUT:
3903 if (load_binput(self) < 0)
3904 break;
3905 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003907 case LONG_BINPUT:
3908 if (load_long_binput(self) < 0)
3909 break;
3910 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003911
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003912 case PUT:
3913 if (load_put(self) < 0)
3914 break;
3915 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003916
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003917 case POP:
3918 if (load_pop(self) < 0)
3919 break;
3920 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003922 case POP_MARK:
3923 if (load_pop_mark(self) < 0)
3924 break;
3925 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003926
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003927 case SETITEM:
3928 if (load_setitem(self) < 0)
3929 break;
3930 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003932 case SETITEMS:
3933 if (load_setitems(self) < 0)
3934 break;
3935 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003937 case STOP:
3938 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003940 case PERSID:
3941 if (load_persid(self) < 0)
3942 break;
3943 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003945 case BINPERSID:
3946 if (load_binpersid(self) < 0)
3947 break;
3948 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003950 case REDUCE:
3951 if (load_reduce(self) < 0)
3952 break;
3953 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003955 case '\0':
3956 /* end of file */
3957 PyErr_SetNone(PyExc_EOFError);
3958 break;
Neil Schemenauerfa79c652002-03-22 23:02:53 +00003959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003960 default:
3961 cPickle_ErrFormat(UnpicklingError,
3962 "invalid load key, '%s'.",
3963 "c", s[0]);
3964 return NULL;
3965 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003967 break;
3968 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003970 if ((err = PyErr_Occurred())) {
3971 if (err == PyExc_EOFError) {
3972 PyErr_SetNone(PyExc_EOFError);
3973 }
3974 return NULL;
3975 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003976
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003977 PDATA_POP(self->stack, val);
3978 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003979}
Tim Peters84e87f32001-03-17 04:50:51 +00003980
Guido van Rossum60456fd1997-04-09 17:36:32 +00003981
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003982/* No-load functions to support noload, which is used to
3983 find persistent references. */
3984
3985static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003986noload_obj(Unpicklerobject *self)
3987{
3988 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003990 if ((i = marker(self)) < 0) return -1;
3991 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003992}
3993
3994
3995static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003996noload_inst(Unpicklerobject *self)
3997{
3998 int i;
3999 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004001 if ((i = marker(self)) < 0) return -1;
4002 Pdata_clear(self->stack, i);
4003 if ((*self->readline_func)(self, &s) < 0) return -1;
4004 if ((*self->readline_func)(self, &s) < 0) return -1;
4005 PDATA_APPEND(self->stack, Py_None,-1);
4006 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004007}
4008
4009static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004010noload_global(Unpicklerobject *self)
4011{
4012 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004014 if ((*self->readline_func)(self, &s) < 0) return -1;
4015 if ((*self->readline_func)(self, &s) < 0) return -1;
4016 PDATA_APPEND(self->stack, Py_None,-1);
4017 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004018}
4019
4020static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004021noload_reduce(Unpicklerobject *self)
4022{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004024 if (self->stack->length < 2) return stackUnderflow();
4025 Pdata_clear(self->stack, self->stack->length-2);
4026 PDATA_APPEND(self->stack, Py_None,-1);
4027 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004028}
4029
4030static int
4031noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004032
Guido van Rossum053b8df1998-11-25 16:18:00 +00004033 if (self->stack->length < 1) return stackUnderflow();
4034 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004035 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004036}
4037
4038
4039static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004040noload(Unpicklerobject *self)
4041{
4042 PyObject *err = 0, *val = 0;
4043 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004045 self->num_marks = 0;
4046 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004048 while (1) {
4049 if ((*self->read_func)(self, &s, 1) < 0)
4050 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004052 switch (s[0]) {
4053 case NONE:
4054 if (load_none(self) < 0)
4055 break;
4056 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004058 case BININT:
4059 if (load_binint(self) < 0)
4060 break;
4061 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004063 case BININT1:
4064 if (load_binint1(self) < 0)
4065 break;
4066 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004068 case BININT2:
4069 if (load_binint2(self) < 0)
4070 break;
4071 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004073 case INT:
4074 if (load_int(self) < 0)
4075 break;
4076 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004078 case LONG:
4079 if (load_long(self) < 0)
4080 break;
4081 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004083 case FLOAT:
4084 if (load_float(self) < 0)
4085 break;
4086 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004088 case BINFLOAT:
4089 if (load_binfloat(self) < 0)
4090 break;
4091 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004093 case BINSTRING:
4094 if (load_binstring(self) < 0)
4095 break;
4096 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004098 case SHORT_BINSTRING:
4099 if (load_short_binstring(self) < 0)
4100 break;
4101 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004103 case STRING:
4104 if (load_string(self) < 0)
4105 break;
4106 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004107
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004108#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004109 case UNICODE:
4110 if (load_unicode(self) < 0)
4111 break;
4112 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004114 case BINUNICODE:
4115 if (load_binunicode(self) < 0)
4116 break;
4117 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004118#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004120 case EMPTY_TUPLE:
4121 if (load_empty_tuple(self) < 0)
4122 break;
4123 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004125 case TUPLE:
4126 if (load_tuple(self) < 0)
4127 break;
4128 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004130 case EMPTY_LIST:
4131 if (load_empty_list(self) < 0)
4132 break;
4133 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004135 case LIST:
4136 if (load_list(self) < 0)
4137 break;
4138 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004140 case EMPTY_DICT:
4141 if (load_empty_dict(self) < 0)
4142 break;
4143 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004145 case DICT:
4146 if (load_dict(self) < 0)
4147 break;
4148 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004150 case OBJ:
4151 if (noload_obj(self) < 0)
4152 break;
4153 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004155 case INST:
4156 if (noload_inst(self) < 0)
4157 break;
4158 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004160 case GLOBAL:
4161 if (noload_global(self) < 0)
4162 break;
4163 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004165 case APPEND:
4166 if (load_append(self) < 0)
4167 break;
4168 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004170 case APPENDS:
4171 if (load_appends(self) < 0)
4172 break;
4173 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004175 case BUILD:
4176 if (noload_build(self) < 0)
4177 break;
4178 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004180 case DUP:
4181 if (load_dup(self) < 0)
4182 break;
4183 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004185 case BINGET:
4186 if (load_binget(self) < 0)
4187 break;
4188 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004190 case LONG_BINGET:
4191 if (load_long_binget(self) < 0)
4192 break;
4193 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004195 case GET:
4196 if (load_get(self) < 0)
4197 break;
4198 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004200 case MARK:
4201 if (load_mark(self) < 0)
4202 break;
4203 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004205 case BINPUT:
4206 if (load_binput(self) < 0)
4207 break;
4208 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004210 case LONG_BINPUT:
4211 if (load_long_binput(self) < 0)
4212 break;
4213 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004215 case PUT:
4216 if (load_put(self) < 0)
4217 break;
4218 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004220 case POP:
4221 if (load_pop(self) < 0)
4222 break;
4223 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004225 case POP_MARK:
4226 if (load_pop_mark(self) < 0)
4227 break;
4228 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004230 case SETITEM:
4231 if (load_setitem(self) < 0)
4232 break;
4233 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004235 case SETITEMS:
4236 if (load_setitems(self) < 0)
4237 break;
4238 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004240 case STOP:
4241 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004243 case PERSID:
4244 if (load_persid(self) < 0)
4245 break;
4246 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004248 case BINPERSID:
4249 if (load_binpersid(self) < 0)
4250 break;
4251 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004253 case REDUCE:
4254 if (noload_reduce(self) < 0)
4255 break;
4256 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004258 default:
4259 cPickle_ErrFormat(UnpicklingError,
4260 "invalid load key, '%s'.",
4261 "c", s[0]);
4262 return NULL;
4263 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004265 break;
4266 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004268 if ((err = PyErr_Occurred())) {
4269 if (err == PyExc_EOFError) {
4270 PyErr_SetNone(PyExc_EOFError);
4271 }
4272 return NULL;
4273 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004275 PDATA_POP(self->stack, val);
4276 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004277}
Tim Peters84e87f32001-03-17 04:50:51 +00004278
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004279
Guido van Rossum60456fd1997-04-09 17:36:32 +00004280static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004281Unpickler_load(Unpicklerobject *self, PyObject *args)
4282{
4283 if (!( PyArg_ParseTuple(args, ":load")))
4284 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004286 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004287}
4288
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004289static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004290Unpickler_noload(Unpicklerobject *self, PyObject *args)
4291{
4292 if (!( PyArg_ParseTuple(args, ":noload")))
4293 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004295 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004296}
4297
Guido van Rossum60456fd1997-04-09 17:36:32 +00004298
4299static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004300 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004301 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004302 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004303 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004304 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004305 "noload() -- not load a pickle, but go through most of the motions\n"
4306 "\n"
4307 "This function can be used to read past a pickle without instantiating\n"
4308 "any objects or importing any modules. It can also be used to find all\n"
4309 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004310 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004311 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004312 {NULL, NULL} /* sentinel */
4313};
4314
4315
4316static Unpicklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004317newUnpicklerobject(PyObject *f)
4318{
4319 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004321 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
4322 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004324 self->file = NULL;
4325 self->arg = NULL;
4326 self->stack = (Pdata*)Pdata_New();
4327 self->pers_func = NULL;
4328 self->last_string = NULL;
4329 self->marks = NULL;
4330 self->num_marks = 0;
4331 self->marks_size = 0;
4332 self->buf_size = 0;
4333 self->read = NULL;
4334 self->readline = NULL;
4335 self->safe_constructors = NULL;
4336 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004338 if (!( self->memo = PyDict_New()))
4339 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004341 Py_INCREF(f);
4342 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004344 /* Set read, readline based on type of f */
4345 if (PyFile_Check(f)) {
4346 self->fp = PyFile_AsFile(f);
4347 if (self->fp == NULL) {
4348 PyErr_SetString(PyExc_ValueError,
4349 "I/O operation on closed file");
4350 goto err;
4351 }
4352 self->read_func = read_file;
4353 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004354 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004355 else if (PycStringIO_InputCheck(f)) {
4356 self->fp = NULL;
4357 self->read_func = read_cStringIO;
4358 self->readline_func = readline_cStringIO;
4359 }
4360 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004362 self->fp = NULL;
4363 self->read_func = read_other;
4364 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004366 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4367 (self->read = PyObject_GetAttr(f, read_str)))) {
4368 PyErr_Clear();
4369 PyErr_SetString( PyExc_TypeError,
4370 "argument must have 'read' and "
4371 "'readline' attributes" );
4372 goto err;
4373 }
4374 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004376 if (PyEval_GetRestricted()) {
4377 /* Restricted execution, get private tables */
4378 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004380 if (!( m=PyImport_Import(copy_reg_str))) goto err;
4381 self->safe_constructors=PyObject_GetAttr(m,
4382 safe_constructors_str);
4383 Py_DECREF(m);
4384 if (!( self->safe_constructors )) goto err;
4385 }
4386 else {
4387 self->safe_constructors=safe_constructors;
4388 Py_INCREF(safe_constructors);
4389 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004391 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004393 err:
4394 Py_DECREF((PyObject *)self);
4395 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004396}
4397
4398
4399static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004400get_Unpickler(PyObject *self, PyObject *args)
4401{
4402 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004404 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
4405 return NULL;
4406 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004407}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004408
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004409
Guido van Rossum60456fd1997-04-09 17:36:32 +00004410static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004411Unpickler_dealloc(Unpicklerobject *self)
4412{
4413 Py_XDECREF(self->readline);
4414 Py_XDECREF(self->read);
4415 Py_XDECREF(self->file);
4416 Py_XDECREF(self->memo);
4417 Py_XDECREF(self->stack);
4418 Py_XDECREF(self->pers_func);
4419 Py_XDECREF(self->arg);
4420 Py_XDECREF(self->last_string);
4421 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004423 if (self->marks) {
4424 free(self->marks);
4425 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004427 if (self->buf_size) {
4428 free(self->buf);
4429 }
Tim Peters84e87f32001-03-17 04:50:51 +00004430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004431 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004432}
4433
4434
4435static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004436Unpickler_getattr(Unpicklerobject *self, char *name)
4437{
4438 if (!strcmp(name, "persistent_load")) {
4439 if (!self->pers_func) {
4440 PyErr_SetString(PyExc_AttributeError, name);
4441 return NULL;
4442 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004444 Py_INCREF(self->pers_func);
4445 return self->pers_func;
4446 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004448 if (!strcmp(name, "find_global")) {
4449 if (!self->find_class) {
4450 PyErr_SetString(PyExc_AttributeError, name);
4451 return NULL;
4452 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004454 Py_INCREF(self->find_class);
4455 return self->find_class;
4456 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004458 if (!strcmp(name, "memo")) {
4459 if (!self->memo) {
4460 PyErr_SetString(PyExc_AttributeError, name);
4461 return NULL;
4462 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004464 Py_INCREF(self->memo);
4465 return self->memo;
4466 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004468 if (!strcmp(name, "UnpicklingError")) {
4469 Py_INCREF(UnpicklingError);
4470 return UnpicklingError;
4471 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004473 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004474}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004475
Guido van Rossum60456fd1997-04-09 17:36:32 +00004476
4477static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004478Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
4479{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004481 if (!strcmp(name, "persistent_load")) {
4482 Py_XDECREF(self->pers_func);
4483 self->pers_func = value;
4484 Py_XINCREF(value);
4485 return 0;
4486 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004488 if (!strcmp(name, "find_global")) {
4489 Py_XDECREF(self->find_class);
4490 self->find_class = value;
4491 Py_XINCREF(value);
4492 return 0;
4493 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004495 if (! value) {
4496 PyErr_SetString(PyExc_TypeError,
4497 "attribute deletion is not supported");
4498 return -1;
4499 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004501 if (strcmp(name, "memo") == 0) {
4502 if (!PyDict_Check(value)) {
4503 PyErr_SetString(PyExc_TypeError,
4504 "memo must be a dictionary");
4505 return -1;
4506 }
4507 Py_XDECREF(self->memo);
4508 self->memo = value;
4509 Py_INCREF(value);
4510 return 0;
4511 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004513 PyErr_SetString(PyExc_AttributeError, name);
4514 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004515}
4516
4517
4518static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004519cpm_dump(PyObject *self, PyObject *args)
4520{
4521 PyObject *ob, *file, *res = NULL;
4522 Picklerobject *pickler = 0;
4523 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004525 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &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 (!( pickler = newPicklerobject(file, bin)))
4529 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004531 if (dump(pickler, ob) < 0)
4532 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004534 Py_INCREF(Py_None);
4535 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004537 finally:
4538 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004540 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004541}
4542
4543
4544static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004545cpm_dumps(PyObject *self, PyObject *args)
4546{
4547 PyObject *ob, *file = 0, *res = NULL;
4548 Picklerobject *pickler = 0;
4549 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004550
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004551 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin)))
4552 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004554 if (!( file = PycStringIO->NewOutput(128)))
4555 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004557 if (!( pickler = newPicklerobject(file, bin)))
4558 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004560 if (dump(pickler, ob) < 0)
4561 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004563 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004565 finally:
4566 Py_XDECREF(pickler);
4567 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004569 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004570}
4571
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004572
4573static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004574cpm_load(PyObject *self, PyObject *args)
4575{
4576 Unpicklerobject *unpickler = 0;
4577 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004579 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
4580 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004582 if (!( unpickler = newUnpicklerobject(ob)))
4583 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004585 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004587 finally:
4588 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004589
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004590 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004591}
4592
4593
4594static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004595cpm_loads(PyObject *self, PyObject *args)
4596{
4597 PyObject *ob, *file = 0, *res = NULL;
4598 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004600 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
4601 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004603 if (!( file = PycStringIO->NewInput(ob)))
4604 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004606 if (!( unpickler = newUnpicklerobject(file)))
4607 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004609 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004611 finally:
4612 Py_XDECREF(file);
4613 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004615 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004616}
4617
4618
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004619PyDoc_STRVAR(Unpicklertype__doc__,
4620"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004621
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004622static PyTypeObject Unpicklertype = {
4623 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004624 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004625 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004626 sizeof(Unpicklerobject), /*tp_basicsize*/
4627 0, /*tp_itemsize*/
4628 /* methods */
4629 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4630 (printfunc)0, /*tp_print*/
4631 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4632 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4633 (cmpfunc)0, /*tp_compare*/
4634 (reprfunc)0, /*tp_repr*/
4635 0, /*tp_as_number*/
4636 0, /*tp_as_sequence*/
4637 0, /*tp_as_mapping*/
4638 (hashfunc)0, /*tp_hash*/
4639 (ternaryfunc)0, /*tp_call*/
4640 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004641
Guido van Rossum60456fd1997-04-09 17:36:32 +00004642 /* Space for future expansion */
4643 0L,0L,0L,0L,
4644 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004645};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004646
Guido van Rossum60456fd1997-04-09 17:36:32 +00004647static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004648 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004649 PyDoc_STR("dump(object, file, [binary]) --"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004650 "Write an object in pickle format to the given file\n"
4651 "\n"
4652 "If the optional argument, binary, is provided and is true, then the\n"
4653 "pickle will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004654 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004655 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004656 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004657 PyDoc_STR("dumps(object, [binary]) --"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004658 "Return a string containing an object in pickle format\n"
4659 "\n"
4660 "If the optional argument, binary, is provided and is true, then the\n"
4661 "pickle will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004662 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004663 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004664 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004665 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Neal Norwitzb0493252002-03-31 14:44:22 +00004666 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004667 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Neal Norwitzb0493252002-03-31 14:44:22 +00004668 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004669 PyDoc_STR("Pickler(file, [binary]) -- Create a pickler\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004670 "\n"
4671 "If the optional argument, binary, is provided and is true, then\n"
4672 "pickles will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004673 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004674 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004675 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004676 PyDoc_STR("Unpickler(file) -- Create an unpickler")},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004677 { NULL, NULL }
4678};
4679
Guido van Rossum60456fd1997-04-09 17:36:32 +00004680static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004681init_stuff(PyObject *module_dict)
4682{
4683 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004684
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004685#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004687 INIT_STR(__class__);
4688 INIT_STR(__getinitargs__);
4689 INIT_STR(__dict__);
4690 INIT_STR(__getstate__);
4691 INIT_STR(__setstate__);
4692 INIT_STR(__name__);
4693 INIT_STR(__main__);
4694 INIT_STR(__reduce__);
4695 INIT_STR(write);
4696 INIT_STR(__safe_for_unpickling__);
4697 INIT_STR(append);
4698 INIT_STR(read);
4699 INIT_STR(readline);
4700 INIT_STR(copy_reg);
4701 INIT_STR(dispatch_table);
4702 INIT_STR(safe_constructors);
4703 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004705 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
4706 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004708 /* These next few are special because we want to use different
4709 ones in restricted mode. */
4710 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
4711 if (!dispatch_table)
4712 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004714 if (!( safe_constructors = PyObject_GetAttr(copy_reg,
4715 safe_constructors_str)))
4716 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004718 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004720 /* Down to here ********************************** */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004722 if (!( empty_tuple = PyTuple_New(0)))
4723 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004725 /* Ugh */
4726 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4727 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4728 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004730 if (!( t=PyDict_New())) return -1;
4731 if (!( r=PyRun_String(
4732 "def __init__(self, *args): self.args=args\n\n"
4733 "def __str__(self):\n"
4734 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4735 Py_file_input,
4736 module_dict, t) )) return -1;
4737 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004739 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
4740 if (!PickleError)
4741 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004743 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004745 PicklingError = PyErr_NewException("cPickle.PicklingError",
4746 PickleError, NULL);
4747 if (!PicklingError)
4748 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004750 if (!( t=PyDict_New())) return -1;
4751 if (!( r=PyRun_String(
4752 "def __init__(self, *args): self.args=args\n\n"
4753 "def __str__(self):\n"
4754 " a=self.args\n"
4755 " a=a and type(a[0]) or '(what)'\n"
4756 " return 'Cannot pickle %s objects' % a\n"
4757 , Py_file_input,
4758 module_dict, t) )) return -1;
4759 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004761 if (!( UnpickleableError = PyErr_NewException(
4762 "cPickle.UnpickleableError", PicklingError, t)))
4763 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004765 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004767 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
4768 PickleError, NULL)))
4769 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004770
Martin v. Löwis658009a2002-09-16 17:26:24 +00004771 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
4772 UnpicklingError, NULL)))
4773 return -1;
4774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004775 if (PyDict_SetItemString(module_dict, "PickleError",
4776 PickleError) < 0)
4777 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004779 if (PyDict_SetItemString(module_dict, "PicklingError",
4780 PicklingError) < 0)
4781 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004783 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4784 UnpicklingError) < 0)
4785 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004787 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4788 UnpickleableError) < 0)
4789 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004791 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4792 BadPickleGet) < 0)
4793 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004795 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004797 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004798}
4799
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004800#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
4801#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004802#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004803PyMODINIT_FUNC
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004804initcPickle(void)
4805{
4806 PyObject *m, *d, *di, *v, *k;
4807 int i;
4808 char *rev="1.71";
4809 PyObject *format_version;
4810 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004812 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004813 Unpicklertype.ob_type = &PyType_Type;
4814 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004816 /* Initialize some pieces. We need to do this before module creation,
4817 so we're forced to use a temporary dictionary. :(
4818 */
4819 di=PyDict_New();
4820 if (!di) return;
4821 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004823 /* Create the module and add the functions */
4824 m = Py_InitModule4("cPickle", cPickle_methods,
4825 cPickle_module_documentation,
4826 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004828 /* Add some symbolic constants to the module */
4829 d = PyModule_GetDict(m);
4830 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4831 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004833 /* Copy data from di. Waaa. */
4834 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4835 if (PyObject_SetItem(d, k, v) < 0) {
4836 Py_DECREF(di);
4837 return;
4838 }
4839 }
4840 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004842 format_version = PyString_FromString("1.3");
4843 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004845 PyDict_SetItemString(d, "format_version", format_version);
4846 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4847 Py_XDECREF(format_version);
4848 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004849}