blob: 8daad586e8e380f85292ef70024ecce5ddb4ebd3 [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 Petersee1a53c2003-02-02 02:57:53 +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);
Tim Petersee1a53c2003-02-02 02:57:53 +0000475 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000476 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) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000483 self->buf = (char *)realloc(self->buf, n);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000484 if (!self->buf) {
485 PyErr_NoMemory();
486 return -1;
487 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000488 self->buf_size = n;
489 }
Tim Peters84e87f32001-03-17 04:50:51 +0000490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000491 Py_BEGIN_ALLOW_THREADS
492 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
493 Py_END_ALLOW_THREADS
494 if (nbytesread != (size_t)n) {
495 if (feof(self->fp)) {
496 PyErr_SetNone(PyExc_EOFError);
497 return -1;
498 }
Tim Peterscba30e22003-02-01 06:24:36 +0000499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000500 PyErr_SetFromErrno(PyExc_IOError);
501 return -1;
502 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000504 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000506 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000507}
508
509
Tim Peters84e87f32001-03-17 04:50:51 +0000510static int
Tim Peterscba30e22003-02-01 06:24:36 +0000511readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000512{
513 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000515 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000516 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000517 PyErr_NoMemory();
518 return -1;
519 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000520 self->buf_size = 40;
521 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000523 i = 0;
524 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000525 int bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000526 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000527 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000528 (self->buf[i] = getc(self->fp)) == '\n') {
529 self->buf[i + 1] = '\0';
530 *s = self->buf;
531 return i + 1;
532 }
533 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000534 bigger = self->buf_size << 1;
535 if (bigger <= 0) { /* overflow */
536 PyErr_NoMemory();
537 return -1;
538 }
539 self->buf = (char *)realloc(self->buf, bigger);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000540 if (!self->buf) {
541 PyErr_NoMemory();
542 return -1;
543 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000544 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000545 }
Tim Peters84e87f32001-03-17 04:50:51 +0000546}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000547
548
Tim Peters84e87f32001-03-17 04:50:51 +0000549static int
Tim Peterscba30e22003-02-01 06:24:36 +0000550read_cStringIO(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000551{
552 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000554 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
555 PyErr_SetNone(PyExc_EOFError);
556 return -1;
557 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000559 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000561 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000562}
563
564
Tim Peters84e87f32001-03-17 04:50:51 +0000565static int
Tim Peterscba30e22003-02-01 06:24:36 +0000566readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000567{
568 int n;
569 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000571 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
572 return -1;
573 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000575 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000577 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000578}
579
580
Tim Peters84e87f32001-03-17 04:50:51 +0000581static int
Tim Peterscba30e22003-02-01 06:24:36 +0000582read_other(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000583{
584 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000586 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000588 ARG_TUP(self, bytes);
589 if (self->arg) {
590 str = PyObject_Call(self->read, self->arg, NULL);
591 FREE_ARG_TUP(self);
592 }
593 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000595 Py_XDECREF(self->last_string);
596 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000598 if (! (*s = PyString_AsString(str))) return -1;
599 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000600}
601
602
Tim Peters84e87f32001-03-17 04:50:51 +0000603static int
Tim Peterscba30e22003-02-01 06:24:36 +0000604readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000605{
606 PyObject *str;
607 int str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000609 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
610 return -1;
611 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000613 if ((str_size = PyString_Size(str)) < 0)
614 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000616 Py_XDECREF(self->last_string);
617 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000619 if (! (*s = PyString_AsString(str)))
620 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000622 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000623}
624
Tim Petersee1a53c2003-02-02 02:57:53 +0000625/* Copy the first n bytes from s into newly malloc'ed memory, plus a
626 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
627 * The caller is responsible for free()'ing the return value.
628 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000629static char *
Tim Petersee1a53c2003-02-02 02:57:53 +0000630pystrndup(char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000631{
Tim Petersee1a53c2003-02-02 02:57:53 +0000632 char *r = (char *)malloc(n+1);
633 if (r == NULL)
634 return (char*)PyErr_NoMemory();
635 memcpy(r, s, n);
636 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000637 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000638}
639
640
641static int
Tim Peterscba30e22003-02-01 06:24:36 +0000642get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000643{
644 PyObject *value, *mv;
645 long c_value;
646 char s[30];
647 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000649 if (!( mv = PyDict_GetItem(self->memo, id))) {
650 PyErr_SetObject(PyExc_KeyError, id);
651 return -1;
652 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000653
Tim Peterscba30e22003-02-01 06:24:36 +0000654 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000655 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000657 if (!( PyInt_Check(value))) {
658 PyErr_SetString(PicklingError, "no int where int expected in memo");
659 return -1;
660 }
661 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000663 if (!self->bin) {
664 s[0] = GET;
665 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
666 len = strlen(s);
667 }
668 else if (Pdata_Check(self->file)) {
669 if (write_other(self, NULL, 0) < 0) return -1;
670 PDATA_APPEND(self->file, mv, -1);
671 return 0;
672 }
673 else {
674 if (c_value < 256) {
675 s[0] = BINGET;
676 s[1] = (int)(c_value & 0xff);
677 len = 2;
678 }
679 else {
680 s[0] = LONG_BINGET;
681 s[1] = (int)(c_value & 0xff);
682 s[2] = (int)((c_value >> 8) & 0xff);
683 s[3] = (int)((c_value >> 16) & 0xff);
684 s[4] = (int)((c_value >> 24) & 0xff);
685 len = 5;
686 }
687 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000689 if ((*self->write_func)(self, s, len) < 0)
690 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000691
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000692 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000693}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000694
Guido van Rossum60456fd1997-04-09 17:36:32 +0000695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000696static int
Tim Peterscba30e22003-02-01 06:24:36 +0000697put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000698{
Tim Peterscba30e22003-02-01 06:24:36 +0000699 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000700 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000702 return put2(self, ob);
703}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000704
Guido van Rossum053b8df1998-11-25 16:18:00 +0000705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000706static int
Tim Peterscba30e22003-02-01 06:24:36 +0000707put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000708{
709 char c_str[30];
710 int p;
711 size_t len;
712 int res = -1;
713 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000715 if (self->fast)
716 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000718 if ((p = PyDict_Size(self->memo)) < 0)
719 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000721 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000722 /* XXX Why?
723 * XXX And does "positive" really mean non-negative?
724 * XXX pickle.py starts with PUT index 0, not 1. This makes for
725 * XXX gratuitous differences between the pickling modules.
726 */
Tim Peterscba30e22003-02-01 06:24:36 +0000727 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000728
Tim Peterscba30e22003-02-01 06:24:36 +0000729 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000730 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000731
Tim Peterscba30e22003-02-01 06:24:36 +0000732 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000733 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000734
Tim Peterscba30e22003-02-01 06:24:36 +0000735 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000736 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000738 PyTuple_SET_ITEM(t, 0, memo_len);
739 Py_INCREF(memo_len);
740 PyTuple_SET_ITEM(t, 1, ob);
741 Py_INCREF(ob);
742
743 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
744 goto finally;
745
746 if (!self->bin) {
747 c_str[0] = PUT;
748 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
749 len = strlen(c_str);
750 }
751 else if (Pdata_Check(self->file)) {
752 if (write_other(self, NULL, 0) < 0) return -1;
753 PDATA_APPEND(self->file, memo_len, -1);
754 res=0; /* Job well done ;) */
755 goto finally;
756 }
757 else {
758 if (p >= 256) {
759 c_str[0] = LONG_BINPUT;
760 c_str[1] = (int)(p & 0xff);
761 c_str[2] = (int)((p >> 8) & 0xff);
762 c_str[3] = (int)((p >> 16) & 0xff);
763 c_str[4] = (int)((p >> 24) & 0xff);
764 len = 5;
765 }
766 else {
767 c_str[0] = BINPUT;
768 c_str[1] = p;
769 len = 2;
770 }
771 }
772
773 if ((*self->write_func)(self, c_str, len) < 0)
774 goto finally;
775
776 res = 0;
777
778 finally:
779 Py_XDECREF(py_ob_id);
780 Py_XDECREF(memo_len);
781 Py_XDECREF(t);
782
783 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000784}
785
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000786#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000787
788static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000789PyImport_Import(PyObject *module_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000790{
791 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
792 static PyObject *standard_builtins=0;
793 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000795 if (!( silly_list )) {
Tim Peterscba30e22003-02-01 06:24:36 +0000796 if (!( __import___str=PyString_FromString("__import__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000797 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000798 if (!( __builtins___str=PyString_FromString("__builtins__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000799 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000800 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000801 return NULL;
802 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000804 if ((globals=PyEval_GetGlobals())) {
805 Py_INCREF(globals);
806 __builtins__=PyObject_GetItem(globals,__builtins___str);
Tim Peterscba30e22003-02-01 06:24:36 +0000807 if (!__builtins__)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000808 goto err;
809 }
810 else {
811 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000813 if (!(standard_builtins ||
Tim Peterscba30e22003-02-01 06:24:36 +0000814 (standard_builtins=PyImport_ImportModule("__builtin__"))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000815 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000817 __builtins__=standard_builtins;
818 Py_INCREF(__builtins__);
819 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
Tim Peterscba30e22003-02-01 06:24:36 +0000820 if (!globals)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000821 goto err;
822 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000824 if (PyDict_Check(__builtins__)) {
825 __import__=PyObject_GetItem(__builtins__,__import___str);
826 if (!__import__) goto err;
827 }
828 else {
829 __import__=PyObject_GetAttr(__builtins__,__import___str);
830 if (!__import__) goto err;
831 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000833 r=PyObject_CallFunction(__import__,"OOOO",
834 module_name, globals, globals, silly_list);
Tim Peterscba30e22003-02-01 06:24:36 +0000835 if (!r)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000836 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000838 Py_DECREF(globals);
839 Py_DECREF(__builtins__);
840 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000842 return r;
843 err:
844 Py_XDECREF(globals);
845 Py_XDECREF(__builtins__);
846 Py_XDECREF(__import__);
847 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000848}
849
850static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000851whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000852{
853 int i, j;
854 PyObject *module = 0, *modules_dict = 0,
855 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000857 module = PyObject_GetAttrString(global, "__module__");
858 if (module) return module;
859 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000860
Tim Peterscba30e22003-02-01 06:24:36 +0000861 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000864 i = 0;
865 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000867 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000869 global_name_attr = PyObject_GetAttr(module, global_name);
870 if (!global_name_attr) {
871 PyErr_Clear();
872 continue;
873 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000875 if (global_name_attr != global) {
876 Py_DECREF(global_name_attr);
877 continue;
878 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000880 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000882 break;
883 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000885 /* The following implements the rule in pickle.py added in 1.5
886 that used __main__ if no module is found. I don't actually
887 like this rule. jlf
888 */
889 if (!j) {
890 j=1;
891 name=__main___str;
892 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000894 Py_INCREF(name);
895 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000896}
897
898
Guido van Rossum60456fd1997-04-09 17:36:32 +0000899static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000900fast_save_enter(Picklerobject *self, PyObject *obj)
901{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000902 /* if fast_container < 0, we're doing an error exit. */
903 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
904 PyObject *key = NULL;
905 if (self->fast_memo == NULL) {
906 self->fast_memo = PyDict_New();
907 if (self->fast_memo == NULL) {
908 self->fast_container = -1;
909 return 0;
910 }
911 }
912 key = PyLong_FromVoidPtr(obj);
913 if (key == NULL)
914 return 0;
915 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000916 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000917 PyErr_Format(PyExc_ValueError,
918 "fast mode: can't pickle cyclic objects including object type %s at %p",
919 obj->ob_type->tp_name, obj);
920 self->fast_container = -1;
921 return 0;
922 }
923 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000924 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000925 self->fast_container = -1;
926 return 0;
927 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000928 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000929 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000930 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000931}
932
Tim Peterscba30e22003-02-01 06:24:36 +0000933int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000934fast_save_leave(Picklerobject *self, PyObject *obj)
935{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000936 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
937 PyObject *key = PyLong_FromVoidPtr(obj);
938 if (key == NULL)
939 return 0;
940 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000941 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000942 return 0;
943 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000944 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000945 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000946 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000947}
948
949static int
Tim Peterscba30e22003-02-01 06:24:36 +0000950save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000951{
952 static char none = NONE;
953 if ((*self->write_func)(self, &none, 1) < 0)
954 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000956 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000957}
958
Guido van Rossum77f6a652002-04-03 22:41:51 +0000959static int
Tim Peterscba30e22003-02-01 06:24:36 +0000960save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000961{
Guido van Rossume2763392002-04-05 19:30:08 +0000962 static char *buf[2] = {FALSE, TRUE};
963 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000964 long l = PyInt_AS_LONG((PyIntObject *)args);
965
Tim Peters3c67d792003-02-02 17:59:11 +0000966 if (self->proto >= 2) {
967 char opcode = l ? NEWTRUE : NEWFALSE;
968 if (self->write_func(self, &opcode, 1) < 0)
969 return -1;
970 }
971 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000972 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000973 return 0;
974}
Tim Peters84e87f32001-03-17 04:50:51 +0000975
Guido van Rossum60456fd1997-04-09 17:36:32 +0000976static int
Tim Peterscba30e22003-02-01 06:24:36 +0000977save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000978{
979 char c_str[32];
980 long l = PyInt_AS_LONG((PyIntObject *)args);
981 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000983 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000984#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000985 || l > 0x7fffffffL
986 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000987#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000988 ) {
989 /* Text-mode pickle, or long too big to fit in the 4-byte
990 * signed BININT format: store as a string.
991 */
992 c_str[0] = INT;
993 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
994 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
995 return -1;
996 }
997 else {
998 /* Binary pickle and l fits in a signed 4-byte int. */
999 c_str[1] = (int)( l & 0xff);
1000 c_str[2] = (int)((l >> 8) & 0xff);
1001 c_str[3] = (int)((l >> 16) & 0xff);
1002 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001004 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1005 if (c_str[2] == 0) {
1006 c_str[0] = BININT1;
1007 len = 2;
1008 }
1009 else {
1010 c_str[0] = BININT2;
1011 len = 3;
1012 }
1013 }
1014 else {
1015 c_str[0] = BININT;
1016 len = 5;
1017 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001019 if ((*self->write_func)(self, c_str, len) < 0)
1020 return -1;
1021 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001023 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001024}
1025
1026
1027static int
Tim Peterscba30e22003-02-01 06:24:36 +00001028save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001029{
Tim Petersee1a53c2003-02-02 02:57:53 +00001030 int size;
1031 int res = -1;
1032 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001034 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001035
Tim Petersee1a53c2003-02-02 02:57:53 +00001036 if (self->proto >= 2) {
1037 /* Linear-time pickling. */
1038 size_t nbits;
1039 size_t nbytes;
1040 unsigned char *pdata;
1041 char c_str[5];
1042 int i;
1043 int sign = _PyLong_Sign(args);
1044
1045 if (sign == 0) {
1046 /* It's 0 -- an empty bytestring. */
1047 c_str[0] = LONG1;
1048 c_str[1] = 0;
1049 i = self->write_func(self, c_str, 2);
1050 if (i < 0) goto finally;
1051 res = 0;
1052 goto finally;
1053 }
1054 nbits = _PyLong_NumBits(args);
1055 if (nbits == (size_t)-1 && PyErr_Occurred())
1056 goto finally;
1057 /* How many bytes do we need? There are nbits >> 3 full
1058 * bytes of data, and nbits & 7 leftover bits. If there
1059 * are any leftover bits, then we clearly need another
1060 * byte. Wnat's not so obvious is that we *probably*
1061 * need another byte even if there aren't any leftovers:
1062 * the most-significant bit of the most-significant byte
1063 * acts like a sign bit, and it's usually got a sense
1064 * opposite of the one we need. The exception is longs
1065 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1066 * its own 256's-complement, so has the right sign bit
1067 * even without the extra byte. That's a pain to check
1068 * for in advance, though, so we always grab an extra
1069 * byte at the start, and cut it back later if possible.
1070 */
1071 nbytes = (nbits >> 3) + 1;
1072 if ((int)nbytes < 0 || (size_t)(int)nbytes != nbytes) {
1073 PyErr_SetString(PyExc_OverflowError, "long too large "
1074 "to pickle");
1075 goto finally;
1076 }
1077 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1078 if (repr == NULL) goto finally;
1079 pdata = (unsigned char *)PyString_AS_STRING(repr);
1080 i = _PyLong_AsByteArray((PyLongObject *)args,
1081 pdata, nbytes,
1082 1 /* little endian */, 1 /* signed */);
1083 if (i < 0) goto finally;
1084 /* If the long is negative, this may be a byte more than
1085 * needed. This is so iff the MSB is all redundant sign
1086 * bits.
1087 */
1088 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1089 (pdata[nbytes - 2] & 0x80) != 0)
1090 --nbytes;
1091
1092 if (nbytes < 256) {
1093 c_str[0] = LONG1;
1094 c_str[1] = (char)nbytes;
1095 size = 2;
1096 }
1097 else {
1098 c_str[0] = LONG4;
1099 size = (int)nbytes;
1100 for (i = 1; i < 5; i++) {
1101 c_str[i] = (char)(size & 0xff);
1102 size >>= 8;
1103 }
1104 size = 5;
1105 }
1106 i = self->write_func(self, c_str, size);
1107 if (i < 0) goto finally;
1108 i = self->write_func(self, (char *)pdata, (int)nbytes);
1109 if (i < 0) goto finally;
1110 res = 0;
1111 goto finally;
1112 }
1113
1114 /* proto < 2: write the repr and newline. This is quadratic-time
1115 * (in the number of digits), in both directions.
1116 */
Tim Peterscba30e22003-02-01 06:24:36 +00001117 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001118 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001120 if ((size = PyString_Size(repr)) < 0)
1121 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001123 if ((*self->write_func)(self, &l, 1) < 0)
1124 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001126 if ((*self->write_func)(self,
Tim Peterscba30e22003-02-01 06:24:36 +00001127 PyString_AS_STRING((PyStringObject *)repr),
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001128 size) < 0)
1129 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001131 if ((*self->write_func)(self, "\n", 1) < 0)
1132 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001134 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001136 finally:
1137 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001138 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001139}
1140
1141
1142static int
Tim Peterscba30e22003-02-01 06:24:36 +00001143save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001144{
1145 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001147 if (self->bin) {
1148 int s, e;
1149 double f;
1150 long fhi, flo;
1151 char str[9];
1152 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001154 *p = BINFLOAT;
1155 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001157 if (x < 0) {
1158 s = 1;
1159 x = -x;
1160 }
1161 else
1162 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001164 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001166 /* Normalize f to be in the range [1.0, 2.0) */
1167 if (0.5 <= f && f < 1.0) {
1168 f *= 2.0;
1169 e--;
1170 }
1171 else if (f == 0.0) {
1172 e = 0;
1173 }
1174 else {
1175 PyErr_SetString(PyExc_SystemError,
1176 "frexp() result out of range");
1177 return -1;
1178 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001180 if (e >= 1024) {
1181 /* XXX 1024 itself is reserved for Inf/NaN */
1182 PyErr_SetString(PyExc_OverflowError,
1183 "float too large to pack with d format");
1184 return -1;
1185 }
1186 else if (e < -1022) {
1187 /* Gradual underflow */
1188 f = ldexp(f, 1022 + e);
1189 e = 0;
1190 }
1191 else if (!(e == 0 && f == 0.0)) {
1192 e += 1023;
1193 f -= 1.0; /* Get rid of leading 1 */
1194 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001195
Tim Peterscba30e22003-02-01 06:24:36 +00001196 /* fhi receives the high 28 bits;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 flo the low 24 bits (== 52 bits) */
1198 f *= 268435456.0; /* 2**28 */
1199 fhi = (long) floor(f); /* Truncate */
1200 f -= (double)fhi;
1201 f *= 16777216.0; /* 2**24 */
1202 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001204 /* First byte */
1205 *p = (s<<7) | (e>>4);
1206 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001208 /* Second byte */
1209 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1210 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001212 /* Third byte */
1213 *p = (unsigned char) ((fhi>>16) & 0xFF);
1214 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001216 /* Fourth byte */
1217 *p = (unsigned char) ((fhi>>8) & 0xFF);
1218 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001220 /* Fifth byte */
1221 *p = (unsigned char) (fhi & 0xFF);
1222 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001224 /* Sixth byte */
1225 *p = (unsigned char) ((flo>>16) & 0xFF);
1226 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001228 /* Seventh byte */
1229 *p = (unsigned char) ((flo>>8) & 0xFF);
1230 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001232 /* Eighth byte */
1233 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001235 if ((*self->write_func)(self, str, 9) < 0)
1236 return -1;
1237 }
1238 else {
1239 char c_str[250];
1240 c_str[0] = FLOAT;
1241 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001243 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1244 return -1;
1245 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001247 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001248}
1249
1250
1251static int
Tim Peterscba30e22003-02-01 06:24:36 +00001252save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001253{
1254 int size, len;
1255 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001257 if ((size = PyString_Size(args)) < 0)
1258 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001260 if (!self->bin) {
1261 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001263 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001264
Tim Peterscba30e22003-02-01 06:24:36 +00001265 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001266 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001268 if ((len = PyString_Size(repr)) < 0)
1269 goto err;
1270 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001272 if ((*self->write_func)(self, &string, 1) < 0)
1273 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001275 if ((*self->write_func)(self, repr_str, len) < 0)
1276 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001278 if ((*self->write_func)(self, "\n", 1) < 0)
1279 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001281 Py_XDECREF(repr);
1282 }
1283 else {
1284 int i;
1285 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001287 if ((size = PyString_Size(args)) < 0)
1288 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001290 if (size < 256) {
1291 c_str[0] = SHORT_BINSTRING;
1292 c_str[1] = size;
1293 len = 2;
1294 }
1295 else {
1296 c_str[0] = BINSTRING;
1297 for (i = 1; i < 5; i++)
1298 c_str[i] = (int)(size >> ((i - 1) * 8));
1299 len = 5;
1300 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302 if ((*self->write_func)(self, c_str, len) < 0)
1303 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001305 if (size > 128 && Pdata_Check(self->file)) {
1306 if (write_other(self, NULL, 0) < 0) return -1;
1307 PDATA_APPEND(self->file, args, -1);
1308 }
1309 else {
1310 if ((*self->write_func)(self,
1311 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1312 return -1;
1313 }
1314 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001316 if (doput)
1317 if (put(self, args) < 0)
1318 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001319
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001320 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001322 err:
1323 Py_XDECREF(repr);
1324 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001325}
1326
1327
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001328#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001329/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1330 backslash and newline characters to \uXXXX escapes. */
1331static PyObject *
1332modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1333{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001334 PyObject *repr;
1335 char *p;
1336 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001338 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001340 repr = PyString_FromStringAndSize(NULL, 6 * size);
1341 if (repr == NULL)
1342 return NULL;
1343 if (size == 0)
1344 return repr;
1345
1346 p = q = PyString_AS_STRING(repr);
1347 while (size-- > 0) {
1348 Py_UNICODE ch = *s++;
1349 /* Map 16-bit characters to '\uxxxx' */
1350 if (ch >= 256 || ch == '\\' || ch == '\n') {
1351 *p++ = '\\';
1352 *p++ = 'u';
1353 *p++ = hexdigit[(ch >> 12) & 0xf];
1354 *p++ = hexdigit[(ch >> 8) & 0xf];
1355 *p++ = hexdigit[(ch >> 4) & 0xf];
1356 *p++ = hexdigit[ch & 15];
1357 }
1358 /* Copy everything else as-is */
1359 else
1360 *p++ = (char) ch;
1361 }
1362 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001363 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001364 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001365}
1366
1367
Guido van Rossum60456fd1997-04-09 17:36:32 +00001368static int
Tim Peterscba30e22003-02-01 06:24:36 +00001369save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001370{
1371 int size, len;
1372 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001374 if (!PyUnicode_Check(args))
1375 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001377 if (!self->bin) {
1378 char *repr_str;
1379 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001381 repr = modified_EncodeRawUnicodeEscape(
1382 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001383 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001384 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001386 if ((len = PyString_Size(repr)) < 0)
1387 goto err;
1388 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001389
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001390 if ((*self->write_func)(self, &string, 1) < 0)
1391 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001393 if ((*self->write_func)(self, repr_str, len) < 0)
1394 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001396 if ((*self->write_func)(self, "\n", 1) < 0)
1397 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001399 Py_XDECREF(repr);
1400 }
1401 else {
1402 int i;
1403 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001404
Tim Peterscba30e22003-02-01 06:24:36 +00001405 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001406 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001408 if ((size = PyString_Size(repr)) < 0)
1409 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001411 c_str[0] = BINUNICODE;
1412 for (i = 1; i < 5; i++)
1413 c_str[i] = (int)(size >> ((i - 1) * 8));
1414 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001416 if ((*self->write_func)(self, c_str, len) < 0)
1417 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001419 if (size > 128 && Pdata_Check(self->file)) {
1420 if (write_other(self, NULL, 0) < 0)
1421 goto err;
1422 PDATA_APPEND(self->file, repr, -1);
1423 }
1424 else {
1425 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1426 size) < 0)
1427 goto err;
1428 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001429
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001430 Py_DECREF(repr);
1431 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001433 if (doput)
1434 if (put(self, args) < 0)
1435 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001437 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001439 err:
1440 Py_XDECREF(repr);
1441 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001442}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001443#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001444
1445
1446static int
Tim Peterscba30e22003-02-01 06:24:36 +00001447save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001448{
1449 PyObject *element = 0, *py_tuple_id = 0;
1450 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001452 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001454 if ((*self->write_func)(self, &MARKv, 1) < 0)
1455 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001456
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001457 if ((len = PyTuple_Size(args)) < 0)
1458 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001460 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001461 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001462 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001464 if (save(self, element, 0) < 0)
1465 goto finally;
1466 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001467
Tim Peterscba30e22003-02-01 06:24:36 +00001468 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001469 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001471 if (len) {
1472 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1473 if (self->bin) {
1474 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001476 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1477 goto finally;
1478 }
1479 else {
1480 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001482 for (i = 0; i <= len; i++) {
1483 if ((*self->write_func)(self, &pop, 1) < 0)
1484 goto finally;
1485 }
1486 }
Tim Peters84e87f32001-03-17 04:50:51 +00001487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001488 if (get(self, py_tuple_id) < 0)
1489 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001491 res = 0;
1492 goto finally;
1493 }
1494 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001496 if ((*self->write_func)(self, &tuple, 1) < 0) {
1497 goto finally;
1498 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001500 if (put(self, args) < 0)
1501 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001503 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001505 finally:
1506 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001508 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001509}
1510
1511static int
Tim Peterscba30e22003-02-01 06:24:36 +00001512save_empty_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001513{
1514 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001516 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001517}
1518
1519
1520static int
Tim Peterscba30e22003-02-01 06:24:36 +00001521save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001522{
1523 PyObject *element = 0;
1524 int s_len, len, i, using_appends, res = -1;
1525 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001527 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001529 if (self->fast && !fast_save_enter(self, args))
1530 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001532 if (self->bin) {
1533 s[0] = EMPTY_LIST;
1534 s_len = 1;
1535 }
1536 else {
1537 s[0] = MARK;
1538 s[1] = LIST;
1539 s_len = 2;
1540 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001542 if ((len = PyList_Size(args)) < 0)
1543 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001545 if ((*self->write_func)(self, s, s_len) < 0)
1546 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001548 if (len == 0) {
1549 if (put(self, args) < 0)
1550 goto finally;
1551 }
1552 else {
1553 if (put2(self, args) < 0)
1554 goto finally;
1555 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001557 if ((using_appends = (self->bin && (len > 1))))
1558 if ((*self->write_func)(self, &MARKv, 1) < 0)
1559 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001561 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001562 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001563 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001565 if (save(self, element, 0) < 0)
1566 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001568 if (!using_appends) {
1569 if ((*self->write_func)(self, &append, 1) < 0)
1570 goto finally;
1571 }
1572 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001573
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001574 if (using_appends) {
1575 if ((*self->write_func)(self, &appends, 1) < 0)
1576 goto finally;
1577 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001579 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001581 finally:
1582 if (self->fast && !fast_save_leave(self, args))
1583 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001585 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001586}
1587
1588
Guido van Rossum60456fd1997-04-09 17:36:32 +00001589static int
Tim Peterscba30e22003-02-01 06:24:36 +00001590save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001591{
1592 PyObject *key = 0, *value = 0;
1593 int i, len, res = -1, using_setitems;
1594 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001596 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001598 if (self->fast && !fast_save_enter(self, args))
1599 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001601 if (self->bin) {
1602 s[0] = EMPTY_DICT;
1603 len = 1;
1604 }
1605 else {
1606 s[0] = MARK;
1607 s[1] = DICT;
1608 len = 2;
1609 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001611 if ((*self->write_func)(self, s, len) < 0)
1612 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001614 if ((len = PyDict_Size(args)) < 0)
1615 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001617 if (len == 0) {
1618 if (put(self, args) < 0)
1619 goto finally;
1620 }
1621 else {
1622 if (put2(self, args) < 0)
1623 goto finally;
1624 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001626 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1627 if ((*self->write_func)(self, &MARKv, 1) < 0)
1628 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001630 i = 0;
1631 while (PyDict_Next(args, &i, &key, &value)) {
1632 if (save(self, key, 0) < 0)
1633 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001635 if (save(self, value, 0) < 0)
1636 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001637
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001638 if (!using_setitems) {
1639 if ((*self->write_func)(self, &setitem, 1) < 0)
1640 goto finally;
1641 }
1642 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001644 if (using_setitems) {
1645 if ((*self->write_func)(self, &setitems, 1) < 0)
1646 goto finally;
1647 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001649 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001651 finally:
1652 if (self->fast && !fast_save_leave(self, args))
1653 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001655 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001656}
1657
1658
Tim Peters84e87f32001-03-17 04:50:51 +00001659static int
Tim Peterscba30e22003-02-01 06:24:36 +00001660save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001661{
1662 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1663 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1664 char *module_str, *name_str;
1665 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001667 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001669 if (self->fast && !fast_save_enter(self, args))
1670 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001672 if ((*self->write_func)(self, &MARKv, 1) < 0)
1673 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001674
Tim Peterscba30e22003-02-01 06:24:36 +00001675 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001676 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001678 if (self->bin) {
1679 if (save(self, class, 0) < 0)
1680 goto finally;
1681 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001683 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1684 PyObject *element = 0;
1685 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001687 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001688 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001689 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001691 if ((len = PyObject_Size(class_args)) < 0)
1692 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001694 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001695 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001696 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001698 if (save(self, element, 0) < 0) {
1699 Py_DECREF(element);
1700 goto finally;
1701 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001703 Py_DECREF(element);
1704 }
1705 }
1706 else {
1707 PyErr_Clear();
1708 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001710 if (!self->bin) {
1711 if (!( name = ((PyClassObject *)class)->cl_name )) {
1712 PyErr_SetString(PicklingError, "class has no name");
1713 goto finally;
1714 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001715
Tim Peterscba30e22003-02-01 06:24:36 +00001716 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001717 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001718
Tim Peters84e87f32001-03-17 04:50:51 +00001719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001720 if ((module_size = PyString_Size(module)) < 0 ||
1721 (name_size = PyString_Size(name)) < 0)
1722 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001724 module_str = PyString_AS_STRING((PyStringObject *)module);
1725 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001727 if ((*self->write_func)(self, &inst, 1) < 0)
1728 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001730 if ((*self->write_func)(self, module_str, module_size) < 0)
1731 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001733 if ((*self->write_func)(self, "\n", 1) < 0)
1734 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001736 if ((*self->write_func)(self, name_str, name_size) < 0)
1737 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001739 if ((*self->write_func)(self, "\n", 1) < 0)
1740 goto finally;
1741 }
1742 else if ((*self->write_func)(self, &obj, 1) < 0) {
1743 goto finally;
1744 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001746 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1747 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001748 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001749 goto finally;
1750 }
1751 else {
1752 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001754 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1755 PyErr_Clear();
1756 res = 0;
1757 goto finally;
1758 }
1759 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001761 if (!PyDict_Check(state)) {
1762 if (put2(self, args) < 0)
1763 goto finally;
1764 }
1765 else {
1766 if (put(self, args) < 0)
1767 goto finally;
1768 }
Tim Peters84e87f32001-03-17 04:50:51 +00001769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001770 if (save(self, state, 0) < 0)
1771 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001773 if ((*self->write_func)(self, &build, 1) < 0)
1774 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001776 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001778 finally:
1779 if (self->fast && !fast_save_leave(self, args))
1780 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001782 Py_XDECREF(module);
1783 Py_XDECREF(class);
1784 Py_XDECREF(state);
1785 Py_XDECREF(getinitargs_func);
1786 Py_XDECREF(getstate_func);
1787 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001789 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001790}
1791
1792
Guido van Rossum60456fd1997-04-09 17:36:32 +00001793static int
Tim Peterscba30e22003-02-01 06:24:36 +00001794save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001795{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001796 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001797 char *name_str, *module_str;
1798 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001800 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001802 if (name) {
1803 global_name = name;
1804 Py_INCREF(global_name);
1805 }
1806 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001807 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001808 goto finally;
1809 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001810
Tim Peterscba30e22003-02-01 06:24:36 +00001811 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001812 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001814 if ((module_size = PyString_Size(module)) < 0 ||
1815 (name_size = PyString_Size(global_name)) < 0)
1816 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001818 module_str = PyString_AS_STRING((PyStringObject *)module);
1819 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001820
Guido van Rossum75bfd052002-12-24 18:10:07 +00001821 /* XXX This can be doing a relative import. Clearly it shouldn't,
1822 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001823 mod = PyImport_ImportModule(module_str);
1824 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001825 cPickle_ErrFormat(PicklingError,
1826 "Can't pickle %s: it's not found as %s.%s",
1827 "OSS", args, module, global_name);
1828 goto finally;
1829 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001830 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001831 if (klass == NULL) {
1832 cPickle_ErrFormat(PicklingError,
1833 "Can't pickle %s: it's not found as %s.%s",
1834 "OSS", args, module, global_name);
1835 goto finally;
1836 }
1837 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001838 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001839 cPickle_ErrFormat(PicklingError,
1840 "Can't pickle %s: it's not the same object as %s.%s",
1841 "OSS", args, module, global_name);
1842 goto finally;
1843 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001844 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001846 if ((*self->write_func)(self, &global, 1) < 0)
1847 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001849 if ((*self->write_func)(self, module_str, module_size) < 0)
1850 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001852 if ((*self->write_func)(self, "\n", 1) < 0)
1853 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001855 if ((*self->write_func)(self, name_str, name_size) < 0)
1856 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001858 if ((*self->write_func)(self, "\n", 1) < 0)
1859 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001861 if (put(self, args) < 0)
1862 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001864 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001866 finally:
1867 Py_XDECREF(module);
1868 Py_XDECREF(global_name);
1869 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001871 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001872}
1873
Guido van Rossum60456fd1997-04-09 17:36:32 +00001874static int
Tim Peterscba30e22003-02-01 06:24:36 +00001875save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001876{
1877 PyObject *pid = 0;
1878 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001880 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001882 Py_INCREF(args);
1883 ARG_TUP(self, args);
1884 if (self->arg) {
1885 pid = PyObject_Call(f, self->arg, NULL);
1886 FREE_ARG_TUP(self);
1887 }
1888 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001890 if (pid != Py_None) {
1891 if (!self->bin) {
1892 if (!PyString_Check(pid)) {
1893 PyErr_SetString(PicklingError,
1894 "persistent id must be string");
1895 goto finally;
1896 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001898 if ((*self->write_func)(self, &persid, 1) < 0)
1899 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001901 if ((size = PyString_Size(pid)) < 0)
1902 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001904 if ((*self->write_func)(self,
1905 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1906 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001907
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001908 if ((*self->write_func)(self, "\n", 1) < 0)
1909 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001911 res = 1;
1912 goto finally;
1913 }
1914 else if (save(self, pid, 1) >= 0) {
1915 if ((*self->write_func)(self, &binpersid, 1) < 0)
1916 res = -1;
1917 else
1918 res = 1;
1919 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001921 goto finally;
1922 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001924 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001926 finally:
1927 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001929 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001930}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001931
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001932
Tim Peters84e87f32001-03-17 04:50:51 +00001933static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001934save_reduce(Picklerobject *self, PyObject *callable,
Tim Peterscba30e22003-02-01 06:24:36 +00001935 PyObject *tup, PyObject *state, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001936{
1937 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001939 if (save(self, callable, 0) < 0)
1940 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001942 if (save(self, tup, 0) < 0)
1943 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001945 if ((*self->write_func)(self, &reduce, 1) < 0)
1946 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001948 if (ob != NULL) {
1949 if (state && !PyDict_Check(state)) {
1950 if (put2(self, ob) < 0)
1951 return -1;
1952 }
1953 else {
1954 if (put(self, ob) < 0)
1955 return -1;
1956 }
1957 }
Tim Peters84e87f32001-03-17 04:50:51 +00001958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001959 if (state) {
1960 if (save(self, state, 0) < 0)
1961 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001963 if ((*self->write_func)(self, &build, 1) < 0)
1964 return -1;
1965 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001967 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001968}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001969
Guido van Rossum60456fd1997-04-09 17:36:32 +00001970static int
Tim Peterscba30e22003-02-01 06:24:36 +00001971save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001972{
1973 PyTypeObject *type;
1974 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1975 *callable = 0, *state = 0;
1976 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001977
Martin v. Löwis5a395302002-08-04 08:20:23 +00001978 if (self->nesting++ > Py_GetRecursionLimit()){
1979 PyErr_SetString(PyExc_RuntimeError,
1980 "maximum recursion depth exceeded");
1981 goto finally;
1982 }
1983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001984 if (!pers_save && self->pers_func) {
1985 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1986 res = tmp;
1987 goto finally;
1988 }
1989 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001991 if (args == Py_None) {
1992 res = save_none(self, args);
1993 goto finally;
1994 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001996 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001998 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001999 case 'b':
2000 if (args == Py_False || args == Py_True) {
2001 res = save_bool(self, args);
2002 goto finally;
2003 }
2004 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002005 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002006 if (type == &PyInt_Type) {
2007 res = save_int(self, args);
2008 goto finally;
2009 }
2010 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002011
Guido van Rossum60456fd1997-04-09 17:36:32 +00002012 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002013 if (type == &PyLong_Type) {
2014 res = save_long(self, args);
2015 goto finally;
2016 }
2017 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002018
Guido van Rossum60456fd1997-04-09 17:36:32 +00002019 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002020 if (type == &PyFloat_Type) {
2021 res = save_float(self, args);
2022 goto finally;
2023 }
2024 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002025
Guido van Rossum60456fd1997-04-09 17:36:32 +00002026 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002027 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
2028 if (self->bin) res = save_empty_tuple(self, args);
2029 else res = save_tuple(self, args);
2030 goto finally;
2031 }
2032 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002033
Guido van Rossum60456fd1997-04-09 17:36:32 +00002034 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002035 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2036 res = save_string(self, args, 0);
2037 goto finally;
2038 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002039
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002040#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002041 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002042 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2043 res = save_unicode(self, args, 0);
2044 goto finally;
2045 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002046#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002047 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002049 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002050 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002051 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002053 if (PyDict_GetItem(self->memo, py_ob_id)) {
2054 if (get(self, py_ob_id) < 0)
2055 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002057 res = 0;
2058 goto finally;
2059 }
2060 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002062 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002063 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002064 if (type == &PyString_Type) {
2065 res = save_string(self, args, 1);
2066 goto finally;
2067 }
2068 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002069
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002070#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002071 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002072 if (type == &PyUnicode_Type) {
2073 res = save_unicode(self, args, 1);
2074 goto finally;
2075 }
2076 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002077#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002078
Guido van Rossum60456fd1997-04-09 17:36:32 +00002079 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002080 if (type == &PyTuple_Type) {
2081 res = save_tuple(self, args);
2082 goto finally;
2083 }
2084 if (type == &PyType_Type) {
2085 res = save_global(self, args, NULL);
2086 goto finally;
2087 }
2088 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002089
Guido van Rossum60456fd1997-04-09 17:36:32 +00002090 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002091 if (type == &PyList_Type) {
2092 res = save_list(self, args);
2093 goto finally;
2094 }
2095 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002096
2097 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002098 if (type == &PyDict_Type) {
2099 res = save_dict(self, args);
2100 goto finally;
2101 }
2102 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002103
2104 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002105 if (type == &PyInstance_Type) {
2106 res = save_inst(self, args);
2107 goto finally;
2108 }
2109 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002110
2111 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002112 if (type == &PyClass_Type) {
2113 res = save_global(self, args, NULL);
2114 goto finally;
2115 }
2116 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002117
2118 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002119 if (type == &PyFunction_Type) {
2120 res = save_global(self, args, NULL);
2121 goto finally;
2122 }
2123 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002124
2125 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002126 if (type == &PyCFunction_Type) {
2127 res = save_global(self, args, NULL);
2128 goto finally;
2129 }
2130 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002132 if (!pers_save && self->inst_pers_func) {
2133 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2134 res = tmp;
2135 goto finally;
2136 }
2137 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002138
Jeremy Hylton39c61162002-07-16 19:47:43 +00002139 if (PyType_IsSubtype(type, &PyType_Type)) {
2140 res = save_global(self, args, NULL);
2141 goto finally;
2142 }
2143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002144 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2145 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002147 Py_INCREF(args);
2148 ARG_TUP(self, args);
2149 if (self->arg) {
2150 t = PyObject_Call(__reduce__, self->arg, NULL);
2151 FREE_ARG_TUP(self);
2152 }
2153 if (! t) goto finally;
2154 }
2155 else {
2156 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002158 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2159 t = PyObject_Call(__reduce__, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002160 if (!t)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002161 goto finally;
2162 }
2163 else {
2164 PyErr_Clear();
2165 }
2166 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002168 if (t) {
2169 if (PyString_Check(t)) {
2170 res = save_global(self, args, t);
2171 goto finally;
2172 }
Tim Peters84e87f32001-03-17 04:50:51 +00002173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002174 if (!PyTuple_Check(t)) {
2175 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2176 "be a tuple", "O", __reduce__);
2177 goto finally;
2178 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002180 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002182 if ((size != 3) && (size != 2)) {
2183 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2184 "contain only two or three elements", "O", __reduce__);
2185 goto finally;
2186 }
Tim Peters84e87f32001-03-17 04:50:51 +00002187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002188 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002190 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002192 if (size > 2) {
2193 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002194 if (state == Py_None)
2195 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002196 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002198 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2199 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2200 "returned by %s must be a tuple", "O", __reduce__);
2201 goto finally;
2202 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002204 res = save_reduce(self, callable, arg_tup, state, args);
2205 goto finally;
2206 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002208 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002210 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002211 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002212 Py_XDECREF(py_ob_id);
2213 Py_XDECREF(__reduce__);
2214 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002216 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002217}
2218
2219
2220static int
Tim Peterscba30e22003-02-01 06:24:36 +00002221dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002222{
2223 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002224
Tim Peters4190fb82003-02-02 16:09:05 +00002225 if (self->proto >= 2) {
2226 char bytes[2];
2227
2228 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002229 assert(self->proto >= 0 && self->proto < 256);
2230 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002231 if (self->write_func(self, bytes, 2) < 0)
2232 return -1;
2233 }
2234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002235 if (save(self, args, 0) < 0)
2236 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002237
Tim Peters4190fb82003-02-02 16:09:05 +00002238 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002239 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002240
Tim Peters4190fb82003-02-02 16:09:05 +00002241 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002242 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002244 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002245}
2246
2247static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002248Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002249{
Tim Peterscba30e22003-02-01 06:24:36 +00002250 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002251 PyDict_Clear(self->memo);
2252 Py_INCREF(Py_None);
2253 return Py_None;
2254}
2255
2256static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002257Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002258{
2259 int l, i, rsize, ssize, clear=1, lm;
2260 long ik;
2261 PyObject *k, *r;
2262 char *s, *p, *have_get;
2263 Pdata *data;
2264
2265 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002266 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002267 return NULL;
2268
2269 /* Check to make sure we are based on a list */
2270 if (! Pdata_Check(self->file)) {
2271 PyErr_SetString(PicklingError,
2272 "Attempt to getvalue() a non-list-based pickler");
2273 return NULL;
2274 }
2275
2276 /* flush write buffer */
2277 if (write_other(self, NULL, 0) < 0) return NULL;
2278
2279 data=(Pdata*)self->file;
2280 l=data->length;
2281
2282 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002283 lm = PyDict_Size(self->memo);
2284 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002285 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002286 have_get = malloc(lm);
2287 if (have_get == NULL) return PyErr_NoMemory();
2288 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002289
2290 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002291 for (rsize = 0, i = l; --i >= 0; ) {
2292 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002293
Tim Petersac5687a2003-02-02 18:08:34 +00002294 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002295 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002296
2297 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002298 ik = PyInt_AS_LONG((PyIntObject*)k);
2299 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002300 PyErr_SetString(PicklingError,
2301 "Invalid get data");
2302 return NULL;
2303 }
Tim Petersac5687a2003-02-02 18:08:34 +00002304 if (have_get[ik]) /* with matching get */
2305 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002306 }
2307
2308 else if (! (PyTuple_Check(k) &&
2309 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002310 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002311 ) {
2312 PyErr_SetString(PicklingError,
2313 "Unexpected data in internal list");
2314 return NULL;
2315 }
2316
2317 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002318 ik = PyInt_AS_LONG((PyIntObject *)k);
2319 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002320 PyErr_SetString(PicklingError,
2321 "Invalid get data");
2322 return NULL;
2323 }
Tim Petersac5687a2003-02-02 18:08:34 +00002324 have_get[ik] = 1;
2325 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002326 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002327 }
2328
2329 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002330 r = PyString_FromStringAndSize(NULL, rsize);
2331 if (r == NULL) goto err;
2332 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002333
Tim Petersac5687a2003-02-02 18:08:34 +00002334 for (i = 0; i < l; i++) {
2335 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002336
2337 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002338 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002339 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002340 p=PyString_AS_STRING((PyStringObject *)k);
2341 while (--ssize >= 0)
2342 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002343 }
2344 }
2345
2346 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002347 ik = PyInt_AS_LONG((PyIntObject *)
2348 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002349 if (ik < 256) {
2350 *s++ = BINGET;
2351 *s++ = (int)(ik & 0xff);
2352 }
2353 else {
2354 *s++ = LONG_BINGET;
2355 *s++ = (int)(ik & 0xff);
2356 *s++ = (int)((ik >> 8) & 0xff);
2357 *s++ = (int)((ik >> 16) & 0xff);
2358 *s++ = (int)((ik >> 24) & 0xff);
2359 }
2360 }
2361
2362 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002363 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002364
2365 if (have_get[ik]) { /* with matching get */
2366 if (ik < 256) {
2367 *s++ = BINPUT;
2368 *s++ = (int)(ik & 0xff);
2369 }
2370 else {
2371 *s++ = LONG_BINPUT;
2372 *s++ = (int)(ik & 0xff);
2373 *s++ = (int)((ik >> 8) & 0xff);
2374 *s++ = (int)((ik >> 16) & 0xff);
2375 *s++ = (int)((ik >> 24) & 0xff);
2376 }
2377 }
2378 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002379 }
2380
2381 if (clear) {
2382 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002383 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002384 }
2385
2386 free(have_get);
2387 return r;
2388 err:
2389 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002390 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002391}
2392
2393static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002394Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002395{
2396 PyObject *ob;
2397 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002398
Tim Peterscba30e22003-02-01 06:24:36 +00002399 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002400 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002402 if (dump(self, ob) < 0)
2403 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002405 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002407 /* XXX Why does dump() return self? */
2408 Py_INCREF(self);
2409 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002410}
2411
2412
Tim Peterscba30e22003-02-01 06:24:36 +00002413static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002414{
Neal Norwitzb0493252002-03-31 14:44:22 +00002415 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002416 PyDoc_STR("dump(object) -- "
2417 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002418 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002419 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002420 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002421 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002422 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002423};
2424
2425
2426static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002427newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002428{
2429 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002430
Tim Peters5bd2a792003-02-01 16:45:06 +00002431 if (proto < 0)
2432 proto = CURRENT_PROTOCOL_NUMBER;
2433 if (proto > CURRENT_PROTOCOL_NUMBER) {
2434 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2435 "the highest available protocol is %d",
2436 proto, CURRENT_PROTOCOL_NUMBER);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002437 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002438 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002439
Tim Peters5bd2a792003-02-01 16:45:06 +00002440 self = PyObject_New(Picklerobject, &Picklertype);
2441 if (self == NULL)
2442 return NULL;
2443 self->proto = proto;
2444 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002445 self->fp = NULL;
2446 self->write = NULL;
2447 self->memo = NULL;
2448 self->arg = NULL;
2449 self->pers_func = NULL;
2450 self->inst_pers_func = NULL;
2451 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002452 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002453 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002454 self->fast_container = 0;
2455 self->fast_memo = NULL;
2456 self->buf_size = 0;
2457 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002458
Tim Peters5bd2a792003-02-01 16:45:06 +00002459 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002460 if (file)
2461 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002462 else {
2463 file = Pdata_New();
2464 if (file == NULL)
2465 goto err;
2466 }
2467 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002468
Tim Peterscba30e22003-02-01 06:24:36 +00002469 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002470 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002472 if (PyFile_Check(file)) {
2473 self->fp = PyFile_AsFile(file);
2474 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002475 PyErr_SetString(PyExc_ValueError,
2476 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002477 goto err;
2478 }
2479 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002480 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002481 else if (PycStringIO_OutputCheck(file)) {
2482 self->write_func = write_cStringIO;
2483 }
2484 else if (file == Py_None) {
2485 self->write_func = write_none;
2486 }
2487 else {
2488 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002490 if (! Pdata_Check(file)) {
2491 self->write = PyObject_GetAttr(file, write_str);
2492 if (!self->write) {
2493 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002494 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002495 "argument must have 'write' "
2496 "attribute");
2497 goto err;
2498 }
2499 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002500
Tim Peters5bd2a792003-02-01 16:45:06 +00002501 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2502 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002503 PyErr_NoMemory();
2504 goto err;
2505 }
2506 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002508 if (PyEval_GetRestricted()) {
2509 /* Restricted execution, get private tables */
2510 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002512 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2513 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2514 Py_DECREF(m);
2515 if (!( self->dispatch_table )) goto err;
2516 }
2517 else {
2518 self->dispatch_table=dispatch_table;
2519 Py_INCREF(dispatch_table);
2520 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002522 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002524 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002525 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002526 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002527}
2528
2529
2530static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002531get_Pickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002532{
2533 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002534 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002535
Tim Peters5bd2a792003-02-01 16:45:06 +00002536 /* XXX What is this doing? The documented signature is
2537 * XXX Pickler(file, proto=0), but this accepts Pickler() and
2538 * XXX Pickler(integer) too. The meaning then is clear as mud.
2539 * XXX Bug? Feature?
2540 */
2541 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002542 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002543 proto = 0;
2544 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002545 return NULL;
2546 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002547 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002548}
2549
2550
2551static void
Tim Peterscba30e22003-02-01 06:24:36 +00002552Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002553{
2554 Py_XDECREF(self->write);
2555 Py_XDECREF(self->memo);
2556 Py_XDECREF(self->fast_memo);
2557 Py_XDECREF(self->arg);
2558 Py_XDECREF(self->file);
2559 Py_XDECREF(self->pers_func);
2560 Py_XDECREF(self->inst_pers_func);
2561 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002562 PyMem_Free(self->write_buf);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002563 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002564}
2565
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002566static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002567Pickler_get_pers_func(Picklerobject *p)
2568{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002569 if (p->pers_func == NULL)
2570 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2571 else
2572 Py_INCREF(p->pers_func);
2573 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002574}
2575
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002576static int
2577Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2578{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002579 if (v == NULL) {
2580 PyErr_SetString(PyExc_TypeError,
2581 "attribute deletion is not supported");
2582 return -1;
2583 }
2584 Py_XDECREF(p->pers_func);
2585 Py_INCREF(v);
2586 p->pers_func = v;
2587 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002588}
2589
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002590static int
2591Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2592{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002593 if (v == NULL) {
2594 PyErr_SetString(PyExc_TypeError,
2595 "attribute deletion is not supported");
2596 return -1;
2597 }
2598 Py_XDECREF(p->inst_pers_func);
2599 Py_INCREF(v);
2600 p->inst_pers_func = v;
2601 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002602}
2603
2604static PyObject *
2605Pickler_get_memo(Picklerobject *p)
2606{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002607 if (p->memo == NULL)
2608 PyErr_SetString(PyExc_AttributeError, "memo");
2609 else
2610 Py_INCREF(p->memo);
2611 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002612}
2613
2614static int
2615Pickler_set_memo(Picklerobject *p, PyObject *v)
2616{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002617 if (v == NULL) {
2618 PyErr_SetString(PyExc_TypeError,
2619 "attribute deletion is not supported");
2620 return -1;
2621 }
2622 if (!PyDict_Check(v)) {
2623 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2624 return -1;
2625 }
2626 Py_XDECREF(p->memo);
2627 Py_INCREF(v);
2628 p->memo = v;
2629 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002630}
2631
2632static PyObject *
2633Pickler_get_error(Picklerobject *p)
2634{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002635 /* why is this an attribute on the Pickler? */
2636 Py_INCREF(PicklingError);
2637 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002638}
2639
2640static PyMemberDef Pickler_members[] = {
2641 {"binary", T_INT, offsetof(Picklerobject, bin)},
2642 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002643 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002644};
2645
2646static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002647 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002648 (setter)Pickler_set_pers_func},
2649 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2650 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002651 {"PicklingError", (getter)Pickler_get_error, NULL},
2652 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002653};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002654
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002655PyDoc_STRVAR(Picklertype__doc__,
2656"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002657
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002658static PyTypeObject Picklertype = {
2659 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002660 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002661 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002662 sizeof(Picklerobject), /*tp_basicsize*/
2663 0,
2664 (destructor)Pickler_dealloc, /* tp_dealloc */
2665 0, /* tp_print */
2666 0, /* tp_getattr */
2667 0, /* tp_setattr */
2668 0, /* tp_compare */
2669 0, /* tp_repr */
2670 0, /* tp_as_number */
2671 0, /* tp_as_sequence */
2672 0, /* tp_as_mapping */
2673 0, /* tp_hash */
2674 0, /* tp_call */
2675 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002676 PyObject_GenericGetAttr, /* tp_getattro */
2677 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002678 0, /* tp_as_buffer */
2679 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2680 Picklertype__doc__, /* tp_doc */
2681 0, /* tp_traverse */
2682 0, /* tp_clear */
2683 0, /* tp_richcompare */
2684 0, /* tp_weaklistoffset */
2685 0, /* tp_iter */
2686 0, /* tp_iternext */
2687 Pickler_methods, /* tp_methods */
2688 Pickler_members, /* tp_members */
2689 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002690};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002691
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002692static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002693find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002694{
2695 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002697 if (fc) {
2698 if (fc==Py_None) {
2699 PyErr_SetString(UnpicklingError,
2700 "Global and instance pickles are not supported.");
2701 return NULL;
2702 }
Tim Peterscba30e22003-02-01 06:24:36 +00002703 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002704 py_global_name);
2705 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002707 module = PySys_GetObject("modules");
2708 if (module == NULL)
2709 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002711 module = PyDict_GetItem(module, py_module_name);
2712 if (module == NULL) {
2713 module = PyImport_Import(py_module_name);
2714 if (!module)
2715 return NULL;
2716 global = PyObject_GetAttr(module, py_global_name);
2717 Py_DECREF(module);
2718 }
2719 else
2720 global = PyObject_GetAttr(module, py_global_name);
2721 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002722}
2723
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002724static int
Tim Peterscba30e22003-02-01 06:24:36 +00002725marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002726{
2727 if (self->num_marks < 1) {
2728 PyErr_SetString(UnpicklingError, "could not find MARK");
2729 return -1;
2730 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002732 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002733}
2734
Tim Peters84e87f32001-03-17 04:50:51 +00002735
Guido van Rossum60456fd1997-04-09 17:36:32 +00002736static int
Tim Peterscba30e22003-02-01 06:24:36 +00002737load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002738{
2739 PDATA_APPEND(self->stack, Py_None, -1);
2740 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002741}
2742
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002743static int
Tim Peterscba30e22003-02-01 06:24:36 +00002744bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002745{
2746 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2747 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002748}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002749
2750static int
Tim Peterscba30e22003-02-01 06:24:36 +00002751load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002752{
2753 PyObject *py_int = 0;
2754 char *endptr, *s;
2755 int len, res = -1;
2756 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002758 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2759 if (len < 2) return bad_readline();
2760 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002762 errno = 0;
2763 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002765 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2766 /* Hm, maybe we've got something long. Let's try reading
2767 it as a Python long object. */
2768 errno = 0;
2769 py_int = PyLong_FromString(s, NULL, 0);
2770 if (py_int == NULL) {
2771 PyErr_SetString(PyExc_ValueError,
2772 "could not convert string to int");
2773 goto finally;
2774 }
2775 }
2776 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002777 if (len == 3 && (l == 0 || l == 1)) {
2778 if (!( py_int = PyBool_FromLong(l))) goto finally;
2779 }
2780 else {
2781 if (!( py_int = PyInt_FromLong(l))) goto finally;
2782 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002783 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002785 free(s);
2786 PDATA_PUSH(self->stack, py_int, -1);
2787 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002789 finally:
2790 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002792 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002793}
2794
Tim Peters3c67d792003-02-02 17:59:11 +00002795static int
2796load_bool(Unpicklerobject *self, PyObject *boolean)
2797{
2798 assert(boolean == Py_True || boolean == Py_False);
2799 Py_INCREF(boolean);
2800 PDATA_PUSH(self->stack, boolean, -1);
2801 return 0;
2802}
2803
Tim Petersee1a53c2003-02-02 02:57:53 +00002804/* s contains x bytes of a little-endian integer. Return its value as a
2805 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
2806 * int, but when x is 4 it's a signed one. This is an historical source
2807 * of x-platform bugs.
2808 */
Tim Peters84e87f32001-03-17 04:50:51 +00002809static long
Tim Petersee1a53c2003-02-02 02:57:53 +00002810calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002811{
2812 unsigned char c;
2813 int i;
2814 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002816 for (i = 0, l = 0L; i < x; i++) {
2817 c = (unsigned char)s[i];
2818 l |= (long)c << (i * 8);
2819 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002820#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002821 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2822 * is signed, so on a box with longs bigger than 4 bytes we need
2823 * to extend a BININT's sign bit to the full width.
2824 */
2825 if (x == 4 && l & (1L << 31))
2826 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002827#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002828 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002829}
2830
2831
2832static int
Tim Peterscba30e22003-02-01 06:24:36 +00002833load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002834{
2835 PyObject *py_int = 0;
2836 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002838 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002839
Tim Peterscba30e22003-02-01 06:24:36 +00002840 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002841 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002843 PDATA_PUSH(self->stack, py_int, -1);
2844 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002845}
2846
2847
2848static int
Tim Peterscba30e22003-02-01 06:24:36 +00002849load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002850{
2851 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002853 if ((*self->read_func)(self, &s, 4) < 0)
2854 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002856 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002857}
2858
2859
2860static int
Tim Peterscba30e22003-02-01 06:24:36 +00002861load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002862{
2863 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002865 if ((*self->read_func)(self, &s, 1) < 0)
2866 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002868 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002869}
2870
2871
2872static int
Tim Peterscba30e22003-02-01 06:24:36 +00002873load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002874{
2875 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002877 if ((*self->read_func)(self, &s, 2) < 0)
2878 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002880 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002881}
Tim Peters84e87f32001-03-17 04:50:51 +00002882
Guido van Rossum60456fd1997-04-09 17:36:32 +00002883static int
Tim Peterscba30e22003-02-01 06:24:36 +00002884load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002885{
2886 PyObject *l = 0;
2887 char *end, *s;
2888 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002890 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2891 if (len < 2) return bad_readline();
2892 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002893
Tim Peterscba30e22003-02-01 06:24:36 +00002894 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002895 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002897 free(s);
2898 PDATA_PUSH(self->stack, l, -1);
2899 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002901 finally:
2902 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002904 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002905}
2906
Tim Petersee1a53c2003-02-02 02:57:53 +00002907/* 'size' bytes contain the # of bytes of little-endian 256's-complement
2908 * data following.
2909 */
2910static int
2911load_counted_long(Unpicklerobject *self, int size)
2912{
2913 int i;
2914 char *nbytes;
2915 unsigned char *pdata;
2916 PyObject *along;
2917
2918 assert(size == 1 || size == 4);
2919 i = self->read_func(self, &nbytes, size);
2920 if (i < 0) return -1;
2921
2922 size = calc_binint(nbytes, size);
2923 if (size < 0) {
2924 /* Corrupt or hostile pickle -- we never write one like
2925 * this.
2926 */
2927 PyErr_SetString(PyExc_ValueError, "LONG pickle has negative "
2928 "byte count");
2929 return -1;
2930 }
2931
2932 if (size == 0)
2933 along = PyLong_FromLong(0L);
2934 else {
2935 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00002936 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00002937 if (i < 0) return -1;
2938 along = _PyLong_FromByteArray(pdata, (size_t)size,
2939 1 /* little endian */, 1 /* signed */);
2940 }
2941 if (along == NULL)
2942 return -1;
2943 PDATA_PUSH(self->stack, along, -1);
2944 return 0;
2945}
Tim Peters84e87f32001-03-17 04:50:51 +00002946
Guido van Rossum60456fd1997-04-09 17:36:32 +00002947static int
Tim Peterscba30e22003-02-01 06:24:36 +00002948load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002949{
2950 PyObject *py_float = 0;
2951 char *endptr, *s;
2952 int len, res = -1;
2953 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002955 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2956 if (len < 2) return bad_readline();
2957 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002959 errno = 0;
2960 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002962 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2963 PyErr_SetString(PyExc_ValueError,
2964 "could not convert string to float");
2965 goto finally;
2966 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002967
Tim Peterscba30e22003-02-01 06:24:36 +00002968 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002969 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002970
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002971 free(s);
2972 PDATA_PUSH(self->stack, py_float, -1);
2973 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002974
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002975 finally:
2976 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002977
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002978 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002979}
2980
Guido van Rossum60456fd1997-04-09 17:36:32 +00002981static int
Tim Peterscba30e22003-02-01 06:24:36 +00002982load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002983{
2984 PyObject *py_float = 0;
2985 int s, e;
2986 long fhi, flo;
2987 double x;
2988 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002990 if ((*self->read_func)(self, &p, 8) < 0)
2991 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002993 /* First byte */
2994 s = (*p>>7) & 1;
2995 e = (*p & 0x7F) << 4;
2996 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002998 /* Second byte */
2999 e |= (*p>>4) & 0xF;
3000 fhi = (*p & 0xF) << 24;
3001 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003003 /* Third byte */
3004 fhi |= (*p & 0xFF) << 16;
3005 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003007 /* Fourth byte */
3008 fhi |= (*p & 0xFF) << 8;
3009 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003011 /* Fifth byte */
3012 fhi |= *p & 0xFF;
3013 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003014
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003015 /* Sixth byte */
3016 flo = (*p & 0xFF) << 16;
3017 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003019 /* Seventh byte */
3020 flo |= (*p & 0xFF) << 8;
3021 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003023 /* Eighth byte */
3024 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003026 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
3027 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003029 /* XXX This sadly ignores Inf/NaN */
3030 if (e == 0)
3031 e = -1022;
3032 else {
3033 x += 1.0;
3034 e -= 1023;
3035 }
3036 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003038 if (s)
3039 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003040
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003041 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003042
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003043 PDATA_PUSH(self->stack, py_float, -1);
3044 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003045}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003046
3047static int
Tim Peterscba30e22003-02-01 06:24:36 +00003048load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003049{
3050 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003051 int len, res = -1;
3052 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003054 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3055 if (len < 2) return bad_readline();
3056 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003057
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003058
3059 /* Strip outermost quotes */
3060 while (s[len-1] <= ' ')
3061 len--;
3062 if(s[0]=='"' && s[len-1]=='"'){
3063 s[len-1] = '\0';
3064 p = s + 1 ;
3065 len -= 2;
3066 } else if(s[0]=='\'' && s[len-1]=='\''){
3067 s[len-1] = '\0';
3068 p = s + 1 ;
3069 len -= 2;
3070 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003071 goto insecure;
3072 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003073
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003074 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
3075 if (str) {
3076 PDATA_PUSH(self->stack, str, -1);
3077 res = 0;
3078 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003079 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003080 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003082 insecure:
3083 free(s);
3084 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3085 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003086}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003087
3088
3089static int
Tim Peterscba30e22003-02-01 06:24:36 +00003090load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003091{
3092 PyObject *py_string = 0;
3093 long l;
3094 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003096 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003098 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003100 if ((*self->read_func)(self, &s, l) < 0)
3101 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003102
Tim Peterscba30e22003-02-01 06:24:36 +00003103 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003104 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003106 PDATA_PUSH(self->stack, py_string, -1);
3107 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003108}
3109
3110
3111static int
Tim Peterscba30e22003-02-01 06:24:36 +00003112load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003113{
3114 PyObject *py_string = 0;
3115 unsigned char l;
3116 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003117
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003118 if ((*self->read_func)(self, &s, 1) < 0)
3119 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003121 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003123 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003125 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003127 PDATA_PUSH(self->stack, py_string, -1);
3128 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003129}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003130
3131
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003132#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003133static int
Tim Peterscba30e22003-02-01 06:24:36 +00003134load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003135{
3136 PyObject *str = 0;
3137 int len, res = -1;
3138 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003140 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3141 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003142
Tim Peterscba30e22003-02-01 06:24:36 +00003143 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003144 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003145
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003146 PDATA_PUSH(self->stack, str, -1);
3147 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003148
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003149 finally:
3150 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003151}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003152#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003153
3154
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003155#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003156static int
Tim Peterscba30e22003-02-01 06:24:36 +00003157load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003158{
3159 PyObject *unicode;
3160 long l;
3161 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003163 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003165 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003167 if ((*self->read_func)(self, &s, l) < 0)
3168 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003169
Tim Peterscba30e22003-02-01 06:24:36 +00003170 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003171 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003173 PDATA_PUSH(self->stack, unicode, -1);
3174 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003175}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003176#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003177
3178
3179static int
Tim Peterscba30e22003-02-01 06:24:36 +00003180load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003181{
3182 PyObject *tup;
3183 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003185 if ((i = marker(self)) < 0) return -1;
3186 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3187 PDATA_PUSH(self->stack, tup, -1);
3188 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003189}
3190
3191static int
Tim Peterscba30e22003-02-01 06:24:36 +00003192load_empty_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003193{
3194 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003196 if (!( tup=PyTuple_New(0))) return -1;
3197 PDATA_PUSH(self->stack, tup, -1);
3198 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003199}
3200
3201static int
Tim Peterscba30e22003-02-01 06:24:36 +00003202load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003203{
3204 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003206 if (!( list=PyList_New(0))) return -1;
3207 PDATA_PUSH(self->stack, list, -1);
3208 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003209}
3210
3211static int
Tim Peterscba30e22003-02-01 06:24:36 +00003212load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003213{
3214 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003216 if (!( dict=PyDict_New())) return -1;
3217 PDATA_PUSH(self->stack, dict, -1);
3218 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003219}
3220
3221
3222static int
Tim Peterscba30e22003-02-01 06:24:36 +00003223load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003224{
3225 PyObject *list = 0;
3226 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003228 if ((i = marker(self)) < 0) return -1;
3229 if (!( list=Pdata_popList(self->stack, i))) return -1;
3230 PDATA_PUSH(self->stack, list, -1);
3231 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003232}
3233
3234static int
Tim Peterscba30e22003-02-01 06:24:36 +00003235load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003236{
3237 PyObject *dict, *key, *value;
3238 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003240 if ((i = marker(self)) < 0) return -1;
3241 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003243 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003245 for (k = i+1; k < j; k += 2) {
3246 key =self->stack->data[k-1];
3247 value=self->stack->data[k ];
3248 if (PyDict_SetItem(dict, key, value) < 0) {
3249 Py_DECREF(dict);
3250 return -1;
3251 }
3252 }
3253 Pdata_clear(self->stack, i);
3254 PDATA_PUSH(self->stack, dict, -1);
3255 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003256}
3257
3258static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003259Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003260{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003261 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003263 if (PyClass_Check(cls)) {
3264 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003265
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003266 if ((l=PyObject_Size(args)) < 0) goto err;
3267 if (!( l )) {
3268 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003269
Tim Peterscba30e22003-02-01 06:24:36 +00003270 __getinitargs__ = PyObject_GetAttr(cls,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003271 __getinitargs___str);
3272 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003273 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003274 so bypass usual construction */
3275 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003277 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003278 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003279 goto err;
3280 return inst;
3281 }
3282 Py_DECREF(__getinitargs__);
3283 }
Tim Peters84e87f32001-03-17 04:50:51 +00003284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003285 if ((r=PyInstance_New(cls, args, NULL))) return r;
3286 else goto err;
3287 }
Tim Peters84e87f32001-03-17 04:50:51 +00003288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003289 if (args==Py_None) {
3290 /* Special case, call cls.__basicnew__() */
3291 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003293 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3294 if (!basicnew) return NULL;
3295 r=PyObject_CallObject(basicnew, NULL);
3296 Py_DECREF(basicnew);
3297 if (r) return r;
3298 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003300 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003302 err:
3303 {
3304 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003306 PyErr_Fetch(&tp, &v, &tb);
3307 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3308 Py_XDECREF(v);
3309 v=r;
3310 }
3311 PyErr_Restore(tp,v,tb);
3312 }
3313 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003314}
Tim Peters84e87f32001-03-17 04:50:51 +00003315
Guido van Rossum60456fd1997-04-09 17:36:32 +00003316
3317static int
Tim Peterscba30e22003-02-01 06:24:36 +00003318load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003319{
3320 PyObject *class, *tup, *obj=0;
3321 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003322
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003323 if ((i = marker(self)) < 0) return -1;
3324 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3325 PDATA_POP(self->stack, class);
3326 if (class) {
3327 obj = Instance_New(class, tup);
3328 Py_DECREF(class);
3329 }
3330 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003332 if (! obj) return -1;
3333 PDATA_PUSH(self->stack, obj, -1);
3334 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003335}
3336
3337
3338static int
Tim Peterscba30e22003-02-01 06:24:36 +00003339load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003340{
3341 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3342 int i, len;
3343 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003344
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003345 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003347 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3348 if (len < 2) return bad_readline();
3349 module_name = PyString_FromStringAndSize(s, len - 1);
3350 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003352 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3353 if (len < 2) return bad_readline();
3354 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003355 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003356 self->find_class);
3357 Py_DECREF(class_name);
3358 }
3359 }
3360 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003362 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003364 if ((tup=Pdata_popTuple(self->stack, i))) {
3365 obj = Instance_New(class, tup);
3366 Py_DECREF(tup);
3367 }
3368 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003370 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003372 PDATA_PUSH(self->stack, obj, -1);
3373 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003374}
3375
3376
3377static int
Tim Peterscba30e22003-02-01 06:24:36 +00003378load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003379{
3380 PyObject *class = 0, *module_name = 0, *class_name = 0;
3381 int len;
3382 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003384 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3385 if (len < 2) return bad_readline();
3386 module_name = PyString_FromStringAndSize(s, len - 1);
3387 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003389 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003390 if (len < 2) {
3391 Py_DECREF(module_name);
3392 return bad_readline();
3393 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003394 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003395 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003396 self->find_class);
3397 Py_DECREF(class_name);
3398 }
3399 }
3400 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003402 if (! class) return -1;
3403 PDATA_PUSH(self->stack, class, -1);
3404 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003405}
3406
3407
3408static int
Tim Peterscba30e22003-02-01 06:24:36 +00003409load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003410{
3411 PyObject *pid = 0;
3412 int len;
3413 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003415 if (self->pers_func) {
3416 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3417 if (len < 2) return bad_readline();
3418
3419 pid = PyString_FromStringAndSize(s, len - 1);
3420 if (!pid) return -1;
3421
3422 if (PyList_Check(self->pers_func)) {
3423 if (PyList_Append(self->pers_func, pid) < 0) {
3424 Py_DECREF(pid);
3425 return -1;
3426 }
3427 }
3428 else {
3429 ARG_TUP(self, pid);
3430 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003431 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003432 NULL);
3433 FREE_ARG_TUP(self);
3434 }
3435 }
3436
3437 if (! pid) return -1;
3438
3439 PDATA_PUSH(self->stack, pid, -1);
3440 return 0;
3441 }
3442 else {
3443 PyErr_SetString(UnpicklingError,
3444 "A load persistent id instruction was encountered,\n"
3445 "but no persistent_load function was specified.");
3446 return -1;
3447 }
3448}
3449
3450static int
Tim Peterscba30e22003-02-01 06:24:36 +00003451load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003452{
3453 PyObject *pid = 0;
3454
3455 if (self->pers_func) {
3456 PDATA_POP(self->stack, pid);
3457 if (! pid) return -1;
3458
3459 if (PyList_Check(self->pers_func)) {
3460 if (PyList_Append(self->pers_func, pid) < 0) {
3461 Py_DECREF(pid);
3462 return -1;
3463 }
3464 }
3465 else {
3466 ARG_TUP(self, pid);
3467 if (self->arg) {
3468 pid = PyObject_Call(self->pers_func, self->arg,
3469 NULL);
3470 FREE_ARG_TUP(self);
3471 }
3472 if (! pid) return -1;
3473 }
3474
3475 PDATA_PUSH(self->stack, pid, -1);
3476 return 0;
3477 }
3478 else {
3479 PyErr_SetString(UnpicklingError,
3480 "A load persistent id instruction was encountered,\n"
3481 "but no persistent_load function was specified.");
3482 return -1;
3483 }
3484}
3485
3486
3487static int
Tim Peterscba30e22003-02-01 06:24:36 +00003488load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003489{
3490 int len;
3491
3492 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3493
3494 /* Note that we split the (pickle.py) stack into two stacks,
3495 an object stack and a mark stack. We have to be clever and
3496 pop the right one. We do this by looking at the top of the
3497 mark stack.
3498 */
3499
3500 if ((self->num_marks > 0) &&
3501 (self->marks[self->num_marks - 1] == len))
3502 self->num_marks--;
3503 else {
3504 len--;
3505 Py_DECREF(self->stack->data[len]);
3506 self->stack->length=len;
3507 }
3508
3509 return 0;
3510}
3511
3512
3513static int
Tim Peterscba30e22003-02-01 06:24:36 +00003514load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003515{
3516 int i;
3517
3518 if ((i = marker(self)) < 0)
3519 return -1;
3520
3521 Pdata_clear(self->stack, i);
3522
3523 return 0;
3524}
3525
3526
3527static int
Tim Peterscba30e22003-02-01 06:24:36 +00003528load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003529{
3530 PyObject *last;
3531 int len;
3532
3533 if ((len = self->stack->length) <= 0) return stackUnderflow();
3534 last=self->stack->data[len-1];
3535 Py_INCREF(last);
3536 PDATA_PUSH(self->stack, last, -1);
3537 return 0;
3538}
3539
3540
3541static int
Tim Peterscba30e22003-02-01 06:24:36 +00003542load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003543{
3544 PyObject *py_str = 0, *value = 0;
3545 int len;
3546 char *s;
3547 int rc;
3548
3549 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003550 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003552 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003554 value = PyDict_GetItem(self->memo, py_str);
3555 if (! value) {
3556 PyErr_SetObject(BadPickleGet, py_str);
3557 rc = -1;
3558 } else {
3559 PDATA_APPEND(self->stack, value, -1);
3560 rc = 0;
3561 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003563 Py_DECREF(py_str);
3564 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003565}
3566
3567
3568static int
Tim Peterscba30e22003-02-01 06:24:36 +00003569load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003570{
3571 PyObject *py_key = 0, *value = 0;
3572 unsigned char key;
3573 char *s;
3574 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003576 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003578 key = (unsigned char)s[0];
3579 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003581 value = PyDict_GetItem(self->memo, py_key);
3582 if (! value) {
3583 PyErr_SetObject(BadPickleGet, py_key);
3584 rc = -1;
3585 } else {
3586 PDATA_APPEND(self->stack, value, -1);
3587 rc = 0;
3588 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003589
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003590 Py_DECREF(py_key);
3591 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003592}
3593
3594
3595static int
Tim Peterscba30e22003-02-01 06:24:36 +00003596load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003597{
3598 PyObject *py_key = 0, *value = 0;
3599 unsigned char c;
3600 char *s;
3601 long key;
3602 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003603
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003604 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003606 c = (unsigned char)s[0];
3607 key = (long)c;
3608 c = (unsigned char)s[1];
3609 key |= (long)c << 8;
3610 c = (unsigned char)s[2];
3611 key |= (long)c << 16;
3612 c = (unsigned char)s[3];
3613 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003615 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3616
3617 value = PyDict_GetItem(self->memo, py_key);
3618 if (! value) {
3619 PyErr_SetObject(BadPickleGet, py_key);
3620 rc = -1;
3621 } else {
3622 PDATA_APPEND(self->stack, value, -1);
3623 rc = 0;
3624 }
3625
3626 Py_DECREF(py_key);
3627 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003628}
3629
3630
3631static int
Tim Peterscba30e22003-02-01 06:24:36 +00003632load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003633{
3634 PyObject *py_str = 0, *value = 0;
3635 int len, l;
3636 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003637
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003638 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3639 if (l < 2) return bad_readline();
3640 if (!( len=self->stack->length )) return stackUnderflow();
3641 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3642 value=self->stack->data[len-1];
3643 l=PyDict_SetItem(self->memo, py_str, value);
3644 Py_DECREF(py_str);
3645 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003646}
3647
3648
3649static int
Tim Peterscba30e22003-02-01 06:24:36 +00003650load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003651{
3652 PyObject *py_key = 0, *value = 0;
3653 unsigned char key;
3654 char *s;
3655 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003657 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3658 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003659
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003660 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003662 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3663 value=self->stack->data[len-1];
3664 len=PyDict_SetItem(self->memo, py_key, value);
3665 Py_DECREF(py_key);
3666 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003667}
3668
3669
3670static int
Tim Peterscba30e22003-02-01 06:24:36 +00003671load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003672{
3673 PyObject *py_key = 0, *value = 0;
3674 long key;
3675 unsigned char c;
3676 char *s;
3677 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003679 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3680 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003681
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003682 c = (unsigned char)s[0];
3683 key = (long)c;
3684 c = (unsigned char)s[1];
3685 key |= (long)c << 8;
3686 c = (unsigned char)s[2];
3687 key |= (long)c << 16;
3688 c = (unsigned char)s[3];
3689 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003691 if (!( py_key = PyInt_FromLong(key))) return -1;
3692 value=self->stack->data[len-1];
3693 len=PyDict_SetItem(self->memo, py_key, value);
3694 Py_DECREF(py_key);
3695 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003696}
3697
3698
3699static int
Tim Peterscba30e22003-02-01 06:24:36 +00003700do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003701{
3702 PyObject *value = 0, *list = 0, *append_method = 0;
3703 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003705 len=self->stack->length;
3706 if (!( len >= x && x > 0 )) return stackUnderflow();
3707 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003708 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003710 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003712 if (PyList_Check(list)) {
3713 PyObject *slice;
3714 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003716 slice=Pdata_popList(self->stack, x);
3717 list_len = PyList_GET_SIZE(list);
3718 i=PyList_SetSlice(list, list_len, list_len, slice);
3719 Py_DECREF(slice);
3720 return i;
3721 }
3722 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003723
Tim Peterscba30e22003-02-01 06:24:36 +00003724 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003725 return -1;
3726
3727 for (i = x; i < len; i++) {
3728 PyObject *junk;
3729
3730 value=self->stack->data[i];
3731 junk=0;
3732 ARG_TUP(self, value);
3733 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003734 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003735 NULL);
3736 FREE_ARG_TUP(self);
3737 }
3738 if (! junk) {
3739 Pdata_clear(self->stack, i+1);
3740 self->stack->length=x;
3741 Py_DECREF(append_method);
3742 return -1;
3743 }
3744 Py_DECREF(junk);
3745 }
3746 self->stack->length=x;
3747 Py_DECREF(append_method);
3748 }
3749
3750 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003751}
3752
3753
3754static int
Tim Peterscba30e22003-02-01 06:24:36 +00003755load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003756{
3757 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003758}
3759
3760
3761static int
Tim Peterscba30e22003-02-01 06:24:36 +00003762load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003763{
3764 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003765}
3766
3767
3768static int
Tim Peterscba30e22003-02-01 06:24:36 +00003769do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003770{
3771 PyObject *value = 0, *key = 0, *dict = 0;
3772 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003774 if (!( (len=self->stack->length) >= x
3775 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003777 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003779 for (i = x+1; i < len; i += 2) {
3780 key =self->stack->data[i-1];
3781 value=self->stack->data[i ];
3782 if (PyObject_SetItem(dict, key, value) < 0) {
3783 r=-1;
3784 break;
3785 }
3786 }
3787
3788 Pdata_clear(self->stack, x);
3789
3790 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003791}
3792
3793
Tim Peters84e87f32001-03-17 04:50:51 +00003794static int
Tim Peterscba30e22003-02-01 06:24:36 +00003795load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003796{
3797 return do_setitems(self, self->stack->length - 2);
3798}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003800static int
Tim Peterscba30e22003-02-01 06:24:36 +00003801load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003802{
3803 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003804}
3805
Tim Peters84e87f32001-03-17 04:50:51 +00003806
Guido van Rossum60456fd1997-04-09 17:36:32 +00003807static int
Tim Peterscba30e22003-02-01 06:24:36 +00003808load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003809{
3810 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3811 *junk = 0, *__setstate__ = 0;
3812 int i, r = 0;
3813
3814 if (self->stack->length < 2) return stackUnderflow();
3815 PDATA_POP(self->stack, value);
3816 if (! value) return -1;
3817 inst=self->stack->data[self->stack->length-1];
3818
3819 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3820 ARG_TUP(self, value);
3821 if (self->arg) {
3822 junk = PyObject_Call(__setstate__, self->arg, NULL);
3823 FREE_ARG_TUP(self);
3824 }
3825 Py_DECREF(__setstate__);
3826 if (! junk) return -1;
3827 Py_DECREF(junk);
3828 return 0;
3829 }
3830
3831 PyErr_Clear();
3832 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3833 i = 0;
3834 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3835 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3836 r=-1;
3837 break;
3838 }
3839 }
3840 Py_DECREF(instdict);
3841 }
3842 else r=-1;
3843
3844 Py_XDECREF(value);
3845
3846 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003847}
3848
3849
3850static int
Tim Peterscba30e22003-02-01 06:24:36 +00003851load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003852{
3853 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003855 /* Note that we split the (pickle.py) stack into two stacks, an
3856 object stack and a mark stack. Here we push a mark onto the
3857 mark stack.
3858 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003860 if ((self->num_marks + 1) >= self->marks_size) {
3861 s=self->marks_size+20;
3862 if (s <= self->num_marks) s=self->num_marks + 1;
3863 if (self->marks == NULL)
3864 self->marks=(int *)malloc(s * sizeof(int));
3865 else
Tim Peterscba30e22003-02-01 06:24:36 +00003866 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003867 s * sizeof(int));
3868 if (! self->marks) {
3869 PyErr_NoMemory();
3870 return -1;
3871 }
3872 self->marks_size = s;
3873 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003875 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003877 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003878}
3879
Guido van Rossum60456fd1997-04-09 17:36:32 +00003880static int
Tim Peterscba30e22003-02-01 06:24:36 +00003881load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003882{
3883 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003885 PDATA_POP(self->stack, arg_tup);
3886 if (! arg_tup) return -1;
3887 PDATA_POP(self->stack, callable);
3888 if (callable) {
3889 ob = Instance_New(callable, arg_tup);
3890 Py_DECREF(callable);
3891 }
3892 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003894 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003896 PDATA_PUSH(self->stack, ob, -1);
3897 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003898}
Tim Peters84e87f32001-03-17 04:50:51 +00003899
Tim Peters4190fb82003-02-02 16:09:05 +00003900/* Just raises an error if we don't know the protocol specified. PROTO
3901 * is the first opcode for protocols >= 2.
3902 */
3903static int
3904load_proto(Unpicklerobject *self)
3905{
3906 int i;
3907 char *protobyte;
3908
3909 i = self->read_func(self, &protobyte, 1);
3910 if (i < 0)
3911 return -1;
3912
3913 i = calc_binint(protobyte, 1);
3914 /* No point checking for < 0, since calc_binint returns an unsigned
3915 * int when chewing on 1 byte.
3916 */
3917 assert(i >= 0);
3918 if (i <= CURRENT_PROTOCOL_NUMBER)
3919 return 0;
3920
3921 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
3922 return -1;
3923}
3924
Guido van Rossum60456fd1997-04-09 17:36:32 +00003925static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003926load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003927{
3928 PyObject *err = 0, *val = 0;
3929 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003930
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003931 self->num_marks = 0;
3932 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003934 while (1) {
3935 if ((*self->read_func)(self, &s, 1) < 0)
3936 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003938 switch (s[0]) {
3939 case NONE:
3940 if (load_none(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 BININT:
3945 if (load_binint(self) < 0)
3946 break;
3947 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003949 case BININT1:
3950 if (load_binint1(self) < 0)
3951 break;
3952 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003954 case BININT2:
3955 if (load_binint2(self) < 0)
3956 break;
3957 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003959 case INT:
3960 if (load_int(self) < 0)
3961 break;
3962 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003964 case LONG:
3965 if (load_long(self) < 0)
3966 break;
3967 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003968
Tim Petersee1a53c2003-02-02 02:57:53 +00003969 case LONG1:
3970 if (load_counted_long(self, 1) < 0)
3971 break;
3972 continue;
3973
3974 case LONG4:
3975 if (load_counted_long(self, 4) < 0)
3976 break;
3977 continue;
3978
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003979 case FLOAT:
3980 if (load_float(self) < 0)
3981 break;
3982 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003984 case BINFLOAT:
3985 if (load_binfloat(self) < 0)
3986 break;
3987 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003988
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003989 case BINSTRING:
3990 if (load_binstring(self) < 0)
3991 break;
3992 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003994 case SHORT_BINSTRING:
3995 if (load_short_binstring(self) < 0)
3996 break;
3997 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003999 case STRING:
4000 if (load_string(self) < 0)
4001 break;
4002 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004003
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004004#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004005 case UNICODE:
4006 if (load_unicode(self) < 0)
4007 break;
4008 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004009
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004010 case BINUNICODE:
4011 if (load_binunicode(self) < 0)
4012 break;
4013 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004014#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004016 case EMPTY_TUPLE:
4017 if (load_empty_tuple(self) < 0)
4018 break;
4019 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004021 case TUPLE:
4022 if (load_tuple(self) < 0)
4023 break;
4024 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004026 case EMPTY_LIST:
4027 if (load_empty_list(self) < 0)
4028 break;
4029 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004031 case LIST:
4032 if (load_list(self) < 0)
4033 break;
4034 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004036 case EMPTY_DICT:
4037 if (load_empty_dict(self) < 0)
4038 break;
4039 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004040
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004041 case DICT:
4042 if (load_dict(self) < 0)
4043 break;
4044 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004046 case OBJ:
4047 if (load_obj(self) < 0)
4048 break;
4049 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004050
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004051 case INST:
4052 if (load_inst(self) < 0)
4053 break;
4054 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004056 case GLOBAL:
4057 if (load_global(self) < 0)
4058 break;
4059 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004061 case APPEND:
4062 if (load_append(self) < 0)
4063 break;
4064 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004066 case APPENDS:
4067 if (load_appends(self) < 0)
4068 break;
4069 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004071 case BUILD:
4072 if (load_build(self) < 0)
4073 break;
4074 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004076 case DUP:
4077 if (load_dup(self) < 0)
4078 break;
4079 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004081 case BINGET:
4082 if (load_binget(self) < 0)
4083 break;
4084 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004086 case LONG_BINGET:
4087 if (load_long_binget(self) < 0)
4088 break;
4089 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004091 case GET:
4092 if (load_get(self) < 0)
4093 break;
4094 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004096 case MARK:
4097 if (load_mark(self) < 0)
4098 break;
4099 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004101 case BINPUT:
4102 if (load_binput(self) < 0)
4103 break;
4104 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004106 case LONG_BINPUT:
4107 if (load_long_binput(self) < 0)
4108 break;
4109 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004111 case PUT:
4112 if (load_put(self) < 0)
4113 break;
4114 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004116 case POP:
4117 if (load_pop(self) < 0)
4118 break;
4119 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004121 case POP_MARK:
4122 if (load_pop_mark(self) < 0)
4123 break;
4124 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004126 case SETITEM:
4127 if (load_setitem(self) < 0)
4128 break;
4129 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004131 case SETITEMS:
4132 if (load_setitems(self) < 0)
4133 break;
4134 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004136 case STOP:
4137 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004139 case PERSID:
4140 if (load_persid(self) < 0)
4141 break;
4142 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004144 case BINPERSID:
4145 if (load_binpersid(self) < 0)
4146 break;
4147 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004148
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004149 case REDUCE:
4150 if (load_reduce(self) < 0)
4151 break;
4152 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004153
Tim Peters4190fb82003-02-02 16:09:05 +00004154 case PROTO:
4155 if (load_proto(self) < 0)
4156 break;
4157 continue;
4158
Tim Peters3c67d792003-02-02 17:59:11 +00004159 case NEWTRUE:
4160 if (load_bool(self, Py_True) < 0)
4161 break;
4162 continue;
4163
4164 case NEWFALSE:
4165 if (load_bool(self, Py_False) < 0)
4166 break;
4167 continue;
4168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004169 case '\0':
4170 /* end of file */
4171 PyErr_SetNone(PyExc_EOFError);
4172 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004174 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004175 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004176 "invalid load key, '%s'.",
4177 "c", s[0]);
4178 return NULL;
4179 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004181 break;
4182 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004184 if ((err = PyErr_Occurred())) {
4185 if (err == PyExc_EOFError) {
4186 PyErr_SetNone(PyExc_EOFError);
4187 }
4188 return NULL;
4189 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004190
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004191 PDATA_POP(self->stack, val);
4192 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004193}
Tim Peters84e87f32001-03-17 04:50:51 +00004194
Guido van Rossum60456fd1997-04-09 17:36:32 +00004195
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004196/* No-load functions to support noload, which is used to
4197 find persistent references. */
4198
4199static int
Tim Peterscba30e22003-02-01 06:24:36 +00004200noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004201{
4202 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004204 if ((i = marker(self)) < 0) return -1;
4205 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004206}
4207
4208
4209static int
Tim Peterscba30e22003-02-01 06:24:36 +00004210noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004211{
4212 int i;
4213 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004215 if ((i = marker(self)) < 0) return -1;
4216 Pdata_clear(self->stack, i);
4217 if ((*self->readline_func)(self, &s) < 0) return -1;
4218 if ((*self->readline_func)(self, &s) < 0) return -1;
4219 PDATA_APPEND(self->stack, Py_None,-1);
4220 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004221}
4222
4223static int
Tim Peterscba30e22003-02-01 06:24:36 +00004224noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004225{
4226 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004228 if ((*self->readline_func)(self, &s) < 0) return -1;
4229 if ((*self->readline_func)(self, &s) < 0) return -1;
4230 PDATA_APPEND(self->stack, Py_None,-1);
4231 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004232}
4233
4234static int
Tim Peterscba30e22003-02-01 06:24:36 +00004235noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004236{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004238 if (self->stack->length < 2) return stackUnderflow();
4239 Pdata_clear(self->stack, self->stack->length-2);
4240 PDATA_APPEND(self->stack, Py_None,-1);
4241 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004242}
4243
4244static int
4245noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004246
Guido van Rossum053b8df1998-11-25 16:18:00 +00004247 if (self->stack->length < 1) return stackUnderflow();
4248 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004249 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004250}
4251
4252
4253static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004254noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004255{
4256 PyObject *err = 0, *val = 0;
4257 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004259 self->num_marks = 0;
4260 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004261
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004262 while (1) {
4263 if ((*self->read_func)(self, &s, 1) < 0)
4264 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004265
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004266 switch (s[0]) {
4267 case NONE:
4268 if (load_none(self) < 0)
4269 break;
4270 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004272 case BININT:
4273 if (load_binint(self) < 0)
4274 break;
4275 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004277 case BININT1:
4278 if (load_binint1(self) < 0)
4279 break;
4280 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004282 case BININT2:
4283 if (load_binint2(self) < 0)
4284 break;
4285 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004287 case INT:
4288 if (load_int(self) < 0)
4289 break;
4290 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004292 case LONG:
4293 if (load_long(self) < 0)
4294 break;
4295 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004296
Tim Peters4190fb82003-02-02 16:09:05 +00004297 case LONG1:
4298 if (load_counted_long(self, 1) < 0)
4299 break;
4300 continue;
4301
4302 case LONG4:
4303 if (load_counted_long(self, 4) < 0)
4304 break;
4305 continue;
4306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004307 case FLOAT:
4308 if (load_float(self) < 0)
4309 break;
4310 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004312 case BINFLOAT:
4313 if (load_binfloat(self) < 0)
4314 break;
4315 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004317 case BINSTRING:
4318 if (load_binstring(self) < 0)
4319 break;
4320 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004322 case SHORT_BINSTRING:
4323 if (load_short_binstring(self) < 0)
4324 break;
4325 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004327 case STRING:
4328 if (load_string(self) < 0)
4329 break;
4330 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004331
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004332#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004333 case UNICODE:
4334 if (load_unicode(self) < 0)
4335 break;
4336 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004338 case BINUNICODE:
4339 if (load_binunicode(self) < 0)
4340 break;
4341 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004342#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004344 case EMPTY_TUPLE:
4345 if (load_empty_tuple(self) < 0)
4346 break;
4347 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004349 case TUPLE:
4350 if (load_tuple(self) < 0)
4351 break;
4352 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004353
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004354 case EMPTY_LIST:
4355 if (load_empty_list(self) < 0)
4356 break;
4357 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004359 case LIST:
4360 if (load_list(self) < 0)
4361 break;
4362 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004364 case EMPTY_DICT:
4365 if (load_empty_dict(self) < 0)
4366 break;
4367 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004369 case DICT:
4370 if (load_dict(self) < 0)
4371 break;
4372 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004374 case OBJ:
4375 if (noload_obj(self) < 0)
4376 break;
4377 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004379 case INST:
4380 if (noload_inst(self) < 0)
4381 break;
4382 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004384 case GLOBAL:
4385 if (noload_global(self) < 0)
4386 break;
4387 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004389 case APPEND:
4390 if (load_append(self) < 0)
4391 break;
4392 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004394 case APPENDS:
4395 if (load_appends(self) < 0)
4396 break;
4397 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004399 case BUILD:
4400 if (noload_build(self) < 0)
4401 break;
4402 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004404 case DUP:
4405 if (load_dup(self) < 0)
4406 break;
4407 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004409 case BINGET:
4410 if (load_binget(self) < 0)
4411 break;
4412 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004413
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004414 case LONG_BINGET:
4415 if (load_long_binget(self) < 0)
4416 break;
4417 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004419 case GET:
4420 if (load_get(self) < 0)
4421 break;
4422 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004424 case MARK:
4425 if (load_mark(self) < 0)
4426 break;
4427 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004429 case BINPUT:
4430 if (load_binput(self) < 0)
4431 break;
4432 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004434 case LONG_BINPUT:
4435 if (load_long_binput(self) < 0)
4436 break;
4437 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004439 case PUT:
4440 if (load_put(self) < 0)
4441 break;
4442 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004444 case POP:
4445 if (load_pop(self) < 0)
4446 break;
4447 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004449 case POP_MARK:
4450 if (load_pop_mark(self) < 0)
4451 break;
4452 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004454 case SETITEM:
4455 if (load_setitem(self) < 0)
4456 break;
4457 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004458
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004459 case SETITEMS:
4460 if (load_setitems(self) < 0)
4461 break;
4462 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004464 case STOP:
4465 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004467 case PERSID:
4468 if (load_persid(self) < 0)
4469 break;
4470 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004472 case BINPERSID:
4473 if (load_binpersid(self) < 0)
4474 break;
4475 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004477 case REDUCE:
4478 if (noload_reduce(self) < 0)
4479 break;
4480 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004481
Tim Peters4190fb82003-02-02 16:09:05 +00004482 case PROTO:
4483 if (load_proto(self) < 0)
4484 break;
4485 continue;
4486
Tim Peters3c67d792003-02-02 17:59:11 +00004487 case NEWTRUE:
4488 if (load_bool(self, Py_True) < 0)
4489 break;
4490 continue;
4491
4492 case NEWFALSE:
4493 if (load_bool(self, Py_False) < 0)
4494 break;
4495 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004496 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004497 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004498 "invalid load key, '%s'.",
4499 "c", s[0]);
4500 return NULL;
4501 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004503 break;
4504 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004506 if ((err = PyErr_Occurred())) {
4507 if (err == PyExc_EOFError) {
4508 PyErr_SetNone(PyExc_EOFError);
4509 }
4510 return NULL;
4511 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004513 PDATA_POP(self->stack, val);
4514 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004515}
Tim Peters84e87f32001-03-17 04:50:51 +00004516
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004517
Guido van Rossum60456fd1997-04-09 17:36:32 +00004518static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004519Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004520{
Tim Peterscba30e22003-02-01 06:24:36 +00004521 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004522 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004524 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004525}
4526
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004527static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004528Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004529{
Tim Peterscba30e22003-02-01 06:24:36 +00004530 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004531 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004533 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004534}
4535
Guido van Rossum60456fd1997-04-09 17:36:32 +00004536
4537static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004538 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004539 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004540 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004541 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004542 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004543 "noload() -- not load a pickle, but go through most of the motions\n"
4544 "\n"
4545 "This function can be used to read past a pickle without instantiating\n"
4546 "any objects or importing any modules. It can also be used to find all\n"
4547 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004548 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004549 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004550 {NULL, NULL} /* sentinel */
4551};
4552
4553
4554static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004555newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004556{
4557 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004558
Tim Peterscba30e22003-02-01 06:24:36 +00004559 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004560 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004562 self->file = NULL;
4563 self->arg = NULL;
4564 self->stack = (Pdata*)Pdata_New();
4565 self->pers_func = NULL;
4566 self->last_string = NULL;
4567 self->marks = NULL;
4568 self->num_marks = 0;
4569 self->marks_size = 0;
4570 self->buf_size = 0;
4571 self->read = NULL;
4572 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004573 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004574
Tim Peterscba30e22003-02-01 06:24:36 +00004575 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004576 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004578 Py_INCREF(f);
4579 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004581 /* Set read, readline based on type of f */
4582 if (PyFile_Check(f)) {
4583 self->fp = PyFile_AsFile(f);
4584 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004585 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004586 "I/O operation on closed file");
4587 goto err;
4588 }
4589 self->read_func = read_file;
4590 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004591 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004592 else if (PycStringIO_InputCheck(f)) {
4593 self->fp = NULL;
4594 self->read_func = read_cStringIO;
4595 self->readline_func = readline_cStringIO;
4596 }
4597 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004598
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004599 self->fp = NULL;
4600 self->read_func = read_other;
4601 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004603 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4604 (self->read = PyObject_GetAttr(f, read_str)))) {
4605 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004606 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004607 "argument must have 'read' and "
4608 "'readline' attributes" );
4609 goto err;
4610 }
4611 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004613 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004615 err:
4616 Py_DECREF((PyObject *)self);
4617 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004618}
4619
4620
4621static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004622get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004623{
4624 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004625
Tim Peterscba30e22003-02-01 06:24:36 +00004626 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004627 return NULL;
4628 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004629}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004630
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004631
Guido van Rossum60456fd1997-04-09 17:36:32 +00004632static void
Tim Peterscba30e22003-02-01 06:24:36 +00004633Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004634{
4635 Py_XDECREF(self->readline);
4636 Py_XDECREF(self->read);
4637 Py_XDECREF(self->file);
4638 Py_XDECREF(self->memo);
4639 Py_XDECREF(self->stack);
4640 Py_XDECREF(self->pers_func);
4641 Py_XDECREF(self->arg);
4642 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004644 if (self->marks) {
4645 free(self->marks);
4646 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004648 if (self->buf_size) {
4649 free(self->buf);
4650 }
Tim Peters84e87f32001-03-17 04:50:51 +00004651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004652 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004653}
4654
4655
4656static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004657Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004658{
4659 if (!strcmp(name, "persistent_load")) {
4660 if (!self->pers_func) {
4661 PyErr_SetString(PyExc_AttributeError, name);
4662 return NULL;
4663 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004665 Py_INCREF(self->pers_func);
4666 return self->pers_func;
4667 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004669 if (!strcmp(name, "find_global")) {
4670 if (!self->find_class) {
4671 PyErr_SetString(PyExc_AttributeError, name);
4672 return NULL;
4673 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004675 Py_INCREF(self->find_class);
4676 return self->find_class;
4677 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004679 if (!strcmp(name, "memo")) {
4680 if (!self->memo) {
4681 PyErr_SetString(PyExc_AttributeError, name);
4682 return NULL;
4683 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004685 Py_INCREF(self->memo);
4686 return self->memo;
4687 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004689 if (!strcmp(name, "UnpicklingError")) {
4690 Py_INCREF(UnpicklingError);
4691 return UnpicklingError;
4692 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004694 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004695}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004696
Guido van Rossum60456fd1997-04-09 17:36:32 +00004697
4698static int
Tim Peterscba30e22003-02-01 06:24:36 +00004699Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004700{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004702 if (!strcmp(name, "persistent_load")) {
4703 Py_XDECREF(self->pers_func);
4704 self->pers_func = value;
4705 Py_XINCREF(value);
4706 return 0;
4707 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004709 if (!strcmp(name, "find_global")) {
4710 Py_XDECREF(self->find_class);
4711 self->find_class = value;
4712 Py_XINCREF(value);
4713 return 0;
4714 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004716 if (! value) {
4717 PyErr_SetString(PyExc_TypeError,
4718 "attribute deletion is not supported");
4719 return -1;
4720 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004722 if (strcmp(name, "memo") == 0) {
4723 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00004724 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004725 "memo must be a dictionary");
4726 return -1;
4727 }
4728 Py_XDECREF(self->memo);
4729 self->memo = value;
4730 Py_INCREF(value);
4731 return 0;
4732 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004734 PyErr_SetString(PyExc_AttributeError, name);
4735 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004736}
4737
Tim Peters5bd2a792003-02-01 16:45:06 +00004738/* ---------------------------------------------------------------------------
4739 * Module-level functions.
4740 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004741
Tim Peters5bd2a792003-02-01 16:45:06 +00004742/* dump(obj, file, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004743static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004744cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004745{
4746 PyObject *ob, *file, *res = NULL;
4747 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004748 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004749
Tim Peters5bd2a792003-02-01 16:45:06 +00004750 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004751 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004752
Tim Peters5bd2a792003-02-01 16:45:06 +00004753 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004754 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004756 if (dump(pickler, ob) < 0)
4757 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004759 Py_INCREF(Py_None);
4760 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004762 finally:
4763 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004765 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004766}
4767
4768
Tim Peters5bd2a792003-02-01 16:45:06 +00004769/* dumps(obj, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004770static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004771cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004772{
4773 PyObject *ob, *file = 0, *res = NULL;
4774 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004775 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004776
Tim Peters5bd2a792003-02-01 16:45:06 +00004777 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004778 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004779
Tim Peterscba30e22003-02-01 06:24:36 +00004780 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004781 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004782
Tim Peters5bd2a792003-02-01 16:45:06 +00004783 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004784 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004786 if (dump(pickler, ob) < 0)
4787 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004789 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004791 finally:
4792 Py_XDECREF(pickler);
4793 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004795 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004796}
4797
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004798
Tim Peters5bd2a792003-02-01 16:45:06 +00004799/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004800static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004801cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004802{
4803 Unpicklerobject *unpickler = 0;
4804 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004805
Tim Peterscba30e22003-02-01 06:24:36 +00004806 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004807 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004808
Tim Peterscba30e22003-02-01 06:24:36 +00004809 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004810 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004812 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004814 finally:
4815 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004817 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004818}
4819
4820
Tim Peters5bd2a792003-02-01 16:45:06 +00004821/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004822static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004823cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004824{
4825 PyObject *ob, *file = 0, *res = NULL;
4826 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004827
Tim Peterscba30e22003-02-01 06:24:36 +00004828 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004829 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004830
Tim Peterscba30e22003-02-01 06:24:36 +00004831 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004832 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004833
Tim Peterscba30e22003-02-01 06:24:36 +00004834 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004835 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004837 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004839 finally:
4840 Py_XDECREF(file);
4841 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004843 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004844}
4845
4846
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004847PyDoc_STRVAR(Unpicklertype__doc__,
4848"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004849
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004850static PyTypeObject Unpicklertype = {
4851 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004852 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004853 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004854 sizeof(Unpicklerobject), /*tp_basicsize*/
4855 0, /*tp_itemsize*/
4856 /* methods */
4857 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4858 (printfunc)0, /*tp_print*/
4859 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4860 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4861 (cmpfunc)0, /*tp_compare*/
4862 (reprfunc)0, /*tp_repr*/
4863 0, /*tp_as_number*/
4864 0, /*tp_as_sequence*/
4865 0, /*tp_as_mapping*/
4866 (hashfunc)0, /*tp_hash*/
4867 (ternaryfunc)0, /*tp_call*/
4868 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004869
Guido van Rossum60456fd1997-04-09 17:36:32 +00004870 /* Space for future expansion */
4871 0L,0L,0L,0L,
4872 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004873};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004874
Guido van Rossum60456fd1997-04-09 17:36:32 +00004875static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004876 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004877 PyDoc_STR("dump(object, file, proto=0) -- "
4878 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004879 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004880 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004881 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004882
Neal Norwitzb0493252002-03-31 14:44:22 +00004883 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004884 PyDoc_STR("dumps(object, proto=0) -- "
4885 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004886 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004887 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004888 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004889
Neal Norwitzb0493252002-03-31 14:44:22 +00004890 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004891 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00004892
Neal Norwitzb0493252002-03-31 14:44:22 +00004893 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004894 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00004895
Neal Norwitzb0493252002-03-31 14:44:22 +00004896 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004897 PyDoc_STR("Pickler(file, proto=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004898 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004899 "This takes a file-like object for writing a pickle data stream.\n"
4900 "The optional proto argument tells the pickler to use the given\n"
4901 "protocol; supported protocols are 0, 1, 2. The default\n"
4902 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
4903 "only protocol that can be written to a file opened in text\n"
4904 "mode and read back successfully. When using a protocol higher\n"
4905 "than 0, make sure the file is opened in binary mode, both when\n"
4906 "pickling and unpickling.)\n"
4907 "\n"
4908 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
4909 "more efficient than protocol 1.\n"
4910 "\n"
4911 "Specifying a negative protocol version selects the highest\n"
4912 "protocol version supported. The higher the protocol used, the\n"
4913 "more recent the version of Python needed to read the pickle\n"
4914 "produced.\n"
4915 "\n"
4916 "The file parameter must have a write() method that accepts a single\n"
4917 "string argument. It can thus be an open file object, a StringIO\n"
4918 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004919 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004920
Neal Norwitzb0493252002-03-31 14:44:22 +00004921 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004922 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
4923
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004924 { NULL, NULL }
4925};
4926
Guido van Rossum60456fd1997-04-09 17:36:32 +00004927static int
Tim Peterscba30e22003-02-01 06:24:36 +00004928init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004929{
4930 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004931
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004932#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004934 INIT_STR(__class__);
4935 INIT_STR(__getinitargs__);
4936 INIT_STR(__dict__);
4937 INIT_STR(__getstate__);
4938 INIT_STR(__setstate__);
4939 INIT_STR(__name__);
4940 INIT_STR(__main__);
4941 INIT_STR(__reduce__);
4942 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004943 INIT_STR(append);
4944 INIT_STR(read);
4945 INIT_STR(readline);
4946 INIT_STR(copy_reg);
4947 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004948 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004949
Tim Peterscba30e22003-02-01 06:24:36 +00004950 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004951 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004952
Tim Peters1f1b2d22003-02-01 02:16:37 +00004953 /* This is special because we want to use a different
4954 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004955 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peterscba30e22003-02-01 06:24:36 +00004956 if (!dispatch_table)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004957 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004959 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004960
Tim Peterscba30e22003-02-01 06:24:36 +00004961 if (!( empty_tuple = PyTuple_New(0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004962 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004964 /* Ugh */
4965 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4966 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4967 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004969 if (!( t=PyDict_New())) return -1;
4970 if (!( r=PyRun_String(
4971 "def __init__(self, *args): self.args=args\n\n"
4972 "def __str__(self):\n"
4973 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4974 Py_file_input,
4975 module_dict, t) )) return -1;
4976 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004977
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004978 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00004979 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004980 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004982 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004983
Tim Peterscba30e22003-02-01 06:24:36 +00004984 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004985 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00004986 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004987 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004988
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004989 if (!( t=PyDict_New())) return -1;
4990 if (!( r=PyRun_String(
4991 "def __init__(self, *args): self.args=args\n\n"
4992 "def __str__(self):\n"
4993 " a=self.args\n"
4994 " a=a and type(a[0]) or '(what)'\n"
4995 " return 'Cannot pickle %s objects' % a\n"
4996 , Py_file_input,
4997 module_dict, t) )) return -1;
4998 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005000 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005001 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005002 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005004 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005005
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005006 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005007 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005008 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005009
Martin v. Löwis658009a2002-09-16 17:26:24 +00005010 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5011 UnpicklingError, NULL)))
5012 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005014 if (PyDict_SetItemString(module_dict, "PickleError",
5015 PickleError) < 0)
5016 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005018 if (PyDict_SetItemString(module_dict, "PicklingError",
5019 PicklingError) < 0)
5020 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005021
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005022 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5023 UnpicklingError) < 0)
5024 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005026 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5027 UnpickleableError) < 0)
5028 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005030 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5031 BadPickleGet) < 0)
5032 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005034 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005036 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005037}
5038
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005039#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5040#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005041#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005042PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005043initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005044{
5045 PyObject *m, *d, *di, *v, *k;
5046 int i;
5047 char *rev="1.71";
5048 PyObject *format_version;
5049 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005050
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005051 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005052 Unpicklertype.ob_type = &PyType_Type;
5053 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005055 /* Initialize some pieces. We need to do this before module creation,
5056 so we're forced to use a temporary dictionary. :(
5057 */
5058 di=PyDict_New();
5059 if (!di) return;
5060 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005062 /* Create the module and add the functions */
5063 m = Py_InitModule4("cPickle", cPickle_methods,
5064 cPickle_module_documentation,
5065 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005067 /* Add some symbolic constants to the module */
5068 d = PyModule_GetDict(m);
5069 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
5070 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005072 /* Copy data from di. Waaa. */
5073 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5074 if (PyObject_SetItem(d, k, v) < 0) {
5075 Py_DECREF(di);
5076 return;
5077 }
5078 }
5079 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005081 format_version = PyString_FromString("1.3");
5082 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005084 PyDict_SetItemString(d, "format_version", format_version);
5085 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5086 Py_XDECREF(format_version);
5087 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005088}