blob: e726667b8d9ba23e499dda1c998125c0a0d0034a [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,
Tim Peters64c04d12003-02-01 06:27:59 +00006"C implementation and optimization of the Python pickle module.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007
Guido van Rossum142eeb81997-08-13 03:14:41 +00008#ifndef Py_eval_input
9#include <graminit.h>
10#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000011#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000012
Guido van Rossum60456fd1997-04-09 17:36:32 +000013#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000014
Guido van Rossum60456fd1997-04-09 17:36:32 +000015#define WRITE_BUF_SIZE 256
16
Tim Peters797ec242003-02-01 06:22:36 +000017/*
18 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
19 * docs are in pickletools.py.
20 */
Guido van Rossum60456fd1997-04-09 17:36:32 +000021#define MARK '('
22#define STOP '.'
23#define POP '0'
24#define POP_MARK '1'
25#define DUP '2'
26#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000027#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000028#define INT 'I'
29#define BININT 'J'
30#define BININT1 'K'
31#define LONG 'L'
32#define BININT2 'M'
33#define NONE 'N'
34#define PERSID 'P'
35#define BINPERSID 'Q'
36#define REDUCE 'R'
37#define STRING 'S'
38#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000039#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000040#define UNICODE 'V'
41#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000042#define APPEND 'a'
43#define BUILD 'b'
44#define GLOBAL 'c'
45#define DICT 'd'
46#define EMPTY_DICT '}'
47#define APPENDS 'e'
48#define GET 'g'
49#define BINGET 'h'
50#define INST 'i'
51#define LONG_BINGET 'j'
52#define LIST 'l'
53#define EMPTY_LIST ']'
54#define OBJ 'o'
55#define PUT 'p'
56#define BINPUT 'q'
57#define LONG_BINPUT 'r'
58#define SETITEM 's'
59#define TUPLE 't'
60#define EMPTY_TUPLE ')'
61#define SETITEMS 'u'
Tim Peters797ec242003-02-01 06:22:36 +000062
63/* Protocol 2. */
64#define PROTO '\x80' /* identify pickle protocol */
65#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
66#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
67#define EXT2 '\x83' /* ditto, but 2-byte index */
68#define EXT4 '\x84' /* ditto, but 4-byte index */
69#define TUPLE1 '\x85' /* build 1-tuple from stack top */
70#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
71#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
72#define NEWTRUE '\x88' /* push True */
73#define NEWFALSE '\x89' /* push False */
74#define LONG1 '\x8a' /* push long from < 256 bytes */
75#define LONG4 '\x8b' /* push really big long */
76
77/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
78 * so that unpicklers written before bools were introduced unpickle them
79 * as ints, but unpicklers after can recognize that bools were intended.
80 * Note that protocol 2 added direct ways to pickle bools.
81 */
Jack Jansen3a967022002-06-26 20:40:42 +000082#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000083#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000084#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000085#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000086
Guido van Rossum60456fd1997-04-09 17:36:32 +000087static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000088
Guido van Rossumc03158b1999-06-09 15:23:31 +000089static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000090static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +000091static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000092static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +000093static PyObject *BadPickleGet;
94
Guido van Rossum2f4caa41997-01-06 22:59:08 +000095
Guido van Rossum60456fd1997-04-09 17:36:32 +000096static PyObject *dispatch_table;
Guido van Rossum60456fd1997-04-09 17:36:32 +000097static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000098
Guido van Rossum60456fd1997-04-09 17:36:32 +000099static PyObject *__class___str, *__getinitargs___str, *__dict___str,
100 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000101 *write_str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000102 *read_str, *readline_str, *__main___str, *__basicnew___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000103 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000104
Guido van Rossum053b8df1998-11-25 16:18:00 +0000105/*************************************************************************
106 Internal Data type for pickle data. */
107
108typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000109 PyObject_HEAD
110 int length, size;
111 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000112} Pdata;
113
Tim Peters84e87f32001-03-17 04:50:51 +0000114static void
Tim Peterscba30e22003-02-01 06:24:36 +0000115Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000116{
117 int i;
118 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000120 for (i=self->length, p=self->data; --i >= 0; p++) Py_DECREF(*p);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000122 if (self->data) free(self->data);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000124 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000125}
126
127static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000128 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
129 (destructor)Pdata_dealloc,
130 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000131};
132
133#define Pdata_Check(O) ((O)->ob_type == &PdataType)
134
135static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000136Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000137{
138 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000140 if (!( self = PyObject_New(Pdata, &PdataType))) return NULL;
141 self->size=8;
142 self->length=0;
143 self->data=malloc(self->size * sizeof(PyObject*));
144 if (self->data) return (PyObject*)self;
145 Py_DECREF(self);
146 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000147}
148
Tim Peters84e87f32001-03-17 04:50:51 +0000149static int
Tim Peterscba30e22003-02-01 06:24:36 +0000150stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000151{
152 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
153 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000154}
155
156static int
Tim Peterscba30e22003-02-01 06:24:36 +0000157Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000158{
159 int i;
160 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000162 if (clearto < 0) return stackUnderflow();
163 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000165 for (i=self->length, p=self->data+clearto; --i >= clearto; p++)
166 Py_DECREF(*p);
167 self->length=clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000169 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000170}
171
172
Tim Peters84e87f32001-03-17 04:50:51 +0000173static int
Tim Peterscba30e22003-02-01 06:24:36 +0000174Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000175{
176 if (! self->size) {
177 PyErr_NoMemory();
178 return -1;
179 }
180 self->size *= 2;
181 self->data = realloc(self->data, self->size*sizeof(PyObject*));
182 if (! self->data) {
183 self->size = 0;
184 PyErr_NoMemory();
185 return -1;
186 }
187 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000188}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000189
190#define PDATA_POP(D,V) { \
191 if ((D)->length) V=D->data[--((D)->length)]; \
192 else { \
193 PyErr_SetString(UnpicklingError, "bad pickle data"); \
194 V=NULL; \
195 } \
196}
197
198
199static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000200Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000201{
202 PyObject *r;
203 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000205 l=self->length-start;
206 if (!( r=PyTuple_New(l))) return NULL;
207 for (i=start, j=0 ; j < l; i++, j++)
208 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000210 self->length=start;
211 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000212}
213
214static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000215Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000216{
217 PyObject *r;
218 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000220 l=self->length-start;
221 if (!( r=PyList_New(l))) return NULL;
222 for (i=start, j=0 ; j < l; i++, j++)
223 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000225 self->length=start;
226 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000227}
228
Guido van Rossum053b8df1998-11-25 16:18:00 +0000229#define PDATA_APPEND(D,O,ER) { \
230 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
231 Pdata_grow((Pdata*)(D)) < 0) \
232 return ER; \
233 Py_INCREF(O); \
234 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
235}
236
237#define PDATA_PUSH(D,O,ER) { \
238 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
239 Pdata_grow((Pdata*)(D)) < 0) { \
240 Py_DECREF(O); \
241 return ER; \
242 } \
243 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
244}
245
246/*************************************************************************/
247
248#define ARG_TUP(self, o) { \
249 if (self->arg || (self->arg=PyTuple_New(1))) { \
250 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
251 PyTuple_SET_ITEM(self->arg,0,o); \
252 } \
253 else { \
254 Py_DECREF(o); \
255 } \
256}
257
258#define FREE_ARG_TUP(self) { \
259 if (self->arg->ob_refcnt > 1) { \
260 Py_DECREF(self->arg); \
261 self->arg=NULL; \
262 } \
263 }
264
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000265typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000266 PyObject_HEAD
267 FILE *fp;
268 PyObject *write;
269 PyObject *file;
270 PyObject *memo;
271 PyObject *arg;
272 PyObject *pers_func;
273 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000274
275 /* pickle protocol number, >= 0 */
276 int proto;
277
278 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000279 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000281 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000282 int nesting;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000283 int (*write_func)(struct Picklerobject *, char *, int);
284 char *write_buf;
285 int buf_size;
286 PyObject *dispatch_table;
287 int fast_container; /* count nested container dumps */
288 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000289} Picklerobject;
290
Barry Warsaw52acb492001-12-21 20:04:22 +0000291#ifndef PY_CPICKLE_FAST_LIMIT
292#define PY_CPICKLE_FAST_LIMIT 50
293#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000294
Jeremy Hylton938ace62002-07-17 16:30:39 +0000295static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000296
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000297typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000298 PyObject_HEAD
299 FILE *fp;
300 PyObject *file;
301 PyObject *readline;
302 PyObject *read;
303 PyObject *memo;
304 PyObject *arg;
305 Pdata *stack;
306 PyObject *mark;
307 PyObject *pers_func;
308 PyObject *last_string;
309 int *marks;
310 int num_marks;
311 int marks_size;
312 int (*read_func)(struct Unpicklerobject *, char **, int);
313 int (*readline_func)(struct Unpicklerobject *, char **);
314 int buf_size;
315 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000316 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000317} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000318
Jeremy Hylton938ace62002-07-17 16:30:39 +0000319static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000320
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000321/* Forward decls that need the above structs */
322static int save(Picklerobject *, PyObject *, int);
323static int put2(Picklerobject *, PyObject *);
324
Tim Peters84e87f32001-03-17 04:50:51 +0000325int
Tim Peterscba30e22003-02-01 06:24:36 +0000326cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000327{
328 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000330 if ((v = PyObject_GetItem(o,key))) {
331 Py_DECREF(v);
332 return 1;
333 }
Tim Peterscba30e22003-02-01 06:24:36 +0000334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000335 PyErr_Clear();
336 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000337}
338
Guido van Rossumd385d591997-04-09 17:47:47 +0000339static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000340PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000341cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
342{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000343 va_list va;
344 PyObject *args=0, *retval=0;
345 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000347 if (format) args = Py_VaBuildValue(format, va);
348 va_end(va);
349 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000350 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000351 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000353 if (retval) {
354 if (args) {
355 PyObject *v;
356 v=PyString_Format(retval, args);
357 Py_DECREF(retval);
358 Py_DECREF(args);
359 if (! v) return NULL;
360 retval=v;
361 }
362 }
363 else
364 if (args) retval=args;
365 else {
366 PyErr_SetObject(ErrType,Py_None);
367 return NULL;
368 }
369 PyErr_SetObject(ErrType,retval);
370 Py_DECREF(retval);
371 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000372}
373
Tim Peters84e87f32001-03-17 04:50:51 +0000374static int
Tim Peterscba30e22003-02-01 06:24:36 +0000375write_file(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000376{
377 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000379 if (s == NULL) {
380 return 0;
381 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000383 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000384 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000385 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000386 if (nbyteswritten != (size_t)n) {
387 PyErr_SetFromErrno(PyExc_IOError);
388 return -1;
389 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000391 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000392}
393
Tim Peters84e87f32001-03-17 04:50:51 +0000394static int
Tim Peterscba30e22003-02-01 06:24:36 +0000395write_cStringIO(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000396{
397 if (s == NULL) {
398 return 0;
399 }
Tim Peterscba30e22003-02-01 06:24:36 +0000400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000401 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
402 return -1;
403 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000405 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000406}
407
Tim Peters84e87f32001-03-17 04:50:51 +0000408static int
Tim Peterscba30e22003-02-01 06:24:36 +0000409write_none(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000410{
411 if (s == NULL) return 0;
412 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000413}
414
Tim Peters84e87f32001-03-17 04:50:51 +0000415static int
Tim Peterscba30e22003-02-01 06:24:36 +0000416write_other(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000417{
418 PyObject *py_str = 0, *junk = 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000420 if (s == NULL) {
421 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000422 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000423 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000424 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000425 return -1;
426 }
427 else {
428 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
429 if (write_other(self, NULL, 0) < 0)
430 return -1;
431 }
Tim Peterscba30e22003-02-01 06:24:36 +0000432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000433 if (n > WRITE_BUF_SIZE) {
434 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000435 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000436 return -1;
437 }
438 else {
439 memcpy(self->write_buf + self->buf_size, s, n);
440 self->buf_size += n;
441 return n;
442 }
443 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000445 if (self->write) {
446 /* object with write method */
447 ARG_TUP(self, py_str);
448 if (self->arg) {
449 junk = PyObject_Call(self->write, self->arg, NULL);
450 FREE_ARG_TUP(self);
451 }
452 if (junk) Py_DECREF(junk);
453 else return -1;
454 }
455 else
456 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000458 self->buf_size = 0;
459 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000460}
461
462
Tim Peters84e87f32001-03-17 04:50:51 +0000463static int
Tim Peterscba30e22003-02-01 06:24:36 +0000464read_file(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000465{
466 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000468 if (self->buf_size == 0) {
469 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000471 size = ((n < 32) ? 32 : n);
472 if (!( self->buf = (char *)malloc(size * sizeof(char)))) {
473 PyErr_NoMemory();
474 return -1;
475 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000477 self->buf_size = size;
478 }
479 else if (n > self->buf_size) {
480 self->buf = (char *)realloc(self->buf, n * sizeof(char));
481 if (!self->buf) {
482 PyErr_NoMemory();
483 return -1;
484 }
Tim Peters84e87f32001-03-17 04:50:51 +0000485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000486 self->buf_size = n;
487 }
Tim Peters84e87f32001-03-17 04:50:51 +0000488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000489 Py_BEGIN_ALLOW_THREADS
490 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
491 Py_END_ALLOW_THREADS
492 if (nbytesread != (size_t)n) {
493 if (feof(self->fp)) {
494 PyErr_SetNone(PyExc_EOFError);
495 return -1;
496 }
Tim Peterscba30e22003-02-01 06:24:36 +0000497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000498 PyErr_SetFromErrno(PyExc_IOError);
499 return -1;
500 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000502 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000504 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000505}
506
507
Tim Peters84e87f32001-03-17 04:50:51 +0000508static int
Tim Peterscba30e22003-02-01 06:24:36 +0000509readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000510{
511 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000513 if (self->buf_size == 0) {
514 if (!( self->buf = (char *)malloc(40 * sizeof(char)))) {
515 PyErr_NoMemory();
516 return -1;
517 }
Tim Peters84e87f32001-03-17 04:50:51 +0000518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000519 self->buf_size = 40;
520 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000522 i = 0;
523 while (1) {
524 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000525 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000526 (self->buf[i] = getc(self->fp)) == '\n') {
527 self->buf[i + 1] = '\0';
528 *s = self->buf;
529 return i + 1;
530 }
531 }
532 self->buf = (char *)realloc(self->buf,
533 (self->buf_size * 2) * sizeof(char));
534 if (!self->buf) {
535 PyErr_NoMemory();
536 return -1;
537 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000538
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000539 self->buf_size *= 2;
540 }
Tim Peters84e87f32001-03-17 04:50:51 +0000541}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000542
543
Tim Peters84e87f32001-03-17 04:50:51 +0000544static int
Tim Peterscba30e22003-02-01 06:24:36 +0000545read_cStringIO(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000546{
547 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000549 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
550 PyErr_SetNone(PyExc_EOFError);
551 return -1;
552 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000554 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000556 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000557}
558
559
Tim Peters84e87f32001-03-17 04:50:51 +0000560static int
Tim Peterscba30e22003-02-01 06:24:36 +0000561readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000562{
563 int n;
564 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000566 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
567 return -1;
568 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000570 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000571
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000572 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000573}
574
575
Tim Peters84e87f32001-03-17 04:50:51 +0000576static int
Tim Peterscba30e22003-02-01 06:24:36 +0000577read_other(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000578{
579 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000581 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000583 ARG_TUP(self, bytes);
584 if (self->arg) {
585 str = PyObject_Call(self->read, self->arg, NULL);
586 FREE_ARG_TUP(self);
587 }
588 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000589
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000590 Py_XDECREF(self->last_string);
591 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000592
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000593 if (! (*s = PyString_AsString(str))) return -1;
594 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000595}
596
597
Tim Peters84e87f32001-03-17 04:50:51 +0000598static int
Tim Peterscba30e22003-02-01 06:24:36 +0000599readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000600{
601 PyObject *str;
602 int str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000603
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000604 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
605 return -1;
606 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000608 if ((str_size = PyString_Size(str)) < 0)
609 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000611 Py_XDECREF(self->last_string);
612 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000614 if (! (*s = PyString_AsString(str)))
615 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000617 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000618}
619
620
621static char *
Tim Peterscba30e22003-02-01 06:24:36 +0000622pystrndup(char *s, int l)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000623{
624 char *r;
625 if (!( r=malloc((l+1)*sizeof(char)))) return (char*)PyErr_NoMemory();
626 memcpy(r,s,l);
627 r[l]=0;
628 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000629}
630
631
632static int
Tim Peterscba30e22003-02-01 06:24:36 +0000633get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000634{
635 PyObject *value, *mv;
636 long c_value;
637 char s[30];
638 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000640 if (!( mv = PyDict_GetItem(self->memo, id))) {
641 PyErr_SetObject(PyExc_KeyError, id);
642 return -1;
643 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000644
Tim Peterscba30e22003-02-01 06:24:36 +0000645 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000646 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000648 if (!( PyInt_Check(value))) {
649 PyErr_SetString(PicklingError, "no int where int expected in memo");
650 return -1;
651 }
652 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000654 if (!self->bin) {
655 s[0] = GET;
656 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
657 len = strlen(s);
658 }
659 else if (Pdata_Check(self->file)) {
660 if (write_other(self, NULL, 0) < 0) return -1;
661 PDATA_APPEND(self->file, mv, -1);
662 return 0;
663 }
664 else {
665 if (c_value < 256) {
666 s[0] = BINGET;
667 s[1] = (int)(c_value & 0xff);
668 len = 2;
669 }
670 else {
671 s[0] = LONG_BINGET;
672 s[1] = (int)(c_value & 0xff);
673 s[2] = (int)((c_value >> 8) & 0xff);
674 s[3] = (int)((c_value >> 16) & 0xff);
675 s[4] = (int)((c_value >> 24) & 0xff);
676 len = 5;
677 }
678 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000680 if ((*self->write_func)(self, s, len) < 0)
681 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000682
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000683 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000684}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000685
Guido van Rossum60456fd1997-04-09 17:36:32 +0000686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000687static int
Tim Peterscba30e22003-02-01 06:24:36 +0000688put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000689{
Tim Peterscba30e22003-02-01 06:24:36 +0000690 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000691 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000693 return put2(self, ob);
694}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000695
Guido van Rossum053b8df1998-11-25 16:18:00 +0000696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000697static int
Tim Peterscba30e22003-02-01 06:24:36 +0000698put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000699{
700 char c_str[30];
701 int p;
702 size_t len;
703 int res = -1;
704 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000706 if (self->fast)
707 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000709 if ((p = PyDict_Size(self->memo)) < 0)
710 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000712 /* Make sure memo keys are positive! */
Tim Peterscba30e22003-02-01 06:24:36 +0000713 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000714
Tim Peterscba30e22003-02-01 06:24:36 +0000715 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000716 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000717
Tim Peterscba30e22003-02-01 06:24:36 +0000718 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000719 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000720
Tim Peterscba30e22003-02-01 06:24:36 +0000721 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000722 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000724 PyTuple_SET_ITEM(t, 0, memo_len);
725 Py_INCREF(memo_len);
726 PyTuple_SET_ITEM(t, 1, ob);
727 Py_INCREF(ob);
728
729 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
730 goto finally;
731
732 if (!self->bin) {
733 c_str[0] = PUT;
734 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
735 len = strlen(c_str);
736 }
737 else if (Pdata_Check(self->file)) {
738 if (write_other(self, NULL, 0) < 0) return -1;
739 PDATA_APPEND(self->file, memo_len, -1);
740 res=0; /* Job well done ;) */
741 goto finally;
742 }
743 else {
744 if (p >= 256) {
745 c_str[0] = LONG_BINPUT;
746 c_str[1] = (int)(p & 0xff);
747 c_str[2] = (int)((p >> 8) & 0xff);
748 c_str[3] = (int)((p >> 16) & 0xff);
749 c_str[4] = (int)((p >> 24) & 0xff);
750 len = 5;
751 }
752 else {
753 c_str[0] = BINPUT;
754 c_str[1] = p;
755 len = 2;
756 }
757 }
758
759 if ((*self->write_func)(self, c_str, len) < 0)
760 goto finally;
761
762 res = 0;
763
764 finally:
765 Py_XDECREF(py_ob_id);
766 Py_XDECREF(memo_len);
767 Py_XDECREF(t);
768
769 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000770}
771
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000772#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000773
774static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000775PyImport_Import(PyObject *module_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000776{
777 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
778 static PyObject *standard_builtins=0;
779 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000781 if (!( silly_list )) {
Tim Peterscba30e22003-02-01 06:24:36 +0000782 if (!( __import___str=PyString_FromString("__import__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000783 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000784 if (!( __builtins___str=PyString_FromString("__builtins__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000785 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000786 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000787 return NULL;
788 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000789
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000790 if ((globals=PyEval_GetGlobals())) {
791 Py_INCREF(globals);
792 __builtins__=PyObject_GetItem(globals,__builtins___str);
Tim Peterscba30e22003-02-01 06:24:36 +0000793 if (!__builtins__)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000794 goto err;
795 }
796 else {
797 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000799 if (!(standard_builtins ||
Tim Peterscba30e22003-02-01 06:24:36 +0000800 (standard_builtins=PyImport_ImportModule("__builtin__"))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000801 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000803 __builtins__=standard_builtins;
804 Py_INCREF(__builtins__);
805 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
Tim Peterscba30e22003-02-01 06:24:36 +0000806 if (!globals)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000807 goto err;
808 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000810 if (PyDict_Check(__builtins__)) {
811 __import__=PyObject_GetItem(__builtins__,__import___str);
812 if (!__import__) goto err;
813 }
814 else {
815 __import__=PyObject_GetAttr(__builtins__,__import___str);
816 if (!__import__) goto err;
817 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000819 r=PyObject_CallFunction(__import__,"OOOO",
820 module_name, globals, globals, silly_list);
Tim Peterscba30e22003-02-01 06:24:36 +0000821 if (!r)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000822 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000824 Py_DECREF(globals);
825 Py_DECREF(__builtins__);
826 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000828 return r;
829 err:
830 Py_XDECREF(globals);
831 Py_XDECREF(__builtins__);
832 Py_XDECREF(__import__);
833 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000834}
835
836static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000837whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000838{
839 int i, j;
840 PyObject *module = 0, *modules_dict = 0,
841 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000843 module = PyObject_GetAttrString(global, "__module__");
844 if (module) return module;
845 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000846
Tim Peterscba30e22003-02-01 06:24:36 +0000847 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000848 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000850 i = 0;
851 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000853 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000855 global_name_attr = PyObject_GetAttr(module, global_name);
856 if (!global_name_attr) {
857 PyErr_Clear();
858 continue;
859 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000861 if (global_name_attr != global) {
862 Py_DECREF(global_name_attr);
863 continue;
864 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000866 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000868 break;
869 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000871 /* The following implements the rule in pickle.py added in 1.5
872 that used __main__ if no module is found. I don't actually
873 like this rule. jlf
874 */
875 if (!j) {
876 j=1;
877 name=__main___str;
878 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000880 Py_INCREF(name);
881 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000882}
883
884
Guido van Rossum60456fd1997-04-09 17:36:32 +0000885static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000886fast_save_enter(Picklerobject *self, PyObject *obj)
887{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000888 /* if fast_container < 0, we're doing an error exit. */
889 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
890 PyObject *key = NULL;
891 if (self->fast_memo == NULL) {
892 self->fast_memo = PyDict_New();
893 if (self->fast_memo == NULL) {
894 self->fast_container = -1;
895 return 0;
896 }
897 }
898 key = PyLong_FromVoidPtr(obj);
899 if (key == NULL)
900 return 0;
901 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000902 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000903 PyErr_Format(PyExc_ValueError,
904 "fast mode: can't pickle cyclic objects including object type %s at %p",
905 obj->ob_type->tp_name, obj);
906 self->fast_container = -1;
907 return 0;
908 }
909 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000910 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000911 self->fast_container = -1;
912 return 0;
913 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000914 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000915 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000916 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000917}
918
Tim Peterscba30e22003-02-01 06:24:36 +0000919int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000920fast_save_leave(Picklerobject *self, PyObject *obj)
921{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000922 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
923 PyObject *key = PyLong_FromVoidPtr(obj);
924 if (key == NULL)
925 return 0;
926 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000927 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000928 return 0;
929 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000930 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000931 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000932 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000933}
934
935static int
Tim Peterscba30e22003-02-01 06:24:36 +0000936save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000937{
938 static char none = NONE;
939 if ((*self->write_func)(self, &none, 1) < 0)
940 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000942 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000943}
944
Guido van Rossum77f6a652002-04-03 22:41:51 +0000945static int
Tim Peterscba30e22003-02-01 06:24:36 +0000946save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000947{
Guido van Rossume2763392002-04-05 19:30:08 +0000948 static char *buf[2] = {FALSE, TRUE};
949 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000950 long l = PyInt_AS_LONG((PyIntObject *)args);
951
Guido van Rossume2763392002-04-05 19:30:08 +0000952 if ((*self->write_func)(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000953 return -1;
954
955 return 0;
956}
Tim Peters84e87f32001-03-17 04:50:51 +0000957
Guido van Rossum60456fd1997-04-09 17:36:32 +0000958static int
Tim Peterscba30e22003-02-01 06:24:36 +0000959save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000960{
961 char c_str[32];
962 long l = PyInt_AS_LONG((PyIntObject *)args);
963 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000964
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000965 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000966#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000967 || l > 0x7fffffffL
968 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000969#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000970 ) {
971 /* Text-mode pickle, or long too big to fit in the 4-byte
972 * signed BININT format: store as a string.
973 */
974 c_str[0] = INT;
975 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
976 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
977 return -1;
978 }
979 else {
980 /* Binary pickle and l fits in a signed 4-byte int. */
981 c_str[1] = (int)( l & 0xff);
982 c_str[2] = (int)((l >> 8) & 0xff);
983 c_str[3] = (int)((l >> 16) & 0xff);
984 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000986 if ((c_str[4] == 0) && (c_str[3] == 0)) {
987 if (c_str[2] == 0) {
988 c_str[0] = BININT1;
989 len = 2;
990 }
991 else {
992 c_str[0] = BININT2;
993 len = 3;
994 }
995 }
996 else {
997 c_str[0] = BININT;
998 len = 5;
999 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001001 if ((*self->write_func)(self, c_str, len) < 0)
1002 return -1;
1003 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001004
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001005 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001006}
1007
1008
1009static int
Tim Peterscba30e22003-02-01 06:24:36 +00001010save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001011{
1012 int size, res = -1;
1013 PyObject *repr = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001014
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001015 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001016
Tim Peterscba30e22003-02-01 06:24:36 +00001017 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001018 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001020 if ((size = PyString_Size(repr)) < 0)
1021 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001023 if ((*self->write_func)(self, &l, 1) < 0)
1024 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001026 if ((*self->write_func)(self,
Tim Peterscba30e22003-02-01 06:24:36 +00001027 PyString_AS_STRING((PyStringObject *)repr),
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001028 size) < 0)
1029 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001031 if ((*self->write_func)(self, "\n", 1) < 0)
1032 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001034 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001036 finally:
1037 Py_XDECREF(repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001039 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001040}
1041
1042
1043static int
Tim Peterscba30e22003-02-01 06:24:36 +00001044save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001045{
1046 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001048 if (self->bin) {
1049 int s, e;
1050 double f;
1051 long fhi, flo;
1052 char str[9];
1053 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001055 *p = BINFLOAT;
1056 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001058 if (x < 0) {
1059 s = 1;
1060 x = -x;
1061 }
1062 else
1063 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001065 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001067 /* Normalize f to be in the range [1.0, 2.0) */
1068 if (0.5 <= f && f < 1.0) {
1069 f *= 2.0;
1070 e--;
1071 }
1072 else if (f == 0.0) {
1073 e = 0;
1074 }
1075 else {
1076 PyErr_SetString(PyExc_SystemError,
1077 "frexp() result out of range");
1078 return -1;
1079 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001081 if (e >= 1024) {
1082 /* XXX 1024 itself is reserved for Inf/NaN */
1083 PyErr_SetString(PyExc_OverflowError,
1084 "float too large to pack with d format");
1085 return -1;
1086 }
1087 else if (e < -1022) {
1088 /* Gradual underflow */
1089 f = ldexp(f, 1022 + e);
1090 e = 0;
1091 }
1092 else if (!(e == 0 && f == 0.0)) {
1093 e += 1023;
1094 f -= 1.0; /* Get rid of leading 1 */
1095 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001096
Tim Peterscba30e22003-02-01 06:24:36 +00001097 /* fhi receives the high 28 bits;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001098 flo the low 24 bits (== 52 bits) */
1099 f *= 268435456.0; /* 2**28 */
1100 fhi = (long) floor(f); /* Truncate */
1101 f -= (double)fhi;
1102 f *= 16777216.0; /* 2**24 */
1103 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001105 /* First byte */
1106 *p = (s<<7) | (e>>4);
1107 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001109 /* Second byte */
1110 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1111 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001113 /* Third byte */
1114 *p = (unsigned char) ((fhi>>16) & 0xFF);
1115 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001117 /* Fourth byte */
1118 *p = (unsigned char) ((fhi>>8) & 0xFF);
1119 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001121 /* Fifth byte */
1122 *p = (unsigned char) (fhi & 0xFF);
1123 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001125 /* Sixth byte */
1126 *p = (unsigned char) ((flo>>16) & 0xFF);
1127 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001129 /* Seventh byte */
1130 *p = (unsigned char) ((flo>>8) & 0xFF);
1131 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001133 /* Eighth byte */
1134 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001136 if ((*self->write_func)(self, str, 9) < 0)
1137 return -1;
1138 }
1139 else {
1140 char c_str[250];
1141 c_str[0] = FLOAT;
1142 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001144 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1145 return -1;
1146 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001148 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001149}
1150
1151
1152static int
Tim Peterscba30e22003-02-01 06:24:36 +00001153save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001154{
1155 int size, len;
1156 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001158 if ((size = PyString_Size(args)) < 0)
1159 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001161 if (!self->bin) {
1162 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001164 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001165
Tim Peterscba30e22003-02-01 06:24:36 +00001166 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001167 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001169 if ((len = PyString_Size(repr)) < 0)
1170 goto err;
1171 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001173 if ((*self->write_func)(self, &string, 1) < 0)
1174 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001176 if ((*self->write_func)(self, repr_str, len) < 0)
1177 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001179 if ((*self->write_func)(self, "\n", 1) < 0)
1180 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001182 Py_XDECREF(repr);
1183 }
1184 else {
1185 int i;
1186 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001188 if ((size = PyString_Size(args)) < 0)
1189 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001190
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001191 if (size < 256) {
1192 c_str[0] = SHORT_BINSTRING;
1193 c_str[1] = size;
1194 len = 2;
1195 }
1196 else {
1197 c_str[0] = BINSTRING;
1198 for (i = 1; i < 5; i++)
1199 c_str[i] = (int)(size >> ((i - 1) * 8));
1200 len = 5;
1201 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001203 if ((*self->write_func)(self, c_str, len) < 0)
1204 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001206 if (size > 128 && Pdata_Check(self->file)) {
1207 if (write_other(self, NULL, 0) < 0) return -1;
1208 PDATA_APPEND(self->file, args, -1);
1209 }
1210 else {
1211 if ((*self->write_func)(self,
1212 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1213 return -1;
1214 }
1215 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001217 if (doput)
1218 if (put(self, args) < 0)
1219 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001221 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001223 err:
1224 Py_XDECREF(repr);
1225 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001226}
1227
1228
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001229#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001230/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1231 backslash and newline characters to \uXXXX escapes. */
1232static PyObject *
1233modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1234{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001235 PyObject *repr;
1236 char *p;
1237 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001239 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001241 repr = PyString_FromStringAndSize(NULL, 6 * size);
1242 if (repr == NULL)
1243 return NULL;
1244 if (size == 0)
1245 return repr;
1246
1247 p = q = PyString_AS_STRING(repr);
1248 while (size-- > 0) {
1249 Py_UNICODE ch = *s++;
1250 /* Map 16-bit characters to '\uxxxx' */
1251 if (ch >= 256 || ch == '\\' || ch == '\n') {
1252 *p++ = '\\';
1253 *p++ = 'u';
1254 *p++ = hexdigit[(ch >> 12) & 0xf];
1255 *p++ = hexdigit[(ch >> 8) & 0xf];
1256 *p++ = hexdigit[(ch >> 4) & 0xf];
1257 *p++ = hexdigit[ch & 15];
1258 }
1259 /* Copy everything else as-is */
1260 else
1261 *p++ = (char) ch;
1262 }
1263 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001264 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001265 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001266}
1267
1268
Guido van Rossum60456fd1997-04-09 17:36:32 +00001269static int
Tim Peterscba30e22003-02-01 06:24:36 +00001270save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001271{
1272 int size, len;
1273 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001275 if (!PyUnicode_Check(args))
1276 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001278 if (!self->bin) {
1279 char *repr_str;
1280 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001282 repr = modified_EncodeRawUnicodeEscape(
1283 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001284 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001285 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001287 if ((len = PyString_Size(repr)) < 0)
1288 goto err;
1289 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001291 if ((*self->write_func)(self, &string, 1) < 0)
1292 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001294 if ((*self->write_func)(self, repr_str, len) < 0)
1295 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001297 if ((*self->write_func)(self, "\n", 1) < 0)
1298 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300 Py_XDECREF(repr);
1301 }
1302 else {
1303 int i;
1304 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001305
Tim Peterscba30e22003-02-01 06:24:36 +00001306 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001307 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001309 if ((size = PyString_Size(repr)) < 0)
1310 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001312 c_str[0] = BINUNICODE;
1313 for (i = 1; i < 5; i++)
1314 c_str[i] = (int)(size >> ((i - 1) * 8));
1315 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001317 if ((*self->write_func)(self, c_str, len) < 0)
1318 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001319
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001320 if (size > 128 && Pdata_Check(self->file)) {
1321 if (write_other(self, NULL, 0) < 0)
1322 goto err;
1323 PDATA_APPEND(self->file, repr, -1);
1324 }
1325 else {
1326 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1327 size) < 0)
1328 goto err;
1329 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001331 Py_DECREF(repr);
1332 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001334 if (doput)
1335 if (put(self, args) < 0)
1336 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001338 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001340 err:
1341 Py_XDECREF(repr);
1342 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001343}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001344#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001345
1346
1347static int
Tim Peterscba30e22003-02-01 06:24:36 +00001348save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001349{
1350 PyObject *element = 0, *py_tuple_id = 0;
1351 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001353 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001355 if ((*self->write_func)(self, &MARKv, 1) < 0)
1356 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001358 if ((len = PyTuple_Size(args)) < 0)
1359 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001361 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001362 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001363 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001364
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001365 if (save(self, element, 0) < 0)
1366 goto finally;
1367 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001368
Tim Peterscba30e22003-02-01 06:24:36 +00001369 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001370 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001372 if (len) {
1373 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1374 if (self->bin) {
1375 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001377 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1378 goto finally;
1379 }
1380 else {
1381 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001383 for (i = 0; i <= len; i++) {
1384 if ((*self->write_func)(self, &pop, 1) < 0)
1385 goto finally;
1386 }
1387 }
Tim Peters84e87f32001-03-17 04:50:51 +00001388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001389 if (get(self, py_tuple_id) < 0)
1390 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001392 res = 0;
1393 goto finally;
1394 }
1395 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001397 if ((*self->write_func)(self, &tuple, 1) < 0) {
1398 goto finally;
1399 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001401 if (put(self, args) < 0)
1402 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001404 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001406 finally:
1407 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001409 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001410}
1411
1412static int
Tim Peterscba30e22003-02-01 06:24:36 +00001413save_empty_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001414{
1415 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001417 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001418}
1419
1420
1421static int
Tim Peterscba30e22003-02-01 06:24:36 +00001422save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001423{
1424 PyObject *element = 0;
1425 int s_len, len, i, using_appends, res = -1;
1426 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001428 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001429
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001430 if (self->fast && !fast_save_enter(self, args))
1431 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001433 if (self->bin) {
1434 s[0] = EMPTY_LIST;
1435 s_len = 1;
1436 }
1437 else {
1438 s[0] = MARK;
1439 s[1] = LIST;
1440 s_len = 2;
1441 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001443 if ((len = PyList_Size(args)) < 0)
1444 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001446 if ((*self->write_func)(self, s, s_len) < 0)
1447 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001449 if (len == 0) {
1450 if (put(self, args) < 0)
1451 goto finally;
1452 }
1453 else {
1454 if (put2(self, args) < 0)
1455 goto finally;
1456 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001458 if ((using_appends = (self->bin && (len > 1))))
1459 if ((*self->write_func)(self, &MARKv, 1) < 0)
1460 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001462 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001463 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001464 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001466 if (save(self, element, 0) < 0)
1467 goto finally;
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, &append, 1) < 0)
1471 goto finally;
1472 }
1473 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001475 if (using_appends) {
1476 if ((*self->write_func)(self, &appends, 1) < 0)
1477 goto finally;
1478 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001480 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001482 finally:
1483 if (self->fast && !fast_save_leave(self, args))
1484 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001486 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001487}
1488
1489
Guido van Rossum60456fd1997-04-09 17:36:32 +00001490static int
Tim Peterscba30e22003-02-01 06:24:36 +00001491save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001492{
1493 PyObject *key = 0, *value = 0;
1494 int i, len, res = -1, using_setitems;
1495 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001497 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001499 if (self->fast && !fast_save_enter(self, args))
1500 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001502 if (self->bin) {
1503 s[0] = EMPTY_DICT;
1504 len = 1;
1505 }
1506 else {
1507 s[0] = MARK;
1508 s[1] = DICT;
1509 len = 2;
1510 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001512 if ((*self->write_func)(self, s, len) < 0)
1513 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001515 if ((len = PyDict_Size(args)) < 0)
1516 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001518 if (len == 0) {
1519 if (put(self, args) < 0)
1520 goto finally;
1521 }
1522 else {
1523 if (put2(self, args) < 0)
1524 goto finally;
1525 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001527 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1528 if ((*self->write_func)(self, &MARKv, 1) < 0)
1529 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001531 i = 0;
1532 while (PyDict_Next(args, &i, &key, &value)) {
1533 if (save(self, key, 0) < 0)
1534 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001536 if (save(self, value, 0) < 0)
1537 goto finally;
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, &setitem, 1) < 0)
1541 goto finally;
1542 }
1543 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001545 if (using_setitems) {
1546 if ((*self->write_func)(self, &setitems, 1) < 0)
1547 goto finally;
1548 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001550 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001552 finally:
1553 if (self->fast && !fast_save_leave(self, args))
1554 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001556 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001557}
1558
1559
Tim Peters84e87f32001-03-17 04:50:51 +00001560static int
Tim Peterscba30e22003-02-01 06:24:36 +00001561save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001562{
1563 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1564 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1565 char *module_str, *name_str;
1566 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001568 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001570 if (self->fast && !fast_save_enter(self, args))
1571 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001573 if ((*self->write_func)(self, &MARKv, 1) < 0)
1574 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001575
Tim Peterscba30e22003-02-01 06:24:36 +00001576 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001577 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001579 if (self->bin) {
1580 if (save(self, class, 0) < 0)
1581 goto finally;
1582 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001583
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001584 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1585 PyObject *element = 0;
1586 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001588 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001589 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001590 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001592 if ((len = PyObject_Size(class_args)) < 0)
1593 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001595 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001596 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001597 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001598
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001599 if (save(self, element, 0) < 0) {
1600 Py_DECREF(element);
1601 goto finally;
1602 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001603
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001604 Py_DECREF(element);
1605 }
1606 }
1607 else {
1608 PyErr_Clear();
1609 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001611 if (!self->bin) {
1612 if (!( name = ((PyClassObject *)class)->cl_name )) {
1613 PyErr_SetString(PicklingError, "class has no name");
1614 goto finally;
1615 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001616
Tim Peterscba30e22003-02-01 06:24:36 +00001617 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001618 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001619
Tim Peters84e87f32001-03-17 04:50:51 +00001620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001621 if ((module_size = PyString_Size(module)) < 0 ||
1622 (name_size = PyString_Size(name)) < 0)
1623 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001625 module_str = PyString_AS_STRING((PyStringObject *)module);
1626 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001628 if ((*self->write_func)(self, &inst, 1) < 0)
1629 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001631 if ((*self->write_func)(self, module_str, module_size) < 0)
1632 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001634 if ((*self->write_func)(self, "\n", 1) < 0)
1635 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001637 if ((*self->write_func)(self, name_str, name_size) < 0)
1638 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001640 if ((*self->write_func)(self, "\n", 1) < 0)
1641 goto finally;
1642 }
1643 else if ((*self->write_func)(self, &obj, 1) < 0) {
1644 goto finally;
1645 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001647 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1648 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001649 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001650 goto finally;
1651 }
1652 else {
1653 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001655 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1656 PyErr_Clear();
1657 res = 0;
1658 goto finally;
1659 }
1660 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001662 if (!PyDict_Check(state)) {
1663 if (put2(self, args) < 0)
1664 goto finally;
1665 }
1666 else {
1667 if (put(self, args) < 0)
1668 goto finally;
1669 }
Tim Peters84e87f32001-03-17 04:50:51 +00001670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001671 if (save(self, state, 0) < 0)
1672 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001674 if ((*self->write_func)(self, &build, 1) < 0)
1675 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001676
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001677 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001679 finally:
1680 if (self->fast && !fast_save_leave(self, args))
1681 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001683 Py_XDECREF(module);
1684 Py_XDECREF(class);
1685 Py_XDECREF(state);
1686 Py_XDECREF(getinitargs_func);
1687 Py_XDECREF(getstate_func);
1688 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001690 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001691}
1692
1693
Guido van Rossum60456fd1997-04-09 17:36:32 +00001694static int
Tim Peterscba30e22003-02-01 06:24:36 +00001695save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001696{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001697 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001698 char *name_str, *module_str;
1699 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001701 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001703 if (name) {
1704 global_name = name;
1705 Py_INCREF(global_name);
1706 }
1707 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001708 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001709 goto finally;
1710 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001711
Tim Peterscba30e22003-02-01 06:24:36 +00001712 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001713 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001715 if ((module_size = PyString_Size(module)) < 0 ||
1716 (name_size = PyString_Size(global_name)) < 0)
1717 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001719 module_str = PyString_AS_STRING((PyStringObject *)module);
1720 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001721
Guido van Rossum75bfd052002-12-24 18:10:07 +00001722 /* XXX This can be doing a relative import. Clearly it shouldn't,
1723 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001724 mod = PyImport_ImportModule(module_str);
1725 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001726 cPickle_ErrFormat(PicklingError,
1727 "Can't pickle %s: it's not found as %s.%s",
1728 "OSS", args, module, global_name);
1729 goto finally;
1730 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001731 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001732 if (klass == NULL) {
1733 cPickle_ErrFormat(PicklingError,
1734 "Can't pickle %s: it's not found as %s.%s",
1735 "OSS", args, module, global_name);
1736 goto finally;
1737 }
1738 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001739 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001740 cPickle_ErrFormat(PicklingError,
1741 "Can't pickle %s: it's not the same object as %s.%s",
1742 "OSS", args, module, global_name);
1743 goto finally;
1744 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001745 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001747 if ((*self->write_func)(self, &global, 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, module_str, module_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 ((*self->write_func)(self, name_str, name_size) < 0)
1757 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001759 if ((*self->write_func)(self, "\n", 1) < 0)
1760 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001762 if (put(self, args) < 0)
1763 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001765 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001767 finally:
1768 Py_XDECREF(module);
1769 Py_XDECREF(global_name);
1770 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001772 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001773}
1774
Guido van Rossum60456fd1997-04-09 17:36:32 +00001775static int
Tim Peterscba30e22003-02-01 06:24:36 +00001776save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001777{
1778 PyObject *pid = 0;
1779 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001781 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001783 Py_INCREF(args);
1784 ARG_TUP(self, args);
1785 if (self->arg) {
1786 pid = PyObject_Call(f, self->arg, NULL);
1787 FREE_ARG_TUP(self);
1788 }
1789 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001791 if (pid != Py_None) {
1792 if (!self->bin) {
1793 if (!PyString_Check(pid)) {
1794 PyErr_SetString(PicklingError,
1795 "persistent id must be string");
1796 goto finally;
1797 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001799 if ((*self->write_func)(self, &persid, 1) < 0)
1800 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001802 if ((size = PyString_Size(pid)) < 0)
1803 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001805 if ((*self->write_func)(self,
1806 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1807 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001809 if ((*self->write_func)(self, "\n", 1) < 0)
1810 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001812 res = 1;
1813 goto finally;
1814 }
1815 else if (save(self, pid, 1) >= 0) {
1816 if ((*self->write_func)(self, &binpersid, 1) < 0)
1817 res = -1;
1818 else
1819 res = 1;
1820 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001822 goto finally;
1823 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001825 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001827 finally:
1828 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001830 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001831}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001832
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001833
Tim Peters84e87f32001-03-17 04:50:51 +00001834static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001835save_reduce(Picklerobject *self, PyObject *callable,
Tim Peterscba30e22003-02-01 06:24:36 +00001836 PyObject *tup, PyObject *state, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001837{
1838 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001840 if (save(self, callable, 0) < 0)
1841 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001843 if (save(self, tup, 0) < 0)
1844 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001846 if ((*self->write_func)(self, &reduce, 1) < 0)
1847 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001849 if (ob != NULL) {
1850 if (state && !PyDict_Check(state)) {
1851 if (put2(self, ob) < 0)
1852 return -1;
1853 }
1854 else {
1855 if (put(self, ob) < 0)
1856 return -1;
1857 }
1858 }
Tim Peters84e87f32001-03-17 04:50:51 +00001859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001860 if (state) {
1861 if (save(self, state, 0) < 0)
1862 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001864 if ((*self->write_func)(self, &build, 1) < 0)
1865 return -1;
1866 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001868 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001869}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001870
Guido van Rossum60456fd1997-04-09 17:36:32 +00001871static int
Tim Peterscba30e22003-02-01 06:24:36 +00001872save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001873{
1874 PyTypeObject *type;
1875 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1876 *callable = 0, *state = 0;
1877 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001878
Martin v. Löwis5a395302002-08-04 08:20:23 +00001879 if (self->nesting++ > Py_GetRecursionLimit()){
1880 PyErr_SetString(PyExc_RuntimeError,
1881 "maximum recursion depth exceeded");
1882 goto finally;
1883 }
1884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001885 if (!pers_save && self->pers_func) {
1886 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1887 res = tmp;
1888 goto finally;
1889 }
1890 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001892 if (args == Py_None) {
1893 res = save_none(self, args);
1894 goto finally;
1895 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001897 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001898
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001899 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001900 case 'b':
1901 if (args == Py_False || args == Py_True) {
1902 res = save_bool(self, args);
1903 goto finally;
1904 }
1905 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001906 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001907 if (type == &PyInt_Type) {
1908 res = save_int(self, args);
1909 goto finally;
1910 }
1911 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001912
Guido van Rossum60456fd1997-04-09 17:36:32 +00001913 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001914 if (type == &PyLong_Type) {
1915 res = save_long(self, args);
1916 goto finally;
1917 }
1918 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001919
Guido van Rossum60456fd1997-04-09 17:36:32 +00001920 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001921 if (type == &PyFloat_Type) {
1922 res = save_float(self, args);
1923 goto finally;
1924 }
1925 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001926
Guido van Rossum60456fd1997-04-09 17:36:32 +00001927 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001928 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
1929 if (self->bin) res = save_empty_tuple(self, args);
1930 else res = save_tuple(self, args);
1931 goto finally;
1932 }
1933 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001934
Guido van Rossum60456fd1997-04-09 17:36:32 +00001935 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001936 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
1937 res = save_string(self, args, 0);
1938 goto finally;
1939 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001940
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001941#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001942 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001943 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1944 res = save_unicode(self, args, 0);
1945 goto finally;
1946 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001947#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001948 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001950 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00001951 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001952 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001954 if (PyDict_GetItem(self->memo, py_ob_id)) {
1955 if (get(self, py_ob_id) < 0)
1956 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001958 res = 0;
1959 goto finally;
1960 }
1961 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001963 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001964 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001965 if (type == &PyString_Type) {
1966 res = save_string(self, args, 1);
1967 goto finally;
1968 }
1969 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001970
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001971#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001972 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001973 if (type == &PyUnicode_Type) {
1974 res = save_unicode(self, args, 1);
1975 goto finally;
1976 }
1977 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001978#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001979
Guido van Rossum60456fd1997-04-09 17:36:32 +00001980 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001981 if (type == &PyTuple_Type) {
1982 res = save_tuple(self, args);
1983 goto finally;
1984 }
1985 if (type == &PyType_Type) {
1986 res = save_global(self, args, NULL);
1987 goto finally;
1988 }
1989 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001990
Guido van Rossum60456fd1997-04-09 17:36:32 +00001991 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001992 if (type == &PyList_Type) {
1993 res = save_list(self, args);
1994 goto finally;
1995 }
1996 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001997
1998 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001999 if (type == &PyDict_Type) {
2000 res = save_dict(self, args);
2001 goto finally;
2002 }
2003 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002004
2005 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002006 if (type == &PyInstance_Type) {
2007 res = save_inst(self, args);
2008 goto finally;
2009 }
2010 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002011
2012 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002013 if (type == &PyClass_Type) {
2014 res = save_global(self, args, NULL);
2015 goto finally;
2016 }
2017 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002018
2019 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002020 if (type == &PyFunction_Type) {
2021 res = save_global(self, args, NULL);
2022 goto finally;
2023 }
2024 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002025
2026 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002027 if (type == &PyCFunction_Type) {
2028 res = save_global(self, args, NULL);
2029 goto finally;
2030 }
2031 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002033 if (!pers_save && self->inst_pers_func) {
2034 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2035 res = tmp;
2036 goto finally;
2037 }
2038 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002039
Jeremy Hylton39c61162002-07-16 19:47:43 +00002040 if (PyType_IsSubtype(type, &PyType_Type)) {
2041 res = save_global(self, args, NULL);
2042 goto finally;
2043 }
2044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002045 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2046 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002048 Py_INCREF(args);
2049 ARG_TUP(self, args);
2050 if (self->arg) {
2051 t = PyObject_Call(__reduce__, self->arg, NULL);
2052 FREE_ARG_TUP(self);
2053 }
2054 if (! t) goto finally;
2055 }
2056 else {
2057 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002059 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2060 t = PyObject_Call(__reduce__, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002061 if (!t)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002062 goto finally;
2063 }
2064 else {
2065 PyErr_Clear();
2066 }
2067 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002069 if (t) {
2070 if (PyString_Check(t)) {
2071 res = save_global(self, args, t);
2072 goto finally;
2073 }
Tim Peters84e87f32001-03-17 04:50:51 +00002074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002075 if (!PyTuple_Check(t)) {
2076 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2077 "be a tuple", "O", __reduce__);
2078 goto finally;
2079 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002081 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002083 if ((size != 3) && (size != 2)) {
2084 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2085 "contain only two or three elements", "O", __reduce__);
2086 goto finally;
2087 }
Tim Peters84e87f32001-03-17 04:50:51 +00002088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002089 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002091 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002093 if (size > 2) {
2094 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002095 if (state == Py_None)
2096 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002097 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002099 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2100 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2101 "returned by %s must be a tuple", "O", __reduce__);
2102 goto finally;
2103 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002105 res = save_reduce(self, callable, arg_tup, state, args);
2106 goto finally;
2107 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002109 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002111 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002112 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002113 Py_XDECREF(py_ob_id);
2114 Py_XDECREF(__reduce__);
2115 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002117 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002118}
2119
2120
2121static int
Tim Peterscba30e22003-02-01 06:24:36 +00002122dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002123{
2124 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002126 if (save(self, args, 0) < 0)
2127 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002129 if ((*self->write_func)(self, &stop, 1) < 0)
2130 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002132 if ((*self->write_func)(self, NULL, 0) < 0)
2133 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002135 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002136}
2137
2138static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002139Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002140{
Tim Peterscba30e22003-02-01 06:24:36 +00002141 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002142 PyDict_Clear(self->memo);
2143 Py_INCREF(Py_None);
2144 return Py_None;
2145}
2146
2147static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002148Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002149{
2150 int l, i, rsize, ssize, clear=1, lm;
2151 long ik;
2152 PyObject *k, *r;
2153 char *s, *p, *have_get;
2154 Pdata *data;
2155
2156 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002157 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002158 return NULL;
2159
2160 /* Check to make sure we are based on a list */
2161 if (! Pdata_Check(self->file)) {
2162 PyErr_SetString(PicklingError,
2163 "Attempt to getvalue() a non-list-based pickler");
2164 return NULL;
2165 }
2166
2167 /* flush write buffer */
2168 if (write_other(self, NULL, 0) < 0) return NULL;
2169
2170 data=(Pdata*)self->file;
2171 l=data->length;
2172
2173 /* set up an array to hold get/put status */
2174 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2175 lm++;
2176 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2177 memset(have_get,0,lm);
2178
2179 /* Scan for gets. */
2180 for (rsize=0, i=l; --i >= 0; ) {
2181 k=data->data[i];
2182
2183 if (PyString_Check(k)) {
2184 rsize += PyString_GET_SIZE(k);
2185 }
2186
2187 else if (PyInt_Check(k)) { /* put */
2188 ik=PyInt_AS_LONG((PyIntObject*)k);
2189 if (ik >= lm || ik==0) {
2190 PyErr_SetString(PicklingError,
2191 "Invalid get data");
2192 return NULL;
2193 }
2194 if (have_get[ik]) { /* with matching get */
2195 if (ik < 256) rsize += 2;
2196 else rsize+=5;
2197 }
2198 }
2199
2200 else if (! (PyTuple_Check(k) &&
2201 PyTuple_GET_SIZE(k) == 2 &&
2202 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2203 ) {
2204 PyErr_SetString(PicklingError,
2205 "Unexpected data in internal list");
2206 return NULL;
2207 }
2208
2209 else { /* put */
2210 ik=PyInt_AS_LONG((PyIntObject*)k);
2211 if (ik >= lm || ik==0) {
2212 PyErr_SetString(PicklingError,
2213 "Invalid get data");
2214 return NULL;
2215 }
2216 have_get[ik]=1;
2217 if (ik < 256) rsize += 2;
2218 else rsize+=5;
2219 }
2220
2221 }
2222
2223 /* Now generate the result */
2224 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2225 s=PyString_AS_STRING((PyStringObject*)r);
2226
2227 for (i=0; i<l; i++) {
2228 k=data->data[i];
2229
2230 if (PyString_Check(k)) {
2231 ssize=PyString_GET_SIZE(k);
2232 if (ssize) {
2233 p=PyString_AS_STRING((PyStringObject*)k);
2234 while (--ssize >= 0) *s++=*p++;
2235 }
2236 }
2237
2238 else if (PyTuple_Check(k)) { /* get */
2239 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2240 if (ik < 256) {
2241 *s++ = BINGET;
2242 *s++ = (int)(ik & 0xff);
2243 }
2244 else {
2245 *s++ = LONG_BINGET;
2246 *s++ = (int)(ik & 0xff);
2247 *s++ = (int)((ik >> 8) & 0xff);
2248 *s++ = (int)((ik >> 16) & 0xff);
2249 *s++ = (int)((ik >> 24) & 0xff);
2250 }
2251 }
2252
2253 else { /* put */
2254 ik=PyInt_AS_LONG((PyIntObject*)k);
2255
2256 if (have_get[ik]) { /* with matching get */
2257 if (ik < 256) {
2258 *s++ = BINPUT;
2259 *s++ = (int)(ik & 0xff);
2260 }
2261 else {
2262 *s++ = LONG_BINPUT;
2263 *s++ = (int)(ik & 0xff);
2264 *s++ = (int)((ik >> 8) & 0xff);
2265 *s++ = (int)((ik >> 16) & 0xff);
2266 *s++ = (int)((ik >> 24) & 0xff);
2267 }
2268 }
2269 }
2270
2271 }
2272
2273 if (clear) {
2274 PyDict_Clear(self->memo);
2275 Pdata_clear(data,0);
2276 }
2277
2278 free(have_get);
2279 return r;
2280 err:
2281 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002282 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002283}
2284
2285static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002286Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002287{
2288 PyObject *ob;
2289 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002290
Tim Peterscba30e22003-02-01 06:24:36 +00002291 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002292 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002294 if (dump(self, ob) < 0)
2295 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002297 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002299 /* XXX Why does dump() return self? */
2300 Py_INCREF(self);
2301 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002302}
2303
2304
Tim Peterscba30e22003-02-01 06:24:36 +00002305static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002306{
Neal Norwitzb0493252002-03-31 14:44:22 +00002307 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002308 PyDoc_STR("dump(object) -- "
2309 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002310 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002311 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002312 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002313 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002314 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002315};
2316
2317
2318static Picklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00002319newPicklerobject(PyObject *file, int bin)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002320{
2321 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002322
Tim Peterscba30e22003-02-01 06:24:36 +00002323 if (!( self = PyObject_New(Picklerobject, &Picklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002324 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002326 self->fp = NULL;
2327 self->write = NULL;
2328 self->memo = NULL;
2329 self->arg = NULL;
2330 self->pers_func = NULL;
2331 self->inst_pers_func = NULL;
2332 self->write_buf = NULL;
2333 self->bin = bin;
2334 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002335 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002336 self->fast_container = 0;
2337 self->fast_memo = NULL;
2338 self->buf_size = 0;
2339 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002341 if (file)
2342 Py_INCREF(file);
2343 else
2344 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002345
Tim Peterscba30e22003-02-01 06:24:36 +00002346 if (!( self->file = file ))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002347 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002348
Tim Peterscba30e22003-02-01 06:24:36 +00002349 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002350 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002352 if (PyFile_Check(file)) {
2353 self->fp = PyFile_AsFile(file);
2354 if (self->fp == NULL) {
2355 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2356 goto err;
2357 }
2358 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002359 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002360 else if (PycStringIO_OutputCheck(file)) {
2361 self->write_func = write_cStringIO;
2362 }
2363 else if (file == Py_None) {
2364 self->write_func = write_none;
2365 }
2366 else {
2367 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002369 if (! Pdata_Check(file)) {
2370 self->write = PyObject_GetAttr(file, write_str);
2371 if (!self->write) {
2372 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002373 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002374 "argument must have 'write' "
2375 "attribute");
2376 goto err;
2377 }
2378 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002380 if (!( self->write_buf =
2381 (char *)malloc(WRITE_BUF_SIZE * sizeof(char)))) {
2382 PyErr_NoMemory();
2383 goto err;
2384 }
2385 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002387 if (PyEval_GetRestricted()) {
2388 /* Restricted execution, get private tables */
2389 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002391 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2392 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2393 Py_DECREF(m);
2394 if (!( self->dispatch_table )) goto err;
2395 }
2396 else {
2397 self->dispatch_table=dispatch_table;
2398 Py_INCREF(dispatch_table);
2399 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002401 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002403 err:
2404 Py_DECREF((PyObject *)self);
2405 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002406}
2407
2408
2409static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002410get_Pickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002411{
2412 PyObject *file = NULL;
2413 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002415 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
2416 PyErr_Clear();
2417 bin = 0;
2418 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2419 return NULL;
2420 }
2421 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002422}
2423
2424
2425static void
Tim Peterscba30e22003-02-01 06:24:36 +00002426Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002427{
2428 Py_XDECREF(self->write);
2429 Py_XDECREF(self->memo);
2430 Py_XDECREF(self->fast_memo);
2431 Py_XDECREF(self->arg);
2432 Py_XDECREF(self->file);
2433 Py_XDECREF(self->pers_func);
2434 Py_XDECREF(self->inst_pers_func);
2435 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002437 if (self->write_buf) {
2438 free(self->write_buf);
2439 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002441 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002442}
2443
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002444static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002445Pickler_get_pers_func(Picklerobject *p)
2446{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002447 if (p->pers_func == NULL)
2448 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2449 else
2450 Py_INCREF(p->pers_func);
2451 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002452}
2453
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002454static int
2455Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2456{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002457 if (v == NULL) {
2458 PyErr_SetString(PyExc_TypeError,
2459 "attribute deletion is not supported");
2460 return -1;
2461 }
2462 Py_XDECREF(p->pers_func);
2463 Py_INCREF(v);
2464 p->pers_func = v;
2465 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002466}
2467
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002468static int
2469Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2470{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002471 if (v == NULL) {
2472 PyErr_SetString(PyExc_TypeError,
2473 "attribute deletion is not supported");
2474 return -1;
2475 }
2476 Py_XDECREF(p->inst_pers_func);
2477 Py_INCREF(v);
2478 p->inst_pers_func = v;
2479 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002480}
2481
2482static PyObject *
2483Pickler_get_memo(Picklerobject *p)
2484{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002485 if (p->memo == NULL)
2486 PyErr_SetString(PyExc_AttributeError, "memo");
2487 else
2488 Py_INCREF(p->memo);
2489 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002490}
2491
2492static int
2493Pickler_set_memo(Picklerobject *p, PyObject *v)
2494{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002495 if (v == NULL) {
2496 PyErr_SetString(PyExc_TypeError,
2497 "attribute deletion is not supported");
2498 return -1;
2499 }
2500 if (!PyDict_Check(v)) {
2501 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2502 return -1;
2503 }
2504 Py_XDECREF(p->memo);
2505 Py_INCREF(v);
2506 p->memo = v;
2507 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002508}
2509
2510static PyObject *
2511Pickler_get_error(Picklerobject *p)
2512{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002513 /* why is this an attribute on the Pickler? */
2514 Py_INCREF(PicklingError);
2515 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002516}
2517
2518static PyMemberDef Pickler_members[] = {
2519 {"binary", T_INT, offsetof(Picklerobject, bin)},
2520 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002521 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002522};
2523
2524static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002525 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002526 (setter)Pickler_set_pers_func},
2527 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2528 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002529 {"PicklingError", (getter)Pickler_get_error, NULL},
2530 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002531};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002532
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002533PyDoc_STRVAR(Picklertype__doc__,
2534"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002535
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002536static PyTypeObject Picklertype = {
2537 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002538 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002539 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002540 sizeof(Picklerobject), /*tp_basicsize*/
2541 0,
2542 (destructor)Pickler_dealloc, /* tp_dealloc */
2543 0, /* tp_print */
2544 0, /* tp_getattr */
2545 0, /* tp_setattr */
2546 0, /* tp_compare */
2547 0, /* tp_repr */
2548 0, /* tp_as_number */
2549 0, /* tp_as_sequence */
2550 0, /* tp_as_mapping */
2551 0, /* tp_hash */
2552 0, /* tp_call */
2553 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002554 PyObject_GenericGetAttr, /* tp_getattro */
2555 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002556 0, /* tp_as_buffer */
2557 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2558 Picklertype__doc__, /* tp_doc */
2559 0, /* tp_traverse */
2560 0, /* tp_clear */
2561 0, /* tp_richcompare */
2562 0, /* tp_weaklistoffset */
2563 0, /* tp_iter */
2564 0, /* tp_iternext */
2565 Pickler_methods, /* tp_methods */
2566 Pickler_members, /* tp_members */
2567 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002568};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002569
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002570static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002571find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002572{
2573 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002575 if (fc) {
2576 if (fc==Py_None) {
2577 PyErr_SetString(UnpicklingError,
2578 "Global and instance pickles are not supported.");
2579 return NULL;
2580 }
Tim Peterscba30e22003-02-01 06:24:36 +00002581 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002582 py_global_name);
2583 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002585 module = PySys_GetObject("modules");
2586 if (module == NULL)
2587 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002589 module = PyDict_GetItem(module, py_module_name);
2590 if (module == NULL) {
2591 module = PyImport_Import(py_module_name);
2592 if (!module)
2593 return NULL;
2594 global = PyObject_GetAttr(module, py_global_name);
2595 Py_DECREF(module);
2596 }
2597 else
2598 global = PyObject_GetAttr(module, py_global_name);
2599 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002600}
2601
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002602static int
Tim Peterscba30e22003-02-01 06:24:36 +00002603marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002604{
2605 if (self->num_marks < 1) {
2606 PyErr_SetString(UnpicklingError, "could not find MARK");
2607 return -1;
2608 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002610 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002611}
2612
Tim Peters84e87f32001-03-17 04:50:51 +00002613
Guido van Rossum60456fd1997-04-09 17:36:32 +00002614static int
Tim Peterscba30e22003-02-01 06:24:36 +00002615load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002616{
2617 PDATA_APPEND(self->stack, Py_None, -1);
2618 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002619}
2620
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002621static int
Tim Peterscba30e22003-02-01 06:24:36 +00002622bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002623{
2624 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2625 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002626}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002627
2628static int
Tim Peterscba30e22003-02-01 06:24:36 +00002629load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002630{
2631 PyObject *py_int = 0;
2632 char *endptr, *s;
2633 int len, res = -1;
2634 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002636 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2637 if (len < 2) return bad_readline();
2638 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002640 errno = 0;
2641 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002643 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2644 /* Hm, maybe we've got something long. Let's try reading
2645 it as a Python long object. */
2646 errno = 0;
2647 py_int = PyLong_FromString(s, NULL, 0);
2648 if (py_int == NULL) {
2649 PyErr_SetString(PyExc_ValueError,
2650 "could not convert string to int");
2651 goto finally;
2652 }
2653 }
2654 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002655 if (len == 3 && (l == 0 || l == 1)) {
2656 if (!( py_int = PyBool_FromLong(l))) goto finally;
2657 }
2658 else {
2659 if (!( py_int = PyInt_FromLong(l))) goto finally;
2660 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002661 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002663 free(s);
2664 PDATA_PUSH(self->stack, py_int, -1);
2665 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002667 finally:
2668 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002670 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002671}
2672
2673
Tim Peters84e87f32001-03-17 04:50:51 +00002674static long
Tim Peterscba30e22003-02-01 06:24:36 +00002675calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002676{
2677 unsigned char c;
2678 int i;
2679 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002681 for (i = 0, l = 0L; i < x; i++) {
2682 c = (unsigned char)s[i];
2683 l |= (long)c << (i * 8);
2684 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002685#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002686 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2687 * is signed, so on a box with longs bigger than 4 bytes we need
2688 * to extend a BININT's sign bit to the full width.
2689 */
2690 if (x == 4 && l & (1L << 31))
2691 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002692#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002693 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002694}
2695
2696
2697static int
Tim Peterscba30e22003-02-01 06:24:36 +00002698load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002699{
2700 PyObject *py_int = 0;
2701 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002703 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002704
Tim Peterscba30e22003-02-01 06:24:36 +00002705 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002706 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002708 PDATA_PUSH(self->stack, py_int, -1);
2709 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002710}
2711
2712
2713static int
Tim Peterscba30e22003-02-01 06:24:36 +00002714load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002715{
2716 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002718 if ((*self->read_func)(self, &s, 4) < 0)
2719 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002721 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002722}
2723
2724
2725static int
Tim Peterscba30e22003-02-01 06:24:36 +00002726load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002727{
2728 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002730 if ((*self->read_func)(self, &s, 1) < 0)
2731 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002733 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002734}
2735
2736
2737static int
Tim Peterscba30e22003-02-01 06:24:36 +00002738load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002739{
2740 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002742 if ((*self->read_func)(self, &s, 2) < 0)
2743 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002745 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002746}
Tim Peters84e87f32001-03-17 04:50:51 +00002747
Guido van Rossum60456fd1997-04-09 17:36:32 +00002748static int
Tim Peterscba30e22003-02-01 06:24:36 +00002749load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002750{
2751 PyObject *l = 0;
2752 char *end, *s;
2753 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002755 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2756 if (len < 2) return bad_readline();
2757 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002758
Tim Peterscba30e22003-02-01 06:24:36 +00002759 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002760 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002762 free(s);
2763 PDATA_PUSH(self->stack, l, -1);
2764 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002766 finally:
2767 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002769 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002770}
2771
Tim Peters84e87f32001-03-17 04:50:51 +00002772
Guido van Rossum60456fd1997-04-09 17:36:32 +00002773static int
Tim Peterscba30e22003-02-01 06:24:36 +00002774load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002775{
2776 PyObject *py_float = 0;
2777 char *endptr, *s;
2778 int len, res = -1;
2779 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002781 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2782 if (len < 2) return bad_readline();
2783 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002785 errno = 0;
2786 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002788 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2789 PyErr_SetString(PyExc_ValueError,
2790 "could not convert string to float");
2791 goto finally;
2792 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002793
Tim Peterscba30e22003-02-01 06:24:36 +00002794 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002795 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002797 free(s);
2798 PDATA_PUSH(self->stack, py_float, -1);
2799 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002801 finally:
2802 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002804 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002805}
2806
Guido van Rossum60456fd1997-04-09 17:36:32 +00002807static int
Tim Peterscba30e22003-02-01 06:24:36 +00002808load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002809{
2810 PyObject *py_float = 0;
2811 int s, e;
2812 long fhi, flo;
2813 double x;
2814 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002816 if ((*self->read_func)(self, &p, 8) < 0)
2817 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002819 /* First byte */
2820 s = (*p>>7) & 1;
2821 e = (*p & 0x7F) << 4;
2822 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002824 /* Second byte */
2825 e |= (*p>>4) & 0xF;
2826 fhi = (*p & 0xF) << 24;
2827 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002829 /* Third byte */
2830 fhi |= (*p & 0xFF) << 16;
2831 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002833 /* Fourth byte */
2834 fhi |= (*p & 0xFF) << 8;
2835 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002837 /* Fifth byte */
2838 fhi |= *p & 0xFF;
2839 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002841 /* Sixth byte */
2842 flo = (*p & 0xFF) << 16;
2843 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002845 /* Seventh byte */
2846 flo |= (*p & 0xFF) << 8;
2847 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002849 /* Eighth byte */
2850 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002852 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2853 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002855 /* XXX This sadly ignores Inf/NaN */
2856 if (e == 0)
2857 e = -1022;
2858 else {
2859 x += 1.0;
2860 e -= 1023;
2861 }
2862 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002864 if (s)
2865 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002867 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002869 PDATA_PUSH(self->stack, py_float, -1);
2870 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002871}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002872
2873static int
Tim Peterscba30e22003-02-01 06:24:36 +00002874load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002875{
2876 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002877 int len, res = -1;
2878 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002880 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2881 if (len < 2) return bad_readline();
2882 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002883
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002884
2885 /* Strip outermost quotes */
2886 while (s[len-1] <= ' ')
2887 len--;
2888 if(s[0]=='"' && s[len-1]=='"'){
2889 s[len-1] = '\0';
2890 p = s + 1 ;
2891 len -= 2;
2892 } else if(s[0]=='\'' && s[len-1]=='\''){
2893 s[len-1] = '\0';
2894 p = s + 1 ;
2895 len -= 2;
2896 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002897 goto insecure;
2898 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002899
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002900 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
2901 if (str) {
2902 PDATA_PUSH(self->stack, str, -1);
2903 res = 0;
2904 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002905 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002906 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002907
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002908 insecure:
2909 free(s);
2910 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2911 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002912}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002913
2914
2915static int
Tim Peterscba30e22003-02-01 06:24:36 +00002916load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002917{
2918 PyObject *py_string = 0;
2919 long l;
2920 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002922 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002924 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002926 if ((*self->read_func)(self, &s, l) < 0)
2927 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002928
Tim Peterscba30e22003-02-01 06:24:36 +00002929 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002930 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002932 PDATA_PUSH(self->stack, py_string, -1);
2933 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002934}
2935
2936
2937static int
Tim Peterscba30e22003-02-01 06:24:36 +00002938load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002939{
2940 PyObject *py_string = 0;
2941 unsigned char l;
2942 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002944 if ((*self->read_func)(self, &s, 1) < 0)
2945 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002947 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002949 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002951 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002953 PDATA_PUSH(self->stack, py_string, -1);
2954 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002955}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002956
2957
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002958#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002959static int
Tim Peterscba30e22003-02-01 06:24:36 +00002960load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002961{
2962 PyObject *str = 0;
2963 int len, res = -1;
2964 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002966 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2967 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002968
Tim Peterscba30e22003-02-01 06:24:36 +00002969 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002970 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002971
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002972 PDATA_PUSH(self->stack, str, -1);
2973 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002974
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002975 finally:
2976 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002977}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002978#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002979
2980
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002981#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002982static int
Tim Peterscba30e22003-02-01 06:24:36 +00002983load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002984{
2985 PyObject *unicode;
2986 long l;
2987 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002988
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002989 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002991 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002993 if ((*self->read_func)(self, &s, l) < 0)
2994 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002995
Tim Peterscba30e22003-02-01 06:24:36 +00002996 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002997 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002999 PDATA_PUSH(self->stack, unicode, -1);
3000 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003001}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003002#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003003
3004
3005static int
Tim Peterscba30e22003-02-01 06:24:36 +00003006load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003007{
3008 PyObject *tup;
3009 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003011 if ((i = marker(self)) < 0) return -1;
3012 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3013 PDATA_PUSH(self->stack, tup, -1);
3014 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003015}
3016
3017static int
Tim Peterscba30e22003-02-01 06:24:36 +00003018load_empty_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003019{
3020 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003021
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003022 if (!( tup=PyTuple_New(0))) return -1;
3023 PDATA_PUSH(self->stack, tup, -1);
3024 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003025}
3026
3027static int
Tim Peterscba30e22003-02-01 06:24:36 +00003028load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003029{
3030 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003031
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003032 if (!( list=PyList_New(0))) return -1;
3033 PDATA_PUSH(self->stack, list, -1);
3034 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003035}
3036
3037static int
Tim Peterscba30e22003-02-01 06:24:36 +00003038load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003039{
3040 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003042 if (!( dict=PyDict_New())) return -1;
3043 PDATA_PUSH(self->stack, dict, -1);
3044 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003045}
3046
3047
3048static int
Tim Peterscba30e22003-02-01 06:24:36 +00003049load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003050{
3051 PyObject *list = 0;
3052 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003054 if ((i = marker(self)) < 0) return -1;
3055 if (!( list=Pdata_popList(self->stack, i))) return -1;
3056 PDATA_PUSH(self->stack, list, -1);
3057 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003058}
3059
3060static int
Tim Peterscba30e22003-02-01 06:24:36 +00003061load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003062{
3063 PyObject *dict, *key, *value;
3064 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003066 if ((i = marker(self)) < 0) return -1;
3067 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003069 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003071 for (k = i+1; k < j; k += 2) {
3072 key =self->stack->data[k-1];
3073 value=self->stack->data[k ];
3074 if (PyDict_SetItem(dict, key, value) < 0) {
3075 Py_DECREF(dict);
3076 return -1;
3077 }
3078 }
3079 Pdata_clear(self->stack, i);
3080 PDATA_PUSH(self->stack, dict, -1);
3081 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003082}
3083
3084static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003085Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003086{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003087 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003089 if (PyClass_Check(cls)) {
3090 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003092 if ((l=PyObject_Size(args)) < 0) goto err;
3093 if (!( l )) {
3094 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003095
Tim Peterscba30e22003-02-01 06:24:36 +00003096 __getinitargs__ = PyObject_GetAttr(cls,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003097 __getinitargs___str);
3098 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003099 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003100 so bypass usual construction */
3101 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003103 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003104 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003105 goto err;
3106 return inst;
3107 }
3108 Py_DECREF(__getinitargs__);
3109 }
Tim Peters84e87f32001-03-17 04:50:51 +00003110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003111 if ((r=PyInstance_New(cls, args, NULL))) return r;
3112 else goto err;
3113 }
Tim Peters84e87f32001-03-17 04:50:51 +00003114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003115 if (args==Py_None) {
3116 /* Special case, call cls.__basicnew__() */
3117 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003119 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3120 if (!basicnew) return NULL;
3121 r=PyObject_CallObject(basicnew, NULL);
3122 Py_DECREF(basicnew);
3123 if (r) return r;
3124 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003126 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003128 err:
3129 {
3130 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003132 PyErr_Fetch(&tp, &v, &tb);
3133 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3134 Py_XDECREF(v);
3135 v=r;
3136 }
3137 PyErr_Restore(tp,v,tb);
3138 }
3139 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003140}
Tim Peters84e87f32001-03-17 04:50:51 +00003141
Guido van Rossum60456fd1997-04-09 17:36:32 +00003142
3143static int
Tim Peterscba30e22003-02-01 06:24:36 +00003144load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003145{
3146 PyObject *class, *tup, *obj=0;
3147 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003148
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003149 if ((i = marker(self)) < 0) return -1;
3150 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3151 PDATA_POP(self->stack, class);
3152 if (class) {
3153 obj = Instance_New(class, tup);
3154 Py_DECREF(class);
3155 }
3156 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003158 if (! obj) return -1;
3159 PDATA_PUSH(self->stack, obj, -1);
3160 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003161}
3162
3163
3164static int
Tim Peterscba30e22003-02-01 06:24:36 +00003165load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003166{
3167 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3168 int i, len;
3169 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003170
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003171 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003173 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3174 if (len < 2) return bad_readline();
3175 module_name = PyString_FromStringAndSize(s, len - 1);
3176 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003178 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3179 if (len < 2) return bad_readline();
3180 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003181 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003182 self->find_class);
3183 Py_DECREF(class_name);
3184 }
3185 }
3186 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003188 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003190 if ((tup=Pdata_popTuple(self->stack, i))) {
3191 obj = Instance_New(class, tup);
3192 Py_DECREF(tup);
3193 }
3194 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003196 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003198 PDATA_PUSH(self->stack, obj, -1);
3199 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003200}
3201
3202
3203static int
Tim Peterscba30e22003-02-01 06:24:36 +00003204load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003205{
3206 PyObject *class = 0, *module_name = 0, *class_name = 0;
3207 int len;
3208 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003210 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3211 if (len < 2) return bad_readline();
3212 module_name = PyString_FromStringAndSize(s, len - 1);
3213 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003215 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003216 if (len < 2) {
3217 Py_DECREF(module_name);
3218 return bad_readline();
3219 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003220 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003221 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003222 self->find_class);
3223 Py_DECREF(class_name);
3224 }
3225 }
3226 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003228 if (! class) return -1;
3229 PDATA_PUSH(self->stack, class, -1);
3230 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003231}
3232
3233
3234static int
Tim Peterscba30e22003-02-01 06:24:36 +00003235load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003236{
3237 PyObject *pid = 0;
3238 int len;
3239 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003241 if (self->pers_func) {
3242 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3243 if (len < 2) return bad_readline();
3244
3245 pid = PyString_FromStringAndSize(s, len - 1);
3246 if (!pid) return -1;
3247
3248 if (PyList_Check(self->pers_func)) {
3249 if (PyList_Append(self->pers_func, pid) < 0) {
3250 Py_DECREF(pid);
3251 return -1;
3252 }
3253 }
3254 else {
3255 ARG_TUP(self, pid);
3256 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003257 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003258 NULL);
3259 FREE_ARG_TUP(self);
3260 }
3261 }
3262
3263 if (! pid) return -1;
3264
3265 PDATA_PUSH(self->stack, pid, -1);
3266 return 0;
3267 }
3268 else {
3269 PyErr_SetString(UnpicklingError,
3270 "A load persistent id instruction was encountered,\n"
3271 "but no persistent_load function was specified.");
3272 return -1;
3273 }
3274}
3275
3276static int
Tim Peterscba30e22003-02-01 06:24:36 +00003277load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003278{
3279 PyObject *pid = 0;
3280
3281 if (self->pers_func) {
3282 PDATA_POP(self->stack, pid);
3283 if (! pid) return -1;
3284
3285 if (PyList_Check(self->pers_func)) {
3286 if (PyList_Append(self->pers_func, pid) < 0) {
3287 Py_DECREF(pid);
3288 return -1;
3289 }
3290 }
3291 else {
3292 ARG_TUP(self, pid);
3293 if (self->arg) {
3294 pid = PyObject_Call(self->pers_func, self->arg,
3295 NULL);
3296 FREE_ARG_TUP(self);
3297 }
3298 if (! pid) return -1;
3299 }
3300
3301 PDATA_PUSH(self->stack, pid, -1);
3302 return 0;
3303 }
3304 else {
3305 PyErr_SetString(UnpicklingError,
3306 "A load persistent id instruction was encountered,\n"
3307 "but no persistent_load function was specified.");
3308 return -1;
3309 }
3310}
3311
3312
3313static int
Tim Peterscba30e22003-02-01 06:24:36 +00003314load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003315{
3316 int len;
3317
3318 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3319
3320 /* Note that we split the (pickle.py) stack into two stacks,
3321 an object stack and a mark stack. We have to be clever and
3322 pop the right one. We do this by looking at the top of the
3323 mark stack.
3324 */
3325
3326 if ((self->num_marks > 0) &&
3327 (self->marks[self->num_marks - 1] == len))
3328 self->num_marks--;
3329 else {
3330 len--;
3331 Py_DECREF(self->stack->data[len]);
3332 self->stack->length=len;
3333 }
3334
3335 return 0;
3336}
3337
3338
3339static int
Tim Peterscba30e22003-02-01 06:24:36 +00003340load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003341{
3342 int i;
3343
3344 if ((i = marker(self)) < 0)
3345 return -1;
3346
3347 Pdata_clear(self->stack, i);
3348
3349 return 0;
3350}
3351
3352
3353static int
Tim Peterscba30e22003-02-01 06:24:36 +00003354load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003355{
3356 PyObject *last;
3357 int len;
3358
3359 if ((len = self->stack->length) <= 0) return stackUnderflow();
3360 last=self->stack->data[len-1];
3361 Py_INCREF(last);
3362 PDATA_PUSH(self->stack, last, -1);
3363 return 0;
3364}
3365
3366
3367static int
Tim Peterscba30e22003-02-01 06:24:36 +00003368load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003369{
3370 PyObject *py_str = 0, *value = 0;
3371 int len;
3372 char *s;
3373 int rc;
3374
3375 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003376 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003377
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003378 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003380 value = PyDict_GetItem(self->memo, py_str);
3381 if (! value) {
3382 PyErr_SetObject(BadPickleGet, py_str);
3383 rc = -1;
3384 } else {
3385 PDATA_APPEND(self->stack, value, -1);
3386 rc = 0;
3387 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003389 Py_DECREF(py_str);
3390 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003391}
3392
3393
3394static int
Tim Peterscba30e22003-02-01 06:24:36 +00003395load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003396{
3397 PyObject *py_key = 0, *value = 0;
3398 unsigned char key;
3399 char *s;
3400 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003402 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003404 key = (unsigned char)s[0];
3405 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003407 value = PyDict_GetItem(self->memo, py_key);
3408 if (! value) {
3409 PyErr_SetObject(BadPickleGet, py_key);
3410 rc = -1;
3411 } else {
3412 PDATA_APPEND(self->stack, value, -1);
3413 rc = 0;
3414 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003416 Py_DECREF(py_key);
3417 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003418}
3419
3420
3421static int
Tim Peterscba30e22003-02-01 06:24:36 +00003422load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003423{
3424 PyObject *py_key = 0, *value = 0;
3425 unsigned char c;
3426 char *s;
3427 long key;
3428 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003429
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003430 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003432 c = (unsigned char)s[0];
3433 key = (long)c;
3434 c = (unsigned char)s[1];
3435 key |= (long)c << 8;
3436 c = (unsigned char)s[2];
3437 key |= (long)c << 16;
3438 c = (unsigned char)s[3];
3439 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003441 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3442
3443 value = PyDict_GetItem(self->memo, py_key);
3444 if (! value) {
3445 PyErr_SetObject(BadPickleGet, py_key);
3446 rc = -1;
3447 } else {
3448 PDATA_APPEND(self->stack, value, -1);
3449 rc = 0;
3450 }
3451
3452 Py_DECREF(py_key);
3453 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003454}
3455
3456
3457static int
Tim Peterscba30e22003-02-01 06:24:36 +00003458load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003459{
3460 PyObject *py_str = 0, *value = 0;
3461 int len, l;
3462 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003464 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3465 if (l < 2) return bad_readline();
3466 if (!( len=self->stack->length )) return stackUnderflow();
3467 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3468 value=self->stack->data[len-1];
3469 l=PyDict_SetItem(self->memo, py_str, value);
3470 Py_DECREF(py_str);
3471 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003472}
3473
3474
3475static int
Tim Peterscba30e22003-02-01 06:24:36 +00003476load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003477{
3478 PyObject *py_key = 0, *value = 0;
3479 unsigned char key;
3480 char *s;
3481 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003483 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3484 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003486 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003488 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3489 value=self->stack->data[len-1];
3490 len=PyDict_SetItem(self->memo, py_key, value);
3491 Py_DECREF(py_key);
3492 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003493}
3494
3495
3496static int
Tim Peterscba30e22003-02-01 06:24:36 +00003497load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003498{
3499 PyObject *py_key = 0, *value = 0;
3500 long key;
3501 unsigned char c;
3502 char *s;
3503 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003505 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3506 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003508 c = (unsigned char)s[0];
3509 key = (long)c;
3510 c = (unsigned char)s[1];
3511 key |= (long)c << 8;
3512 c = (unsigned char)s[2];
3513 key |= (long)c << 16;
3514 c = (unsigned char)s[3];
3515 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003516
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003517 if (!( py_key = PyInt_FromLong(key))) return -1;
3518 value=self->stack->data[len-1];
3519 len=PyDict_SetItem(self->memo, py_key, value);
3520 Py_DECREF(py_key);
3521 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003522}
3523
3524
3525static int
Tim Peterscba30e22003-02-01 06:24:36 +00003526do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003527{
3528 PyObject *value = 0, *list = 0, *append_method = 0;
3529 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003531 len=self->stack->length;
3532 if (!( len >= x && x > 0 )) return stackUnderflow();
3533 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003534 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003536 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003538 if (PyList_Check(list)) {
3539 PyObject *slice;
3540 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003542 slice=Pdata_popList(self->stack, x);
3543 list_len = PyList_GET_SIZE(list);
3544 i=PyList_SetSlice(list, list_len, list_len, slice);
3545 Py_DECREF(slice);
3546 return i;
3547 }
3548 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003549
Tim Peterscba30e22003-02-01 06:24:36 +00003550 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003551 return -1;
3552
3553 for (i = x; i < len; i++) {
3554 PyObject *junk;
3555
3556 value=self->stack->data[i];
3557 junk=0;
3558 ARG_TUP(self, value);
3559 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003560 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003561 NULL);
3562 FREE_ARG_TUP(self);
3563 }
3564 if (! junk) {
3565 Pdata_clear(self->stack, i+1);
3566 self->stack->length=x;
3567 Py_DECREF(append_method);
3568 return -1;
3569 }
3570 Py_DECREF(junk);
3571 }
3572 self->stack->length=x;
3573 Py_DECREF(append_method);
3574 }
3575
3576 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003577}
3578
3579
3580static int
Tim Peterscba30e22003-02-01 06:24:36 +00003581load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003582{
3583 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003584}
3585
3586
3587static int
Tim Peterscba30e22003-02-01 06:24:36 +00003588load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003589{
3590 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003591}
3592
3593
3594static int
Tim Peterscba30e22003-02-01 06:24:36 +00003595do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003596{
3597 PyObject *value = 0, *key = 0, *dict = 0;
3598 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003600 if (!( (len=self->stack->length) >= x
3601 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003603 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003605 for (i = x+1; i < len; i += 2) {
3606 key =self->stack->data[i-1];
3607 value=self->stack->data[i ];
3608 if (PyObject_SetItem(dict, key, value) < 0) {
3609 r=-1;
3610 break;
3611 }
3612 }
3613
3614 Pdata_clear(self->stack, x);
3615
3616 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003617}
3618
3619
Tim Peters84e87f32001-03-17 04:50:51 +00003620static int
Tim Peterscba30e22003-02-01 06:24:36 +00003621load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003622{
3623 return do_setitems(self, self->stack->length - 2);
3624}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003626static int
Tim Peterscba30e22003-02-01 06:24:36 +00003627load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003628{
3629 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003630}
3631
Tim Peters84e87f32001-03-17 04:50:51 +00003632
Guido van Rossum60456fd1997-04-09 17:36:32 +00003633static int
Tim Peterscba30e22003-02-01 06:24:36 +00003634load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003635{
3636 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3637 *junk = 0, *__setstate__ = 0;
3638 int i, r = 0;
3639
3640 if (self->stack->length < 2) return stackUnderflow();
3641 PDATA_POP(self->stack, value);
3642 if (! value) return -1;
3643 inst=self->stack->data[self->stack->length-1];
3644
3645 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3646 ARG_TUP(self, value);
3647 if (self->arg) {
3648 junk = PyObject_Call(__setstate__, self->arg, NULL);
3649 FREE_ARG_TUP(self);
3650 }
3651 Py_DECREF(__setstate__);
3652 if (! junk) return -1;
3653 Py_DECREF(junk);
3654 return 0;
3655 }
3656
3657 PyErr_Clear();
3658 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3659 i = 0;
3660 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3661 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3662 r=-1;
3663 break;
3664 }
3665 }
3666 Py_DECREF(instdict);
3667 }
3668 else r=-1;
3669
3670 Py_XDECREF(value);
3671
3672 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003673}
3674
3675
3676static int
Tim Peterscba30e22003-02-01 06:24:36 +00003677load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003678{
3679 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003681 /* Note that we split the (pickle.py) stack into two stacks, an
3682 object stack and a mark stack. Here we push a mark onto the
3683 mark stack.
3684 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003686 if ((self->num_marks + 1) >= self->marks_size) {
3687 s=self->marks_size+20;
3688 if (s <= self->num_marks) s=self->num_marks + 1;
3689 if (self->marks == NULL)
3690 self->marks=(int *)malloc(s * sizeof(int));
3691 else
Tim Peterscba30e22003-02-01 06:24:36 +00003692 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003693 s * sizeof(int));
3694 if (! self->marks) {
3695 PyErr_NoMemory();
3696 return -1;
3697 }
3698 self->marks_size = s;
3699 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003701 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003703 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003704}
3705
Guido van Rossum60456fd1997-04-09 17:36:32 +00003706static int
Tim Peterscba30e22003-02-01 06:24:36 +00003707load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003708{
3709 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003711 PDATA_POP(self->stack, arg_tup);
3712 if (! arg_tup) return -1;
3713 PDATA_POP(self->stack, callable);
3714 if (callable) {
3715 ob = Instance_New(callable, arg_tup);
3716 Py_DECREF(callable);
3717 }
3718 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003720 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003722 PDATA_PUSH(self->stack, ob, -1);
3723 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003724}
Tim Peters84e87f32001-03-17 04:50:51 +00003725
Guido van Rossum60456fd1997-04-09 17:36:32 +00003726static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003727load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003728{
3729 PyObject *err = 0, *val = 0;
3730 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003732 self->num_marks = 0;
3733 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003735 while (1) {
3736 if ((*self->read_func)(self, &s, 1) < 0)
3737 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003739 switch (s[0]) {
3740 case NONE:
3741 if (load_none(self) < 0)
3742 break;
3743 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003745 case BININT:
3746 if (load_binint(self) < 0)
3747 break;
3748 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003750 case BININT1:
3751 if (load_binint1(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 BININT2:
3756 if (load_binint2(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 INT:
3761 if (load_int(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 LONG:
3766 if (load_long(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 FLOAT:
3771 if (load_float(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 BINFLOAT:
3776 if (load_binfloat(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 BINSTRING:
3781 if (load_binstring(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 SHORT_BINSTRING:
3786 if (load_short_binstring(self) < 0)
3787 break;
3788 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003789
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003790 case STRING:
3791 if (load_string(self) < 0)
3792 break;
3793 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003794
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003795#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003796 case UNICODE:
3797 if (load_unicode(self) < 0)
3798 break;
3799 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003801 case BINUNICODE:
3802 if (load_binunicode(self) < 0)
3803 break;
3804 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003805#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003807 case EMPTY_TUPLE:
3808 if (load_empty_tuple(self) < 0)
3809 break;
3810 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003812 case TUPLE:
3813 if (load_tuple(self) < 0)
3814 break;
3815 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003817 case EMPTY_LIST:
3818 if (load_empty_list(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 LIST:
3823 if (load_list(self) < 0)
3824 break;
3825 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003827 case EMPTY_DICT:
3828 if (load_empty_dict(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 DICT:
3833 if (load_dict(self) < 0)
3834 break;
3835 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003837 case OBJ:
3838 if (load_obj(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 INST:
3843 if (load_inst(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 GLOBAL:
3848 if (load_global(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 APPEND:
3853 if (load_append(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 APPENDS:
3858 if (load_appends(self) < 0)
3859 break;
3860 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003862 case BUILD:
3863 if (load_build(self) < 0)
3864 break;
3865 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003867 case DUP:
3868 if (load_dup(self) < 0)
3869 break;
3870 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003872 case BINGET:
3873 if (load_binget(self) < 0)
3874 break;
3875 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003877 case LONG_BINGET:
3878 if (load_long_binget(self) < 0)
3879 break;
3880 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003882 case GET:
3883 if (load_get(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 MARK:
3888 if (load_mark(self) < 0)
3889 break;
3890 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003892 case BINPUT:
3893 if (load_binput(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 LONG_BINPUT:
3898 if (load_long_binput(self) < 0)
3899 break;
3900 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003902 case PUT:
3903 if (load_put(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 POP:
3908 if (load_pop(self) < 0)
3909 break;
3910 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003911
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003912 case POP_MARK:
3913 if (load_pop_mark(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 SETITEM:
3918 if (load_setitem(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 SETITEMS:
3923 if (load_setitems(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 STOP:
3928 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003930 case PERSID:
3931 if (load_persid(self) < 0)
3932 break;
3933 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003935 case BINPERSID:
3936 if (load_binpersid(self) < 0)
3937 break;
3938 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003940 case REDUCE:
3941 if (load_reduce(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 '\0':
3946 /* end of file */
3947 PyErr_SetNone(PyExc_EOFError);
3948 break;
Tim Peterscba30e22003-02-01 06:24:36 +00003949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003950 default:
Tim Peterscba30e22003-02-01 06:24:36 +00003951 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003952 "invalid load key, '%s'.",
3953 "c", s[0]);
3954 return NULL;
3955 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003957 break;
3958 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003960 if ((err = PyErr_Occurred())) {
3961 if (err == PyExc_EOFError) {
3962 PyErr_SetNone(PyExc_EOFError);
3963 }
3964 return NULL;
3965 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003967 PDATA_POP(self->stack, val);
3968 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003969}
Tim Peters84e87f32001-03-17 04:50:51 +00003970
Guido van Rossum60456fd1997-04-09 17:36:32 +00003971
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003972/* No-load functions to support noload, which is used to
3973 find persistent references. */
3974
3975static int
Tim Peterscba30e22003-02-01 06:24:36 +00003976noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003977{
3978 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003980 if ((i = marker(self)) < 0) return -1;
3981 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003982}
3983
3984
3985static int
Tim Peterscba30e22003-02-01 06:24:36 +00003986noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003987{
3988 int i;
3989 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003991 if ((i = marker(self)) < 0) return -1;
3992 Pdata_clear(self->stack, i);
3993 if ((*self->readline_func)(self, &s) < 0) return -1;
3994 if ((*self->readline_func)(self, &s) < 0) return -1;
3995 PDATA_APPEND(self->stack, Py_None,-1);
3996 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003997}
3998
3999static int
Tim Peterscba30e22003-02-01 06:24:36 +00004000noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004001{
4002 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004004 if ((*self->readline_func)(self, &s) < 0) return -1;
4005 if ((*self->readline_func)(self, &s) < 0) return -1;
4006 PDATA_APPEND(self->stack, Py_None,-1);
4007 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004008}
4009
4010static int
Tim Peterscba30e22003-02-01 06:24:36 +00004011noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004012{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004014 if (self->stack->length < 2) return stackUnderflow();
4015 Pdata_clear(self->stack, self->stack->length-2);
4016 PDATA_APPEND(self->stack, Py_None,-1);
4017 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004018}
4019
4020static int
4021noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004022
Guido van Rossum053b8df1998-11-25 16:18:00 +00004023 if (self->stack->length < 1) return stackUnderflow();
4024 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004025 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004026}
4027
4028
4029static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004030noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004031{
4032 PyObject *err = 0, *val = 0;
4033 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004034
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004035 self->num_marks = 0;
4036 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004038 while (1) {
4039 if ((*self->read_func)(self, &s, 1) < 0)
4040 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004042 switch (s[0]) {
4043 case NONE:
4044 if (load_none(self) < 0)
4045 break;
4046 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004048 case BININT:
4049 if (load_binint(self) < 0)
4050 break;
4051 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004053 case BININT1:
4054 if (load_binint1(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 BININT2:
4059 if (load_binint2(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 INT:
4064 if (load_int(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 LONG:
4069 if (load_long(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 FLOAT:
4074 if (load_float(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 BINFLOAT:
4079 if (load_binfloat(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 BINSTRING:
4084 if (load_binstring(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 SHORT_BINSTRING:
4089 if (load_short_binstring(self) < 0)
4090 break;
4091 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004093 case STRING:
4094 if (load_string(self) < 0)
4095 break;
4096 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004097
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004098#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004099 case UNICODE:
4100 if (load_unicode(self) < 0)
4101 break;
4102 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004103
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004104 case BINUNICODE:
4105 if (load_binunicode(self) < 0)
4106 break;
4107 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004108#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004110 case EMPTY_TUPLE:
4111 if (load_empty_tuple(self) < 0)
4112 break;
4113 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004115 case TUPLE:
4116 if (load_tuple(self) < 0)
4117 break;
4118 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004120 case EMPTY_LIST:
4121 if (load_empty_list(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 LIST:
4126 if (load_list(self) < 0)
4127 break;
4128 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004130 case EMPTY_DICT:
4131 if (load_empty_dict(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 DICT:
4136 if (load_dict(self) < 0)
4137 break;
4138 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004140 case OBJ:
4141 if (noload_obj(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 INST:
4146 if (noload_inst(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 GLOBAL:
4151 if (noload_global(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 APPEND:
4156 if (load_append(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 APPENDS:
4161 if (load_appends(self) < 0)
4162 break;
4163 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004165 case BUILD:
4166 if (noload_build(self) < 0)
4167 break;
4168 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004170 case DUP:
4171 if (load_dup(self) < 0)
4172 break;
4173 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004175 case BINGET:
4176 if (load_binget(self) < 0)
4177 break;
4178 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004180 case LONG_BINGET:
4181 if (load_long_binget(self) < 0)
4182 break;
4183 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004185 case GET:
4186 if (load_get(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 MARK:
4191 if (load_mark(self) < 0)
4192 break;
4193 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004195 case BINPUT:
4196 if (load_binput(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 LONG_BINPUT:
4201 if (load_long_binput(self) < 0)
4202 break;
4203 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004205 case PUT:
4206 if (load_put(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 POP:
4211 if (load_pop(self) < 0)
4212 break;
4213 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004215 case POP_MARK:
4216 if (load_pop_mark(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 SETITEM:
4221 if (load_setitem(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 SETITEMS:
4226 if (load_setitems(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 STOP:
4231 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004233 case PERSID:
4234 if (load_persid(self) < 0)
4235 break;
4236 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004238 case BINPERSID:
4239 if (load_binpersid(self) < 0)
4240 break;
4241 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004243 case REDUCE:
4244 if (noload_reduce(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 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004249 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004250 "invalid load key, '%s'.",
4251 "c", s[0]);
4252 return NULL;
4253 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004255 break;
4256 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004258 if ((err = PyErr_Occurred())) {
4259 if (err == PyExc_EOFError) {
4260 PyErr_SetNone(PyExc_EOFError);
4261 }
4262 return NULL;
4263 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004265 PDATA_POP(self->stack, val);
4266 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004267}
Tim Peters84e87f32001-03-17 04:50:51 +00004268
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004269
Guido van Rossum60456fd1997-04-09 17:36:32 +00004270static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004271Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004272{
Tim Peterscba30e22003-02-01 06:24:36 +00004273 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004274 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004275
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004276 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004277}
4278
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004279static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004280Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004281{
Tim Peterscba30e22003-02-01 06:24:36 +00004282 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004283 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004285 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004286}
4287
Guido van Rossum60456fd1997-04-09 17:36:32 +00004288
4289static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004290 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004291 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004292 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004293 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004294 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004295 "noload() -- not load a pickle, but go through most of the motions\n"
4296 "\n"
4297 "This function can be used to read past a pickle without instantiating\n"
4298 "any objects or importing any modules. It can also be used to find all\n"
4299 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004300 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004301 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004302 {NULL, NULL} /* sentinel */
4303};
4304
4305
4306static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004307newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004308{
4309 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004310
Tim Peterscba30e22003-02-01 06:24:36 +00004311 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004312 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004314 self->file = NULL;
4315 self->arg = NULL;
4316 self->stack = (Pdata*)Pdata_New();
4317 self->pers_func = NULL;
4318 self->last_string = NULL;
4319 self->marks = NULL;
4320 self->num_marks = 0;
4321 self->marks_size = 0;
4322 self->buf_size = 0;
4323 self->read = NULL;
4324 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004325 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004326
Tim Peterscba30e22003-02-01 06:24:36 +00004327 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004328 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004330 Py_INCREF(f);
4331 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004333 /* Set read, readline based on type of f */
4334 if (PyFile_Check(f)) {
4335 self->fp = PyFile_AsFile(f);
4336 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004337 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004338 "I/O operation on closed file");
4339 goto err;
4340 }
4341 self->read_func = read_file;
4342 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004343 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004344 else if (PycStringIO_InputCheck(f)) {
4345 self->fp = NULL;
4346 self->read_func = read_cStringIO;
4347 self->readline_func = readline_cStringIO;
4348 }
4349 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004351 self->fp = NULL;
4352 self->read_func = read_other;
4353 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004355 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4356 (self->read = PyObject_GetAttr(f, read_str)))) {
4357 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004358 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004359 "argument must have 'read' and "
4360 "'readline' attributes" );
4361 goto err;
4362 }
4363 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004364
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004365 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004367 err:
4368 Py_DECREF((PyObject *)self);
4369 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004370}
4371
4372
4373static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004374get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004375{
4376 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004377
Tim Peterscba30e22003-02-01 06:24:36 +00004378 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004379 return NULL;
4380 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004381}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004382
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004383
Guido van Rossum60456fd1997-04-09 17:36:32 +00004384static void
Tim Peterscba30e22003-02-01 06:24:36 +00004385Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004386{
4387 Py_XDECREF(self->readline);
4388 Py_XDECREF(self->read);
4389 Py_XDECREF(self->file);
4390 Py_XDECREF(self->memo);
4391 Py_XDECREF(self->stack);
4392 Py_XDECREF(self->pers_func);
4393 Py_XDECREF(self->arg);
4394 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004396 if (self->marks) {
4397 free(self->marks);
4398 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004400 if (self->buf_size) {
4401 free(self->buf);
4402 }
Tim Peters84e87f32001-03-17 04:50:51 +00004403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004404 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004405}
4406
4407
4408static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004409Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004410{
4411 if (!strcmp(name, "persistent_load")) {
4412 if (!self->pers_func) {
4413 PyErr_SetString(PyExc_AttributeError, name);
4414 return NULL;
4415 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004417 Py_INCREF(self->pers_func);
4418 return self->pers_func;
4419 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004421 if (!strcmp(name, "find_global")) {
4422 if (!self->find_class) {
4423 PyErr_SetString(PyExc_AttributeError, name);
4424 return NULL;
4425 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004427 Py_INCREF(self->find_class);
4428 return self->find_class;
4429 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004431 if (!strcmp(name, "memo")) {
4432 if (!self->memo) {
4433 PyErr_SetString(PyExc_AttributeError, name);
4434 return NULL;
4435 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004437 Py_INCREF(self->memo);
4438 return self->memo;
4439 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004441 if (!strcmp(name, "UnpicklingError")) {
4442 Py_INCREF(UnpicklingError);
4443 return UnpicklingError;
4444 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004446 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004447}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004448
Guido van Rossum60456fd1997-04-09 17:36:32 +00004449
4450static int
Tim Peterscba30e22003-02-01 06:24:36 +00004451Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004452{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004454 if (!strcmp(name, "persistent_load")) {
4455 Py_XDECREF(self->pers_func);
4456 self->pers_func = value;
4457 Py_XINCREF(value);
4458 return 0;
4459 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004461 if (!strcmp(name, "find_global")) {
4462 Py_XDECREF(self->find_class);
4463 self->find_class = value;
4464 Py_XINCREF(value);
4465 return 0;
4466 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004468 if (! value) {
4469 PyErr_SetString(PyExc_TypeError,
4470 "attribute deletion is not supported");
4471 return -1;
4472 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004474 if (strcmp(name, "memo") == 0) {
4475 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00004476 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004477 "memo must be a dictionary");
4478 return -1;
4479 }
4480 Py_XDECREF(self->memo);
4481 self->memo = value;
4482 Py_INCREF(value);
4483 return 0;
4484 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004486 PyErr_SetString(PyExc_AttributeError, name);
4487 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004488}
4489
4490
4491static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004492cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004493{
4494 PyObject *ob, *file, *res = NULL;
4495 Picklerobject *pickler = 0;
4496 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004497
Tim Peterscba30e22003-02-01 06:24:36 +00004498 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004499 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004500
Tim Peterscba30e22003-02-01 06:24:36 +00004501 if (!( pickler = newPicklerobject(file, bin)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004502 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004504 if (dump(pickler, ob) < 0)
4505 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004507 Py_INCREF(Py_None);
4508 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004510 finally:
4511 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004513 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004514}
4515
4516
4517static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004518cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004519{
4520 PyObject *ob, *file = 0, *res = NULL;
4521 Picklerobject *pickler = 0;
4522 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004523
Tim Peterscba30e22003-02-01 06:24:36 +00004524 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004525 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004526
Tim Peterscba30e22003-02-01 06:24:36 +00004527 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004528 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004529
Tim Peterscba30e22003-02-01 06:24:36 +00004530 if (!( pickler = newPicklerobject(file, bin)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004531 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004533 if (dump(pickler, ob) < 0)
4534 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004536 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004538 finally:
4539 Py_XDECREF(pickler);
4540 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004542 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004543}
4544
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004545
4546static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004547cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004548{
4549 Unpicklerobject *unpickler = 0;
4550 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004551
Tim Peterscba30e22003-02-01 06:24:36 +00004552 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004553 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004554
Tim Peterscba30e22003-02-01 06:24:36 +00004555 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004556 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004558 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004560 finally:
4561 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004563 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004564}
4565
4566
4567static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004568cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004569{
4570 PyObject *ob, *file = 0, *res = NULL;
4571 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004572
Tim Peterscba30e22003-02-01 06:24:36 +00004573 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004574 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004575
Tim Peterscba30e22003-02-01 06:24:36 +00004576 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004577 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004578
Tim Peterscba30e22003-02-01 06:24:36 +00004579 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004580 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004582 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004583
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004584 finally:
4585 Py_XDECREF(file);
4586 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004588 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004589}
4590
4591
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004592PyDoc_STRVAR(Unpicklertype__doc__,
4593"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004594
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004595static PyTypeObject Unpicklertype = {
4596 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004597 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004598 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004599 sizeof(Unpicklerobject), /*tp_basicsize*/
4600 0, /*tp_itemsize*/
4601 /* methods */
4602 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4603 (printfunc)0, /*tp_print*/
4604 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4605 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4606 (cmpfunc)0, /*tp_compare*/
4607 (reprfunc)0, /*tp_repr*/
4608 0, /*tp_as_number*/
4609 0, /*tp_as_sequence*/
4610 0, /*tp_as_mapping*/
4611 (hashfunc)0, /*tp_hash*/
4612 (ternaryfunc)0, /*tp_call*/
4613 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004614
Guido van Rossum60456fd1997-04-09 17:36:32 +00004615 /* Space for future expansion */
4616 0L,0L,0L,0L,
4617 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004618};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004619
Guido van Rossum60456fd1997-04-09 17:36:32 +00004620static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004621 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004622 PyDoc_STR("dump(object, file, [binary]) --"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004623 "Write an object in pickle format to the given file\n"
4624 "\n"
4625 "If the optional argument, binary, is provided and is true, then the\n"
4626 "pickle will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004627 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004628 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004629 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004630 PyDoc_STR("dumps(object, [binary]) --"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004631 "Return a string containing an object in pickle format\n"
4632 "\n"
4633 "If the optional argument, binary, is provided and is true, then the\n"
4634 "pickle will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004635 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004636 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004637 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004638 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Neal Norwitzb0493252002-03-31 14:44:22 +00004639 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004640 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Neal Norwitzb0493252002-03-31 14:44:22 +00004641 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004642 PyDoc_STR("Pickler(file, [binary]) -- Create a pickler\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004643 "\n"
4644 "If the optional argument, binary, is provided and is true, then\n"
4645 "pickles will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004646 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004647 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004648 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004649 PyDoc_STR("Unpickler(file) -- Create an unpickler")},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004650 { NULL, NULL }
4651};
4652
Guido van Rossum60456fd1997-04-09 17:36:32 +00004653static int
Tim Peterscba30e22003-02-01 06:24:36 +00004654init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004655{
4656 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004657
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004658#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004659
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004660 INIT_STR(__class__);
4661 INIT_STR(__getinitargs__);
4662 INIT_STR(__dict__);
4663 INIT_STR(__getstate__);
4664 INIT_STR(__setstate__);
4665 INIT_STR(__name__);
4666 INIT_STR(__main__);
4667 INIT_STR(__reduce__);
4668 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004669 INIT_STR(append);
4670 INIT_STR(read);
4671 INIT_STR(readline);
4672 INIT_STR(copy_reg);
4673 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004674 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004675
Tim Peterscba30e22003-02-01 06:24:36 +00004676 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004677 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004678
Tim Peters1f1b2d22003-02-01 02:16:37 +00004679 /* This is special because we want to use a different
4680 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004681 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peterscba30e22003-02-01 06:24:36 +00004682 if (!dispatch_table)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004683 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004685 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004687 /* Down to here ********************************** */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004688
Tim Peterscba30e22003-02-01 06:24:36 +00004689 if (!( empty_tuple = PyTuple_New(0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004690 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004692 /* Ugh */
4693 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4694 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4695 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004697 if (!( t=PyDict_New())) return -1;
4698 if (!( r=PyRun_String(
4699 "def __init__(self, *args): self.args=args\n\n"
4700 "def __str__(self):\n"
4701 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4702 Py_file_input,
4703 module_dict, t) )) return -1;
4704 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004706 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00004707 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004708 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004710 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004711
Tim Peterscba30e22003-02-01 06:24:36 +00004712 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004713 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00004714 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004715 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004717 if (!( t=PyDict_New())) return -1;
4718 if (!( r=PyRun_String(
4719 "def __init__(self, *args): self.args=args\n\n"
4720 "def __str__(self):\n"
4721 " a=self.args\n"
4722 " a=a and type(a[0]) or '(what)'\n"
4723 " return 'Cannot pickle %s objects' % a\n"
4724 , Py_file_input,
4725 module_dict, t) )) return -1;
4726 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004728 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00004729 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004730 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004732 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004734 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00004735 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004736 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004737
Martin v. Löwis658009a2002-09-16 17:26:24 +00004738 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
4739 UnpicklingError, NULL)))
4740 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00004741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004742 if (PyDict_SetItemString(module_dict, "PickleError",
4743 PickleError) < 0)
4744 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004746 if (PyDict_SetItemString(module_dict, "PicklingError",
4747 PicklingError) < 0)
4748 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004750 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4751 UnpicklingError) < 0)
4752 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004754 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4755 UnpickleableError) < 0)
4756 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004758 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4759 BadPickleGet) < 0)
4760 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004762 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004764 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004765}
4766
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004767#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
4768#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004769#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004770PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00004771initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004772{
4773 PyObject *m, *d, *di, *v, *k;
4774 int i;
4775 char *rev="1.71";
4776 PyObject *format_version;
4777 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004779 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004780 Unpicklertype.ob_type = &PyType_Type;
4781 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004783 /* Initialize some pieces. We need to do this before module creation,
4784 so we're forced to use a temporary dictionary. :(
4785 */
4786 di=PyDict_New();
4787 if (!di) return;
4788 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004789
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004790 /* Create the module and add the functions */
4791 m = Py_InitModule4("cPickle", cPickle_methods,
4792 cPickle_module_documentation,
4793 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004795 /* Add some symbolic constants to the module */
4796 d = PyModule_GetDict(m);
4797 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4798 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004800 /* Copy data from di. Waaa. */
4801 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4802 if (PyObject_SetItem(d, k, v) < 0) {
4803 Py_DECREF(di);
4804 return;
4805 }
4806 }
4807 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004809 format_version = PyString_FromString("1.3");
4810 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004812 PyDict_SetItemString(d, "format_version", format_version);
4813 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4814 Py_XDECREF(format_version);
4815 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004816}