blob: 4364f4d9da8b4edbeb7f93bf5b0533f109630c34 [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 Peters5bd2a792003-02-01 16:45:06 +000017/* Bump this when new opcodes are added to the pickle protocol. */
18#define CURRENT_PROTOCOL_NUMBER 2
19
Tim Peters797ec242003-02-01 06:22:36 +000020/*
21 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
22 * docs are in pickletools.py.
23 */
Guido van Rossum60456fd1997-04-09 17:36:32 +000024#define MARK '('
25#define STOP '.'
26#define POP '0'
27#define POP_MARK '1'
28#define DUP '2'
29#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000030#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000031#define INT 'I'
32#define BININT 'J'
33#define BININT1 'K'
34#define LONG 'L'
35#define BININT2 'M'
36#define NONE 'N'
37#define PERSID 'P'
38#define BINPERSID 'Q'
39#define REDUCE 'R'
40#define STRING 'S'
41#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000042#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000043#define UNICODE 'V'
44#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000045#define APPEND 'a'
46#define BUILD 'b'
47#define GLOBAL 'c'
48#define DICT 'd'
49#define EMPTY_DICT '}'
50#define APPENDS 'e'
51#define GET 'g'
52#define BINGET 'h'
53#define INST 'i'
54#define LONG_BINGET 'j'
55#define LIST 'l'
56#define EMPTY_LIST ']'
57#define OBJ 'o'
58#define PUT 'p'
59#define BINPUT 'q'
60#define LONG_BINPUT 'r'
61#define SETITEM 's'
62#define TUPLE 't'
63#define EMPTY_TUPLE ')'
64#define SETITEMS 'u'
Tim Peters797ec242003-02-01 06:22:36 +000065
66/* Protocol 2. */
67#define PROTO '\x80' /* identify pickle protocol */
68#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
69#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
70#define EXT2 '\x83' /* ditto, but 2-byte index */
71#define EXT4 '\x84' /* ditto, but 4-byte index */
72#define TUPLE1 '\x85' /* build 1-tuple from stack top */
73#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
74#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
75#define NEWTRUE '\x88' /* push True */
76#define NEWFALSE '\x89' /* push False */
77#define LONG1 '\x8a' /* push long from < 256 bytes */
78#define LONG4 '\x8b' /* push really big long */
79
80/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
81 * so that unpicklers written before bools were introduced unpickle them
82 * as ints, but unpicklers after can recognize that bools were intended.
83 * Note that protocol 2 added direct ways to pickle bools.
84 */
Jack Jansen3a967022002-06-26 20:40:42 +000085#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000086#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000087#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000088#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000089
Guido van Rossum60456fd1997-04-09 17:36:32 +000090static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000091
Guido van Rossumc03158b1999-06-09 15:23:31 +000092static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000093static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +000094static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000095static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +000096static PyObject *BadPickleGet;
97
Guido van Rossum2f4caa41997-01-06 22:59:08 +000098
Guido van Rossum60456fd1997-04-09 17:36:32 +000099static PyObject *dispatch_table;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000100static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000101
Guido van Rossum60456fd1997-04-09 17:36:32 +0000102static PyObject *__class___str, *__getinitargs___str, *__dict___str,
103 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000104 *write_str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000105 *read_str, *readline_str, *__main___str, *__basicnew___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000106 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000107
Guido van Rossum053b8df1998-11-25 16:18:00 +0000108/*************************************************************************
109 Internal Data type for pickle data. */
110
111typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000112 PyObject_HEAD
113 int length, size;
114 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000115} Pdata;
116
Tim Peters84e87f32001-03-17 04:50:51 +0000117static void
Tim Peterscba30e22003-02-01 06:24:36 +0000118Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000119{
120 int i;
121 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000123 for (i=self->length, p=self->data; --i >= 0; p++) Py_DECREF(*p);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000125 if (self->data) free(self->data);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000127 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000128}
129
130static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000131 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
132 (destructor)Pdata_dealloc,
133 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000134};
135
136#define Pdata_Check(O) ((O)->ob_type == &PdataType)
137
138static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000139Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000140{
141 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000143 if (!( self = PyObject_New(Pdata, &PdataType))) return NULL;
144 self->size=8;
145 self->length=0;
146 self->data=malloc(self->size * sizeof(PyObject*));
147 if (self->data) return (PyObject*)self;
148 Py_DECREF(self);
149 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000150}
151
Tim Peters84e87f32001-03-17 04:50:51 +0000152static int
Tim Peterscba30e22003-02-01 06:24:36 +0000153stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000154{
155 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
156 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000157}
158
159static int
Tim Peterscba30e22003-02-01 06:24:36 +0000160Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000161{
162 int i;
163 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000165 if (clearto < 0) return stackUnderflow();
166 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000168 for (i=self->length, p=self->data+clearto; --i >= clearto; p++)
169 Py_DECREF(*p);
170 self->length=clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000172 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000173}
174
175
Tim Peters84e87f32001-03-17 04:50:51 +0000176static int
Tim Peterscba30e22003-02-01 06:24:36 +0000177Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000178{
179 if (! self->size) {
180 PyErr_NoMemory();
181 return -1;
182 }
183 self->size *= 2;
184 self->data = realloc(self->data, self->size*sizeof(PyObject*));
185 if (! self->data) {
186 self->size = 0;
187 PyErr_NoMemory();
188 return -1;
189 }
190 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000191}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000192
193#define PDATA_POP(D,V) { \
194 if ((D)->length) V=D->data[--((D)->length)]; \
195 else { \
196 PyErr_SetString(UnpicklingError, "bad pickle data"); \
197 V=NULL; \
198 } \
199}
200
201
202static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000203Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000204{
205 PyObject *r;
206 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000208 l=self->length-start;
209 if (!( r=PyTuple_New(l))) return NULL;
210 for (i=start, j=0 ; j < l; i++, j++)
211 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000213 self->length=start;
214 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000215}
216
217static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000218Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000219{
220 PyObject *r;
221 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000223 l=self->length-start;
224 if (!( r=PyList_New(l))) return NULL;
225 for (i=start, j=0 ; j < l; i++, j++)
226 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000228 self->length=start;
229 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000230}
231
Guido van Rossum053b8df1998-11-25 16:18:00 +0000232#define PDATA_APPEND(D,O,ER) { \
233 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
234 Pdata_grow((Pdata*)(D)) < 0) \
235 return ER; \
236 Py_INCREF(O); \
237 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
238}
239
240#define PDATA_PUSH(D,O,ER) { \
241 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
242 Pdata_grow((Pdata*)(D)) < 0) { \
243 Py_DECREF(O); \
244 return ER; \
245 } \
246 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
247}
248
249/*************************************************************************/
250
251#define ARG_TUP(self, o) { \
252 if (self->arg || (self->arg=PyTuple_New(1))) { \
253 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
254 PyTuple_SET_ITEM(self->arg,0,o); \
255 } \
256 else { \
257 Py_DECREF(o); \
258 } \
259}
260
261#define FREE_ARG_TUP(self) { \
262 if (self->arg->ob_refcnt > 1) { \
263 Py_DECREF(self->arg); \
264 self->arg=NULL; \
265 } \
266 }
267
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000268typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000269 PyObject_HEAD
270 FILE *fp;
271 PyObject *write;
272 PyObject *file;
273 PyObject *memo;
274 PyObject *arg;
275 PyObject *pers_func;
276 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000277
278 /* pickle protocol number, >= 0 */
279 int proto;
280
281 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000282 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000284 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000285 int nesting;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000286 int (*write_func)(struct Picklerobject *, char *, int);
287 char *write_buf;
288 int buf_size;
289 PyObject *dispatch_table;
290 int fast_container; /* count nested container dumps */
291 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000292} Picklerobject;
293
Barry Warsaw52acb492001-12-21 20:04:22 +0000294#ifndef PY_CPICKLE_FAST_LIMIT
295#define PY_CPICKLE_FAST_LIMIT 50
296#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000297
Jeremy Hylton938ace62002-07-17 16:30:39 +0000298static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000299
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000300typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000301 PyObject_HEAD
302 FILE *fp;
303 PyObject *file;
304 PyObject *readline;
305 PyObject *read;
306 PyObject *memo;
307 PyObject *arg;
308 Pdata *stack;
309 PyObject *mark;
310 PyObject *pers_func;
311 PyObject *last_string;
312 int *marks;
313 int num_marks;
314 int marks_size;
315 int (*read_func)(struct Unpicklerobject *, char **, int);
316 int (*readline_func)(struct Unpicklerobject *, char **);
317 int buf_size;
318 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000319 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000320} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000321
Jeremy Hylton938ace62002-07-17 16:30:39 +0000322static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000323
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000324/* Forward decls that need the above structs */
325static int save(Picklerobject *, PyObject *, int);
326static int put2(Picklerobject *, PyObject *);
327
Tim Peters84e87f32001-03-17 04:50:51 +0000328int
Tim Peterscba30e22003-02-01 06:24:36 +0000329cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000330{
331 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000333 if ((v = PyObject_GetItem(o,key))) {
334 Py_DECREF(v);
335 return 1;
336 }
Tim Peterscba30e22003-02-01 06:24:36 +0000337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000338 PyErr_Clear();
339 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000340}
341
Guido van Rossumd385d591997-04-09 17:47:47 +0000342static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000343PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000344cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
345{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000346 va_list va;
347 PyObject *args=0, *retval=0;
348 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000350 if (format) args = Py_VaBuildValue(format, va);
351 va_end(va);
352 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000353 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000354 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000355
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000356 if (retval) {
357 if (args) {
358 PyObject *v;
359 v=PyString_Format(retval, args);
360 Py_DECREF(retval);
361 Py_DECREF(args);
362 if (! v) return NULL;
363 retval=v;
364 }
365 }
366 else
367 if (args) retval=args;
368 else {
369 PyErr_SetObject(ErrType,Py_None);
370 return NULL;
371 }
372 PyErr_SetObject(ErrType,retval);
373 Py_DECREF(retval);
374 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000375}
376
Tim Peters84e87f32001-03-17 04:50:51 +0000377static int
Tim Peterscba30e22003-02-01 06:24:36 +0000378write_file(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000379{
380 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000382 if (s == NULL) {
383 return 0;
384 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000386 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000387 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000388 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000389 if (nbyteswritten != (size_t)n) {
390 PyErr_SetFromErrno(PyExc_IOError);
391 return -1;
392 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000394 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000395}
396
Tim Peters84e87f32001-03-17 04:50:51 +0000397static int
Tim Peterscba30e22003-02-01 06:24:36 +0000398write_cStringIO(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000399{
400 if (s == NULL) {
401 return 0;
402 }
Tim Peterscba30e22003-02-01 06:24:36 +0000403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000404 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
405 return -1;
406 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000408 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000409}
410
Tim Peters84e87f32001-03-17 04:50:51 +0000411static int
Tim Peterscba30e22003-02-01 06:24:36 +0000412write_none(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000413{
414 if (s == NULL) return 0;
415 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000416}
417
Tim Peters84e87f32001-03-17 04:50:51 +0000418static int
Tim Peterscba30e22003-02-01 06:24:36 +0000419write_other(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000420{
421 PyObject *py_str = 0, *junk = 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000423 if (s == NULL) {
424 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000425 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000426 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000427 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000428 return -1;
429 }
430 else {
431 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
432 if (write_other(self, NULL, 0) < 0)
433 return -1;
434 }
Tim Peterscba30e22003-02-01 06:24:36 +0000435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000436 if (n > WRITE_BUF_SIZE) {
437 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000438 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000439 return -1;
440 }
441 else {
442 memcpy(self->write_buf + self->buf_size, s, n);
443 self->buf_size += n;
444 return n;
445 }
446 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000448 if (self->write) {
449 /* object with write method */
450 ARG_TUP(self, py_str);
451 if (self->arg) {
452 junk = PyObject_Call(self->write, self->arg, NULL);
453 FREE_ARG_TUP(self);
454 }
455 if (junk) Py_DECREF(junk);
456 else return -1;
457 }
458 else
459 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000461 self->buf_size = 0;
462 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000463}
464
465
Tim Peters84e87f32001-03-17 04:50:51 +0000466static int
Tim Peterscba30e22003-02-01 06:24:36 +0000467read_file(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000468{
469 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000471 if (self->buf_size == 0) {
472 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000474 size = ((n < 32) ? 32 : n);
475 if (!( self->buf = (char *)malloc(size * sizeof(char)))) {
476 PyErr_NoMemory();
477 return -1;
478 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000480 self->buf_size = size;
481 }
482 else if (n > self->buf_size) {
483 self->buf = (char *)realloc(self->buf, n * sizeof(char));
484 if (!self->buf) {
485 PyErr_NoMemory();
486 return -1;
487 }
Tim Peters84e87f32001-03-17 04:50:51 +0000488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000489 self->buf_size = n;
490 }
Tim Peters84e87f32001-03-17 04:50:51 +0000491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000492 Py_BEGIN_ALLOW_THREADS
493 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
494 Py_END_ALLOW_THREADS
495 if (nbytesread != (size_t)n) {
496 if (feof(self->fp)) {
497 PyErr_SetNone(PyExc_EOFError);
498 return -1;
499 }
Tim Peterscba30e22003-02-01 06:24:36 +0000500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000501 PyErr_SetFromErrno(PyExc_IOError);
502 return -1;
503 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000505 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000507 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000508}
509
510
Tim Peters84e87f32001-03-17 04:50:51 +0000511static int
Tim Peterscba30e22003-02-01 06:24:36 +0000512readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000513{
514 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000516 if (self->buf_size == 0) {
517 if (!( self->buf = (char *)malloc(40 * sizeof(char)))) {
518 PyErr_NoMemory();
519 return -1;
520 }
Tim Peters84e87f32001-03-17 04:50:51 +0000521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000522 self->buf_size = 40;
523 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000525 i = 0;
526 while (1) {
527 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000528 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000529 (self->buf[i] = getc(self->fp)) == '\n') {
530 self->buf[i + 1] = '\0';
531 *s = self->buf;
532 return i + 1;
533 }
534 }
535 self->buf = (char *)realloc(self->buf,
536 (self->buf_size * 2) * sizeof(char));
537 if (!self->buf) {
538 PyErr_NoMemory();
539 return -1;
540 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000542 self->buf_size *= 2;
543 }
Tim Peters84e87f32001-03-17 04:50:51 +0000544}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000545
546
Tim Peters84e87f32001-03-17 04:50:51 +0000547static int
Tim Peterscba30e22003-02-01 06:24:36 +0000548read_cStringIO(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000549{
550 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000552 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
553 PyErr_SetNone(PyExc_EOFError);
554 return -1;
555 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000557 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000559 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000560}
561
562
Tim Peters84e87f32001-03-17 04:50:51 +0000563static int
Tim Peterscba30e22003-02-01 06:24:36 +0000564readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000565{
566 int n;
567 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000569 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
570 return -1;
571 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000573 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000575 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000576}
577
578
Tim Peters84e87f32001-03-17 04:50:51 +0000579static int
Tim Peterscba30e22003-02-01 06:24:36 +0000580read_other(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000581{
582 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000583
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000584 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000586 ARG_TUP(self, bytes);
587 if (self->arg) {
588 str = PyObject_Call(self->read, self->arg, NULL);
589 FREE_ARG_TUP(self);
590 }
591 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000592
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000593 Py_XDECREF(self->last_string);
594 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000596 if (! (*s = PyString_AsString(str))) return -1;
597 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000598}
599
600
Tim Peters84e87f32001-03-17 04:50:51 +0000601static int
Tim Peterscba30e22003-02-01 06:24:36 +0000602readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000603{
604 PyObject *str;
605 int str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000607 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
608 return -1;
609 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000611 if ((str_size = PyString_Size(str)) < 0)
612 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000614 Py_XDECREF(self->last_string);
615 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000617 if (! (*s = PyString_AsString(str)))
618 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000619
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000620 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000621}
622
623
624static char *
Tim Peterscba30e22003-02-01 06:24:36 +0000625pystrndup(char *s, int l)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000626{
627 char *r;
628 if (!( r=malloc((l+1)*sizeof(char)))) return (char*)PyErr_NoMemory();
629 memcpy(r,s,l);
630 r[l]=0;
631 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000632}
633
634
635static int
Tim Peterscba30e22003-02-01 06:24:36 +0000636get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000637{
638 PyObject *value, *mv;
639 long c_value;
640 char s[30];
641 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000643 if (!( mv = PyDict_GetItem(self->memo, id))) {
644 PyErr_SetObject(PyExc_KeyError, id);
645 return -1;
646 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000647
Tim Peterscba30e22003-02-01 06:24:36 +0000648 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000649 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000651 if (!( PyInt_Check(value))) {
652 PyErr_SetString(PicklingError, "no int where int expected in memo");
653 return -1;
654 }
655 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000657 if (!self->bin) {
658 s[0] = GET;
659 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
660 len = strlen(s);
661 }
662 else if (Pdata_Check(self->file)) {
663 if (write_other(self, NULL, 0) < 0) return -1;
664 PDATA_APPEND(self->file, mv, -1);
665 return 0;
666 }
667 else {
668 if (c_value < 256) {
669 s[0] = BINGET;
670 s[1] = (int)(c_value & 0xff);
671 len = 2;
672 }
673 else {
674 s[0] = LONG_BINGET;
675 s[1] = (int)(c_value & 0xff);
676 s[2] = (int)((c_value >> 8) & 0xff);
677 s[3] = (int)((c_value >> 16) & 0xff);
678 s[4] = (int)((c_value >> 24) & 0xff);
679 len = 5;
680 }
681 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000683 if ((*self->write_func)(self, s, len) < 0)
684 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000685
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000686 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000687}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000688
Guido van Rossum60456fd1997-04-09 17:36:32 +0000689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000690static int
Tim Peterscba30e22003-02-01 06:24:36 +0000691put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000692{
Tim Peterscba30e22003-02-01 06:24:36 +0000693 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000694 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000696 return put2(self, ob);
697}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000698
Guido van Rossum053b8df1998-11-25 16:18:00 +0000699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000700static int
Tim Peterscba30e22003-02-01 06:24:36 +0000701put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000702{
703 char c_str[30];
704 int p;
705 size_t len;
706 int res = -1;
707 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000709 if (self->fast)
710 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000712 if ((p = PyDict_Size(self->memo)) < 0)
713 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000715 /* Make sure memo keys are positive! */
Tim Peterscba30e22003-02-01 06:24:36 +0000716 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000717
Tim Peterscba30e22003-02-01 06:24:36 +0000718 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
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 (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000722 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000723
Tim Peterscba30e22003-02-01 06:24:36 +0000724 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000725 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000727 PyTuple_SET_ITEM(t, 0, memo_len);
728 Py_INCREF(memo_len);
729 PyTuple_SET_ITEM(t, 1, ob);
730 Py_INCREF(ob);
731
732 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
733 goto finally;
734
735 if (!self->bin) {
736 c_str[0] = PUT;
737 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
738 len = strlen(c_str);
739 }
740 else if (Pdata_Check(self->file)) {
741 if (write_other(self, NULL, 0) < 0) return -1;
742 PDATA_APPEND(self->file, memo_len, -1);
743 res=0; /* Job well done ;) */
744 goto finally;
745 }
746 else {
747 if (p >= 256) {
748 c_str[0] = LONG_BINPUT;
749 c_str[1] = (int)(p & 0xff);
750 c_str[2] = (int)((p >> 8) & 0xff);
751 c_str[3] = (int)((p >> 16) & 0xff);
752 c_str[4] = (int)((p >> 24) & 0xff);
753 len = 5;
754 }
755 else {
756 c_str[0] = BINPUT;
757 c_str[1] = p;
758 len = 2;
759 }
760 }
761
762 if ((*self->write_func)(self, c_str, len) < 0)
763 goto finally;
764
765 res = 0;
766
767 finally:
768 Py_XDECREF(py_ob_id);
769 Py_XDECREF(memo_len);
770 Py_XDECREF(t);
771
772 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000773}
774
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000775#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000776
777static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000778PyImport_Import(PyObject *module_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000779{
780 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
781 static PyObject *standard_builtins=0;
782 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000784 if (!( silly_list )) {
Tim Peterscba30e22003-02-01 06:24:36 +0000785 if (!( __import___str=PyString_FromString("__import__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000786 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000787 if (!( __builtins___str=PyString_FromString("__builtins__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000788 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000789 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000790 return NULL;
791 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000793 if ((globals=PyEval_GetGlobals())) {
794 Py_INCREF(globals);
795 __builtins__=PyObject_GetItem(globals,__builtins___str);
Tim Peterscba30e22003-02-01 06:24:36 +0000796 if (!__builtins__)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000797 goto err;
798 }
799 else {
800 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000802 if (!(standard_builtins ||
Tim Peterscba30e22003-02-01 06:24:36 +0000803 (standard_builtins=PyImport_ImportModule("__builtin__"))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000804 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000806 __builtins__=standard_builtins;
807 Py_INCREF(__builtins__);
808 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
Tim Peterscba30e22003-02-01 06:24:36 +0000809 if (!globals)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000810 goto err;
811 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000813 if (PyDict_Check(__builtins__)) {
814 __import__=PyObject_GetItem(__builtins__,__import___str);
815 if (!__import__) goto err;
816 }
817 else {
818 __import__=PyObject_GetAttr(__builtins__,__import___str);
819 if (!__import__) goto err;
820 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000822 r=PyObject_CallFunction(__import__,"OOOO",
823 module_name, globals, globals, silly_list);
Tim Peterscba30e22003-02-01 06:24:36 +0000824 if (!r)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000825 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000827 Py_DECREF(globals);
828 Py_DECREF(__builtins__);
829 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000831 return r;
832 err:
833 Py_XDECREF(globals);
834 Py_XDECREF(__builtins__);
835 Py_XDECREF(__import__);
836 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000837}
838
839static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000840whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000841{
842 int i, j;
843 PyObject *module = 0, *modules_dict = 0,
844 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000846 module = PyObject_GetAttrString(global, "__module__");
847 if (module) return module;
848 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000849
Tim Peterscba30e22003-02-01 06:24:36 +0000850 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000851 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000853 i = 0;
854 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000856 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000858 global_name_attr = PyObject_GetAttr(module, global_name);
859 if (!global_name_attr) {
860 PyErr_Clear();
861 continue;
862 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000864 if (global_name_attr != global) {
865 Py_DECREF(global_name_attr);
866 continue;
867 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000869 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000871 break;
872 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000874 /* The following implements the rule in pickle.py added in 1.5
875 that used __main__ if no module is found. I don't actually
876 like this rule. jlf
877 */
878 if (!j) {
879 j=1;
880 name=__main___str;
881 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000883 Py_INCREF(name);
884 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000885}
886
887
Guido van Rossum60456fd1997-04-09 17:36:32 +0000888static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000889fast_save_enter(Picklerobject *self, PyObject *obj)
890{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000891 /* if fast_container < 0, we're doing an error exit. */
892 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
893 PyObject *key = NULL;
894 if (self->fast_memo == NULL) {
895 self->fast_memo = PyDict_New();
896 if (self->fast_memo == NULL) {
897 self->fast_container = -1;
898 return 0;
899 }
900 }
901 key = PyLong_FromVoidPtr(obj);
902 if (key == NULL)
903 return 0;
904 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000905 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000906 PyErr_Format(PyExc_ValueError,
907 "fast mode: can't pickle cyclic objects including object type %s at %p",
908 obj->ob_type->tp_name, obj);
909 self->fast_container = -1;
910 return 0;
911 }
912 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000913 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000914 self->fast_container = -1;
915 return 0;
916 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000917 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000918 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000919 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000920}
921
Tim Peterscba30e22003-02-01 06:24:36 +0000922int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000923fast_save_leave(Picklerobject *self, PyObject *obj)
924{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000925 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
926 PyObject *key = PyLong_FromVoidPtr(obj);
927 if (key == NULL)
928 return 0;
929 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000930 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000931 return 0;
932 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000933 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000934 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000935 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000936}
937
938static int
Tim Peterscba30e22003-02-01 06:24:36 +0000939save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000940{
941 static char none = NONE;
942 if ((*self->write_func)(self, &none, 1) < 0)
943 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000945 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000946}
947
Guido van Rossum77f6a652002-04-03 22:41:51 +0000948static int
Tim Peterscba30e22003-02-01 06:24:36 +0000949save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000950{
Guido van Rossume2763392002-04-05 19:30:08 +0000951 static char *buf[2] = {FALSE, TRUE};
952 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000953 long l = PyInt_AS_LONG((PyIntObject *)args);
954
Guido van Rossume2763392002-04-05 19:30:08 +0000955 if ((*self->write_func)(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000956 return -1;
957
958 return 0;
959}
Tim Peters84e87f32001-03-17 04:50:51 +0000960
Guido van Rossum60456fd1997-04-09 17:36:32 +0000961static int
Tim Peterscba30e22003-02-01 06:24:36 +0000962save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000963{
964 char c_str[32];
965 long l = PyInt_AS_LONG((PyIntObject *)args);
966 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000967
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000968 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000969#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000970 || l > 0x7fffffffL
971 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000972#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000973 ) {
974 /* Text-mode pickle, or long too big to fit in the 4-byte
975 * signed BININT format: store as a string.
976 */
977 c_str[0] = INT;
978 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
979 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
980 return -1;
981 }
982 else {
983 /* Binary pickle and l fits in a signed 4-byte int. */
984 c_str[1] = (int)( l & 0xff);
985 c_str[2] = (int)((l >> 8) & 0xff);
986 c_str[3] = (int)((l >> 16) & 0xff);
987 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000988
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000989 if ((c_str[4] == 0) && (c_str[3] == 0)) {
990 if (c_str[2] == 0) {
991 c_str[0] = BININT1;
992 len = 2;
993 }
994 else {
995 c_str[0] = BININT2;
996 len = 3;
997 }
998 }
999 else {
1000 c_str[0] = BININT;
1001 len = 5;
1002 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001004 if ((*self->write_func)(self, c_str, len) < 0)
1005 return -1;
1006 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001008 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001009}
1010
1011
1012static int
Tim Peterscba30e22003-02-01 06:24:36 +00001013save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001014{
1015 int size, res = -1;
1016 PyObject *repr = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001018 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001019
Tim Peterscba30e22003-02-01 06:24:36 +00001020 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001021 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001023 if ((size = PyString_Size(repr)) < 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, &l, 1) < 0)
1027 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001029 if ((*self->write_func)(self,
Tim Peterscba30e22003-02-01 06:24:36 +00001030 PyString_AS_STRING((PyStringObject *)repr),
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001031 size) < 0)
1032 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001034 if ((*self->write_func)(self, "\n", 1) < 0)
1035 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001036
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001037 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001039 finally:
1040 Py_XDECREF(repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001042 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001043}
1044
1045
1046static int
Tim Peterscba30e22003-02-01 06:24:36 +00001047save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001048{
1049 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001050
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001051 if (self->bin) {
1052 int s, e;
1053 double f;
1054 long fhi, flo;
1055 char str[9];
1056 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001058 *p = BINFLOAT;
1059 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001061 if (x < 0) {
1062 s = 1;
1063 x = -x;
1064 }
1065 else
1066 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001068 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001070 /* Normalize f to be in the range [1.0, 2.0) */
1071 if (0.5 <= f && f < 1.0) {
1072 f *= 2.0;
1073 e--;
1074 }
1075 else if (f == 0.0) {
1076 e = 0;
1077 }
1078 else {
1079 PyErr_SetString(PyExc_SystemError,
1080 "frexp() result out of range");
1081 return -1;
1082 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001084 if (e >= 1024) {
1085 /* XXX 1024 itself is reserved for Inf/NaN */
1086 PyErr_SetString(PyExc_OverflowError,
1087 "float too large to pack with d format");
1088 return -1;
1089 }
1090 else if (e < -1022) {
1091 /* Gradual underflow */
1092 f = ldexp(f, 1022 + e);
1093 e = 0;
1094 }
1095 else if (!(e == 0 && f == 0.0)) {
1096 e += 1023;
1097 f -= 1.0; /* Get rid of leading 1 */
1098 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001099
Tim Peterscba30e22003-02-01 06:24:36 +00001100 /* fhi receives the high 28 bits;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001101 flo the low 24 bits (== 52 bits) */
1102 f *= 268435456.0; /* 2**28 */
1103 fhi = (long) floor(f); /* Truncate */
1104 f -= (double)fhi;
1105 f *= 16777216.0; /* 2**24 */
1106 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001108 /* First byte */
1109 *p = (s<<7) | (e>>4);
1110 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001112 /* Second byte */
1113 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1114 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001116 /* Third byte */
1117 *p = (unsigned char) ((fhi>>16) & 0xFF);
1118 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001120 /* Fourth byte */
1121 *p = (unsigned char) ((fhi>>8) & 0xFF);
1122 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001124 /* Fifth byte */
1125 *p = (unsigned char) (fhi & 0xFF);
1126 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001128 /* Sixth byte */
1129 *p = (unsigned char) ((flo>>16) & 0xFF);
1130 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001132 /* Seventh byte */
1133 *p = (unsigned char) ((flo>>8) & 0xFF);
1134 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001136 /* Eighth byte */
1137 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001139 if ((*self->write_func)(self, str, 9) < 0)
1140 return -1;
1141 }
1142 else {
1143 char c_str[250];
1144 c_str[0] = FLOAT;
1145 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001147 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1148 return -1;
1149 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001150
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001151 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001152}
1153
1154
1155static int
Tim Peterscba30e22003-02-01 06:24:36 +00001156save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001157{
1158 int size, len;
1159 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001161 if ((size = PyString_Size(args)) < 0)
1162 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001164 if (!self->bin) {
1165 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001167 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001168
Tim Peterscba30e22003-02-01 06:24:36 +00001169 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001170 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001172 if ((len = PyString_Size(repr)) < 0)
1173 goto err;
1174 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001176 if ((*self->write_func)(self, &string, 1) < 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, repr_str, len) < 0)
1180 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001182 if ((*self->write_func)(self, "\n", 1) < 0)
1183 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001185 Py_XDECREF(repr);
1186 }
1187 else {
1188 int i;
1189 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001190
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001191 if ((size = PyString_Size(args)) < 0)
1192 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001194 if (size < 256) {
1195 c_str[0] = SHORT_BINSTRING;
1196 c_str[1] = size;
1197 len = 2;
1198 }
1199 else {
1200 c_str[0] = BINSTRING;
1201 for (i = 1; i < 5; i++)
1202 c_str[i] = (int)(size >> ((i - 1) * 8));
1203 len = 5;
1204 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001206 if ((*self->write_func)(self, c_str, len) < 0)
1207 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001209 if (size > 128 && Pdata_Check(self->file)) {
1210 if (write_other(self, NULL, 0) < 0) return -1;
1211 PDATA_APPEND(self->file, args, -1);
1212 }
1213 else {
1214 if ((*self->write_func)(self,
1215 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1216 return -1;
1217 }
1218 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001220 if (doput)
1221 if (put(self, args) < 0)
1222 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001224 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001226 err:
1227 Py_XDECREF(repr);
1228 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001229}
1230
1231
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001232#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001233/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1234 backslash and newline characters to \uXXXX escapes. */
1235static PyObject *
1236modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1237{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001238 PyObject *repr;
1239 char *p;
1240 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001242 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001244 repr = PyString_FromStringAndSize(NULL, 6 * size);
1245 if (repr == NULL)
1246 return NULL;
1247 if (size == 0)
1248 return repr;
1249
1250 p = q = PyString_AS_STRING(repr);
1251 while (size-- > 0) {
1252 Py_UNICODE ch = *s++;
1253 /* Map 16-bit characters to '\uxxxx' */
1254 if (ch >= 256 || ch == '\\' || ch == '\n') {
1255 *p++ = '\\';
1256 *p++ = 'u';
1257 *p++ = hexdigit[(ch >> 12) & 0xf];
1258 *p++ = hexdigit[(ch >> 8) & 0xf];
1259 *p++ = hexdigit[(ch >> 4) & 0xf];
1260 *p++ = hexdigit[ch & 15];
1261 }
1262 /* Copy everything else as-is */
1263 else
1264 *p++ = (char) ch;
1265 }
1266 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001267 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001268 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001269}
1270
1271
Guido van Rossum60456fd1997-04-09 17:36:32 +00001272static int
Tim Peterscba30e22003-02-01 06:24:36 +00001273save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001274{
1275 int size, len;
1276 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001278 if (!PyUnicode_Check(args))
1279 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001281 if (!self->bin) {
1282 char *repr_str;
1283 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001285 repr = modified_EncodeRawUnicodeEscape(
1286 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001287 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001288 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001290 if ((len = PyString_Size(repr)) < 0)
1291 goto err;
1292 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001294 if ((*self->write_func)(self, &string, 1) < 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, repr_str, len) < 0)
1298 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300 if ((*self->write_func)(self, "\n", 1) < 0)
1301 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001303 Py_XDECREF(repr);
1304 }
1305 else {
1306 int i;
1307 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001308
Tim Peterscba30e22003-02-01 06:24:36 +00001309 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001310 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001312 if ((size = PyString_Size(repr)) < 0)
1313 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001315 c_str[0] = BINUNICODE;
1316 for (i = 1; i < 5; i++)
1317 c_str[i] = (int)(size >> ((i - 1) * 8));
1318 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001319
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001320 if ((*self->write_func)(self, c_str, len) < 0)
1321 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001322
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001323 if (size > 128 && Pdata_Check(self->file)) {
1324 if (write_other(self, NULL, 0) < 0)
1325 goto err;
1326 PDATA_APPEND(self->file, repr, -1);
1327 }
1328 else {
1329 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1330 size) < 0)
1331 goto err;
1332 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001334 Py_DECREF(repr);
1335 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001337 if (doput)
1338 if (put(self, args) < 0)
1339 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001341 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001343 err:
1344 Py_XDECREF(repr);
1345 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001346}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001347#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001348
1349
1350static int
Tim Peterscba30e22003-02-01 06:24:36 +00001351save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001352{
1353 PyObject *element = 0, *py_tuple_id = 0;
1354 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001355
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001356 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001358 if ((*self->write_func)(self, &MARKv, 1) < 0)
1359 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001361 if ((len = PyTuple_Size(args)) < 0)
1362 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001364 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001365 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001366 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001368 if (save(self, element, 0) < 0)
1369 goto finally;
1370 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001371
Tim Peterscba30e22003-02-01 06:24:36 +00001372 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001373 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001375 if (len) {
1376 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1377 if (self->bin) {
1378 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001380 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1381 goto finally;
1382 }
1383 else {
1384 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001386 for (i = 0; i <= len; i++) {
1387 if ((*self->write_func)(self, &pop, 1) < 0)
1388 goto finally;
1389 }
1390 }
Tim Peters84e87f32001-03-17 04:50:51 +00001391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001392 if (get(self, py_tuple_id) < 0)
1393 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001395 res = 0;
1396 goto finally;
1397 }
1398 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001400 if ((*self->write_func)(self, &tuple, 1) < 0) {
1401 goto finally;
1402 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001404 if (put(self, args) < 0)
1405 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001407 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001409 finally:
1410 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001412 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001413}
1414
1415static int
Tim Peterscba30e22003-02-01 06:24:36 +00001416save_empty_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001417{
1418 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001420 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001421}
1422
1423
1424static int
Tim Peterscba30e22003-02-01 06:24:36 +00001425save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001426{
1427 PyObject *element = 0;
1428 int s_len, len, i, using_appends, res = -1;
1429 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001431 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001433 if (self->fast && !fast_save_enter(self, args))
1434 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001436 if (self->bin) {
1437 s[0] = EMPTY_LIST;
1438 s_len = 1;
1439 }
1440 else {
1441 s[0] = MARK;
1442 s[1] = LIST;
1443 s_len = 2;
1444 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001446 if ((len = PyList_Size(args)) < 0)
1447 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001449 if ((*self->write_func)(self, s, s_len) < 0)
1450 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001452 if (len == 0) {
1453 if (put(self, args) < 0)
1454 goto finally;
1455 }
1456 else {
1457 if (put2(self, args) < 0)
1458 goto finally;
1459 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001461 if ((using_appends = (self->bin && (len > 1))))
1462 if ((*self->write_func)(self, &MARKv, 1) < 0)
1463 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001465 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001466 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001467 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001469 if (save(self, element, 0) < 0)
1470 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001472 if (!using_appends) {
1473 if ((*self->write_func)(self, &append, 1) < 0)
1474 goto finally;
1475 }
1476 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001478 if (using_appends) {
1479 if ((*self->write_func)(self, &appends, 1) < 0)
1480 goto finally;
1481 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001483 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001484
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001485 finally:
1486 if (self->fast && !fast_save_leave(self, args))
1487 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001489 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001490}
1491
1492
Guido van Rossum60456fd1997-04-09 17:36:32 +00001493static int
Tim Peterscba30e22003-02-01 06:24:36 +00001494save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001495{
1496 PyObject *key = 0, *value = 0;
1497 int i, len, res = -1, using_setitems;
1498 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001500 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001502 if (self->fast && !fast_save_enter(self, args))
1503 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001505 if (self->bin) {
1506 s[0] = EMPTY_DICT;
1507 len = 1;
1508 }
1509 else {
1510 s[0] = MARK;
1511 s[1] = DICT;
1512 len = 2;
1513 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001515 if ((*self->write_func)(self, s, len) < 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 = PyDict_Size(args)) < 0)
1519 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001521 if (len == 0) {
1522 if (put(self, args) < 0)
1523 goto finally;
1524 }
1525 else {
1526 if (put2(self, args) < 0)
1527 goto finally;
1528 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001530 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1531 if ((*self->write_func)(self, &MARKv, 1) < 0)
1532 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001534 i = 0;
1535 while (PyDict_Next(args, &i, &key, &value)) {
1536 if (save(self, key, 0) < 0)
1537 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001538
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001539 if (save(self, value, 0) < 0)
1540 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001542 if (!using_setitems) {
1543 if ((*self->write_func)(self, &setitem, 1) < 0)
1544 goto finally;
1545 }
1546 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001548 if (using_setitems) {
1549 if ((*self->write_func)(self, &setitems, 1) < 0)
1550 goto finally;
1551 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001553 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001555 finally:
1556 if (self->fast && !fast_save_leave(self, args))
1557 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001559 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001560}
1561
1562
Tim Peters84e87f32001-03-17 04:50:51 +00001563static int
Tim Peterscba30e22003-02-01 06:24:36 +00001564save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001565{
1566 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1567 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1568 char *module_str, *name_str;
1569 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001571 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001573 if (self->fast && !fast_save_enter(self, args))
1574 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001576 if ((*self->write_func)(self, &MARKv, 1) < 0)
1577 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001578
Tim Peterscba30e22003-02-01 06:24:36 +00001579 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001580 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001582 if (self->bin) {
1583 if (save(self, class, 0) < 0)
1584 goto finally;
1585 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001587 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1588 PyObject *element = 0;
1589 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001591 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001592 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001593 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001595 if ((len = PyObject_Size(class_args)) < 0)
1596 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001598 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001599 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001600 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001602 if (save(self, element, 0) < 0) {
1603 Py_DECREF(element);
1604 goto finally;
1605 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001607 Py_DECREF(element);
1608 }
1609 }
1610 else {
1611 PyErr_Clear();
1612 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001614 if (!self->bin) {
1615 if (!( name = ((PyClassObject *)class)->cl_name )) {
1616 PyErr_SetString(PicklingError, "class has no name");
1617 goto finally;
1618 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001619
Tim Peterscba30e22003-02-01 06:24:36 +00001620 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001621 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001622
Tim Peters84e87f32001-03-17 04:50:51 +00001623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001624 if ((module_size = PyString_Size(module)) < 0 ||
1625 (name_size = PyString_Size(name)) < 0)
1626 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001628 module_str = PyString_AS_STRING((PyStringObject *)module);
1629 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001631 if ((*self->write_func)(self, &inst, 1) < 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, module_str, module_size) < 0)
1635 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001637 if ((*self->write_func)(self, "\n", 1) < 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, name_str, name_size) < 0)
1641 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001643 if ((*self->write_func)(self, "\n", 1) < 0)
1644 goto finally;
1645 }
1646 else if ((*self->write_func)(self, &obj, 1) < 0) {
1647 goto finally;
1648 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001649
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001650 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1651 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001652 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001653 goto finally;
1654 }
1655 else {
1656 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001658 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1659 PyErr_Clear();
1660 res = 0;
1661 goto finally;
1662 }
1663 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001665 if (!PyDict_Check(state)) {
1666 if (put2(self, args) < 0)
1667 goto finally;
1668 }
1669 else {
1670 if (put(self, args) < 0)
1671 goto finally;
1672 }
Tim Peters84e87f32001-03-17 04:50:51 +00001673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001674 if (save(self, state, 0) < 0)
1675 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001676
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001677 if ((*self->write_func)(self, &build, 1) < 0)
1678 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001680 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001681
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001682 finally:
1683 if (self->fast && !fast_save_leave(self, args))
1684 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001686 Py_XDECREF(module);
1687 Py_XDECREF(class);
1688 Py_XDECREF(state);
1689 Py_XDECREF(getinitargs_func);
1690 Py_XDECREF(getstate_func);
1691 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001693 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001694}
1695
1696
Guido van Rossum60456fd1997-04-09 17:36:32 +00001697static int
Tim Peterscba30e22003-02-01 06:24:36 +00001698save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001699{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001700 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001701 char *name_str, *module_str;
1702 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001704 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001706 if (name) {
1707 global_name = name;
1708 Py_INCREF(global_name);
1709 }
1710 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001711 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001712 goto finally;
1713 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001714
Tim Peterscba30e22003-02-01 06:24:36 +00001715 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001716 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001718 if ((module_size = PyString_Size(module)) < 0 ||
1719 (name_size = PyString_Size(global_name)) < 0)
1720 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001722 module_str = PyString_AS_STRING((PyStringObject *)module);
1723 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001724
Guido van Rossum75bfd052002-12-24 18:10:07 +00001725 /* XXX This can be doing a relative import. Clearly it shouldn't,
1726 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001727 mod = PyImport_ImportModule(module_str);
1728 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001729 cPickle_ErrFormat(PicklingError,
1730 "Can't pickle %s: it's not found as %s.%s",
1731 "OSS", args, module, global_name);
1732 goto finally;
1733 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001734 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001735 if (klass == NULL) {
1736 cPickle_ErrFormat(PicklingError,
1737 "Can't pickle %s: it's not found as %s.%s",
1738 "OSS", args, module, global_name);
1739 goto finally;
1740 }
1741 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001742 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001743 cPickle_ErrFormat(PicklingError,
1744 "Can't pickle %s: it's not the same object as %s.%s",
1745 "OSS", args, module, global_name);
1746 goto finally;
1747 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001748 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001750 if ((*self->write_func)(self, &global, 1) < 0)
1751 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001753 if ((*self->write_func)(self, module_str, module_size) < 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, "\n", 1) < 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, name_str, name_size) < 0)
1760 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001762 if ((*self->write_func)(self, "\n", 1) < 0)
1763 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001765 if (put(self, args) < 0)
1766 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001768 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001770 finally:
1771 Py_XDECREF(module);
1772 Py_XDECREF(global_name);
1773 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001775 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001776}
1777
Guido van Rossum60456fd1997-04-09 17:36:32 +00001778static int
Tim Peterscba30e22003-02-01 06:24:36 +00001779save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001780{
1781 PyObject *pid = 0;
1782 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001784 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001786 Py_INCREF(args);
1787 ARG_TUP(self, args);
1788 if (self->arg) {
1789 pid = PyObject_Call(f, self->arg, NULL);
1790 FREE_ARG_TUP(self);
1791 }
1792 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001794 if (pid != Py_None) {
1795 if (!self->bin) {
1796 if (!PyString_Check(pid)) {
1797 PyErr_SetString(PicklingError,
1798 "persistent id must be string");
1799 goto finally;
1800 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001802 if ((*self->write_func)(self, &persid, 1) < 0)
1803 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001805 if ((size = PyString_Size(pid)) < 0)
1806 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001808 if ((*self->write_func)(self,
1809 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1810 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001812 if ((*self->write_func)(self, "\n", 1) < 0)
1813 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001815 res = 1;
1816 goto finally;
1817 }
1818 else if (save(self, pid, 1) >= 0) {
1819 if ((*self->write_func)(self, &binpersid, 1) < 0)
1820 res = -1;
1821 else
1822 res = 1;
1823 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001825 goto finally;
1826 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001828 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001830 finally:
1831 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001833 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001834}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001835
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001836
Tim Peters84e87f32001-03-17 04:50:51 +00001837static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001838save_reduce(Picklerobject *self, PyObject *callable,
Tim Peterscba30e22003-02-01 06:24:36 +00001839 PyObject *tup, PyObject *state, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001840{
1841 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001843 if (save(self, callable, 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 (save(self, tup, 0) < 0)
1847 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001849 if ((*self->write_func)(self, &reduce, 1) < 0)
1850 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001852 if (ob != NULL) {
1853 if (state && !PyDict_Check(state)) {
1854 if (put2(self, ob) < 0)
1855 return -1;
1856 }
1857 else {
1858 if (put(self, ob) < 0)
1859 return -1;
1860 }
1861 }
Tim Peters84e87f32001-03-17 04:50:51 +00001862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001863 if (state) {
1864 if (save(self, state, 0) < 0)
1865 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001867 if ((*self->write_func)(self, &build, 1) < 0)
1868 return -1;
1869 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001871 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001872}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001873
Guido van Rossum60456fd1997-04-09 17:36:32 +00001874static int
Tim Peterscba30e22003-02-01 06:24:36 +00001875save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001876{
1877 PyTypeObject *type;
1878 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1879 *callable = 0, *state = 0;
1880 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001881
Martin v. Löwis5a395302002-08-04 08:20:23 +00001882 if (self->nesting++ > Py_GetRecursionLimit()){
1883 PyErr_SetString(PyExc_RuntimeError,
1884 "maximum recursion depth exceeded");
1885 goto finally;
1886 }
1887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001888 if (!pers_save && self->pers_func) {
1889 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1890 res = tmp;
1891 goto finally;
1892 }
1893 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001895 if (args == Py_None) {
1896 res = save_none(self, args);
1897 goto finally;
1898 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001900 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001902 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001903 case 'b':
1904 if (args == Py_False || args == Py_True) {
1905 res = save_bool(self, args);
1906 goto finally;
1907 }
1908 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001909 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001910 if (type == &PyInt_Type) {
1911 res = save_int(self, args);
1912 goto finally;
1913 }
1914 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001915
Guido van Rossum60456fd1997-04-09 17:36:32 +00001916 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001917 if (type == &PyLong_Type) {
1918 res = save_long(self, args);
1919 goto finally;
1920 }
1921 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001922
Guido van Rossum60456fd1997-04-09 17:36:32 +00001923 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001924 if (type == &PyFloat_Type) {
1925 res = save_float(self, args);
1926 goto finally;
1927 }
1928 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001929
Guido van Rossum60456fd1997-04-09 17:36:32 +00001930 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001931 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
1932 if (self->bin) res = save_empty_tuple(self, args);
1933 else res = save_tuple(self, args);
1934 goto finally;
1935 }
1936 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001937
Guido van Rossum60456fd1997-04-09 17:36:32 +00001938 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001939 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
1940 res = save_string(self, args, 0);
1941 goto finally;
1942 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001943
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001944#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001945 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001946 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1947 res = save_unicode(self, args, 0);
1948 goto finally;
1949 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001950#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001951 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001953 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00001954 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001955 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001957 if (PyDict_GetItem(self->memo, py_ob_id)) {
1958 if (get(self, py_ob_id) < 0)
1959 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001961 res = 0;
1962 goto finally;
1963 }
1964 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001966 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001967 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001968 if (type == &PyString_Type) {
1969 res = save_string(self, args, 1);
1970 goto finally;
1971 }
1972 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001973
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001974#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001975 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001976 if (type == &PyUnicode_Type) {
1977 res = save_unicode(self, args, 1);
1978 goto finally;
1979 }
1980 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001981#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001982
Guido van Rossum60456fd1997-04-09 17:36:32 +00001983 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001984 if (type == &PyTuple_Type) {
1985 res = save_tuple(self, args);
1986 goto finally;
1987 }
1988 if (type == &PyType_Type) {
1989 res = save_global(self, args, NULL);
1990 goto finally;
1991 }
1992 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001993
Guido van Rossum60456fd1997-04-09 17:36:32 +00001994 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001995 if (type == &PyList_Type) {
1996 res = save_list(self, args);
1997 goto finally;
1998 }
1999 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002000
2001 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002002 if (type == &PyDict_Type) {
2003 res = save_dict(self, args);
2004 goto finally;
2005 }
2006 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002007
2008 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002009 if (type == &PyInstance_Type) {
2010 res = save_inst(self, args);
2011 goto finally;
2012 }
2013 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002014
2015 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002016 if (type == &PyClass_Type) {
2017 res = save_global(self, args, NULL);
2018 goto finally;
2019 }
2020 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002021
2022 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002023 if (type == &PyFunction_Type) {
2024 res = save_global(self, args, NULL);
2025 goto finally;
2026 }
2027 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002028
2029 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002030 if (type == &PyCFunction_Type) {
2031 res = save_global(self, args, NULL);
2032 goto finally;
2033 }
2034 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002036 if (!pers_save && self->inst_pers_func) {
2037 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2038 res = tmp;
2039 goto finally;
2040 }
2041 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002042
Jeremy Hylton39c61162002-07-16 19:47:43 +00002043 if (PyType_IsSubtype(type, &PyType_Type)) {
2044 res = save_global(self, args, NULL);
2045 goto finally;
2046 }
2047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002048 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2049 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002050
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002051 Py_INCREF(args);
2052 ARG_TUP(self, args);
2053 if (self->arg) {
2054 t = PyObject_Call(__reduce__, self->arg, NULL);
2055 FREE_ARG_TUP(self);
2056 }
2057 if (! t) goto finally;
2058 }
2059 else {
2060 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002062 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2063 t = PyObject_Call(__reduce__, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002064 if (!t)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002065 goto finally;
2066 }
2067 else {
2068 PyErr_Clear();
2069 }
2070 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002072 if (t) {
2073 if (PyString_Check(t)) {
2074 res = save_global(self, args, t);
2075 goto finally;
2076 }
Tim Peters84e87f32001-03-17 04:50:51 +00002077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002078 if (!PyTuple_Check(t)) {
2079 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2080 "be a tuple", "O", __reduce__);
2081 goto finally;
2082 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002084 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002086 if ((size != 3) && (size != 2)) {
2087 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2088 "contain only two or three elements", "O", __reduce__);
2089 goto finally;
2090 }
Tim Peters84e87f32001-03-17 04:50:51 +00002091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002092 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002094 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002096 if (size > 2) {
2097 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002098 if (state == Py_None)
2099 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002100 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002101
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002102 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2103 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2104 "returned by %s must be a tuple", "O", __reduce__);
2105 goto finally;
2106 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002108 res = save_reduce(self, callable, arg_tup, state, args);
2109 goto finally;
2110 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002112 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002114 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002115 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002116 Py_XDECREF(py_ob_id);
2117 Py_XDECREF(__reduce__);
2118 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002120 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002121}
2122
2123
2124static int
Tim Peterscba30e22003-02-01 06:24:36 +00002125dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002126{
2127 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002129 if (save(self, args, 0) < 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, &stop, 1) < 0)
2133 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002135 if ((*self->write_func)(self, NULL, 0) < 0)
2136 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002138 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002139}
2140
2141static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002142Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002143{
Tim Peterscba30e22003-02-01 06:24:36 +00002144 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002145 PyDict_Clear(self->memo);
2146 Py_INCREF(Py_None);
2147 return Py_None;
2148}
2149
2150static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002151Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002152{
2153 int l, i, rsize, ssize, clear=1, lm;
2154 long ik;
2155 PyObject *k, *r;
2156 char *s, *p, *have_get;
2157 Pdata *data;
2158
2159 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002160 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002161 return NULL;
2162
2163 /* Check to make sure we are based on a list */
2164 if (! Pdata_Check(self->file)) {
2165 PyErr_SetString(PicklingError,
2166 "Attempt to getvalue() a non-list-based pickler");
2167 return NULL;
2168 }
2169
2170 /* flush write buffer */
2171 if (write_other(self, NULL, 0) < 0) return NULL;
2172
2173 data=(Pdata*)self->file;
2174 l=data->length;
2175
2176 /* set up an array to hold get/put status */
2177 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2178 lm++;
2179 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2180 memset(have_get,0,lm);
2181
2182 /* Scan for gets. */
2183 for (rsize=0, i=l; --i >= 0; ) {
2184 k=data->data[i];
2185
2186 if (PyString_Check(k)) {
2187 rsize += PyString_GET_SIZE(k);
2188 }
2189
2190 else if (PyInt_Check(k)) { /* put */
2191 ik=PyInt_AS_LONG((PyIntObject*)k);
2192 if (ik >= lm || ik==0) {
2193 PyErr_SetString(PicklingError,
2194 "Invalid get data");
2195 return NULL;
2196 }
2197 if (have_get[ik]) { /* with matching get */
2198 if (ik < 256) rsize += 2;
2199 else rsize+=5;
2200 }
2201 }
2202
2203 else if (! (PyTuple_Check(k) &&
2204 PyTuple_GET_SIZE(k) == 2 &&
2205 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2206 ) {
2207 PyErr_SetString(PicklingError,
2208 "Unexpected data in internal list");
2209 return NULL;
2210 }
2211
2212 else { /* put */
2213 ik=PyInt_AS_LONG((PyIntObject*)k);
2214 if (ik >= lm || ik==0) {
2215 PyErr_SetString(PicklingError,
2216 "Invalid get data");
2217 return NULL;
2218 }
2219 have_get[ik]=1;
2220 if (ik < 256) rsize += 2;
2221 else rsize+=5;
2222 }
2223
2224 }
2225
2226 /* Now generate the result */
2227 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2228 s=PyString_AS_STRING((PyStringObject*)r);
2229
2230 for (i=0; i<l; i++) {
2231 k=data->data[i];
2232
2233 if (PyString_Check(k)) {
2234 ssize=PyString_GET_SIZE(k);
2235 if (ssize) {
2236 p=PyString_AS_STRING((PyStringObject*)k);
2237 while (--ssize >= 0) *s++=*p++;
2238 }
2239 }
2240
2241 else if (PyTuple_Check(k)) { /* get */
2242 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2243 if (ik < 256) {
2244 *s++ = BINGET;
2245 *s++ = (int)(ik & 0xff);
2246 }
2247 else {
2248 *s++ = LONG_BINGET;
2249 *s++ = (int)(ik & 0xff);
2250 *s++ = (int)((ik >> 8) & 0xff);
2251 *s++ = (int)((ik >> 16) & 0xff);
2252 *s++ = (int)((ik >> 24) & 0xff);
2253 }
2254 }
2255
2256 else { /* put */
2257 ik=PyInt_AS_LONG((PyIntObject*)k);
2258
2259 if (have_get[ik]) { /* with matching get */
2260 if (ik < 256) {
2261 *s++ = BINPUT;
2262 *s++ = (int)(ik & 0xff);
2263 }
2264 else {
2265 *s++ = LONG_BINPUT;
2266 *s++ = (int)(ik & 0xff);
2267 *s++ = (int)((ik >> 8) & 0xff);
2268 *s++ = (int)((ik >> 16) & 0xff);
2269 *s++ = (int)((ik >> 24) & 0xff);
2270 }
2271 }
2272 }
2273
2274 }
2275
2276 if (clear) {
2277 PyDict_Clear(self->memo);
2278 Pdata_clear(data,0);
2279 }
2280
2281 free(have_get);
2282 return r;
2283 err:
2284 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002285 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002286}
2287
2288static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002289Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002290{
2291 PyObject *ob;
2292 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002293
Tim Peterscba30e22003-02-01 06:24:36 +00002294 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002295 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002297 if (dump(self, ob) < 0)
2298 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002300 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002302 /* XXX Why does dump() return self? */
2303 Py_INCREF(self);
2304 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002305}
2306
2307
Tim Peterscba30e22003-02-01 06:24:36 +00002308static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002309{
Neal Norwitzb0493252002-03-31 14:44:22 +00002310 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002311 PyDoc_STR("dump(object) -- "
2312 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002313 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002314 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002315 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002316 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002317 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002318};
2319
2320
2321static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002322newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002323{
2324 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002325
Tim Peters5bd2a792003-02-01 16:45:06 +00002326 if (proto < 0)
2327 proto = CURRENT_PROTOCOL_NUMBER;
2328 if (proto > CURRENT_PROTOCOL_NUMBER) {
2329 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2330 "the highest available protocol is %d",
2331 proto, CURRENT_PROTOCOL_NUMBER);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002332 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002333 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002334
Tim Peters5bd2a792003-02-01 16:45:06 +00002335 self = PyObject_New(Picklerobject, &Picklertype);
2336 if (self == NULL)
2337 return NULL;
2338 self->proto = proto;
2339 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002340 self->fp = NULL;
2341 self->write = NULL;
2342 self->memo = NULL;
2343 self->arg = NULL;
2344 self->pers_func = NULL;
2345 self->inst_pers_func = NULL;
2346 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002347 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002348 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002349 self->fast_container = 0;
2350 self->fast_memo = NULL;
2351 self->buf_size = 0;
2352 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002353
Tim Peters5bd2a792003-02-01 16:45:06 +00002354 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002355 if (file)
2356 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002357 else {
2358 file = Pdata_New();
2359 if (file == NULL)
2360 goto err;
2361 }
2362 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002363
Tim Peterscba30e22003-02-01 06:24:36 +00002364 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002365 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002367 if (PyFile_Check(file)) {
2368 self->fp = PyFile_AsFile(file);
2369 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002370 PyErr_SetString(PyExc_ValueError,
2371 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002372 goto err;
2373 }
2374 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002375 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002376 else if (PycStringIO_OutputCheck(file)) {
2377 self->write_func = write_cStringIO;
2378 }
2379 else if (file == Py_None) {
2380 self->write_func = write_none;
2381 }
2382 else {
2383 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002385 if (! Pdata_Check(file)) {
2386 self->write = PyObject_GetAttr(file, write_str);
2387 if (!self->write) {
2388 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002389 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002390 "argument must have 'write' "
2391 "attribute");
2392 goto err;
2393 }
2394 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002395
Tim Peters5bd2a792003-02-01 16:45:06 +00002396 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2397 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002398 PyErr_NoMemory();
2399 goto err;
2400 }
2401 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002403 if (PyEval_GetRestricted()) {
2404 /* Restricted execution, get private tables */
2405 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002407 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2408 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2409 Py_DECREF(m);
2410 if (!( self->dispatch_table )) goto err;
2411 }
2412 else {
2413 self->dispatch_table=dispatch_table;
2414 Py_INCREF(dispatch_table);
2415 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002417 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002419 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002420 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002421 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002422}
2423
2424
2425static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002426get_Pickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002427{
2428 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002429 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002430
Tim Peters5bd2a792003-02-01 16:45:06 +00002431 /* XXX What is this doing? The documented signature is
2432 * XXX Pickler(file, proto=0), but this accepts Pickler() and
2433 * XXX Pickler(integer) too. The meaning then is clear as mud.
2434 * XXX Bug? Feature?
2435 */
2436 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002437 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002438 proto = 0;
2439 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002440 return NULL;
2441 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002442 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002443}
2444
2445
2446static void
Tim Peterscba30e22003-02-01 06:24:36 +00002447Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002448{
2449 Py_XDECREF(self->write);
2450 Py_XDECREF(self->memo);
2451 Py_XDECREF(self->fast_memo);
2452 Py_XDECREF(self->arg);
2453 Py_XDECREF(self->file);
2454 Py_XDECREF(self->pers_func);
2455 Py_XDECREF(self->inst_pers_func);
2456 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002457 PyMem_Free(self->write_buf);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002458 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002459}
2460
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002461static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002462Pickler_get_pers_func(Picklerobject *p)
2463{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002464 if (p->pers_func == NULL)
2465 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2466 else
2467 Py_INCREF(p->pers_func);
2468 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002469}
2470
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002471static int
2472Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2473{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002474 if (v == NULL) {
2475 PyErr_SetString(PyExc_TypeError,
2476 "attribute deletion is not supported");
2477 return -1;
2478 }
2479 Py_XDECREF(p->pers_func);
2480 Py_INCREF(v);
2481 p->pers_func = v;
2482 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002483}
2484
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002485static int
2486Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2487{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002488 if (v == NULL) {
2489 PyErr_SetString(PyExc_TypeError,
2490 "attribute deletion is not supported");
2491 return -1;
2492 }
2493 Py_XDECREF(p->inst_pers_func);
2494 Py_INCREF(v);
2495 p->inst_pers_func = v;
2496 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002497}
2498
2499static PyObject *
2500Pickler_get_memo(Picklerobject *p)
2501{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002502 if (p->memo == NULL)
2503 PyErr_SetString(PyExc_AttributeError, "memo");
2504 else
2505 Py_INCREF(p->memo);
2506 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002507}
2508
2509static int
2510Pickler_set_memo(Picklerobject *p, PyObject *v)
2511{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002512 if (v == NULL) {
2513 PyErr_SetString(PyExc_TypeError,
2514 "attribute deletion is not supported");
2515 return -1;
2516 }
2517 if (!PyDict_Check(v)) {
2518 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2519 return -1;
2520 }
2521 Py_XDECREF(p->memo);
2522 Py_INCREF(v);
2523 p->memo = v;
2524 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002525}
2526
2527static PyObject *
2528Pickler_get_error(Picklerobject *p)
2529{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002530 /* why is this an attribute on the Pickler? */
2531 Py_INCREF(PicklingError);
2532 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002533}
2534
2535static PyMemberDef Pickler_members[] = {
2536 {"binary", T_INT, offsetof(Picklerobject, bin)},
2537 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002538 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002539};
2540
2541static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002542 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002543 (setter)Pickler_set_pers_func},
2544 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2545 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002546 {"PicklingError", (getter)Pickler_get_error, NULL},
2547 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002548};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002549
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002550PyDoc_STRVAR(Picklertype__doc__,
2551"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002552
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002553static PyTypeObject Picklertype = {
2554 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002555 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002556 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002557 sizeof(Picklerobject), /*tp_basicsize*/
2558 0,
2559 (destructor)Pickler_dealloc, /* tp_dealloc */
2560 0, /* tp_print */
2561 0, /* tp_getattr */
2562 0, /* tp_setattr */
2563 0, /* tp_compare */
2564 0, /* tp_repr */
2565 0, /* tp_as_number */
2566 0, /* tp_as_sequence */
2567 0, /* tp_as_mapping */
2568 0, /* tp_hash */
2569 0, /* tp_call */
2570 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002571 PyObject_GenericGetAttr, /* tp_getattro */
2572 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002573 0, /* tp_as_buffer */
2574 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2575 Picklertype__doc__, /* tp_doc */
2576 0, /* tp_traverse */
2577 0, /* tp_clear */
2578 0, /* tp_richcompare */
2579 0, /* tp_weaklistoffset */
2580 0, /* tp_iter */
2581 0, /* tp_iternext */
2582 Pickler_methods, /* tp_methods */
2583 Pickler_members, /* tp_members */
2584 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002585};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002586
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002587static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002588find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002589{
2590 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002592 if (fc) {
2593 if (fc==Py_None) {
2594 PyErr_SetString(UnpicklingError,
2595 "Global and instance pickles are not supported.");
2596 return NULL;
2597 }
Tim Peterscba30e22003-02-01 06:24:36 +00002598 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002599 py_global_name);
2600 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002602 module = PySys_GetObject("modules");
2603 if (module == NULL)
2604 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002606 module = PyDict_GetItem(module, py_module_name);
2607 if (module == NULL) {
2608 module = PyImport_Import(py_module_name);
2609 if (!module)
2610 return NULL;
2611 global = PyObject_GetAttr(module, py_global_name);
2612 Py_DECREF(module);
2613 }
2614 else
2615 global = PyObject_GetAttr(module, py_global_name);
2616 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002617}
2618
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002619static int
Tim Peterscba30e22003-02-01 06:24:36 +00002620marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002621{
2622 if (self->num_marks < 1) {
2623 PyErr_SetString(UnpicklingError, "could not find MARK");
2624 return -1;
2625 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002627 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002628}
2629
Tim Peters84e87f32001-03-17 04:50:51 +00002630
Guido van Rossum60456fd1997-04-09 17:36:32 +00002631static int
Tim Peterscba30e22003-02-01 06:24:36 +00002632load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002633{
2634 PDATA_APPEND(self->stack, Py_None, -1);
2635 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002636}
2637
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002638static int
Tim Peterscba30e22003-02-01 06:24:36 +00002639bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002640{
2641 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2642 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002643}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002644
2645static int
Tim Peterscba30e22003-02-01 06:24:36 +00002646load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002647{
2648 PyObject *py_int = 0;
2649 char *endptr, *s;
2650 int len, res = -1;
2651 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002653 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2654 if (len < 2) return bad_readline();
2655 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002657 errno = 0;
2658 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002659
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002660 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2661 /* Hm, maybe we've got something long. Let's try reading
2662 it as a Python long object. */
2663 errno = 0;
2664 py_int = PyLong_FromString(s, NULL, 0);
2665 if (py_int == NULL) {
2666 PyErr_SetString(PyExc_ValueError,
2667 "could not convert string to int");
2668 goto finally;
2669 }
2670 }
2671 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002672 if (len == 3 && (l == 0 || l == 1)) {
2673 if (!( py_int = PyBool_FromLong(l))) goto finally;
2674 }
2675 else {
2676 if (!( py_int = PyInt_FromLong(l))) goto finally;
2677 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002678 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002680 free(s);
2681 PDATA_PUSH(self->stack, py_int, -1);
2682 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002684 finally:
2685 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002687 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002688}
2689
2690
Tim Peters84e87f32001-03-17 04:50:51 +00002691static long
Tim Peterscba30e22003-02-01 06:24:36 +00002692calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002693{
2694 unsigned char c;
2695 int i;
2696 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002698 for (i = 0, l = 0L; i < x; i++) {
2699 c = (unsigned char)s[i];
2700 l |= (long)c << (i * 8);
2701 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002702#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002703 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2704 * is signed, so on a box with longs bigger than 4 bytes we need
2705 * to extend a BININT's sign bit to the full width.
2706 */
2707 if (x == 4 && l & (1L << 31))
2708 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002709#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002710 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002711}
2712
2713
2714static int
Tim Peterscba30e22003-02-01 06:24:36 +00002715load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002716{
2717 PyObject *py_int = 0;
2718 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002720 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002721
Tim Peterscba30e22003-02-01 06:24:36 +00002722 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002723 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002725 PDATA_PUSH(self->stack, py_int, -1);
2726 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002727}
2728
2729
2730static int
Tim Peterscba30e22003-02-01 06:24:36 +00002731load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002732{
2733 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002735 if ((*self->read_func)(self, &s, 4) < 0)
2736 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002738 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002739}
2740
2741
2742static int
Tim Peterscba30e22003-02-01 06:24:36 +00002743load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002744{
2745 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002747 if ((*self->read_func)(self, &s, 1) < 0)
2748 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002750 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002751}
2752
2753
2754static int
Tim Peterscba30e22003-02-01 06:24:36 +00002755load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002756{
2757 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002759 if ((*self->read_func)(self, &s, 2) < 0)
2760 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002762 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002763}
Tim Peters84e87f32001-03-17 04:50:51 +00002764
Guido van Rossum60456fd1997-04-09 17:36:32 +00002765static int
Tim Peterscba30e22003-02-01 06:24:36 +00002766load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002767{
2768 PyObject *l = 0;
2769 char *end, *s;
2770 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002772 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2773 if (len < 2) return bad_readline();
2774 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002775
Tim Peterscba30e22003-02-01 06:24:36 +00002776 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002777 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002779 free(s);
2780 PDATA_PUSH(self->stack, l, -1);
2781 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002783 finally:
2784 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002786 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002787}
2788
Tim Peters84e87f32001-03-17 04:50:51 +00002789
Guido van Rossum60456fd1997-04-09 17:36:32 +00002790static int
Tim Peterscba30e22003-02-01 06:24:36 +00002791load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002792{
2793 PyObject *py_float = 0;
2794 char *endptr, *s;
2795 int len, res = -1;
2796 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002798 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2799 if (len < 2) return bad_readline();
2800 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002802 errno = 0;
2803 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002805 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2806 PyErr_SetString(PyExc_ValueError,
2807 "could not convert string to float");
2808 goto finally;
2809 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002810
Tim Peterscba30e22003-02-01 06:24:36 +00002811 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002812 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002814 free(s);
2815 PDATA_PUSH(self->stack, py_float, -1);
2816 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002818 finally:
2819 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002821 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002822}
2823
Guido van Rossum60456fd1997-04-09 17:36:32 +00002824static int
Tim Peterscba30e22003-02-01 06:24:36 +00002825load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002826{
2827 PyObject *py_float = 0;
2828 int s, e;
2829 long fhi, flo;
2830 double x;
2831 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002833 if ((*self->read_func)(self, &p, 8) < 0)
2834 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002836 /* First byte */
2837 s = (*p>>7) & 1;
2838 e = (*p & 0x7F) << 4;
2839 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002841 /* Second byte */
2842 e |= (*p>>4) & 0xF;
2843 fhi = (*p & 0xF) << 24;
2844 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002846 /* Third byte */
2847 fhi |= (*p & 0xFF) << 16;
2848 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002850 /* Fourth byte */
2851 fhi |= (*p & 0xFF) << 8;
2852 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002854 /* Fifth byte */
2855 fhi |= *p & 0xFF;
2856 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002858 /* Sixth byte */
2859 flo = (*p & 0xFF) << 16;
2860 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002862 /* Seventh byte */
2863 flo |= (*p & 0xFF) << 8;
2864 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002866 /* Eighth byte */
2867 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002869 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2870 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002872 /* XXX This sadly ignores Inf/NaN */
2873 if (e == 0)
2874 e = -1022;
2875 else {
2876 x += 1.0;
2877 e -= 1023;
2878 }
2879 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002881 if (s)
2882 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002884 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002886 PDATA_PUSH(self->stack, py_float, -1);
2887 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002888}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002889
2890static int
Tim Peterscba30e22003-02-01 06:24:36 +00002891load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002892{
2893 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002894 int len, res = -1;
2895 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002897 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2898 if (len < 2) return bad_readline();
2899 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002900
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002901
2902 /* Strip outermost quotes */
2903 while (s[len-1] <= ' ')
2904 len--;
2905 if(s[0]=='"' && s[len-1]=='"'){
2906 s[len-1] = '\0';
2907 p = s + 1 ;
2908 len -= 2;
2909 } else if(s[0]=='\'' && s[len-1]=='\''){
2910 s[len-1] = '\0';
2911 p = s + 1 ;
2912 len -= 2;
2913 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002914 goto insecure;
2915 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002916
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002917 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
2918 if (str) {
2919 PDATA_PUSH(self->stack, str, -1);
2920 res = 0;
2921 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002922 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002923 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002925 insecure:
2926 free(s);
2927 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2928 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002929}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002930
2931
2932static int
Tim Peterscba30e22003-02-01 06:24:36 +00002933load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002934{
2935 PyObject *py_string = 0;
2936 long l;
2937 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002939 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002941 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943 if ((*self->read_func)(self, &s, l) < 0)
2944 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002945
Tim Peterscba30e22003-02-01 06:24:36 +00002946 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002947 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002949 PDATA_PUSH(self->stack, py_string, -1);
2950 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002951}
2952
2953
2954static int
Tim Peterscba30e22003-02-01 06:24:36 +00002955load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002956{
2957 PyObject *py_string = 0;
2958 unsigned char l;
2959 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002961 if ((*self->read_func)(self, &s, 1) < 0)
2962 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002964 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002966 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002967
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002968 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002970 PDATA_PUSH(self->stack, py_string, -1);
2971 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002972}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002973
2974
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002975#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002976static int
Tim Peterscba30e22003-02-01 06:24:36 +00002977load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002978{
2979 PyObject *str = 0;
2980 int len, res = -1;
2981 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002983 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2984 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002985
Tim Peterscba30e22003-02-01 06:24:36 +00002986 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002987 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002988
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002989 PDATA_PUSH(self->stack, str, -1);
2990 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002991
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002992 finally:
2993 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002994}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002995#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002996
2997
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002998#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002999static int
Tim Peterscba30e22003-02-01 06:24:36 +00003000load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003001{
3002 PyObject *unicode;
3003 long l;
3004 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003005
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003006 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003008 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003009
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003010 if ((*self->read_func)(self, &s, l) < 0)
3011 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003012
Tim Peterscba30e22003-02-01 06:24:36 +00003013 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003014 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003016 PDATA_PUSH(self->stack, unicode, -1);
3017 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003018}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003019#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003020
3021
3022static int
Tim Peterscba30e22003-02-01 06:24:36 +00003023load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003024{
3025 PyObject *tup;
3026 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003027
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003028 if ((i = marker(self)) < 0) return -1;
3029 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3030 PDATA_PUSH(self->stack, tup, -1);
3031 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003032}
3033
3034static int
Tim Peterscba30e22003-02-01 06:24:36 +00003035load_empty_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003036{
3037 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003039 if (!( tup=PyTuple_New(0))) return -1;
3040 PDATA_PUSH(self->stack, tup, -1);
3041 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003042}
3043
3044static int
Tim Peterscba30e22003-02-01 06:24:36 +00003045load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003046{
3047 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003049 if (!( list=PyList_New(0))) return -1;
3050 PDATA_PUSH(self->stack, list, -1);
3051 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003052}
3053
3054static int
Tim Peterscba30e22003-02-01 06:24:36 +00003055load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003056{
3057 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003059 if (!( dict=PyDict_New())) return -1;
3060 PDATA_PUSH(self->stack, dict, -1);
3061 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003062}
3063
3064
3065static int
Tim Peterscba30e22003-02-01 06:24:36 +00003066load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003067{
3068 PyObject *list = 0;
3069 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003071 if ((i = marker(self)) < 0) return -1;
3072 if (!( list=Pdata_popList(self->stack, i))) return -1;
3073 PDATA_PUSH(self->stack, list, -1);
3074 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003075}
3076
3077static int
Tim Peterscba30e22003-02-01 06:24:36 +00003078load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003079{
3080 PyObject *dict, *key, *value;
3081 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003083 if ((i = marker(self)) < 0) return -1;
3084 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003086 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003088 for (k = i+1; k < j; k += 2) {
3089 key =self->stack->data[k-1];
3090 value=self->stack->data[k ];
3091 if (PyDict_SetItem(dict, key, value) < 0) {
3092 Py_DECREF(dict);
3093 return -1;
3094 }
3095 }
3096 Pdata_clear(self->stack, i);
3097 PDATA_PUSH(self->stack, dict, -1);
3098 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003099}
3100
3101static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003102Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003103{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003104 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003106 if (PyClass_Check(cls)) {
3107 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003109 if ((l=PyObject_Size(args)) < 0) goto err;
3110 if (!( l )) {
3111 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003112
Tim Peterscba30e22003-02-01 06:24:36 +00003113 __getinitargs__ = PyObject_GetAttr(cls,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003114 __getinitargs___str);
3115 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003116 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003117 so bypass usual construction */
3118 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003120 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003121 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003122 goto err;
3123 return inst;
3124 }
3125 Py_DECREF(__getinitargs__);
3126 }
Tim Peters84e87f32001-03-17 04:50:51 +00003127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003128 if ((r=PyInstance_New(cls, args, NULL))) return r;
3129 else goto err;
3130 }
Tim Peters84e87f32001-03-17 04:50:51 +00003131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003132 if (args==Py_None) {
3133 /* Special case, call cls.__basicnew__() */
3134 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003136 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3137 if (!basicnew) return NULL;
3138 r=PyObject_CallObject(basicnew, NULL);
3139 Py_DECREF(basicnew);
3140 if (r) return r;
3141 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003143 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003145 err:
3146 {
3147 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003148
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003149 PyErr_Fetch(&tp, &v, &tb);
3150 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3151 Py_XDECREF(v);
3152 v=r;
3153 }
3154 PyErr_Restore(tp,v,tb);
3155 }
3156 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003157}
Tim Peters84e87f32001-03-17 04:50:51 +00003158
Guido van Rossum60456fd1997-04-09 17:36:32 +00003159
3160static int
Tim Peterscba30e22003-02-01 06:24:36 +00003161load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003162{
3163 PyObject *class, *tup, *obj=0;
3164 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003166 if ((i = marker(self)) < 0) return -1;
3167 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3168 PDATA_POP(self->stack, class);
3169 if (class) {
3170 obj = Instance_New(class, tup);
3171 Py_DECREF(class);
3172 }
3173 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003175 if (! obj) return -1;
3176 PDATA_PUSH(self->stack, obj, -1);
3177 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003178}
3179
3180
3181static int
Tim Peterscba30e22003-02-01 06:24:36 +00003182load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003183{
3184 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3185 int i, len;
3186 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003188 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003190 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3191 if (len < 2) return bad_readline();
3192 module_name = PyString_FromStringAndSize(s, len - 1);
3193 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003195 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3196 if (len < 2) return bad_readline();
3197 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003198 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003199 self->find_class);
3200 Py_DECREF(class_name);
3201 }
3202 }
3203 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003205 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003207 if ((tup=Pdata_popTuple(self->stack, i))) {
3208 obj = Instance_New(class, tup);
3209 Py_DECREF(tup);
3210 }
3211 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003213 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003215 PDATA_PUSH(self->stack, obj, -1);
3216 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003217}
3218
3219
3220static int
Tim Peterscba30e22003-02-01 06:24:36 +00003221load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003222{
3223 PyObject *class = 0, *module_name = 0, *class_name = 0;
3224 int len;
3225 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003226
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003227 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3228 if (len < 2) return bad_readline();
3229 module_name = PyString_FromStringAndSize(s, len - 1);
3230 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003232 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003233 if (len < 2) {
3234 Py_DECREF(module_name);
3235 return bad_readline();
3236 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003237 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003238 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003239 self->find_class);
3240 Py_DECREF(class_name);
3241 }
3242 }
3243 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003245 if (! class) return -1;
3246 PDATA_PUSH(self->stack, class, -1);
3247 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003248}
3249
3250
3251static int
Tim Peterscba30e22003-02-01 06:24:36 +00003252load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003253{
3254 PyObject *pid = 0;
3255 int len;
3256 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003258 if (self->pers_func) {
3259 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3260 if (len < 2) return bad_readline();
3261
3262 pid = PyString_FromStringAndSize(s, len - 1);
3263 if (!pid) return -1;
3264
3265 if (PyList_Check(self->pers_func)) {
3266 if (PyList_Append(self->pers_func, pid) < 0) {
3267 Py_DECREF(pid);
3268 return -1;
3269 }
3270 }
3271 else {
3272 ARG_TUP(self, pid);
3273 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003274 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003275 NULL);
3276 FREE_ARG_TUP(self);
3277 }
3278 }
3279
3280 if (! pid) return -1;
3281
3282 PDATA_PUSH(self->stack, pid, -1);
3283 return 0;
3284 }
3285 else {
3286 PyErr_SetString(UnpicklingError,
3287 "A load persistent id instruction was encountered,\n"
3288 "but no persistent_load function was specified.");
3289 return -1;
3290 }
3291}
3292
3293static int
Tim Peterscba30e22003-02-01 06:24:36 +00003294load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003295{
3296 PyObject *pid = 0;
3297
3298 if (self->pers_func) {
3299 PDATA_POP(self->stack, pid);
3300 if (! pid) return -1;
3301
3302 if (PyList_Check(self->pers_func)) {
3303 if (PyList_Append(self->pers_func, pid) < 0) {
3304 Py_DECREF(pid);
3305 return -1;
3306 }
3307 }
3308 else {
3309 ARG_TUP(self, pid);
3310 if (self->arg) {
3311 pid = PyObject_Call(self->pers_func, self->arg,
3312 NULL);
3313 FREE_ARG_TUP(self);
3314 }
3315 if (! pid) return -1;
3316 }
3317
3318 PDATA_PUSH(self->stack, pid, -1);
3319 return 0;
3320 }
3321 else {
3322 PyErr_SetString(UnpicklingError,
3323 "A load persistent id instruction was encountered,\n"
3324 "but no persistent_load function was specified.");
3325 return -1;
3326 }
3327}
3328
3329
3330static int
Tim Peterscba30e22003-02-01 06:24:36 +00003331load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003332{
3333 int len;
3334
3335 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3336
3337 /* Note that we split the (pickle.py) stack into two stacks,
3338 an object stack and a mark stack. We have to be clever and
3339 pop the right one. We do this by looking at the top of the
3340 mark stack.
3341 */
3342
3343 if ((self->num_marks > 0) &&
3344 (self->marks[self->num_marks - 1] == len))
3345 self->num_marks--;
3346 else {
3347 len--;
3348 Py_DECREF(self->stack->data[len]);
3349 self->stack->length=len;
3350 }
3351
3352 return 0;
3353}
3354
3355
3356static int
Tim Peterscba30e22003-02-01 06:24:36 +00003357load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003358{
3359 int i;
3360
3361 if ((i = marker(self)) < 0)
3362 return -1;
3363
3364 Pdata_clear(self->stack, i);
3365
3366 return 0;
3367}
3368
3369
3370static int
Tim Peterscba30e22003-02-01 06:24:36 +00003371load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003372{
3373 PyObject *last;
3374 int len;
3375
3376 if ((len = self->stack->length) <= 0) return stackUnderflow();
3377 last=self->stack->data[len-1];
3378 Py_INCREF(last);
3379 PDATA_PUSH(self->stack, last, -1);
3380 return 0;
3381}
3382
3383
3384static int
Tim Peterscba30e22003-02-01 06:24:36 +00003385load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003386{
3387 PyObject *py_str = 0, *value = 0;
3388 int len;
3389 char *s;
3390 int rc;
3391
3392 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003393 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003395 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003397 value = PyDict_GetItem(self->memo, py_str);
3398 if (! value) {
3399 PyErr_SetObject(BadPickleGet, py_str);
3400 rc = -1;
3401 } else {
3402 PDATA_APPEND(self->stack, value, -1);
3403 rc = 0;
3404 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003406 Py_DECREF(py_str);
3407 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003408}
3409
3410
3411static int
Tim Peterscba30e22003-02-01 06:24:36 +00003412load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003413{
3414 PyObject *py_key = 0, *value = 0;
3415 unsigned char key;
3416 char *s;
3417 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003419 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003421 key = (unsigned char)s[0];
3422 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003424 value = PyDict_GetItem(self->memo, py_key);
3425 if (! value) {
3426 PyErr_SetObject(BadPickleGet, py_key);
3427 rc = -1;
3428 } else {
3429 PDATA_APPEND(self->stack, value, -1);
3430 rc = 0;
3431 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003433 Py_DECREF(py_key);
3434 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003435}
3436
3437
3438static int
Tim Peterscba30e22003-02-01 06:24:36 +00003439load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003440{
3441 PyObject *py_key = 0, *value = 0;
3442 unsigned char c;
3443 char *s;
3444 long key;
3445 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003447 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003449 c = (unsigned char)s[0];
3450 key = (long)c;
3451 c = (unsigned char)s[1];
3452 key |= (long)c << 8;
3453 c = (unsigned char)s[2];
3454 key |= (long)c << 16;
3455 c = (unsigned char)s[3];
3456 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003458 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3459
3460 value = PyDict_GetItem(self->memo, py_key);
3461 if (! value) {
3462 PyErr_SetObject(BadPickleGet, py_key);
3463 rc = -1;
3464 } else {
3465 PDATA_APPEND(self->stack, value, -1);
3466 rc = 0;
3467 }
3468
3469 Py_DECREF(py_key);
3470 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003471}
3472
3473
3474static int
Tim Peterscba30e22003-02-01 06:24:36 +00003475load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003476{
3477 PyObject *py_str = 0, *value = 0;
3478 int len, l;
3479 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003481 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3482 if (l < 2) return bad_readline();
3483 if (!( len=self->stack->length )) return stackUnderflow();
3484 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3485 value=self->stack->data[len-1];
3486 l=PyDict_SetItem(self->memo, py_str, value);
3487 Py_DECREF(py_str);
3488 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003489}
3490
3491
3492static int
Tim Peterscba30e22003-02-01 06:24:36 +00003493load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003494{
3495 PyObject *py_key = 0, *value = 0;
3496 unsigned char key;
3497 char *s;
3498 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003500 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3501 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003503 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003505 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3506 value=self->stack->data[len-1];
3507 len=PyDict_SetItem(self->memo, py_key, value);
3508 Py_DECREF(py_key);
3509 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003510}
3511
3512
3513static int
Tim Peterscba30e22003-02-01 06:24:36 +00003514load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003515{
3516 PyObject *py_key = 0, *value = 0;
3517 long key;
3518 unsigned char c;
3519 char *s;
3520 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003522 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3523 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003525 c = (unsigned char)s[0];
3526 key = (long)c;
3527 c = (unsigned char)s[1];
3528 key |= (long)c << 8;
3529 c = (unsigned char)s[2];
3530 key |= (long)c << 16;
3531 c = (unsigned char)s[3];
3532 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003534 if (!( py_key = PyInt_FromLong(key))) return -1;
3535 value=self->stack->data[len-1];
3536 len=PyDict_SetItem(self->memo, py_key, value);
3537 Py_DECREF(py_key);
3538 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003539}
3540
3541
3542static int
Tim Peterscba30e22003-02-01 06:24:36 +00003543do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003544{
3545 PyObject *value = 0, *list = 0, *append_method = 0;
3546 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003548 len=self->stack->length;
3549 if (!( len >= x && x > 0 )) return stackUnderflow();
3550 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003551 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003553 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003555 if (PyList_Check(list)) {
3556 PyObject *slice;
3557 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003559 slice=Pdata_popList(self->stack, x);
3560 list_len = PyList_GET_SIZE(list);
3561 i=PyList_SetSlice(list, list_len, list_len, slice);
3562 Py_DECREF(slice);
3563 return i;
3564 }
3565 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003566
Tim Peterscba30e22003-02-01 06:24:36 +00003567 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003568 return -1;
3569
3570 for (i = x; i < len; i++) {
3571 PyObject *junk;
3572
3573 value=self->stack->data[i];
3574 junk=0;
3575 ARG_TUP(self, value);
3576 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003577 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003578 NULL);
3579 FREE_ARG_TUP(self);
3580 }
3581 if (! junk) {
3582 Pdata_clear(self->stack, i+1);
3583 self->stack->length=x;
3584 Py_DECREF(append_method);
3585 return -1;
3586 }
3587 Py_DECREF(junk);
3588 }
3589 self->stack->length=x;
3590 Py_DECREF(append_method);
3591 }
3592
3593 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003594}
3595
3596
3597static int
Tim Peterscba30e22003-02-01 06:24:36 +00003598load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003599{
3600 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003601}
3602
3603
3604static int
Tim Peterscba30e22003-02-01 06:24:36 +00003605load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003606{
3607 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003608}
3609
3610
3611static int
Tim Peterscba30e22003-02-01 06:24:36 +00003612do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003613{
3614 PyObject *value = 0, *key = 0, *dict = 0;
3615 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003617 if (!( (len=self->stack->length) >= x
3618 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003619
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003620 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003622 for (i = x+1; i < len; i += 2) {
3623 key =self->stack->data[i-1];
3624 value=self->stack->data[i ];
3625 if (PyObject_SetItem(dict, key, value) < 0) {
3626 r=-1;
3627 break;
3628 }
3629 }
3630
3631 Pdata_clear(self->stack, x);
3632
3633 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003634}
3635
3636
Tim Peters84e87f32001-03-17 04:50:51 +00003637static int
Tim Peterscba30e22003-02-01 06:24:36 +00003638load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003639{
3640 return do_setitems(self, self->stack->length - 2);
3641}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003643static int
Tim Peterscba30e22003-02-01 06:24:36 +00003644load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003645{
3646 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003647}
3648
Tim Peters84e87f32001-03-17 04:50:51 +00003649
Guido van Rossum60456fd1997-04-09 17:36:32 +00003650static int
Tim Peterscba30e22003-02-01 06:24:36 +00003651load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003652{
3653 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3654 *junk = 0, *__setstate__ = 0;
3655 int i, r = 0;
3656
3657 if (self->stack->length < 2) return stackUnderflow();
3658 PDATA_POP(self->stack, value);
3659 if (! value) return -1;
3660 inst=self->stack->data[self->stack->length-1];
3661
3662 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3663 ARG_TUP(self, value);
3664 if (self->arg) {
3665 junk = PyObject_Call(__setstate__, self->arg, NULL);
3666 FREE_ARG_TUP(self);
3667 }
3668 Py_DECREF(__setstate__);
3669 if (! junk) return -1;
3670 Py_DECREF(junk);
3671 return 0;
3672 }
3673
3674 PyErr_Clear();
3675 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3676 i = 0;
3677 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3678 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3679 r=-1;
3680 break;
3681 }
3682 }
3683 Py_DECREF(instdict);
3684 }
3685 else r=-1;
3686
3687 Py_XDECREF(value);
3688
3689 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003690}
3691
3692
3693static int
Tim Peterscba30e22003-02-01 06:24:36 +00003694load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003695{
3696 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003698 /* Note that we split the (pickle.py) stack into two stacks, an
3699 object stack and a mark stack. Here we push a mark onto the
3700 mark stack.
3701 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003703 if ((self->num_marks + 1) >= self->marks_size) {
3704 s=self->marks_size+20;
3705 if (s <= self->num_marks) s=self->num_marks + 1;
3706 if (self->marks == NULL)
3707 self->marks=(int *)malloc(s * sizeof(int));
3708 else
Tim Peterscba30e22003-02-01 06:24:36 +00003709 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003710 s * sizeof(int));
3711 if (! self->marks) {
3712 PyErr_NoMemory();
3713 return -1;
3714 }
3715 self->marks_size = s;
3716 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003718 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003720 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003721}
3722
Guido van Rossum60456fd1997-04-09 17:36:32 +00003723static int
Tim Peterscba30e22003-02-01 06:24:36 +00003724load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003725{
3726 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003728 PDATA_POP(self->stack, arg_tup);
3729 if (! arg_tup) return -1;
3730 PDATA_POP(self->stack, callable);
3731 if (callable) {
3732 ob = Instance_New(callable, arg_tup);
3733 Py_DECREF(callable);
3734 }
3735 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003737 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003739 PDATA_PUSH(self->stack, ob, -1);
3740 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003741}
Tim Peters84e87f32001-03-17 04:50:51 +00003742
Guido van Rossum60456fd1997-04-09 17:36:32 +00003743static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003744load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003745{
3746 PyObject *err = 0, *val = 0;
3747 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003749 self->num_marks = 0;
3750 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003752 while (1) {
3753 if ((*self->read_func)(self, &s, 1) < 0)
3754 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003756 switch (s[0]) {
3757 case NONE:
3758 if (load_none(self) < 0)
3759 break;
3760 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762 case BININT:
3763 if (load_binint(self) < 0)
3764 break;
3765 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003767 case BININT1:
3768 if (load_binint1(self) < 0)
3769 break;
3770 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003772 case BININT2:
3773 if (load_binint2(self) < 0)
3774 break;
3775 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003777 case INT:
3778 if (load_int(self) < 0)
3779 break;
3780 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003782 case LONG:
3783 if (load_long(self) < 0)
3784 break;
3785 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003787 case FLOAT:
3788 if (load_float(self) < 0)
3789 break;
3790 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003792 case BINFLOAT:
3793 if (load_binfloat(self) < 0)
3794 break;
3795 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003797 case BINSTRING:
3798 if (load_binstring(self) < 0)
3799 break;
3800 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003802 case SHORT_BINSTRING:
3803 if (load_short_binstring(self) < 0)
3804 break;
3805 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003807 case STRING:
3808 if (load_string(self) < 0)
3809 break;
3810 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003811
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003812#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003813 case UNICODE:
3814 if (load_unicode(self) < 0)
3815 break;
3816 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003818 case BINUNICODE:
3819 if (load_binunicode(self) < 0)
3820 break;
3821 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003822#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003824 case EMPTY_TUPLE:
3825 if (load_empty_tuple(self) < 0)
3826 break;
3827 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003829 case TUPLE:
3830 if (load_tuple(self) < 0)
3831 break;
3832 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003834 case EMPTY_LIST:
3835 if (load_empty_list(self) < 0)
3836 break;
3837 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003839 case LIST:
3840 if (load_list(self) < 0)
3841 break;
3842 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003844 case EMPTY_DICT:
3845 if (load_empty_dict(self) < 0)
3846 break;
3847 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003849 case DICT:
3850 if (load_dict(self) < 0)
3851 break;
3852 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003854 case OBJ:
3855 if (load_obj(self) < 0)
3856 break;
3857 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003859 case INST:
3860 if (load_inst(self) < 0)
3861 break;
3862 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003864 case GLOBAL:
3865 if (load_global(self) < 0)
3866 break;
3867 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003869 case APPEND:
3870 if (load_append(self) < 0)
3871 break;
3872 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003874 case APPENDS:
3875 if (load_appends(self) < 0)
3876 break;
3877 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003879 case BUILD:
3880 if (load_build(self) < 0)
3881 break;
3882 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003884 case DUP:
3885 if (load_dup(self) < 0)
3886 break;
3887 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003889 case BINGET:
3890 if (load_binget(self) < 0)
3891 break;
3892 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003894 case LONG_BINGET:
3895 if (load_long_binget(self) < 0)
3896 break;
3897 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003898
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003899 case GET:
3900 if (load_get(self) < 0)
3901 break;
3902 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003904 case MARK:
3905 if (load_mark(self) < 0)
3906 break;
3907 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003908
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003909 case BINPUT:
3910 if (load_binput(self) < 0)
3911 break;
3912 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003914 case LONG_BINPUT:
3915 if (load_long_binput(self) < 0)
3916 break;
3917 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003919 case PUT:
3920 if (load_put(self) < 0)
3921 break;
3922 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003924 case POP:
3925 if (load_pop(self) < 0)
3926 break;
3927 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003929 case POP_MARK:
3930 if (load_pop_mark(self) < 0)
3931 break;
3932 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003934 case SETITEM:
3935 if (load_setitem(self) < 0)
3936 break;
3937 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003939 case SETITEMS:
3940 if (load_setitems(self) < 0)
3941 break;
3942 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003944 case STOP:
3945 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003947 case PERSID:
3948 if (load_persid(self) < 0)
3949 break;
3950 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003952 case BINPERSID:
3953 if (load_binpersid(self) < 0)
3954 break;
3955 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003957 case REDUCE:
3958 if (load_reduce(self) < 0)
3959 break;
3960 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003962 case '\0':
3963 /* end of file */
3964 PyErr_SetNone(PyExc_EOFError);
3965 break;
Tim Peterscba30e22003-02-01 06:24:36 +00003966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003967 default:
Tim Peterscba30e22003-02-01 06:24:36 +00003968 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003969 "invalid load key, '%s'.",
3970 "c", s[0]);
3971 return NULL;
3972 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003973
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003974 break;
3975 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003976
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003977 if ((err = PyErr_Occurred())) {
3978 if (err == PyExc_EOFError) {
3979 PyErr_SetNone(PyExc_EOFError);
3980 }
3981 return NULL;
3982 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003984 PDATA_POP(self->stack, val);
3985 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003986}
Tim Peters84e87f32001-03-17 04:50:51 +00003987
Guido van Rossum60456fd1997-04-09 17:36:32 +00003988
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003989/* No-load functions to support noload, which is used to
3990 find persistent references. */
3991
3992static int
Tim Peterscba30e22003-02-01 06:24:36 +00003993noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003994{
3995 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003997 if ((i = marker(self)) < 0) return -1;
3998 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003999}
4000
4001
4002static int
Tim Peterscba30e22003-02-01 06:24:36 +00004003noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004004{
4005 int i;
4006 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004008 if ((i = marker(self)) < 0) return -1;
4009 Pdata_clear(self->stack, i);
4010 if ((*self->readline_func)(self, &s) < 0) return -1;
4011 if ((*self->readline_func)(self, &s) < 0) return -1;
4012 PDATA_APPEND(self->stack, Py_None,-1);
4013 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004014}
4015
4016static int
Tim Peterscba30e22003-02-01 06:24:36 +00004017noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004018{
4019 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004021 if ((*self->readline_func)(self, &s) < 0) return -1;
4022 if ((*self->readline_func)(self, &s) < 0) return -1;
4023 PDATA_APPEND(self->stack, Py_None,-1);
4024 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004025}
4026
4027static int
Tim Peterscba30e22003-02-01 06:24:36 +00004028noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004029{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004031 if (self->stack->length < 2) return stackUnderflow();
4032 Pdata_clear(self->stack, self->stack->length-2);
4033 PDATA_APPEND(self->stack, Py_None,-1);
4034 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004035}
4036
4037static int
4038noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004039
Guido van Rossum053b8df1998-11-25 16:18:00 +00004040 if (self->stack->length < 1) return stackUnderflow();
4041 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004042 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004043}
4044
4045
4046static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004047noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004048{
4049 PyObject *err = 0, *val = 0;
4050 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004052 self->num_marks = 0;
4053 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004055 while (1) {
4056 if ((*self->read_func)(self, &s, 1) < 0)
4057 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004059 switch (s[0]) {
4060 case NONE:
4061 if (load_none(self) < 0)
4062 break;
4063 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004065 case BININT:
4066 if (load_binint(self) < 0)
4067 break;
4068 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004070 case BININT1:
4071 if (load_binint1(self) < 0)
4072 break;
4073 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004075 case BININT2:
4076 if (load_binint2(self) < 0)
4077 break;
4078 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004080 case INT:
4081 if (load_int(self) < 0)
4082 break;
4083 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004085 case LONG:
4086 if (load_long(self) < 0)
4087 break;
4088 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004089
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004090 case FLOAT:
4091 if (load_float(self) < 0)
4092 break;
4093 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004095 case BINFLOAT:
4096 if (load_binfloat(self) < 0)
4097 break;
4098 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004100 case BINSTRING:
4101 if (load_binstring(self) < 0)
4102 break;
4103 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004105 case SHORT_BINSTRING:
4106 if (load_short_binstring(self) < 0)
4107 break;
4108 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004110 case STRING:
4111 if (load_string(self) < 0)
4112 break;
4113 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004114
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004115#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004116 case UNICODE:
4117 if (load_unicode(self) < 0)
4118 break;
4119 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004121 case BINUNICODE:
4122 if (load_binunicode(self) < 0)
4123 break;
4124 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004125#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004127 case EMPTY_TUPLE:
4128 if (load_empty_tuple(self) < 0)
4129 break;
4130 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004132 case TUPLE:
4133 if (load_tuple(self) < 0)
4134 break;
4135 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004137 case EMPTY_LIST:
4138 if (load_empty_list(self) < 0)
4139 break;
4140 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004142 case LIST:
4143 if (load_list(self) < 0)
4144 break;
4145 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004147 case EMPTY_DICT:
4148 if (load_empty_dict(self) < 0)
4149 break;
4150 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004152 case DICT:
4153 if (load_dict(self) < 0)
4154 break;
4155 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004157 case OBJ:
4158 if (noload_obj(self) < 0)
4159 break;
4160 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004162 case INST:
4163 if (noload_inst(self) < 0)
4164 break;
4165 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004167 case GLOBAL:
4168 if (noload_global(self) < 0)
4169 break;
4170 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004172 case APPEND:
4173 if (load_append(self) < 0)
4174 break;
4175 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004177 case APPENDS:
4178 if (load_appends(self) < 0)
4179 break;
4180 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004182 case BUILD:
4183 if (noload_build(self) < 0)
4184 break;
4185 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004187 case DUP:
4188 if (load_dup(self) < 0)
4189 break;
4190 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004192 case BINGET:
4193 if (load_binget(self) < 0)
4194 break;
4195 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004197 case LONG_BINGET:
4198 if (load_long_binget(self) < 0)
4199 break;
4200 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004202 case GET:
4203 if (load_get(self) < 0)
4204 break;
4205 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004207 case MARK:
4208 if (load_mark(self) < 0)
4209 break;
4210 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004212 case BINPUT:
4213 if (load_binput(self) < 0)
4214 break;
4215 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004217 case LONG_BINPUT:
4218 if (load_long_binput(self) < 0)
4219 break;
4220 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004222 case PUT:
4223 if (load_put(self) < 0)
4224 break;
4225 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004226
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004227 case POP:
4228 if (load_pop(self) < 0)
4229 break;
4230 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004232 case POP_MARK:
4233 if (load_pop_mark(self) < 0)
4234 break;
4235 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004237 case SETITEM:
4238 if (load_setitem(self) < 0)
4239 break;
4240 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004242 case SETITEMS:
4243 if (load_setitems(self) < 0)
4244 break;
4245 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004247 case STOP:
4248 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004250 case PERSID:
4251 if (load_persid(self) < 0)
4252 break;
4253 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004255 case BINPERSID:
4256 if (load_binpersid(self) < 0)
4257 break;
4258 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004260 case REDUCE:
4261 if (noload_reduce(self) < 0)
4262 break;
4263 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004265 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004266 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004267 "invalid load key, '%s'.",
4268 "c", s[0]);
4269 return NULL;
4270 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004272 break;
4273 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004275 if ((err = PyErr_Occurred())) {
4276 if (err == PyExc_EOFError) {
4277 PyErr_SetNone(PyExc_EOFError);
4278 }
4279 return NULL;
4280 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004282 PDATA_POP(self->stack, val);
4283 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004284}
Tim Peters84e87f32001-03-17 04:50:51 +00004285
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004286
Guido van Rossum60456fd1997-04-09 17:36:32 +00004287static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004288Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004289{
Tim Peterscba30e22003-02-01 06:24:36 +00004290 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004291 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004293 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004294}
4295
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004296static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004297Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004298{
Tim Peterscba30e22003-02-01 06:24:36 +00004299 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004300 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004302 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004303}
4304
Guido van Rossum60456fd1997-04-09 17:36:32 +00004305
4306static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004307 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004308 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004309 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004310 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004311 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004312 "noload() -- not load a pickle, but go through most of the motions\n"
4313 "\n"
4314 "This function can be used to read past a pickle without instantiating\n"
4315 "any objects or importing any modules. It can also be used to find all\n"
4316 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004317 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004318 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004319 {NULL, NULL} /* sentinel */
4320};
4321
4322
4323static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004324newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004325{
4326 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004327
Tim Peterscba30e22003-02-01 06:24:36 +00004328 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004329 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004331 self->file = NULL;
4332 self->arg = NULL;
4333 self->stack = (Pdata*)Pdata_New();
4334 self->pers_func = NULL;
4335 self->last_string = NULL;
4336 self->marks = NULL;
4337 self->num_marks = 0;
4338 self->marks_size = 0;
4339 self->buf_size = 0;
4340 self->read = NULL;
4341 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004342 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004343
Tim Peterscba30e22003-02-01 06:24:36 +00004344 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004345 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004347 Py_INCREF(f);
4348 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004350 /* Set read, readline based on type of f */
4351 if (PyFile_Check(f)) {
4352 self->fp = PyFile_AsFile(f);
4353 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004354 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004355 "I/O operation on closed file");
4356 goto err;
4357 }
4358 self->read_func = read_file;
4359 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004360 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004361 else if (PycStringIO_InputCheck(f)) {
4362 self->fp = NULL;
4363 self->read_func = read_cStringIO;
4364 self->readline_func = readline_cStringIO;
4365 }
4366 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004368 self->fp = NULL;
4369 self->read_func = read_other;
4370 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004372 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4373 (self->read = PyObject_GetAttr(f, read_str)))) {
4374 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004375 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004376 "argument must have 'read' and "
4377 "'readline' attributes" );
4378 goto err;
4379 }
4380 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004382 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004384 err:
4385 Py_DECREF((PyObject *)self);
4386 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004387}
4388
4389
4390static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004391get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004392{
4393 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004394
Tim Peterscba30e22003-02-01 06:24:36 +00004395 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004396 return NULL;
4397 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004398}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004399
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004400
Guido van Rossum60456fd1997-04-09 17:36:32 +00004401static void
Tim Peterscba30e22003-02-01 06:24:36 +00004402Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004403{
4404 Py_XDECREF(self->readline);
4405 Py_XDECREF(self->read);
4406 Py_XDECREF(self->file);
4407 Py_XDECREF(self->memo);
4408 Py_XDECREF(self->stack);
4409 Py_XDECREF(self->pers_func);
4410 Py_XDECREF(self->arg);
4411 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004413 if (self->marks) {
4414 free(self->marks);
4415 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004417 if (self->buf_size) {
4418 free(self->buf);
4419 }
Tim Peters84e87f32001-03-17 04:50:51 +00004420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004421 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004422}
4423
4424
4425static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004426Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004427{
4428 if (!strcmp(name, "persistent_load")) {
4429 if (!self->pers_func) {
4430 PyErr_SetString(PyExc_AttributeError, name);
4431 return NULL;
4432 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004434 Py_INCREF(self->pers_func);
4435 return self->pers_func;
4436 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004438 if (!strcmp(name, "find_global")) {
4439 if (!self->find_class) {
4440 PyErr_SetString(PyExc_AttributeError, name);
4441 return NULL;
4442 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004444 Py_INCREF(self->find_class);
4445 return self->find_class;
4446 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004448 if (!strcmp(name, "memo")) {
4449 if (!self->memo) {
4450 PyErr_SetString(PyExc_AttributeError, name);
4451 return NULL;
4452 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004454 Py_INCREF(self->memo);
4455 return self->memo;
4456 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004458 if (!strcmp(name, "UnpicklingError")) {
4459 Py_INCREF(UnpicklingError);
4460 return UnpicklingError;
4461 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004462
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004463 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004464}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004465
Guido van Rossum60456fd1997-04-09 17:36:32 +00004466
4467static int
Tim Peterscba30e22003-02-01 06:24:36 +00004468Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004469{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004471 if (!strcmp(name, "persistent_load")) {
4472 Py_XDECREF(self->pers_func);
4473 self->pers_func = value;
4474 Py_XINCREF(value);
4475 return 0;
4476 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004478 if (!strcmp(name, "find_global")) {
4479 Py_XDECREF(self->find_class);
4480 self->find_class = value;
4481 Py_XINCREF(value);
4482 return 0;
4483 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004484
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004485 if (! value) {
4486 PyErr_SetString(PyExc_TypeError,
4487 "attribute deletion is not supported");
4488 return -1;
4489 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004491 if (strcmp(name, "memo") == 0) {
4492 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00004493 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004494 "memo must be a dictionary");
4495 return -1;
4496 }
4497 Py_XDECREF(self->memo);
4498 self->memo = value;
4499 Py_INCREF(value);
4500 return 0;
4501 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004503 PyErr_SetString(PyExc_AttributeError, name);
4504 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004505}
4506
Tim Peters5bd2a792003-02-01 16:45:06 +00004507/* ---------------------------------------------------------------------------
4508 * Module-level functions.
4509 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004510
Tim Peters5bd2a792003-02-01 16:45:06 +00004511/* dump(obj, file, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004512static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004513cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004514{
4515 PyObject *ob, *file, *res = NULL;
4516 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004517 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004518
Tim Peters5bd2a792003-02-01 16:45:06 +00004519 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004520 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004521
Tim Peters5bd2a792003-02-01 16:45:06 +00004522 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004523 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004525 if (dump(pickler, ob) < 0)
4526 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004528 Py_INCREF(Py_None);
4529 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004531 finally:
4532 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004534 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004535}
4536
4537
Tim Peters5bd2a792003-02-01 16:45:06 +00004538/* dumps(obj, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004539static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004540cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004541{
4542 PyObject *ob, *file = 0, *res = NULL;
4543 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004544 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004545
Tim Peters5bd2a792003-02-01 16:45:06 +00004546 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004547 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004548
Tim Peterscba30e22003-02-01 06:24:36 +00004549 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004550 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004551
Tim Peters5bd2a792003-02-01 16:45:06 +00004552 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004553 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004555 if (dump(pickler, ob) < 0)
4556 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004558 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004560 finally:
4561 Py_XDECREF(pickler);
4562 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004564 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004565}
4566
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004567
Tim Peters5bd2a792003-02-01 16:45:06 +00004568/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004569static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004570cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004571{
4572 Unpicklerobject *unpickler = 0;
4573 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004574
Tim Peterscba30e22003-02-01 06:24:36 +00004575 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004576 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004577
Tim Peterscba30e22003-02-01 06:24:36 +00004578 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004579 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004581 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004583 finally:
4584 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004586 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004587}
4588
4589
Tim Peters5bd2a792003-02-01 16:45:06 +00004590/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004591static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004592cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004593{
4594 PyObject *ob, *file = 0, *res = NULL;
4595 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004596
Tim Peterscba30e22003-02-01 06:24:36 +00004597 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004598 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004599
Tim Peterscba30e22003-02-01 06:24:36 +00004600 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004601 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004602
Tim Peterscba30e22003-02-01 06:24:36 +00004603 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004604 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004606 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004608 finally:
4609 Py_XDECREF(file);
4610 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004612 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004613}
4614
4615
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004616PyDoc_STRVAR(Unpicklertype__doc__,
4617"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004618
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004619static PyTypeObject Unpicklertype = {
4620 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004621 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004622 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004623 sizeof(Unpicklerobject), /*tp_basicsize*/
4624 0, /*tp_itemsize*/
4625 /* methods */
4626 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4627 (printfunc)0, /*tp_print*/
4628 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4629 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4630 (cmpfunc)0, /*tp_compare*/
4631 (reprfunc)0, /*tp_repr*/
4632 0, /*tp_as_number*/
4633 0, /*tp_as_sequence*/
4634 0, /*tp_as_mapping*/
4635 (hashfunc)0, /*tp_hash*/
4636 (ternaryfunc)0, /*tp_call*/
4637 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004638
Guido van Rossum60456fd1997-04-09 17:36:32 +00004639 /* Space for future expansion */
4640 0L,0L,0L,0L,
4641 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004642};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004643
Guido van Rossum60456fd1997-04-09 17:36:32 +00004644static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004645 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004646 PyDoc_STR("dump(object, file, proto=0) -- "
4647 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004648 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004649 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004650 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004651
Neal Norwitzb0493252002-03-31 14:44:22 +00004652 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004653 PyDoc_STR("dumps(object, proto=0) -- "
4654 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004655 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004656 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004657 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004658
Neal Norwitzb0493252002-03-31 14:44:22 +00004659 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004660 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00004661
Neal Norwitzb0493252002-03-31 14:44:22 +00004662 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004663 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00004664
Neal Norwitzb0493252002-03-31 14:44:22 +00004665 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004666 PyDoc_STR("Pickler(file, proto=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004667 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004668 "This takes a file-like object for writing a pickle data stream.\n"
4669 "The optional proto argument tells the pickler to use the given\n"
4670 "protocol; supported protocols are 0, 1, 2. The default\n"
4671 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
4672 "only protocol that can be written to a file opened in text\n"
4673 "mode and read back successfully. When using a protocol higher\n"
4674 "than 0, make sure the file is opened in binary mode, both when\n"
4675 "pickling and unpickling.)\n"
4676 "\n"
4677 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
4678 "more efficient than protocol 1.\n"
4679 "\n"
4680 "Specifying a negative protocol version selects the highest\n"
4681 "protocol version supported. The higher the protocol used, the\n"
4682 "more recent the version of Python needed to read the pickle\n"
4683 "produced.\n"
4684 "\n"
4685 "The file parameter must have a write() method that accepts a single\n"
4686 "string argument. It can thus be an open file object, a StringIO\n"
4687 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004688 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004689
Neal Norwitzb0493252002-03-31 14:44:22 +00004690 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004691 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
4692
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004693 { NULL, NULL }
4694};
4695
Guido van Rossum60456fd1997-04-09 17:36:32 +00004696static int
Tim Peterscba30e22003-02-01 06:24:36 +00004697init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004698{
4699 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004700
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004701#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004703 INIT_STR(__class__);
4704 INIT_STR(__getinitargs__);
4705 INIT_STR(__dict__);
4706 INIT_STR(__getstate__);
4707 INIT_STR(__setstate__);
4708 INIT_STR(__name__);
4709 INIT_STR(__main__);
4710 INIT_STR(__reduce__);
4711 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004712 INIT_STR(append);
4713 INIT_STR(read);
4714 INIT_STR(readline);
4715 INIT_STR(copy_reg);
4716 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004717 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004718
Tim Peterscba30e22003-02-01 06:24:36 +00004719 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004720 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004721
Tim Peters1f1b2d22003-02-01 02:16:37 +00004722 /* This is special because we want to use a different
4723 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004724 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peterscba30e22003-02-01 06:24:36 +00004725 if (!dispatch_table)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004726 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004728 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004729
Tim Peterscba30e22003-02-01 06:24:36 +00004730 if (!( empty_tuple = PyTuple_New(0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004731 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004733 /* Ugh */
4734 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4735 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4736 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004738 if (!( t=PyDict_New())) return -1;
4739 if (!( r=PyRun_String(
4740 "def __init__(self, *args): self.args=args\n\n"
4741 "def __str__(self):\n"
4742 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4743 Py_file_input,
4744 module_dict, t) )) return -1;
4745 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004747 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00004748 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004749 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004751 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004752
Tim Peterscba30e22003-02-01 06:24:36 +00004753 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004754 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00004755 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004756 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004758 if (!( t=PyDict_New())) return -1;
4759 if (!( r=PyRun_String(
4760 "def __init__(self, *args): self.args=args\n\n"
4761 "def __str__(self):\n"
4762 " a=self.args\n"
4763 " a=a and type(a[0]) or '(what)'\n"
4764 " return 'Cannot pickle %s objects' % a\n"
4765 , Py_file_input,
4766 module_dict, t) )) return -1;
4767 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004769 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00004770 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004771 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004773 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004775 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00004776 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004777 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004778
Martin v. Löwis658009a2002-09-16 17:26:24 +00004779 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
4780 UnpicklingError, NULL)))
4781 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00004782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004783 if (PyDict_SetItemString(module_dict, "PickleError",
4784 PickleError) < 0)
4785 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004787 if (PyDict_SetItemString(module_dict, "PicklingError",
4788 PicklingError) < 0)
4789 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004791 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4792 UnpicklingError) < 0)
4793 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004795 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4796 UnpickleableError) < 0)
4797 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004799 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4800 BadPickleGet) < 0)
4801 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004803 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004805 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004806}
4807
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004808#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
4809#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004810#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004811PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00004812initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004813{
4814 PyObject *m, *d, *di, *v, *k;
4815 int i;
4816 char *rev="1.71";
4817 PyObject *format_version;
4818 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004820 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004821 Unpicklertype.ob_type = &PyType_Type;
4822 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004824 /* Initialize some pieces. We need to do this before module creation,
4825 so we're forced to use a temporary dictionary. :(
4826 */
4827 di=PyDict_New();
4828 if (!di) return;
4829 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004831 /* Create the module and add the functions */
4832 m = Py_InitModule4("cPickle", cPickle_methods,
4833 cPickle_module_documentation,
4834 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004836 /* Add some symbolic constants to the module */
4837 d = PyModule_GetDict(m);
4838 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4839 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004841 /* Copy data from di. Waaa. */
4842 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4843 if (PyObject_SetItem(d, k, v) < 0) {
4844 Py_DECREF(di);
4845 return;
4846 }
4847 }
4848 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004850 format_version = PyString_FromString("1.3");
4851 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004853 PyDict_SetItemString(d, "format_version", format_version);
4854 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4855 Py_XDECREF(format_version);
4856 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004857}