blob: 14542488a8d6ae7d675f0142aeacf0d7a6decbe1 [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
Tim Peters0bc93f52003-02-02 18:29:33 +0000689 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000690 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
Tim Peters0bc93f52003-02-02 18:29:33 +0000773 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000774 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;
Tim Peters0bc93f52003-02-02 18:29:33 +0000953 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000954 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);
Tim Peters0bc93f52003-02-02 18:29:33 +0000994 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000995 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
Tim Peters0bc93f52003-02-02 18:29:33 +00001019 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001020 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
Tim Peters0bc93f52003-02-02 18:29:33 +00001123 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001124 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001125
Tim Peters0bc93f52003-02-02 18:29:33 +00001126 if (self->write_func(self,
1127 PyString_AS_STRING((PyStringObject *)repr),
1128 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001129 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001130
Tim Peters0bc93f52003-02-02 18:29:33 +00001131 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001132 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
Tim Peters0bc93f52003-02-02 18:29:33 +00001235 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001236 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
Tim Peters0bc93f52003-02-02 18:29:33 +00001243 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001244 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
Tim Peters0bc93f52003-02-02 18:29:33 +00001272 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001273 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001274
Tim Peters0bc93f52003-02-02 18:29:33 +00001275 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001276 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001277
Tim Peters0bc93f52003-02-02 18:29:33 +00001278 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001279 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
Tim Peters0bc93f52003-02-02 18:29:33 +00001302 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001303 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 {
Tim Peters0bc93f52003-02-02 18:29:33 +00001310 if (self->write_func(self,
1311 PyString_AS_STRING(
1312 (PyStringObject *)args),
1313 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001314 return -1;
1315 }
1316 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001318 if (doput)
1319 if (put(self, args) < 0)
1320 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001322 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001324 err:
1325 Py_XDECREF(repr);
1326 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001327}
1328
1329
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001330#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001331/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1332 backslash and newline characters to \uXXXX escapes. */
1333static PyObject *
1334modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1335{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001336 PyObject *repr;
1337 char *p;
1338 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001340 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001342 repr = PyString_FromStringAndSize(NULL, 6 * size);
1343 if (repr == NULL)
1344 return NULL;
1345 if (size == 0)
1346 return repr;
1347
1348 p = q = PyString_AS_STRING(repr);
1349 while (size-- > 0) {
1350 Py_UNICODE ch = *s++;
1351 /* Map 16-bit characters to '\uxxxx' */
1352 if (ch >= 256 || ch == '\\' || ch == '\n') {
1353 *p++ = '\\';
1354 *p++ = 'u';
1355 *p++ = hexdigit[(ch >> 12) & 0xf];
1356 *p++ = hexdigit[(ch >> 8) & 0xf];
1357 *p++ = hexdigit[(ch >> 4) & 0xf];
1358 *p++ = hexdigit[ch & 15];
1359 }
1360 /* Copy everything else as-is */
1361 else
1362 *p++ = (char) ch;
1363 }
1364 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001365 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001366 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001367}
1368
1369
Guido van Rossum60456fd1997-04-09 17:36:32 +00001370static int
Tim Peterscba30e22003-02-01 06:24:36 +00001371save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001372{
1373 int size, len;
1374 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001376 if (!PyUnicode_Check(args))
1377 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001379 if (!self->bin) {
1380 char *repr_str;
1381 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001383 repr = modified_EncodeRawUnicodeEscape(
1384 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001385 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001386 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001387
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001388 if ((len = PyString_Size(repr)) < 0)
1389 goto err;
1390 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001391
Tim Peters0bc93f52003-02-02 18:29:33 +00001392 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001393 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001394
Tim Peters0bc93f52003-02-02 18:29:33 +00001395 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001396 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001397
Tim Peters0bc93f52003-02-02 18:29:33 +00001398 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001399 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001401 Py_XDECREF(repr);
1402 }
1403 else {
1404 int i;
1405 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001406
Tim Peterscba30e22003-02-01 06:24:36 +00001407 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001408 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001410 if ((size = PyString_Size(repr)) < 0)
1411 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001413 c_str[0] = BINUNICODE;
1414 for (i = 1; i < 5; i++)
1415 c_str[i] = (int)(size >> ((i - 1) * 8));
1416 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001417
Tim Peters0bc93f52003-02-02 18:29:33 +00001418 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001419 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001421 if (size > 128 && Pdata_Check(self->file)) {
1422 if (write_other(self, NULL, 0) < 0)
1423 goto err;
1424 PDATA_APPEND(self->file, repr, -1);
1425 }
1426 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001427 if (self->write_func(self, PyString_AS_STRING(repr),
1428 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001429 goto err;
1430 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001432 Py_DECREF(repr);
1433 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001435 if (doput)
1436 if (put(self, args) < 0)
1437 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001439 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001441 err:
1442 Py_XDECREF(repr);
1443 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001444}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001445#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001446
1447
1448static int
Tim Peterscba30e22003-02-01 06:24:36 +00001449save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001450{
1451 PyObject *element = 0, *py_tuple_id = 0;
1452 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001454 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001455
Tim Peters0bc93f52003-02-02 18:29:33 +00001456 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001457 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001458
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001459 if ((len = PyTuple_Size(args)) < 0)
1460 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001462 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001463 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001464 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001466 if (save(self, element, 0) < 0)
1467 goto finally;
1468 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001469
Tim Peterscba30e22003-02-01 06:24:36 +00001470 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001471 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001473 if (len) {
1474 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1475 if (self->bin) {
1476 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001477
Tim Peters0bc93f52003-02-02 18:29:33 +00001478 if (self->write_func(self, &pop_mark, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001479 goto finally;
1480 }
1481 else {
1482 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001484 for (i = 0; i <= len; i++) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001485 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001486 goto finally;
1487 }
1488 }
Tim Peters84e87f32001-03-17 04:50:51 +00001489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001490 if (get(self, py_tuple_id) < 0)
1491 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001493 res = 0;
1494 goto finally;
1495 }
1496 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001497
Tim Peters0bc93f52003-02-02 18:29:33 +00001498 if (self->write_func(self, &tuple, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001499 goto finally;
1500 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001502 if (put(self, args) < 0)
1503 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001505 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001507 finally:
1508 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001510 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001511}
1512
1513static int
Tim Peterscba30e22003-02-01 06:24:36 +00001514save_empty_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001515{
1516 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001517
Tim Peters0bc93f52003-02-02 18:29:33 +00001518 return self->write_func(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001519}
1520
1521
1522static int
Tim Peterscba30e22003-02-01 06:24:36 +00001523save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001524{
1525 PyObject *element = 0;
1526 int s_len, len, i, using_appends, res = -1;
1527 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001529 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001531 if (self->fast && !fast_save_enter(self, args))
1532 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001534 if (self->bin) {
1535 s[0] = EMPTY_LIST;
1536 s_len = 1;
1537 }
1538 else {
1539 s[0] = MARK;
1540 s[1] = LIST;
1541 s_len = 2;
1542 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001544 if ((len = PyList_Size(args)) < 0)
1545 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001546
Tim Peters0bc93f52003-02-02 18:29:33 +00001547 if (self->write_func(self, s, s_len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001548 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001550 if (len == 0) {
1551 if (put(self, args) < 0)
1552 goto finally;
1553 }
1554 else {
1555 if (put2(self, args) < 0)
1556 goto finally;
1557 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001559 if ((using_appends = (self->bin && (len > 1))))
Tim Peters0bc93f52003-02-02 18:29:33 +00001560 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001561 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001563 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001564 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001565 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001567 if (save(self, element, 0) < 0)
1568 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001570 if (!using_appends) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001571 if (self->write_func(self, &append, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001572 goto finally;
1573 }
1574 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001576 if (using_appends) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001577 if (self->write_func(self, &appends, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001578 goto finally;
1579 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001581 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001583 finally:
1584 if (self->fast && !fast_save_leave(self, args))
1585 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001587 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001588}
1589
1590
Guido van Rossum60456fd1997-04-09 17:36:32 +00001591static int
Tim Peterscba30e22003-02-01 06:24:36 +00001592save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001593{
1594 PyObject *key = 0, *value = 0;
1595 int i, len, res = -1, using_setitems;
1596 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001598 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001600 if (self->fast && !fast_save_enter(self, args))
1601 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001603 if (self->bin) {
1604 s[0] = EMPTY_DICT;
1605 len = 1;
1606 }
1607 else {
1608 s[0] = MARK;
1609 s[1] = DICT;
1610 len = 2;
1611 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001612
Tim Peters0bc93f52003-02-02 18:29:33 +00001613 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001614 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001616 if ((len = PyDict_Size(args)) < 0)
1617 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001619 if (len == 0) {
1620 if (put(self, args) < 0)
1621 goto finally;
1622 }
1623 else {
1624 if (put2(self, args) < 0)
1625 goto finally;
1626 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001628 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
Tim Peters0bc93f52003-02-02 18:29:33 +00001629 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001630 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001632 i = 0;
1633 while (PyDict_Next(args, &i, &key, &value)) {
1634 if (save(self, key, 0) < 0)
1635 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001637 if (save(self, value, 0) < 0)
1638 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001640 if (!using_setitems) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001641 if (self->write_func(self, &setitem, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001642 goto finally;
1643 }
1644 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001646 if (using_setitems) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001647 if (self->write_func(self, &setitems, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001648 goto finally;
1649 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001651 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001653 finally:
1654 if (self->fast && !fast_save_leave(self, args))
1655 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001657 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001658}
1659
1660
Tim Peters84e87f32001-03-17 04:50:51 +00001661static int
Tim Peterscba30e22003-02-01 06:24:36 +00001662save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001663{
1664 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1665 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1666 char *module_str, *name_str;
1667 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001669 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001671 if (self->fast && !fast_save_enter(self, args))
1672 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001673
Tim Peters0bc93f52003-02-02 18:29:33 +00001674 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001675 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001676
Tim Peterscba30e22003-02-01 06:24:36 +00001677 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001678 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001680 if (self->bin) {
1681 if (save(self, class, 0) < 0)
1682 goto finally;
1683 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001685 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1686 PyObject *element = 0;
1687 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001689 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001690 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001691 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001693 if ((len = PyObject_Size(class_args)) < 0)
1694 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001696 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001697 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001698 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001700 if (save(self, element, 0) < 0) {
1701 Py_DECREF(element);
1702 goto finally;
1703 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001705 Py_DECREF(element);
1706 }
1707 }
1708 else {
1709 PyErr_Clear();
1710 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001712 if (!self->bin) {
1713 if (!( name = ((PyClassObject *)class)->cl_name )) {
1714 PyErr_SetString(PicklingError, "class has no name");
1715 goto finally;
1716 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001717
Tim Peterscba30e22003-02-01 06:24:36 +00001718 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001719 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001720
Tim Peters84e87f32001-03-17 04:50:51 +00001721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001722 if ((module_size = PyString_Size(module)) < 0 ||
1723 (name_size = PyString_Size(name)) < 0)
1724 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001726 module_str = PyString_AS_STRING((PyStringObject *)module);
1727 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001728
Tim Peters0bc93f52003-02-02 18:29:33 +00001729 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001730 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001731
Tim Peters0bc93f52003-02-02 18:29:33 +00001732 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001733 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001734
Tim Peters0bc93f52003-02-02 18:29:33 +00001735 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001736 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001737
Tim Peters0bc93f52003-02-02 18:29:33 +00001738 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001739 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001740
Tim Peters0bc93f52003-02-02 18:29:33 +00001741 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001742 goto finally;
1743 }
Tim Peters0bc93f52003-02-02 18:29:33 +00001744 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001745 goto finally;
1746 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001747
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001748 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1749 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001750 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001751 goto finally;
1752 }
1753 else {
1754 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001756 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1757 PyErr_Clear();
1758 res = 0;
1759 goto finally;
1760 }
1761 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001763 if (!PyDict_Check(state)) {
1764 if (put2(self, args) < 0)
1765 goto finally;
1766 }
1767 else {
1768 if (put(self, args) < 0)
1769 goto finally;
1770 }
Tim Peters84e87f32001-03-17 04:50:51 +00001771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001772 if (save(self, state, 0) < 0)
1773 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001774
Tim Peters0bc93f52003-02-02 18:29:33 +00001775 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001776 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001778 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001780 finally:
1781 if (self->fast && !fast_save_leave(self, args))
1782 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001784 Py_XDECREF(module);
1785 Py_XDECREF(class);
1786 Py_XDECREF(state);
1787 Py_XDECREF(getinitargs_func);
1788 Py_XDECREF(getstate_func);
1789 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001791 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001792}
1793
1794
Guido van Rossum60456fd1997-04-09 17:36:32 +00001795static int
Tim Peterscba30e22003-02-01 06:24:36 +00001796save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001797{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001798 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001799 char *name_str, *module_str;
1800 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001802 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001804 if (name) {
1805 global_name = name;
1806 Py_INCREF(global_name);
1807 }
1808 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001809 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001810 goto finally;
1811 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001812
Tim Peterscba30e22003-02-01 06:24:36 +00001813 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001814 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001816 if ((module_size = PyString_Size(module)) < 0 ||
1817 (name_size = PyString_Size(global_name)) < 0)
1818 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001820 module_str = PyString_AS_STRING((PyStringObject *)module);
1821 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001822
Guido van Rossum75bfd052002-12-24 18:10:07 +00001823 /* XXX This can be doing a relative import. Clearly it shouldn't,
1824 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001825 mod = PyImport_ImportModule(module_str);
1826 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001827 cPickle_ErrFormat(PicklingError,
1828 "Can't pickle %s: it's not found as %s.%s",
1829 "OSS", args, module, global_name);
1830 goto finally;
1831 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001832 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001833 if (klass == NULL) {
1834 cPickle_ErrFormat(PicklingError,
1835 "Can't pickle %s: it's not found as %s.%s",
1836 "OSS", args, module, global_name);
1837 goto finally;
1838 }
1839 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001840 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001841 cPickle_ErrFormat(PicklingError,
1842 "Can't pickle %s: it's not the same object as %s.%s",
1843 "OSS", args, module, global_name);
1844 goto finally;
1845 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001846 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001847
Tim Peters0bc93f52003-02-02 18:29:33 +00001848 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001849 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001850
Tim Peters0bc93f52003-02-02 18:29:33 +00001851 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001852 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001853
Tim Peters0bc93f52003-02-02 18:29:33 +00001854 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001855 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001856
Tim Peters0bc93f52003-02-02 18:29:33 +00001857 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001858 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001859
Tim Peters0bc93f52003-02-02 18:29:33 +00001860 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001861 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001863 if (put(self, args) < 0)
1864 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001866 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001868 finally:
1869 Py_XDECREF(module);
1870 Py_XDECREF(global_name);
1871 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001873 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001874}
1875
Guido van Rossum60456fd1997-04-09 17:36:32 +00001876static int
Tim Peterscba30e22003-02-01 06:24:36 +00001877save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001878{
1879 PyObject *pid = 0;
1880 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001882 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001884 Py_INCREF(args);
1885 ARG_TUP(self, args);
1886 if (self->arg) {
1887 pid = PyObject_Call(f, self->arg, NULL);
1888 FREE_ARG_TUP(self);
1889 }
1890 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001892 if (pid != Py_None) {
1893 if (!self->bin) {
1894 if (!PyString_Check(pid)) {
1895 PyErr_SetString(PicklingError,
1896 "persistent id must be string");
1897 goto finally;
1898 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001899
Tim Peters0bc93f52003-02-02 18:29:33 +00001900 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001901 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001902
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001903 if ((size = PyString_Size(pid)) < 0)
1904 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001905
Tim Peters0bc93f52003-02-02 18:29:33 +00001906 if (self->write_func(self,
1907 PyString_AS_STRING(
1908 (PyStringObject *)pid),
1909 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001910 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001911
Tim Peters0bc93f52003-02-02 18:29:33 +00001912 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001913 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001915 res = 1;
1916 goto finally;
1917 }
1918 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001919 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001920 res = -1;
1921 else
1922 res = 1;
1923 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001925 goto finally;
1926 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001928 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001930 finally:
1931 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001932
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001933 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001934}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001935
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001936
Tim Peters84e87f32001-03-17 04:50:51 +00001937static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001938save_reduce(Picklerobject *self, PyObject *callable,
Tim Peterscba30e22003-02-01 06:24:36 +00001939 PyObject *tup, PyObject *state, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001940{
1941 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001943 if (save(self, callable, 0) < 0)
1944 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001946 if (save(self, tup, 0) < 0)
1947 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001948
Tim Peters0bc93f52003-02-02 18:29:33 +00001949 if (self->write_func(self, &reduce, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001950 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001952 if (ob != NULL) {
1953 if (state && !PyDict_Check(state)) {
1954 if (put2(self, ob) < 0)
1955 return -1;
1956 }
1957 else {
1958 if (put(self, ob) < 0)
1959 return -1;
1960 }
1961 }
Tim Peters84e87f32001-03-17 04:50:51 +00001962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001963 if (state) {
1964 if (save(self, state, 0) < 0)
1965 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001966
Tim Peters0bc93f52003-02-02 18:29:33 +00001967 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001968 return -1;
1969 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001970
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001971 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001972}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001973
Guido van Rossum60456fd1997-04-09 17:36:32 +00001974static int
Tim Peterscba30e22003-02-01 06:24:36 +00001975save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001976{
1977 PyTypeObject *type;
1978 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1979 *callable = 0, *state = 0;
1980 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001981
Martin v. Löwis5a395302002-08-04 08:20:23 +00001982 if (self->nesting++ > Py_GetRecursionLimit()){
1983 PyErr_SetString(PyExc_RuntimeError,
1984 "maximum recursion depth exceeded");
1985 goto finally;
1986 }
1987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001988 if (!pers_save && self->pers_func) {
1989 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1990 res = tmp;
1991 goto finally;
1992 }
1993 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001995 if (args == Py_None) {
1996 res = save_none(self, args);
1997 goto finally;
1998 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002000 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002002 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002003 case 'b':
2004 if (args == Py_False || args == Py_True) {
2005 res = save_bool(self, args);
2006 goto finally;
2007 }
2008 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002009 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002010 if (type == &PyInt_Type) {
2011 res = save_int(self, args);
2012 goto finally;
2013 }
2014 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002015
Guido van Rossum60456fd1997-04-09 17:36:32 +00002016 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002017 if (type == &PyLong_Type) {
2018 res = save_long(self, args);
2019 goto finally;
2020 }
2021 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002022
Guido van Rossum60456fd1997-04-09 17:36:32 +00002023 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002024 if (type == &PyFloat_Type) {
2025 res = save_float(self, args);
2026 goto finally;
2027 }
2028 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002029
Guido van Rossum60456fd1997-04-09 17:36:32 +00002030 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002031 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
2032 if (self->bin) res = save_empty_tuple(self, args);
2033 else res = save_tuple(self, args);
2034 goto finally;
2035 }
2036 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002037
Guido van Rossum60456fd1997-04-09 17:36:32 +00002038 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002039 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2040 res = save_string(self, args, 0);
2041 goto finally;
2042 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002043
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002044#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002045 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002046 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2047 res = save_unicode(self, args, 0);
2048 goto finally;
2049 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002050#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002051 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002053 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002054 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002055 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002057 if (PyDict_GetItem(self->memo, py_ob_id)) {
2058 if (get(self, py_ob_id) < 0)
2059 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002061 res = 0;
2062 goto finally;
2063 }
2064 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002066 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002067 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002068 if (type == &PyString_Type) {
2069 res = save_string(self, args, 1);
2070 goto finally;
2071 }
2072 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002073
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002074#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002075 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002076 if (type == &PyUnicode_Type) {
2077 res = save_unicode(self, args, 1);
2078 goto finally;
2079 }
2080 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002081#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002082
Guido van Rossum60456fd1997-04-09 17:36:32 +00002083 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002084 if (type == &PyTuple_Type) {
2085 res = save_tuple(self, args);
2086 goto finally;
2087 }
2088 if (type == &PyType_Type) {
2089 res = save_global(self, args, NULL);
2090 goto finally;
2091 }
2092 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002093
Guido van Rossum60456fd1997-04-09 17:36:32 +00002094 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002095 if (type == &PyList_Type) {
2096 res = save_list(self, args);
2097 goto finally;
2098 }
2099 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002100
2101 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002102 if (type == &PyDict_Type) {
2103 res = save_dict(self, args);
2104 goto finally;
2105 }
2106 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002107
2108 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002109 if (type == &PyInstance_Type) {
2110 res = save_inst(self, args);
2111 goto finally;
2112 }
2113 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002114
2115 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002116 if (type == &PyClass_Type) {
2117 res = save_global(self, args, NULL);
2118 goto finally;
2119 }
2120 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002121
2122 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002123 if (type == &PyFunction_Type) {
2124 res = save_global(self, args, NULL);
2125 goto finally;
2126 }
2127 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002128
2129 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002130 if (type == &PyCFunction_Type) {
2131 res = save_global(self, args, NULL);
2132 goto finally;
2133 }
2134 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002136 if (!pers_save && self->inst_pers_func) {
2137 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2138 res = tmp;
2139 goto finally;
2140 }
2141 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002142
Jeremy Hylton39c61162002-07-16 19:47:43 +00002143 if (PyType_IsSubtype(type, &PyType_Type)) {
2144 res = save_global(self, args, NULL);
2145 goto finally;
2146 }
2147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002148 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2149 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002150
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002151 Py_INCREF(args);
2152 ARG_TUP(self, args);
2153 if (self->arg) {
2154 t = PyObject_Call(__reduce__, self->arg, NULL);
2155 FREE_ARG_TUP(self);
2156 }
2157 if (! t) goto finally;
2158 }
2159 else {
2160 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002162 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2163 t = PyObject_Call(__reduce__, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002164 if (!t)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002165 goto finally;
2166 }
2167 else {
2168 PyErr_Clear();
2169 }
2170 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002172 if (t) {
2173 if (PyString_Check(t)) {
2174 res = save_global(self, args, t);
2175 goto finally;
2176 }
Tim Peters84e87f32001-03-17 04:50:51 +00002177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002178 if (!PyTuple_Check(t)) {
2179 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2180 "be a tuple", "O", __reduce__);
2181 goto finally;
2182 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002184 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002186 if ((size != 3) && (size != 2)) {
2187 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2188 "contain only two or three elements", "O", __reduce__);
2189 goto finally;
2190 }
Tim Peters84e87f32001-03-17 04:50:51 +00002191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002192 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002194 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002196 if (size > 2) {
2197 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002198 if (state == Py_None)
2199 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002200 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002202 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2203 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2204 "returned by %s must be a tuple", "O", __reduce__);
2205 goto finally;
2206 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002208 res = save_reduce(self, callable, arg_tup, state, args);
2209 goto finally;
2210 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002212 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002214 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002215 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002216 Py_XDECREF(py_ob_id);
2217 Py_XDECREF(__reduce__);
2218 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002220 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002221}
2222
2223
2224static int
Tim Peterscba30e22003-02-01 06:24:36 +00002225dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002226{
2227 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002228
Tim Peters4190fb82003-02-02 16:09:05 +00002229 if (self->proto >= 2) {
2230 char bytes[2];
2231
2232 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002233 assert(self->proto >= 0 && self->proto < 256);
2234 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002235 if (self->write_func(self, bytes, 2) < 0)
2236 return -1;
2237 }
2238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002239 if (save(self, args, 0) < 0)
2240 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002241
Tim Peters4190fb82003-02-02 16:09:05 +00002242 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002243 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002244
Tim Peters4190fb82003-02-02 16:09:05 +00002245 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002246 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002248 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002249}
2250
2251static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002252Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002253{
Tim Peterscba30e22003-02-01 06:24:36 +00002254 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002255 PyDict_Clear(self->memo);
2256 Py_INCREF(Py_None);
2257 return Py_None;
2258}
2259
2260static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002261Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002262{
2263 int l, i, rsize, ssize, clear=1, lm;
2264 long ik;
2265 PyObject *k, *r;
2266 char *s, *p, *have_get;
2267 Pdata *data;
2268
2269 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002270 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002271 return NULL;
2272
2273 /* Check to make sure we are based on a list */
2274 if (! Pdata_Check(self->file)) {
2275 PyErr_SetString(PicklingError,
2276 "Attempt to getvalue() a non-list-based pickler");
2277 return NULL;
2278 }
2279
2280 /* flush write buffer */
2281 if (write_other(self, NULL, 0) < 0) return NULL;
2282
2283 data=(Pdata*)self->file;
2284 l=data->length;
2285
2286 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002287 lm = PyDict_Size(self->memo);
2288 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002289 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002290 have_get = malloc(lm);
2291 if (have_get == NULL) return PyErr_NoMemory();
2292 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002293
2294 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002295 for (rsize = 0, i = l; --i >= 0; ) {
2296 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002297
Tim Petersac5687a2003-02-02 18:08:34 +00002298 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002299 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002300
2301 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002302 ik = PyInt_AS_LONG((PyIntObject*)k);
2303 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002304 PyErr_SetString(PicklingError,
2305 "Invalid get data");
2306 return NULL;
2307 }
Tim Petersac5687a2003-02-02 18:08:34 +00002308 if (have_get[ik]) /* with matching get */
2309 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002310 }
2311
2312 else if (! (PyTuple_Check(k) &&
2313 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002314 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002315 ) {
2316 PyErr_SetString(PicklingError,
2317 "Unexpected data in internal list");
2318 return NULL;
2319 }
2320
2321 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002322 ik = PyInt_AS_LONG((PyIntObject *)k);
2323 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002324 PyErr_SetString(PicklingError,
2325 "Invalid get data");
2326 return NULL;
2327 }
Tim Petersac5687a2003-02-02 18:08:34 +00002328 have_get[ik] = 1;
2329 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002330 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002331 }
2332
2333 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002334 r = PyString_FromStringAndSize(NULL, rsize);
2335 if (r == NULL) goto err;
2336 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002337
Tim Petersac5687a2003-02-02 18:08:34 +00002338 for (i = 0; i < l; i++) {
2339 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002340
2341 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002342 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002343 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002344 p=PyString_AS_STRING((PyStringObject *)k);
2345 while (--ssize >= 0)
2346 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002347 }
2348 }
2349
2350 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002351 ik = PyInt_AS_LONG((PyIntObject *)
2352 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002353 if (ik < 256) {
2354 *s++ = BINGET;
2355 *s++ = (int)(ik & 0xff);
2356 }
2357 else {
2358 *s++ = LONG_BINGET;
2359 *s++ = (int)(ik & 0xff);
2360 *s++ = (int)((ik >> 8) & 0xff);
2361 *s++ = (int)((ik >> 16) & 0xff);
2362 *s++ = (int)((ik >> 24) & 0xff);
2363 }
2364 }
2365
2366 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002367 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002368
2369 if (have_get[ik]) { /* with matching get */
2370 if (ik < 256) {
2371 *s++ = BINPUT;
2372 *s++ = (int)(ik & 0xff);
2373 }
2374 else {
2375 *s++ = LONG_BINPUT;
2376 *s++ = (int)(ik & 0xff);
2377 *s++ = (int)((ik >> 8) & 0xff);
2378 *s++ = (int)((ik >> 16) & 0xff);
2379 *s++ = (int)((ik >> 24) & 0xff);
2380 }
2381 }
2382 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002383 }
2384
2385 if (clear) {
2386 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002387 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002388 }
2389
2390 free(have_get);
2391 return r;
2392 err:
2393 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002394 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002395}
2396
2397static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002398Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002399{
2400 PyObject *ob;
2401 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002402
Tim Peterscba30e22003-02-01 06:24:36 +00002403 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002404 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002406 if (dump(self, ob) < 0)
2407 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002409 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002411 /* XXX Why does dump() return self? */
2412 Py_INCREF(self);
2413 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002414}
2415
2416
Tim Peterscba30e22003-02-01 06:24:36 +00002417static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002418{
Neal Norwitzb0493252002-03-31 14:44:22 +00002419 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002420 PyDoc_STR("dump(object) -- "
2421 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002422 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002423 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002424 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002425 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002426 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002427};
2428
2429
2430static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002431newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002432{
2433 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002434
Tim Peters5bd2a792003-02-01 16:45:06 +00002435 if (proto < 0)
2436 proto = CURRENT_PROTOCOL_NUMBER;
2437 if (proto > CURRENT_PROTOCOL_NUMBER) {
2438 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2439 "the highest available protocol is %d",
2440 proto, CURRENT_PROTOCOL_NUMBER);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002441 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002442 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002443
Tim Peters5bd2a792003-02-01 16:45:06 +00002444 self = PyObject_New(Picklerobject, &Picklertype);
2445 if (self == NULL)
2446 return NULL;
2447 self->proto = proto;
2448 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002449 self->fp = NULL;
2450 self->write = NULL;
2451 self->memo = NULL;
2452 self->arg = NULL;
2453 self->pers_func = NULL;
2454 self->inst_pers_func = NULL;
2455 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002456 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002457 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002458 self->fast_container = 0;
2459 self->fast_memo = NULL;
2460 self->buf_size = 0;
2461 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002462
Tim Peters5bd2a792003-02-01 16:45:06 +00002463 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002464 if (file)
2465 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002466 else {
2467 file = Pdata_New();
2468 if (file == NULL)
2469 goto err;
2470 }
2471 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002472
Tim Peterscba30e22003-02-01 06:24:36 +00002473 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002474 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002476 if (PyFile_Check(file)) {
2477 self->fp = PyFile_AsFile(file);
2478 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002479 PyErr_SetString(PyExc_ValueError,
2480 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002481 goto err;
2482 }
2483 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002484 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002485 else if (PycStringIO_OutputCheck(file)) {
2486 self->write_func = write_cStringIO;
2487 }
2488 else if (file == Py_None) {
2489 self->write_func = write_none;
2490 }
2491 else {
2492 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002494 if (! Pdata_Check(file)) {
2495 self->write = PyObject_GetAttr(file, write_str);
2496 if (!self->write) {
2497 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002498 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002499 "argument must have 'write' "
2500 "attribute");
2501 goto err;
2502 }
2503 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002504
Tim Peters5bd2a792003-02-01 16:45:06 +00002505 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2506 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002507 PyErr_NoMemory();
2508 goto err;
2509 }
2510 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002512 if (PyEval_GetRestricted()) {
2513 /* Restricted execution, get private tables */
2514 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002516 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2517 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2518 Py_DECREF(m);
2519 if (!( self->dispatch_table )) goto err;
2520 }
2521 else {
2522 self->dispatch_table=dispatch_table;
2523 Py_INCREF(dispatch_table);
2524 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002525
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002526 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002528 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002529 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002530 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002531}
2532
2533
2534static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002535get_Pickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002536{
2537 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002538 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002539
Tim Peters5bd2a792003-02-01 16:45:06 +00002540 /* XXX What is this doing? The documented signature is
2541 * XXX Pickler(file, proto=0), but this accepts Pickler() and
2542 * XXX Pickler(integer) too. The meaning then is clear as mud.
2543 * XXX Bug? Feature?
2544 */
2545 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002546 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002547 proto = 0;
2548 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002549 return NULL;
2550 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002551 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002552}
2553
2554
2555static void
Tim Peterscba30e22003-02-01 06:24:36 +00002556Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002557{
2558 Py_XDECREF(self->write);
2559 Py_XDECREF(self->memo);
2560 Py_XDECREF(self->fast_memo);
2561 Py_XDECREF(self->arg);
2562 Py_XDECREF(self->file);
2563 Py_XDECREF(self->pers_func);
2564 Py_XDECREF(self->inst_pers_func);
2565 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002566 PyMem_Free(self->write_buf);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002567 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002568}
2569
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002570static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002571Pickler_get_pers_func(Picklerobject *p)
2572{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002573 if (p->pers_func == NULL)
2574 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2575 else
2576 Py_INCREF(p->pers_func);
2577 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002578}
2579
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002580static int
2581Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2582{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002583 if (v == NULL) {
2584 PyErr_SetString(PyExc_TypeError,
2585 "attribute deletion is not supported");
2586 return -1;
2587 }
2588 Py_XDECREF(p->pers_func);
2589 Py_INCREF(v);
2590 p->pers_func = v;
2591 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002592}
2593
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002594static int
2595Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2596{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002597 if (v == NULL) {
2598 PyErr_SetString(PyExc_TypeError,
2599 "attribute deletion is not supported");
2600 return -1;
2601 }
2602 Py_XDECREF(p->inst_pers_func);
2603 Py_INCREF(v);
2604 p->inst_pers_func = v;
2605 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002606}
2607
2608static PyObject *
2609Pickler_get_memo(Picklerobject *p)
2610{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002611 if (p->memo == NULL)
2612 PyErr_SetString(PyExc_AttributeError, "memo");
2613 else
2614 Py_INCREF(p->memo);
2615 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002616}
2617
2618static int
2619Pickler_set_memo(Picklerobject *p, PyObject *v)
2620{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002621 if (v == NULL) {
2622 PyErr_SetString(PyExc_TypeError,
2623 "attribute deletion is not supported");
2624 return -1;
2625 }
2626 if (!PyDict_Check(v)) {
2627 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2628 return -1;
2629 }
2630 Py_XDECREF(p->memo);
2631 Py_INCREF(v);
2632 p->memo = v;
2633 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002634}
2635
2636static PyObject *
2637Pickler_get_error(Picklerobject *p)
2638{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002639 /* why is this an attribute on the Pickler? */
2640 Py_INCREF(PicklingError);
2641 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002642}
2643
2644static PyMemberDef Pickler_members[] = {
2645 {"binary", T_INT, offsetof(Picklerobject, bin)},
2646 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002647 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002648};
2649
2650static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002651 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002652 (setter)Pickler_set_pers_func},
2653 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2654 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002655 {"PicklingError", (getter)Pickler_get_error, NULL},
2656 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002657};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002658
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002659PyDoc_STRVAR(Picklertype__doc__,
2660"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002661
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002662static PyTypeObject Picklertype = {
2663 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002664 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002665 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002666 sizeof(Picklerobject), /*tp_basicsize*/
2667 0,
2668 (destructor)Pickler_dealloc, /* tp_dealloc */
2669 0, /* tp_print */
2670 0, /* tp_getattr */
2671 0, /* tp_setattr */
2672 0, /* tp_compare */
2673 0, /* tp_repr */
2674 0, /* tp_as_number */
2675 0, /* tp_as_sequence */
2676 0, /* tp_as_mapping */
2677 0, /* tp_hash */
2678 0, /* tp_call */
2679 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002680 PyObject_GenericGetAttr, /* tp_getattro */
2681 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002682 0, /* tp_as_buffer */
2683 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2684 Picklertype__doc__, /* tp_doc */
2685 0, /* tp_traverse */
2686 0, /* tp_clear */
2687 0, /* tp_richcompare */
2688 0, /* tp_weaklistoffset */
2689 0, /* tp_iter */
2690 0, /* tp_iternext */
2691 Pickler_methods, /* tp_methods */
2692 Pickler_members, /* tp_members */
2693 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002694};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002695
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002696static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002697find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002698{
2699 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002701 if (fc) {
2702 if (fc==Py_None) {
2703 PyErr_SetString(UnpicklingError,
2704 "Global and instance pickles are not supported.");
2705 return NULL;
2706 }
Tim Peterscba30e22003-02-01 06:24:36 +00002707 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002708 py_global_name);
2709 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002711 module = PySys_GetObject("modules");
2712 if (module == NULL)
2713 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002715 module = PyDict_GetItem(module, py_module_name);
2716 if (module == NULL) {
2717 module = PyImport_Import(py_module_name);
2718 if (!module)
2719 return NULL;
2720 global = PyObject_GetAttr(module, py_global_name);
2721 Py_DECREF(module);
2722 }
2723 else
2724 global = PyObject_GetAttr(module, py_global_name);
2725 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002726}
2727
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002728static int
Tim Peterscba30e22003-02-01 06:24:36 +00002729marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002730{
2731 if (self->num_marks < 1) {
2732 PyErr_SetString(UnpicklingError, "could not find MARK");
2733 return -1;
2734 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002736 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002737}
2738
Tim Peters84e87f32001-03-17 04:50:51 +00002739
Guido van Rossum60456fd1997-04-09 17:36:32 +00002740static int
Tim Peterscba30e22003-02-01 06:24:36 +00002741load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002742{
2743 PDATA_APPEND(self->stack, Py_None, -1);
2744 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002745}
2746
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002747static int
Tim Peterscba30e22003-02-01 06:24:36 +00002748bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002749{
2750 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2751 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002752}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002753
2754static int
Tim Peterscba30e22003-02-01 06:24:36 +00002755load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002756{
2757 PyObject *py_int = 0;
2758 char *endptr, *s;
2759 int len, res = -1;
2760 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002761
Tim Peters0bc93f52003-02-02 18:29:33 +00002762 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002763 if (len < 2) return bad_readline();
2764 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002766 errno = 0;
2767 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002769 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2770 /* Hm, maybe we've got something long. Let's try reading
2771 it as a Python long object. */
2772 errno = 0;
2773 py_int = PyLong_FromString(s, NULL, 0);
2774 if (py_int == NULL) {
2775 PyErr_SetString(PyExc_ValueError,
2776 "could not convert string to int");
2777 goto finally;
2778 }
2779 }
2780 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002781 if (len == 3 && (l == 0 || l == 1)) {
2782 if (!( py_int = PyBool_FromLong(l))) goto finally;
2783 }
2784 else {
2785 if (!( py_int = PyInt_FromLong(l))) goto finally;
2786 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002787 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002789 free(s);
2790 PDATA_PUSH(self->stack, py_int, -1);
2791 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002793 finally:
2794 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002796 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002797}
2798
Tim Peters3c67d792003-02-02 17:59:11 +00002799static int
2800load_bool(Unpicklerobject *self, PyObject *boolean)
2801{
2802 assert(boolean == Py_True || boolean == Py_False);
2803 Py_INCREF(boolean);
2804 PDATA_PUSH(self->stack, boolean, -1);
2805 return 0;
2806}
2807
Tim Petersee1a53c2003-02-02 02:57:53 +00002808/* s contains x bytes of a little-endian integer. Return its value as a
2809 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
2810 * int, but when x is 4 it's a signed one. This is an historical source
2811 * of x-platform bugs.
2812 */
Tim Peters84e87f32001-03-17 04:50:51 +00002813static long
Tim Petersee1a53c2003-02-02 02:57:53 +00002814calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002815{
2816 unsigned char c;
2817 int i;
2818 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002820 for (i = 0, l = 0L; i < x; i++) {
2821 c = (unsigned char)s[i];
2822 l |= (long)c << (i * 8);
2823 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002824#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002825 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2826 * is signed, so on a box with longs bigger than 4 bytes we need
2827 * to extend a BININT's sign bit to the full width.
2828 */
2829 if (x == 4 && l & (1L << 31))
2830 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002831#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002832 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002833}
2834
2835
2836static int
Tim Peterscba30e22003-02-01 06:24:36 +00002837load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002838{
2839 PyObject *py_int = 0;
2840 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002842 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002843
Tim Peterscba30e22003-02-01 06:24:36 +00002844 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002845 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002847 PDATA_PUSH(self->stack, py_int, -1);
2848 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002849}
2850
2851
2852static int
Tim Peterscba30e22003-02-01 06:24:36 +00002853load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002854{
2855 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002856
Tim Peters0bc93f52003-02-02 18:29:33 +00002857 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002858 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002860 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002861}
2862
2863
2864static int
Tim Peterscba30e22003-02-01 06:24:36 +00002865load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002866{
2867 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002868
Tim Peters0bc93f52003-02-02 18:29:33 +00002869 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002870 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002872 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002873}
2874
2875
2876static int
Tim Peterscba30e22003-02-01 06:24:36 +00002877load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002878{
2879 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002880
Tim Peters0bc93f52003-02-02 18:29:33 +00002881 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002882 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002884 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002885}
Tim Peters84e87f32001-03-17 04:50:51 +00002886
Guido van Rossum60456fd1997-04-09 17:36:32 +00002887static int
Tim Peterscba30e22003-02-01 06:24:36 +00002888load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002889{
2890 PyObject *l = 0;
2891 char *end, *s;
2892 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002893
Tim Peters0bc93f52003-02-02 18:29:33 +00002894 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002895 if (len < 2) return bad_readline();
2896 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002897
Tim Peterscba30e22003-02-01 06:24:36 +00002898 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002899 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002901 free(s);
2902 PDATA_PUSH(self->stack, l, -1);
2903 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002904
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002905 finally:
2906 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002907
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002908 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002909}
2910
Tim Petersee1a53c2003-02-02 02:57:53 +00002911/* 'size' bytes contain the # of bytes of little-endian 256's-complement
2912 * data following.
2913 */
2914static int
2915load_counted_long(Unpicklerobject *self, int size)
2916{
2917 int i;
2918 char *nbytes;
2919 unsigned char *pdata;
2920 PyObject *along;
2921
2922 assert(size == 1 || size == 4);
2923 i = self->read_func(self, &nbytes, size);
2924 if (i < 0) return -1;
2925
2926 size = calc_binint(nbytes, size);
2927 if (size < 0) {
2928 /* Corrupt or hostile pickle -- we never write one like
2929 * this.
2930 */
2931 PyErr_SetString(PyExc_ValueError, "LONG pickle has negative "
2932 "byte count");
2933 return -1;
2934 }
2935
2936 if (size == 0)
2937 along = PyLong_FromLong(0L);
2938 else {
2939 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00002940 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00002941 if (i < 0) return -1;
2942 along = _PyLong_FromByteArray(pdata, (size_t)size,
2943 1 /* little endian */, 1 /* signed */);
2944 }
2945 if (along == NULL)
2946 return -1;
2947 PDATA_PUSH(self->stack, along, -1);
2948 return 0;
2949}
Tim Peters84e87f32001-03-17 04:50:51 +00002950
Guido van Rossum60456fd1997-04-09 17:36:32 +00002951static int
Tim Peterscba30e22003-02-01 06:24:36 +00002952load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002953{
2954 PyObject *py_float = 0;
2955 char *endptr, *s;
2956 int len, res = -1;
2957 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002958
Tim Peters0bc93f52003-02-02 18:29:33 +00002959 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002960 if (len < 2) return bad_readline();
2961 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002963 errno = 0;
2964 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002966 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2967 PyErr_SetString(PyExc_ValueError,
2968 "could not convert string to float");
2969 goto finally;
2970 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002971
Tim Peterscba30e22003-02-01 06:24:36 +00002972 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002973 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002974
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002975 free(s);
2976 PDATA_PUSH(self->stack, py_float, -1);
2977 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002978
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002979 finally:
2980 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002982 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002983}
2984
Guido van Rossum60456fd1997-04-09 17:36:32 +00002985static int
Tim Peterscba30e22003-02-01 06:24:36 +00002986load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002987{
2988 PyObject *py_float = 0;
2989 int s, e;
2990 long fhi, flo;
2991 double x;
2992 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002993
Tim Peters0bc93f52003-02-02 18:29:33 +00002994 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002995 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002997 /* First byte */
2998 s = (*p>>7) & 1;
2999 e = (*p & 0x7F) << 4;
3000 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003002 /* Second byte */
3003 e |= (*p>>4) & 0xF;
3004 fhi = (*p & 0xF) << 24;
3005 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003007 /* Third byte */
3008 fhi |= (*p & 0xFF) << 16;
3009 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003011 /* Fourth byte */
3012 fhi |= (*p & 0xFF) << 8;
3013 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003014
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003015 /* Fifth byte */
3016 fhi |= *p & 0xFF;
3017 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003019 /* Sixth byte */
3020 flo = (*p & 0xFF) << 16;
3021 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003023 /* Seventh byte */
3024 flo |= (*p & 0xFF) << 8;
3025 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003027 /* Eighth byte */
3028 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003030 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
3031 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003033 /* XXX This sadly ignores Inf/NaN */
3034 if (e == 0)
3035 e = -1022;
3036 else {
3037 x += 1.0;
3038 e -= 1023;
3039 }
3040 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003042 if (s)
3043 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003045 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003046
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003047 PDATA_PUSH(self->stack, py_float, -1);
3048 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003049}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003050
3051static int
Tim Peterscba30e22003-02-01 06:24:36 +00003052load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003053{
3054 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003055 int len, res = -1;
3056 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003057
Tim Peters0bc93f52003-02-02 18:29:33 +00003058 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003059 if (len < 2) return bad_readline();
3060 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003061
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003062
3063 /* Strip outermost quotes */
3064 while (s[len-1] <= ' ')
3065 len--;
3066 if(s[0]=='"' && s[len-1]=='"'){
3067 s[len-1] = '\0';
3068 p = s + 1 ;
3069 len -= 2;
3070 } else if(s[0]=='\'' && s[len-1]=='\''){
3071 s[len-1] = '\0';
3072 p = s + 1 ;
3073 len -= 2;
3074 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003075 goto insecure;
3076 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003077
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003078 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
3079 if (str) {
3080 PDATA_PUSH(self->stack, str, -1);
3081 res = 0;
3082 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003083 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003084 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003086 insecure:
3087 free(s);
3088 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3089 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003090}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003091
3092
3093static int
Tim Peterscba30e22003-02-01 06:24:36 +00003094load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003095{
3096 PyObject *py_string = 0;
3097 long l;
3098 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003099
Tim Peters0bc93f52003-02-02 18:29:33 +00003100 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003101
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003102 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003103
Tim Peters0bc93f52003-02-02 18:29:33 +00003104 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003105 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003106
Tim Peterscba30e22003-02-01 06:24:36 +00003107 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003108 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003110 PDATA_PUSH(self->stack, py_string, -1);
3111 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003112}
3113
3114
3115static int
Tim Peterscba30e22003-02-01 06:24:36 +00003116load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003117{
3118 PyObject *py_string = 0;
3119 unsigned char l;
3120 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003121
Tim Peters0bc93f52003-02-02 18:29:33 +00003122 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003123 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003125 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003126
Tim Peters0bc93f52003-02-02 18:29:33 +00003127 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003129 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003131 PDATA_PUSH(self->stack, py_string, -1);
3132 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003133}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003134
3135
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003136#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003137static int
Tim Peterscba30e22003-02-01 06:24:36 +00003138load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003139{
3140 PyObject *str = 0;
3141 int len, res = -1;
3142 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003143
Tim Peters0bc93f52003-02-02 18:29:33 +00003144 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003145 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003146
Tim Peterscba30e22003-02-01 06:24:36 +00003147 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003148 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003150 PDATA_PUSH(self->stack, str, -1);
3151 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003153 finally:
3154 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003155}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003156#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003157
3158
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003159#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003160static int
Tim Peterscba30e22003-02-01 06:24:36 +00003161load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003162{
3163 PyObject *unicode;
3164 long l;
3165 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003166
Tim Peters0bc93f52003-02-02 18:29:33 +00003167 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003169 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003170
Tim Peters0bc93f52003-02-02 18:29:33 +00003171 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003172 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003173
Tim Peterscba30e22003-02-01 06:24:36 +00003174 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003175 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003177 PDATA_PUSH(self->stack, unicode, -1);
3178 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003179}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003180#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003181
3182
3183static int
Tim Peterscba30e22003-02-01 06:24:36 +00003184load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003185{
3186 PyObject *tup;
3187 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003189 if ((i = marker(self)) < 0) return -1;
3190 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3191 PDATA_PUSH(self->stack, tup, -1);
3192 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003193}
3194
3195static int
Tim Peterscba30e22003-02-01 06:24:36 +00003196load_empty_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003197{
3198 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003200 if (!( tup=PyTuple_New(0))) return -1;
3201 PDATA_PUSH(self->stack, tup, -1);
3202 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003203}
3204
3205static int
Tim Peterscba30e22003-02-01 06:24:36 +00003206load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003207{
3208 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003210 if (!( list=PyList_New(0))) return -1;
3211 PDATA_PUSH(self->stack, list, -1);
3212 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003213}
3214
3215static int
Tim Peterscba30e22003-02-01 06:24:36 +00003216load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003217{
3218 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003220 if (!( dict=PyDict_New())) return -1;
3221 PDATA_PUSH(self->stack, dict, -1);
3222 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003223}
3224
3225
3226static int
Tim Peterscba30e22003-02-01 06:24:36 +00003227load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003228{
3229 PyObject *list = 0;
3230 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003232 if ((i = marker(self)) < 0) return -1;
3233 if (!( list=Pdata_popList(self->stack, i))) return -1;
3234 PDATA_PUSH(self->stack, list, -1);
3235 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003236}
3237
3238static int
Tim Peterscba30e22003-02-01 06:24:36 +00003239load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003240{
3241 PyObject *dict, *key, *value;
3242 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003244 if ((i = marker(self)) < 0) return -1;
3245 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003247 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003248
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003249 for (k = i+1; k < j; k += 2) {
3250 key =self->stack->data[k-1];
3251 value=self->stack->data[k ];
3252 if (PyDict_SetItem(dict, key, value) < 0) {
3253 Py_DECREF(dict);
3254 return -1;
3255 }
3256 }
3257 Pdata_clear(self->stack, i);
3258 PDATA_PUSH(self->stack, dict, -1);
3259 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003260}
3261
3262static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003263Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003264{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003265 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003267 if (PyClass_Check(cls)) {
3268 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003270 if ((l=PyObject_Size(args)) < 0) goto err;
3271 if (!( l )) {
3272 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003273
Tim Peterscba30e22003-02-01 06:24:36 +00003274 __getinitargs__ = PyObject_GetAttr(cls,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003275 __getinitargs___str);
3276 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003277 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003278 so bypass usual construction */
3279 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003281 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003282 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003283 goto err;
3284 return inst;
3285 }
3286 Py_DECREF(__getinitargs__);
3287 }
Tim Peters84e87f32001-03-17 04:50:51 +00003288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003289 if ((r=PyInstance_New(cls, args, NULL))) return r;
3290 else goto err;
3291 }
Tim Peters84e87f32001-03-17 04:50:51 +00003292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003293 if (args==Py_None) {
3294 /* Special case, call cls.__basicnew__() */
3295 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003297 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3298 if (!basicnew) return NULL;
3299 r=PyObject_CallObject(basicnew, NULL);
3300 Py_DECREF(basicnew);
3301 if (r) return r;
3302 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003304 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003306 err:
3307 {
3308 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003309
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003310 PyErr_Fetch(&tp, &v, &tb);
3311 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3312 Py_XDECREF(v);
3313 v=r;
3314 }
3315 PyErr_Restore(tp,v,tb);
3316 }
3317 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003318}
Tim Peters84e87f32001-03-17 04:50:51 +00003319
Guido van Rossum60456fd1997-04-09 17:36:32 +00003320
3321static int
Tim Peterscba30e22003-02-01 06:24:36 +00003322load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003323{
3324 PyObject *class, *tup, *obj=0;
3325 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003327 if ((i = marker(self)) < 0) return -1;
3328 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3329 PDATA_POP(self->stack, class);
3330 if (class) {
3331 obj = Instance_New(class, tup);
3332 Py_DECREF(class);
3333 }
3334 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003336 if (! obj) return -1;
3337 PDATA_PUSH(self->stack, obj, -1);
3338 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003339}
3340
3341
3342static int
Tim Peterscba30e22003-02-01 06:24:36 +00003343load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003344{
3345 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3346 int i, len;
3347 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003349 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003350
Tim Peters0bc93f52003-02-02 18:29:33 +00003351 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003352 if (len < 2) return bad_readline();
3353 module_name = PyString_FromStringAndSize(s, len - 1);
3354 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003355
Tim Peters0bc93f52003-02-02 18:29:33 +00003356 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003357 if (len < 2) return bad_readline();
3358 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003359 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003360 self->find_class);
3361 Py_DECREF(class_name);
3362 }
3363 }
3364 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003366 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003368 if ((tup=Pdata_popTuple(self->stack, i))) {
3369 obj = Instance_New(class, tup);
3370 Py_DECREF(tup);
3371 }
3372 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003374 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003376 PDATA_PUSH(self->stack, obj, -1);
3377 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003378}
3379
3380
3381static int
Tim Peterscba30e22003-02-01 06:24:36 +00003382load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003383{
3384 PyObject *class = 0, *module_name = 0, *class_name = 0;
3385 int len;
3386 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003387
Tim Peters0bc93f52003-02-02 18:29:33 +00003388 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003389 if (len < 2) return bad_readline();
3390 module_name = PyString_FromStringAndSize(s, len - 1);
3391 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003392
Tim Peters0bc93f52003-02-02 18:29:33 +00003393 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003394 if (len < 2) {
3395 Py_DECREF(module_name);
3396 return bad_readline();
3397 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003398 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003399 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003400 self->find_class);
3401 Py_DECREF(class_name);
3402 }
3403 }
3404 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003406 if (! class) return -1;
3407 PDATA_PUSH(self->stack, class, -1);
3408 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003409}
3410
3411
3412static int
Tim Peterscba30e22003-02-01 06:24:36 +00003413load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003414{
3415 PyObject *pid = 0;
3416 int len;
3417 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003419 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003420 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003421 if (len < 2) return bad_readline();
3422
3423 pid = PyString_FromStringAndSize(s, len - 1);
3424 if (!pid) return -1;
3425
3426 if (PyList_Check(self->pers_func)) {
3427 if (PyList_Append(self->pers_func, pid) < 0) {
3428 Py_DECREF(pid);
3429 return -1;
3430 }
3431 }
3432 else {
3433 ARG_TUP(self, pid);
3434 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003435 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003436 NULL);
3437 FREE_ARG_TUP(self);
3438 }
3439 }
3440
3441 if (! pid) return -1;
3442
3443 PDATA_PUSH(self->stack, pid, -1);
3444 return 0;
3445 }
3446 else {
3447 PyErr_SetString(UnpicklingError,
3448 "A load persistent id instruction was encountered,\n"
3449 "but no persistent_load function was specified.");
3450 return -1;
3451 }
3452}
3453
3454static int
Tim Peterscba30e22003-02-01 06:24:36 +00003455load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003456{
3457 PyObject *pid = 0;
3458
3459 if (self->pers_func) {
3460 PDATA_POP(self->stack, pid);
3461 if (! pid) return -1;
3462
3463 if (PyList_Check(self->pers_func)) {
3464 if (PyList_Append(self->pers_func, pid) < 0) {
3465 Py_DECREF(pid);
3466 return -1;
3467 }
3468 }
3469 else {
3470 ARG_TUP(self, pid);
3471 if (self->arg) {
3472 pid = PyObject_Call(self->pers_func, self->arg,
3473 NULL);
3474 FREE_ARG_TUP(self);
3475 }
3476 if (! pid) return -1;
3477 }
3478
3479 PDATA_PUSH(self->stack, pid, -1);
3480 return 0;
3481 }
3482 else {
3483 PyErr_SetString(UnpicklingError,
3484 "A load persistent id instruction was encountered,\n"
3485 "but no persistent_load function was specified.");
3486 return -1;
3487 }
3488}
3489
3490
3491static int
Tim Peterscba30e22003-02-01 06:24:36 +00003492load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003493{
3494 int len;
3495
3496 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3497
3498 /* Note that we split the (pickle.py) stack into two stacks,
3499 an object stack and a mark stack. We have to be clever and
3500 pop the right one. We do this by looking at the top of the
3501 mark stack.
3502 */
3503
3504 if ((self->num_marks > 0) &&
3505 (self->marks[self->num_marks - 1] == len))
3506 self->num_marks--;
3507 else {
3508 len--;
3509 Py_DECREF(self->stack->data[len]);
3510 self->stack->length=len;
3511 }
3512
3513 return 0;
3514}
3515
3516
3517static int
Tim Peterscba30e22003-02-01 06:24:36 +00003518load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003519{
3520 int i;
3521
3522 if ((i = marker(self)) < 0)
3523 return -1;
3524
3525 Pdata_clear(self->stack, i);
3526
3527 return 0;
3528}
3529
3530
3531static int
Tim Peterscba30e22003-02-01 06:24:36 +00003532load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003533{
3534 PyObject *last;
3535 int len;
3536
3537 if ((len = self->stack->length) <= 0) return stackUnderflow();
3538 last=self->stack->data[len-1];
3539 Py_INCREF(last);
3540 PDATA_PUSH(self->stack, last, -1);
3541 return 0;
3542}
3543
3544
3545static int
Tim Peterscba30e22003-02-01 06:24:36 +00003546load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003547{
3548 PyObject *py_str = 0, *value = 0;
3549 int len;
3550 char *s;
3551 int rc;
3552
Tim Peters0bc93f52003-02-02 18:29:33 +00003553 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003554 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003556 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003558 value = PyDict_GetItem(self->memo, py_str);
3559 if (! value) {
3560 PyErr_SetObject(BadPickleGet, py_str);
3561 rc = -1;
3562 } else {
3563 PDATA_APPEND(self->stack, value, -1);
3564 rc = 0;
3565 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003567 Py_DECREF(py_str);
3568 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003569}
3570
3571
3572static int
Tim Peterscba30e22003-02-01 06:24:36 +00003573load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003574{
3575 PyObject *py_key = 0, *value = 0;
3576 unsigned char key;
3577 char *s;
3578 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003579
Tim Peters0bc93f52003-02-02 18:29:33 +00003580 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003582 key = (unsigned char)s[0];
3583 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003585 value = PyDict_GetItem(self->memo, py_key);
3586 if (! value) {
3587 PyErr_SetObject(BadPickleGet, py_key);
3588 rc = -1;
3589 } else {
3590 PDATA_APPEND(self->stack, value, -1);
3591 rc = 0;
3592 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003594 Py_DECREF(py_key);
3595 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003596}
3597
3598
3599static int
Tim Peterscba30e22003-02-01 06:24:36 +00003600load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003601{
3602 PyObject *py_key = 0, *value = 0;
3603 unsigned char c;
3604 char *s;
3605 long key;
3606 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003607
Tim Peters0bc93f52003-02-02 18:29:33 +00003608 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003610 c = (unsigned char)s[0];
3611 key = (long)c;
3612 c = (unsigned char)s[1];
3613 key |= (long)c << 8;
3614 c = (unsigned char)s[2];
3615 key |= (long)c << 16;
3616 c = (unsigned char)s[3];
3617 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003619 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3620
3621 value = PyDict_GetItem(self->memo, py_key);
3622 if (! value) {
3623 PyErr_SetObject(BadPickleGet, py_key);
3624 rc = -1;
3625 } else {
3626 PDATA_APPEND(self->stack, value, -1);
3627 rc = 0;
3628 }
3629
3630 Py_DECREF(py_key);
3631 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003632}
3633
3634
3635static int
Tim Peterscba30e22003-02-01 06:24:36 +00003636load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003637{
3638 PyObject *py_str = 0, *value = 0;
3639 int len, l;
3640 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003641
Tim Peters0bc93f52003-02-02 18:29:33 +00003642 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003643 if (l < 2) return bad_readline();
3644 if (!( len=self->stack->length )) return stackUnderflow();
3645 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3646 value=self->stack->data[len-1];
3647 l=PyDict_SetItem(self->memo, py_str, value);
3648 Py_DECREF(py_str);
3649 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003650}
3651
3652
3653static int
Tim Peterscba30e22003-02-01 06:24:36 +00003654load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003655{
3656 PyObject *py_key = 0, *value = 0;
3657 unsigned char key;
3658 char *s;
3659 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003660
Tim Peters0bc93f52003-02-02 18:29:33 +00003661 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003662 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003664 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003666 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3667 value=self->stack->data[len-1];
3668 len=PyDict_SetItem(self->memo, py_key, value);
3669 Py_DECREF(py_key);
3670 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003671}
3672
3673
3674static int
Tim Peterscba30e22003-02-01 06:24:36 +00003675load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003676{
3677 PyObject *py_key = 0, *value = 0;
3678 long key;
3679 unsigned char c;
3680 char *s;
3681 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003682
Tim Peters0bc93f52003-02-02 18:29:33 +00003683 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003684 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003686 c = (unsigned char)s[0];
3687 key = (long)c;
3688 c = (unsigned char)s[1];
3689 key |= (long)c << 8;
3690 c = (unsigned char)s[2];
3691 key |= (long)c << 16;
3692 c = (unsigned char)s[3];
3693 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003695 if (!( py_key = PyInt_FromLong(key))) return -1;
3696 value=self->stack->data[len-1];
3697 len=PyDict_SetItem(self->memo, py_key, value);
3698 Py_DECREF(py_key);
3699 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003700}
3701
3702
3703static int
Tim Peterscba30e22003-02-01 06:24:36 +00003704do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003705{
3706 PyObject *value = 0, *list = 0, *append_method = 0;
3707 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003709 len=self->stack->length;
3710 if (!( len >= x && x > 0 )) return stackUnderflow();
3711 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003712 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003714 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003716 if (PyList_Check(list)) {
3717 PyObject *slice;
3718 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003720 slice=Pdata_popList(self->stack, x);
3721 list_len = PyList_GET_SIZE(list);
3722 i=PyList_SetSlice(list, list_len, list_len, slice);
3723 Py_DECREF(slice);
3724 return i;
3725 }
3726 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003727
Tim Peterscba30e22003-02-01 06:24:36 +00003728 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003729 return -1;
3730
3731 for (i = x; i < len; i++) {
3732 PyObject *junk;
3733
3734 value=self->stack->data[i];
3735 junk=0;
3736 ARG_TUP(self, value);
3737 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003738 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003739 NULL);
3740 FREE_ARG_TUP(self);
3741 }
3742 if (! junk) {
3743 Pdata_clear(self->stack, i+1);
3744 self->stack->length=x;
3745 Py_DECREF(append_method);
3746 return -1;
3747 }
3748 Py_DECREF(junk);
3749 }
3750 self->stack->length=x;
3751 Py_DECREF(append_method);
3752 }
3753
3754 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003755}
3756
3757
3758static int
Tim Peterscba30e22003-02-01 06:24:36 +00003759load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003760{
3761 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003762}
3763
3764
3765static int
Tim Peterscba30e22003-02-01 06:24:36 +00003766load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003767{
3768 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003769}
3770
3771
3772static int
Tim Peterscba30e22003-02-01 06:24:36 +00003773do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003774{
3775 PyObject *value = 0, *key = 0, *dict = 0;
3776 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003778 if (!( (len=self->stack->length) >= x
3779 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003781 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003783 for (i = x+1; i < len; i += 2) {
3784 key =self->stack->data[i-1];
3785 value=self->stack->data[i ];
3786 if (PyObject_SetItem(dict, key, value) < 0) {
3787 r=-1;
3788 break;
3789 }
3790 }
3791
3792 Pdata_clear(self->stack, x);
3793
3794 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003795}
3796
3797
Tim Peters84e87f32001-03-17 04:50:51 +00003798static int
Tim Peterscba30e22003-02-01 06:24:36 +00003799load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003800{
3801 return do_setitems(self, self->stack->length - 2);
3802}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003804static int
Tim Peterscba30e22003-02-01 06:24:36 +00003805load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003806{
3807 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003808}
3809
Tim Peters84e87f32001-03-17 04:50:51 +00003810
Guido van Rossum60456fd1997-04-09 17:36:32 +00003811static int
Tim Peterscba30e22003-02-01 06:24:36 +00003812load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003813{
3814 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3815 *junk = 0, *__setstate__ = 0;
3816 int i, r = 0;
3817
3818 if (self->stack->length < 2) return stackUnderflow();
3819 PDATA_POP(self->stack, value);
3820 if (! value) return -1;
3821 inst=self->stack->data[self->stack->length-1];
3822
3823 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3824 ARG_TUP(self, value);
3825 if (self->arg) {
3826 junk = PyObject_Call(__setstate__, self->arg, NULL);
3827 FREE_ARG_TUP(self);
3828 }
3829 Py_DECREF(__setstate__);
3830 if (! junk) return -1;
3831 Py_DECREF(junk);
3832 return 0;
3833 }
3834
3835 PyErr_Clear();
3836 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3837 i = 0;
3838 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3839 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3840 r=-1;
3841 break;
3842 }
3843 }
3844 Py_DECREF(instdict);
3845 }
3846 else r=-1;
3847
3848 Py_XDECREF(value);
3849
3850 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003851}
3852
3853
3854static int
Tim Peterscba30e22003-02-01 06:24:36 +00003855load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003856{
3857 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003859 /* Note that we split the (pickle.py) stack into two stacks, an
3860 object stack and a mark stack. Here we push a mark onto the
3861 mark stack.
3862 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003864 if ((self->num_marks + 1) >= self->marks_size) {
3865 s=self->marks_size+20;
3866 if (s <= self->num_marks) s=self->num_marks + 1;
3867 if (self->marks == NULL)
3868 self->marks=(int *)malloc(s * sizeof(int));
3869 else
Tim Peterscba30e22003-02-01 06:24:36 +00003870 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003871 s * sizeof(int));
3872 if (! self->marks) {
3873 PyErr_NoMemory();
3874 return -1;
3875 }
3876 self->marks_size = s;
3877 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003879 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003881 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003882}
3883
Guido van Rossum60456fd1997-04-09 17:36:32 +00003884static int
Tim Peterscba30e22003-02-01 06:24:36 +00003885load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003886{
3887 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003889 PDATA_POP(self->stack, arg_tup);
3890 if (! arg_tup) return -1;
3891 PDATA_POP(self->stack, callable);
3892 if (callable) {
3893 ob = Instance_New(callable, arg_tup);
3894 Py_DECREF(callable);
3895 }
3896 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003898 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003900 PDATA_PUSH(self->stack, ob, -1);
3901 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003902}
Tim Peters84e87f32001-03-17 04:50:51 +00003903
Tim Peters4190fb82003-02-02 16:09:05 +00003904/* Just raises an error if we don't know the protocol specified. PROTO
3905 * is the first opcode for protocols >= 2.
3906 */
3907static int
3908load_proto(Unpicklerobject *self)
3909{
3910 int i;
3911 char *protobyte;
3912
3913 i = self->read_func(self, &protobyte, 1);
3914 if (i < 0)
3915 return -1;
3916
3917 i = calc_binint(protobyte, 1);
3918 /* No point checking for < 0, since calc_binint returns an unsigned
3919 * int when chewing on 1 byte.
3920 */
3921 assert(i >= 0);
3922 if (i <= CURRENT_PROTOCOL_NUMBER)
3923 return 0;
3924
3925 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
3926 return -1;
3927}
3928
Guido van Rossum60456fd1997-04-09 17:36:32 +00003929static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003930load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003931{
3932 PyObject *err = 0, *val = 0;
3933 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003935 self->num_marks = 0;
3936 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003938 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003939 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003940 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003942 switch (s[0]) {
3943 case NONE:
3944 if (load_none(self) < 0)
3945 break;
3946 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003948 case BININT:
3949 if (load_binint(self) < 0)
3950 break;
3951 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003953 case BININT1:
3954 if (load_binint1(self) < 0)
3955 break;
3956 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003958 case BININT2:
3959 if (load_binint2(self) < 0)
3960 break;
3961 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003963 case INT:
3964 if (load_int(self) < 0)
3965 break;
3966 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003967
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003968 case LONG:
3969 if (load_long(self) < 0)
3970 break;
3971 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003972
Tim Petersee1a53c2003-02-02 02:57:53 +00003973 case LONG1:
3974 if (load_counted_long(self, 1) < 0)
3975 break;
3976 continue;
3977
3978 case LONG4:
3979 if (load_counted_long(self, 4) < 0)
3980 break;
3981 continue;
3982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003983 case FLOAT:
3984 if (load_float(self) < 0)
3985 break;
3986 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003988 case BINFLOAT:
3989 if (load_binfloat(self) < 0)
3990 break;
3991 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003993 case BINSTRING:
3994 if (load_binstring(self) < 0)
3995 break;
3996 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003998 case SHORT_BINSTRING:
3999 if (load_short_binstring(self) < 0)
4000 break;
4001 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004003 case STRING:
4004 if (load_string(self) < 0)
4005 break;
4006 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004007
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004008#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004009 case UNICODE:
4010 if (load_unicode(self) < 0)
4011 break;
4012 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004014 case BINUNICODE:
4015 if (load_binunicode(self) < 0)
4016 break;
4017 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004018#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004020 case EMPTY_TUPLE:
4021 if (load_empty_tuple(self) < 0)
4022 break;
4023 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004025 case TUPLE:
4026 if (load_tuple(self) < 0)
4027 break;
4028 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004030 case EMPTY_LIST:
4031 if (load_empty_list(self) < 0)
4032 break;
4033 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004034
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004035 case LIST:
4036 if (load_list(self) < 0)
4037 break;
4038 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004039
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004040 case EMPTY_DICT:
4041 if (load_empty_dict(self) < 0)
4042 break;
4043 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004045 case DICT:
4046 if (load_dict(self) < 0)
4047 break;
4048 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004050 case OBJ:
4051 if (load_obj(self) < 0)
4052 break;
4053 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004055 case INST:
4056 if (load_inst(self) < 0)
4057 break;
4058 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004060 case GLOBAL:
4061 if (load_global(self) < 0)
4062 break;
4063 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004065 case APPEND:
4066 if (load_append(self) < 0)
4067 break;
4068 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004070 case APPENDS:
4071 if (load_appends(self) < 0)
4072 break;
4073 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004075 case BUILD:
4076 if (load_build(self) < 0)
4077 break;
4078 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004080 case DUP:
4081 if (load_dup(self) < 0)
4082 break;
4083 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004085 case BINGET:
4086 if (load_binget(self) < 0)
4087 break;
4088 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004089
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004090 case LONG_BINGET:
4091 if (load_long_binget(self) < 0)
4092 break;
4093 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004095 case GET:
4096 if (load_get(self) < 0)
4097 break;
4098 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004100 case MARK:
4101 if (load_mark(self) < 0)
4102 break;
4103 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004105 case BINPUT:
4106 if (load_binput(self) < 0)
4107 break;
4108 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004110 case LONG_BINPUT:
4111 if (load_long_binput(self) < 0)
4112 break;
4113 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004115 case PUT:
4116 if (load_put(self) < 0)
4117 break;
4118 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004120 case POP:
4121 if (load_pop(self) < 0)
4122 break;
4123 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004125 case POP_MARK:
4126 if (load_pop_mark(self) < 0)
4127 break;
4128 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004130 case SETITEM:
4131 if (load_setitem(self) < 0)
4132 break;
4133 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004135 case SETITEMS:
4136 if (load_setitems(self) < 0)
4137 break;
4138 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004140 case STOP:
4141 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004143 case PERSID:
4144 if (load_persid(self) < 0)
4145 break;
4146 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004148 case BINPERSID:
4149 if (load_binpersid(self) < 0)
4150 break;
4151 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004153 case REDUCE:
4154 if (load_reduce(self) < 0)
4155 break;
4156 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004157
Tim Peters4190fb82003-02-02 16:09:05 +00004158 case PROTO:
4159 if (load_proto(self) < 0)
4160 break;
4161 continue;
4162
Tim Peters3c67d792003-02-02 17:59:11 +00004163 case NEWTRUE:
4164 if (load_bool(self, Py_True) < 0)
4165 break;
4166 continue;
4167
4168 case NEWFALSE:
4169 if (load_bool(self, Py_False) < 0)
4170 break;
4171 continue;
4172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004173 case '\0':
4174 /* end of file */
4175 PyErr_SetNone(PyExc_EOFError);
4176 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004178 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004179 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004180 "invalid load key, '%s'.",
4181 "c", s[0]);
4182 return NULL;
4183 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004185 break;
4186 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004188 if ((err = PyErr_Occurred())) {
4189 if (err == PyExc_EOFError) {
4190 PyErr_SetNone(PyExc_EOFError);
4191 }
4192 return NULL;
4193 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004195 PDATA_POP(self->stack, val);
4196 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004197}
Tim Peters84e87f32001-03-17 04:50:51 +00004198
Guido van Rossum60456fd1997-04-09 17:36:32 +00004199
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004200/* No-load functions to support noload, which is used to
4201 find persistent references. */
4202
4203static int
Tim Peterscba30e22003-02-01 06:24:36 +00004204noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004205{
4206 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004208 if ((i = marker(self)) < 0) return -1;
4209 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004210}
4211
4212
4213static int
Tim Peterscba30e22003-02-01 06:24:36 +00004214noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004215{
4216 int i;
4217 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004219 if ((i = marker(self)) < 0) return -1;
4220 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004221 if (self->readline_func(self, &s) < 0) return -1;
4222 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004223 PDATA_APPEND(self->stack, Py_None,-1);
4224 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004225}
4226
4227static int
Tim Peterscba30e22003-02-01 06:24:36 +00004228noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004229{
4230 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004231
Tim Peters0bc93f52003-02-02 18:29:33 +00004232 if (self->readline_func(self, &s) < 0) return -1;
4233 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004234 PDATA_APPEND(self->stack, Py_None,-1);
4235 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004236}
4237
4238static int
Tim Peterscba30e22003-02-01 06:24:36 +00004239noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004240{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004242 if (self->stack->length < 2) return stackUnderflow();
4243 Pdata_clear(self->stack, self->stack->length-2);
4244 PDATA_APPEND(self->stack, Py_None,-1);
4245 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004246}
4247
4248static int
4249noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004250
Guido van Rossum053b8df1998-11-25 16:18:00 +00004251 if (self->stack->length < 1) return stackUnderflow();
4252 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004253 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004254}
4255
4256
4257static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004258noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004259{
4260 PyObject *err = 0, *val = 0;
4261 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004263 self->num_marks = 0;
4264 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004265
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004266 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004267 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004268 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004270 switch (s[0]) {
4271 case NONE:
4272 if (load_none(self) < 0)
4273 break;
4274 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004275
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004276 case BININT:
4277 if (load_binint(self) < 0)
4278 break;
4279 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004281 case BININT1:
4282 if (load_binint1(self) < 0)
4283 break;
4284 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004286 case BININT2:
4287 if (load_binint2(self) < 0)
4288 break;
4289 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004291 case INT:
4292 if (load_int(self) < 0)
4293 break;
4294 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004295
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004296 case LONG:
4297 if (load_long(self) < 0)
4298 break;
4299 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004300
Tim Peters4190fb82003-02-02 16:09:05 +00004301 case LONG1:
4302 if (load_counted_long(self, 1) < 0)
4303 break;
4304 continue;
4305
4306 case LONG4:
4307 if (load_counted_long(self, 4) < 0)
4308 break;
4309 continue;
4310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004311 case FLOAT:
4312 if (load_float(self) < 0)
4313 break;
4314 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004316 case BINFLOAT:
4317 if (load_binfloat(self) < 0)
4318 break;
4319 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004321 case BINSTRING:
4322 if (load_binstring(self) < 0)
4323 break;
4324 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004326 case SHORT_BINSTRING:
4327 if (load_short_binstring(self) < 0)
4328 break;
4329 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004331 case STRING:
4332 if (load_string(self) < 0)
4333 break;
4334 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004335
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004336#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004337 case UNICODE:
4338 if (load_unicode(self) < 0)
4339 break;
4340 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004342 case BINUNICODE:
4343 if (load_binunicode(self) < 0)
4344 break;
4345 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004346#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004347
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004348 case EMPTY_TUPLE:
4349 if (load_empty_tuple(self) < 0)
4350 break;
4351 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004353 case TUPLE:
4354 if (load_tuple(self) < 0)
4355 break;
4356 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004358 case EMPTY_LIST:
4359 if (load_empty_list(self) < 0)
4360 break;
4361 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004363 case LIST:
4364 if (load_list(self) < 0)
4365 break;
4366 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004368 case EMPTY_DICT:
4369 if (load_empty_dict(self) < 0)
4370 break;
4371 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004373 case DICT:
4374 if (load_dict(self) < 0)
4375 break;
4376 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004377
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004378 case OBJ:
4379 if (noload_obj(self) < 0)
4380 break;
4381 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004383 case INST:
4384 if (noload_inst(self) < 0)
4385 break;
4386 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004387
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004388 case GLOBAL:
4389 if (noload_global(self) < 0)
4390 break;
4391 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004393 case APPEND:
4394 if (load_append(self) < 0)
4395 break;
4396 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004398 case APPENDS:
4399 if (load_appends(self) < 0)
4400 break;
4401 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004403 case BUILD:
4404 if (noload_build(self) < 0)
4405 break;
4406 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004408 case DUP:
4409 if (load_dup(self) < 0)
4410 break;
4411 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004413 case BINGET:
4414 if (load_binget(self) < 0)
4415 break;
4416 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004418 case LONG_BINGET:
4419 if (load_long_binget(self) < 0)
4420 break;
4421 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004423 case GET:
4424 if (load_get(self) < 0)
4425 break;
4426 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004428 case MARK:
4429 if (load_mark(self) < 0)
4430 break;
4431 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004433 case BINPUT:
4434 if (load_binput(self) < 0)
4435 break;
4436 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004438 case LONG_BINPUT:
4439 if (load_long_binput(self) < 0)
4440 break;
4441 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004443 case PUT:
4444 if (load_put(self) < 0)
4445 break;
4446 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004448 case POP:
4449 if (load_pop(self) < 0)
4450 break;
4451 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004453 case POP_MARK:
4454 if (load_pop_mark(self) < 0)
4455 break;
4456 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004458 case SETITEM:
4459 if (load_setitem(self) < 0)
4460 break;
4461 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004462
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004463 case SETITEMS:
4464 if (load_setitems(self) < 0)
4465 break;
4466 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004468 case STOP:
4469 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004471 case PERSID:
4472 if (load_persid(self) < 0)
4473 break;
4474 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004476 case BINPERSID:
4477 if (load_binpersid(self) < 0)
4478 break;
4479 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004481 case REDUCE:
4482 if (noload_reduce(self) < 0)
4483 break;
4484 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004485
Tim Peters4190fb82003-02-02 16:09:05 +00004486 case PROTO:
4487 if (load_proto(self) < 0)
4488 break;
4489 continue;
4490
Tim Peters3c67d792003-02-02 17:59:11 +00004491 case NEWTRUE:
4492 if (load_bool(self, Py_True) < 0)
4493 break;
4494 continue;
4495
4496 case NEWFALSE:
4497 if (load_bool(self, Py_False) < 0)
4498 break;
4499 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004500 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004501 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004502 "invalid load key, '%s'.",
4503 "c", s[0]);
4504 return NULL;
4505 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004507 break;
4508 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004510 if ((err = PyErr_Occurred())) {
4511 if (err == PyExc_EOFError) {
4512 PyErr_SetNone(PyExc_EOFError);
4513 }
4514 return NULL;
4515 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004516
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004517 PDATA_POP(self->stack, val);
4518 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004519}
Tim Peters84e87f32001-03-17 04:50:51 +00004520
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004521
Guido van Rossum60456fd1997-04-09 17:36:32 +00004522static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004523Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004524{
Tim Peterscba30e22003-02-01 06:24:36 +00004525 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004526 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004528 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004529}
4530
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004531static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004532Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004533{
Tim Peterscba30e22003-02-01 06:24:36 +00004534 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004535 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004537 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004538}
4539
Guido van Rossum60456fd1997-04-09 17:36:32 +00004540
4541static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004542 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004543 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004544 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004545 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004546 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004547 "noload() -- not load a pickle, but go through most of the motions\n"
4548 "\n"
4549 "This function can be used to read past a pickle without instantiating\n"
4550 "any objects or importing any modules. It can also be used to find all\n"
4551 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004552 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004553 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004554 {NULL, NULL} /* sentinel */
4555};
4556
4557
4558static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004559newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004560{
4561 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004562
Tim Peterscba30e22003-02-01 06:24:36 +00004563 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004564 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004566 self->file = NULL;
4567 self->arg = NULL;
4568 self->stack = (Pdata*)Pdata_New();
4569 self->pers_func = NULL;
4570 self->last_string = NULL;
4571 self->marks = NULL;
4572 self->num_marks = 0;
4573 self->marks_size = 0;
4574 self->buf_size = 0;
4575 self->read = NULL;
4576 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004577 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004578
Tim Peterscba30e22003-02-01 06:24:36 +00004579 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004580 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004582 Py_INCREF(f);
4583 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004585 /* Set read, readline based on type of f */
4586 if (PyFile_Check(f)) {
4587 self->fp = PyFile_AsFile(f);
4588 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004589 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004590 "I/O operation on closed file");
4591 goto err;
4592 }
4593 self->read_func = read_file;
4594 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004595 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004596 else if (PycStringIO_InputCheck(f)) {
4597 self->fp = NULL;
4598 self->read_func = read_cStringIO;
4599 self->readline_func = readline_cStringIO;
4600 }
4601 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004603 self->fp = NULL;
4604 self->read_func = read_other;
4605 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004607 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4608 (self->read = PyObject_GetAttr(f, read_str)))) {
4609 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004610 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004611 "argument must have 'read' and "
4612 "'readline' attributes" );
4613 goto err;
4614 }
4615 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004617 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004619 err:
4620 Py_DECREF((PyObject *)self);
4621 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004622}
4623
4624
4625static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004626get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004627{
4628 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004629
Tim Peterscba30e22003-02-01 06:24:36 +00004630 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004631 return NULL;
4632 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004633}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004634
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004635
Guido van Rossum60456fd1997-04-09 17:36:32 +00004636static void
Tim Peterscba30e22003-02-01 06:24:36 +00004637Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004638{
4639 Py_XDECREF(self->readline);
4640 Py_XDECREF(self->read);
4641 Py_XDECREF(self->file);
4642 Py_XDECREF(self->memo);
4643 Py_XDECREF(self->stack);
4644 Py_XDECREF(self->pers_func);
4645 Py_XDECREF(self->arg);
4646 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004648 if (self->marks) {
4649 free(self->marks);
4650 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004652 if (self->buf_size) {
4653 free(self->buf);
4654 }
Tim Peters84e87f32001-03-17 04:50:51 +00004655
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004656 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004657}
4658
4659
4660static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004661Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004662{
4663 if (!strcmp(name, "persistent_load")) {
4664 if (!self->pers_func) {
4665 PyErr_SetString(PyExc_AttributeError, name);
4666 return NULL;
4667 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004669 Py_INCREF(self->pers_func);
4670 return self->pers_func;
4671 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004673 if (!strcmp(name, "find_global")) {
4674 if (!self->find_class) {
4675 PyErr_SetString(PyExc_AttributeError, name);
4676 return NULL;
4677 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004679 Py_INCREF(self->find_class);
4680 return self->find_class;
4681 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004683 if (!strcmp(name, "memo")) {
4684 if (!self->memo) {
4685 PyErr_SetString(PyExc_AttributeError, name);
4686 return NULL;
4687 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004689 Py_INCREF(self->memo);
4690 return self->memo;
4691 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004693 if (!strcmp(name, "UnpicklingError")) {
4694 Py_INCREF(UnpicklingError);
4695 return UnpicklingError;
4696 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004698 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004699}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004700
Guido van Rossum60456fd1997-04-09 17:36:32 +00004701
4702static int
Tim Peterscba30e22003-02-01 06:24:36 +00004703Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004704{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004706 if (!strcmp(name, "persistent_load")) {
4707 Py_XDECREF(self->pers_func);
4708 self->pers_func = value;
4709 Py_XINCREF(value);
4710 return 0;
4711 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004713 if (!strcmp(name, "find_global")) {
4714 Py_XDECREF(self->find_class);
4715 self->find_class = value;
4716 Py_XINCREF(value);
4717 return 0;
4718 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004720 if (! value) {
4721 PyErr_SetString(PyExc_TypeError,
4722 "attribute deletion is not supported");
4723 return -1;
4724 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004726 if (strcmp(name, "memo") == 0) {
4727 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00004728 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004729 "memo must be a dictionary");
4730 return -1;
4731 }
4732 Py_XDECREF(self->memo);
4733 self->memo = value;
4734 Py_INCREF(value);
4735 return 0;
4736 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004738 PyErr_SetString(PyExc_AttributeError, name);
4739 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004740}
4741
Tim Peters5bd2a792003-02-01 16:45:06 +00004742/* ---------------------------------------------------------------------------
4743 * Module-level functions.
4744 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004745
Tim Peters5bd2a792003-02-01 16:45:06 +00004746/* dump(obj, file, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004747static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004748cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004749{
4750 PyObject *ob, *file, *res = NULL;
4751 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004752 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004753
Tim Peters5bd2a792003-02-01 16:45:06 +00004754 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004755 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004756
Tim Peters5bd2a792003-02-01 16:45:06 +00004757 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004758 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004760 if (dump(pickler, ob) < 0)
4761 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004763 Py_INCREF(Py_None);
4764 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004766 finally:
4767 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004769 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004770}
4771
4772
Tim Peters5bd2a792003-02-01 16:45:06 +00004773/* dumps(obj, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004774static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004775cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004776{
4777 PyObject *ob, *file = 0, *res = NULL;
4778 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004779 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004780
Tim Peters5bd2a792003-02-01 16:45:06 +00004781 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004782 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004783
Tim Peterscba30e22003-02-01 06:24:36 +00004784 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004785 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004786
Tim Peters5bd2a792003-02-01 16:45:06 +00004787 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004788 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004789
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004790 if (dump(pickler, ob) < 0)
4791 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004793 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004795 finally:
4796 Py_XDECREF(pickler);
4797 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004799 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004800}
4801
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004802
Tim Peters5bd2a792003-02-01 16:45:06 +00004803/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004804static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004805cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004806{
4807 Unpicklerobject *unpickler = 0;
4808 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004809
Tim Peterscba30e22003-02-01 06:24:36 +00004810 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004811 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004812
Tim Peterscba30e22003-02-01 06:24:36 +00004813 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004814 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004816 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004818 finally:
4819 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004821 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004822}
4823
4824
Tim Peters5bd2a792003-02-01 16:45:06 +00004825/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004826static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004827cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004828{
4829 PyObject *ob, *file = 0, *res = NULL;
4830 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004831
Tim Peterscba30e22003-02-01 06:24:36 +00004832 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004833 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004834
Tim Peterscba30e22003-02-01 06:24:36 +00004835 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004836 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004837
Tim Peterscba30e22003-02-01 06:24:36 +00004838 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004839 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004841 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004843 finally:
4844 Py_XDECREF(file);
4845 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004847 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004848}
4849
4850
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004851PyDoc_STRVAR(Unpicklertype__doc__,
4852"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004853
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004854static PyTypeObject Unpicklertype = {
4855 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004856 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004857 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004858 sizeof(Unpicklerobject), /*tp_basicsize*/
4859 0, /*tp_itemsize*/
4860 /* methods */
4861 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4862 (printfunc)0, /*tp_print*/
4863 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4864 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4865 (cmpfunc)0, /*tp_compare*/
4866 (reprfunc)0, /*tp_repr*/
4867 0, /*tp_as_number*/
4868 0, /*tp_as_sequence*/
4869 0, /*tp_as_mapping*/
4870 (hashfunc)0, /*tp_hash*/
4871 (ternaryfunc)0, /*tp_call*/
4872 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004873
Guido van Rossum60456fd1997-04-09 17:36:32 +00004874 /* Space for future expansion */
4875 0L,0L,0L,0L,
4876 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004877};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004878
Guido van Rossum60456fd1997-04-09 17:36:32 +00004879static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004880 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004881 PyDoc_STR("dump(object, file, proto=0) -- "
4882 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004883 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004884 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004885 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004886
Neal Norwitzb0493252002-03-31 14:44:22 +00004887 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004888 PyDoc_STR("dumps(object, proto=0) -- "
4889 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004890 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004891 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004892 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004893
Neal Norwitzb0493252002-03-31 14:44:22 +00004894 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004895 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00004896
Neal Norwitzb0493252002-03-31 14:44:22 +00004897 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004898 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00004899
Neal Norwitzb0493252002-03-31 14:44:22 +00004900 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004901 PyDoc_STR("Pickler(file, proto=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004902 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004903 "This takes a file-like object for writing a pickle data stream.\n"
4904 "The optional proto argument tells the pickler to use the given\n"
4905 "protocol; supported protocols are 0, 1, 2. The default\n"
4906 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
4907 "only protocol that can be written to a file opened in text\n"
4908 "mode and read back successfully. When using a protocol higher\n"
4909 "than 0, make sure the file is opened in binary mode, both when\n"
4910 "pickling and unpickling.)\n"
4911 "\n"
4912 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
4913 "more efficient than protocol 1.\n"
4914 "\n"
4915 "Specifying a negative protocol version selects the highest\n"
4916 "protocol version supported. The higher the protocol used, the\n"
4917 "more recent the version of Python needed to read the pickle\n"
4918 "produced.\n"
4919 "\n"
4920 "The file parameter must have a write() method that accepts a single\n"
4921 "string argument. It can thus be an open file object, a StringIO\n"
4922 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004923 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004924
Neal Norwitzb0493252002-03-31 14:44:22 +00004925 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004926 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
4927
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004928 { NULL, NULL }
4929};
4930
Guido van Rossum60456fd1997-04-09 17:36:32 +00004931static int
Tim Peterscba30e22003-02-01 06:24:36 +00004932init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004933{
4934 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004935
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004936#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004938 INIT_STR(__class__);
4939 INIT_STR(__getinitargs__);
4940 INIT_STR(__dict__);
4941 INIT_STR(__getstate__);
4942 INIT_STR(__setstate__);
4943 INIT_STR(__name__);
4944 INIT_STR(__main__);
4945 INIT_STR(__reduce__);
4946 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004947 INIT_STR(append);
4948 INIT_STR(read);
4949 INIT_STR(readline);
4950 INIT_STR(copy_reg);
4951 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004952 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004953
Tim Peterscba30e22003-02-01 06:24:36 +00004954 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004955 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004956
Tim Peters1f1b2d22003-02-01 02:16:37 +00004957 /* This is special because we want to use a different
4958 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004959 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peterscba30e22003-02-01 06:24:36 +00004960 if (!dispatch_table)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004961 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004963 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004964
Tim Peterscba30e22003-02-01 06:24:36 +00004965 if (!( empty_tuple = PyTuple_New(0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004966 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004967
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004968 /* Ugh */
4969 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4970 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4971 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004973 if (!( t=PyDict_New())) return -1;
4974 if (!( r=PyRun_String(
4975 "def __init__(self, *args): self.args=args\n\n"
4976 "def __str__(self):\n"
4977 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4978 Py_file_input,
4979 module_dict, t) )) return -1;
4980 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004982 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00004983 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004984 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004986 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004987
Tim Peterscba30e22003-02-01 06:24:36 +00004988 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004989 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00004990 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004991 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004993 if (!( t=PyDict_New())) return -1;
4994 if (!( r=PyRun_String(
4995 "def __init__(self, *args): self.args=args\n\n"
4996 "def __str__(self):\n"
4997 " a=self.args\n"
4998 " a=a and type(a[0]) or '(what)'\n"
4999 " return 'Cannot pickle %s objects' % a\n"
5000 , Py_file_input,
5001 module_dict, t) )) return -1;
5002 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005004 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005005 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005006 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005008 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005009
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005010 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005011 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005012 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005013
Martin v. Löwis658009a2002-09-16 17:26:24 +00005014 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5015 UnpicklingError, NULL)))
5016 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005018 if (PyDict_SetItemString(module_dict, "PickleError",
5019 PickleError) < 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, "PicklingError",
5023 PicklingError) < 0)
5024 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005026 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5027 UnpicklingError) < 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, "UnpickleableError",
5031 UnpickleableError) < 0)
5032 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005034 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5035 BadPickleGet) < 0)
5036 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005038 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005039
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005040 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005041}
5042
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005043#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5044#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005045#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005046PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005047initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005048{
5049 PyObject *m, *d, *di, *v, *k;
5050 int i;
5051 char *rev="1.71";
5052 PyObject *format_version;
5053 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005055 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005056 Unpicklertype.ob_type = &PyType_Type;
5057 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005059 /* Initialize some pieces. We need to do this before module creation,
5060 so we're forced to use a temporary dictionary. :(
5061 */
5062 di=PyDict_New();
5063 if (!di) return;
5064 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005066 /* Create the module and add the functions */
5067 m = Py_InitModule4("cPickle", cPickle_methods,
5068 cPickle_module_documentation,
5069 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005071 /* Add some symbolic constants to the module */
5072 d = PyModule_GetDict(m);
5073 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
5074 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005076 /* Copy data from di. Waaa. */
5077 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5078 if (PyObject_SetItem(d, k, v) < 0) {
5079 Py_DECREF(di);
5080 return;
5081 }
5082 }
5083 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005085 format_version = PyString_FromString("1.3");
5086 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005088 PyDict_SetItemString(d, "format_version", format_version);
5089 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5090 Py_XDECREF(format_version);
5091 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005092}